From 2f85c1be0439bd461f9c0b6672da4ce77d0b91d1 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 25 Jul 2016 04:43:54 -0500 Subject: [PATCH 001/213] Remove unnecessary tag from csproj --- Rant/Rant.csproj | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 1dc5712..a78074f 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -308,9 +308,7 @@ - - Code - + From ce6c4339ab3e37855893a4271482c553543fbf68 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 25 Jul 2016 21:33:51 -0500 Subject: [PATCH 002/213] RantDictionaryEntry improvements, remove old bootstrapping code --- Rant.sln | 29 +- Rant/RantEngine.cs | 332 ++++---- Rant/Resources/RantPackage.cs | 804 +++++++++--------- Rant/Vocabulary/Querying/QueryState.cs | 8 +- Rant/Vocabulary/RantDictionaryEntry.cs | 38 +- .../RantDictionaryTable.Exporter.cs | 12 +- Rant/Vocabulary/RantDictionaryTable.Loader.cs | 4 +- Rant/Vocabulary/RantDictionaryTable.cs | 10 +- Rave/DicDoc/TablePageGenerator.cs | 12 +- 9 files changed, 618 insertions(+), 631 deletions(-) diff --git a/Rant.sln b/Rant.sln index c8f435b..f8c9075 100644 --- a/Rant.sln +++ b/Rant.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rant", "Rant\Rant.csproj", "{A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}" EndProject @@ -29,9 +29,6 @@ Global Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Editor|Any CPU = Editor|Any CPU - Editor|x64 = Editor|x64 - Editor|x86 = Editor|x86 Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 @@ -52,12 +49,6 @@ Global {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|x64.Build.0 = Debug|x64 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|x86.ActiveCfg = Debug|x86 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|x86.Build.0 = Debug|x86 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Editor|Any CPU.ActiveCfg = Editor|Any CPU - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Editor|Any CPU.Build.0 = Editor|Any CPU - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Editor|x64.ActiveCfg = Editor|x64 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Editor|x64.Build.0 = Editor|x64 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Editor|x86.ActiveCfg = Editor|x86 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Editor|x86.Build.0 = Editor|x86 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|Any CPU.Build.0 = Release|Any CPU {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|x64.ActiveCfg = Release|x64 @@ -82,12 +73,6 @@ Global {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x64.Build.0 = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x86.ActiveCfg = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x86.Build.0 = Debug|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Editor|Any CPU.ActiveCfg = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Editor|Any CPU.Build.0 = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Editor|x64.ActiveCfg = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Editor|x64.Build.0 = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Editor|x86.ActiveCfg = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Editor|x86.Build.0 = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|Any CPU.Build.0 = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|x64.ActiveCfg = Release|Any CPU @@ -112,12 +97,6 @@ Global {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x64.Build.0 = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x86.ActiveCfg = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x86.Build.0 = Debug|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Editor|Any CPU.ActiveCfg = Debug|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Editor|Any CPU.Build.0 = Debug|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Editor|x64.ActiveCfg = Debug|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Editor|x64.Build.0 = Debug|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Editor|x86.ActiveCfg = Debug|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Editor|x86.Build.0 = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|Any CPU.ActiveCfg = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|Any CPU.Build.0 = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|x64.ActiveCfg = Release|Any CPU @@ -142,12 +121,6 @@ Global {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x64.Build.0 = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x86.ActiveCfg = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x86.Build.0 = Debug|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Editor|Any CPU.ActiveCfg = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Editor|Any CPU.Build.0 = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Editor|x64.ActiveCfg = Debug|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Editor|x64.Build.0 = Debug|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Editor|x86.ActiveCfg = Debug|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Editor|x86.Build.0 = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|Any CPU.ActiveCfg = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|Any CPU.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|x64.ActiveCfg = Release|Any CPU diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 46ba1e1..0fc35f5 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -4,7 +4,6 @@ using System.Linq; using Rant.Core; -using Rant.Core.Compiler.Parselets; using Rant.Core.Framework; using Rant.Core.ObjectModel; using Rant.Core.Utilities; @@ -14,33 +13,32 @@ namespace Rant { - /// - /// The central class of the Rant engine that allows the execution of patterns. - /// - public sealed class RantEngine - { + /// + /// The central class of the Rant engine that allows the execution of patterns. + /// + public sealed class RantEngine + { #region Static members private static int _maxStackSize = 64; - private static readonly RNG Seeds = new RNG(); - - static RantEngine() - { - RantFunctionRegistry.Load(); - Parselet.Load(); - } - - /// - /// Gets or sets the maximum stack size allowed for a pattern. - /// - public static int MaxStackSize - { - get { return _maxStackSize; } - set - { - if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), "Value must be greater than zero."); - _maxStackSize = value; - } - } + private static readonly RNG Seeds = new RNG(); + + static RantEngine() + { + RantFunctionRegistry.Load(); + } + + /// + /// Gets or sets the maximum stack size allowed for a pattern. + /// + public static int MaxStackSize + { + get { return _maxStackSize; } + set + { + if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), "Value must be greater than zero."); + _maxStackSize = value; + } + } #endregion @@ -89,8 +87,8 @@ public RantDependencyResolver DependencyResolver internal Dictionary PackageModules = new Dictionary(); private readonly Dictionary _userModules = new Dictionary(); - private readonly Dictionary _patternCache = new Dictionary(); - private readonly HashSet _loadedPackages = new HashSet(); + private readonly Dictionary _patternCache = new Dictionary(); + private readonly HashSet _loadedPackages = new HashSet(); private RantDependencyResolver _resolver = new RantDependencyResolver(); private RantDictionary _dictionary = new RantDictionary(); @@ -100,111 +98,111 @@ public RantDependencyResolver DependencyResolver /// The name of the variable to access. /// public RantObject this[string name] - { - get { return Objects[name]; } - set { Objects[name] = value; } - } - - /// - /// Creates a new RantEngine object without a dictionary. - /// - public RantEngine() - { - } - - /// - /// Creates a new RantEngine object that loads vocabulary from the specified path. - /// - /// The path to the dictionary files to load. - public RantEngine(string dictionaryPath) - { - if (!String.IsNullOrEmpty(dictionaryPath)) - { - _dictionary = RantDictionary.FromDirectory(dictionaryPath); - } - } - - /// - /// Creates a new RantEngine object with the specified vocabulary. - /// - /// The vocabulary to load in this instance. - public RantEngine(RantDictionary dictionary) - { - _dictionary = dictionary; - } - - /// - /// Returns a boolean value indicating whether a pattern by the specified name has been loaded from a package. - /// - /// The name of the pattern to check. - /// - public bool PatternExists(string patternName) - { - return _patternCache != null && _patternCache.ContainsKey(patternName); - } - - /// - /// Loads the specified package into the engine. - /// - /// The package to load. - /// The table merging strategy to employ. - public void LoadPackage(RantPackage package, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) - { - if (package == null) throw new ArgumentNullException(nameof(package)); - if (_loadedPackages.Contains(RantPackageDependency.Create(package))) return; - - var patterns = package.GetPatterns(); - var tables = package.GetTables(); - - if (patterns.Any()) - { + { + get { return Objects[name]; } + set { Objects[name] = value; } + } + + /// + /// Creates a new RantEngine object without a dictionary. + /// + public RantEngine() + { + } + + /// + /// Creates a new RantEngine object that loads vocabulary from the specified path. + /// + /// The path to the dictionary files to load. + public RantEngine(string dictionaryPath) + { + if (!String.IsNullOrEmpty(dictionaryPath)) + { + _dictionary = RantDictionary.FromDirectory(dictionaryPath); + } + } + + /// + /// Creates a new RantEngine object with the specified vocabulary. + /// + /// The vocabulary to load in this instance. + public RantEngine(RantDictionary dictionary) + { + _dictionary = dictionary; + } + + /// + /// Returns a boolean value indicating whether a pattern by the specified name has been loaded from a package. + /// + /// The name of the pattern to check. + /// + public bool PatternExists(string patternName) + { + return _patternCache != null && _patternCache.ContainsKey(patternName); + } + + /// + /// Loads the specified package into the engine. + /// + /// The package to load. + /// The table merging strategy to employ. + public void LoadPackage(RantPackage package, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + { + if (package == null) throw new ArgumentNullException(nameof(package)); + if (_loadedPackages.Contains(RantPackageDependency.Create(package))) return; + + var patterns = package.GetPatterns(); + var tables = package.GetTables(); + + if (patterns.Any()) + { foreach (var pattern in patterns) { _patternCache[pattern.Name] = pattern; if (pattern.Module != null) PackageModules[pattern.Name] = pattern.Module; } - } - - if (tables.Any()) - { - if (_dictionary == null) - { - _dictionary = new RantDictionary(tables, mergeBehavior); - } - else - { - foreach (var table in tables) - { - _dictionary.AddTable(table, mergeBehavior); - } - } - } - - _loadedPackages.Add(RantPackageDependency.Create(package)); - - foreach (var dependency in package.GetDependencies()) - { - RantPackage pkg; + } + + if (tables.Any()) + { + if (_dictionary == null) + { + _dictionary = new RantDictionary(tables, mergeBehavior); + } + else + { + foreach (var table in tables) + { + _dictionary.AddTable(table, mergeBehavior); + } + } + } + + _loadedPackages.Add(RantPackageDependency.Create(package)); + + foreach (var dependency in package.GetDependencies()) + { + RantPackage pkg; if (!_resolver.TryResolvePackage(dependency, out pkg)) throw new FileNotFoundException($"Package '{package}' was unable to resolve dependency '{dependency}'"); - LoadPackage(pkg, mergeBehavior); - } - } - - /// - /// Loads the package at the specified file path into the engine. - /// - /// The path to the package to load. - /// The table merging strategy to employ. - public void LoadPackage(string path, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) - { - if (Util.IsNullOrWhiteSpace(path)) - throw new ArgumentException("Path cannot be null nor empty."); - - if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) - path += ".rantpkg"; - + LoadPackage(pkg, mergeBehavior); + } + } + + /// + /// Loads the package at the specified file path into the engine. + /// + /// The path to the package to load. + /// The table merging strategy to employ. + public void LoadPackage(string path, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + { + if (Util.IsNullOrWhiteSpace(path)) + throw new ArgumentException("Path cannot be null nor empty."); + + if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) + path += ".rantpkg"; + LoadPackage(RantPackage.Load(path), mergeBehavior); } @@ -237,8 +235,8 @@ private RantOutput RunVM(Sandbox vm, double timeout) /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, args), timeout); + public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, args), timeout); /// /// Loads the file located at the specified path and executes it, returning the resulting output. @@ -248,8 +246,8 @@ public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantP /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(Seeds.NextRaw()), charLimit, args), timeout); + public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(Seeds.NextRaw()), charLimit, args), timeout); /// /// Compiles the specified string into a pattern, executes it using a custom seed, and returns the resulting output. @@ -260,8 +258,8 @@ public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, Ra /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, args), timeout); + public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, args), timeout); /// /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. @@ -272,8 +270,8 @@ public RantOutput Do(string input, long seed, int charLimit = 0, double timeout /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(seed), charLimit, args), timeout); + public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(seed), charLimit, args), timeout); /// /// Compiles the specified string into a pattern, executes it using a custom RNG, and returns the resulting output. @@ -284,8 +282,8 @@ public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeo /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromString(input), rng, charLimit, args), timeout); + public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, RantPattern.FromString(input), rng, charLimit, args), timeout); /// /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. @@ -296,8 +294,8 @@ public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromFile(path), rng, charLimit, args), timeout); + public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, RantPattern.FromFile(path), rng, charLimit, args), timeout); /// /// Executes the specified pattern and returns the resulting output. @@ -307,8 +305,8 @@ public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput Do(RantPattern input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, args), timeout); + public RantOutput Do(RantPattern input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, args), timeout); /// /// Executes the specified pattern using a custom seed and returns the resulting output. @@ -319,8 +317,8 @@ public RantOutput Do(RantPattern input, int charLimit = 0, double timeout = -1, /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput Do(RantPattern input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, input, new RNG(seed), charLimit, args), timeout); + public RantOutput Do(RantPattern input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, input, new RNG(seed), charLimit, args), timeout); /// /// Executes the specified pattern using a custom random number generator and returns the resulting output. @@ -331,8 +329,8 @@ public RantOutput Do(RantPattern input, long seed, int charLimit = 0, double tim /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput Do(RantPattern input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, input, rng, charLimit, args), timeout); + public RantOutput Do(RantPattern input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => + RunVM(new Sandbox(this, input, rng, charLimit, args), timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -343,7 +341,7 @@ public RantOutput Do(RantPattern input, RNG rng, int charLimit = 0, double timeo /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(RantPattern input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, args).RunSerial(timeout); + new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -355,7 +353,7 @@ public IEnumerable DoSerial(RantPattern input, int charLimit = 0, do /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(RantPattern input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, input, new RNG(seed), charLimit, args).RunSerial(timeout); + new Sandbox(this, input, new RNG(seed), charLimit, args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -367,7 +365,7 @@ public IEnumerable DoSerial(RantPattern input, long seed, int charLi /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(RantPattern input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, input, rng, charLimit, args).RunSerial(timeout); + new Sandbox(this, input, rng, charLimit, args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -378,7 +376,7 @@ public IEnumerable DoSerial(RantPattern input, RNG rng, int charLimi /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(string input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, args).RunSerial(timeout); + new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -390,7 +388,7 @@ public IEnumerable DoSerial(string input, int charLimit = 0, double /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, args).RunSerial(timeout); + new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -402,7 +400,7 @@ public IEnumerable DoSerial(string input, long seed, int charLimit = /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, RantPattern.FromString(input), rng, charLimit, args).RunSerial(timeout); + new Sandbox(this, RantPattern.FromString(input), rng, charLimit, args).RunSerial(timeout); /// /// Executes a pattern that has been loaded from a package and returns the resulting output. @@ -413,12 +411,12 @@ public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0 /// The arguments to pass to the pattern. /// public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) - { - if (!PatternExists(patternName)) - throw new ArgumentException("Pattern doesn't exist."); + { + if (!PatternExists(patternName)) + throw new ArgumentException("Pattern doesn't exist."); - return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, args), timeout); - } + return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, args), timeout); + } /// /// Executes a pattern that has been loaded from a package and returns the resulting output. @@ -430,12 +428,12 @@ public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeo /// The arguments to pass to the pattern. /// public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) - { - if (!PatternExists(patternName)) - throw new ArgumentException("Pattern doesn't exist."); + { + if (!PatternExists(patternName)) + throw new ArgumentException("Pattern doesn't exist."); - return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, args), timeout); - } + return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, args), timeout); + } /// /// Executes a pattern that has been loaded from a package using a custom random number generator and returns the resulting output. @@ -447,12 +445,12 @@ public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, d /// The arguments to pass to the pattern. /// public RantOutput DoPackaged(string patternName, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) - { - if (!PatternExists(patternName)) - throw new ArgumentException("Pattern doesn't exist."); - - return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, args), timeout); - } - #endregion - } + { + if (!PatternExists(patternName)) + throw new ArgumentException("Pattern doesn't exist."); + + return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, args), timeout); + } + #endregion + } } \ No newline at end of file diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index a3d0843..6bbe54b 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -12,81 +12,81 @@ namespace Rant.Resources { - /// - /// Represents a collection of patterns and tables that can be exported to an archive file. - /// - public sealed class RantPackage - { - private const string OLD_MAGIC = "RPKG"; - private const string MAGIC = "RANT"; - private const byte PACKAGE_VERSION = 2; - - private HashSet _patterns; - private HashSet _tables; + /// + /// Represents a collection of patterns and tables that can be exported to an archive file. + /// + public sealed class RantPackage + { + private const string OLD_MAGIC = "RPKG"; + private const string MAGIC = "RANT"; + private const byte PACKAGE_VERSION = 2; + + private HashSet _patterns; + private HashSet _tables; private readonly HashSet _dependencies = new HashSet(); - private RantPackageVersion _version = new RantPackageVersion(1, 0, 0); - private string _title = "Untitled Package"; - private string _id = "Package"; - - /// - /// The display name of the package. - /// - public string Title - { - get { return _title; } - set - { + private RantPackageVersion _version = new RantPackageVersion(1, 0, 0); + private string _title = "Untitled Package"; + private string _id = "Package"; + + /// + /// The display name of the package. + /// + public string Title + { + get { return _title; } + set + { if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("Title cannot be empty."); _title = value; - } - } - - /// - /// The ID of the package. - /// - public string ID - { - get { return _id; } - set - { - if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("ID cannot be empty."); - _id = value; - } - } - - /// - /// The description for the package. - /// - public string Description { get; set; } = ""; - - /// - /// The tags associated with the package. - /// - public string[] Tags { get; set; } = { }; - - /// - /// The package version. - /// - public RantPackageVersion Version - { - get { return _version; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _version = value; - } - } - - /// - /// The authors of the package. - /// - public string[] Authors { get; set; } = { }; + } + } + + /// + /// The ID of the package. + /// + public string ID + { + get { return _id; } + set + { + if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("ID cannot be empty."); + _id = value; + } + } + + /// + /// The description for the package. + /// + public string Description { get; set; } = ""; + + /// + /// The tags associated with the package. + /// + public string[] Tags { get; set; } = { }; + + /// + /// The package version. + /// + public RantPackageVersion Version + { + get { return _version; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _version = value; + } + } + + /// + /// The authors of the package. + /// + public string[] Authors { get; set; } = { }; /// /// Adds the specified dependency to the package. /// /// The dependency to add. - public void AddDependency(RantPackageDependency dependency) + public void AddDependency(RantPackageDependency dependency) { if (dependency == null) throw new ArgumentNullException(nameof(dependency)); _dependencies.Add(dependency); @@ -97,12 +97,12 @@ public void AddDependency(RantPackageDependency dependency) /// /// The ID of the package. /// The package version to target. - public void AddDependency(string id, string version) - { - if (id == null) throw new ArgumentNullException(nameof(id)); - if (version == null) throw new ArgumentNullException(nameof(version)); - _dependencies.Add(new RantPackageDependency(id, version)); - } + public void AddDependency(string id, string version) + { + if (id == null) throw new ArgumentNullException(nameof(id)); + if (version == null) throw new ArgumentNullException(nameof(version)); + _dependencies.Add(new RantPackageDependency(id, version)); + } /// /// Determines whether the package depends on the specified package. @@ -110,7 +110,7 @@ public void AddDependency(string id, string version) /// The ID of the package to check for. /// The version of the package to check for. /// - public bool DependsOn(string id, string version) + public bool DependsOn(string id, string version) { if (id == null) throw new ArgumentNullException(nameof(id)); if (version == null) throw new ArgumentNullException(nameof(version)); @@ -122,17 +122,17 @@ public bool DependsOn(string id, string version) /// /// The dependency to check for. /// - public bool DependsOn(RantPackageDependency dependency) - { - if (dependency == null) throw new ArgumentNullException(nameof(dependency)); - return _dependencies.Contains(dependency); - } + public bool DependsOn(RantPackageDependency dependency) + { + if (dependency == null) throw new ArgumentNullException(nameof(dependency)); + return _dependencies.Contains(dependency); + } /// /// Enumerates the package's dependencies. /// /// - public IEnumerable GetDependencies() => _dependencies.AsEnumerable(); + public IEnumerable GetDependencies() => _dependencies.AsEnumerable(); /// /// Removes the specified dependency from the package. @@ -140,105 +140,105 @@ public bool DependsOn(RantPackageDependency dependency) /// The ID of the dependency to remove. /// The version of the dependency to remove. /// - public bool RemoveDependency(string id, string version) - { - if (id == null) throw new ArgumentNullException(nameof(id)); - if (version == null) throw new ArgumentNullException(nameof(version)); - return _dependencies.Remove(new RantPackageDependency(id, version)); - } + public bool RemoveDependency(string id, string version) + { + if (id == null) throw new ArgumentNullException(nameof(id)); + if (version == null) throw new ArgumentNullException(nameof(version)); + return _dependencies.Remove(new RantPackageDependency(id, version)); + } /// /// Removes the specified dependency from the package. /// /// The dependency to remove. /// - public bool RemoveDependency(RantPackageDependency dependency) - { - if (dependency == null) throw new ArgumentNullException(nameof(dependency)); - return _dependencies.Remove(dependency); - } + public bool RemoveDependency(RantPackageDependency dependency) + { + if (dependency == null) throw new ArgumentNullException(nameof(dependency)); + return _dependencies.Remove(dependency); + } /// /// Removes all dependencies from the package. /// - public void ClearDependencies() => _dependencies.Clear(); - - - /// - /// Adds the specified pattern to the package. - /// - /// The pattern to add. - public void AddPattern(RantPattern pattern) - => (_patterns ?? (_patterns = new HashSet())).Add(pattern); - - /// - /// Adds the specified table to the package. - /// - /// The table to add. - public void AddTable(RantDictionaryTable table) - => (_tables ?? (_tables = new HashSet())).Add(table); - - /// - /// Adds the tables from the specified dictionary to the package. - /// - /// The dictionary to add. - public void AddDictionary(RantDictionary dictionary) - { - if (_tables == null) - _tables = new HashSet(); - - foreach (var table in dictionary.GetTables()) - { - _tables.Add(table); - } - } - - /// - /// Enumerates the patterns contained in the package. - /// - /// - public IEnumerable GetPatterns() - { - if (_patterns == null) yield break; - foreach (var pattern in _patterns) - yield return pattern; - } - - /// - /// Enumerates the tables contained in the package. - /// - /// - public IEnumerable GetTables() - { - if (_tables == null) yield break; - foreach (var table in _tables) - yield return table; - } - - /// - /// Saves the package to the specified file path. - /// - /// The path to the file to create. - public void Save( - string path, - bool compress = true, - BsonStringTableMode stringTableMode = BsonStringTableMode.None) - { - if (String.IsNullOrEmpty(Path.GetExtension(path))) - { - path += ".rantpkg"; - } - - using (var writer = new EasyWriter(File.Create(path))) - { - var doc = new BsonDocument(stringTableMode); - var info = doc.Top["info"] = new BsonItem(); - info["title"] = new BsonItem(_title); - info["id"] = new BsonItem(_id); - info["description"] = new BsonItem(Description); - info["tags"] = new BsonItem(Tags); - info["version"] = new BsonItem(Version.ToString()); - info["authors"] = new BsonItem(Authors); + public void ClearDependencies() => _dependencies.Clear(); + + + /// + /// Adds the specified pattern to the package. + /// + /// The pattern to add. + public void AddPattern(RantPattern pattern) + => (_patterns ?? (_patterns = new HashSet())).Add(pattern); + + /// + /// Adds the specified table to the package. + /// + /// The table to add. + public void AddTable(RantDictionaryTable table) + => (_tables ?? (_tables = new HashSet())).Add(table); + + /// + /// Adds the tables from the specified dictionary to the package. + /// + /// The dictionary to add. + public void AddDictionary(RantDictionary dictionary) + { + if (_tables == null) + _tables = new HashSet(); + + foreach (var table in dictionary.GetTables()) + { + _tables.Add(table); + } + } + + /// + /// Enumerates the patterns contained in the package. + /// + /// + public IEnumerable GetPatterns() + { + if (_patterns == null) yield break; + foreach (var pattern in _patterns) + yield return pattern; + } + + /// + /// Enumerates the tables contained in the package. + /// + /// + public IEnumerable GetTables() + { + if (_tables == null) yield break; + foreach (var table in _tables) + yield return table; + } + + /// + /// Saves the package to the specified file path. + /// + /// The path to the file to create. + public void Save( + string path, + bool compress = true, + BsonStringTableMode stringTableMode = BsonStringTableMode.None) + { + if (String.IsNullOrEmpty(Path.GetExtension(path))) + { + path += ".rantpkg"; + } + + using (var writer = new EasyWriter(File.Create(path))) + { + var doc = new BsonDocument(stringTableMode); + var info = doc.Top["info"] = new BsonItem(); + info["title"] = new BsonItem(_title); + info["id"] = new BsonItem(_id); + info["description"] = new BsonItem(Description); + info["tags"] = new BsonItem(Tags); + info["version"] = new BsonItem(Version.ToString()); + info["authors"] = new BsonItem(Authors); info["dependencies"] = new BsonItem(_dependencies.Select(dep => { var depObj = new BsonItem(); @@ -247,15 +247,15 @@ public void Save( depObj["allow-newer"] = dep.AllowNewer; return depObj; }).ToArray()); - - var patterns = doc.Top["patterns"] = new BsonItem(); - if(_patterns != null) - foreach(var pattern in _patterns) - patterns[pattern.Name] = new BsonItem(pattern.Code); - - var tables = doc.Top["tables"] = new BsonItem(); - if (_tables != null) - { + + var patterns = doc.Top["patterns"] = new BsonItem(); + if (_patterns != null) + foreach (var pattern in _patterns) + patterns[pattern.Name] = new BsonItem(pattern.Code); + + var tables = doc.Top["tables"] = new BsonItem(); + if (_tables != null) + { foreach (var table in _tables) { var t = tables[table.Name] = new BsonItem(); @@ -277,7 +277,7 @@ public void Save( if (optionalClasses.Length > 0) e["optional_classes"] = new BsonItem(); var terms = new List(); - foreach (var term in entry.Terms) + foreach (var term in entry.GetTerms()) { var et = new BsonItem(); et["value"] = new BsonItem(term.Value); @@ -292,116 +292,116 @@ public void Save( } } - var data = doc.ToByteArray(stringTableMode != BsonStringTableMode.None); - if (compress) - data = EasyCompressor.Compress(data); - writer.Write(Encoding.ASCII.GetBytes("RANT")); - writer.Write((uint)2); - writer.Write(compress); - writer.Write(data.Length); - writer.Write(data); - } - } - - /// - /// Saves the package using the old Rant package format to the specified file path. - /// - /// The path to the file to create. - public void SaveOld(string path) - { - if (String.IsNullOrEmpty(Path.GetExtension(path))) - { - path += ".rantpkg"; - } - - using (var writer = new EasyWriter(File.Create(path))) - { - // Magic - writer.WriteBytes(Encoding.ASCII.GetBytes(OLD_MAGIC)); - - // Counts - writer.Write(_patterns?.Count ?? 0); - writer.Write(_tables?.Count ?? 0); - - // Patterns - if (_patterns != null) - { - foreach (var pattern in _patterns) - { - writer.Write(pattern.Name); - writer.Write(pattern.Code); - } - } - - // Tables - if (_tables != null) - { - foreach (var table in _tables) - { - writer - .Write(table.Name) - .Write(table.Subtypes) - .Write(table.EntryCount) - .Write(table.HiddenClasses.ToArray()); - - foreach (var entry in table.GetEntries()) - { - writer - .Write(entry.Weight) - .Write(false) // Used to be the NSFW field, will use for something else in the future! - .Write(entry.Terms.Length); - - for (int i = 0; i < entry.Terms.Length; i++) - { - writer - .Write(entry.Terms[i].Value) - .Write(entry.Terms[i].Pronunciation); - } - - writer.Write(entry.GetClasses().ToArray()); - } - } - } - } - } - - /// - /// Loads a package from the specified path and returns it as a RantPackage object. - /// - /// The path to the package file to load. - /// - public static RantPackage Load(string path) - { - if (String.IsNullOrEmpty(Path.GetExtension(path))) path += ".rantpkg"; - return Load(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)); - } - - /// - /// Loads a package from the specified stream and returns it as a RantPackage object. - /// - /// The stream to load the package data from. - /// - public static RantPackage Load(Stream source) - { - using (var reader = new EasyReader(source)) - { - var magic = Encoding.ASCII.GetString(reader.ReadBytes(4)); - if (magic == OLD_MAGIC) - return LoadOldPackage(reader); - if (magic != MAGIC) - throw new InvalidDataException("File is corrupt."); - var package = new RantPackage(); - var version = reader.ReadUInt32(); - if (version != PACKAGE_VERSION) - throw new InvalidDataException("Invalid package version: " + version); - var compress = reader.ReadBoolean(); - var size = reader.ReadInt32(); - var data = reader.ReadBytes(size); - if (compress) - data = EasyCompressor.Decompress(data); - var doc = BsonDocument.Read(data); - - var info = doc["info"]; + var data = doc.ToByteArray(stringTableMode != BsonStringTableMode.None); + if (compress) + data = EasyCompressor.Compress(data); + writer.Write(Encoding.ASCII.GetBytes("RANT")); + writer.Write((uint)2); + writer.Write(compress); + writer.Write(data.Length); + writer.Write(data); + } + } + + /// + /// Saves the package using the old Rant package format to the specified file path. + /// + /// The path to the file to create. + public void SaveOld(string path) + { + if (String.IsNullOrEmpty(Path.GetExtension(path))) + { + path += ".rantpkg"; + } + + using (var writer = new EasyWriter(File.Create(path))) + { + // Magic + writer.WriteBytes(Encoding.ASCII.GetBytes(OLD_MAGIC)); + + // Counts + writer.Write(_patterns?.Count ?? 0); + writer.Write(_tables?.Count ?? 0); + + // Patterns + if (_patterns != null) + { + foreach (var pattern in _patterns) + { + writer.Write(pattern.Name); + writer.Write(pattern.Code); + } + } + + // Tables + if (_tables != null) + { + foreach (var table in _tables) + { + writer + .Write(table.Name) + .Write(table.Subtypes) + .Write(table.EntryCount) + .Write(table.HiddenClasses.ToArray()); + + foreach (var entry in table.GetEntries()) + { + writer + .Write(entry.Weight) + .Write(false) // Used to be the NSFW field, will use for something else in the future! + .Write(entry.TermCount); + + for (int i = 0; i < entry.TermCount; i++) + { + writer + .Write(entry[i].Value) + .Write(entry[i].Pronunciation); + } + + writer.Write(entry.GetClasses().ToArray()); + } + } + } + } + } + + /// + /// Loads a package from the specified path and returns it as a RantPackage object. + /// + /// The path to the package file to load. + /// + public static RantPackage Load(string path) + { + if (String.IsNullOrEmpty(Path.GetExtension(path))) path += ".rantpkg"; + return Load(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)); + } + + /// + /// Loads a package from the specified stream and returns it as a RantPackage object. + /// + /// The stream to load the package data from. + /// + public static RantPackage Load(Stream source) + { + using (var reader = new EasyReader(source)) + { + var magic = Encoding.ASCII.GetString(reader.ReadBytes(4)); + if (magic == OLD_MAGIC) + return LoadOldPackage(reader); + if (magic != MAGIC) + throw new InvalidDataException("File is corrupt."); + var package = new RantPackage(); + var version = reader.ReadUInt32(); + if (version != PACKAGE_VERSION) + throw new InvalidDataException("Invalid package version: " + version); + var compress = reader.ReadBoolean(); + var size = reader.ReadInt32(); + var data = reader.ReadBytes(size); + if (compress) + data = EasyCompressor.Decompress(data); + var doc = BsonDocument.Read(data); + + var info = doc["info"]; if (info == null) throw new InvalidDataException("Metadata is missing from package."); @@ -409,12 +409,12 @@ public static RantPackage Load(Stream source) package.ID = info["id"]; package.Version = RantPackageVersion.Parse(info["version"]); package.Description = info["description"]; - package.Authors = (string[])info["authors"]; + package.Authors = (string[])info["authors"]; package.Tags = (string[])info["tags"]; var deps = info["dependencies"]; if (deps != null && deps.IsArray) { - for(int i = 0; i < deps.Count; i++) + for (int i = 0; i < deps.Count; i++) { var dep = deps[i]; var depId = dep["id"].Value; @@ -425,115 +425,115 @@ public static RantPackage Load(Stream source) } var patterns = doc["patterns"]; - if(patterns != null) - { - var names = patterns.Keys; - foreach (string name in names) - package.AddPattern(new RantPattern(name, RantPatternOrigin.File, patterns[name])); - } - - var tables = doc["tables"]; - if(tables != null) - { - var names = tables.Keys; - foreach(string name in names) - { - var table = tables[name]; - string tableName = table["name"]; - string[] tableSubs = (string[])table["subs"]; - string[] hiddenClasses = (string[])table["hidden"]; - - var entries = new List(); - var entryList = table["entries"]; - for(var i = 0; i < entryList.Count; i++) - { - var loadedEntry = entryList[i]; - int weight = 1; - if (loadedEntry.HasKey("weight")) - weight = (int)loadedEntry["weight"].Value; - string[] requiredClasses = (string[])loadedEntry["classes"]; - string[] optionalClasses = (string[])loadedEntry["optional_classes"]; - var terms = new List(); - var termList = loadedEntry["terms"]; - for(var j = 0; j < termList.Count; j++) - { - var t = new RantDictionaryTerm(termList[j]["value"], termList[j]["pron"]); - terms.Add(t); - } - var entry = new RantDictionaryEntry( - terms.ToArray(), - requiredClasses.Concat(optionalClasses.Select(x => x + "?")), - weight - ); - entries.Add(entry); - } - var rantTable = new RantDictionaryTable( - tableName, - tableSubs, - entries, - hiddenClasses - ); - package.AddTable(rantTable); - } - } - - return package; - } - } - - private static RantPackage LoadOldPackage(EasyReader reader) - { - int numPatterns = reader.ReadInt32(); - int numTables = reader.ReadInt32(); - - if (numPatterns < 0 || numTables < 0) - throw new InvalidDataException("File is corrupt."); - - var pkg = new RantPackage(); - - // Patterns - for (int i = 0; i < numPatterns; i++) - { - var name = reader.ReadString(); - var code = reader.ReadString(); - - pkg.AddPattern(new RantPattern(name, RantPatternOrigin.String, code)); - } - - // Tables - for (int i = 0; i < numTables; i++) - { - var name = reader.ReadString(); - var subs = reader.ReadStringArray(); - int numEntries = reader.ReadInt32(); - var hiddenClasses = reader.ReadStringArray(); - var entries = new RantDictionaryEntry[numEntries]; - - for (int j = 0; j < numEntries; j++) - { - int weight = reader.ReadInt32(); - bool flags = reader.ReadBoolean(); // unused - int numTerms = reader.ReadInt32(); - var terms = new RantDictionaryTerm[numTerms]; - - for (int k = 0; k < numTerms; k++) - { - var value = reader.ReadString(); - var pron = reader.ReadString(); - terms[k] = new RantDictionaryTerm(value, pron); - } - - var classes = reader.ReadStringArray(); - - entries[j] = new RantDictionaryEntry(terms, classes, weight); - } - - pkg.AddTable(new RantDictionaryTable(name, subs, entries, hiddenClasses)); - } - - return pkg; - } - - public override string ToString() => $"{Title}, v{Version}"; - } + if (patterns != null) + { + var names = patterns.Keys; + foreach (string name in names) + package.AddPattern(new RantPattern(name, RantPatternOrigin.File, patterns[name])); + } + + var tables = doc["tables"]; + if (tables != null) + { + var names = tables.Keys; + foreach (string name in names) + { + var table = tables[name]; + string tableName = table["name"]; + string[] tableSubs = (string[])table["subs"]; + string[] hiddenClasses = (string[])table["hidden"]; + + var entries = new List(); + var entryList = table["entries"]; + for (var i = 0; i < entryList.Count; i++) + { + var loadedEntry = entryList[i]; + int weight = 1; + if (loadedEntry.HasKey("weight")) + weight = (int)loadedEntry["weight"].Value; + string[] requiredClasses = (string[])loadedEntry["classes"]; + string[] optionalClasses = (string[])loadedEntry["optional_classes"]; + var terms = new List(); + var termList = loadedEntry["terms"]; + for (var j = 0; j < termList.Count; j++) + { + var t = new RantDictionaryTerm(termList[j]["value"], termList[j]["pron"]); + terms.Add(t); + } + var entry = new RantDictionaryEntry( + terms.ToArray(), + requiredClasses.Concat(optionalClasses.Select(x => x + "?")), + weight + ); + entries.Add(entry); + } + var rantTable = new RantDictionaryTable( + tableName, + tableSubs, + entries, + hiddenClasses + ); + package.AddTable(rantTable); + } + } + + return package; + } + } + + private static RantPackage LoadOldPackage(EasyReader reader) + { + int numPatterns = reader.ReadInt32(); + int numTables = reader.ReadInt32(); + + if (numPatterns < 0 || numTables < 0) + throw new InvalidDataException("File is corrupt."); + + var pkg = new RantPackage(); + + // Patterns + for (int i = 0; i < numPatterns; i++) + { + var name = reader.ReadString(); + var code = reader.ReadString(); + + pkg.AddPattern(new RantPattern(name, RantPatternOrigin.String, code)); + } + + // Tables + for (int i = 0; i < numTables; i++) + { + var name = reader.ReadString(); + var subs = reader.ReadStringArray(); + int numEntries = reader.ReadInt32(); + var hiddenClasses = reader.ReadStringArray(); + var entries = new RantDictionaryEntry[numEntries]; + + for (int j = 0; j < numEntries; j++) + { + int weight = reader.ReadInt32(); + bool flags = reader.ReadBoolean(); // unused + int numTerms = reader.ReadInt32(); + var terms = new RantDictionaryTerm[numTerms]; + + for (int k = 0; k < numTerms; k++) + { + var value = reader.ReadString(); + var pron = reader.ReadString(); + terms[k] = new RantDictionaryTerm(value, pron); + } + + var classes = reader.ReadStringArray(); + + entries[j] = new RantDictionaryEntry(terms, classes, weight); + } + + pkg.AddTable(new RantDictionaryTable(name, subs, entries, hiddenClasses)); + } + + return pkg; + } + + public override string ToString() => $"{Title}, v{Version}"; + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/QueryState.cs b/Rant/Vocabulary/Querying/QueryState.cs index ce88e79..14b81f8 100644 --- a/Rant/Vocabulary/Querying/QueryState.cs +++ b/Rant/Vocabulary/Querying/QueryState.cs @@ -141,17 +141,17 @@ internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumer if (!_rhymeTable.TryGetValue(rhyme, out rhymeState)) { result = pool - .Where(e => !Util.IsNullOrWhiteSpace(e.Terms[subtypeIndex].Pronunciation)) + .Where(e => !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation)) .PickEntry(rng); if (result == null) return null; - _rhymeTable[rhyme] = _.Create(result.Terms[subtypeIndex], new HashSet(new[] { result })); + _rhymeTable[rhyme] = _.Create(result[subtypeIndex], new HashSet(new[] { result })); break; } result = pool.Except(rhymeState.Item2) .Where(e => - !Util.IsNullOrWhiteSpace(e.Terms[subtypeIndex].Pronunciation) && - _rhymer.Rhyme(rhymeState.Item1, e.Terms[subtypeIndex])) + !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation) && + _rhymer.Rhyme(rhymeState.Item1, e[subtypeIndex])) .PickEntry(rng); if (result != null) rhymeState.Item2.Add(result); diff --git a/Rant/Vocabulary/RantDictionaryEntry.cs b/Rant/Vocabulary/RantDictionaryEntry.cs index 31a5e84..ebaabc4 100644 --- a/Rant/Vocabulary/RantDictionaryEntry.cs +++ b/Rant/Vocabulary/RantDictionaryEntry.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using Rant.Vocabulary.Utilities; @@ -13,6 +14,7 @@ public sealed class RantDictionaryEntry private RantDictionaryTerm[] _terms; private readonly HashSet _classes; private readonly HashSet _optionalClasses; + private readonly int _numTerms; /// /// Creates a new RantDictionaryEntry object from the specified data. @@ -21,7 +23,7 @@ public sealed class RantDictionaryEntry /// The classes associated with the entry. /// The weight of the entry. public RantDictionaryEntry(string[] terms, IEnumerable classes, int weight = 1) - : this(terms.Select(s => new RantDictionaryTerm(s)).ToArray(), classes, weight) + : this(terms.Select(s => new RantDictionaryTerm(s)), classes, weight) { } @@ -31,9 +33,11 @@ public RantDictionaryEntry(string[] terms, IEnumerable classes, int weig /// The terms in the entry. /// The classes associated with the entry. /// The weight of the entry. - public RantDictionaryEntry(RantDictionaryTerm[] terms, IEnumerable classes, int weight = 1) + public RantDictionaryEntry(IEnumerable terms, IEnumerable classes, int weight = 1) { - _terms = terms; + if (terms == null) throw new ArgumentNullException(nameof(terms)); + _terms = terms.ToArray(); + _numTerms = _terms.Length; _classes = new HashSet(); _optionalClasses = new HashSet(); foreach (var c in classes) @@ -53,19 +57,31 @@ public RantDictionaryEntry(RantDictionaryTerm[] terms, IEnumerable class } /// - /// Gets the value for the specified term index in the entry. If the index is out of range, [Missing Term] will be returned. + /// Enumerates the terms stored in the current entry. /// - /// The index of the term whose value to request. /// - public string this[int index] => (index < 0 || index >= _terms.Length) ? "[Missing Term]" : _terms[index].Value; + public IEnumerable GetTerms() => _terms.AsEnumerable(); /// - /// The terms in the entry. + /// Gets the number of terms stored in the current entry. /// - public RantDictionaryTerm[] Terms + public int TermCount => _numTerms; + + /// + /// Gets or sets the term at the specified index. + /// + /// The index of the term to access. + /// + public RantDictionaryTerm this[int index] { - get { return _terms; } - set { _terms = value ?? new RantDictionaryTerm[0]; } + get { return (index < 0 || index >= _terms.Length) ? null : _terms[index]; } + set + { + if (index < 0 || index <= _terms.Length) + throw new IndexOutOfRangeException("Index was outside of the bounds of the entry's term list."); + + _terms[index] = value; + } } /// diff --git a/Rant/Vocabulary/RantDictionaryTable.Exporter.cs b/Rant/Vocabulary/RantDictionaryTable.Exporter.cs index dfde9c6..6a649dd 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Exporter.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Exporter.cs @@ -172,19 +172,19 @@ public void Render(StreamWriter writer, int level = -1, bool diffmark = false) foreach (string key in this.Children.Keys.OrderBy(x => x)) this.Children[key].Render(writer, level + 1, diffmark); - foreach (RantDictionaryEntry entry in Entries.OrderBy(x => x.Terms[0].Value)) + foreach (RantDictionaryEntry entry in Entries.OrderBy(x => x[0].Value)) { - if (entry.Terms.Length > 1 && diffmark) + if (entry.TermCount > 1 && diffmark) { - writer.WriteLine(leadingWhitespacer + ">> {0}", entry.Terms.Select((t, i) => i == 0 ? t.Value : Diff.Derive(entry.Terms[0].Value, t.Value)).Aggregate((c, n) => c + "/" + n)); + writer.WriteLine(leadingWhitespacer + ">> {0}", entry.GetTerms().Select((t, i) => i == 0 ? t.Value : Diff.Derive(entry[0].Value, t.Value)).Aggregate((c, n) => c + "/" + n)); } else { - writer.WriteLine(leadingWhitespacer + "> {0}", entry.Terms.Select(t => t.Value).Aggregate((c, n) => c + "/" + n)); + writer.WriteLine(leadingWhitespacer + "> {0}", entry.GetTerms().Select(t => t.Value).Aggregate((c, n) => c + "/" + n)); } - if (!Util.IsNullOrWhiteSpace(entry.Terms[0].Pronunciation)) - writer.WriteLine(leadingWhitespacer + " | pron {0}", entry.Terms.Select(t => t.Pronunciation).Aggregate((c, n) => c + "/" + n)); + if (!Util.IsNullOrWhiteSpace(entry[0].Pronunciation)) + writer.WriteLine(leadingWhitespacer + " | pron {0}", entry.GetTerms().Select(t => t.Pronunciation).Aggregate((c, n) => c + "/" + n)); string[] uniqueClasses = GetClassesForExport(entry).Where(x => !Classes.Contains(x)).OrderBy(x => x).ToArray(); if (uniqueClasses.Length > 0) diff --git a/Rant/Vocabulary/RantDictionaryTable.Loader.cs b/Rant/Vocabulary/RantDictionaryTable.Loader.cs index 35dfa0b..9b4f38f 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Loader.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Loader.cs @@ -158,8 +158,8 @@ public static RantDictionaryTable FromFile(string path) .ToArray(); if (subtypes.Length == pron.Length) { - for (int i = 0; i < entry.Terms.Length; i++) - entry.Terms[i].Pronunciation = pron[i]; + for (int i = 0; i < entry.TermCount; i++) + entry[i].Pronunciation = pron[i]; } } break; diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 21ca2cf..61d8817 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -145,7 +145,7 @@ public bool Merge(RantDictionaryTable other, TableMergeBehavior mergeBehavior = case TableMergeBehavior.RemoveEntryDuplicates: // TODO: Make this NOT O(n^2*subtypes) -- speed up with HashSet? { var otherEntries = - other._entries.Where(e => !_entries.Any(ee => ee.Terms.SequenceEqual(e.Terms))).ToArray(); + other._entries.Where(e => !_entries.Any(ee => ee.GetTerms().SequenceEqual(e.GetTerms()))).ToArray(); Array.Resize(ref _entries, _entries.Length + otherEntries.Length); Array.Copy(otherEntries, 0, _entries, oldLength, otherEntries.Length); break; @@ -153,7 +153,7 @@ public bool Merge(RantDictionaryTable other, TableMergeBehavior mergeBehavior = case TableMergeBehavior.RemoveFirstTermDuplicates: // TODO: Make this NOT O(n^2) { var otherEntries = - other._entries.Where(e => _entries.All(ee => ee.Terms[0] != e.Terms[0])).ToArray(); + other._entries.Where(e => _entries.All(ee => ee[0] != e[0])).ToArray(); Array.Resize(ref _entries, _entries.Length + otherEntries.Length); Array.Copy(otherEntries, 0, _entries, oldLength, otherEntries.Length); break; @@ -180,14 +180,14 @@ internal string Query(RantDictionary dictionary, RNG rng, Query query, QueryStat } if (query.RegexFilters.Any()) - pool = query.RegexFilters.Aggregate(pool, (current, regex) => current.Where(e => regex.Item1 == regex.Item2.IsMatch(e.Terms[index].Value))); + pool = query.RegexFilters.Aggregate(pool, (current, regex) => current.Where(e => regex.Item1 == regex.Item2.IsMatch(e[index].Value))); if (query.SyllablePredicate != null) - pool = pool.Where(e => query.SyllablePredicate.Test(e.Terms[index].SyllableCount)); + pool = pool.Where(e => query.SyllablePredicate.Test(e[index].SyllableCount)); if (!pool.Any()) return MissingTerm; - return syncState.GetEntry(query.Carrier, index, pool, rng)?[index] ?? MissingTerm; + return syncState.GetEntry(query.Carrier, index, pool, rng)?[index].Value ?? MissingTerm; } } } \ No newline at end of file diff --git a/Rave/DicDoc/TablePageGenerator.cs b/Rave/DicDoc/TablePageGenerator.cs index 89c7826..6eb4912 100644 --- a/Rave/DicDoc/TablePageGenerator.cs +++ b/Rave/DicDoc/TablePageGenerator.cs @@ -183,18 +183,18 @@ public static string GenerateTableClassPage(RantDictionaryTable table, string ta writer.AddAttribute(HtmlTextWriterAttribute.Class, "termset"); writer.RenderBeginTag(HtmlTextWriterTag.Div); - for (int i = 0; i < e.Terms.Length; i++) + for (int i = 0; i < e.TermCount; i++) { writer.AddAttribute(HtmlTextWriterAttribute.Class, "term"); writer.RenderBeginTag(HtmlTextWriterTag.Span); - writer.WriteEncodedText(e.Terms[i].Value); + writer.WriteEncodedText(e[i].Value); - if (e.Terms[i].PronunciationParts.Length > 0) + if (e[i].PronunciationParts.Length > 0) { writer.AddAttribute(HtmlTextWriterAttribute.Class, "terminfo"); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.RenderBeginTag(HtmlTextWriterTag.I); - writer.WriteEncodedText(" [" + e.Terms[i].Pronunciation + "]"); + writer.WriteEncodedText(" [" + e[i].Pronunciation + "]"); writer.RenderEndTag(); // writer.RenderEndTag(); // } @@ -214,9 +214,9 @@ public static string GenerateTableClassPage(RantDictionaryTable table, string ta var notes = new List(); var otherClasses = e.GetClasses().Where(cl => cl != tableClass); - if (e.Terms.All(t => t.PronunciationParts.Length > 0)) + if (e.GetTerms().All(t => t.PronunciationParts.Length > 0)) notes.Add(html => html.WriteEncodedText("Full pronunciation")); - else if (e.Terms.Any(t => t.PronunciationParts.Length > 0)) + else if (e.GetTerms().Any(t => t.PronunciationParts.Length > 0)) notes.Add(html => html.WriteEncodedText("Partial pronunciation")); if (e.Weight != 1) notes.Add(html => html.WriteEncodedText("Weight: " + e.Weight)); From 9e752bffb11cf140fe3e80d9725bb7cd6a5cb051 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 25 Jul 2016 21:53:10 -0500 Subject: [PATCH 003/213] Add ability to add/remove entries in tables, remove TableMergeBehavior --- Rant/Core/Utilities/Extensions.cs | 5 ++ Rant/Rant.csproj | 3 +- Rant/RantEngine.cs | 14 ++-- Rant/Vocabulary/RantDictionary.cs | 24 ++---- .../RantDictionaryTable.Exporter.cs | 2 +- Rant/Vocabulary/RantDictionaryTable.cs | 81 ++++++++++--------- Rant/Vocabulary/TableMergeBehavior.cs | 21 ----- 7 files changed, 63 insertions(+), 87 deletions(-) delete mode 100644 Rant/Vocabulary/TableMergeBehavior.cs diff --git a/Rant/Core/Utilities/Extensions.cs b/Rant/Core/Utilities/Extensions.cs index e4cefc6..e5bd959 100644 --- a/Rant/Core/Utilities/Extensions.cs +++ b/Rant/Core/Utilities/Extensions.cs @@ -32,5 +32,10 @@ public static void AddRange(this HashSet hashset, params T[] items) { foreach (var item in items) hashset.Add(item); } + + public static void AddRange(this HashSet hashset, IEnumerable items) + { + foreach (var item in items) hashset.Add(item); + } } } \ No newline at end of file diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index a78074f..0ce26b0 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -308,7 +308,7 @@ - + @@ -339,7 +339,6 @@ - diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 0fc35f5..894a82f 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -145,8 +145,7 @@ public bool PatternExists(string patternName) /// Loads the specified package into the engine. /// /// The package to load. - /// The table merging strategy to employ. - public void LoadPackage(RantPackage package, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + public void LoadPackage(RantPackage package) { if (package == null) throw new ArgumentNullException(nameof(package)); if (_loadedPackages.Contains(RantPackageDependency.Create(package))) return; @@ -168,13 +167,13 @@ public void LoadPackage(RantPackage package, TableMergeBehavior mergeBehavior = { if (_dictionary == null) { - _dictionary = new RantDictionary(tables, mergeBehavior); + _dictionary = new RantDictionary(tables); } else { foreach (var table in tables) { - _dictionary.AddTable(table, mergeBehavior); + _dictionary.AddTable(table); } } } @@ -186,7 +185,7 @@ public void LoadPackage(RantPackage package, TableMergeBehavior mergeBehavior = RantPackage pkg; if (!_resolver.TryResolvePackage(dependency, out pkg)) throw new FileNotFoundException($"Package '{package}' was unable to resolve dependency '{dependency}'"); - LoadPackage(pkg, mergeBehavior); + LoadPackage(pkg); } } @@ -194,8 +193,7 @@ public void LoadPackage(RantPackage package, TableMergeBehavior mergeBehavior = /// Loads the package at the specified file path into the engine. /// /// The path to the package to load. - /// The table merging strategy to employ. - public void LoadPackage(string path, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + public void LoadPackage(string path) { if (Util.IsNullOrWhiteSpace(path)) throw new ArgumentException("Path cannot be null nor empty."); @@ -203,7 +201,7 @@ public void LoadPackage(string path, TableMergeBehavior mergeBehavior = TableMer if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) path += ".rantpkg"; - LoadPackage(RantPackage.Load(path), mergeBehavior); + LoadPackage(RantPackage.Load(path)); } /// diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index cffb3b3..f207c7a 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -28,7 +28,7 @@ public RantDictionary() /// /// The tables to store in the dictionary. /// The merging strategy to employ. - public RantDictionary(IEnumerable tables, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + public RantDictionary(IEnumerable tables) { _tables = new Dictionary(); @@ -39,7 +39,7 @@ public RantDictionary(IEnumerable tables, TableMergeBehavio { if (_tables.TryGetValue(list.Name, out table)) { - table.Merge(list, mergeBehavior); + table.Merge(list); } else { @@ -79,13 +79,12 @@ public void ExcludeHiddenClass(string hiddenClassName) /// Adds a new RantDictionaryTable object to the collection. /// /// - /// The merging strategy to employ. - public void AddTable(RantDictionaryTable table, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + public void AddTable(RantDictionaryTable table) { RantDictionaryTable oldTable; if (_tables.TryGetValue(table.Name, out oldTable)) { - oldTable.Merge(table, mergeBehavior); + oldTable.Merge(table); } else { @@ -108,9 +107,9 @@ public IEnumerable GetTables() /// The directory from which to load dictionaries. /// The merging strategy to employ. /// - public static RantDictionary FromDirectory(string directory, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + public static RantDictionary FromDirectory(string directory) { - return new RantDictionary(Directory.GetFiles(directory, "*.dic", SearchOption.AllDirectories).Select(RantDictionaryTable.FromFile).ToList(), mergeBehavior); + return new RantDictionary(Directory.GetFiles(directory, "*.dic", SearchOption.AllDirectories).Select(RantDictionaryTable.FromFile).ToList()); } /// @@ -123,17 +122,6 @@ public static RantDictionary FromMultiDirectory(params string[] directories) return new RantDictionary(directories.SelectMany(path => Directory.GetFiles(path, "*.dic", SearchOption.AllDirectories)).Select(RantDictionaryTable.FromFile)); } - /// - /// Loads all dictionary (.dic) files from the specified directories and returns a RantDictionary object that contains the loaded data. - /// - /// The directories from which to load dictionaries. - /// The merging strategy to employ. - /// - public static RantDictionary FromMultiDirectory(string[] directories, TableMergeBehavior mergeBehavior) - { - return new RantDictionary(directories.SelectMany(path => Directory.GetFiles(path, "*.dic", SearchOption.AllDirectories)).Select(RantDictionaryTable.FromFile), mergeBehavior); - } - /// /// Queries the RantDictionary according to the specified criteria and returns a random match. /// diff --git a/Rant/Vocabulary/RantDictionaryTable.Exporter.cs b/Rant/Vocabulary/RantDictionaryTable.Exporter.cs index 6a649dd..178e091 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Exporter.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Exporter.cs @@ -26,7 +26,7 @@ public void Save(string path, bool useDiffmark = false) // TODO: Export types for tables writer.WriteLine(); - WriteEntries(writer, _entries, useDiffmark); + WriteEntries(writer, _entriesHash, useDiffmark); } } diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 61d8817..e9c00c8 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -15,10 +15,11 @@ public sealed partial class RantDictionaryTable internal const string MissingTerm = "[?]"; private readonly string _name; - private readonly string _language = "en-US"; + private readonly string _language = "en_US"; private readonly string[] _subtypes; private readonly HashSet _hidden = new HashSet(); - private RantDictionaryEntry[] _entries; + private readonly HashSet _entriesHash = new HashSet(); + private readonly List _entriesList = new List(); /// /// Creates a new RantDictionaryTable with the specified entries. @@ -28,6 +29,9 @@ public sealed partial class RantDictionaryTable /// The entries to add to the table. public RantDictionaryTable(string name, string[] subtypes, IEnumerable entries) { + if (subtypes == null) throw new ArgumentNullException(nameof(subtypes)); + if (entries == null) throw new ArgumentNullException(nameof(entries)); + if (!Util.ValidateName(name)) throw new FormatException($"Invalid table name: '{name}'"); @@ -38,7 +42,8 @@ public RantDictionaryTable(string name, string[] subtypes, IEnumerable @@ -50,6 +55,7 @@ public RantDictionaryTable(string name, string[] subtypes, IEnumerableThe classes to hide. public RantDictionaryTable(string name, string[] subtypes, IEnumerable entries, IEnumerable hiddenClasses) { + if (entries == null) throw new ArgumentNullException(nameof(entries)); if (hiddenClasses == null) throw new ArgumentNullException(nameof(hiddenClasses)); if (!Util.ValidateName(name)) throw new FormatException($"Invalid table name: '{name}'"); @@ -63,7 +69,8 @@ public RantDictionaryTable(string name, string[] subtypes, IEnumerable public IEnumerable GetEntries() { - foreach (var entry in _entries) yield return entry; + foreach (var entry in _entriesHash) yield return entry; + } + + /// + /// Adds the specified entry to the table. + /// + /// The entry to add to the table. + /// True if successfully added; otherwise, False. + public bool AddEntry(RantDictionaryEntry entry) + { + if (!_entriesHash.Add(entry)) return false; + _entriesList.Add(entry); + return true; + } + + /// + /// Removes the specified entry from the table. + /// + /// The entry to remove from the table. + /// True if successfully removed; otherwise, False. + public bool RemoveEntry(RantDictionaryEntry entry) + { + if (!_entriesHash.Remove(entry)) return false; + _entriesList.Remove(entry); + return true; } /// @@ -84,11 +115,11 @@ public IEnumerable GetClasses() { var lstClasses = new HashSet(); - foreach (var c in _entries.SelectMany(e => e.GetClasses())) + foreach (var c in _entriesHash.SelectMany(e => e.GetClasses())) { if (lstClasses.Add(c)) yield return c; } - } + } /// /// The subtypes used by the table entries. @@ -113,7 +144,7 @@ public IEnumerable GetClasses() /// /// The number of entries stored in the table. /// - public int EntryCount => _entries.Length; + public int EntryCount => _entriesHash.Count; private int GetSubtypeIndex(string subtype) { @@ -129,37 +160,13 @@ private int GetSubtypeIndex(string subtype) /// Adds another table's entries to the current table, given that they share the same name and subtypes. /// /// The table whose entries will be added to the current instance. - /// The merging strategy to employ. /// True if merge succeeded; otherwise, False. - public bool Merge(RantDictionaryTable other, TableMergeBehavior mergeBehavior = TableMergeBehavior.Naive) + public bool Merge(RantDictionaryTable other) { if (other._name != _name || other == this) return false; if (!other._subtypes.SequenceEqual(_subtypes)) return false; - int oldLength = _entries.Length; - switch (mergeBehavior) - { - case TableMergeBehavior.Naive: - Array.Resize(ref _entries, _entries.Length + other._entries.Length); - Array.Copy(other._entries, 0, _entries, oldLength, other._entries.Length); - break; - case TableMergeBehavior.RemoveEntryDuplicates: // TODO: Make this NOT O(n^2*subtypes) -- speed up with HashSet? - { - var otherEntries = - other._entries.Where(e => !_entries.Any(ee => ee.GetTerms().SequenceEqual(e.GetTerms()))).ToArray(); - Array.Resize(ref _entries, _entries.Length + otherEntries.Length); - Array.Copy(otherEntries, 0, _entries, oldLength, otherEntries.Length); - break; - } - case TableMergeBehavior.RemoveFirstTermDuplicates: // TODO: Make this NOT O(n^2) - { - var otherEntries = - other._entries.Where(e => _entries.All(ee => ee[0] != e[0])).ToArray(); - Array.Resize(ref _entries, _entries.Length + otherEntries.Length); - Array.Copy(otherEntries, 0, _entries, oldLength, otherEntries.Length); - break; - } - } - + _entriesHash.AddRange(other._entriesHash); + _entriesList.AddRange(other._entriesHash); return true; } @@ -169,8 +176,8 @@ internal string Query(RantDictionary dictionary, RNG rng, Query query, QueryStat if (index == -1) return "[Bad Subtype]"; var pool = query.ClassFilter.IsEmpty - ? _entries - : _entries.Where(e => query.ClassFilter.Test(e, query.Exclusive)); + ? _entriesHash + : _entriesHash.Where(e => query.ClassFilter.Test(e, query.Exclusive)); if (_hidden.Any()) { diff --git a/Rant/Vocabulary/TableMergeBehavior.cs b/Rant/Vocabulary/TableMergeBehavior.cs deleted file mode 100644 index 07ea7df..0000000 --- a/Rant/Vocabulary/TableMergeBehavior.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Rant.Vocabulary -{ - /// - /// Defines merging behaviors for Rant dictionary tables. - /// - public enum TableMergeBehavior - { - /// - /// Combine all entries, don't remove duplicates. - /// - Naive, - /// - /// Remove entries whose first term matches another entry. - /// - RemoveFirstTermDuplicates, - /// - /// Remove entries whose terms match another entry. - /// - RemoveEntryDuplicates - } -} \ No newline at end of file From 7442d25334a10249ee737fc4fb441e08ef83dbcd Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 25 Jul 2016 22:01:04 -0500 Subject: [PATCH 004/213] Add RantDictionaryTable.ContainsEntry method --- Rant/Vocabulary/RantDictionaryTable.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index e9c00c8..3504969 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -90,6 +90,7 @@ public IEnumerable GetEntries() /// True if successfully added; otherwise, False. public bool AddEntry(RantDictionaryEntry entry) { + if (entry == null) throw new ArgumentNullException(nameof(entry)); if (!_entriesHash.Add(entry)) return false; _entriesList.Add(entry); return true; @@ -102,11 +103,23 @@ public bool AddEntry(RantDictionaryEntry entry) /// True if successfully removed; otherwise, False. public bool RemoveEntry(RantDictionaryEntry entry) { + if (entry == null) throw new ArgumentNullException(nameof(entry)); if (!_entriesHash.Remove(entry)) return false; _entriesList.Remove(entry); return true; } + /// + /// Checks if the table contains the specified entry. + /// + /// The entry to search for. + /// True if found, False if not. + public bool ContainsEntry(RantDictionaryEntry entry) + { + if (entry == null) throw new ArgumentNullException(nameof(entry)); + return _entriesHash.Contains(entry); + } + /// /// Searches entries in the current table and enumerates every single distinct class found. /// From 4950d23132a13244a74e5024b5b65d33700e4ff3 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 25 Jul 2016 23:09:33 -0500 Subject: [PATCH 005/213] Fix more whitespace, rename QueryState to CarrierState --- Rant/Core/Output/ChannelVisibility.cs | 42 +- Rant/Core/Output/OutputChain.cs | 2 +- Rant/Core/Output/OutputChainArticleBuffer.cs | 4 +- Rant/Core/Output/OutputWriter.cs | 2 +- Rant/Core/Sandbox.cs | 409 +++-- Rant/Core/Stringes/Chare.cs | 174 +- Rant/Core/Stringes/Extensions.cs | 22 +- Rant/Core/Stringes/Lexer.cs | 632 +++---- Rant/Core/Stringes/Stringe.cs | 1530 ++++++++--------- Rant/Core/Stringes/StringeReader.cs | 1014 +++++------ Rant/Core/Stringes/StringeUtils.cs | 44 +- Rant/Core/Stringes/Token.cs | 42 +- Rant/Core/Utilities/Extensions.cs | 66 +- Rant/Core/Utilities/Limit.cs | 30 +- Rant/Core/Utilities/Util.cs | 86 +- Rant/Core/Utilities/Witchcraft.cs | 744 ++++---- Rant/Rant.csproj | 2 +- .../{QueryState.cs => CarrierState.cs} | 2 +- Rant/Vocabulary/RantDictionary.cs | 2 +- Rant/Vocabulary/RantDictionaryTable.cs | 4 +- 20 files changed, 2425 insertions(+), 2428 deletions(-) rename Rant/Vocabulary/Querying/{QueryState.cs => CarrierState.cs} (99%) diff --git a/Rant/Core/Output/ChannelVisibility.cs b/Rant/Core/Output/ChannelVisibility.cs index 9f02938..a3c89c1 100644 --- a/Rant/Core/Output/ChannelVisibility.cs +++ b/Rant/Core/Output/ChannelVisibility.cs @@ -2,25 +2,25 @@ namespace Rant.Core.Output { - /// - /// Provides visibility settings for output channels. - /// - public enum ChannelVisibility - { - /// - /// Channel outputs to itself and 'main'. - /// - [RantDescription("Channel outputs to itself and 'main'.")] - Public, - /// - /// Channel outputs only to itself. - /// - [RantDescription("Channel outputs only to itself.")] - Private, - /// - /// Channel outputs only to itself and any parent channels also set to Internal. - /// - [RantDescription("Channel outputs only to itself and all immediate parent channels also set to Internal.")] - Internal - } + /// + /// Provides visibility settings for output channels. + /// + public enum ChannelVisibility + { + /// + /// Channel outputs to itself and 'main'. + /// + [RantDescription("Channel outputs to itself and 'main'.")] + Public, + /// + /// Channel outputs only to itself. + /// + [RantDescription("Channel outputs only to itself.")] + Private, + /// + /// Channel outputs only to itself and any parent channels also set to Internal. + /// + [RantDescription("Channel outputs only to itself and all immediate parent channels also set to Internal.")] + Internal + } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputChain.cs b/Rant/Core/Output/OutputChain.cs index 4e46c57..56540b1 100644 --- a/Rant/Core/Output/OutputChain.cs +++ b/Rant/Core/Output/OutputChain.cs @@ -93,7 +93,7 @@ public void Print(object obj) { if (_last.GetType() != typeof(OutputChainBuffer)) AddBuffer(); _last.Print(obj); - } + } public OutputChainBuffer AddArticleBuffer() { diff --git a/Rant/Core/Output/OutputChainArticleBuffer.cs b/Rant/Core/Output/OutputChainArticleBuffer.cs index e7567e6..92e9709 100644 --- a/Rant/Core/Output/OutputChainArticleBuffer.cs +++ b/Rant/Core/Output/OutputChainArticleBuffer.cs @@ -6,8 +6,8 @@ namespace Rant.Core.Output { internal class OutputChainArticleBuffer : OutputChainBuffer { - private static readonly HashSet vowels = - new HashSet(new[] {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', 'é', 'É'}); + private static readonly HashSet vowels = + new HashSet(new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', 'é', 'É' }); private static readonly string[] ignorePrefixes = { "uni", "use", "uri", "urol", "U.", "one", "uvu", "eul", "euk", "eur" }; diff --git a/Rant/Core/Output/OutputWriter.cs b/Rant/Core/Output/OutputWriter.cs index 4a36aa9..bbef343 100644 --- a/Rant/Core/Output/OutputWriter.cs +++ b/Rant/Core/Output/OutputWriter.cs @@ -9,7 +9,7 @@ internal class OutputWriter { private readonly Sandbox sandbox; private readonly OutputChain mainChain; - private readonly Dictionary chains = new Dictionary(); + private readonly Dictionary chains = new Dictionary(); private readonly Stack chainStack = new Stack(); private readonly HashSet activeChains = new HashSet(); diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 25ee581..b8a0036 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -12,142 +12,141 @@ using Rant.Core.Utilities; using Rant.Formats; using Rant.Resources; -using Rant.Vocabulary; using Rant.Vocabulary.Querying; namespace Rant.Core { - /// - /// Represents a Rant interpreter instance that produces a single output. - /// - internal class Sandbox - { + /// + /// Represents a Rant interpreter instance that produces a single output. + /// + internal class Sandbox + { private static readonly object fallbackArgsLockObj = new object(); - private readonly RantEngine _engine; - private readonly OutputWriter _baseOutput; - private readonly Stack _outputs; - private readonly RNG _rng; - private readonly long _startingGen; - private readonly RantFormat _format; - private readonly RantPattern _pattern; - private readonly ObjectStack _objects; - private readonly Limit _sizeLimit; - private readonly Stack _blocks; - private readonly Stack _matches; - private readonly QueryState _queryState; - private readonly Stack> _subroutineArgs; - private readonly SyncManager _syncManager; - private readonly Stack _scriptObjectStack; - private readonly Stopwatch _stopwatch; - private readonly BlockManager _blockManager; - private readonly RantPatternArgs _patternArgs; - - private BlockAttribs _newAttribs = new BlockAttribs(); - private int _quoteLevel = 0; - private bool shouldYield = false; - - /// - /// Gets the engine instance to which the sandbox is bound. - /// - public RantEngine Engine => _engine; - - /// - /// Gets the main output channel stack. - /// - public OutputWriter BaseOutput => _baseOutput; - - /// - /// Gets the current output channel stack. - /// - public OutputWriter Output => _outputs.Peek(); - - /// - /// Gets the random number generator in use by the interpreter. - /// - public RNG RNG => _rng; + private readonly RantEngine _engine; + private readonly OutputWriter _baseOutput; + private readonly Stack _outputs; + private readonly RNG _rng; + private readonly long _startingGen; + private readonly RantFormat _format; + private readonly RantPattern _pattern; + private readonly ObjectStack _objects; + private readonly Limit _sizeLimit; + private readonly Stack _blocks; + private readonly Stack _matches; + private readonly CarrierState _queryState; + private readonly Stack> _subroutineArgs; + private readonly SyncManager _syncManager; + private readonly Stack _scriptObjectStack; + private readonly Stopwatch _stopwatch; + private readonly BlockManager _blockManager; + private readonly RantPatternArgs _patternArgs; + + private BlockAttribs _newAttribs = new BlockAttribs(); + private int _quoteLevel = 0; + private bool shouldYield = false; + + /// + /// Gets the engine instance to which the sandbox is bound. + /// + public RantEngine Engine => _engine; + + /// + /// Gets the main output channel stack. + /// + public OutputWriter BaseOutput => _baseOutput; + + /// + /// Gets the current output channel stack. + /// + public OutputWriter Output => _outputs.Peek(); + + /// + /// Gets the random number generator in use by the interpreter. + /// + public RNG RNG => _rng; /// /// The starting generation of the RNG. /// - public long StartingGen => _startingGen; - - /// - /// Gets the currently set block attributes. - /// - public BlockAttribs CurrentBlockAttribs => _newAttribs; - - /// - /// Gets the format used by the interpreter. - /// - public RantFormat Format => _format; - - /// - /// Gest the object stack used by the interpreter. - /// - public ObjectStack Objects => _objects; - - /// - /// Gets the block state stack. - /// - public Stack Blocks => _blocks; - - /// - /// Gets the replacer match stack. The topmost item is the current match for the current replacer. - /// - public Stack RegexMatches => _matches; - - /// - /// Gets the current query state. - /// - public QueryState QueryState => _queryState; - - /// - /// Gets the current RantPattern. - /// - public RantPattern Pattern => _pattern; - - public Stack> SubroutineArgs => _subroutineArgs; - - /// - /// Gets the synchronizer manager instance for the current Sandbox. - /// - public SyncManager SyncManager => _syncManager; + public long StartingGen => _startingGen; + + /// + /// Gets the currently set block attributes. + /// + public BlockAttribs CurrentBlockAttribs => _newAttribs; + + /// + /// Gets the format used by the interpreter. + /// + public RantFormat Format => _format; + + /// + /// Gest the object stack used by the interpreter. + /// + public ObjectStack Objects => _objects; + + /// + /// Gets the block state stack. + /// + public Stack Blocks => _blocks; + + /// + /// Gets the replacer match stack. The topmost item is the current match for the current replacer. + /// + public Stack RegexMatches => _matches; + + /// + /// Gets the current query state. + /// + public CarrierState QueryState => _queryState; + + /// + /// Gets the current RantPattern. + /// + public RantPattern Pattern => _pattern; + + public Stack> SubroutineArgs => _subroutineArgs; + + /// + /// Gets the synchronizer manager instance for the current Sandbox. + /// + public SyncManager SyncManager => _syncManager; /// /// Gets the size limit for the pattern. /// - public Limit SizeLimit => _sizeLimit; + public Limit SizeLimit => _sizeLimit; - /// - /// Gets the current RantAction being executed. - /// - public RantAction CurrentAction { get; private set; } + /// + /// Gets the current RantAction being executed. + /// + public RantAction CurrentAction { get; private set; } - /// - /// Gets the last used timeout. - /// - public double LastTimeout { get; internal set; } + /// + /// Gets the last used timeout. + /// + public double LastTimeout { get; internal set; } /// /// Gets the current object stack of the Richard engine. /// - public Stack ScriptObjectStack => _scriptObjectStack; - - /// - /// Gets or sets the expected result for the current flag condition. - /// - public bool FlagConditionExpectedResult { get; set; } - - /// - /// Gets a collection of the flags currently being used for the flag condition. - /// - public HashSet ConditionFlags { get; } = new HashSet(); - + public Stack ScriptObjectStack => _scriptObjectStack; + + /// + /// Gets or sets the expected result for the current flag condition. + /// + public bool FlagConditionExpectedResult { get; set; } + + /// + /// Gets a collection of the flags currently being used for the flag condition. + /// + public HashSet ConditionFlags { get; } = new HashSet(); + /// /// Gets the arguments passed to the pattern. /// - public RantPatternArgs PatternArgs => _patternArgs; + public RantPatternArgs PatternArgs => _patternArgs; /// /// Gets the currently loaded modules. @@ -164,108 +163,108 @@ internal class Sandbox /// public Dictionary PackageModules = new Dictionary(); - public Sandbox(RantEngine engine, RantPattern pattern, RNG rng, int sizeLimit = 0, RantPatternArgs args = null) - { - _engine = engine; - _format = engine.Format; - _sizeLimit = new Limit(sizeLimit); - _baseOutput = new OutputWriter(this); - _outputs = new Stack(); - _outputs.Push(_baseOutput); - _rng = rng; - _startingGen = rng.Generation; - _pattern = pattern; - _objects = new ObjectStack(engine.Objects); - _blocks = new Stack(); - _matches = new Stack(); - _queryState = new QueryState(); - _subroutineArgs = new Stack>(); - _syncManager = new SyncManager(this); - _blockManager = new BlockManager(); - _scriptObjectStack = new Stack(); - _patternArgs = args; - _stopwatch = new Stopwatch(); - } - - /// - /// Prints the specified value to the output channel stack. - /// - /// The value to print. - public void Print(object obj) => Output.Do(chain => chain.Print(obj)); - - public void PrintMany(Func generator, int times) - { - if (times == 1) - { - Output.Do(chain => chain.Print(generator())); - return; - } - var buffer = new StringBuilder(); - for (int i = 0; i < times; i++) buffer.Append(generator()); - Output.Do(chain => chain.Print(buffer)); - } - - public void PrintMany(Func generator, int times) - { - if (times == 1) - { - Output.Do(chain => chain.Print(generator())); - return; - } - var buffer = new StringBuilder(); - for (int i = 0; i < times; i++) buffer.Append(generator()); + public Sandbox(RantEngine engine, RantPattern pattern, RNG rng, int sizeLimit = 0, RantPatternArgs args = null) + { + _engine = engine; + _format = engine.Format; + _sizeLimit = new Limit(sizeLimit); + _baseOutput = new OutputWriter(this); + _outputs = new Stack(); + _outputs.Push(_baseOutput); + _rng = rng; + _startingGen = rng.Generation; + _pattern = pattern; + _objects = new ObjectStack(engine.Objects); + _blocks = new Stack(); + _matches = new Stack(); + _queryState = new CarrierState(); + _subroutineArgs = new Stack>(); + _syncManager = new SyncManager(this); + _blockManager = new BlockManager(); + _scriptObjectStack = new Stack(); + _patternArgs = args; + _stopwatch = new Stopwatch(); + } + + /// + /// Prints the specified value to the output channel stack. + /// + /// The value to print. + public void Print(object obj) => Output.Do(chain => chain.Print(obj)); + + public void PrintMany(Func generator, int times) + { + if (times == 1) + { + Output.Do(chain => chain.Print(generator())); + return; + } + var buffer = new StringBuilder(); + for (int i = 0; i < times; i++) buffer.Append(generator()); Output.Do(chain => chain.Print(buffer)); } - public void AddOutputWriter() => _outputs.Push(new OutputWriter(this)); + public void PrintMany(Func generator, int times) + { + if (times == 1) + { + Output.Do(chain => chain.Print(generator())); + return; + } + var buffer = new StringBuilder(); + for (int i = 0; i < times; i++) buffer.Append(generator()); + Output.Do(chain => chain.Print(buffer)); + } - public RantOutput Return() => _outputs.Pop().ToRantOutput(); + public void AddOutputWriter() => _outputs.Push(new OutputWriter(this)); - public void IncreaseQuote() => _quoteLevel++; + public RantOutput Return() => _outputs.Pop().ToRantOutput(); - public void DecreaseQuote() => _quoteLevel--; + public void IncreaseQuote() => _quoteLevel++; - public void PrintOpeningQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? _format.OpeningPrimaryQuote : _format.OpeningSecondaryQuote)); + public void DecreaseQuote() => _quoteLevel--; - public void PrintClosingQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? _format.ClosingPrimaryQuote : _format.ClosingSecondaryQuote)); + public void PrintOpeningQuote() + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? _format.OpeningPrimaryQuote : _format.OpeningSecondaryQuote)); - /// - /// Dequeues the current block attribute set and returns it, queuing a new attribute set. - /// - /// - public BlockAttribs NextAttribs(RABlock block) - { - BlockAttribs attribs = _newAttribs; + public void PrintClosingQuote() + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? _format.ClosingPrimaryQuote : _format.ClosingSecondaryQuote)); - _blockManager.Add(attribs, block); - _blockManager.SetPrevAttribs(attribs); + /// + /// Dequeues the current block attribute set and returns it, queuing a new attribute set. + /// + /// + public BlockAttribs NextAttribs(RABlock block) + { + BlockAttribs attribs = _newAttribs; + + _blockManager.Add(attribs, block); + _blockManager.SetPrevAttribs(attribs); - switch (attribs.Persistence) - { - case AttribPersistence.Off: - _newAttribs = new BlockAttribs(); - break; + switch (attribs.Persistence) + { + case AttribPersistence.Off: + _newAttribs = new BlockAttribs(); + break; - case AttribPersistence.On: - _newAttribs = new BlockAttribs(); - break; + case AttribPersistence.On: + _newAttribs = new BlockAttribs(); + break; - case AttribPersistence.Once: - _newAttribs = _blockManager.GetPrevious(1); - break; - } + case AttribPersistence.Once: + _newAttribs = _blockManager.GetPrevious(1); + break; + } - return attribs; - } + return attribs; + } - public void SetYield() => shouldYield = true; + public void SetYield() => shouldYield = true; - public RantOutput Run(double timeout, RantPattern pattern = null) - { - lock (_patternArgs ?? fallbackArgsLockObj) - { + public RantOutput Run(double timeout, RantPattern pattern = null) + { + lock (_patternArgs ?? fallbackArgsLockObj) + { if (pattern == null) pattern = _pattern; LastTimeout = timeout; long timeoutMS = (long)(timeout * 1000); @@ -318,11 +317,11 @@ public RantOutput Run(double timeout, RantPattern pattern = null) return Return(); } - } + } - public IEnumerable RunSerial(double timeout, RantPattern pattern = null) - { - lock(_patternArgs ?? fallbackArgsLockObj) + public IEnumerable RunSerial(double timeout, RantPattern pattern = null) + { + lock (_patternArgs ?? fallbackArgsLockObj) { if (pattern == null) pattern = _pattern; LastTimeout = timeout; @@ -381,6 +380,6 @@ public IEnumerable RunSerial(double timeout, RantPattern pattern = n if (!stopwatchAlreadyRunning) _stopwatch.Stop(); } - } - } + } + } } \ No newline at end of file diff --git a/Rant/Core/Stringes/Chare.cs b/Rant/Core/Stringes/Chare.cs index ac556ed..64ed58e 100644 --- a/Rant/Core/Stringes/Chare.cs +++ b/Rant/Core/Stringes/Chare.cs @@ -6,102 +6,102 @@ namespace Rant.Core.Stringes /// Represents a charactere, which provides location information on a character taken from a stringe. /// internal sealed class Chare - { - private readonly Stringe _src; - private readonly char _character; - private readonly int _offset; - private int _line; - private int _column; + { + private readonly Stringe _src; + private readonly char _character; + private readonly int _offset; + private int _line; + private int _column; - /// - /// The stringe from which the charactere was taken. - /// - public Stringe Source => _src; + /// + /// The stringe from which the charactere was taken. + /// + public Stringe Source => _src; - /// - /// The underlying character. - /// - public char Character => _character; + /// + /// The underlying character. + /// + public char Character => _character; - /// - /// The position of the charactere in the stringe. - /// - public int Offset => _offset; + /// + /// The position of the charactere in the stringe. + /// + public int Offset => _offset; - /// - /// The line on which the charactere appears. - /// - public int Line - { - get - { - if (_line == 0) SetLineCol(); - return _line; - } - } + /// + /// The line on which the charactere appears. + /// + public int Line + { + get + { + if (_line == 0) SetLineCol(); + return _line; + } + } - /// - /// The column on which the charactere appears. - /// - public int Column - { - get - { - if (_column == 0) SetLineCol(); - return _column; - } - } + /// + /// The column on which the charactere appears. + /// + public int Column + { + get + { + if (_column == 0) SetLineCol(); + return _column; + } + } - private void SetLineCol() - { - _line = _src.Line; - _column = _src.Column; - if (_offset <= 0) return; - for (int i = 0; i < _offset; i++) - { - if (_src.ParentString[_offset] == '\n') - { - _line++; - _column = 1; - } - else - { - _column++; - } - } - } + private void SetLineCol() + { + _line = _src.Line; + _column = _src.Column; + if (_offset <= 0) return; + for (int i = 0; i < _offset; i++) + { + if (_src.ParentString[_offset] == '\n') + { + _line++; + _column = 1; + } + else + { + _column++; + } + } + } - internal Chare(Stringe source, char c, int offset) - { - _src = source; - _character = c; - _offset = offset; - _line = _column = 0; - } + internal Chare(Stringe source, char c, int offset) + { + _src = source; + _character = c; + _offset = offset; + _line = _column = 0; + } - internal Chare(Stringe source, char c, int offset, int line, int col) - { - _src = source; - _character = c; - _offset = offset; - _line = line; - _column = col; - } + internal Chare(Stringe source, char c, int offset, int line, int col) + { + _src = source; + _character = c; + _offset = offset; + _line = line; + _column = col; + } - /// - /// Returns the string representation of the current charactere. - /// - /// - public override string ToString() => _character.ToString(CultureInfo.InvariantCulture); + /// + /// Returns the string representation of the current charactere. + /// + /// + public override string ToString() => _character.ToString(CultureInfo.InvariantCulture); - public static bool operator ==(Chare chare, char c) - { - return chare?._character == c; - } + public static bool operator ==(Chare chare, char c) + { + return chare?._character == c; + } - public static bool operator !=(Chare chare, char c) - { - return !(chare == c); - } - } + public static bool operator !=(Chare chare, char c) + { + return !(chare == c); + } + } } \ No newline at end of file diff --git a/Rant/Core/Stringes/Extensions.cs b/Rant/Core/Stringes/Extensions.cs index 6f85d4e..a471887 100644 --- a/Rant/Core/Stringes/Extensions.cs +++ b/Rant/Core/Stringes/Extensions.cs @@ -1,15 +1,15 @@ namespace Rant.Core.Stringes { internal static class Extensions - { - /// - /// Converts the specified value into a stringe. - /// - /// The object to convert. - /// - public static Stringe ToStringe(this object value) - { - return new Stringe(value.ToString()); - } - } + { + /// + /// Converts the specified value into a stringe. + /// + /// The object to convert. + /// + public static Stringe ToStringe(this object value) + { + return new Stringe(value.ToString()); + } + } } \ No newline at end of file diff --git a/Rant/Core/Stringes/Lexer.cs b/Rant/Core/Stringes/Lexer.cs index 6cfc496..e4614ff 100644 --- a/Rant/Core/Stringes/Lexer.cs +++ b/Rant/Core/Stringes/Lexer.cs @@ -11,79 +11,79 @@ namespace Rant.Core.Stringes /// /// The identifier type to use in tokens created from the context. internal sealed class Lexer : IEnumerable where T : struct - { - private const int DefaultPriority = 1; - - private readonly HashSet _punctuation; - private List<_> _listNormal; - private List<_> _listHigh; - private List<_, int>> _regexes; - private List<_, T, int>> _functions; - private _ _endToken; - private _, T> _undefToken; - private readonly HashSet _ignore; - private bool _sorted; - - /// - /// Creates a new LexerRules instance. - /// - public Lexer() - { - _endToken = null; - _undefToken = null; - _punctuation = new HashSet(); - _listNormal = new List<_>(8); - _listHigh = new List<_>(8); - _regexes = new List<_, int>>(8); - _functions = new List<_, T, int>>(8); - _ignore = new HashSet(); - _sorted = false; - } - - /// - /// A list of token identifiers that should be ignored. - /// - public HashSet IgnoreRules => _ignore; - - /// - /// Adds the specified token types to the ignore list. - /// - /// The token types to ignore. - /// - public Lexer Ignore(params T[] types) - { - foreach (var t in types) _ignore.Add(t); - return this; - } - - /// - /// Returns the symbol that represents the specified identifier. If the identifier cannot be found, the method will return an empty string. - /// - /// The identifier to get the symbol for. - /// - public string GetSymbolForId(T id) - { - foreach (var rule in _listNormal.Concat(_listHigh).Where(rule => id.Equals(rule.Item2))) - { - return rule.Item1; - } - return ""; - } - - private bool Available(string symbol) - { - return _listNormal.All(t => t.Item1 != symbol) && _listHigh.All(t => t.Item1 != symbol); - } - - /// - /// Define a lexer rule that returns a token when the end of the input is reached. - /// - /// The token identifier to associate with this rule. - public void AddEndToken(T endTokenId) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - _endToken = _.Create("EOF", endTokenId); - } + { + private const int DefaultPriority = 1; + + private readonly HashSet _punctuation; + private List<_> _listNormal; + private List<_> _listHigh; + private List<_, int>> _regexes; + private List<_, T, int>> _functions; + private _ _endToken; + private _, T> _undefToken; + private readonly HashSet _ignore; + private bool _sorted; + + /// + /// Creates a new LexerRules instance. + /// + public Lexer() + { + _endToken = null; + _undefToken = null; + _punctuation = new HashSet(); + _listNormal = new List<_>(8); + _listHigh = new List<_>(8); + _regexes = new List<_, int>>(8); + _functions = new List<_, T, int>>(8); + _ignore = new HashSet(); + _sorted = false; + } + + /// + /// A list of token identifiers that should be ignored. + /// + public HashSet IgnoreRules => _ignore; + + /// + /// Adds the specified token types to the ignore list. + /// + /// The token types to ignore. + /// + public Lexer Ignore(params T[] types) + { + foreach (var t in types) _ignore.Add(t); + return this; + } + + /// + /// Returns the symbol that represents the specified identifier. If the identifier cannot be found, the method will return an empty string. + /// + /// The identifier to get the symbol for. + /// + public string GetSymbolForId(T id) + { + foreach (var rule in _listNormal.Concat(_listHigh).Where(rule => id.Equals(rule.Item2))) + { + return rule.Item1; + } + return ""; + } + + private bool Available(string symbol) + { + return _listNormal.All(t => t.Item1 != symbol) && _listHigh.All(t => t.Item1 != symbol); + } + + /// + /// Define a lexer rule that returns a token when the end of the input is reached. + /// + /// The token identifier to associate with this rule. + public void AddEndToken(T endTokenId) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + _endToken = _.Create("EOF", endTokenId); + } /// /// Define a lexer rule that returns a token when the end of the input is reached. @@ -103,247 +103,247 @@ public void AddEndToken(T endTokenId, string endTokenValue) /// The token identifier to associate with this rule. /// A function that processes the captured stringe. public void AddUndefinedCaptureRule(T tokenId, Func evalFunc) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - _undefToken = _.Create(evalFunc, tokenId); - } - - - /// - /// Adds a constant rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. - /// - /// The symbol to test for. - /// The token identifier to associate with the symbol. - /// Determines whether the symbol should be tested before any regex rules. - public void Add(string symbol, T value, SymbolPriority priority = SymbolPriority.Last) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - if (String.IsNullOrEmpty(symbol)) throw new ArgumentException("Argument 'symbol' can neither be null nor empty."); - if (!Available(symbol)) throw new InvalidOperationException("A rule with the symbol '" + symbol + "' already exists."); - (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(symbol, value, StringComparison.InvariantCulture)); - _punctuation.Add(symbol[0]); - } - - /// - /// Adds a constant rule to the context that affects all symbols in the specified array. This will throw an InvalidOperationException if called after the context is used to create tokens. - /// - /// The symbols to test for. - /// The token identifier to associate with the symbols. - /// Determines whether the symbol should be tested before any regex rules. - public void Add(string[] symbols, T value, SymbolPriority priority = SymbolPriority.Last) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - if (symbols == null) throw new ArgumentNullException(nameof(symbols)); - if (symbols.Length == 0) throw new ArgumentException("Tried to use an empty symbol array."); - foreach (var s in symbols) - { - if (String.IsNullOrEmpty(s)) throw new ArgumentException("One or more symbols in the provided array were empty or null."); - if (!Available(s)) throw new InvalidOperationException("A rule with the symbol '" + s + "' already exists."); - (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(s, value, StringComparison.InvariantCulture)); - _punctuation.Add(s[0]); - } - } - - /// - /// Adds a constant rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. - /// - /// The symbol to test for. - /// The token identifier to associate with the symbol. - /// Specifies whether the rule should ignore capitalization. - /// Determines whether the symbol should be tested before any regex rules. - public void Add(string symbol, T value, bool ignoreCase, SymbolPriority priority = SymbolPriority.Last) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - if (String.IsNullOrEmpty(symbol)) throw new ArgumentException("Argument 'symbol' can neither be null nor empty."); - if (!Available(symbol)) throw new InvalidOperationException("A rule with the symbol '" + symbol + "' already exists."); - (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(symbol, value, ignoreCase ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture)); - _punctuation.Add(symbol[0]); - } - - /// - /// Adds a constant rule to the context that affects all symbols in the specified array. This will throw an InvalidOperationException if called after the context is used to create tokens. - /// - /// The symbols to test for. - /// The token identifier to associate with the symbols. - /// Specifies whether the rule should ignore capitalization. - /// Determines whether the symbol should be tested before any regex rules. - public void Add(string[] symbols, T value, bool ignoreCase, SymbolPriority priority = SymbolPriority.Last) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - if (symbols == null) throw new ArgumentNullException(nameof(symbols)); - if (symbols.Length == 0) throw new ArgumentException("Tried to use an empty symbol array."); - foreach (var s in symbols) - { - if (String.IsNullOrEmpty(s)) throw new ArgumentException("One or more symbols in the provided array were empty or null."); - if (!Available(s)) throw new InvalidOperationException("A rule with the symbol '" + s + "' already exists."); - (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(s, value, ignoreCase ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture)); - _punctuation.Add(s[0]); - } - } - - /// - /// Adds a regex rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. - /// - /// The regex to test for. - /// The token identifier to associate with the symbol. - /// The priority of the rule. Higher values are checked first. - public void Add(Regex regex, T value, int priority = DefaultPriority) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - if (regex == null) throw new ArgumentNullException(nameof(regex)); - if (_regexes.Any(re => re.Item1 == regex)) throw new InvalidOperationException("A rule with this pattern already exists."); - - _regexes.Add(_.Create(regex, new RuleMatchValueGenerator(value), priority)); - } - - /// - /// Adds a regex rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. - /// - /// The regex to test for. - /// A function that generates a token identifier from the match. - /// The priority of the rule. Higher values are checked first. - public void Add(Regex regex, Func generator, int priority = DefaultPriority) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - if (regex == null) throw new ArgumentNullException(nameof(regex)); - if (generator == null) throw new ArgumentNullException(nameof(generator)); - if (_regexes.Any(re => re.Item1 == regex)) throw new InvalidOperationException("A rule with this pattern already exists."); - _regexes.Add(_.Create(regex, new RuleMatchValueGenerator(generator), priority)); - } - - /// - /// Adds a function rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. - /// - /// The function to read the token with. - /// The token identifier to associate with the function. - /// The priority of the rule. Higher values are checked first. - public void Add(Func func, T value, int priority = DefaultPriority) - { - if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); - if (func == null) throw new ArgumentNullException(nameof(func)); - _functions.Add(_.Create(func, value, priority)); - } - - /// - /// Tokenizes the input stringe and enumerates the resulting tokens. - /// - /// The input to tokenize. - /// - public IEnumerable> Tokenize(Stringe input) - { - var reader = new StringeReader(input); - - while (!reader.EndOfStringe) - { - yield return reader.ReadToken(this); - } - } - - internal bool HasPunctuation(int c) - { - return c != -1 && _punctuation.Contains((char)c); - } - - internal bool HasPunctuation(char c) - { - return _punctuation.Contains(c); - } - - private void Sort() - { - if (_sorted) return; - _listNormal = _listNormal.OrderByDescending(t => t.Item1.Length).ToList(); - _listHigh = _listHigh.OrderByDescending(t => t.Item1.Length).ToList(); - _regexes = _regexes.OrderByDescending(r => r.Item3).ToList(); - _functions = _functions.OrderByDescending(t => t.Item3).ToList(); - _sorted = true; - } - - internal _, T> UndefinedCaptureRule => _undefToken; - - internal _ EndToken => _endToken; - - internal List<_> NormalSymbols - { - get - { - Sort(); - return _listNormal; - } - } - - internal List<_> HighSymbols - { - get - { - Sort(); - return _listHigh; - } - } - - internal List<_, int>> RegexList - { - get - { - Sort(); - return _regexes; - } - } - - internal List<_, T, int>> FunctionList - { - get - { - Sort(); - return _functions; - } - } - - /// - /// Definitely does not return the enumerator for the current instance. - /// - /// - public IEnumerator GetEnumerator() - { - throw new InvalidOperationException("Cannot enumerate a rule set."); - } - } - - /// - /// Used to manipulate the order in which symbol (non-regex) rules are tested. - /// - public enum SymbolPriority - { - /// - /// Test symbol after testing regex symbols. This is the default value for all symbols rules. - /// - Last = 0, - - /// - /// Test symbol before testing any regex rules. - /// - First = 1 - } - - internal class RuleMatchValueGenerator - { - private readonly T _value; - private readonly Func _func; - - public RuleMatchValueGenerator(T value) - { - _value = value; - _func = null; - } - - public RuleMatchValueGenerator(Func generator) - { - _func = generator; - } - - public T GetValue(Match m) - { - return _func == null ? _value : _func(m); - } - } + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + _undefToken = _.Create(evalFunc, tokenId); + } + + + /// + /// Adds a constant rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. + /// + /// The symbol to test for. + /// The token identifier to associate with the symbol. + /// Determines whether the symbol should be tested before any regex rules. + public void Add(string symbol, T value, SymbolPriority priority = SymbolPriority.Last) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + if (String.IsNullOrEmpty(symbol)) throw new ArgumentException("Argument 'symbol' can neither be null nor empty."); + if (!Available(symbol)) throw new InvalidOperationException("A rule with the symbol '" + symbol + "' already exists."); + (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(symbol, value, StringComparison.InvariantCulture)); + _punctuation.Add(symbol[0]); + } + + /// + /// Adds a constant rule to the context that affects all symbols in the specified array. This will throw an InvalidOperationException if called after the context is used to create tokens. + /// + /// The symbols to test for. + /// The token identifier to associate with the symbols. + /// Determines whether the symbol should be tested before any regex rules. + public void Add(string[] symbols, T value, SymbolPriority priority = SymbolPriority.Last) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + if (symbols == null) throw new ArgumentNullException(nameof(symbols)); + if (symbols.Length == 0) throw new ArgumentException("Tried to use an empty symbol array."); + foreach (var s in symbols) + { + if (String.IsNullOrEmpty(s)) throw new ArgumentException("One or more symbols in the provided array were empty or null."); + if (!Available(s)) throw new InvalidOperationException("A rule with the symbol '" + s + "' already exists."); + (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(s, value, StringComparison.InvariantCulture)); + _punctuation.Add(s[0]); + } + } + + /// + /// Adds a constant rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. + /// + /// The symbol to test for. + /// The token identifier to associate with the symbol. + /// Specifies whether the rule should ignore capitalization. + /// Determines whether the symbol should be tested before any regex rules. + public void Add(string symbol, T value, bool ignoreCase, SymbolPriority priority = SymbolPriority.Last) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + if (String.IsNullOrEmpty(symbol)) throw new ArgumentException("Argument 'symbol' can neither be null nor empty."); + if (!Available(symbol)) throw new InvalidOperationException("A rule with the symbol '" + symbol + "' already exists."); + (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(symbol, value, ignoreCase ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture)); + _punctuation.Add(symbol[0]); + } + + /// + /// Adds a constant rule to the context that affects all symbols in the specified array. This will throw an InvalidOperationException if called after the context is used to create tokens. + /// + /// The symbols to test for. + /// The token identifier to associate with the symbols. + /// Specifies whether the rule should ignore capitalization. + /// Determines whether the symbol should be tested before any regex rules. + public void Add(string[] symbols, T value, bool ignoreCase, SymbolPriority priority = SymbolPriority.Last) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + if (symbols == null) throw new ArgumentNullException(nameof(symbols)); + if (symbols.Length == 0) throw new ArgumentException("Tried to use an empty symbol array."); + foreach (var s in symbols) + { + if (String.IsNullOrEmpty(s)) throw new ArgumentException("One or more symbols in the provided array were empty or null."); + if (!Available(s)) throw new InvalidOperationException("A rule with the symbol '" + s + "' already exists."); + (priority == SymbolPriority.First ? _listHigh : _listNormal).Add(_.Create(s, value, ignoreCase ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture)); + _punctuation.Add(s[0]); + } + } + + /// + /// Adds a regex rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. + /// + /// The regex to test for. + /// The token identifier to associate with the symbol. + /// The priority of the rule. Higher values are checked first. + public void Add(Regex regex, T value, int priority = DefaultPriority) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + if (regex == null) throw new ArgumentNullException(nameof(regex)); + if (_regexes.Any(re => re.Item1 == regex)) throw new InvalidOperationException("A rule with this pattern already exists."); + + _regexes.Add(_.Create(regex, new RuleMatchValueGenerator(value), priority)); + } + + /// + /// Adds a regex rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. + /// + /// The regex to test for. + /// A function that generates a token identifier from the match. + /// The priority of the rule. Higher values are checked first. + public void Add(Regex regex, Func generator, int priority = DefaultPriority) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + if (regex == null) throw new ArgumentNullException(nameof(regex)); + if (generator == null) throw new ArgumentNullException(nameof(generator)); + if (_regexes.Any(re => re.Item1 == regex)) throw new InvalidOperationException("A rule with this pattern already exists."); + _regexes.Add(_.Create(regex, new RuleMatchValueGenerator(generator), priority)); + } + + /// + /// Adds a function rule to the context. This will throw an InvalidOperationException if called after the context is used to create tokens. + /// + /// The function to read the token with. + /// The token identifier to associate with the function. + /// The priority of the rule. Higher values are checked first. + public void Add(Func func, T value, int priority = DefaultPriority) + { + if (_sorted) throw new InvalidOperationException("Cannot add more rules after they have been used."); + if (func == null) throw new ArgumentNullException(nameof(func)); + _functions.Add(_.Create(func, value, priority)); + } + + /// + /// Tokenizes the input stringe and enumerates the resulting tokens. + /// + /// The input to tokenize. + /// + public IEnumerable> Tokenize(Stringe input) + { + var reader = new StringeReader(input); + + while (!reader.EndOfStringe) + { + yield return reader.ReadToken(this); + } + } + + internal bool HasPunctuation(int c) + { + return c != -1 && _punctuation.Contains((char)c); + } + + internal bool HasPunctuation(char c) + { + return _punctuation.Contains(c); + } + + private void Sort() + { + if (_sorted) return; + _listNormal = _listNormal.OrderByDescending(t => t.Item1.Length).ToList(); + _listHigh = _listHigh.OrderByDescending(t => t.Item1.Length).ToList(); + _regexes = _regexes.OrderByDescending(r => r.Item3).ToList(); + _functions = _functions.OrderByDescending(t => t.Item3).ToList(); + _sorted = true; + } + + internal _, T> UndefinedCaptureRule => _undefToken; + + internal _ EndToken => _endToken; + + internal List<_> NormalSymbols + { + get + { + Sort(); + return _listNormal; + } + } + + internal List<_> HighSymbols + { + get + { + Sort(); + return _listHigh; + } + } + + internal List<_, int>> RegexList + { + get + { + Sort(); + return _regexes; + } + } + + internal List<_, T, int>> FunctionList + { + get + { + Sort(); + return _functions; + } + } + + /// + /// Definitely does not return the enumerator for the current instance. + /// + /// + public IEnumerator GetEnumerator() + { + throw new InvalidOperationException("Cannot enumerate a rule set."); + } + } + + /// + /// Used to manipulate the order in which symbol (non-regex) rules are tested. + /// + public enum SymbolPriority + { + /// + /// Test symbol after testing regex symbols. This is the default value for all symbols rules. + /// + Last = 0, + + /// + /// Test symbol before testing any regex rules. + /// + First = 1 + } + + internal class RuleMatchValueGenerator + { + private readonly T _value; + private readonly Func _func; + + public RuleMatchValueGenerator(T value) + { + _value = value; + _func = null; + } + + public RuleMatchValueGenerator(Func generator) + { + _func = generator; + } + + public T GetValue(Match m) + { + return _func == null ? _value : _func(m); + } + } } \ No newline at end of file diff --git a/Rant/Core/Stringes/Stringe.cs b/Rant/Core/Stringes/Stringe.cs index 62ea0c1..ee4fdd6 100644 --- a/Rant/Core/Stringes/Stringe.cs +++ b/Rant/Core/Stringes/Stringe.cs @@ -9,773 +9,773 @@ namespace Rant.Core.Stringes /// Represents a string or a substring in relation to its parent. Provides line number, column, offset, and other useful data. /// internal class Stringe : IEnumerable - { - private readonly Stref _stref; - private readonly int _offset; - private readonly int _length; - private string _substring; - - // Used to cache requested metadata so that we don't have a bunch of unused fields - private Dictionary _meta = null; - - /// - /// Returns an empty stringe based on the position of another stringe. - /// - /// The basis stringe to get position info from. - /// - public static Stringe Empty(Stringe basis) - { - return new Stringe(basis, 0, 0); - } - - /// - /// Indicates whether the specified stringe is null or empty. - /// - /// The stringe to test. - /// - public static bool IsNullOrEmpty(Stringe stringe) - { - return stringe == null || stringe.Length == 0; - } - - /// - /// Returns a stringe whose endpoints are the specified stringes. The stringes must both belong to the same parent string. - /// - /// The first stringe. - /// The second stringe. - /// - public static Stringe Range(Stringe a, Stringe b) - { - if (a == null) throw new ArgumentNullException("a"); - if (b == null) throw new ArgumentNullException("b"); - if (a._stref != b._stref) - throw new ArgumentException("The stringes do not belong to the same parent."); - - if (a == b) return a; - if (a.IsSubstringeOf(b)) return b; - if (b.IsSubstringeOf(a)) return a; - - // Right side of A intersects left side of B. - if (a._offset > b._offset && a._offset + a._length < b._offset + b._length) - { - return a.Substringe(0, b._offset + b._length - a._offset); - } - - // Left side of A intersects right side of B. - if (a._offset < b._offset + b._length && a._offset > b._offset) - { - return b.Substringe(0, a._offset + a._length - b._offset); - } - - // A is to the left of B. - if (a._offset + a._length <= b._offset) - { - return a.Substringe(0, b._offset + b._length - a._offset); - } - - // B is to the left of A. - if (b._offset + b._length <= a._offset) - { - return b.Substringe(0, a._offset + a._length - b._offset); - } - - return null; - } - - /// - /// Returns a stringe comprised of all text between the two specified stringes. Returns null if the stringes are adjacent or intersected. - /// - /// The first stringe. - /// The second stringe. - /// - public static Stringe Between(Stringe a, Stringe b) - { - if (a == null) throw new ArgumentNullException("a"); - if (b == null) throw new ArgumentNullException("b"); - if (a._stref != b._stref) - throw new ArgumentException("The stringes do not belong to the same parent."); - - if (a == b) return a; - if (a.IsSubstringeOf(b)) return b; - if (b.IsSubstringeOf(a)) return a; - - // Right side of A intersects left side of B. - if (a._offset > b._offset && a._offset + a._length < b._offset + b._length) - { - return null; - } - - // Left side of A intersects right side of B. - if (a._offset < b._offset + b._length && a._offset > b._offset) - { - return null; - } - - // A is to the left of B. - if (a._offset + a._length <= b._offset) - { - return a.Substringe(a._length, b._offset - a._offset - a._length); - } - - // B is to the left of A. - if (b._offset + b._length <= a._offset) - { - return b.Substringe(b._length, a._offset - b._offset - b._length); - } - - return null; - } - - /// - /// The offset of the stringe in the string. - /// - public int Offset => _offset; - - /// - /// The length of the string represented by the stringe. - /// - public int Length => _length; - - /// - /// The 1-based line number at which the stringe begins. - /// - public int Line => _stref.Chares[_offset].Line; - - /// - /// The 1-based column at which the stringe begins. - /// - public int Column => _stref.Chares[_offset].Column; - - /// - /// The index at which the stringe ends in the string. - /// - public int End => _offset + _length; - - /// - /// Indicates if the stringe is a substring. - /// - public bool IsSubstring => _offset > 0 || _length < _stref.String.Length; - - /// - /// Indicates if the stringe is empty. - /// - public bool IsEmpty => _length == 0; - - /// - /// The substring value represented by the stringe. If the stringe is the parent, this will provide the original string. - /// - public string Value => _substring ?? (_substring = _stref.String.Substring(_offset, _length)); - - /// - /// Gets the original string from which the stringe was originally derived. - /// - public string ParentString => _stref.String; - - private Dictionary Meta => _meta ?? (_meta = new Dictionary()); - - /// - /// Creates a new stringe from the specified string. - /// - /// The string to turn into a stringe. - public Stringe(string value) - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _stref = new Stref(this, value); - _offset = 0; - _length = value.Length; - _substring = null; - } - - /// - /// The number of times the current string occurs in the parent string. - /// - /// - public int OccurrenceCount - { - get - { - const string name = "Occurrences"; - object obj; - if (Meta.TryGetValue(name, out obj)) return (int)obj; - - int count = StringeUtils.GetMatchCount(_stref.String, Value); - Meta[name] = count; - return count; - } - } - - /// - /// The next index in the parent string at which the current stringe value occurs. - /// - public int NextIndex - { - get - { - const string name = "NextIndex"; - object obj; - if (Meta.TryGetValue(name, out obj)) return (int)obj; - - int nextIndex = _stref.String.IndexOf(Value, _offset + 1, StringComparison.InvariantCulture); - Meta[name] = nextIndex; - return nextIndex; - } - } - - internal Stringe(Stringe value) - { - _stref = value._stref; - _offset = value._offset; - _length = value._length; - _offset = value._offset; - _substring = value._substring; - } - - private Stringe(Stringe parent, int relativeOffset, int length) - { - _stref = parent._stref; - _offset = parent._offset + relativeOffset; - _length = length; - _substring = null; - } - - /// - /// Gets the charactere at the specified index in the stringe. - /// - /// The index of the charactere to retrieve. - /// - public Chare this[int index] => _stref.Chares[index] ?? (_stref.Chares[index] = new Chare(this, _stref.String[index], index + _offset)); - - /// - /// Determines whether the current stringe is a substringe of the specified parent stringe. - /// - /// The parent stringe to compare to. - /// - public bool IsSubstringeOf(Stringe parent) - { - if (_stref != parent._stref) return false; - return _offset >= parent._offset && _offset + _length <= parent._offset + parent._length; - } - - /// - /// Returns the zero-based index at which the specified string first occurs, relative to the substringe. The search starts at the specified index. - /// - /// The string to search for. - /// The index at which to begin the search. - /// The string comparison rules to apply to the search. - /// - public int IndexOf(string input, int start = 0, StringComparison comparisonType = StringComparison.Ordinal) - { - return Value.IndexOf(input, start, comparisonType); - } - - /// - /// Returns the zero-based index at which the specified string first occurs, relative to the parent string. The search starts at the specified index. - /// - /// The string to search for. - /// The index at which to begin the search. - /// The string comparison rules to apply to the search. - /// - public int IndexOfTotal(string input, int start = 0, StringComparison comparisonType = StringComparison.Ordinal) - { - int index = Value.IndexOf(input, start, comparisonType); - return index == -1 ? index : index + _offset; - } - - /// - /// Returns the zero-based index at which the specified character first occurs, relative to the substringe. The search starts at the specified index. - /// - /// The character to search for. - /// The index at which to begin the search. - /// - public int IndexOf(char input, int start = 0) - { - return Value.IndexOf(input, start); - } - - /// - /// Returns the zero-based index at which the specified character first occurs, relative to the parent string. The search starts at the specified index. - /// - /// The character to search for. - /// The index at which to begin the search. - /// - public int IndexOfTotal(char input, int start = 0) - { - int index = Value.IndexOf(input, start); - return index == -1 ? index : index + _offset; - } - - /// - /// Creates a substringe from the stringe, starting at the specified index and extending to the specified length. - /// - /// The offset at which to begin the substringe. - /// The length of the substringe. - /// - public Stringe Substringe(int offset, int length) - { - return new Stringe(this, offset, length); - } - - /// - /// Create a substringe from the stringe, starting at the specified index and extending to the end. - /// - /// The offset at which to begin the substringe. - /// - public Stringe Substringe(int offset) - { - return new Stringe(this, offset, Length - offset); - } - - /// - /// Returns a substringe that contains all characters between the two specified positions in the stringe. - /// - /// The left side of the slice. - /// The right side of the slice. - /// - public Stringe Slice(int a, int b) - { - if (b < a) throw new ArgumentException("'b' cannot be less tha 'a'."); - if (b < 0 || a < 0) throw new ArgumentException("Indices cannot be negative."); - if (a > _length || b > _length) throw new ArgumentException("Indices must be within stringe boundaries."); - return new Stringe(this, a, b - a); - } - - /// - /// Returns a new substringe whose left and right boundaries are offset by the specified values. - /// - /// The amount, in characters, to offset the left boundary to the left. - /// The amount, in characters, to offset the right boundary to the right. - /// - public Stringe Dilate(int left, int right) - { - int exIndex = _offset - left; - if (exIndex < 0) throw new ArgumentException("Expanded offset was negative."); - int exLength = _length + right + left; - if (exLength < 0) throw new ArgumentException("Expanded length was negative."); - if (exIndex + exLength > _stref.String.Length) throw new ArgumentException("Expanded stringe tried to extend beyond the end of the string."); - return new Stringe(this, -left, exLength); - } - - - /// - /// Returns the stringe with all leading and trailing white space characters removed. - /// - /// - public Stringe Trim() - { - if (_length == 0) return this; - int a = 0; - int b = _length; - do - { - if (Char.IsWhiteSpace(Value[a])) - { - a++; - } - else if (Char.IsWhiteSpace(Value[b - 1])) - { - b--; - } - else - { - break; - } - } while (a < b && b > 0 && a < _length); - - return Substringe(a, b - a); - } - - /// - /// Returns the stringe with any occurrences of the specified characters stripped from the ends. - /// - /// The characters to strip off the ends of the stringe. - /// - public Stringe Trim(params char[] trimChars) - { - if (_length == 0) return this; - bool useDefault = trimChars.Length == 0; - int a = 0; - int b = _length; - do - { - if (useDefault ? Char.IsWhiteSpace(Value[a]) : trimChars.Contains(Value[a])) - { - a++; - } - else if (useDefault ? Char.IsWhiteSpace(Value[b - 1]) : trimChars.Contains(Value[b - 1])) - { - b--; - } - else - { - break; - } - } while (a < b && b > 0 && a < _length); - - return Substringe(a, b - a); - } - - /// - /// Returns a copy of the stringe with the specified characters removed from the start. - /// - /// The characters to remove. - /// - public Stringe TrimStart(params char[] trimChars) - { - if (_length == 0) return this; - bool useDefault = trimChars.Length == 0; - int a = 0; - while (a < _length) - { - if (useDefault ? Char.IsWhiteSpace(Value[a]) : trimChars.Contains(Value[a])) - { - a++; - } - else - { - break; - } - } - return Substringe(a); - } - - /// - /// Returns a copy of the stringe with the specified characters removed from the end. - /// - /// The characters to remove. - /// - public Stringe TrimEnd(params char[] trimChars) - { - if (_length == 0) return this; - bool useDefault = trimChars.Length == 0; - int b = _length; - do - { - if (useDefault ? Char.IsWhiteSpace(Value[b - 1]) : trimChars.Contains(Value[b - 1])) - { - b--; - } - else - { - break; - } - } while (b > 0); - return Substringe(0, b); - } - - /// - /// Indicates whether the left side of the line on which the stringe exists is composed entirely of white space. - /// - public bool LeftPadded - { - get - { - if (_offset == 0) - { - for (int i = 0; i < _length; i++) - { - if (Char.IsWhiteSpace(_stref.String[i])) return true; - } - return false; - } - for (int i = _offset - 1; i >= 0; i--) - { - if (!Char.IsWhiteSpace(_stref.String[i])) return false; - if (_stref.String[i] == '\n') return true; - } - return true; - } - } - - /// - /// Indicates whether the line context to the right side of the stringe is composed on uninterrupted white space. - /// - public bool RightPadded - { - get - { - bool found = false; - - // The end of the stringe is at the end of the parent string. - if (_offset + _length == _stref.String.Length) - { - for (int i = _stref.String.Length - 1; i >= _offset; i--) - { - if (!Char.IsWhiteSpace(_stref.String[i])) - { - return found; - } - found = true; - } - return false; - } - - // The stringe sits in the middle of one or more lines. - for (int i = _offset + _length; i < _stref.String.Length; i++) - { - if (!Char.IsWhiteSpace(_stref.String[i])) return false; - if (_stref.String[i] == '\n') return true; - } - return true; - } - } - - /// - /// Splits the stringe into multiple parts by the specified delimiters. - /// - /// The delimiters by which to split the stringe. - /// - public IEnumerable Split(params string[] separators) - { - return Split(separators, StringSplitOptions.None); - } - - /// - /// Splits the stringe into multiple parts by the specified delimiters. - /// - /// The delimiters by which to split the stringe. - /// - public IEnumerable Split(params char[] separators) - { - return Split(separators, StringSplitOptions.None); - } - - /// - /// Splits the stringe into multiple parts by the specified delimiters. - /// - /// The delimiters by which to split the stringe. - /// Specifies whether empty substringes should be included in the return value. - /// - public IEnumerable Split(char[] separators, StringSplitOptions options) - { - int start = 0; - for (int i = 0; i < _length; i++) - { - if (!separators.Contains(Value[i])) continue; - if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); - start = i + 1; - } - if (start > _length) yield break; - if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); - } - - /// - /// Splits the stringe into multiple parts by the specified delimiters. - /// - /// The delimiters by which to split the stringe. - /// Specifies whether empty substringes should be included in the return value. - /// - public IEnumerable Split(string[] separators, StringSplitOptions options) - { - int start = 0; - for (int i = 0; i < _length; i++) - { - var hit = separators.FirstOrDefault(sep => IndexOf(sep) == i); - if (hit == null) continue; - if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); - start = i + hit.Length; - } - if (start > _length) yield break; - if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); - } - - /// - /// Splits the stringe into multiple parts by the specified delimiters. - /// - /// The delimiters by which to split the stringe. - /// The maximum number of substringes to return. If the count exceeds this number, the last item will be the remainder of the stringe. - /// Specifies whether empty substringes should be included in the return value. - /// - public IEnumerable Split(char[] separators, int count, StringSplitOptions options = StringSplitOptions.None) - { - if (count == 0) yield break; - if (count == 1) - { - yield return this; - yield break; - } - - int matches = 0; - int start = 0; - - for (int i = 0; i < _length; i++) - { - if (separators.Contains(Value[i])) - { - if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); - start = i + 1; - matches++; - } - if (matches < count - 1) continue; - if (start > _length) yield break; - yield return Substringe(start, _length - start); - yield break; - } - if (start > _length || matches >= count) yield break; - if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); - } - - /// - /// Splits the stringe into multiple parts by the specified delimiters. - /// - /// The delimiters by which to split the stringe. - /// The maximum number of substringes to return. If the count exceeds this number, the last item will be the remainder of the stringe. - /// Specifies whether empty substringes should be included in the return value. - /// - public IEnumerable Split(string[] separators, int count, StringSplitOptions options = StringSplitOptions.None) - { - if (count == 0) yield break; - if (count == 1) - { - yield return this; - yield break; - } - - int matches = 0; - int start = 0; - - for (int i = 0; i < _length; i++) - { - var hit = separators.FirstOrDefault(sep => IndexOf(sep, i) == i); - if (hit != null) - { - if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); - start = i + hit.Length; - matches++; - } - if (matches < count - 1) continue; - if (start > _length) yield break; - yield return Substringe(start, _length - start); - yield break; - } - if (start > _length || matches >= count) yield break; - if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); - } - - /// - /// Converts a Stringe to its string value. - /// - /// The stringe to convert. - public static explicit operator string(Stringe stringe) => stringe.Value; - - /// - /// Converts a string to a Stringe. - /// - /// The string to convert. - public static implicit operator Stringe(string value) => new Stringe(value); - - /// - /// Determines whether two stringes are equal. - /// - /// The first stringe. - /// The second stringe. - /// - public static bool operator ==(Stringe a, Stringe b) - { - if (Equals(a, null) && Equals(b, null)) return true; - if (Equals(a, null) || Equals(b, null)) return false; - return a._stref == b._stref && a.Value == b.Value; - } - - /// - /// Determines whether two stringes are not equal. - /// - /// The first stringe. - /// The second stringe. - /// - public static bool operator !=(Stringe a, Stringe b) - { - if (Equals(a, null) && Equals(b, null)) return false; - if (Equals(a, null) || Equals(b, null)) return true; - return a._stref != b._stref || a.Value != b.Value; - } - - /// - /// Determines whether the current stringe is equal to the specified object. - /// - /// The object to compare with. - /// - public override bool Equals(object obj) - { - var stre = obj as Stringe; - if (stre == null) return false; - return this == stre; - } - - /// - /// Returns the hash of the current stringe. - /// - /// - public override int GetHashCode() => StringeUtils.HashOf(_stref.String, _offset, _length); - - /// - /// Returns the string value of the stringe. - /// - /// - public override string ToString() => Value; - - /// - /// Stores cached character data for a Stringe. - /// - private class Stref - { - public readonly string String; - public readonly Chare[] Chares; - public readonly bool[] Bases; - - public Stref(Stringe stringe, string str) - { - String = str; - Chares = new Chare[str.Length]; - Bases = new bool[str.Length]; - if(str.Length == 0) + { + private readonly Stref _stref; + private readonly int _offset; + private readonly int _length; + private string _substring; + + // Used to cache requested metadata so that we don't have a bunch of unused fields + private Dictionary _meta = null; + + /// + /// Returns an empty stringe based on the position of another stringe. + /// + /// The basis stringe to get position info from. + /// + public static Stringe Empty(Stringe basis) + { + return new Stringe(basis, 0, 0); + } + + /// + /// Indicates whether the specified stringe is null or empty. + /// + /// The stringe to test. + /// + public static bool IsNullOrEmpty(Stringe stringe) + { + return stringe == null || stringe.Length == 0; + } + + /// + /// Returns a stringe whose endpoints are the specified stringes. The stringes must both belong to the same parent string. + /// + /// The first stringe. + /// The second stringe. + /// + public static Stringe Range(Stringe a, Stringe b) + { + if (a == null) throw new ArgumentNullException("a"); + if (b == null) throw new ArgumentNullException("b"); + if (a._stref != b._stref) + throw new ArgumentException("The stringes do not belong to the same parent."); + + if (a == b) return a; + if (a.IsSubstringeOf(b)) return b; + if (b.IsSubstringeOf(a)) return a; + + // Right side of A intersects left side of B. + if (a._offset > b._offset && a._offset + a._length < b._offset + b._length) + { + return a.Substringe(0, b._offset + b._length - a._offset); + } + + // Left side of A intersects right side of B. + if (a._offset < b._offset + b._length && a._offset > b._offset) + { + return b.Substringe(0, a._offset + a._length - b._offset); + } + + // A is to the left of B. + if (a._offset + a._length <= b._offset) + { + return a.Substringe(0, b._offset + b._length - a._offset); + } + + // B is to the left of A. + if (b._offset + b._length <= a._offset) + { + return b.Substringe(0, a._offset + a._length - b._offset); + } + + return null; + } + + /// + /// Returns a stringe comprised of all text between the two specified stringes. Returns null if the stringes are adjacent or intersected. + /// + /// The first stringe. + /// The second stringe. + /// + public static Stringe Between(Stringe a, Stringe b) + { + if (a == null) throw new ArgumentNullException("a"); + if (b == null) throw new ArgumentNullException("b"); + if (a._stref != b._stref) + throw new ArgumentException("The stringes do not belong to the same parent."); + + if (a == b) return a; + if (a.IsSubstringeOf(b)) return b; + if (b.IsSubstringeOf(a)) return a; + + // Right side of A intersects left side of B. + if (a._offset > b._offset && a._offset + a._length < b._offset + b._length) + { + return null; + } + + // Left side of A intersects right side of B. + if (a._offset < b._offset + b._length && a._offset > b._offset) + { + return null; + } + + // A is to the left of B. + if (a._offset + a._length <= b._offset) + { + return a.Substringe(a._length, b._offset - a._offset - a._length); + } + + // B is to the left of A. + if (b._offset + b._length <= a._offset) + { + return b.Substringe(b._length, a._offset - b._offset - b._length); + } + + return null; + } + + /// + /// The offset of the stringe in the string. + /// + public int Offset => _offset; + + /// + /// The length of the string represented by the stringe. + /// + public int Length => _length; + + /// + /// The 1-based line number at which the stringe begins. + /// + public int Line => _stref.Chares[_offset].Line; + + /// + /// The 1-based column at which the stringe begins. + /// + public int Column => _stref.Chares[_offset].Column; + + /// + /// The index at which the stringe ends in the string. + /// + public int End => _offset + _length; + + /// + /// Indicates if the stringe is a substring. + /// + public bool IsSubstring => _offset > 0 || _length < _stref.String.Length; + + /// + /// Indicates if the stringe is empty. + /// + public bool IsEmpty => _length == 0; + + /// + /// The substring value represented by the stringe. If the stringe is the parent, this will provide the original string. + /// + public string Value => _substring ?? (_substring = _stref.String.Substring(_offset, _length)); + + /// + /// Gets the original string from which the stringe was originally derived. + /// + public string ParentString => _stref.String; + + private Dictionary Meta => _meta ?? (_meta = new Dictionary()); + + /// + /// Creates a new stringe from the specified string. + /// + /// The string to turn into a stringe. + public Stringe(string value) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _stref = new Stref(this, value); + _offset = 0; + _length = value.Length; + _substring = null; + } + + /// + /// The number of times the current string occurs in the parent string. + /// + /// + public int OccurrenceCount + { + get + { + const string name = "Occurrences"; + object obj; + if (Meta.TryGetValue(name, out obj)) return (int)obj; + + int count = StringeUtils.GetMatchCount(_stref.String, Value); + Meta[name] = count; + return count; + } + } + + /// + /// The next index in the parent string at which the current stringe value occurs. + /// + public int NextIndex + { + get + { + const string name = "NextIndex"; + object obj; + if (Meta.TryGetValue(name, out obj)) return (int)obj; + + int nextIndex = _stref.String.IndexOf(Value, _offset + 1, StringComparison.InvariantCulture); + Meta[name] = nextIndex; + return nextIndex; + } + } + + internal Stringe(Stringe value) + { + _stref = value._stref; + _offset = value._offset; + _length = value._length; + _offset = value._offset; + _substring = value._substring; + } + + private Stringe(Stringe parent, int relativeOffset, int length) + { + _stref = parent._stref; + _offset = parent._offset + relativeOffset; + _length = length; + _substring = null; + } + + /// + /// Gets the charactere at the specified index in the stringe. + /// + /// The index of the charactere to retrieve. + /// + public Chare this[int index] => _stref.Chares[index] ?? (_stref.Chares[index] = new Chare(this, _stref.String[index], index + _offset)); + + /// + /// Determines whether the current stringe is a substringe of the specified parent stringe. + /// + /// The parent stringe to compare to. + /// + public bool IsSubstringeOf(Stringe parent) + { + if (_stref != parent._stref) return false; + return _offset >= parent._offset && _offset + _length <= parent._offset + parent._length; + } + + /// + /// Returns the zero-based index at which the specified string first occurs, relative to the substringe. The search starts at the specified index. + /// + /// The string to search for. + /// The index at which to begin the search. + /// The string comparison rules to apply to the search. + /// + public int IndexOf(string input, int start = 0, StringComparison comparisonType = StringComparison.Ordinal) + { + return Value.IndexOf(input, start, comparisonType); + } + + /// + /// Returns the zero-based index at which the specified string first occurs, relative to the parent string. The search starts at the specified index. + /// + /// The string to search for. + /// The index at which to begin the search. + /// The string comparison rules to apply to the search. + /// + public int IndexOfTotal(string input, int start = 0, StringComparison comparisonType = StringComparison.Ordinal) + { + int index = Value.IndexOf(input, start, comparisonType); + return index == -1 ? index : index + _offset; + } + + /// + /// Returns the zero-based index at which the specified character first occurs, relative to the substringe. The search starts at the specified index. + /// + /// The character to search for. + /// The index at which to begin the search. + /// + public int IndexOf(char input, int start = 0) + { + return Value.IndexOf(input, start); + } + + /// + /// Returns the zero-based index at which the specified character first occurs, relative to the parent string. The search starts at the specified index. + /// + /// The character to search for. + /// The index at which to begin the search. + /// + public int IndexOfTotal(char input, int start = 0) + { + int index = Value.IndexOf(input, start); + return index == -1 ? index : index + _offset; + } + + /// + /// Creates a substringe from the stringe, starting at the specified index and extending to the specified length. + /// + /// The offset at which to begin the substringe. + /// The length of the substringe. + /// + public Stringe Substringe(int offset, int length) + { + return new Stringe(this, offset, length); + } + + /// + /// Create a substringe from the stringe, starting at the specified index and extending to the end. + /// + /// The offset at which to begin the substringe. + /// + public Stringe Substringe(int offset) + { + return new Stringe(this, offset, Length - offset); + } + + /// + /// Returns a substringe that contains all characters between the two specified positions in the stringe. + /// + /// The left side of the slice. + /// The right side of the slice. + /// + public Stringe Slice(int a, int b) + { + if (b < a) throw new ArgumentException("'b' cannot be less tha 'a'."); + if (b < 0 || a < 0) throw new ArgumentException("Indices cannot be negative."); + if (a > _length || b > _length) throw new ArgumentException("Indices must be within stringe boundaries."); + return new Stringe(this, a, b - a); + } + + /// + /// Returns a new substringe whose left and right boundaries are offset by the specified values. + /// + /// The amount, in characters, to offset the left boundary to the left. + /// The amount, in characters, to offset the right boundary to the right. + /// + public Stringe Dilate(int left, int right) + { + int exIndex = _offset - left; + if (exIndex < 0) throw new ArgumentException("Expanded offset was negative."); + int exLength = _length + right + left; + if (exLength < 0) throw new ArgumentException("Expanded length was negative."); + if (exIndex + exLength > _stref.String.Length) throw new ArgumentException("Expanded stringe tried to extend beyond the end of the string."); + return new Stringe(this, -left, exLength); + } + + + /// + /// Returns the stringe with all leading and trailing white space characters removed. + /// + /// + public Stringe Trim() + { + if (_length == 0) return this; + int a = 0; + int b = _length; + do + { + if (Char.IsWhiteSpace(Value[a])) + { + a++; + } + else if (Char.IsWhiteSpace(Value[b - 1])) + { + b--; + } + else + { + break; + } + } while (a < b && b > 0 && a < _length); + + return Substringe(a, b - a); + } + + /// + /// Returns the stringe with any occurrences of the specified characters stripped from the ends. + /// + /// The characters to strip off the ends of the stringe. + /// + public Stringe Trim(params char[] trimChars) + { + if (_length == 0) return this; + bool useDefault = trimChars.Length == 0; + int a = 0; + int b = _length; + do + { + if (useDefault ? Char.IsWhiteSpace(Value[a]) : trimChars.Contains(Value[a])) + { + a++; + } + else if (useDefault ? Char.IsWhiteSpace(Value[b - 1]) : trimChars.Contains(Value[b - 1])) + { + b--; + } + else + { + break; + } + } while (a < b && b > 0 && a < _length); + + return Substringe(a, b - a); + } + + /// + /// Returns a copy of the stringe with the specified characters removed from the start. + /// + /// The characters to remove. + /// + public Stringe TrimStart(params char[] trimChars) + { + if (_length == 0) return this; + bool useDefault = trimChars.Length == 0; + int a = 0; + while (a < _length) + { + if (useDefault ? Char.IsWhiteSpace(Value[a]) : trimChars.Contains(Value[a])) + { + a++; + } + else + { + break; + } + } + return Substringe(a); + } + + /// + /// Returns a copy of the stringe with the specified characters removed from the end. + /// + /// The characters to remove. + /// + public Stringe TrimEnd(params char[] trimChars) + { + if (_length == 0) return this; + bool useDefault = trimChars.Length == 0; + int b = _length; + do + { + if (useDefault ? Char.IsWhiteSpace(Value[b - 1]) : trimChars.Contains(Value[b - 1])) + { + b--; + } + else + { + break; + } + } while (b > 0); + return Substringe(0, b); + } + + /// + /// Indicates whether the left side of the line on which the stringe exists is composed entirely of white space. + /// + public bool LeftPadded + { + get + { + if (_offset == 0) + { + for (int i = 0; i < _length; i++) + { + if (Char.IsWhiteSpace(_stref.String[i])) return true; + } + return false; + } + for (int i = _offset - 1; i >= 0; i--) + { + if (!Char.IsWhiteSpace(_stref.String[i])) return false; + if (_stref.String[i] == '\n') return true; + } + return true; + } + } + + /// + /// Indicates whether the line context to the right side of the stringe is composed on uninterrupted white space. + /// + public bool RightPadded + { + get + { + bool found = false; + + // The end of the stringe is at the end of the parent string. + if (_offset + _length == _stref.String.Length) + { + for (int i = _stref.String.Length - 1; i >= _offset; i--) + { + if (!Char.IsWhiteSpace(_stref.String[i])) + { + return found; + } + found = true; + } + return false; + } + + // The stringe sits in the middle of one or more lines. + for (int i = _offset + _length; i < _stref.String.Length; i++) + { + if (!Char.IsWhiteSpace(_stref.String[i])) return false; + if (_stref.String[i] == '\n') return true; + } + return true; + } + } + + /// + /// Splits the stringe into multiple parts by the specified delimiters. + /// + /// The delimiters by which to split the stringe. + /// + public IEnumerable Split(params string[] separators) + { + return Split(separators, StringSplitOptions.None); + } + + /// + /// Splits the stringe into multiple parts by the specified delimiters. + /// + /// The delimiters by which to split the stringe. + /// + public IEnumerable Split(params char[] separators) + { + return Split(separators, StringSplitOptions.None); + } + + /// + /// Splits the stringe into multiple parts by the specified delimiters. + /// + /// The delimiters by which to split the stringe. + /// Specifies whether empty substringes should be included in the return value. + /// + public IEnumerable Split(char[] separators, StringSplitOptions options) + { + int start = 0; + for (int i = 0; i < _length; i++) + { + if (!separators.Contains(Value[i])) continue; + if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); + start = i + 1; + } + if (start > _length) yield break; + if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); + } + + /// + /// Splits the stringe into multiple parts by the specified delimiters. + /// + /// The delimiters by which to split the stringe. + /// Specifies whether empty substringes should be included in the return value. + /// + public IEnumerable Split(string[] separators, StringSplitOptions options) + { + int start = 0; + for (int i = 0; i < _length; i++) + { + var hit = separators.FirstOrDefault(sep => IndexOf(sep) == i); + if (hit == null) continue; + if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); + start = i + hit.Length; + } + if (start > _length) yield break; + if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); + } + + /// + /// Splits the stringe into multiple parts by the specified delimiters. + /// + /// The delimiters by which to split the stringe. + /// The maximum number of substringes to return. If the count exceeds this number, the last item will be the remainder of the stringe. + /// Specifies whether empty substringes should be included in the return value. + /// + public IEnumerable Split(char[] separators, int count, StringSplitOptions options = StringSplitOptions.None) + { + if (count == 0) yield break; + if (count == 1) + { + yield return this; + yield break; + } + + int matches = 0; + int start = 0; + + for (int i = 0; i < _length; i++) + { + if (separators.Contains(Value[i])) + { + if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); + start = i + 1; + matches++; + } + if (matches < count - 1) continue; + if (start > _length) yield break; + yield return Substringe(start, _length - start); + yield break; + } + if (start > _length || matches >= count) yield break; + if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); + } + + /// + /// Splits the stringe into multiple parts by the specified delimiters. + /// + /// The delimiters by which to split the stringe. + /// The maximum number of substringes to return. If the count exceeds this number, the last item will be the remainder of the stringe. + /// Specifies whether empty substringes should be included in the return value. + /// + public IEnumerable Split(string[] separators, int count, StringSplitOptions options = StringSplitOptions.None) + { + if (count == 0) yield break; + if (count == 1) + { + yield return this; + yield break; + } + + int matches = 0; + int start = 0; + + for (int i = 0; i < _length; i++) + { + var hit = separators.FirstOrDefault(sep => IndexOf(sep, i) == i); + if (hit != null) + { + if (options == StringSplitOptions.None || i - start > 0) yield return Substringe(start, i - start); + start = i + hit.Length; + matches++; + } + if (matches < count - 1) continue; + if (start > _length) yield break; + yield return Substringe(start, _length - start); + yield break; + } + if (start > _length || matches >= count) yield break; + if (options == StringSplitOptions.None || _length - start > 0) yield return Substringe(start, _length - start); + } + + /// + /// Converts a Stringe to its string value. + /// + /// The stringe to convert. + public static explicit operator string(Stringe stringe) => stringe.Value; + + /// + /// Converts a string to a Stringe. + /// + /// The string to convert. + public static implicit operator Stringe(string value) => new Stringe(value); + + /// + /// Determines whether two stringes are equal. + /// + /// The first stringe. + /// The second stringe. + /// + public static bool operator ==(Stringe a, Stringe b) + { + if (Equals(a, null) && Equals(b, null)) return true; + if (Equals(a, null) || Equals(b, null)) return false; + return a._stref == b._stref && a.Value == b.Value; + } + + /// + /// Determines whether two stringes are not equal. + /// + /// The first stringe. + /// The second stringe. + /// + public static bool operator !=(Stringe a, Stringe b) + { + if (Equals(a, null) && Equals(b, null)) return false; + if (Equals(a, null) || Equals(b, null)) return true; + return a._stref != b._stref || a.Value != b.Value; + } + + /// + /// Determines whether the current stringe is equal to the specified object. + /// + /// The object to compare with. + /// + public override bool Equals(object obj) + { + var stre = obj as Stringe; + if (stre == null) return false; + return this == stre; + } + + /// + /// Returns the hash of the current stringe. + /// + /// + public override int GetHashCode() => StringeUtils.HashOf(_stref.String, _offset, _length); + + /// + /// Returns the string value of the stringe. + /// + /// + public override string ToString() => Value; + + /// + /// Stores cached character data for a Stringe. + /// + private class Stref + { + public readonly string String; + public readonly Chare[] Chares; + public readonly bool[] Bases; + + public Stref(Stringe stringe, string str) + { + String = str; + Chares = new Chare[str.Length]; + Bases = new bool[str.Length]; + if (str.Length == 0) { return; } - var elems = StringInfo.GetTextElementEnumerator(str); - while (elems.MoveNext()) - { - Bases[elems.ElementIndex] = true; - } - var length = str.Length; - int line = 1; - int col = 1; - for (int i = 0; i < length; i++) - { - if (str[i] == '\n') - { - line++; - col = 1; - } - else if (Bases[i]) // Advance column only for non-combining characters - { - col++; - } - Chares[i] = new Chare(stringe, str[i], i, line, col); - } - } - } - - private IEnumerable _Chares() - { - for (int i = 0; i < _length; i++) - { - yield return this[i]; - } - } - - /// - /// Returns an enumerator that iterates through the characteres in the stringe. - /// - /// - public IEnumerator GetEnumerator() - { - return _Chares().GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } + var elems = StringInfo.GetTextElementEnumerator(str); + while (elems.MoveNext()) + { + Bases[elems.ElementIndex] = true; + } + var length = str.Length; + int line = 1; + int col = 1; + for (int i = 0; i < length; i++) + { + if (str[i] == '\n') + { + line++; + col = 1; + } + else if (Bases[i]) // Advance column only for non-combining characters + { + col++; + } + Chares[i] = new Chare(stringe, str[i], i, line, col); + } + } + } + + private IEnumerable _Chares() + { + for (int i = 0; i < _length; i++) + { + yield return this[i]; + } + } + + /// + /// Returns an enumerator that iterates through the characteres in the stringe. + /// + /// + public IEnumerator GetEnumerator() + { + return _Chares().GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } } diff --git a/Rant/Core/Stringes/StringeReader.cs b/Rant/Core/Stringes/StringeReader.cs index 216add2..9d311f9 100644 --- a/Rant/Core/Stringes/StringeReader.cs +++ b/Rant/Core/Stringes/StringeReader.cs @@ -8,511 +8,511 @@ namespace Rant.Core.Stringes /// Represents a reader that can read data from a stringe. /// internal sealed class StringeReader - { - private readonly Stringe _stringe; - private int _pos; - - /// - /// Gets or sets a string describing where the stringe originated from. Used for exception messages. - /// - public string Origin { get; set; } = String.Empty; - - /// - /// The stringe being read by the current instance. - /// - public Stringe Stringe => _stringe; - - /// - /// Creates a new StringeReader instance using the specified string as input. - /// - /// The string to use as input. This will be converted to a root-level stringe. - public StringeReader(string value) - { - _stringe = value.ToStringe(); - _pos = 0; - } - - /// - /// Creates a new StringeReader instance using the specified stringe as input. - /// - /// The stringe to use as input. - public StringeReader(Stringe value) - { - _stringe = value; - _pos = 0; - } - - /// - /// Indicates whether the reader position is at the end of the input string. - /// - public bool EndOfStringe => _pos >= _stringe.Length; - - /// - /// Reads a charactere from the input and advances the position by one. - /// - /// - public Chare ReadChare() - { - return _stringe[_pos++]; - } - - /// - /// Returns the next charactere in the input, but does not consume it. - /// - /// - public Chare PeekChare() - { - return EndOfStringe ? null : _stringe[_pos]; - } - - /// - /// Returns the next character in the input, but does not consume it. Returns -1 if no more characters can be read. - /// - /// - public int PeekChar() - { - return EndOfStringe ? -1 : _stringe[_pos].Character; - } - - /// - /// Reads a stringe from the input and advances the position by the number of characters read. - /// - /// The number of characters to read. - /// - public Stringe ReadStringe(int length) - { - int p = _pos; - _pos += length; - return _stringe.Substringe(p, length); - } - - /// - /// Reads a stringe from the current position to the next occurrence of the specified character. If no match is found, it reads to the end. - /// - /// The character to stop at. - /// - public Stringe ReadUntil(char value) - { - int start = _pos; - while (_pos < _stringe.Length && _stringe[_pos] != value) _pos++; - return _stringe.Substringe(start, _pos - start); - } - - /// - /// Reads a stringe from the current position to the next occurrence of any of the specified characters. If no match is found, it reads to the end. - /// - /// The characters to stop at. - /// - public Stringe ReadUntilAny(params char[] values) - { - int start = _pos; - while (_pos < _stringe.Length && !values.Any(c => _stringe[_pos] == c)) _pos++; - return _stringe.Substringe(start, _pos - start); - } - - /// - /// Indicates whether the specified character occurs at the reader's current position, and consumes it. - /// - /// The character to test for. - /// - public bool Eat(char value) - { - if (EndOfStringe || PeekChare() != value) return false; - _pos++; - return true; - } - - public bool EatExactlyWhere(Func predicate, int count) - { - if (EndOfStringe || !predicate(PeekChare().Character)) return false; - int oldPos = _pos; - int n = 0; - do - { - _pos++; - n++; - } while (!EndOfStringe && predicate(PeekChare().Character) && n < count); - if (n < count) - { - _pos = oldPos; - return false; - } - return true; - } - - public bool EatAll(char value) - { - if (PeekChare() != value) return false; - do - { - _pos++; - } while (PeekChare() == value); - return true; - } - - public bool EatAny(params char[] values) - { - if (!EndOfStringe && values.Any(c => _stringe[_pos].Character == c)) - { - _pos++; - return true; - } - return false; - } - - public bool EatAll(params char[] values) - { - if (EndOfStringe) return false; - if (!values.Any(c => _stringe[_pos].Character == c)) return false; - do - { - _pos++; - } while (values.Any(c => _stringe[_pos].Character == c)); - return true; - } - - public bool EatWhile(Func predicate) - { - if (EndOfStringe || !predicate(PeekChare().Character)) return false; - do - { - _pos++; - } while (!EndOfStringe && predicate(PeekChare().Character)); - return true; - } - - public bool EatWhile(Func predicate) - { - if (EndOfStringe || !predicate(PeekChare())) return false; - do - { - _pos++; - } while (!EndOfStringe && predicate(PeekChare())); - return true; - } - - /// - /// Indicates whether the specified string occurs at the reader's current position, and consumes it. - /// - /// The string to test for. - /// - public bool Eat(string value) - { - if (String.IsNullOrEmpty(value)) return false; - if (_stringe.IndexOf(value, _pos) != _pos) return false; - _pos += value.Length; - return true; - } - - - public bool EatAll(string value) - { - if (String.IsNullOrEmpty(value)) return false; - if (_stringe.IndexOf(value, _pos) != _pos) return false; - do - { - _pos += value.Length; - } while (_stringe.IndexOf(value, _pos) == _pos); - return true; - } - - /// - /// Indicates whether the specified regular expression matches the input at the reader's current position. If a match is found, the reader consumes it. - /// - /// The regular expression to test for. - /// - public bool Eat(Regex regex) - { - if (regex == null) throw new ArgumentNullException("regex"); - var match = regex.Match(_stringe.Value, _pos); - if (!match.Success || match.Index != _pos) return false; - _pos += match.Length; - return true; - } - - /// - /// Indicates whether the specified regular expression matches the input at the reader's current position. If a match is found, the reader consumes it and outputs the result. - /// - /// The regular expression to test for. - /// The stringe to output the result to. - /// - public bool Eat(Regex regex, out Stringe result) - { - if (regex == null) throw new ArgumentNullException("regex"); - result = null; - var match = regex.Match(_stringe.Value, _pos); - if (!match.Success || match.Index != _pos) return false; - result = _stringe.Substringe(_pos, match.Length); - _pos += match.Length; - return true; - } - - /// - /// Indicates whether the specified character occurs at the reader's current position. - /// - /// The character to test for. - /// - public bool IsNext(char value) - { - return PeekChare() == value; - } - - /// - /// Indicates whether any of the specified characters occur at the reader's current position. - /// - /// - /// - public bool IsNext(params char[] chars) => !EndOfStringe && chars.Any(c => _stringe[_pos].Character == c); - - /// - /// Indicates whether the specified string occurs at the reader's current position. - /// - /// The string to test for. - /// The string comparison type to use in the test. - /// - public bool IsNext(string value, StringComparison strcmp = StringComparison.InvariantCulture) - { - if (String.IsNullOrEmpty(value)) return false; - return _pos + value.Length <= _stringe.Length - && String.Equals(_stringe.Substringe(_pos, value.Length).Value, value, strcmp); - } - - /// - /// Indicates whether the specified regular expression matches the input at the reader's current position. - /// - /// The regular expression to test for. - /// - public bool IsNext(Regex regex) - { - if (regex == null) throw new ArgumentNullException("regex"); - var match = regex.Match(_stringe.Value, _pos); - return match.Success && match.Index == _pos; - } - - /// - /// Indicates whether the specified regular expression matches the input at the reader's current position, and outputs the result. - /// - /// The regular expression to test for. - /// The stringe to output the result to. - /// - public bool IsNext(Regex regex, out Stringe result) - { - if (regex == null) throw new ArgumentNullException("regex"); - result = null; - var match = regex.Match(_stringe.Value, _pos); - if (!match.Success || match.Index != _pos) return false; - result = _stringe.Substringe(_pos, match.Length); - return true; - } - - /// - /// Advances the reader position past any immediate white space characters. - /// - - public bool SkipWhiteSpace() - { - int oldPos = _pos; - while (!EndOfStringe && Char.IsWhiteSpace(_stringe.Value[_pos])) - { - _pos++; - } - return _pos > oldPos; - } - - /// - /// Returns a boolean value indicating whether the previous character matches the specified character. - /// - /// The character to test for. - /// - public bool WasLast(char c) => _pos > 0 && _stringe[_pos - 1].Character == c; - - /// - /// Returns a boolean value indicating whether the previous character matches any of the specified characters. - /// - /// The characters to test for. - /// - public bool WasLast(params char[] chars) => _pos > 0 && chars.Any(c => _stringe[_pos - 1].Character == c); - - /// - /// Reads the next token from the current position, then advances the position past it. - /// - /// The token identifier type to use. - /// The lexer to use. - /// - - public Token ReadToken(Lexer rules) where T : struct - { - readStart: - - if (EndOfStringe) - { - if (rules.EndToken != null && !rules.IgnoreRules.Contains(rules.EndToken.Item2)) - { - return new Token(rules.EndToken.Item2, rules.EndToken.Item1); - } - - throw new InvalidOperationException("Unexpected end of input."); - } - - // Indicates if undefined tokens should be created - bool captureUndef = rules.UndefinedCaptureRule != null; - - // Tracks the beginning of the undefined token content - int u = _pos; - - do - { - // If we've reached the end, return undefined token, if present. - if (EndOfStringe && captureUndef && u < _pos) - { - if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; - return new Token(rules.UndefinedCaptureRule.Item2, rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); - } - - if (rules.HasPunctuation(PeekChar())) - { - // Check high priority symbol rules - foreach (var t in rules.HighSymbols.Where(t => IsNext(t.Item1, t.Item3))) - { - // Return undefined token if present - if (captureUndef && u < _pos) - { - if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; - return new Token(rules.UndefinedCaptureRule.Item2, - rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); - } - - // Return symbol token - var c = _stringe.Substringe(_pos, t.Item1.Length); - _pos += t.Item1.Length; - if (rules.IgnoreRules.Contains(t.Item2)) goto readStart; - return new Token(t.Item2, c); - } - } - - const string tokenGroupName = "value"; - - // Check regex rules - if (rules.RegexList.Any()) - { - Match longestMatch = null; - var id = default(T); - - // Find the longest match, if any. - foreach (var re in rules.RegexList) - { - var match = re.Item1.Match(_stringe.Value, _pos); - if (match.Success && match.Index == _pos && (longestMatch == null || match.Length > longestMatch.Length)) - { - longestMatch = match; - id = re.Item2.GetValue(match); - } - } - - // If there was a match, generate a token. - if (longestMatch != null) - { - // Return undefined token if present - if (captureUndef && u < _pos) - { - if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; - return new Token(rules.UndefinedCaptureRule.Item2, rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); - } - - // Return longest match, narrow down to group if available. - var group = longestMatch.Groups[tokenGroupName]; - _pos += longestMatch.Length; - - if (group.Success) - { - if (rules.IgnoreRules.Contains(id)) goto readStart; - return new Token(id, _stringe.Substringe(group.Index, group.Length)); - } - - if (rules.IgnoreRules.Contains(id)) goto readStart; - return new Token(id, _stringe.Substringe(longestMatch.Index, longestMatch.Length)); - } - } - - if (rules.FunctionList.Any()) - { - int origPos = _pos; - - foreach (var fn in rules.FunctionList) - { - if (fn.Item1(this)) - { - // Return undefined token if present - if (captureUndef && u < origPos) - { - _pos = origPos; - if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; - return new Token(rules.UndefinedCaptureRule.Item2, - rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, origPos))); - } - - if (rules.IgnoreRules.Contains(fn.Item2)) goto readStart; - return new Token(fn.Item2, _stringe.Slice(origPos, _pos)); - } - - // Reset for next function - _pos = origPos; - } - } - - if (rules.HasPunctuation(PeekChar())) - { - // Check normal priority symbol rules - foreach (var t in rules.NormalSymbols.Where(t => IsNext(t.Item1, t.Item3))) - { - // Return undefined token if present - if (captureUndef && u < _pos) - { - if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; - return new Token(rules.UndefinedCaptureRule.Item2, - rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); - } - - // Return symbol token - var c = _stringe.Substringe(_pos, t.Item1.Length); - _pos += t.Item1.Length; - if (rules.IgnoreRules.Contains(t.Item2)) goto readStart; - return new Token(t.Item2, c); - } - } - - _pos++; - - if(!captureUndef) - { - var bad = _stringe.Slice(u, _pos); - throw new InvalidOperationException(String.Concat("(Ln ", bad.Line, ", Col ", bad.Column, ") Invalid token '", bad, "'")); - } - - } while (captureUndef); - - throw new InvalidOperationException("This should never happen."); - } - - /// - /// The current zero-based position of the reader. - /// - public int Position - { - get { return _pos; } - set - { - if (value < 0 || value > _stringe.Length) - { - throw new ArgumentOutOfRangeException("value"); - } - _pos = value; - } - } - - /// - /// The total length, in characters, of the stringe being read. - /// - public int Length => _stringe.Length; - } + { + private readonly Stringe _stringe; + private int _pos; + + /// + /// Gets or sets a string describing where the stringe originated from. Used for exception messages. + /// + public string Origin { get; set; } = String.Empty; + + /// + /// The stringe being read by the current instance. + /// + public Stringe Stringe => _stringe; + + /// + /// Creates a new StringeReader instance using the specified string as input. + /// + /// The string to use as input. This will be converted to a root-level stringe. + public StringeReader(string value) + { + _stringe = value.ToStringe(); + _pos = 0; + } + + /// + /// Creates a new StringeReader instance using the specified stringe as input. + /// + /// The stringe to use as input. + public StringeReader(Stringe value) + { + _stringe = value; + _pos = 0; + } + + /// + /// Indicates whether the reader position is at the end of the input string. + /// + public bool EndOfStringe => _pos >= _stringe.Length; + + /// + /// Reads a charactere from the input and advances the position by one. + /// + /// + public Chare ReadChare() + { + return _stringe[_pos++]; + } + + /// + /// Returns the next charactere in the input, but does not consume it. + /// + /// + public Chare PeekChare() + { + return EndOfStringe ? null : _stringe[_pos]; + } + + /// + /// Returns the next character in the input, but does not consume it. Returns -1 if no more characters can be read. + /// + /// + public int PeekChar() + { + return EndOfStringe ? -1 : _stringe[_pos].Character; + } + + /// + /// Reads a stringe from the input and advances the position by the number of characters read. + /// + /// The number of characters to read. + /// + public Stringe ReadStringe(int length) + { + int p = _pos; + _pos += length; + return _stringe.Substringe(p, length); + } + + /// + /// Reads a stringe from the current position to the next occurrence of the specified character. If no match is found, it reads to the end. + /// + /// The character to stop at. + /// + public Stringe ReadUntil(char value) + { + int start = _pos; + while (_pos < _stringe.Length && _stringe[_pos] != value) _pos++; + return _stringe.Substringe(start, _pos - start); + } + + /// + /// Reads a stringe from the current position to the next occurrence of any of the specified characters. If no match is found, it reads to the end. + /// + /// The characters to stop at. + /// + public Stringe ReadUntilAny(params char[] values) + { + int start = _pos; + while (_pos < _stringe.Length && !values.Any(c => _stringe[_pos] == c)) _pos++; + return _stringe.Substringe(start, _pos - start); + } + + /// + /// Indicates whether the specified character occurs at the reader's current position, and consumes it. + /// + /// The character to test for. + /// + public bool Eat(char value) + { + if (EndOfStringe || PeekChare() != value) return false; + _pos++; + return true; + } + + public bool EatExactlyWhere(Func predicate, int count) + { + if (EndOfStringe || !predicate(PeekChare().Character)) return false; + int oldPos = _pos; + int n = 0; + do + { + _pos++; + n++; + } while (!EndOfStringe && predicate(PeekChare().Character) && n < count); + if (n < count) + { + _pos = oldPos; + return false; + } + return true; + } + + public bool EatAll(char value) + { + if (PeekChare() != value) return false; + do + { + _pos++; + } while (PeekChare() == value); + return true; + } + + public bool EatAny(params char[] values) + { + if (!EndOfStringe && values.Any(c => _stringe[_pos].Character == c)) + { + _pos++; + return true; + } + return false; + } + + public bool EatAll(params char[] values) + { + if (EndOfStringe) return false; + if (!values.Any(c => _stringe[_pos].Character == c)) return false; + do + { + _pos++; + } while (values.Any(c => _stringe[_pos].Character == c)); + return true; + } + + public bool EatWhile(Func predicate) + { + if (EndOfStringe || !predicate(PeekChare().Character)) return false; + do + { + _pos++; + } while (!EndOfStringe && predicate(PeekChare().Character)); + return true; + } + + public bool EatWhile(Func predicate) + { + if (EndOfStringe || !predicate(PeekChare())) return false; + do + { + _pos++; + } while (!EndOfStringe && predicate(PeekChare())); + return true; + } + + /// + /// Indicates whether the specified string occurs at the reader's current position, and consumes it. + /// + /// The string to test for. + /// + public bool Eat(string value) + { + if (String.IsNullOrEmpty(value)) return false; + if (_stringe.IndexOf(value, _pos) != _pos) return false; + _pos += value.Length; + return true; + } + + + public bool EatAll(string value) + { + if (String.IsNullOrEmpty(value)) return false; + if (_stringe.IndexOf(value, _pos) != _pos) return false; + do + { + _pos += value.Length; + } while (_stringe.IndexOf(value, _pos) == _pos); + return true; + } + + /// + /// Indicates whether the specified regular expression matches the input at the reader's current position. If a match is found, the reader consumes it. + /// + /// The regular expression to test for. + /// + public bool Eat(Regex regex) + { + if (regex == null) throw new ArgumentNullException("regex"); + var match = regex.Match(_stringe.Value, _pos); + if (!match.Success || match.Index != _pos) return false; + _pos += match.Length; + return true; + } + + /// + /// Indicates whether the specified regular expression matches the input at the reader's current position. If a match is found, the reader consumes it and outputs the result. + /// + /// The regular expression to test for. + /// The stringe to output the result to. + /// + public bool Eat(Regex regex, out Stringe result) + { + if (regex == null) throw new ArgumentNullException("regex"); + result = null; + var match = regex.Match(_stringe.Value, _pos); + if (!match.Success || match.Index != _pos) return false; + result = _stringe.Substringe(_pos, match.Length); + _pos += match.Length; + return true; + } + + /// + /// Indicates whether the specified character occurs at the reader's current position. + /// + /// The character to test for. + /// + public bool IsNext(char value) + { + return PeekChare() == value; + } + + /// + /// Indicates whether any of the specified characters occur at the reader's current position. + /// + /// + /// + public bool IsNext(params char[] chars) => !EndOfStringe && chars.Any(c => _stringe[_pos].Character == c); + + /// + /// Indicates whether the specified string occurs at the reader's current position. + /// + /// The string to test for. + /// The string comparison type to use in the test. + /// + public bool IsNext(string value, StringComparison strcmp = StringComparison.InvariantCulture) + { + if (String.IsNullOrEmpty(value)) return false; + return _pos + value.Length <= _stringe.Length + && String.Equals(_stringe.Substringe(_pos, value.Length).Value, value, strcmp); + } + + /// + /// Indicates whether the specified regular expression matches the input at the reader's current position. + /// + /// The regular expression to test for. + /// + public bool IsNext(Regex regex) + { + if (regex == null) throw new ArgumentNullException("regex"); + var match = regex.Match(_stringe.Value, _pos); + return match.Success && match.Index == _pos; + } + + /// + /// Indicates whether the specified regular expression matches the input at the reader's current position, and outputs the result. + /// + /// The regular expression to test for. + /// The stringe to output the result to. + /// + public bool IsNext(Regex regex, out Stringe result) + { + if (regex == null) throw new ArgumentNullException("regex"); + result = null; + var match = regex.Match(_stringe.Value, _pos); + if (!match.Success || match.Index != _pos) return false; + result = _stringe.Substringe(_pos, match.Length); + return true; + } + + /// + /// Advances the reader position past any immediate white space characters. + /// + + public bool SkipWhiteSpace() + { + int oldPos = _pos; + while (!EndOfStringe && Char.IsWhiteSpace(_stringe.Value[_pos])) + { + _pos++; + } + return _pos > oldPos; + } + + /// + /// Returns a boolean value indicating whether the previous character matches the specified character. + /// + /// The character to test for. + /// + public bool WasLast(char c) => _pos > 0 && _stringe[_pos - 1].Character == c; + + /// + /// Returns a boolean value indicating whether the previous character matches any of the specified characters. + /// + /// The characters to test for. + /// + public bool WasLast(params char[] chars) => _pos > 0 && chars.Any(c => _stringe[_pos - 1].Character == c); + + /// + /// Reads the next token from the current position, then advances the position past it. + /// + /// The token identifier type to use. + /// The lexer to use. + /// + + public Token ReadToken(Lexer rules) where T : struct + { + readStart: + + if (EndOfStringe) + { + if (rules.EndToken != null && !rules.IgnoreRules.Contains(rules.EndToken.Item2)) + { + return new Token(rules.EndToken.Item2, rules.EndToken.Item1); + } + + throw new InvalidOperationException("Unexpected end of input."); + } + + // Indicates if undefined tokens should be created + bool captureUndef = rules.UndefinedCaptureRule != null; + + // Tracks the beginning of the undefined token content + int u = _pos; + + do + { + // If we've reached the end, return undefined token, if present. + if (EndOfStringe && captureUndef && u < _pos) + { + if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; + return new Token(rules.UndefinedCaptureRule.Item2, rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); + } + + if (rules.HasPunctuation(PeekChar())) + { + // Check high priority symbol rules + foreach (var t in rules.HighSymbols.Where(t => IsNext(t.Item1, t.Item3))) + { + // Return undefined token if present + if (captureUndef && u < _pos) + { + if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; + return new Token(rules.UndefinedCaptureRule.Item2, + rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); + } + + // Return symbol token + var c = _stringe.Substringe(_pos, t.Item1.Length); + _pos += t.Item1.Length; + if (rules.IgnoreRules.Contains(t.Item2)) goto readStart; + return new Token(t.Item2, c); + } + } + + const string tokenGroupName = "value"; + + // Check regex rules + if (rules.RegexList.Any()) + { + Match longestMatch = null; + var id = default(T); + + // Find the longest match, if any. + foreach (var re in rules.RegexList) + { + var match = re.Item1.Match(_stringe.Value, _pos); + if (match.Success && match.Index == _pos && (longestMatch == null || match.Length > longestMatch.Length)) + { + longestMatch = match; + id = re.Item2.GetValue(match); + } + } + + // If there was a match, generate a token. + if (longestMatch != null) + { + // Return undefined token if present + if (captureUndef && u < _pos) + { + if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; + return new Token(rules.UndefinedCaptureRule.Item2, rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); + } + + // Return longest match, narrow down to group if available. + var group = longestMatch.Groups[tokenGroupName]; + _pos += longestMatch.Length; + + if (group.Success) + { + if (rules.IgnoreRules.Contains(id)) goto readStart; + return new Token(id, _stringe.Substringe(group.Index, group.Length)); + } + + if (rules.IgnoreRules.Contains(id)) goto readStart; + return new Token(id, _stringe.Substringe(longestMatch.Index, longestMatch.Length)); + } + } + + if (rules.FunctionList.Any()) + { + int origPos = _pos; + + foreach (var fn in rules.FunctionList) + { + if (fn.Item1(this)) + { + // Return undefined token if present + if (captureUndef && u < origPos) + { + _pos = origPos; + if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; + return new Token(rules.UndefinedCaptureRule.Item2, + rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, origPos))); + } + + if (rules.IgnoreRules.Contains(fn.Item2)) goto readStart; + return new Token(fn.Item2, _stringe.Slice(origPos, _pos)); + } + + // Reset for next function + _pos = origPos; + } + } + + if (rules.HasPunctuation(PeekChar())) + { + // Check normal priority symbol rules + foreach (var t in rules.NormalSymbols.Where(t => IsNext(t.Item1, t.Item3))) + { + // Return undefined token if present + if (captureUndef && u < _pos) + { + if (rules.IgnoreRules.Contains(rules.UndefinedCaptureRule.Item2)) goto readStart; + return new Token(rules.UndefinedCaptureRule.Item2, + rules.UndefinedCaptureRule.Item1(_stringe.Slice(u, _pos))); + } + + // Return symbol token + var c = _stringe.Substringe(_pos, t.Item1.Length); + _pos += t.Item1.Length; + if (rules.IgnoreRules.Contains(t.Item2)) goto readStart; + return new Token(t.Item2, c); + } + } + + _pos++; + + if (!captureUndef) + { + var bad = _stringe.Slice(u, _pos); + throw new InvalidOperationException(String.Concat("(Ln ", bad.Line, ", Col ", bad.Column, ") Invalid token '", bad, "'")); + } + + } while (captureUndef); + + throw new InvalidOperationException("This should never happen."); + } + + /// + /// The current zero-based position of the reader. + /// + public int Position + { + get { return _pos; } + set + { + if (value < 0 || value > _stringe.Length) + { + throw new ArgumentOutOfRangeException("value"); + } + _pos = value; + } + } + + /// + /// The total length, in characters, of the stringe being read. + /// + public int Length => _stringe.Length; + } } \ No newline at end of file diff --git a/Rant/Core/Stringes/StringeUtils.cs b/Rant/Core/Stringes/StringeUtils.cs index 8ba2240..237dec5 100644 --- a/Rant/Core/Stringes/StringeUtils.cs +++ b/Rant/Core/Stringes/StringeUtils.cs @@ -3,27 +3,27 @@ namespace Rant.Core.Stringes { - internal static class StringeUtils - { - public static int HashOf(params object[] objects) - { - return unchecked(objects.Select(o => o.GetHashCode()).Aggregate(17, (hash, next) => hash * 31 + next)); - } + internal static class StringeUtils + { + public static int HashOf(params object[] objects) + { + return unchecked(objects.Select(o => o.GetHashCode()).Aggregate(17, (hash, next) => hash * 31 + next)); + } - public static int GetMatchCount(string parent, string sub) - { - if (parent == null || sub == null) return 0; - if (parent.Length * sub.Length == 0) return 0; - int next = 0; - int start = 0; - int count = 0; - while (start + sub.Length < parent.Length) - { - if ((next = parent.IndexOf(sub, start, StringComparison.InvariantCulture)) == -1) return count; - start = next + sub.Length; - count++; - } - return count; - } - } + public static int GetMatchCount(string parent, string sub) + { + if (parent == null || sub == null) return 0; + if (parent.Length * sub.Length == 0) return 0; + int next = 0; + int start = 0; + int count = 0; + while (start + sub.Length < parent.Length) + { + if ((next = parent.IndexOf(sub, start, StringComparison.InvariantCulture)) == -1) return count; + start = next + sub.Length; + count++; + } + return count; + } + } } \ No newline at end of file diff --git a/Rant/Core/Stringes/Token.cs b/Rant/Core/Stringes/Token.cs index dc15c20..790abec 100644 --- a/Rant/Core/Stringes/Token.cs +++ b/Rant/Core/Stringes/Token.cs @@ -2,33 +2,33 @@ namespace Rant.Core.Stringes { - /// - /// Represents a token with a string value and a custom identifier. - /// - /// The identifier type. - internal sealed class Token : Stringe where T : struct - { - private readonly T _id; + /// + /// Represents a token with a string value and a custom identifier. + /// + /// The identifier type. + internal sealed class Token : Stringe where T : struct + { + private readonly T _id; - /// - /// The token identifier. - /// - public T ID => _id; + /// + /// The token identifier. + /// + public T ID => _id; - public Token(T id, string value) : base(value) - { - _id = id; - } + public Token(T id, string value) : base(value) + { + _id = id; + } - public Token(T id, Stringe value) : base(value) - { - _id = id; - } + public Token(T id, Stringe value) : base(value) + { + _id = id; + } /// /// Returns a string representation of the current token. /// /// - public override string ToString() => $"{_id}, L{Line}, C{Column}{(String.IsNullOrEmpty(Value) ? "" : $", {Value} ")}"; - } + public override string ToString() => $"{_id}, L{Line}, C{Column}{(String.IsNullOrEmpty(Value) ? "" : $", {Value} ")}"; + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Extensions.cs b/Rant/Core/Utilities/Extensions.cs index e5bd959..9bd45c4 100644 --- a/Rant/Core/Utilities/Extensions.cs +++ b/Rant/Core/Utilities/Extensions.cs @@ -2,40 +2,40 @@ namespace Rant.Core.Utilities { - internal static class Extensions - { - public static ulong RotL(this ulong data, int times) - { - return (data << (times % 64)) | (data >> (64 - (times % 64))); - } - + internal static class Extensions + { + public static ulong RotL(this ulong data, int times) + { + return (data << (times % 64)) | (data >> (64 - (times % 64))); + } + public static ulong RotR(this ulong data, int times) - { - return (data >> (times % 64)) | (data << (64 - (times % 64))); - } - - public static long Hash(this string input) - { - unchecked - { - long seed = 13; - foreach (char c in input) - { - seed += c * 19; - seed *= 6364136223846793005; - } - return seed; - } - } + { + return (data >> (times % 64)) | (data << (64 - (times % 64))); + } + + public static long Hash(this string input) + { + unchecked + { + long seed = 13; + foreach (char c in input) + { + seed += c * 19; + seed *= 6364136223846793005; + } + return seed; + } + } - public static void AddRange(this HashSet hashset, params T[] items) - { - foreach (var item in items) hashset.Add(item); - } + public static void AddRange(this HashSet hashset, params T[] items) + { + foreach (var item in items) hashset.Add(item); + } - public static void AddRange(this HashSet hashset, IEnumerable items) - { - foreach (var item in items) hashset.Add(item); - } - } + public static void AddRange(this HashSet hashset, IEnumerable items) + { + foreach (var item in items) hashset.Add(item); + } + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Limit.cs b/Rant/Core/Utilities/Limit.cs index a936d69..fd845c0 100644 --- a/Rant/Core/Utilities/Limit.cs +++ b/Rant/Core/Utilities/Limit.cs @@ -1,21 +1,21 @@ namespace Rant.Core.Utilities { - internal sealed class Limit - { - private readonly int _max; - private int _value; + internal sealed class Limit + { + private readonly int _max; + private int _value; - public int Maximum => _max; + public int Maximum => _max; - public Limit(int max) - { - _max = max; - _value = 0; - } + public Limit(int max) + { + _max = max; + _value = 0; + } - public bool Accumulate(int value) - { - return _max > 0 && (_value += value) > _max; - } - } + public bool Accumulate(int value) + { + return _max > 0 && (_value += value) > _max; + } + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index e48c696..639393e 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -13,29 +13,29 @@ internal static class Util { private static readonly Dictionary> _enumTable = new Dictionary>(); - public static bool IsUppercase(string sample) - { - // All-caps? - if (!sample.Where(Char.IsLetter).All(Char.IsUpper)) return false; + public static bool IsUppercase(string sample) + { + // All-caps? + if (!sample.Where(Char.IsLetter).All(Char.IsUpper)) return false; - int longest = 0; - int curLength = 0; - for (int i = 0; i < sample.Length; i++) - { - if (Char.IsUpper(sample[i])) - { - if (++curLength > longest) longest++; - } - else - { - curLength = 0; - } - } + int longest = 0; + int curLength = 0; + for (int i = 0; i < sample.Length; i++) + { + if (Char.IsUpper(sample[i])) + { + if (++curLength > longest) longest++; + } + else + { + curLength = 0; + } + } - return longest > 1; - } + return longest > 1; + } - private static void CacheEnum(Type type) + private static void CacheEnum(Type type) { if (!type.IsEnum || _enumTable.ContainsKey(type)) return; _enumTable[type] = new HashSet(Enum.GetNames(type)); @@ -47,7 +47,7 @@ public static bool TryParseEnum(Type enumType, string modeString, out object val if (!enumType.IsEnum) throw new ArgumentException("TEnum must be an enumerated type."); CacheEnum(enumType); var name = SnakeToCamel(modeString.Trim()); - var cache = _enumTable[enumType]; + var cache = _enumTable[enumType]; if (!cache.Contains(name)) return false; value = Enum.Parse(enumType, name, true); return true; @@ -201,26 +201,26 @@ public static string SnakeToCamel(string name) return sb.ToString(); } - public static string CamelToSnake(string camelName) - { - var name = camelName.Trim(); - if (Util.IsNullOrWhiteSpace(name)) return name; - if (name.Length == 1) return name.ToLower(); - var sb = new StringBuilder(); - bool a, b; - bool last = false; - for (int i = 0; i < name.Length - 1; i++) - { - a = Char.IsUpper(name[i]); - b = Char.IsUpper(name[i + 1]); - if ((last && a && !b)) sb.Append('-'); - sb.Append(Char.ToLower(name[i])); - if (!a && b) sb.Append('-'); - last = a; - } - sb.Append(Char.ToLower(name[name.Length - 1])); - return sb.ToString(); - } + public static string CamelToSnake(string camelName) + { + var name = camelName.Trim(); + if (Util.IsNullOrWhiteSpace(name)) return name; + if (name.Length == 1) return name.ToLower(); + var sb = new StringBuilder(); + bool a, b; + bool last = false; + for (int i = 0; i < name.Length - 1; i++) + { + a = Char.IsUpper(name[i]); + b = Char.IsUpper(name[i + 1]); + if ((last && a && !b)) sb.Append('-'); + sb.Append(Char.ToLower(name[i])); + if (!a && b) sb.Append('-'); + last = a; + } + sb.Append(Char.ToLower(name[name.Length - 1])); + return sb.ToString(); + } public static Regex ParseRegex(string regexLiteral) { @@ -230,8 +230,8 @@ public static Regex ParseRegex(string regexLiteral) var literal = regexLiteral.TrimEnd('i'); if (!literal.StartsWith("`") || !literal.EndsWith("`")) throw new FormatException("Regex literal was not in the correct format."); - - return new Regex(literal.Substring(1, literal.Length - 2), + + return new Regex(literal.Substring(1, literal.Length - 2), (noCase ? RegexOptions.IgnoreCase : RegexOptions.None) | RegexOptions.ExplicitCapture | RegexOptions.Compiled); } diff --git a/Rant/Core/Utilities/Witchcraft.cs b/Rant/Core/Utilities/Witchcraft.cs index c20bf83..7ba552a 100644 --- a/Rant/Core/Utilities/Witchcraft.cs +++ b/Rant/Core/Utilities/Witchcraft.cs @@ -5,376 +5,376 @@ namespace Rant.Core.Utilities { - internal delegate TResult XFunc(); - internal delegate TResult XFunc(A a); - internal delegate TResult XFunc(A a, B b); - internal delegate TResult XFunc(A a, B b, C c); - internal delegate TResult XFunc(A a, B b, C c, D d); - internal delegate TResult XFunc(A a, B b, C c, D d, E e); - internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f); - internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f, G g); - internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f, G g, H h); - internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f, G g, H h, I i); - - internal delegate void XAction(); - internal delegate void XAction(A a); - internal delegate void XAction(A a, B b); - internal delegate void XAction(A a, B b, C c); - internal delegate void XAction(A a, B b, C c, D d); - internal delegate void XAction(A a, B b, C c, D d, E e); - internal delegate void XAction(A a, B b, C c, D d, E e, F f); - internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g); - internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g, H h); - internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g, H h, I i); - - /// - /// Allows creation of Rant function delegates from reflected methods that can be invoked using a series of boxed arguments. - /// - internal abstract class Witchcraft - { - private static readonly Type[] _funcTypes; - private static readonly Type[] _voidTypes; - - static Witchcraft() - { - var ass = Assembly.GetAssembly(typeof(Witchcraft)); - var lstFuncTypes = new List(); - var lstVoidTypes = new List(); - foreach (var type in ass.GetTypes().Where(t => t.IsSubclassOf(typeof(Witchcraft)) && t.IsGenericTypeDefinition)) - { - if (type.IsSubclassOf(typeof(WitchcraftVoid))) - { - lstVoidTypes.Add(type); - } - else - { - lstFuncTypes.Add(type); - } - } - - _funcTypes = lstFuncTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); - _voidTypes = lstVoidTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); - } - - public static Witchcraft Create(MethodInfo methodInfo) - { - bool isVoid = methodInfo.ReturnType == typeof(void); - var types = methodInfo.GetParameters().Select(p => p.ParameterType).ToArray(); - if (types.Length == 0 || types[0] != typeof(Sandbox)) - throw new ArgumentException("Method must have a Sandbox parameter come first.", nameof(methodInfo)); - - var argTypes = types.Skip(1).ToArray(); - if (argTypes.Length >= _funcTypes.Length) - throw new ArgumentException($"Methods with {types.Length} argument(s) are not currently supported."); - - if (argTypes.Length == 0) - { - if (isVoid) - { - return new WitchcraftNoParamsVoid(methodInfo); - } - else - { - return new WitchcraftNoParams(methodInfo); - } - } - - Type type = isVoid - ? _voidTypes[argTypes.Length - 1].MakeGenericType(argTypes) - : _funcTypes[argTypes.Length - 1].MakeGenericType(argTypes); - - return (Witchcraft)Activator.CreateInstance(type, methodInfo); - } - - public abstract object Invoke(Sandbox sb, object[] args); - } - - internal abstract class WitchcraftVoid : Witchcraft - { - } - - internal class WitchcraftNoParams : Witchcraft - { - private readonly XFunc _func; - - public WitchcraftNoParams(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => _func(sb); - } - - internal class WitchcraftNoParamsVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftNoParamsVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => _func(sb, (A)args[0]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6], (H)args[7]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6], (H)args[7]); - return null; - } - } + internal delegate TResult XFunc(); + internal delegate TResult XFunc(A a); + internal delegate TResult XFunc(A a, B b); + internal delegate TResult XFunc(A a, B b, C c); + internal delegate TResult XFunc(A a, B b, C c, D d); + internal delegate TResult XFunc(A a, B b, C c, D d, E e); + internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f); + internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f, G g); + internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f, G g, H h); + internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f, G g, H h, I i); + + internal delegate void XAction(); + internal delegate void XAction(A a); + internal delegate void XAction(A a, B b); + internal delegate void XAction(A a, B b, C c); + internal delegate void XAction(A a, B b, C c, D d); + internal delegate void XAction(A a, B b, C c, D d, E e); + internal delegate void XAction(A a, B b, C c, D d, E e, F f); + internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g); + internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g, H h); + internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g, H h, I i); + + /// + /// Allows creation of Rant function delegates from reflected methods that can be invoked using a series of boxed arguments. + /// + internal abstract class Witchcraft + { + private static readonly Type[] _funcTypes; + private static readonly Type[] _voidTypes; + + static Witchcraft() + { + var ass = Assembly.GetAssembly(typeof(Witchcraft)); + var lstFuncTypes = new List(); + var lstVoidTypes = new List(); + foreach (var type in ass.GetTypes().Where(t => t.IsSubclassOf(typeof(Witchcraft)) && t.IsGenericTypeDefinition)) + { + if (type.IsSubclassOf(typeof(WitchcraftVoid))) + { + lstVoidTypes.Add(type); + } + else + { + lstFuncTypes.Add(type); + } + } + + _funcTypes = lstFuncTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); + _voidTypes = lstVoidTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); + } + + public static Witchcraft Create(MethodInfo methodInfo) + { + bool isVoid = methodInfo.ReturnType == typeof(void); + var types = methodInfo.GetParameters().Select(p => p.ParameterType).ToArray(); + if (types.Length == 0 || types[0] != typeof(Sandbox)) + throw new ArgumentException("Method must have a Sandbox parameter come first.", nameof(methodInfo)); + + var argTypes = types.Skip(1).ToArray(); + if (argTypes.Length >= _funcTypes.Length) + throw new ArgumentException($"Methods with {types.Length} argument(s) are not currently supported."); + + if (argTypes.Length == 0) + { + if (isVoid) + { + return new WitchcraftNoParamsVoid(methodInfo); + } + else + { + return new WitchcraftNoParams(methodInfo); + } + } + + Type type = isVoid + ? _voidTypes[argTypes.Length - 1].MakeGenericType(argTypes) + : _funcTypes[argTypes.Length - 1].MakeGenericType(argTypes); + + return (Witchcraft)Activator.CreateInstance(type, methodInfo); + } + + public abstract object Invoke(Sandbox sb, object[] args); + } + + internal abstract class WitchcraftVoid : Witchcraft + { + } + + internal class WitchcraftNoParams : Witchcraft + { + private readonly XFunc _func; + + public WitchcraftNoParams(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => _func(sb); + } + + internal class WitchcraftNoParamsVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftNoParamsVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => _func(sb, (A)args[0]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6], (H)args[7]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6], (H)args[7]); + return null; + } + } } \ No newline at end of file diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 0ce26b0..5247480 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -304,7 +304,7 @@ - + diff --git a/Rant/Vocabulary/Querying/QueryState.cs b/Rant/Vocabulary/Querying/CarrierState.cs similarity index 99% rename from Rant/Vocabulary/Querying/QueryState.cs rename to Rant/Vocabulary/Querying/CarrierState.cs index 14b81f8..67fcff9 100644 --- a/Rant/Vocabulary/Querying/QueryState.cs +++ b/Rant/Vocabulary/Querying/CarrierState.cs @@ -9,7 +9,7 @@ namespace Rant.Vocabulary.Querying /// /// Maintains state information used by queries. /// - internal sealed class QueryState + internal sealed class CarrierState { /// /// Distinct carrier table. diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index f207c7a..8617196 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -129,7 +129,7 @@ public static RantDictionary FromMultiDirectory(params string[] directories) /// The search criteria to use. /// The state object to use for carrier synchronization. /// - internal string Query(RNG rng, Query query, QueryState syncState) + internal string Query(RNG rng, Query query, CarrierState syncState) { RantDictionaryTable table; return !_tables.TryGetValue(query.Name, out table) diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 3504969..7480d82 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -65,8 +65,6 @@ public RantDictionaryTable(string name, string[] subtypes, IEnumerable !Util.ValidateName(s)).Select(s => $"'{s}'").ToArray())); - - _subtypes = subtypes; _name = name; _entriesHash.AddRange(entries); @@ -183,7 +181,7 @@ public bool Merge(RantDictionaryTable other) return true; } - internal string Query(RantDictionary dictionary, RNG rng, Query query, QueryState syncState) + internal string Query(RantDictionary dictionary, RNG rng, Query query, CarrierState syncState) { var index = String.IsNullOrEmpty(query.Subtype) ? 0 : GetSubtypeIndex(query.Subtype); if (index == -1) return "[Bad Subtype]"; From 5ddf9263cb5df74c9b37e2823633abca2bc2055f Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 26 Jul 2016 13:58:56 -0500 Subject: [PATCH 006/213] Initial cleanup of RantModule class --- Rant/Resources/RantModule.cs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Rant/Resources/RantModule.cs b/Rant/Resources/RantModule.cs index 48e95e7..291175d 100644 --- a/Rant/Resources/RantModule.cs +++ b/Rant/Resources/RantModule.cs @@ -3,24 +3,28 @@ namespace Rant.Resources { - public class RantModule + /// + /// Represents a collection of subroutines that can be loaded and used by other patterns. + /// + public sealed class RantModule { - private ObjectStack _objects = new ObjectStack(new ObjectTable()); + private readonly ObjectStack _objects = new ObjectStack(new ObjectTable()); - public string Name { get; private set; } + /// + /// The name of the module. + /// + public string Name { get; } + /// + /// Creates a new RantModule with the specified name. + /// + /// The name to assign to the module. public RantModule(string name) { Name = name; } - internal RantAction this[string name] - { - get - { - return (RantAction)_objects[name].Value; - } - } + internal RantAction this[string name] => (RantAction)_objects[name].Value; /// /// Adds a RantPattern containing a subroutine to this module. @@ -29,8 +33,8 @@ internal RantAction this[string name] /// The pattern that will make up the body of the function. public void AddSubroutineFunction(string name, RantPattern pattern) { - var action = (pattern.Action.GetType() == typeof(RASequence) ? - ((RASequence)pattern.Action).Actions[0] : + var action = (pattern.Action.GetType() == typeof(RASequence) ? + ((RASequence)pattern.Action).Actions[0] : pattern.Action); if (action.GetType() != typeof(RADefineSubroutine)) throw new RantRuntimeException(pattern, pattern.Code, "Attempted to add non-subroutine pattern to a module."); From 994c7f4d11d4a542c97c1a30160d84d955c6fcab Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Tue, 26 Jul 2016 15:30:37 -0400 Subject: [PATCH 007/213] Queries, except for carriers. --- Rant/Core/Compiler/Parsing/Parser.cs | 2 +- Rant/Core/Compiler/Parsing/QueryParser.cs | 155 ++++++++++++++++++- Rant/Core/Compiler/Parsing/SequenceParser.cs | 5 + Rant/Core/Compiler/RantCompiler.cs | 2 +- Rant/Rant.csproj | 6 +- Rant/Vocabulary/Querying/Query.cs | 2 +- 6 files changed, 166 insertions(+), 6 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/Parser.cs b/Rant/Core/Compiler/Parsing/Parser.cs index 9ceeb24..1b4dc6c 100644 --- a/Rant/Core/Compiler/Parsing/Parser.cs +++ b/Rant/Core/Compiler/Parsing/Parser.cs @@ -12,7 +12,7 @@ internal abstract class Parser public static T Get() where T : Parser { Parser parser; - if (_parserMap.TryGetValue(typeof(T), out parser)) + if (!_parserMap.TryGetValue(typeof(T), out parser)) { parser = _parserMap[typeof(T)] = Activator.CreateInstance(typeof(T)) as T; } diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 2662a93..22d8b7e 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.Text.RegularExpressions; using Rant.Core.Compiler.Syntax; +using Rant.Vocabulary.Querying; +using Rant.Core.Utilities; namespace Rant.Core.Compiler.Parsing { @@ -9,7 +12,157 @@ internal class QueryParser : Parser { public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { - throw new NotImplementedException(); + var tableName = reader.Read(R.Text, "query table name"); + var query = new Query(); + query.Name = tableName.Value; + query.ClassFilter = new ClassFilter(); + query.RegexFilters = new List<_>(); + bool exclusiveRead = false; + bool subtypeRead = false; + + while(!reader.End) + { + var token = reader.ReadLooseToken(); + + switch(token.ID) + { + // read subtype + case R.Subtype: + // if there's already a subtype, throw an error and ignore it + if(subtypeRead) + { + compiler.SyntaxError(token, "multiple subtypes in a query", false); + reader.Read(R.Text, "query subtype name"); + break; + } + // if the exclusive sign has already been read, throw an error and ignore it + if(exclusiveRead) + { + compiler.SyntaxError(token, "subtype should be before exclusive query sign.", false); + reader.Read(R.Text, "query subtype name"); + break; + } + query.Subtype = reader.Read(R.Text, "query subtype").Value; + subtypeRead = true; + break; + + // read query + case R.Hyphen: + { + bool blacklist = false; + // check if it's a blacklist filter + if(reader.PeekType() == R.Exclamation) + { + blacklist = true; + reader.ReadToken(); + } + var classFilterName = reader.Read(R.Text, "class filter rule"); + var rule = new ClassFilterRule(classFilterName.Value, !blacklist); + query.ClassFilter.AddRule(rule); + } + break; + + // read regex filter + case R.Without: + case R.Question: + { + bool blacklist = (token.ID == R.Without); + + var regexFilter = reader.Read(R.Regex, "regex filter rule"); + var rule = new _(!blacklist, Util.ParseRegex(regexFilter.Value)); + query.RegexFilters.Add(rule); + } + break; + + // read exclusive sign + case R.Dollar: + exclusiveRead = true; + query.Exclusive = true; + break; + + // read syllable range + case R.LeftParen: + // There are four possible types of values in a syllable range: + // (a), (a-), (-b), (a-b) + + // either (a), (a-), or (a-b) + if(reader.PeekLooseToken().ID == R.Text) + { + var firstNumberToken = reader.ReadLooseToken(); + int firstNumber; + if(!Util.ParseInt(firstNumberToken.Value, out firstNumber)) + { + compiler.SyntaxError(firstNumberToken, "syllable range value is not a valid integer"); + } + + // (a-) or (a-b) + if(reader.PeekLooseToken().ID == R.Hyphen) + { + reader.ReadLooseToken(); + // (a-b) + if(reader.PeekLooseToken().ID == R.Text) + { + var secondNumberToken = reader.ReadLooseToken(); + int secondNumber; + if(!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + { + compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); + } + + query.SyllablePredicate = new Range(firstNumber, secondNumber); + } + // (a-) + else + { + query.SyllablePredicate = new Range(firstNumber, null); + } + } + // (a) + else + { + query.SyllablePredicate = new Range(firstNumber, firstNumber); + } + } + // (-b) + else if(reader.PeekLooseToken().ID == R.Hyphen) + { + reader.ReadLooseToken(); + var secondNumberToken = reader.ReadLoose(R.Text, "syllable range value"); + int secondNumber; + if(!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + { + compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); + } + query.SyllablePredicate = new Range(null, secondNumber); + } + // () + else if(reader.PeekLooseToken().ID == R.RightParen) + { + compiler.SyntaxError(token, "empty syllable range", false); + } + // (something else) + else + { + compiler.SyntaxError(reader.PeekLooseToken(), "unexpected token in syllable range"); + } + + reader.ReadLoose(R.RightParen, "syllable range end"); + break; + + // end of query + case R.RightAngle: + goto end_of_loop; + + default: + compiler.SyntaxError(token, "unexpected token"); + break; + } + } + + end_of_loop: + + actionCallback(new RAQuery(query, tableName)); + yield break; } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 83b5f51..b167e05 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -71,6 +71,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; } break; + + case R.EscapeSequence: // Handle escape sequences + actionCallback(new RAEscape(token)); + break; + default: // Handle text actionCallback(new RAText(token)); break; diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 9a60132..8f74bb7 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -64,7 +64,7 @@ public RantAction Compile() return new RASequence(actionList, _source); } - public void SyntaxError(Stringe token, string message) + public void SyntaxError(Stringe token, string message, bool fatal = true) { throw new RantCompilerException(_sourceName, token, message); } diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 5247480..28cfb5e 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -295,6 +295,7 @@ + @@ -304,11 +305,12 @@ - - + + Code + diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index b377fff..7532850 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -41,6 +41,6 @@ public sealed class Query /// /// The regex filters to search by. /// - public IEnumerable<_> RegexFilters { get; set; } + public List<_> RegexFilters { get; set; } } } \ No newline at end of file From 55aa3d5ea1a63ba8507d1385f22259d82d590d4d Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 26 Jul 2016 15:08:24 -0500 Subject: [PATCH 008/213] Fix package version comparison operators --- Rant/Resources/RantPackageVersion.cs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Rant/Resources/RantPackageVersion.cs b/Rant/Resources/RantPackageVersion.cs index 9d2ad87..3ce57dc 100644 --- a/Rant/Resources/RantPackageVersion.cs +++ b/Rant/Resources/RantPackageVersion.cs @@ -62,50 +62,50 @@ public RantPackageVersion(int major, int minor, int revision) /// public RantPackageVersion() { - + } public static bool operator <(RantPackageVersion a, RantPackageVersion b) { if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - if (a._major != b._major) return a._major < b._major; - if (a._minor != b._minor) return a._minor < b._minor; - return a._revision < b._revision; + return a._major != b._major + ? a._major < b._major + : (a._minor == b._minor ? a._revision < b._revision : a._minor < b._minor); } public static bool operator >(RantPackageVersion a, RantPackageVersion b) { if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - if (a._major != b._major) return a._major > b._major; - if (a._minor != b._minor) return a._minor > b._minor; - return a._revision > b._revision; + return a._major != b._major + ? a._major > b._major + : (a._minor == b._minor ? a._revision > b._revision : a._minor > b._minor); } public static bool operator <=(RantPackageVersion a, RantPackageVersion b) { if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - if (a._major <= b._major) return true; - if (a._minor <= b._minor) return true; - return a._revision <= b._revision; + return a._major != b._major + ? a._major <= b._major + : (a._minor == b._minor ? a._revision <= b._revision : a._minor <= b._minor); } public static bool operator >=(RantPackageVersion a, RantPackageVersion b) { if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - if (a._major >= b._major) return true; - if (a._minor >= b._minor) return true; - return a._revision >= b._revision; + return a._major != b._major + ? a._major >= b._major + : (a._minor == b._minor ? a._revision >= b._revision : a._minor >= b._minor); } public static bool operator ==(RantPackageVersion a, RantPackageVersion b) { if (ReferenceEquals(a, null)) return ReferenceEquals(b, null); if (ReferenceEquals(b, null)) return false; - return a._major == b._major && a._minor == b._minor && a._revision == b._revision; + return a._major == b._major && a._minor == b._minor && a._revision == b._revision; } public static bool operator !=(RantPackageVersion a, RantPackageVersion b) From 52fdab9d8337b84b717fddb1c5d0a73a622ba3c5 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 26 Jul 2016 23:34:03 -0500 Subject: [PATCH 009/213] Implement cross-pattern carrier state persistence --- Rant/Core/Compiler/Syntax/RAQuery.cs | 4 +- Rant/Core/Framework/RantFunctionRegistry.cs | 2 +- Rant/Core/Sandbox.cs | 8 +- Rant/RantEngine.cs | 83 ++++++++++++++------- 4 files changed, 63 insertions(+), 34 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RAQuery.cs b/Rant/Core/Compiler/Syntax/RAQuery.cs index 7d89c8b..a394583 100644 --- a/Rant/Core/Compiler/Syntax/RAQuery.cs +++ b/Rant/Core/Compiler/Syntax/RAQuery.cs @@ -29,10 +29,10 @@ public override IEnumerator Run(Sandbox sb) { foreach (CarrierComponent type in Enum.GetValues(typeof(CarrierComponent))) foreach (string name in _query.Carrier.GetCarriers(type)) - sb.QueryState.RemoveType(type, name); + sb.CarrierState.RemoveType(type, name); yield break; } - var result = sb.Engine.Dictionary.Query(sb.RNG, _query, sb.QueryState); + var result = sb.Engine.Dictionary.Query(sb.RNG, _query, sb.CarrierState); sb.Print(result); } } diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index a5bb2e8..927e30d 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -496,7 +496,7 @@ private static void Rhyme(Sandbox sb, [RantDescription("The rhyme types to use.")] RhymeFlags flags) { - sb.QueryState.Rhymer.AllowedRhymes = flags; + sb.CarrierState.Rhymer.AllowedRhymes = flags; } [RantFunction("sync", "x")] diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index b8a0036..9ba496d 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -34,7 +34,7 @@ internal class Sandbox private readonly Limit _sizeLimit; private readonly Stack _blocks; private readonly Stack _matches; - private readonly CarrierState _queryState; + private readonly CarrierState _carrierState; private readonly Stack> _subroutineArgs; private readonly SyncManager _syncManager; private readonly Stack _scriptObjectStack; @@ -99,7 +99,7 @@ internal class Sandbox /// /// Gets the current query state. /// - public CarrierState QueryState => _queryState; + public CarrierState CarrierState => _carrierState; /// /// Gets the current RantPattern. @@ -163,7 +163,7 @@ internal class Sandbox /// public Dictionary PackageModules = new Dictionary(); - public Sandbox(RantEngine engine, RantPattern pattern, RNG rng, int sizeLimit = 0, RantPatternArgs args = null) + public Sandbox(RantEngine engine, RantPattern pattern, RNG rng, int sizeLimit = 0, CarrierState carrierState = null, RantPatternArgs args = null) { _engine = engine; _format = engine.Format; @@ -177,7 +177,7 @@ public Sandbox(RantEngine engine, RantPattern pattern, RNG rng, int sizeLimit = _objects = new ObjectStack(engine.Objects); _blocks = new Stack(); _matches = new Stack(); - _queryState = new CarrierState(); + _carrierState = carrierState ?? new CarrierState(); _subroutineArgs = new Stack>(); _syncManager = new SyncManager(this); _blockManager = new BlockManager(); diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 894a82f..b5cc3c2 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -10,6 +10,7 @@ using Rant.Formats; using Rant.Resources; using Rant.Vocabulary; +using Rant.Vocabulary.Querying; namespace Rant { @@ -42,6 +43,18 @@ public static int MaxStackSize #endregion + internal readonly ObjectTable Objects = new ObjectTable(); + internal Dictionary PackageModules = new Dictionary(); + + private readonly Dictionary _userModules = new Dictionary(); + private readonly Dictionary _patternCache = new Dictionary(); + private readonly HashSet _loadedPackages = new HashSet(); + private RantDependencyResolver _resolver = new RantDependencyResolver(); + private RantDictionary _dictionary = new RantDictionary(); + private RantFormat _format = RantFormat.English; + private bool _preserveCarrierState = false; + private CarrierState _carrierState = null; + /// /// User-defined Rant modules. /// @@ -55,7 +68,15 @@ public static int MaxStackSize /// /// The current formatting settings for the engine. /// - public RantFormat Format = RantFormat.English; + public RantFormat Format + { + get { return _format; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _format = value; + } + } /// /// The vocabulary associated with this instance. @@ -83,14 +104,18 @@ public RantDependencyResolver DependencyResolver } } - internal readonly ObjectTable Objects = new ObjectTable(); - internal Dictionary PackageModules = new Dictionary(); - - private readonly Dictionary _userModules = new Dictionary(); - private readonly Dictionary _patternCache = new Dictionary(); - private readonly HashSet _loadedPackages = new HashSet(); - private RantDependencyResolver _resolver = new RantDependencyResolver(); - private RantDictionary _dictionary = new RantDictionary(); + /// + /// Specifies whether to preserve carrier states between patterns. + /// + public bool PreserveCarrierState + { + get { return _preserveCarrierState; } + set + { + if (!value) _carrierState = null; + _preserveCarrierState = value; + } + } /// /// Accesses global variables. @@ -222,9 +247,13 @@ private RantOutput RunVM(Sandbox vm, double timeout) { vm.UserModules = _userModules; vm.PackageModules = PackageModules; + if (_preserveCarrierState && _carrierState == null) + _carrierState = vm.CarrierState; return vm.Run(timeout); } + private CarrierState GetPreservedCarrierState() => _preserveCarrierState ? _carrierState : null; + /// /// Compiles the specified string into a pattern, executes it, and returns the resulting output. /// @@ -234,7 +263,7 @@ private RantOutput RunVM(Sandbox vm, double timeout) /// The arguments to pass to the pattern. /// public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, args), timeout); + RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); /// /// Loads the file located at the specified path and executes it, returning the resulting output. @@ -245,7 +274,7 @@ public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantP /// The arguments to pass to the pattern. /// public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(Seeds.NextRaw()), charLimit, args), timeout); + RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); /// /// Compiles the specified string into a pattern, executes it using a custom seed, and returns the resulting output. @@ -257,7 +286,7 @@ public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, Ra /// The arguments to pass to the pattern. /// public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, args), timeout); + RunVM(new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); /// /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. @@ -269,7 +298,7 @@ public RantOutput Do(string input, long seed, int charLimit = 0, double timeout /// The arguments to pass to the pattern. /// public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(seed), charLimit, args), timeout); + RunVM(new Sandbox(this, RantPattern.FromFile(path), new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); /// /// Compiles the specified string into a pattern, executes it using a custom RNG, and returns the resulting output. @@ -281,7 +310,7 @@ public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeo /// The arguments to pass to the pattern. /// public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromString(input), rng, charLimit, args), timeout); + RunVM(new Sandbox(this, RantPattern.FromString(input), rng, charLimit, GetPreservedCarrierState(), args), timeout); /// /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. @@ -293,7 +322,7 @@ public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = /// The arguments to pass to the pattern. /// public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, RantPattern.FromFile(path), rng, charLimit, args), timeout); + RunVM(new Sandbox(this, RantPattern.FromFile(path), rng, charLimit, GetPreservedCarrierState(), args), timeout); /// /// Executes the specified pattern and returns the resulting output. @@ -304,7 +333,7 @@ public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout /// The arguments to pass to the pattern. /// public RantOutput Do(RantPattern input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, args), timeout); + RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); /// /// Executes the specified pattern using a custom seed and returns the resulting output. @@ -316,7 +345,7 @@ public RantOutput Do(RantPattern input, int charLimit = 0, double timeout = -1, /// The arguments to pass to the pattern. /// public RantOutput Do(RantPattern input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, input, new RNG(seed), charLimit, args), timeout); + RunVM(new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); /// /// Executes the specified pattern using a custom random number generator and returns the resulting output. @@ -328,7 +357,7 @@ public RantOutput Do(RantPattern input, long seed, int charLimit = 0, double tim /// The arguments to pass to the pattern. /// public RantOutput Do(RantPattern input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - RunVM(new Sandbox(this, input, rng, charLimit, args), timeout); + RunVM(new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args), timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -339,7 +368,7 @@ public RantOutput Do(RantPattern input, RNG rng, int charLimit = 0, double timeo /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(RantPattern input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, args).RunSerial(timeout); + new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -351,7 +380,7 @@ public IEnumerable DoSerial(RantPattern input, int charLimit = 0, do /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(RantPattern input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, input, new RNG(seed), charLimit, args).RunSerial(timeout); + new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -363,7 +392,7 @@ public IEnumerable DoSerial(RantPattern input, long seed, int charLi /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(RantPattern input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, input, rng, charLimit, args).RunSerial(timeout); + new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -374,7 +403,7 @@ public IEnumerable DoSerial(RantPattern input, RNG rng, int charLimi /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(string input, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, args).RunSerial(timeout); + new Sandbox(this, RantPattern.FromString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -386,7 +415,7 @@ public IEnumerable DoSerial(string input, int charLimit = 0, double /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, args).RunSerial(timeout); + new Sandbox(this, RantPattern.FromString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -398,7 +427,7 @@ public IEnumerable DoSerial(string input, long seed, int charLimit = /// The arguments to pass to the pattern. /// public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, RantPatternArgs args = null) => - new Sandbox(this, RantPattern.FromString(input), rng, charLimit, args).RunSerial(timeout); + new Sandbox(this, RantPattern.FromString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes a pattern that has been loaded from a package and returns the resulting output. @@ -413,7 +442,7 @@ public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeo if (!PatternExists(patternName)) throw new ArgumentException("Pattern doesn't exist."); - return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, args), timeout); + return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); } /// @@ -430,7 +459,7 @@ public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, d if (!PatternExists(patternName)) throw new ArgumentException("Pattern doesn't exist."); - return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, args), timeout); + return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); } /// @@ -447,7 +476,7 @@ public RantOutput DoPackaged(string patternName, RNG rng, int charLimit = 0, dou if (!PatternExists(patternName)) throw new ArgumentException("Pattern doesn't exist."); - return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, args), timeout); + return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, GetPreservedCarrierState(), args), timeout); } #endregion } From d03ae73ce6ae18d5a4ec38eb0e6d8a77bc450ea4 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 26 Jul 2016 23:45:23 -0500 Subject: [PATCH 010/213] Add RantEngine.ResetCarrierState method --- Rant/RantEngine.cs | 8 ++++++++ Rant/Vocabulary/Querying/CarrierState.cs | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index b5cc3c2..1d9967b 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -117,6 +117,14 @@ public bool PreserveCarrierState } } + /// + /// Deletes all state data in the engine's persisted carrier state, if available. + /// + public void ResetCarrierState() + { + _carrierState?.Reset(); + } + /// /// Accesses global variables. /// diff --git a/Rant/Vocabulary/Querying/CarrierState.cs b/Rant/Vocabulary/Querying/CarrierState.cs index 67fcff9..72172ac 100644 --- a/Rant/Vocabulary/Querying/CarrierState.cs +++ b/Rant/Vocabulary/Querying/CarrierState.cs @@ -45,6 +45,14 @@ internal sealed class CarrierState internal Rhymer Rhymer => _rhymer; + public void Reset() + { + _rhymeTable.Clear(); + _matchTable.Clear(); + _assocTable.Clear(); + _uniqueTable.Clear(); + } + internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumerable pool, RNG rng) { if (carrier == null) return pool.PickEntry(rng); From 92e294d8e657a0f1bfda5fdb73844f1e6f0348b2 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 26 Jul 2016 23:49:34 -0500 Subject: [PATCH 011/213] Get rid of useless "Editor" build config for real --- Rant/Rant.csproj | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 5247480..de73d20 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -61,17 +61,6 @@ false - - ..\bin\EditorBuild\ - TRACE;EDITOR - ..\bin\EditorBuild\Rant.xml - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - false - true ..\bin\MainBuild\Unmanaged\x86\ @@ -103,17 +92,6 @@ MinimumRecommendedRules.ruleset false - - bin\x86\Editor\ - TRACE;EDITOR - ..\bin\EditorBuild\Rant.xml - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - false - true ..\bin\MainBuild\Unmanaged\x64\ @@ -145,17 +123,6 @@ MinimumRecommendedRules.ruleset false - - bin\x64\Editor\ - TRACE;EDITOR - ..\bin\EditorBuild\Rant.xml - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - false - ..\bin\UnityBuild\ TRACE;UNITY From f9792f6549d32a48e17ec51d4f409d8b7b90f3eb Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 00:18:03 -0500 Subject: [PATCH 012/213] Eliminate multiple enumerations in package loader --- Rant/RantEngine.cs | 9 ++++++--- Rant/Resources/RantPackage.cs | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 1d9967b..530e7ac 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; +using System.Runtime.CompilerServices; using Rant.Core; using Rant.Core.Framework; @@ -186,7 +186,7 @@ public void LoadPackage(RantPackage package) var patterns = package.GetPatterns(); var tables = package.GetTables(); - if (patterns.Any()) + if (package.HasPatterns) { foreach (var pattern in patterns) { @@ -196,7 +196,7 @@ public void LoadPackage(RantPackage package) } } - if (tables.Any()) + if (package.HasDictionary) { if (_dictionary == null) { @@ -251,6 +251,9 @@ internal RantPattern GetPattern(string name) #region Do, DoFile +#if !UNITY + [MethodImpl(MethodImplOptions.AggressiveInlining)] +#endif private RantOutput RunVM(Sandbox vm, double timeout) { vm.UserModules = _userModules; diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 6bbe54b..3abfe13 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -54,6 +54,16 @@ public string ID } } + /// + /// Determines whether the package contains any patterns. + /// + public bool HasPatterns => _patterns.Count > 0; + + /// + /// Determines whether the package contains any tables. + /// + public bool HasDictionary => _tables.Count > 0; + /// /// The description for the package. /// From 76e73fa2dcfa7b0c9244dfe3e8d11912afe4f026 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 07:47:02 -0500 Subject: [PATCH 013/213] Start working on string localization --- Rant/Localization/Txtres.cs | 125 ++++++++++++++++++++++++++++++++++ Rant/Localization/de-DE.lang | 16 +++++ Rant/Localization/en-US.lang | 16 +++++ Rant/Rant.csproj | 3 + Rant/RantEngine.cs | 4 +- Rant/Resources/RantPackage.cs | 120 +------------------------------- Rave/Packer/PackGenerator.cs | 72 ++++++++------------ 7 files changed, 195 insertions(+), 161 deletions(-) create mode 100644 Rant/Localization/Txtres.cs create mode 100644 Rant/Localization/de-DE.lang create mode 100644 Rant/Localization/en-US.lang diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs new file mode 100644 index 0000000..08d4e40 --- /dev/null +++ b/Rant/Localization/Txtres.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace Rant.Localization +{ + internal static class Txtres + { + public const string LanguageResourceNamespace = "Localization"; + public const string FallbackLanguageCode = "en-US"; + + private static readonly Dictionary _stringTable = new Dictionary(); + private static readonly Dictionary _escapeMap = new Dictionary + { + {'a', '\a'}, + {'b', '\b'}, + {'f', '\f'}, + {'n', '\n'}, + {'r', '\r'}, + {'t', '\t'}, + {'v', '\v'} + }; + + static Txtres() + { + try + { + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{CultureInfo.CurrentCulture.Name}.lang") + ?? Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{FallbackLanguageCode}.lang")) + { + if (stream == null) + { +#if DEBUG + Console.WriteLine($"Txtres error: Missing language definition Localization/{CultureInfo.CurrentCulture.Name}.lang"); +#endif + return; + } + + using (var reader = new StreamReader(stream)) + { + loop: + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + if (line == null || line.Length == 0) continue; + var kv = line.Split(new[] { '=' }, 1); + if (kv.Length != 2) continue; + var key = kv[0].Trim(); + if (!key.All(c => Char.IsLetterOrDigit(c) || c == '-' || c == '_')) continue; + var valueLiteral = kv[1].Trim(); + var sb = new StringBuilder(); + char esc; + int i = 0; + int len = valueLiteral.Length; + while (i < len) + { + if ((i == 0 || i == valueLiteral.Length - 1) && valueLiteral[i] != '"') goto loop; + switch (valueLiteral[i]) + { + case '\\': + if (i == valueLiteral.Length - 1) goto loop; + if (_escapeMap.TryGetValue(valueLiteral[i + 1], out esc)) + { + sb.Append(esc); + } + else if (valueLiteral[i + 1] == 'u') + { + if (i + 5 >= valueLiteral.Length) goto loop; + short code; + if (!short.TryParse(valueLiteral.Substring(i + 1, 4), + NumberStyles.AllowHexSpecifier, + CultureInfo.InvariantCulture, out code)) goto loop; + sb.Append((char)code); + i += 6; + continue; + } + else + { + sb.Append(valueLiteral[i + 1]); + } + i += 2; + continue; + default: + sb.Append(valueLiteral[i]); + break; + } + i++; + } + _stringTable[key] = sb.ToString(); + } + } + } + } + catch (Exception ex) + { +#if DEBUG + Console.WriteLine($"Txtres error: {ex.Message}"); +#endif + } + } + + public static string GetString(string name) + { + string str; + return _stringTable.TryGetValue(name, out str) ? str : name; + } + + public static string GetString(string name, params object[] args) + { + string str; + try + { + return _stringTable.TryGetValue(name, out str) ? String.Format(str, args) : name; + } + catch + { + return ""; + } + } + } +} \ No newline at end of file diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang new file mode 100644 index 0000000..2d79ba5 --- /dev/null +++ b/Rant/Localization/de-DE.lang @@ -0,0 +1,16 @@ +untitled-package="Unbenanntes Paket" +default-package-name="Paket" + +err-zero-or-negative="Wert muss größer als null sein." +err-empty-path="Der Dateipfad kann nicht leer oder NULL sein." +err-unresolvable-package="Das Paket '{0}' konnte nicht den Verweis '{1}' auflösen." +err-invalid-package-version="Diese Paketversion ({0}) ist nicht unterstützt." +err-missing-package-meta="Dieses Paket hat keine Metadaten." +err-empty-pkg-title="Der Pakettitel muss nicht leer sein." +err-empty-pkg-id="Der Paketbezeichner (ID) muss nicht leer sein." +err-file-corrupt="Die Datei ist fehlerhaft oder das Datenformat ist nicht unterstützt." +err-invalid-tablename="Ungültiger Tabellename: {0}" +err-invalid-subtypes="Ein oder mehrere der angegebenen Subtypnamen sind ungültig: {0}" + +missing-table="[Fehlende Tabelle]" +bad-subtype="[Ungültiger Subtyp]" \ No newline at end of file diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang new file mode 100644 index 0000000..bd41dc4 --- /dev/null +++ b/Rant/Localization/en-US.lang @@ -0,0 +1,16 @@ +untitled-package="Untitled Package" +default-package-name="Package" + +err-zero-or-negative="Value must be greater than zero." +err-empty-path="File path cannot be null or empty." +err-unresolvable-package="Package '{0}' was unable to resolve dependency '{1}'" +err-invalid-package-version="Unsupported package version: {0}" +err-missing-package-meta="Loaded package is missing metadata." +err-empty-pkg-title="The package title cannot be empty." +err-empty-pkg-id="The package ID cannot be empty." +err-file-corrupt="File is corrupt or in an unsupported/unrecognized format." +err-invalid-tablename="Invalid table name: {0}" +err-invalid-subtypes="Invalid subtype name(s) found: {0}" + +missing-table="[Missing Table]" +bad-subtype="[Bad Subtype]" \ No newline at end of file diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index de73d20..760e960 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -174,6 +174,7 @@ + @@ -318,6 +319,8 @@ + + diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 530e7ac..be513b9 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -8,6 +8,7 @@ using Rant.Core.ObjectModel; using Rant.Core.Utilities; using Rant.Formats; +using Rant.Localization; using Rant.Resources; using Rant.Vocabulary; using Rant.Vocabulary.Querying; @@ -25,6 +26,7 @@ public sealed class RantEngine static RantEngine() { + Txtres.Load(); RantFunctionRegistry.Load(); } @@ -210,7 +212,7 @@ public void LoadPackage(RantPackage package) } } } - + _loadedPackages.Add(RantPackageDependency.Create(package)); foreach (var dependency in package.GetDependencies()) diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 3abfe13..50ad780 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -17,7 +17,6 @@ namespace Rant.Resources /// public sealed class RantPackage { - private const string OLD_MAGIC = "RPKG"; private const string MAGIC = "RANT"; private const byte PACKAGE_VERSION = 2; @@ -229,6 +228,8 @@ public IEnumerable GetTables() /// Saves the package to the specified file path. /// /// The path to the file to create. + /// Specifies whether to compress the package contents. + /// Specifies string table behavior for the package. public void Save( string path, bool compress = true, @@ -313,68 +314,6 @@ public void Save( } } - /// - /// Saves the package using the old Rant package format to the specified file path. - /// - /// The path to the file to create. - public void SaveOld(string path) - { - if (String.IsNullOrEmpty(Path.GetExtension(path))) - { - path += ".rantpkg"; - } - - using (var writer = new EasyWriter(File.Create(path))) - { - // Magic - writer.WriteBytes(Encoding.ASCII.GetBytes(OLD_MAGIC)); - - // Counts - writer.Write(_patterns?.Count ?? 0); - writer.Write(_tables?.Count ?? 0); - - // Patterns - if (_patterns != null) - { - foreach (var pattern in _patterns) - { - writer.Write(pattern.Name); - writer.Write(pattern.Code); - } - } - - // Tables - if (_tables != null) - { - foreach (var table in _tables) - { - writer - .Write(table.Name) - .Write(table.Subtypes) - .Write(table.EntryCount) - .Write(table.HiddenClasses.ToArray()); - - foreach (var entry in table.GetEntries()) - { - writer - .Write(entry.Weight) - .Write(false) // Used to be the NSFW field, will use for something else in the future! - .Write(entry.TermCount); - - for (int i = 0; i < entry.TermCount; i++) - { - writer - .Write(entry[i].Value) - .Write(entry[i].Pronunciation); - } - - writer.Write(entry.GetClasses().ToArray()); - } - } - } - } - } - /// /// Loads a package from the specified path and returns it as a RantPackage object. /// @@ -396,8 +335,6 @@ public static RantPackage Load(Stream source) using (var reader = new EasyReader(source)) { var magic = Encoding.ASCII.GetString(reader.ReadBytes(4)); - if (magic == OLD_MAGIC) - return LoadOldPackage(reader); if (magic != MAGIC) throw new InvalidDataException("File is corrupt."); var package = new RantPackage(); @@ -491,59 +428,6 @@ public static RantPackage Load(Stream source) } } - private static RantPackage LoadOldPackage(EasyReader reader) - { - int numPatterns = reader.ReadInt32(); - int numTables = reader.ReadInt32(); - - if (numPatterns < 0 || numTables < 0) - throw new InvalidDataException("File is corrupt."); - - var pkg = new RantPackage(); - - // Patterns - for (int i = 0; i < numPatterns; i++) - { - var name = reader.ReadString(); - var code = reader.ReadString(); - - pkg.AddPattern(new RantPattern(name, RantPatternOrigin.String, code)); - } - - // Tables - for (int i = 0; i < numTables; i++) - { - var name = reader.ReadString(); - var subs = reader.ReadStringArray(); - int numEntries = reader.ReadInt32(); - var hiddenClasses = reader.ReadStringArray(); - var entries = new RantDictionaryEntry[numEntries]; - - for (int j = 0; j < numEntries; j++) - { - int weight = reader.ReadInt32(); - bool flags = reader.ReadBoolean(); // unused - int numTerms = reader.ReadInt32(); - var terms = new RantDictionaryTerm[numTerms]; - - for (int k = 0; k < numTerms; k++) - { - var value = reader.ReadString(); - var pron = reader.ReadString(); - terms[k] = new RantDictionaryTerm(value, pron); - } - - var classes = reader.ReadStringArray(); - - entries[j] = new RantDictionaryEntry(terms, classes, weight); - } - - pkg.AddTable(new RantDictionaryTable(name, subs, entries, hiddenClasses)); - } - - return pkg; - } - public override string ToString() => $"{Title}, v{Version}"; } } \ No newline at end of file diff --git a/Rave/Packer/PackGenerator.cs b/Rave/Packer/PackGenerator.cs index 9448233..223cf02 100644 --- a/Rave/Packer/PackGenerator.cs +++ b/Rave/Packer/PackGenerator.cs @@ -30,7 +30,6 @@ public static void GetHelp() Console.WriteLine(" --compression [true|false]: Enable or disable LZMA compression. Defaults to true."); Console.WriteLine(" -string-table [mode]: Set the string table mode. 0 = none, 1 = keys, 2 = keys and values."); Console.WriteLine(" Defaults to keys."); - Console.WriteLine(" --old: Exports in the old package format. Does not support string tables, metadata, or compression."); Console.WriteLine(" -version [version]: Overrides the version in rantpkg.json."); } @@ -58,48 +57,37 @@ public static void Run() Pack(pkg, contentDir); string outputPath; - if (!Flag("old")) - { - var infoPath = Path.Combine(contentDir, "rantpkg.json"); - if (!File.Exists(infoPath)) - throw new FileNotFoundException("rantpkg.json missing from root directory."); - - var info = JsonConvert.DeserializeObject(File.ReadAllText(infoPath)); - pkg.Title = info.Title; - pkg.Authors = info.Authors; - pkg.Version = RantPackageVersion.Parse(!String.IsNullOrWhiteSpace(Property("version")) ? Property("version") : info.Version); - pkg.Description = info.Description; - pkg.ID = info.ID; - pkg.Tags = info.Tags; - foreach (var dep in info.Dependencies) - { - pkg.AddDependency(dep); - } - - if (!String.IsNullOrWhiteSpace(info.OutputPath)) - { - outputPath = Path.Combine(contentDir, info.OutputPath, $"{pkg.ID}-{pkg.Version}.rantpkg"); - Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); - } - else - { - outputPath = Path.Combine(Directory.GetParent(contentDir).FullName, $"{pkg.ID}-{pkg.Version}.rantpkg"); - } - - Console.WriteLine($"String table mode: {modeEnum}"); - Console.WriteLine($"Compression: {(compress ? "yes" : "no")}"); - - Console.WriteLine(compress ? "Compressing and saving..." : "Saving..."); - pkg.Save(outputPath, compress, modeEnum); - } - else + var infoPath = Path.Combine(contentDir, "rantpkg.json"); + if (!File.Exists(infoPath)) + throw new FileNotFoundException("rantpkg.json missing from root directory."); + + var info = JsonConvert.DeserializeObject(File.ReadAllText(infoPath)); + pkg.Title = info.Title; + pkg.Authors = info.Authors; + pkg.Version = RantPackageVersion.Parse(!String.IsNullOrWhiteSpace(Property("version")) ? Property("version") : info.Version); + pkg.Description = info.Description; + pkg.ID = info.ID; + pkg.Tags = info.Tags; + foreach (var dep in info.Dependencies) { - outputPath = Property("out", Path.Combine( - Directory.GetParent(Environment.CurrentDirectory).FullName, - Path.GetFileName(Environment.CurrentDirectory) + ".rantpkg")); - Console.WriteLine("Saving..."); - pkg.SaveOld(outputPath); - } + pkg.AddDependency(dep); + } + + if (!String.IsNullOrWhiteSpace(info.OutputPath)) + { + outputPath = Path.Combine(contentDir, info.OutputPath, $"{pkg.ID}-{pkg.Version}.rantpkg"); + Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); + } + else + { + outputPath = Path.Combine(Directory.GetParent(contentDir).FullName, $"{pkg.ID}-{pkg.Version}.rantpkg"); + } + + Console.WriteLine($"String table mode: {modeEnum}"); + Console.WriteLine($"Compression: {(compress ? "yes" : "no")}"); + + Console.WriteLine(compress ? "Compressing and saving..." : "Saving..."); + pkg.Save(outputPath, compress, modeEnum); Console.WriteLine("\nPackage saved to " + outputPath); From 607a6b7d676c6d905cd4dbddaa8ac154b16df85b Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 07:56:01 -0500 Subject: [PATCH 014/213] Fix string resource namespace --- Rant/Localization/Txtres.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index 08d4e40..8cb6b16 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -10,7 +10,7 @@ namespace Rant.Localization { internal static class Txtres { - public const string LanguageResourceNamespace = "Localization"; + public const string LanguageResourceNamespace = "Rant.Localization"; public const string FallbackLanguageCode = "en-US"; private static readonly Dictionary _stringTable = new Dictionary(); @@ -29,8 +29,10 @@ static Txtres() { try { - using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{CultureInfo.CurrentCulture.Name}.lang") - ?? Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{FallbackLanguageCode}.lang")) + var ass = Assembly.GetExecutingAssembly(); + using (var stream = + ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{CultureInfo.CurrentCulture.Name}.lang") + ?? ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{FallbackLanguageCode}.lang")) { if (stream == null) { From 2ee3dc57ab7e4da7618e04b5ae67b569a27fc8da Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 08:10:42 -0500 Subject: [PATCH 015/213] Make some use of the string table --- Rant/Localization/Txtres.cs | 6 ++++++ Rant/Localization/de-DE.lang | 2 +- Rant/Localization/en-US.lang | 2 +- Rant/RantEngine.cs | 11 ++++++----- Rant/Resources/RantPackage.cs | 12 +++++++----- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index 8cb6b16..2b9b122 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.CompilerServices; using System.Text; namespace Rant.Localization @@ -105,6 +106,11 @@ static Txtres() } } + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + public static void ForceLoad() + { + } + public static string GetString(string name) { string str; diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 2d79ba5..643bfa5 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -1,5 +1,5 @@ untitled-package="Unbenanntes Paket" -default-package-name="Paket" +default-package-id="Paket" err-zero-or-negative="Wert muss größer als null sein." err-empty-path="Der Dateipfad kann nicht leer oder NULL sein." diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index bd41dc4..f1e46d2 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -1,5 +1,5 @@ untitled-package="Untitled Package" -default-package-name="Package" +default-package-id="Package" err-zero-or-negative="Value must be greater than zero." err-empty-path="File path cannot be null or empty." diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index be513b9..713fb31 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -8,11 +8,12 @@ using Rant.Core.ObjectModel; using Rant.Core.Utilities; using Rant.Formats; -using Rant.Localization; using Rant.Resources; using Rant.Vocabulary; using Rant.Vocabulary.Querying; +using static Rant.Localization.Txtres; + namespace Rant { /// @@ -26,7 +27,7 @@ public sealed class RantEngine static RantEngine() { - Txtres.Load(); + Rant.Localization.Txtres.ForceLoad(); RantFunctionRegistry.Load(); } @@ -38,7 +39,7 @@ public static int MaxStackSize get { return _maxStackSize; } set { - if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), "Value must be greater than zero."); + if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), GetString("err-zero-or-negative")); _maxStackSize = value; } } @@ -219,7 +220,7 @@ public void LoadPackage(RantPackage package) { RantPackage pkg; if (!_resolver.TryResolvePackage(dependency, out pkg)) - throw new FileNotFoundException($"Package '{package}' was unable to resolve dependency '{dependency}'"); + throw new FileNotFoundException(GetString("err-unresolvable-package", package, dependency)); LoadPackage(pkg); } } @@ -231,7 +232,7 @@ public void LoadPackage(RantPackage package) public void LoadPackage(string path) { if (Util.IsNullOrWhiteSpace(path)) - throw new ArgumentException("Path cannot be null nor empty."); + throw new ArgumentException(GetString("err-empty-path")); if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) path += ".rantpkg"; diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 50ad780..e6c8b89 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -10,6 +10,8 @@ using Rant.Core.Utilities; using Rant.Vocabulary; +using static Rant.Localization.Txtres; + namespace Rant.Resources { /// @@ -24,8 +26,8 @@ public sealed class RantPackage private HashSet _tables; private readonly HashSet _dependencies = new HashSet(); private RantPackageVersion _version = new RantPackageVersion(1, 0, 0); - private string _title = "Untitled Package"; - private string _id = "Package"; + private string _title = GetString("untitled-package"); + private string _id = GetString("default-package-id"); /// /// The display name of the package. @@ -336,11 +338,11 @@ public static RantPackage Load(Stream source) { var magic = Encoding.ASCII.GetString(reader.ReadBytes(4)); if (magic != MAGIC) - throw new InvalidDataException("File is corrupt."); + throw new InvalidDataException(GetString("err-file-corrupt")); var package = new RantPackage(); var version = reader.ReadUInt32(); if (version != PACKAGE_VERSION) - throw new InvalidDataException("Invalid package version: " + version); + throw new InvalidDataException(GetString("err-invalid-package-version")); var compress = reader.ReadBoolean(); var size = reader.ReadInt32(); var data = reader.ReadBytes(size); @@ -350,7 +352,7 @@ public static RantPackage Load(Stream source) var info = doc["info"]; if (info == null) - throw new InvalidDataException("Metadata is missing from package."); + throw new InvalidDataException(GetString("err-missing-package-meta")); package.Title = info["title"]; package.ID = info["id"]; From bd78b609ca9d4158dc53f2acdd815b63bb6ee9c0 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 08:39:56 -0500 Subject: [PATCH 016/213] Whitespace, XML, and string fixes --- Rant/Core/IO/Bson/BsonDocument.cs | 680 ++++++++++----------- Rant/Core/IO/Bson/BsonItem.cs | 496 +++++++-------- Rant/Core/IO/Bson/BsonStringTableMode.cs | 12 +- Rant/Core/IO/Compression/EasyCompressor.cs | 118 ++-- Rant/Core/Sandbox.cs | 10 +- Rant/Localization/de-DE.lang | 31 +- Rant/Localization/en-US.lang | 31 +- Rant/RantArgAttribute.cs | 11 + 8 files changed, 704 insertions(+), 685 deletions(-) diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs index dedb792..16cab82 100644 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ b/Rant/Core/IO/Bson/BsonDocument.cs @@ -5,364 +5,364 @@ namespace Rant.Core.IO.Bson { - /// - /// Represents a document encoded in BSON. - /// - internal class BsonDocument - { - /// - /// The current string table version. - /// At some point we might want to make modifications to the format, - /// and we'll want a way to maintain backwards compatibility. - /// - public const int STRING_TABLE_VERSION = 1; + /// + /// Represents a document encoded in BSON. + /// + internal class BsonDocument + { + /// + /// The current string table version. + /// At some point we might want to make modifications to the format, + /// and we'll want a way to maintain backwards compatibility. + /// + public const int STRING_TABLE_VERSION = 1; - /// - /// The top item of this BSON document. - /// - public BsonItem Top; + /// + /// The top item of this BSON document. + /// + public BsonItem Top; - /// - /// Retreives the value of the given key if it exists. - /// - /// The key to retrieve. - /// The value of the given key, or null if it does not exist. - public BsonItem this[string key] - { - get - { - if(Top.HasKey(key)) - return Top[key]; - return null; - } - set - { - Top[key] = value; - } - } + /// + /// Retreives the value of the given key if it exists. + /// + /// The key to retrieve. + /// The value of the given key, or null if it does not exist. + public BsonItem this[string key] + { + get + { + if (Top.HasKey(key)) + return Top[key]; + return null; + } + set + { + Top[key] = value; + } + } - public BsonStringTableMode StringTableMode => _stringTableMode; + public BsonStringTableMode StringTableMode => _stringTableMode; - public Dictionary ReverseStringTable => _reverseStringTable; + public Dictionary ReverseStringTable => _reverseStringTable; - private Dictionary _stringTable; - private Dictionary _reverseStringTable; // for reading - private int _stringTableIndex = 0; - private BsonStringTableMode _stringTableMode = BsonStringTableMode.None; + private Dictionary _stringTable; + private Dictionary _reverseStringTable; // for reading + private int _stringTableIndex = 0; + private BsonStringTableMode _stringTableMode = BsonStringTableMode.None; - /// - /// Creates an empty BSON document. - /// Whether or not to generate and use a string table. - /// - public BsonDocument( - BsonStringTableMode mode = BsonStringTableMode.None, - Dictionary reverseStringTable = null) - { - _stringTableMode = mode; - _stringTable = new Dictionary(); - _reverseStringTable = reverseStringTable; - Top = new BsonItem(); - } - - /// - /// Returns this document encoded in BSON as a byte array. - /// - /// This document converted to BSON. - public byte[] ToByteArray(bool includeStringTable = false) - { - var stream = new MemoryStream(); - Write(stream, includeStringTable); - stream.Close(); - return stream.ToArray(); - } + /// + /// Creates an empty BSON document. + /// Whether or not to generate and use a string table. + /// + public BsonDocument( + BsonStringTableMode mode = BsonStringTableMode.None, + Dictionary reverseStringTable = null) + { + _stringTableMode = mode; + _stringTable = new Dictionary(); + _reverseStringTable = reverseStringTable; + Top = new BsonItem(); + } - public byte[] GenerateStringTable() - { - var stream = new MemoryStream(); - var writer = new EasyWriter(stream); - writer.Write(_stringTable.Count); - foreach(string key in _stringTable.Keys) - { - writer.Write(_stringTable[key]); - writer.Write(key, Encoding.UTF8); - } - writer.Close(); - stream.Close(); - return stream.ToArray(); - } + /// + /// Returns this document encoded in BSON as a byte array. + /// + /// This document converted to BSON. + public byte[] ToByteArray(bool includeStringTable = false) + { + var stream = new MemoryStream(); + Write(stream, includeStringTable); + stream.Close(); + return stream.ToArray(); + } - /// - /// Writes this BSON document to the specified path. - /// - /// The path to write to. - public void Write(string path, bool includeStringTable = false) - { - var stream = File.Open(path, FileMode.Create); - var writer = new EasyWriter(stream); - Write(writer); - writer.Close(); - stream.Close(); - } + public byte[] GenerateStringTable() + { + var stream = new MemoryStream(); + var writer = new EasyWriter(stream); + writer.Write(_stringTable.Count); + foreach (string key in _stringTable.Keys) + { + writer.Write(_stringTable[key]); + writer.Write(key, Encoding.UTF8); + } + writer.Close(); + stream.Close(); + return stream.ToArray(); + } - /// - /// Writes this document as BSON to the specified stream. - /// - /// The stream that will be written to. - public void Write(Stream stream, bool includeStringTable = false) - { - var memoryStream = new MemoryStream(); - using (var writer = new EasyWriter(memoryStream)) - { - Write(writer); - } - memoryStream.Close(); - var bytes = memoryStream.ToArray(); - var tableWriter = new EasyWriter(stream); - WriteStringTable(tableWriter, includeStringTable); - stream.Write(bytes, 0, bytes.Length); - } + /// + /// Writes this BSON document to the specified path. + /// + /// The path to write to. + public void Write(string path, bool includeStringTable = false) + { + var stream = File.Open(path, FileMode.Create); + var writer = new EasyWriter(stream); + Write(writer); + writer.Close(); + stream.Close(); + } - /// - /// Writes this document using the specified EasyWriter. - /// - /// The writer that will be used to write this document. - internal void Write(EasyWriter writer) - { - _stringTableIndex = 0; - _stringTable.Clear(); - WriteItem(writer, Top, null, true); - writer.Close(); - } + /// + /// Writes this document as BSON to the specified stream. + /// + /// The stream that will be written to. + public void Write(Stream stream, bool includeStringTable = false) + { + var memoryStream = new MemoryStream(); + using (var writer = new EasyWriter(memoryStream)) + { + Write(writer); + } + memoryStream.Close(); + var bytes = memoryStream.ToArray(); + var tableWriter = new EasyWriter(stream); + WriteStringTable(tableWriter, includeStringTable); + stream.Write(bytes, 0, bytes.Length); + } - internal void WriteStringTable(EasyWriter writer, bool include) - { - writer.Write(include); - if (include) - { - writer.Write((byte)_stringTableMode); - writer.Write((byte)STRING_TABLE_VERSION); - var stringTableBytes = GenerateStringTable(); - writer.Write(stringTableBytes.Length); - writer.Write(stringTableBytes); - } - } + /// + /// Writes this document using the specified EasyWriter. + /// + /// The writer that will be used to write this document. + internal void Write(EasyWriter writer) + { + _stringTableIndex = 0; + _stringTable.Clear(); + WriteItem(writer, Top, null, true); + writer.Close(); + } - private void WriteItem(EasyWriter writer, BsonItem item, string name, bool isTop = false, bool isArray = false) - { - if(!isTop) - { - writer.Write(item.Type); - writer.Write(isArray ? name : GetKeyName(name), Encoding.UTF8, true); - } + internal void WriteStringTable(EasyWriter writer, bool include) + { + writer.Write(include); + if (include) + { + writer.Write((byte)_stringTableMode); + writer.Write((byte)STRING_TABLE_VERSION); + var stringTableBytes = GenerateStringTable(); + writer.Write(stringTableBytes.Length); + writer.Write(stringTableBytes); + } + } - if (item.HasValues) // object or array - we need to write a document - { - var stream = new MemoryStream(); - var vWriter = new EasyWriter(stream); - foreach(string key in item.Keys) - WriteItem(vWriter, item[key], key, false, item.IsArray); - vWriter.Close(); - var data = stream.ToArray(); - // length of data + length of length + null terminator - writer.Write(data.Length + 4 + 1); - writer.Write(data); - writer.Write((byte)0x00); - return; - } + private void WriteItem(EasyWriter writer, BsonItem item, string name, bool isTop = false, bool isArray = false) + { + if (!isTop) + { + writer.Write(item.Type); + writer.Write(isArray ? name : GetKeyName(name), Encoding.UTF8, true); + } - switch(item.Type) - { - case 0x01: // double - writer.Write((double)item.Value); - break; - case 0x02: // string - var bytes = Encoding.UTF8.GetBytes(GetKeyName((string)item.Value, true)); - writer.Write(bytes.Length + 1); // includes null terminator - writer.WriteBytes(bytes); - writer.Write((byte)0x00); - break; - case 0x05: // binary - var byteArray = (byte[])item.Value; - writer.Write(byteArray.Length); - writer.Write((byte)0x00); - writer.Write(byteArray); - break; - case 0x07: // objectid - writer.Write((byte[])item.Value); - break; - case 0x08: // bool - writer.Write((bool)item.Value); - break; - case 0x09: // UTC datetime - case 0x11: // timestamp - case 0x12: // 64 bit int - writer.Write((long)item.Value); - break; - case 0x10: // 32 bit int - writer.Write((int)item.Value); - break; - default: - throw new NotSupportedException($"Item type {item.Type} not supported."); - } - } + if (item.HasValues) // object or array - we need to write a document + { + var stream = new MemoryStream(); + var vWriter = new EasyWriter(stream); + foreach (string key in item.Keys) + WriteItem(vWriter, item[key], key, false, item.IsArray); + vWriter.Close(); + var data = stream.ToArray(); + // length of data + length of length + null terminator + writer.Write(data.Length + 4 + 1); + writer.Write(data); + writer.Write((byte)0x00); + return; + } - /// - /// Determines the correct name for the provided key. - /// This will return the string table key instead if it's enabled. - /// - /// The name of the key. - /// The correct name for the provided key. - private string GetKeyName(string name, bool value = false) - { - if (_stringTableMode == BsonStringTableMode.None || - value && _stringTableMode == BsonStringTableMode.Keys) - return name; - if (_stringTable.ContainsKey(name)) - return _stringTable[name].ToString(); - _stringTable[name] = _stringTableIndex++; - return _stringTable[name].ToString(); - } + switch (item.Type) + { + case 0x01: // double + writer.Write((double)item.Value); + break; + case 0x02: // string + var bytes = Encoding.UTF8.GetBytes(GetKeyName((string)item.Value, true)); + writer.Write(bytes.Length + 1); // includes null terminator + writer.WriteBytes(bytes); + writer.Write((byte)0x00); + break; + case 0x05: // binary + var byteArray = (byte[])item.Value; + writer.Write(byteArray.Length); + writer.Write((byte)0x00); + writer.Write(byteArray); + break; + case 0x07: // objectid + writer.Write((byte[])item.Value); + break; + case 0x08: // bool + writer.Write((bool)item.Value); + break; + case 0x09: // UTC datetime + case 0x11: // timestamp + case 0x12: // 64 bit int + writer.Write((long)item.Value); + break; + case 0x10: // 32 bit int + writer.Write((int)item.Value); + break; + default: + throw new NotSupportedException($"Item type {item.Type} not supported."); + } + } - /// - /// Reads a BSON document from the specified byte array. - /// - /// The byte array that this document will be read from. - /// The document that was read. - public static BsonDocument Read(byte[] data) - { - return Read(new EasyReader(data)); - } + /// + /// Determines the correct name for the provided key. + /// This will return the string table key instead if it's enabled. + /// + /// The name of the key. + /// The correct name for the provided key. + private string GetKeyName(string name, bool value = false) + { + if (_stringTableMode == BsonStringTableMode.None || + value && _stringTableMode == BsonStringTableMode.Keys) + return name; + if (_stringTable.ContainsKey(name)) + return _stringTable[name].ToString(); + _stringTable[name] = _stringTableIndex++; + return _stringTable[name].ToString(); + } - /// - /// Reads a BSON document from the specified stream. - /// - /// The stream that this document will be read from. - /// The document that was read. - public static BsonDocument Read(Stream data) - { - return Read(new EasyReader(data)); - } + /// + /// Reads a BSON document from the specified byte array. + /// + /// The byte array that this document will be read from. + /// The document that was read. + public static BsonDocument Read(byte[] data) + { + return Read(new EasyReader(data)); + } - /// - /// Reads a BSON document from the specified EasyReader. - /// - /// The reader that will be used to read this document. - /// The document that was read. - internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) - { - var stringTableMode = BsonStringTableMode.None; - Dictionary stringTable = null; - if (parent == null) - { - var includesStringTable = reader.ReadBoolean(); - if (includesStringTable) - { - stringTable = new Dictionary(); - stringTableMode = (BsonStringTableMode)reader.ReadByte(); - var version = reader.ReadByte(); - if (version != STRING_TABLE_VERSION) - throw new InvalidDataException("Unsupported string table version: " + version); - var tableLength = reader.ReadInt32(); - var tableEntries = reader.ReadInt32(); - for (var i = 0; i < tableEntries; i++) - { - var num = reader.ReadInt32(); - var val = reader.ReadString(Encoding.UTF8); - stringTable[num] = val; - } - } - } - else - { - stringTable = parent.ReverseStringTable; - stringTableMode = parent.StringTableMode; - } - var document = new BsonDocument(stringTableMode, stringTable); + /// + /// Reads a BSON document from the specified stream. + /// + /// The stream that this document will be read from. + /// The document that was read. + public static BsonDocument Read(Stream data) + { + return Read(new EasyReader(data)); + } - var length = reader.ReadInt32(); - while(!reader.EndOfStream) - { - var code = reader.ReadByte(); - if (code == 0x00) // end of document - break; - var name = reader.ReadCString(); - if (!inArray && document.StringTableMode != BsonStringTableMode.None) - name = document.ReverseStringTable[int.Parse(name)]; - var data = ReadItem(code, document, reader); - document.Top[name] = data; - } - return document; - } + /// + /// Reads a BSON document from the specified EasyReader. + /// + /// The reader that will be used to read this document. + /// The document that was read. + internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) + { + var stringTableMode = BsonStringTableMode.None; + Dictionary stringTable = null; + if (parent == null) + { + var includesStringTable = reader.ReadBoolean(); + if (includesStringTable) + { + stringTable = new Dictionary(); + stringTableMode = (BsonStringTableMode)reader.ReadByte(); + var version = reader.ReadByte(); + if (version != STRING_TABLE_VERSION) + throw new InvalidDataException("Unsupported string table version: " + version); + var tableLength = reader.ReadInt32(); + var tableEntries = reader.ReadInt32(); + for (var i = 0; i < tableEntries; i++) + { + var num = reader.ReadInt32(); + var val = reader.ReadString(Encoding.UTF8); + stringTable[num] = val; + } + } + } + else + { + stringTable = parent.ReverseStringTable; + stringTableMode = parent.StringTableMode; + } + var document = new BsonDocument(stringTableMode, stringTable); - private static BsonItem ReadItem(byte code, BsonDocument document, EasyReader reader) - { - object val = null; - switch (code) - { - case 0x01: // double - val = reader.ReadDouble(); - break; - case 0x02: // string - val = reader.ReadString(Encoding.UTF8).TrimEnd('\x00'); - if (document.StringTableMode == BsonStringTableMode.KeysAndValues) - val = document.ReverseStringTable[int.Parse((string)val)]; - break; - case 0x03: // document - val = Read(reader, document).Top; - break; - case 0x04: // array - val = Read(reader, document, true).Top; - break; - case 0x05: // binary - var length = reader.ReadInt32(); - var subtype = reader.ReadByte(); - if (subtype != 0x00) - throw new NotSupportedException("BSON subtypes other than 'generic binary data' are not supported."); - val = reader.ReadBytes(length); - break; - case 0x06: // undefined - break; - case 0x07: // ObjectId - // why does this parser support ObjectIds and not other binary data? - // shhhhh - val = Encoding.ASCII.GetString(reader.ReadBytes(12)); - break; - case 0x08: // boolean - val = reader.ReadBoolean(); - break; - case 0x09: // UTC datetime - val = reader.ReadInt64(); - break; - case 0x0A: // null - break; - case 0x0B: // regex - // why are you using regex in a Rant package? - throw new NotSupportedException("Regular expressions are not supported."); - case 0x0C: // db pointer - throw new NotSupportedException("DB pointers are not supported."); - case 0x0D: // Javascript code - case 0x0F: // JS code with scope - throw new NotSupportedException("Javascript in BSON is not supported."); - case 0x0E: // depreceated - val = reader.ReadString(Encoding.UTF8); - break; - case 0x10: // 32 bit integer - val = reader.ReadInt32(); - break; - case 0x11: // timestamp - case 0x12: // 64 bit integer - val = reader.ReadInt64(); - break; - case 0xFF: // min key - case 0x7F: // max key - // we don't care about these so let's just skip em - break; - } - if (!(val is BsonItem)) - return new BsonItem(val) { Type = code }; - var i = (BsonItem)val; - i.Type = code; - return i; - } - } + var length = reader.ReadInt32(); + while (!reader.EndOfStream) + { + var code = reader.ReadByte(); + if (code == 0x00) // end of document + break; + var name = reader.ReadCString(); + if (!inArray && document.StringTableMode != BsonStringTableMode.None) + name = document.ReverseStringTable[int.Parse(name)]; + var data = ReadItem(code, document, reader); + document.Top[name] = data; + } + return document; + } + + private static BsonItem ReadItem(byte code, BsonDocument document, EasyReader reader) + { + object val = null; + switch (code) + { + case 0x01: // double + val = reader.ReadDouble(); + break; + case 0x02: // string + val = reader.ReadString(Encoding.UTF8).TrimEnd('\x00'); + if (document.StringTableMode == BsonStringTableMode.KeysAndValues) + val = document.ReverseStringTable[int.Parse((string)val)]; + break; + case 0x03: // document + val = Read(reader, document).Top; + break; + case 0x04: // array + val = Read(reader, document, true).Top; + break; + case 0x05: // binary + var length = reader.ReadInt32(); + var subtype = reader.ReadByte(); + if (subtype != 0x00) + throw new NotSupportedException("BSON subtypes other than 'generic binary data' are not supported."); + val = reader.ReadBytes(length); + break; + case 0x06: // undefined + break; + case 0x07: // ObjectId + // why does this parser support ObjectIds and not other binary data? + // shhhhh + val = Encoding.ASCII.GetString(reader.ReadBytes(12)); + break; + case 0x08: // boolean + val = reader.ReadBoolean(); + break; + case 0x09: // UTC datetime + val = reader.ReadInt64(); + break; + case 0x0A: // null + break; + case 0x0B: // regex + // why are you using regex in a Rant package? + throw new NotSupportedException("Regular expressions are not supported."); + case 0x0C: // db pointer + throw new NotSupportedException("DB pointers are not supported."); + case 0x0D: // Javascript code + case 0x0F: // JS code with scope + throw new NotSupportedException("Javascript in BSON is not supported."); + case 0x0E: // depreceated + val = reader.ReadString(Encoding.UTF8); + break; + case 0x10: // 32 bit integer + val = reader.ReadInt32(); + break; + case 0x11: // timestamp + case 0x12: // 64 bit integer + val = reader.ReadInt64(); + break; + case 0xFF: // min key + case 0x7F: // max key + // we don't care about these so let's just skip em + break; + } + if (!(val is BsonItem)) + return new BsonItem(val) { Type = code }; + var i = (BsonItem)val; + i.Type = code; + return i; + } + } } diff --git a/Rant/Core/IO/Bson/BsonItem.cs b/Rant/Core/IO/Bson/BsonItem.cs index d7c6005..7c6ba93 100644 --- a/Rant/Core/IO/Bson/BsonItem.cs +++ b/Rant/Core/IO/Bson/BsonItem.cs @@ -4,252 +4,252 @@ namespace Rant.Core.IO.Bson { - /// - /// One item in a BSON document. - /// - internal class BsonItem - { - private Dictionary _objectValues; - private object _value; - private bool _typeSet = false; - private byte _type = 0; - - public bool IsArray => _type == 0x04; - - /// - /// The BSON type code of this object. If not explicitly specified, it will guess. - /// - public byte Type - { - get - { - if (!_typeSet) - DetermineType(); - - return _type; - } - set - { - _typeSet = true; - _type = value; - } - } - - /// - /// The value of this item, if it is not a document or array. - /// - public object Value - { - get { return _value ?? _objectValues; } - set - { - _value = value; - DetermineType(); - PossiblyCreateArray(); - } - } - - /// - /// Whether or not this item has sub values (is a document or array). - /// - public bool HasValues - { - get { return _value == null; } - } - - /// - /// Creates a new BsonItem with the specified value. - /// - /// The value of this BSON item. - public BsonItem(object value) - { - _value = value; - _objectValues = new Dictionary(); - PossiblyCreateArray(); - } - - /// - /// Converts this BsonItem to a double. - /// - /// The BsonItem to convert. - public static implicit operator double(BsonItem a) - { - return (double)a.Value; - } - - /// - /// Convers this BsonItem to a string. - /// - /// The BsonItem to convert. - public static implicit operator string(BsonItem a) - { - if (a == null) - return null; - return (string)a.Value; - } - - public static explicit operator string[](BsonItem a) - { - if (a == null) - return new string[] { }; - return a.ToValueArray().Cast().ToArray(); - } - - /// - /// Converts this double to a BsonItem. - /// - /// The double to convert. - public static implicit operator BsonItem(double a) - { - return new BsonItem(a); - } - - /// - /// Converts this string to a BsonItem. - /// - /// The string to convert. - public static implicit operator BsonItem(string a) - { - return new BsonItem(a); - } - - /// - /// Converts this bool to a BsonItem. - /// - /// The bool to convert. - public static implicit operator BsonItem(bool a) - { - return new BsonItem(a); - } - - /// - /// Converts this int to a BsonItem. - /// - /// The int to convert. - public static implicit operator BsonItem(int a) - { - return new BsonItem(a); - } - - /// - /// Converts this long to a BsonItem. - /// - /// The long to convert. - public static implicit operator BsonItem(long a) - { - return new BsonItem(a); - } - - /// - /// Creates a new empty BsonItem. - /// - public BsonItem() - { - _value = null; - _objectValues = new Dictionary(); - } - - /// - /// Checks whether or not this item has the specified key. - /// - /// The key to check for. - /// Whether or not this item has the specified key. - public bool HasKey(string key) - { - return _objectValues.ContainsKey(key); - } - - /// - /// The number of items in this BsonItem, if it's a collection. - /// - public int Count => _objectValues.Keys.Count; - - /// - /// An array of the keys in this BsonItem. - /// - public string[] Keys => _objectValues.Keys.ToArray(); - - /// - /// Accesses the value of the specified key. - /// - /// The key whose value will be accessed. - /// The value of the specified key. - public BsonItem this[string key] - { - get - { - if (!HasKey(key)) - return null; - return _objectValues[key]; - } - set { _objectValues[key] = value; } - } - - /// - /// Accesses the value of the specified key. - /// - /// The key whose value will be accessed. - /// The value of the specified key. - public BsonItem this[int key] - { - get { return _objectValues[key.ToString()]; } - set { _objectValues[key.ToString()] = value; } - } - - public object[] ToValueArray() - { - if (!IsArray) - throw new Exception("Can't convert a non-array to an array."); - var list = new List(); - for (var i = 0; i < Count; i++) - list.Add(this[i].Value); - return list.ToArray(); - } - - private void PossiblyCreateArray() - { - if (_value == null) return; - var type = _value.GetType(); - if (!type.IsArray) return; - var arr = (object[])_value; - _type = 0x04; // array - _typeSet = true; - _objectValues = new Dictionary(); - _value = null; - for (var i = 0; i < arr.Length; i++) - { - _objectValues[i.ToString()] = ( - arr[i] is BsonItem ? - (BsonItem)arr[i] : - new BsonItem(arr[i]) - ); - } - } - - private void DetermineType() - { - if(_value == null) - { - _type = 0x03; // document - return; - } - - // i apologize for this if statement - - if (_value is double || _value is float) - _type = 0x01; - else if (_value is string) - _type = 0x02; - else if (_value is byte[]) - _type = 0x05; - else if (_value is bool) - _type = 0x08; - else if (_value is long) - _type = 0x09; - else if (_value is int) - _type = 0x10; - else - _type = 0x00; - } - } + /// + /// One item in a BSON document. + /// + internal class BsonItem + { + private Dictionary _objectValues; + private object _value; + private bool _typeSet = false; + private byte _type = 0; + + public bool IsArray => _type == 0x04; + + /// + /// The BSON type code of this object. If not explicitly specified, it will guess. + /// + public byte Type + { + get + { + if (!_typeSet) + DetermineType(); + + return _type; + } + set + { + _typeSet = true; + _type = value; + } + } + + /// + /// The value of this item, if it is not a document or array. + /// + public object Value + { + get { return _value ?? _objectValues; } + set + { + _value = value; + DetermineType(); + PossiblyCreateArray(); + } + } + + /// + /// Whether or not this item has sub values (is a document or array). + /// + public bool HasValues + { + get { return _value == null; } + } + + /// + /// Creates a new BsonItem with the specified value. + /// + /// The value of this BSON item. + public BsonItem(object value) + { + _value = value; + _objectValues = new Dictionary(); + PossiblyCreateArray(); + } + + /// + /// Converts this BsonItem to a double. + /// + /// The BsonItem to convert. + public static implicit operator double(BsonItem a) + { + return (double)a.Value; + } + + /// + /// Convers this BsonItem to a string. + /// + /// The BsonItem to convert. + public static implicit operator string(BsonItem a) + { + if (a == null) + return null; + return (string)a.Value; + } + + public static explicit operator string[] (BsonItem a) + { + if (a == null) + return new string[] { }; + return a.ToValueArray().Cast().ToArray(); + } + + /// + /// Converts this double to a BsonItem. + /// + /// The double to convert. + public static implicit operator BsonItem(double a) + { + return new BsonItem(a); + } + + /// + /// Converts this string to a BsonItem. + /// + /// The string to convert. + public static implicit operator BsonItem(string a) + { + return new BsonItem(a); + } + + /// + /// Converts this bool to a BsonItem. + /// + /// The bool to convert. + public static implicit operator BsonItem(bool a) + { + return new BsonItem(a); + } + + /// + /// Converts this int to a BsonItem. + /// + /// The int to convert. + public static implicit operator BsonItem(int a) + { + return new BsonItem(a); + } + + /// + /// Converts this long to a BsonItem. + /// + /// The long to convert. + public static implicit operator BsonItem(long a) + { + return new BsonItem(a); + } + + /// + /// Creates a new empty BsonItem. + /// + public BsonItem() + { + _value = null; + _objectValues = new Dictionary(); + } + + /// + /// Checks whether or not this item has the specified key. + /// + /// The key to check for. + /// Whether or not this item has the specified key. + public bool HasKey(string key) + { + return _objectValues.ContainsKey(key); + } + + /// + /// The number of items in this BsonItem, if it's a collection. + /// + public int Count => _objectValues.Keys.Count; + + /// + /// An array of the keys in this BsonItem. + /// + public string[] Keys => _objectValues.Keys.ToArray(); + + /// + /// Accesses the value of the specified key. + /// + /// The key whose value will be accessed. + /// The value of the specified key. + public BsonItem this[string key] + { + get + { + if (!HasKey(key)) + return null; + return _objectValues[key]; + } + set { _objectValues[key] = value; } + } + + /// + /// Accesses the value of the specified key. + /// + /// The key whose value will be accessed. + /// The value of the specified key. + public BsonItem this[int key] + { + get { return _objectValues[key.ToString()]; } + set { _objectValues[key.ToString()] = value; } + } + + public object[] ToValueArray() + { + if (!IsArray) + throw new Exception("Can't convert a non-array to an array."); + var list = new List(); + for (var i = 0; i < Count; i++) + list.Add(this[i].Value); + return list.ToArray(); + } + + private void PossiblyCreateArray() + { + if (_value == null) return; + var type = _value.GetType(); + if (!type.IsArray) return; + var arr = (object[])_value; + _type = 0x04; // array + _typeSet = true; + _objectValues = new Dictionary(); + _value = null; + for (var i = 0; i < arr.Length; i++) + { + _objectValues[i.ToString()] = ( + arr[i] is BsonItem ? + (BsonItem)arr[i] : + new BsonItem(arr[i]) + ); + } + } + + private void DetermineType() + { + if (_value == null) + { + _type = 0x03; // document + return; + } + + // i apologize for this if statement + + if (_value is double || _value is float) + _type = 0x01; + else if (_value is string) + _type = 0x02; + else if (_value is byte[]) + _type = 0x05; + else if (_value is bool) + _type = 0x08; + else if (_value is long) + _type = 0x09; + else if (_value is int) + _type = 0x10; + else + _type = 0x00; + } + } } diff --git a/Rant/Core/IO/Bson/BsonStringTableMode.cs b/Rant/Core/IO/Bson/BsonStringTableMode.cs index c7c851a..3f1292a 100644 --- a/Rant/Core/IO/Bson/BsonStringTableMode.cs +++ b/Rant/Core/IO/Bson/BsonStringTableMode.cs @@ -1,9 +1,9 @@ namespace Rant.Core.IO.Bson { - public enum BsonStringTableMode - { - None = 0, - Keys = 1, - KeysAndValues = 2 - } + public enum BsonStringTableMode + { + None = 0, + Keys = 1, + KeysAndValues = 2 + } } diff --git a/Rant/Core/IO/Compression/EasyCompressor.cs b/Rant/Core/IO/Compression/EasyCompressor.cs index 8e94fd7..6b6b3f5 100644 --- a/Rant/Core/IO/Compression/EasyCompressor.cs +++ b/Rant/Core/IO/Compression/EasyCompressor.cs @@ -3,71 +3,71 @@ namespace Rant.Core.IO.Compression { - internal static class EasyCompressor - { - internal delegate void ProgressUpdateEvent(object sender, CompressionProgressEventArgs e); - internal static event ProgressUpdateEvent ProgressUpdate; + internal static class EasyCompressor + { + internal delegate void ProgressUpdateEvent(object sender, CompressionProgressEventArgs e); + internal static event ProgressUpdateEvent ProgressUpdate; - public static byte[] Compress(byte[] data) - { - var inStream = new MemoryStream(data); - var stream = new MemoryStream(); + public static byte[] Compress(byte[] data) + { + var inStream = new MemoryStream(data); + var stream = new MemoryStream(); - var enc = new LZMA.Encoder(); + var enc = new LZMA.Encoder(); - enc.WriteCoderProperties(stream); - EasyCompressorProgress progress = null; - if(ProgressUpdate != null) - progress = new EasyCompressorProgress(ProgressUpdate); - long dataSize = data.Length; - for (int i = 0; i < 8; i++) - stream.WriteByte((byte)(dataSize >> (8 * i))); - enc.Code(inStream, stream, data.Length, -1, progress); - inStream.Close(); - stream.Close(); - return stream.ToArray(); - } + enc.WriteCoderProperties(stream); + EasyCompressorProgress progress = null; + if (ProgressUpdate != null) + progress = new EasyCompressorProgress(ProgressUpdate); + long dataSize = data.Length; + for (int i = 0; i < 8; i++) + stream.WriteByte((byte)(dataSize >> (8 * i))); + enc.Code(inStream, stream, data.Length, -1, progress); + inStream.Close(); + stream.Close(); + return stream.ToArray(); + } - public static byte[] Decompress(byte[] data) - { - var inStream = new MemoryStream(data); - var outStream = new MemoryStream(); - - var dec = new LZMA.Decoder(); - EasyCompressorProgress progress = null; - if (ProgressUpdate != null) - progress = new EasyCompressorProgress(ProgressUpdate); - byte[] props = new byte[5]; - inStream.Read(props, 0, 5); - dec.SetDecoderProperties(props); - long outSize = 0; - for (int i = 0; i < 8; i++) - outSize |= ((long)(byte)inStream.ReadByte()) << (8 * i); - long compressedSize = inStream.Length - inStream.Position; - dec.Code(inStream, outStream, compressedSize, outSize, progress); - inStream.Close(); - outStream.Close(); - return outStream.ToArray(); - } - } + public static byte[] Decompress(byte[] data) + { + var inStream = new MemoryStream(data); + var outStream = new MemoryStream(); - internal class EasyCompressorProgress : ICodeProgress - { - private EasyCompressor.ProgressUpdateEvent _handler; + var dec = new LZMA.Decoder(); + EasyCompressorProgress progress = null; + if (ProgressUpdate != null) + progress = new EasyCompressorProgress(ProgressUpdate); + byte[] props = new byte[5]; + inStream.Read(props, 0, 5); + dec.SetDecoderProperties(props); + long outSize = 0; + for (int i = 0; i < 8; i++) + outSize |= ((long)(byte)inStream.ReadByte()) << (8 * i); + long compressedSize = inStream.Length - inStream.Position; + dec.Code(inStream, outStream, compressedSize, outSize, progress); + inStream.Close(); + outStream.Close(); + return outStream.ToArray(); + } + } - internal EasyCompressorProgress(EasyCompressor.ProgressUpdateEvent handler) - { - _handler = handler; - } + internal class EasyCompressorProgress : ICodeProgress + { + private EasyCompressor.ProgressUpdateEvent _handler; - public void SetProgress(long inSize, long outSize) - { - _handler.Invoke(null, new CompressionProgressEventArgs() { Progress = inSize / outSize }); - } - } + internal EasyCompressorProgress(EasyCompressor.ProgressUpdateEvent handler) + { + _handler = handler; + } - internal class CompressionProgressEventArgs : EventArgs - { - public double Progress; - } + public void SetProgress(long inSize, long outSize) + { + _handler.Invoke(null, new CompressionProgressEventArgs() { Progress = inSize / outSize }); + } + } + + internal class CompressionProgressEventArgs : EventArgs + { + public double Progress; + } } diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 9ba496d..6d39d45 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -14,6 +14,8 @@ using Rant.Resources; using Rant.Vocabulary.Querying; +using static Rant.Localization.Txtres; + namespace Rant.Core { /// @@ -295,11 +297,11 @@ public RantOutput Run(double timeout, RantPattern pattern = null) { if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) throw new RantRuntimeException(pattern, action.Current.Range, - $"The pattern has timed out ({timeout}s)."); + GetString("err-pattern-timeout", timeout)); if (callStack.Count >= RantEngine.MaxStackSize) throw new RantRuntimeException(pattern, action.Current.Range, - $"Exceeded the maximum stack size ({RantEngine.MaxStackSize})."); + GetString("err-stack-overflow", RantEngine.MaxStackSize)); if (action.Current == null) break; @@ -353,11 +355,11 @@ public IEnumerable RunSerial(double timeout, RantPattern pattern = n { if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) throw new RantRuntimeException(pattern, action.Current.Range, - $"The pattern has timed out ({timeout}s)."); + GetString("err-pattern-timeout", timeout)); if (callStack.Count >= RantEngine.MaxStackSize) throw new RantRuntimeException(pattern, action.Current.Range, - $"Exceeded the maximum stack size ({RantEngine.MaxStackSize})."); + GetString("err-stack-overflow", RantEngine.MaxStackSize)); if (action.Current == null) break; diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 643bfa5..eb3c78d 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -1,16 +1,19 @@ -untitled-package="Unbenanntes Paket" -default-package-id="Paket" +untitled-package = "Unbenanntes Paket" +default-package-id = "Paket" -err-zero-or-negative="Wert muss größer als null sein." -err-empty-path="Der Dateipfad kann nicht leer oder NULL sein." -err-unresolvable-package="Das Paket '{0}' konnte nicht den Verweis '{1}' auflösen." -err-invalid-package-version="Diese Paketversion ({0}) ist nicht unterstützt." -err-missing-package-meta="Dieses Paket hat keine Metadaten." -err-empty-pkg-title="Der Pakettitel muss nicht leer sein." -err-empty-pkg-id="Der Paketbezeichner (ID) muss nicht leer sein." -err-file-corrupt="Die Datei ist fehlerhaft oder das Datenformat ist nicht unterstützt." -err-invalid-tablename="Ungültiger Tabellename: {0}" -err-invalid-subtypes="Ein oder mehrere der angegebenen Subtypnamen sind ungültig: {0}" +err-zero-or-negative = "Wert muss größer als null sein." +err-empty-path = "Der Dateipfad kann nicht leer oder NULL sein." +err-unresolvable-package = "Das Paket '{0}' konnte nicht den Verweis '{1}' auflösen." +err-invalid-package-version = "Diese Paketversion ({0}) ist nicht unterstützt." +err-missing-package-meta = "Dieses Paket hat keine Metadaten." +err-empty-pkg-title = "Der Pakettitel muss nicht leer sein." +err-empty-pkg-id = "Der Paketbezeichner (ID) muss nicht leer sein." +err-file-corrupt = "Die Datei ist fehlerhaft oder das Datenformat wird nicht unterstützt." +err-invalid-tablename = "Ungültiger Tabellename: {0}" +err-invalid-subtypes = "Ein oder mehrere der angegebenen Subtypnamen sind ungültig: {0}" -missing-table="[Fehlende Tabelle]" -bad-subtype="[Ungültiger Subtyp]" \ No newline at end of file +err-pattern-timeout = "Die Ausführung ist abgelaufen ({0} Sekunden)." +err-stack-overflow = "Die Stapelspeicherbegrenzung ist übergelaufen ({0})." + +missing-table = "[Fehlende Tabelle]" +bad-subtype = "[Ungültiger Subtyp]" \ No newline at end of file diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index f1e46d2..3542b02 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -1,16 +1,19 @@ -untitled-package="Untitled Package" -default-package-id="Package" +untitled-package = "Untitled Package" +default-package-id = "Package" -err-zero-or-negative="Value must be greater than zero." -err-empty-path="File path cannot be null or empty." -err-unresolvable-package="Package '{0}' was unable to resolve dependency '{1}'" -err-invalid-package-version="Unsupported package version: {0}" -err-missing-package-meta="Loaded package is missing metadata." -err-empty-pkg-title="The package title cannot be empty." -err-empty-pkg-id="The package ID cannot be empty." -err-file-corrupt="File is corrupt or in an unsupported/unrecognized format." -err-invalid-tablename="Invalid table name: {0}" -err-invalid-subtypes="Invalid subtype name(s) found: {0}" +err-zero-or-negative = "Value must be greater than zero." +err-empty-path = "File path cannot be null or empty." +err-unresolvable-package = "Package '{0}' was unable to resolve dependency '{1}'" +err-invalid-package-version = "Unsupported package version: {0}" +err-missing-package-meta = "Loaded package is missing metadata." +err-empty-pkg-title = "The package title cannot be empty." +err-empty-pkg-id = "The package ID cannot be empty." +err-file-corrupt = "File is corrupt or in an unsupported/unrecognized format." +err-invalid-tablename = "Invalid table name: {0}" +err-invalid-subtypes = "Invalid subtype name(s) found: {0}" -missing-table="[Missing Table]" -bad-subtype="[Bad Subtype]" \ No newline at end of file +err-pattern-timeout = "The pattern execution timed out ({0} seconds)." +err-stack-overflow = "Exceeded the maximum stack size ({0})." + +missing-table = "[Missing Table]" +bad-subtype = "[Bad Subtype]" \ No newline at end of file diff --git a/Rant/RantArgAttribute.cs b/Rant/RantArgAttribute.cs index 5fd629d..e04fc98 100644 --- a/Rant/RantArgAttribute.cs +++ b/Rant/RantArgAttribute.cs @@ -2,10 +2,21 @@ namespace Rant { + /// + /// Attribute used to change the name of an argument pulled from a field or property. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class RantArgAttribute : Attribute { + /// + /// The new name to assign to the argument. + /// public string Name { get; } + /// + /// Creates a new RantArgAttribute with the specified name. + /// + /// The new name to assign to the argument. public RantArgAttribute(string name) { if (name == null) throw new ArgumentNullException(nameof(name)); From e384da456c7d61a39813c190bf43d2009969ea86 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 19:07:22 -0500 Subject: [PATCH 017/213] Fix bugs in Txtres --- Rant.Tests/Rant.Tests.csproj | 1 + Rant.Tests/StringLocalization.cs | 18 ++++++++++++++++++ Rant/Localization/Txtres.cs | 12 ++++++++++-- Rant/Localization/de-DE.lang | 2 +- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 Rant.Tests/StringLocalization.cs diff --git a/Rant.Tests/Rant.Tests.csproj b/Rant.Tests/Rant.Tests.csproj index 0c317b0..85af86b 100644 --- a/Rant.Tests/Rant.Tests.csproj +++ b/Rant.Tests/Rant.Tests.csproj @@ -79,6 +79,7 @@ + diff --git a/Rant.Tests/StringLocalization.cs b/Rant.Tests/StringLocalization.cs new file mode 100644 index 0000000..4a5a2eb --- /dev/null +++ b/Rant.Tests/StringLocalization.cs @@ -0,0 +1,18 @@ +using System; + +using NUnit.Framework; + +namespace Rant.Tests +{ + [TestFixture] + public class StringLocalization + { + [Test] + public void StaticString() + { + var str = Rant.Localization.Txtres.GetString("bad-subtype"); + Console.WriteLine(str); + Assert.AreNotEqual("bad-subtype", str); + } + } +} \ No newline at end of file diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index 2b9b122..7264d82 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -50,7 +50,7 @@ static Txtres() { var line = reader.ReadLine(); if (line == null || line.Length == 0) continue; - var kv = line.Split(new[] { '=' }, 1); + var kv = line.Split(new[] { '=' }, 2); if (kv.Length != 2) continue; var key = kv[0].Trim(); if (!key.All(c => Char.IsLetterOrDigit(c) || c == '-' || c == '_')) continue; @@ -61,7 +61,12 @@ static Txtres() int len = valueLiteral.Length; while (i < len) { - if ((i == 0 || i == valueLiteral.Length - 1) && valueLiteral[i] != '"') goto loop; + if ((i == 0 || i == valueLiteral.Length - 1)) + { + if (valueLiteral[i] != '"') goto loop; + i++; + continue; + } switch (valueLiteral[i]) { case '\\': @@ -97,6 +102,9 @@ static Txtres() } } } +#if DEBUG + Console.WriteLine($"Loaded string resources for {CultureInfo.CurrentCulture.Name}"); +#endif } catch (Exception ex) { diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index eb3c78d..77f794a 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -13,7 +13,7 @@ err-invalid-tablename = "Ungültiger Tabellename: {0}" err-invalid-subtypes = "Ein oder mehrere der angegebenen Subtypnamen sind ungültig: {0}" err-pattern-timeout = "Die Ausführung ist abgelaufen ({0} Sekunden)." -err-stack-overflow = "Die Stapelspeicherbegrenzung ist übergelaufen ({0})." +err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Höchstgrenze: {0})." missing-table = "[Fehlende Tabelle]" bad-subtype = "[Ungültiger Subtyp]" \ No newline at end of file From a8bb52c5ff8d48413a7ba4391815843b5a83708b Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 22:08:30 -0500 Subject: [PATCH 018/213] Simplify escape sequence parsing in Txtres --- Rant/Localization/Txtres.cs | 71 +++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index 7264d82..d5776f3 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -15,23 +15,13 @@ internal static class Txtres public const string FallbackLanguageCode = "en-US"; private static readonly Dictionary _stringTable = new Dictionary(); - private static readonly Dictionary _escapeMap = new Dictionary - { - {'a', '\a'}, - {'b', '\b'}, - {'f', '\f'}, - {'n', '\n'}, - {'r', '\r'}, - {'t', '\t'}, - {'v', '\v'} - }; static Txtres() { try { var ass = Assembly.GetExecutingAssembly(); - using (var stream = + using (var stream = ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{CultureInfo.CurrentCulture.Name}.lang") ?? ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{FallbackLanguageCode}.lang")) { @@ -70,28 +60,49 @@ static Txtres() switch (valueLiteral[i]) { case '\\': - if (i == valueLiteral.Length - 1) goto loop; - if (_escapeMap.TryGetValue(valueLiteral[i + 1], out esc)) - { - sb.Append(esc); - } - else if (valueLiteral[i + 1] == 'u') { - if (i + 5 >= valueLiteral.Length) goto loop; - short code; - if (!short.TryParse(valueLiteral.Substring(i + 1, 4), - NumberStyles.AllowHexSpecifier, - CultureInfo.InvariantCulture, out code)) goto loop; - sb.Append((char)code); - i += 6; + if (i == valueLiteral.Length - 1) goto loop; + switch (valueLiteral[i + 1]) + { + case 'a': + sb.Append('\a'); + break; + case 'b': + sb.Append('\b'); + break; + case 'f': + sb.Append('\f'); + break; + case 'n': + sb.Append('\n'); + break; + case 'r': + sb.Append('\r'); + break; + case 't': + sb.Append('\t'); + break; + case 'v': + sb.Append('\v'); + break; + case 'u': + { + if (i + 5 >= valueLiteral.Length) goto loop; + short code; + if (!short.TryParse(valueLiteral.Substring(i + 1, 4), + NumberStyles.AllowHexSpecifier, + CultureInfo.InvariantCulture, out code)) goto loop; + sb.Append((char)code); + i += 6; + continue; + } + default: + sb.Append(valueLiteral[i + 1]); + break; + } + i += 2; continue; } - else - { - sb.Append(valueLiteral[i + 1]); - } - i += 2; - continue; default: sb.Append(valueLiteral[i]); break; From b040566c2041b2d749995f881846ae9efa11ce46 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 27 Jul 2016 22:08:59 -0500 Subject: [PATCH 019/213] Rename 'Berkin-Release' config to 'Install' --- Rant.Console/Rant.Console.csproj | 2 +- Rant.sln | 54 ++++++++++++++++---------------- Rant/Rant.csproj | 6 ++-- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Rant.Console/Rant.Console.csproj b/Rant.Console/Rant.Console.csproj index 4e2a723..a005b7f 100644 --- a/Rant.Console/Rant.Console.csproj +++ b/Rant.Console/Rant.Console.csproj @@ -31,7 +31,7 @@ prompt 4 - + C:\rant\ TRACE true diff --git a/Rant.sln b/Rant.sln index f8c9075..98dc14a 100644 --- a/Rant.sln +++ b/Rant.sln @@ -23,12 +23,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rave", "Rave\Rave.csproj", EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Berkin-Release|Any CPU = Berkin-Release|Any CPU - Berkin-Release|x64 = Berkin-Release|x64 - Berkin-Release|x86 = Berkin-Release|x86 Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Install|Any CPU = Install|Any CPU + Install|x64 = Install|x64 + Install|x86 = Install|x86 Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 @@ -37,18 +37,18 @@ Global Unity|x86 = Unity|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Berkin-Release|Any CPU.ActiveCfg = Berkin-Release|Any CPU - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Berkin-Release|Any CPU.Build.0 = Berkin-Release|Any CPU - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Berkin-Release|x64.ActiveCfg = Berkin-Release|x86 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Berkin-Release|x64.Build.0 = Berkin-Release|x86 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Berkin-Release|x86.ActiveCfg = Berkin-Release|x86 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Berkin-Release|x86.Build.0 = Berkin-Release|x86 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|x64.ActiveCfg = Debug|x64 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|x64.Build.0 = Debug|x64 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|x86.ActiveCfg = Debug|x86 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|x86.Build.0 = Debug|x86 + {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Install|Any CPU.ActiveCfg = Install|Any CPU + {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Install|Any CPU.Build.0 = Install|Any CPU + {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Install|x64.ActiveCfg = Install|x64 + {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Install|x64.Build.0 = Install|x64 + {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Install|x86.ActiveCfg = Install|x86 + {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Install|x86.Build.0 = Install|x86 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|Any CPU.Build.0 = Release|Any CPU {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|x64.ActiveCfg = Release|x64 @@ -61,18 +61,18 @@ Global {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|x64.Build.0 = Release|x64 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|x86.ActiveCfg = Release|x86 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|x86.Build.0 = Release|x86 - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Berkin-Release|Any CPU.ActiveCfg = Berkin-Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Berkin-Release|Any CPU.Build.0 = Berkin-Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Berkin-Release|x64.ActiveCfg = Berkin-Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Berkin-Release|x64.Build.0 = Berkin-Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Berkin-Release|x86.ActiveCfg = Berkin-Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Berkin-Release|x86.Build.0 = Berkin-Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x64.ActiveCfg = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x64.Build.0 = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x86.ActiveCfg = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x86.Build.0 = Debug|Any CPU + {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Install|Any CPU.ActiveCfg = Install|Any CPU + {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Install|Any CPU.Build.0 = Install|Any CPU + {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Install|x64.ActiveCfg = Install|Any CPU + {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Install|x64.Build.0 = Install|Any CPU + {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Install|x86.ActiveCfg = Install|Any CPU + {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Install|x86.Build.0 = Install|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|Any CPU.Build.0 = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|x64.ActiveCfg = Release|Any CPU @@ -85,18 +85,18 @@ Global {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|x64.Build.0 = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|x86.ActiveCfg = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|x86.Build.0 = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Berkin-Release|Any CPU.ActiveCfg = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Berkin-Release|Any CPU.Build.0 = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Berkin-Release|x64.ActiveCfg = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Berkin-Release|x64.Build.0 = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Berkin-Release|x86.ActiveCfg = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Berkin-Release|x86.Build.0 = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|Any CPU.Build.0 = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x64.ActiveCfg = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x64.Build.0 = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x86.ActiveCfg = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x86.Build.0 = Debug|Any CPU + {A756F3FA-9172-4F08-94EB-17AFBD115078}.Install|Any CPU.ActiveCfg = Release|Any CPU + {A756F3FA-9172-4F08-94EB-17AFBD115078}.Install|Any CPU.Build.0 = Release|Any CPU + {A756F3FA-9172-4F08-94EB-17AFBD115078}.Install|x64.ActiveCfg = Release|Any CPU + {A756F3FA-9172-4F08-94EB-17AFBD115078}.Install|x64.Build.0 = Release|Any CPU + {A756F3FA-9172-4F08-94EB-17AFBD115078}.Install|x86.ActiveCfg = Release|Any CPU + {A756F3FA-9172-4F08-94EB-17AFBD115078}.Install|x86.Build.0 = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|Any CPU.ActiveCfg = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|Any CPU.Build.0 = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|x64.ActiveCfg = Release|Any CPU @@ -109,18 +109,18 @@ Global {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|x64.Build.0 = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|x86.ActiveCfg = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|x86.Build.0 = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Berkin-Release|Any CPU.ActiveCfg = Berkin-Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Berkin-Release|Any CPU.Build.0 = Berkin-Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Berkin-Release|x64.ActiveCfg = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Berkin-Release|x64.Build.0 = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Berkin-Release|x86.ActiveCfg = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Berkin-Release|x86.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|Any CPU.Build.0 = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x64.ActiveCfg = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x64.Build.0 = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x86.ActiveCfg = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x86.Build.0 = Debug|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|Any CPU.ActiveCfg = Berkin-Release|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|Any CPU.Build.0 = Berkin-Release|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|x64.ActiveCfg = Release|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|x64.Build.0 = Release|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|x86.ActiveCfg = Release|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|x86.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|Any CPU.ActiveCfg = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|Any CPU.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|x64.ActiveCfg = Release|Any CPU diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 760e960..74d7381 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -40,7 +40,7 @@ ..\bin\MainBuild\Rant.xml false - + C:\rant\ TRACE bin\Release\Rant.xml @@ -81,7 +81,7 @@ MinimumRecommendedRules.ruleset false - + bin\x86\Berkin-Release\ TRACE bin\Release\Rant.xml @@ -112,7 +112,7 @@ MinimumRecommendedRules.ruleset false - + bin\x64\Berkin-Release\ TRACE bin\Release\Rant.xml From 0c59a83011c608b59939bcac1b28f3d4ea878806 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Thu, 28 Jul 2016 12:35:32 -0400 Subject: [PATCH 020/213] Query carriers. --- Rant/Core/Compiler/Parsing/QueryParser.cs | 113 ++++++++++++++++++- Rant/Core/Compiler/Parsing/SequenceParser.cs | 3 + Rant/Resources/RantPackage.cs | 4 +- 3 files changed, 116 insertions(+), 4 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 22d8b7e..58834e3 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -17,12 +17,13 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext query.Name = tableName.Value; query.ClassFilter = new ClassFilter(); query.RegexFilters = new List<_>(); + query.Carrier = new Carrier(); bool exclusiveRead = false; bool subtypeRead = false; while(!reader.End) { - var token = reader.ReadLooseToken(); + var token = reader.ReadToken(); switch(token.ID) { @@ -46,7 +47,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext subtypeRead = true; break; - // read query + // read class filter case R.Hyphen: { bool blacklist = false; @@ -149,10 +150,19 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext reader.ReadLoose(R.RightParen, "syllable range end"); break; + // read carriers + case R.DoubleColon: + ReadCarriers(reader, query.Carrier); + // this should be the last part of the query, so go to the end + goto end_of_loop; + // end of query case R.RightAngle: goto end_of_loop; + case R.Whitespace: + break; + default: compiler.SyntaxError(token, "unexpected token"); break; @@ -164,5 +174,104 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext actionCallback(new RAQuery(query, tableName)); yield break; } + + private void ReadCarriers(TokenReader reader, Carrier carrier) + { + while(!reader.End) + { + var token = reader.ReadToken(); + + switch(token.ID) + { + // match carrier + case R.Equal: + { + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(CarrierComponent.Match, name.Value); + } + break; + + // associative and match associative, + // disassociative and match disassociative + // divergent and match-divergent + // relational and match-relational + case R.At: + { + var carrierType = CarrierComponent.Associative; + // disassociative + if(reader.PeekToken().ID == R.Exclamation) + { + carrierType = CarrierComponent.Dissociative; + reader.ReadToken(); + } + // divergent + else if(reader.PeekToken().ID == R.Plus) + { + carrierType = CarrierComponent.Divergent; + reader.ReadToken(); + } + else if(reader.PeekToken().ID == R.Question) + { + carrierType = CarrierComponent.Relational; + reader.ReadToken(); + } + + // match + if(reader.PeekToken().ID == R.Equal) + { + if(carrierType == CarrierComponent.Associative) + { + carrierType = CarrierComponent.MatchAssociative; + } + else if(carrierType == CarrierComponent.Dissociative) + { + carrierType = CarrierComponent.MatchDissociative; + } + else if(carrierType == CarrierComponent.Divergent) + { + carrierType = CarrierComponent.MatchDivergent; + } + else if(carrierType == CarrierComponent.Relational) + { + carrierType = CarrierComponent.MatchRelational; + } + reader.ReadToken(); + } + + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(carrierType, name.Value); + } + break; + + // unique and match unique + case R.Exclamation: + { + var carrierType = CarrierComponent.Unique; + // match unique + if(reader.PeekToken().ID == R.Equal) + { + carrierType = CarrierComponent.MatchUnique; + reader.ReadToken(); + } + + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(carrierType, name.Value); + } + break; + + // rhyming + case R.Ampersand: + { + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(CarrierComponent.Rhyme, name.Value); + } + break; + + // we're done, go away + case R.RightAngle: + return; + } + } + } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index b167e05..c2de447 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -76,6 +76,9 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext actionCallback(new RAEscape(token)); break; + case R.EOF: + yield break; + default: // Handle text actionCallback(new RAText(token)); break; diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index e6c8b89..27c6b65 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -22,8 +22,8 @@ public sealed class RantPackage private const string MAGIC = "RANT"; private const byte PACKAGE_VERSION = 2; - private HashSet _patterns; - private HashSet _tables; + private HashSet _patterns = new HashSet(); + private HashSet _tables = new HashSet(); private readonly HashSet _dependencies = new HashSet(); private RantPackageVersion _version = new RantPackageVersion(1, 0, 0); private string _title = GetString("untitled-package"); From 73a794a895ce238e45f69c08064b36493bfa8143 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 30 Jul 2016 17:09:59 -0500 Subject: [PATCH 021/213] Add some localized compiler error strings --- Rant/Core/Compiler/Syntax/RAQuery.cs | 4 ++-- Rant/Localization/de-DE.lang | 12 ++++++++++++ Rant/Localization/en-US.lang | 12 ++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RAQuery.cs b/Rant/Core/Compiler/Syntax/RAQuery.cs index a394583..d53f8b0 100644 --- a/Rant/Core/Compiler/Syntax/RAQuery.cs +++ b/Rant/Core/Compiler/Syntax/RAQuery.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using Rant.Core.Stringes; -using Rant.Vocabulary; +using Rant.Localization; using Rant.Vocabulary.Querying; namespace Rant.Core.Compiler.Syntax @@ -21,7 +21,7 @@ public override IEnumerator Run(Sandbox sb) { if (sb.Engine.Dictionary == null) { - sb.Print("[Missing Table]"); + sb.Print(Txtres.GetString("missing-table")); yield break; } // carrier erase query diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 77f794a..533bf5b 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -1,6 +1,8 @@ untitled-package = "Unbenanntes Paket" default-package-id = "Paket" +src-line-col = "({0}: Z {1} S {2})" + err-zero-or-negative = "Wert muss größer als null sein." err-empty-path = "Der Dateipfad kann nicht leer oder NULL sein." err-unresolvable-package = "Das Paket '{0}' konnte nicht den Verweis '{1}' auflösen." @@ -15,5 +17,15 @@ err-invalid-subtypes = "Ein oder mehrere der angegebenen Subtypnamen sind ungül err-pattern-timeout = "Die Ausführung ist abgelaufen ({0} Sekunden)." err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Höchstgrenze: {0})." +err-generic-runtime = "Ein unspezifizierter Runtimefehler ist aufgetreten." +err-generic-compiler = "Ein unspezifizierter Erstellungsfehler ist aufgetreten." +err-unknown-flag = "Unbekannter Flagwert: '{0}'" + +err-compiler-eof = "Unerwartetes Dateiende." +err-compiler-unexpected-token = "Unerwartetes Token wurde gefunden: '{0}'" +err-compiler-nonexistent-function = "Die angegebene Funktion '{0}' existiert nicht." +err-compiler-missing-token = "{0} erwartet." +err-compiler-bad-escape = "Unerkannte Escapesequenz: {0}" + missing-table = "[Fehlende Tabelle]" bad-subtype = "[Ungültiger Subtyp]" \ No newline at end of file diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 3542b02..356c762 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -1,6 +1,8 @@ untitled-package = "Untitled Package" default-package-id = "Package" +src-line-col = "({0}: Ln {1} Col {2})" + err-zero-or-negative = "Value must be greater than zero." err-empty-path = "File path cannot be null or empty." err-unresolvable-package = "Package '{0}' was unable to resolve dependency '{1}'" @@ -15,5 +17,15 @@ err-invalid-subtypes = "Invalid subtype name(s) found: {0}" err-pattern-timeout = "The pattern execution timed out ({0} seconds)." err-stack-overflow = "Exceeded the maximum stack size ({0})." +err-generic-runtime = "An unspecified runtime error was encountered." +err-generic-compiler = "An unspecified compiler error was encountered." +err-unknown-flag = "Unknown flag value: '{0}'" + +err-compiler-eof = "Unexpected end of file." +err-compiler-unexpected-token = "Unexpected token found: '{0}'" +err-compiler-nonexistent-function = "The specified function '{0}' does not exist." +err-compiler-missing-token = "Expected {0}." +err-compiler-bad-escape = "Invalid escape sequence: {0}" + missing-table = "[Missing Table]" bad-subtype = "[Bad Subtype]" \ No newline at end of file From 393d4306502555e628721fbccb5dcc3227aa36e9 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 30 Jul 2016 17:59:18 -0500 Subject: [PATCH 022/213] Fix German translations in string table --- Rant/Localization/de-DE.lang | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 533bf5b..2b266fb 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -5,25 +5,25 @@ src-line-col = "({0}: Z {1} S {2})" err-zero-or-negative = "Wert muss größer als null sein." err-empty-path = "Der Dateipfad kann nicht leer oder NULL sein." -err-unresolvable-package = "Das Paket '{0}' konnte nicht den Verweis '{1}' auflösen." -err-invalid-package-version = "Diese Paketversion ({0}) ist nicht unterstützt." -err-missing-package-meta = "Dieses Paket hat keine Metadaten." -err-empty-pkg-title = "Der Pakettitel muss nicht leer sein." -err-empty-pkg-id = "Der Paketbezeichner (ID) muss nicht leer sein." +err-unresolvable-package = "Der Verweis '{1}' im Paket '{0}' konnte nicht aufgelöst werden." +err-invalid-package-version = "Die Paketversion ({0}) ist nicht unterstützt." +err-missing-package-meta = "Paket mit fehlenden Metadaten gefunden." +err-empty-pkg-title = "Der Pakettitel darf nicht leer sein." +err-empty-pkg-id = "Der Paketbezeichner (ID) darf nicht leer sein." err-file-corrupt = "Die Datei ist fehlerhaft oder das Datenformat wird nicht unterstützt." err-invalid-tablename = "Ungültiger Tabellename: {0}" err-invalid-subtypes = "Ein oder mehrere der angegebenen Subtypnamen sind ungültig: {0}" -err-pattern-timeout = "Die Ausführung ist abgelaufen ({0} Sekunden)." -err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Höchstgrenze: {0})." +err-pattern-timeout = "Der Ausführungszeitraum ist abgelaufen ({0} Sekunden)." +err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Maximaltiefe: {0})." -err-generic-runtime = "Ein unspezifizierter Runtimefehler ist aufgetreten." +err-generic-runtime = "Ein unspezifizierter Laufzeitfehler ist aufgetreten." err-generic-compiler = "Ein unspezifizierter Erstellungsfehler ist aufgetreten." err-unknown-flag = "Unbekannter Flagwert: '{0}'" err-compiler-eof = "Unerwartetes Dateiende." -err-compiler-unexpected-token = "Unerwartetes Token wurde gefunden: '{0}'" -err-compiler-nonexistent-function = "Die angegebene Funktion '{0}' existiert nicht." +err-compiler-unexpected-token = "Unerwartetes Token gefunden: '{0}'" +err-compiler-nonexistent-function = "Die Funktion '{0}' existiert nicht." err-compiler-missing-token = "{0} erwartet." err-compiler-bad-escape = "Unerkannte Escapesequenz: {0}" From efb1ee55469946e067ba25d6b3ad6160296a5c9a Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 30 Jul 2016 18:00:46 -0500 Subject: [PATCH 023/213] Small translation fixes --- Rant/Localization/de-DE.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 2b266fb..2f30be5 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -3,8 +3,8 @@ default-package-id = "Paket" src-line-col = "({0}: Z {1} S {2})" -err-zero-or-negative = "Wert muss größer als null sein." -err-empty-path = "Der Dateipfad kann nicht leer oder NULL sein." +err-zero-or-negative = "Wert muss größer als Null sein." +err-empty-path = "Der Dateipfad darf nicht leer oder NULL sein." err-unresolvable-package = "Der Verweis '{1}' im Paket '{0}' konnte nicht aufgelöst werden." err-invalid-package-version = "Die Paketversion ({0}) ist nicht unterstützt." err-missing-package-meta = "Paket mit fehlenden Metadaten gefunden." From c78541f6fc9d3a2d72a22006473279a9da960442 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 30 Jul 2016 19:43:56 -0500 Subject: [PATCH 024/213] Add some localized function metadata --- Rant/Localization/de-DE.lang | 13 +++++++++++-- Rant/Localization/en-US.lang | 11 ++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 2f30be5..b2ae11d 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -12,7 +12,7 @@ err-empty-pkg-title = "Der Pakettitel darf nicht leer sein." err-empty-pkg-id = "Der Paketbezeichner (ID) darf nicht leer sein." err-file-corrupt = "Die Datei ist fehlerhaft oder das Datenformat wird nicht unterstützt." err-invalid-tablename = "Ungültiger Tabellename: {0}" -err-invalid-subtypes = "Ein oder mehrere der angegebenen Subtypnamen sind ungültig: {0}" +err-invalid-subtypes = "Ein oder mehrere Subtypnamen sind ungültig: {0}" err-pattern-timeout = "Der Ausführungszeitraum ist abgelaufen ({0} Sekunden)." err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Maximaltiefe: {0})." @@ -28,4 +28,13 @@ err-compiler-missing-token = "{0} erwartet." err-compiler-bad-escape = "Unerkannte Escapesequenz: {0}" missing-table = "[Fehlende Tabelle]" -bad-subtype = "[Ungültiger Subtyp]" \ No newline at end of file +bad-subtype = "[Ungültiger Subtyp]" + +func-num-desc = "Gibt eine Zufallszahl zwischen einem Minimal- und Maximalwert aus." +func-num-min-desc = "Der inklusive untere Grenze der ausgegebenen Zufallszahl." +func-num-max-desc = "Der inklusive obere Grenze der ausgegebenen Zufallszahl." + +func-rep-desc = "Setzt die aktuelle Wiederholungsanzahl des nächsten Blockes." +func-rep-times-desc = "Die gewünschte Wiederholungsanzahl des nächsten Blockes." + +func-repeach-desc = "Legt die Wiederholungsanzahl des nächsten Blockes auf die Anzahl seiner Elemente fest." \ No newline at end of file diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 356c762..cef5104 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -28,4 +28,13 @@ err-compiler-missing-token = "Expected {0}." err-compiler-bad-escape = "Invalid escape sequence: {0}" missing-table = "[Missing Table]" -bad-subtype = "[Bad Subtype]" \ No newline at end of file +bad-subtype = "[Bad Subtype]" + +func-num-desc = "Prints a random number between the specified minimum and maximum bounds." +func-num-min-desc = "The inclusive minimum value." +func-num-max-desc = "The inclusive maximum value." + +func-rep-desc = "Sets the repetition count for the next block." +func-rep-times-desc = "The number of times to repeat the next block." + +func-repeach-desc = "Sets the repetition count to the number of items in the next block." \ No newline at end of file From e87209e60635a72afbf0726809557c5d786effa0 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 30 Jul 2016 21:54:29 -0500 Subject: [PATCH 025/213] Support language switching in Txtres --- Rant.Tests/StringLocalization.cs | 9 +- Rant/Localization/Txtres.cs | 192 ++++++++++++++++++------------- 2 files changed, 121 insertions(+), 80 deletions(-) diff --git a/Rant.Tests/StringLocalization.cs b/Rant.Tests/StringLocalization.cs index 4a5a2eb..c30f41c 100644 --- a/Rant.Tests/StringLocalization.cs +++ b/Rant.Tests/StringLocalization.cs @@ -1,4 +1,6 @@ using System; +using System.Globalization; +using System.Threading; using NUnit.Framework; @@ -10,9 +12,12 @@ public class StringLocalization [Test] public void StaticString() { + Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); var str = Rant.Localization.Txtres.GetString("bad-subtype"); - Console.WriteLine(str); - Assert.AreNotEqual("bad-subtype", str); + Assert.AreEqual("[Bad Subtype]", str); + Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE"); + str = Rant.Localization.Txtres.GetString("bad-subtype"); + Assert.AreEqual("[Ungültiger Subtyp]", str); } } } \ No newline at end of file diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index d5776f3..7a11c4e 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -14,16 +14,19 @@ internal static class Txtres public const string LanguageResourceNamespace = "Rant.Localization"; public const string FallbackLanguageCode = "en-US"; - private static readonly Dictionary _stringTable = new Dictionary(); + private static readonly Dictionary> _languages = new Dictionary>(); + private static Dictionary _currentTable = new Dictionary(); + private static string _langName = CultureInfo.CurrentCulture.Name; static Txtres() { try { var ass = Assembly.GetExecutingAssembly(); + var lang = CultureInfo.CurrentCulture.Name; using (var stream = ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{CultureInfo.CurrentCulture.Name}.lang") - ?? ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{FallbackLanguageCode}.lang")) + ?? ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{lang = FallbackLanguageCode}.lang")) { if (stream == null) { @@ -33,89 +36,120 @@ static Txtres() return; } - using (var reader = new StreamReader(stream)) + LoadStringTableData(lang, stream, _currentTable); + } +#if DEBUG + Console.WriteLine($"Loaded string resources for {CultureInfo.CurrentCulture.Name}"); +#endif + } + catch (Exception ex) + { +#if DEBUG + Console.WriteLine($"Txtres error: {ex.Message}"); +#endif + } + } + + private static void LoadStringTableData(string lang, Stream stream, Dictionary table) + { + using (var reader = new StreamReader(stream, Encoding.Default, true, 256, true)) + { + loop: + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + if (line == null || line.Length == 0) continue; + var kv = line.Split(new[] { '=' }, 2); + if (kv.Length != 2) continue; + var key = kv[0].Trim(); + if (!key.All(c => Char.IsLetterOrDigit(c) || c == '-' || c == '_')) continue; + var valueLiteral = kv[1].Trim(); + var sb = new StringBuilder(); + int i = 0; + int len = valueLiteral.Length; + while (i < len) { - loop: - while (!reader.EndOfStream) + if ((i == 0 || i == valueLiteral.Length - 1)) { - var line = reader.ReadLine(); - if (line == null || line.Length == 0) continue; - var kv = line.Split(new[] { '=' }, 2); - if (kv.Length != 2) continue; - var key = kv[0].Trim(); - if (!key.All(c => Char.IsLetterOrDigit(c) || c == '-' || c == '_')) continue; - var valueLiteral = kv[1].Trim(); - var sb = new StringBuilder(); - char esc; - int i = 0; - int len = valueLiteral.Length; - while (i < len) - { - if ((i == 0 || i == valueLiteral.Length - 1)) - { - if (valueLiteral[i] != '"') goto loop; - i++; - continue; - } - switch (valueLiteral[i]) + if (valueLiteral[i] != '"') goto loop; + i++; + continue; + } + switch (valueLiteral[i]) + { + case '\\': { - case '\\': - { - if (i == valueLiteral.Length - 1) goto loop; - switch (valueLiteral[i + 1]) + if (i == valueLiteral.Length - 1) goto loop; + switch (valueLiteral[i + 1]) + { + case 'a': + sb.Append('\a'); + break; + case 'b': + sb.Append('\b'); + break; + case 'f': + sb.Append('\f'); + break; + case 'n': + sb.Append('\n'); + break; + case 'r': + sb.Append('\r'); + break; + case 't': + sb.Append('\t'); + break; + case 'v': + sb.Append('\v'); + break; + case 'u': { - case 'a': - sb.Append('\a'); - break; - case 'b': - sb.Append('\b'); - break; - case 'f': - sb.Append('\f'); - break; - case 'n': - sb.Append('\n'); - break; - case 'r': - sb.Append('\r'); - break; - case 't': - sb.Append('\t'); - break; - case 'v': - sb.Append('\v'); - break; - case 'u': - { - if (i + 5 >= valueLiteral.Length) goto loop; - short code; - if (!short.TryParse(valueLiteral.Substring(i + 1, 4), - NumberStyles.AllowHexSpecifier, - CultureInfo.InvariantCulture, out code)) goto loop; - sb.Append((char)code); - i += 6; - continue; - } - default: - sb.Append(valueLiteral[i + 1]); - break; + if (i + 5 >= valueLiteral.Length) goto loop; + short code; + if (!short.TryParse(valueLiteral.Substring(i + 1, 4), + NumberStyles.AllowHexSpecifier, + CultureInfo.InvariantCulture, out code)) goto loop; + sb.Append((char)code); + i += 6; + continue; } - i += 2; - continue; - } - default: - sb.Append(valueLiteral[i]); - break; + default: + sb.Append(valueLiteral[i + 1]); + break; + } + i += 2; + continue; } - i++; - } - _stringTable[key] = sb.ToString(); + default: + sb.Append(valueLiteral[i]); + break; } + i++; } + table[key] = sb.ToString(); } -#if DEBUG - Console.WriteLine($"Loaded string resources for {CultureInfo.CurrentCulture.Name}"); -#endif + _languages[lang] = table; + } + } + + private static void CheckLanguage() + { + if (CultureInfo.CurrentCulture.Name == _langName) return; + try + { + _langName = CultureInfo.CurrentCulture.Name; + Dictionary table; + if (!_languages.TryGetValue(_langName, out table)) + { + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{_langName}.lang")) + { + if (stream == null) return; + table = new Dictionary(); + LoadStringTableData(_langName, stream, table); + } + } + _currentTable = table; } catch (Exception ex) { @@ -132,16 +166,18 @@ public static void ForceLoad() public static string GetString(string name) { + CheckLanguage(); string str; - return _stringTable.TryGetValue(name, out str) ? str : name; + return _currentTable.TryGetValue(name, out str) ? str : name; } public static string GetString(string name, params object[] args) { + CheckLanguage(); string str; try { - return _stringTable.TryGetValue(name, out str) ? String.Format(str, args) : name; + return _currentTable.TryGetValue(name, out str) ? String.Format(str, args) : name; } catch { From b15529540812d2f837399792766149e8f1a90c46 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 31 Jul 2016 19:48:03 -0500 Subject: [PATCH 026/213] Add more function description translations --- Rant/Core/Framework/RantFunctionRegistry.cs | 4 ++-- Rant/Localization/de-DE.lang | 25 +++++++++++++++++++-- Rant/Localization/en-US.lang | 23 ++++++++++++++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 927e30d..75d696f 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -198,9 +198,9 @@ private static void Chance(Sandbox sb, [RantDescription("Changes the capitalization mode for all open channels.")] private static void Case(Sandbox sb, [RantDescription("The capitalization mode to use.")] - Capitalization textCase) + Capitalization mode) { - sb.Output.Capitalize(textCase); + sb.Output.Capitalize(mode); } [RantFunction] diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index b2ae11d..47dc048 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -34,7 +34,28 @@ func-num-desc = "Gibt eine Zufallszahl zwischen einem Minimal- und Maximalwert a func-num-min-desc = "Der inklusive untere Grenze der ausgegebenen Zufallszahl." func-num-max-desc = "Der inklusive obere Grenze der ausgegebenen Zufallszahl." -func-rep-desc = "Setzt die aktuelle Wiederholungsanzahl des nächsten Blockes." +func-rep-desc = "Setzt die Wiederholungsanzahl des nächsten Blockes." func-rep-times-desc = "Die gewünschte Wiederholungsanzahl des nächsten Blockes." -func-repeach-desc = "Legt die Wiederholungsanzahl des nächsten Blockes auf die Anzahl seiner Elemente fest." \ No newline at end of file +func-repeach-desc = "Legt die Wiederholungsanzahl des nächsten Blockes auf die Anzahl seiner Elemente fest." + +func-sep-desc = "Setzt den Wiederholungstrenner des nächsten Blockes." +func-sep-separator-desc = "Der gewünschte Wiederholungstrenner des nächsten Blockes." + +func-sepconj-desc = "Markiert den nächsten Block als Auflistung und setzt seinen Wiederholungstrenner und seine Konjunktionsvorlage." +func-sepconj-separator-desc = "Der gewünschte Wiederholungstrenner des nächsten Blockes." +func-sepconj-conjunction-desc = "Die gewünschte Konjunktionsvorlage des nächsten Blockes." + +func-sepoxford-desc = "Markiert den nächsten Block als Auflistung mit Oxford-Komma und setzt seinen Wiederholungstrenner, seine Konjunktionsvorlage und seine Oxford-Komma-Vorlage." +func-sepoxford-separator-desc = "Der gewünschte Wiederholungstrenner des nächsten Blockes." +func-sepoxford-oxford-desc = "Die gewünschte Oxford-Komma-Vorlage des nächsten Blockes." +func-sepoxford-conjunction-desc = "Die gewünschte Konjunktionsvorlage des nächsten Blockes." + +func-caps-desc = "Ändert den Großschreibungsmodus aller offenen Ausgabekanäle." +func-caps-mode-desc = "Der gewünschte Großschreibungsmodus." + +func-chance-desc = "Setzt die Wahrscheinlichkeit der Ausführung des nächsten Blockes." +func-chance-chance-desc = "Die gewünschte Wahrscheinlichkeit als Prozent." + +func-capsinfer-desc = "Leitet die Großschreibung der angegebenen Zeichenkette her und legt den Großschreibungsmodus darauf fest." +func-capsinfer-sample-desc = "Die zu analysiernde Zeichenkette." \ No newline at end of file diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index cef5104..73b0f93 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -37,4 +37,25 @@ func-num-max-desc = "The inclusive maximum value." func-rep-desc = "Sets the repetition count for the next block." func-rep-times-desc = "The number of times to repeat the next block." -func-repeach-desc = "Sets the repetition count to the number of items in the next block." \ No newline at end of file +func-repeach-desc = "Sets the repetition count to the number of items in the next block." + +func-sep-desc = "Sets the separator pattern for the next block." +func-sep-separator-desc = "The separator pattern to run between iterations of the next block." + +func-sepconj-desc = "Flags the next block as a series and sets the separator and conjunction patterns." +func-sepconj-separator-desc = "The separator pattern to run between iterations of the next block." +func-sepconj-conjunction-desc = "The conjunction pattern to run before the last item." + +func-sepoxford-desc = "Flags the next block as a series and sets the separator, Oxford comma, and conjunction patterns." +func-sepoxford-separator-desc = "The separator pattern to run between items." +func-sepoxford-oxford-desc = "The Oxford comma pattern to run before the last item." +func-sepoxford-conjunction-desc = "The conjunction pattern to run before the last item in the series." + +func-caps-desc = "Changes the capitalization mode for all open channels." +func-caps-mode-desc = "The capitalization mode to use." + +func-chance-desc = "Sets the probability that the next block will be executed." +func-chance-chance-desc = "The probability value [0, 100]." + +func-capsinfer-desc = "Infers the capitalization of a given string and sets the capitalization mode to match it." +func-capsinfer-sample-desc = "The string to analyze." \ No newline at end of file From f8cfa2f026a4dbc2f3ed6ac9e8ec684c9f2e2871 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 2 Aug 2016 03:50:17 -0500 Subject: [PATCH 027/213] Update README.md --- README.md | 111 +++++++++++++++++++++--------------------------------- 1 file changed, 43 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 4417c83..2e20e08 100644 --- a/README.md +++ b/README.md @@ -13,29 +13,36 @@

-##What is Rant? +**Rant** is an all-purpose procedural text generation engine. +It has been refined to include a dizzying array of features for handling everything from +the most basic of string generation tasks to advanced dialogue generation, +code templating, automatic formatting, and more. -Rant is a language for procedurally generating text, written in C#. It combines a markup language with functional and imperative programming concepts to deliver a powerful, but easy-to-use tool for adding rich variations to your text. The ultimate goal of Rant is to augment your creativity with the boundless potential of randomness, helping you consider your next great idea as not just a static concept, but a seed for countless possibilities. +The goal of the project is to enable creators, especially those in game development, +to automate repetitive writing tasks with a high degree of creative freedom. +With zero cost to you. + +Don't just write. Write with Rant. [berkin.me/rant](http://berkin.me/rant) -##Features of Rant +## Features -* Recursive, weighted branching with customizable selection strategies -* Dictionary queries -* Automation for capitalization, rhyming, and indefinite articles -* Multiple output support -* Richard, an experimental embedded scripting language +* Recursive, weighted branching with several available selection modes +* Supports queryable dictionaries. +* Tools for automatic capitalization, rhyming, and indefinite articles +* Return multiple outputs at once * Probability modifiers -* Loops, conditionals, and subroutines -* Package loader for easy resource management -* Unmanaged function exports for use in C/C++ applications *(Windows only, sorry!)* -* Compatible with Unity -* **And a whole lot more!** +* Loops, conditional statements, and subroutines +* Import/Export resources easily with the .rantpkg format +* Unity3D-ready! +* **And that's just the beginning...** + +## Examples -##Examples +Rant is like a templating language but much more awesome. Here are a few examples of how it works. -**Fill in the blanks** +**Liven up a narrative with a few simple queries in your text.** ``` likes to with pet on . ``` @@ -45,12 +52,12 @@ Alick likes to mount shuttlecocks with his pet bat on Mondays. --- -**Generate ten random numbers between 1 and 50 and spell them out** +**Count to ten and spell it out.** ``` -[case:sentence][numfmt:verbal-en][rep:10][sep:\s]{[num:1;50].} +[case:sentence][numfmt:verbal-en][rs:10;\s]{[rn].} ``` ``` -Four. Ten. Thirteen. Fifteen. Eighteen. Twenty four. Seven. Forty eight. Nineteen. Twenty five. +One. Two. Three. Four. Five. Six. Seven. Eight. Nine. Ten. ``` --- @@ -69,68 +76,36 @@ The drug dug the smug plug. --- -**?????** -``` -[rs:16;\N] -{ - [r:50]{([rr])\u2593|([re])\s} -} -``` -``` -▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓ ▓ ▓ ▓ -▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓▓▓ ▓ ▓ -▓▓▓▓▓▓ ▓▓▓▓▓ ▓ ▓▓▓ ▓ ▓ ▓ ▓▓▓▓ ▓▓ ▓ ▓ -▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓ ▓ ▓▓ ▓▓ ▓▓ -▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓ ▓▓ ▓ ▓ ▓ ▓ ▓ ▓▓▓▓ ▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓▓▓▓▓ ▓ ▓ ▓▓ -▓▓▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓ ▓▓ ▓▓▓ ▓ ▓ ▓ ▓ ▓ -▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓ ▓▓ ▓▓ ▓▓▓▓ ▓▓▓ ▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓▓▓▓▓▓ ▓▓ ▓ -▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓▓ ▓ ▓▓▓▓▓▓▓ ▓ ▓ ▓ -▓▓▓▓▓▓▓▓▓▓ ▓ ▓▓ ▓▓▓ ▓▓▓▓▓ ▓ ▓▓ -▓▓▓▓ ▓▓▓▓▓▓▓ ▓▓▓ ▓ ▓▓▓ ▓ ▓ ▓ ▓ -▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓ ▓ ▓▓ ▓▓▓ ▓▓ ▓ -▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓ ▓ ▓ ▓ -▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓ ▓ ▓▓▓ ▓ -``` -##NuGet -Rant is also available as a [NuGet package](https://www.nuget.org/packages/Rant/). Punch the following into your package manager console and smash the Enter key enthusiastically to get it: +## NuGet +Rant is also available as a [NuGet package](https://www.nuget.org/packages/Rant/). +Enter this command in your package manager, +and the latest version of Rant will automagically get installed in your project: + ``` PM> Install-Package Rant ``` + Or if development builds are your thing: + ``` PM> Install-Package Rant -Pre ``` -But remember, the latest version will always be available on the repository first. +## Standard Dictionary +Rant's standard dictionary can be found [**here**](http://github.com/TheBerkin/Rantionary). -##License +## License Rant is provided under [The MIT License](https://github.com/TheBerkin/Rant/blob/master/LICENSE). -##Improve Rant -If there is something you want fixed, added, or changed, feel free to submit an issue/pull request. You are welcome to help with any of the following: -* Documentation -* Fixing bugs -* Optimization -* New functions -* New language features -* Improving old language features -* New API features -* Formatting support for other cultures - -##Learn Rant -See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of the API and Rant language, as well as additional example code. - -##Support Rant -If you love my work and want to support it by donating, you can do so [here](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&encrypted=-----BEGIN+PKCS7-----MIIHFgYJKoZIhvcNAQcEoIIHBzCCBwMCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYCnAa5a%2BlNDRPC3XmQ9m0fiEQcJzDJ0ukikmnDuVGFs%2BrGHX23SXuDeWT8v7FOAPu6Rdipva1soJIjJTUuk0HiEzwPAiSVjkV%2Fj8NSlcbPNnSyHEmiE7%2BDzKpJBGGA4WH8gwbtDUQ%2Be9ILdjUJIZ2KSwcWwbxexk0QP%2BAHKQ0i4xTELMAkGBSsOAwIaBQAwgZMGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIshT08dOlnw2AcGtKUFBUobeoq2XmJHDzw42kMkNWgad2zWdpmoL75wRaCKYjBDGX1MVw9NE5agB8QJfBdrNYZLZPB2i5lKBA%2BPccoi4c9us%2FSVLoNGffwTlY7dNvP%2F1EP0u%2BU3pX2X8e7JBjjcu%2FrdqyQJ5xJf8vGv%2BgggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS%2BNdl72T7oKJ4u4uw%2B6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe%2FhJl66%2FRGqrj5rFb08sAABNTzDTiqqNpJeBsYs%2Fc2aiGozptX2RlnBktH%2BSUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH%2FMA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71%2Bjq6OKidbWFSE%2BQ4FqROvdgIONth%2B8kSK%2F%2FY%2F4ihuE4Ymvzn5ceE3S%2FiBSQQMjyvb%2Bs2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa%2Bu4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xNTA2MjYwMzI3MjdaMCMGCSqGSIb3DQEJBDEWBBS8ixZRspLeAGmBXnwP4OjcWr228TANBgkqhkiG9w0BAQEFAASBgHnORUb9B9jxH0olsERVeNBf9hok18rGVNIvIedgiojMKSQb13UsNbN4ys%2BWln4OsOhcNh%2FKo2UthrwEB0gZEVNnD6%2BuDL1ogyFAadA3VNHrni7H7iCk3WrgsxgIynHGV68yAOqbcwp8WizAR%2BlHTaxRaZ2jwQ2O%2FRVI%2FkJ34QGs-----END+PKCS7-----%0A++++++++). Donating isn't required, but it's much appreciated! +## Improve Rant +If there is something you want fixed, added, or changed, feel free to submit an issue/pull request. I will try to get back to you within a day. -##Other projects -If you like Rant, you may also like these other, Rant-related projects: -* [**RIDE**](http://github.com/RantLang/RIDE): The official (and highly WIP) Rant IDE -* [**Rantionary**](http://github.com/TheBerkin/Rantionary): The official Rant dictionary +## Learn Rant +See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of the API and Rant language, as well as additional example code. -:squirrel: +## Donate +If you love my work and want to support it by donating, you can do so [here](paypal.me/nicholasfleck). +Donations help me afford better software and equipment for my projects, and any amount is very appreciated. +Thank you! \ No newline at end of file From a728d43582960b6d170991444fd3bbe86598b650 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 2 Aug 2016 15:19:11 -0500 Subject: [PATCH 028/213] Fix documentation paths for Unity build --- Rant/Rant.csproj | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 74d7381..53f5db1 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -43,7 +43,7 @@ C:\rant\ TRACE - bin\Release\Rant.xml + C:\rant\Rant.xml true pdbonly AnyCPU @@ -126,7 +126,7 @@ ..\bin\UnityBuild\ TRACE;UNITY - ..\bin\UnityBuild\Rant.xml + ..\bin\UnityBuild\Rant-Unity.xml true AnyCPU prompt @@ -134,9 +134,9 @@ false - bin\x86\Unity\ + ..\bin\UnityBuild\x86\ TRACE - ..\bin\MainBuild\Rant.xml + ..\bin\UnityBuild\x86\Rant-Unity.xml true x86 prompt @@ -144,9 +144,9 @@ false - bin\x64\Unity\ + ..\bin\UnityBuild\x64\ TRACE - ..\bin\MainBuild\Rant.xml + ..\bin\UnityBuild\x64\Rant-Unity.xml true x64 prompt @@ -171,6 +171,7 @@ + From ebdf84da59b39ef2c49661dc88a07183702b2fdb Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 2 Aug 2016 15:19:54 -0500 Subject: [PATCH 029/213] Add more function translations --- Rant/Localization/de-DE.lang | 16 ++++++++++++++++ Rant/Localization/en-US.lang | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 47dc048..1f4e107 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -42,6 +42,22 @@ func-repeach-desc = "Legt die Wiederholungsanzahl des nächsten Blockes auf die func-sep-desc = "Setzt den Wiederholungstrenner des nächsten Blockes." func-sep-separator-desc = "Der gewünschte Wiederholungstrenner des nächsten Blockes." +func-rs-desc = "Setzt die Wiederholungsanzahl und den Wiederholungstrenner des nächsten Blockes." +func-rs-times-desc = "Die Wiederholungsanzahl des nächsten Blockes." +func-rs-separator-desc = "Der Wiederholungstrenner des nächsten Blockes." + +func-before-desc = "Setzt das Wiederholungspräfix des nächsten Blockes." +func-before-pattern-desc = "Das gewünschte Wiederholungspräfix des nächsten Blockes." + +func-after-desc = "Setzt das Wiederholungssuffix des nächsten Blockes." +func-after-pattern-desc = "Das gewünschte Wiederholungssuffix des nächsten Blockes." + +func-first-desc = "Führt eine angegebene Vorlage aus, wenn der aktuelle Block auf der ersten Iteration läuft." +func-first-pattern-desc = "Die gewünschte Vorlage, die ausgeführt werden wird, wenn die Bedingung erfüllt ist." + +func-last-desc = "Führt eine angegebene Vorlage aus, wenn der aktuelle Block auf der letzten Iteration läuft." +func-last-pattern-desc = "Die gewünschte Vorlage, die ausgeführt werden wird, wenn die Bedingung erfüllt ist." + func-sepconj-desc = "Markiert den nächsten Block als Auflistung und setzt seinen Wiederholungstrenner und seine Konjunktionsvorlage." func-sepconj-separator-desc = "Der gewünschte Wiederholungstrenner des nächsten Blockes." func-sepconj-conjunction-desc = "Die gewünschte Konjunktionsvorlage des nächsten Blockes." diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 73b0f93..51dd0e1 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -42,6 +42,22 @@ func-repeach-desc = "Sets the repetition count to the number of items in the nex func-sep-desc = "Sets the separator pattern for the next block." func-sep-separator-desc = "The separator pattern to run between iterations of the next block." +func-rs-desc = "Sets the repetition count and separator pattern for the next block." +func-rs-times-desc = "The number of times to repeat the next block." +func-rs-separator-desc = "The separator pattern for the next block." + +func-before-desc = "Sets the iteration prefix of the next block." +func-before-pattern-desc = "The iteration prefix pattern to execute on the next block." + +func-after-desc = "Sets the iteration suffix of the next block." +func-after-pattern-desc = "The iteration suffix pattern to execute on the next block." + +func-first-desc = "Runs the specified pattern if the current block is on its first iteration. Otherwise, does nothing." +func-first-pattern-desc = "The pattern to run if the condition is met." + +func-last-desc = "Runs the specified pattern if the current block is on its last iteration. Otherwise, does nothing." +func-last-pattern-desc = "The pattern to run if the condition is met." + func-sepconj-desc = "Flags the next block as a series and sets the separator and conjunction patterns." func-sepconj-separator-desc = "The separator pattern to run between iterations of the next block." func-sepconj-conjunction-desc = "The conjunction pattern to run before the last item." From 90404ae0f36b0c28776c5a5e86188c7f3f67ad63 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 2 Aug 2016 15:20:12 -0500 Subject: [PATCH 030/213] Add additional test case for package versions --- Rant.Tests/PackageVersions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Rant.Tests/PackageVersions.cs b/Rant.Tests/PackageVersions.cs index 56d8cae..8f95d70 100644 --- a/Rant.Tests/PackageVersions.cs +++ b/Rant.Tests/PackageVersions.cs @@ -17,6 +17,7 @@ public void VersionGreaterThan(string v1, string v2, bool expactedResult) } [TestCase("2.2.1", "2.2.4", true)] + [TestCase("3.2.1", "2.1.4", false)] [TestCase("0.2.3", "0.2.4", true)] [TestCase("1.3.0", "0.5.4", false)] public void VersionLessThan(string v1, string v2, bool expectedResult) From a278fe23afb08174f2955b8c164fb1f5091cebd5 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 7 Aug 2016 21:37:31 -0500 Subject: [PATCH 031/213] Resolve merge conflict with QueryParser --- Rant/Core/Compiler/Parsing/QueryParser.cs | 264 +++++++++++++++++++++- 1 file changed, 263 insertions(+), 1 deletion(-) diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 2662a93..2f6aaa5 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.Text.RegularExpressions; using Rant.Core.Compiler.Syntax; +using Rant.Vocabulary.Querying; +using Rant.Core.Utilities; namespace Rant.Core.Compiler.Parsing { @@ -9,7 +12,266 @@ internal class QueryParser : Parser { public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { - throw new NotImplementedException(); + var tableName = reader.Read(R.Text, "query table name"); + var query = new Query(); + query.Name = tableName.Value; + query.ClassFilter = new ClassFilter(); + query.RegexFilters = new List<_>(); + query.Carrier = new Carrier(); + bool exclusiveRead = false; + bool subtypeRead = false; + + while (!reader.End) + { + var token = reader.ReadToken(); + + switch (token.ID) + { + // read subtype + case R.Subtype: + // if there's already a subtype, throw an error and ignore it + if (subtypeRead) + { + compiler.SyntaxError(token, "multiple subtypes in a query", false); + reader.Read(R.Text, "query subtype name"); + break; + } + // if the exclusive sign has already been read, throw an error and ignore it + if (exclusiveRead) + { + compiler.SyntaxError(token, "subtype should be before exclusive query sign.", false); + reader.Read(R.Text, "query subtype name"); + break; + } + query.Subtype = reader.Read(R.Text, "query subtype").Value; + subtypeRead = true; + break; + + // read class filter + case R.Hyphen: + { + bool blacklist = false; + // check if it's a blacklist filter + if (reader.PeekType() == R.Exclamation) + { + blacklist = true; + reader.ReadToken(); + } + var classFilterName = reader.Read(R.Text, "class filter rule"); + var rule = new ClassFilterRule(classFilterName.Value, !blacklist); + query.ClassFilter.AddRule(rule); + } + break; + + // read regex filter + case R.Without: + case R.Question: + { + bool blacklist = (token.ID == R.Without); + + var regexFilter = reader.Read(R.Regex, "regex filter rule"); + var rule = new _(!blacklist, Util.ParseRegex(regexFilter.Value)); + query.RegexFilters.Add(rule); + } + break; + + // read exclusive sign + case R.Dollar: + exclusiveRead = true; + query.Exclusive = true; + break; + + // read syllable range + case R.LeftParen: + // There are four possible types of values in a syllable range: + // (a), (a-), (-b), (a-b) + + // either (a), (a-), or (a-b) + if (reader.PeekLooseToken().ID == R.Text) + { + var firstNumberToken = reader.ReadLooseToken(); + int firstNumber; + if (!Util.ParseInt(firstNumberToken.Value, out firstNumber)) + { + compiler.SyntaxError(firstNumberToken, "syllable range value is not a valid integer"); + } + + // (a-) or (a-b) + if (reader.PeekLooseToken().ID == R.Hyphen) + { + reader.ReadLooseToken(); + // (a-b) + if (reader.PeekLooseToken().ID == R.Text) + { + var secondNumberToken = reader.ReadLooseToken(); + int secondNumber; + if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + { + compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); + } + + query.SyllablePredicate = new Range(firstNumber, secondNumber); + } + // (a-) + else + { + query.SyllablePredicate = new Range(firstNumber, null); + } + } + // (a) + else + { + query.SyllablePredicate = new Range(firstNumber, firstNumber); + } + } + // (-b) + else if (reader.PeekLooseToken().ID == R.Hyphen) + { + reader.ReadLooseToken(); + var secondNumberToken = reader.ReadLoose(R.Text, "syllable range value"); + int secondNumber; + if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + { + compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); + } + query.SyllablePredicate = new Range(null, secondNumber); + } + // () + else if (reader.PeekLooseToken().ID == R.RightParen) + { + compiler.SyntaxError(token, "empty syllable range", false); + } + // (something else) + else + { + compiler.SyntaxError(reader.PeekLooseToken(), "unexpected token in syllable range"); + } + + reader.ReadLoose(R.RightParen, "syllable range end"); + break; + + // read carriers + case R.DoubleColon: + ReadCarriers(reader, query.Carrier); + // this should be the last part of the query, so go to the end + goto end_of_loop; + + // end of query + case R.RightAngle: + goto end_of_loop; + + case R.Whitespace: + break; + + default: + compiler.SyntaxError(token, "unexpected token"); + break; + } + } + + end_of_loop: + + actionCallback(new RAQuery(query, tableName)); + yield break; + } + + private void ReadCarriers(TokenReader reader, Carrier carrier) + { + while (!reader.End) + { + var token = reader.ReadToken(); + + switch (token.ID) + { + // match carrier + case R.Equal: + { + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(CarrierComponent.Match, name.Value); + } + break; + + // associative and match associative, + // disassociative and match disassociative + // divergent and match-divergent + // relational and match-relational + case R.At: + { + var carrierType = CarrierComponent.Associative; + // disassociative + if (reader.PeekToken().ID == R.Exclamation) + { + carrierType = CarrierComponent.Dissociative; + reader.ReadToken(); + } + // divergent + else if (reader.PeekToken().ID == R.Plus) + { + carrierType = CarrierComponent.Divergent; + reader.ReadToken(); + } + else if (reader.PeekToken().ID == R.Question) + { + carrierType = CarrierComponent.Relational; + reader.ReadToken(); + } + + // match + if (reader.PeekToken().ID == R.Equal) + { + if (carrierType == CarrierComponent.Associative) + { + carrierType = CarrierComponent.MatchAssociative; + } + else if (carrierType == CarrierComponent.Dissociative) + { + carrierType = CarrierComponent.MatchDissociative; + } + else if (carrierType == CarrierComponent.Divergent) + { + carrierType = CarrierComponent.MatchDivergent; + } + else if (carrierType == CarrierComponent.Relational) + { + carrierType = CarrierComponent.MatchRelational; + } + reader.ReadToken(); + } + + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(carrierType, name.Value); + } + break; + + // unique and match unique + case R.Exclamation: + { + var carrierType = CarrierComponent.Unique; + // match unique + if (reader.PeekToken().ID == R.Equal) + { + carrierType = CarrierComponent.MatchUnique; + reader.ReadToken(); + } + + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(carrierType, name.Value); + } + break; + + // rhyming + case R.Ampersand: + { + var name = reader.Read(R.Text, "carrier name"); + carrier.AddComponent(CarrierComponent.Rhyme, name.Value); + } + break; + + // we're done, go away + case R.RightAngle: + return; + } + } } } } \ No newline at end of file From 0e0e5e4727ddd485f7fbbf86cec2336723243100 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 9 Aug 2016 15:41:33 -0500 Subject: [PATCH 032/213] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2e20e08..40bbe5c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-Rant logo +Rant logo

@@ -108,4 +108,4 @@ See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of th ## Donate If you love my work and want to support it by donating, you can do so [here](paypal.me/nicholasfleck). Donations help me afford better software and equipment for my projects, and any amount is very appreciated. -Thank you! \ No newline at end of file +Thank you! From 2bb18192e8cddbbe383c2b53315b29b45314c351 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Sun, 14 Aug 2016 03:48:13 -0400 Subject: [PATCH 033/213] Tentatively calling the compiler finished... --- Rant.Tests/BasicInput.cs | 2 +- Rant.Tests/Misc/Bson.cs | 6 +- Rant/Core/Compiler/CompileContext.cs | 22 +- Rant/Core/Compiler/Parsing/BlockParser.cs | 83 +++++++ Rant/Core/Compiler/Parsing/QueryParser.cs | 30 ++- Rant/Core/Compiler/Parsing/SequenceParser.cs | 61 ++++- Rant/Core/Compiler/Parsing/TagParser.cs | 222 +++++++++++++++++++ Rant/Core/Compiler/RantCompiler.cs | 12 +- Rant/Rant.csproj | 3 +- 9 files changed, 413 insertions(+), 28 deletions(-) create mode 100644 Rant/Core/Compiler/Parsing/BlockParser.cs create mode 100644 Rant/Core/Compiler/Parsing/TagParser.cs diff --git a/Rant.Tests/BasicInput.cs b/Rant.Tests/BasicInput.cs index 2b3f186..6d8601b 100644 --- a/Rant.Tests/BasicInput.cs +++ b/Rant.Tests/BasicInput.cs @@ -63,7 +63,7 @@ public void QuantifiedEscapeSequence() [Test] public void Whitespace() { - Assert.AreEqual(" ", rant.Do(@" { \s \s \4,s } ").Main); + Assert.AreEqual(rant.Do(@" { \s \s \4,s } ").Main, " "); } [Test] diff --git a/Rant.Tests/Misc/Bson.cs b/Rant.Tests/Misc/Bson.cs index 4766203..3b4950f 100644 --- a/Rant.Tests/Misc/Bson.cs +++ b/Rant.Tests/Misc/Bson.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using System.IO; +using System.Linq; using Rant.Core.IO.Bson; @@ -33,7 +34,8 @@ public void BsonByteAccurate() var data = document.ToByteArray(); File.WriteAllBytes("TestOutput.bson", data); // write the data for debugging purposes var exampleData = File.ReadAllBytes("TestFile.bson"); - CompareByteArrays(data, exampleData); + // we skip the first byte to account for the string table + CompareByteArrays(data.Skip(1).ToArray(), exampleData); } [Test(Description = "Compares a complex generated file to an example file.")] public void BsonComplexByteAccurate() @@ -53,7 +55,7 @@ public void BsonComplexByteAccurate() var data = document.ToByteArray(); File.WriteAllBytes("ComplexTestOutput.bson", data); var exampleData = File.ReadAllBytes("ComplexTestFile.bson"); - CompareByteArrays(data, exampleData); + CompareByteArrays(data.Skip(1).ToArray(), exampleData); } [Test] diff --git a/Rant/Core/Compiler/CompileContext.cs b/Rant/Core/Compiler/CompileContext.cs index 18b832d..87efa88 100644 --- a/Rant/Core/Compiler/CompileContext.cs +++ b/Rant/Core/Compiler/CompileContext.cs @@ -18,6 +18,26 @@ internal enum CompileContext ///

/// Point of execution is inside of a block. /// - BlockSequence + BlockSequence, + + /// + /// We're reading a block weight. + /// + BlockWeight, + + /// + /// We're reading a subroutine body. + /// + SubroutineBody, + + /// + /// The end of a block. + /// + BlockEndSequence, + + /// + /// The end of function arguments. + /// + FunctionEndContext } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs new file mode 100644 index 0000000..879beb6 --- /dev/null +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +using Rant.Core.Compiler.Syntax; +using Rant.Vocabulary.Querying; +using Rant.Core.Utilities; +using Rant.Core.Framework; + +namespace Rant.Core.Compiler.Parsing +{ + internal class BlockParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + { + var blockStartToken = reader.PrevLooseToken; + var items = new List(); + var actions = new List(); + + // "why are these not lists or arrays" i yell into the void, too lazy to find out why + var constantWeights = new List<_>(); + var dynamicWeights = new List<_>(); + var blockNumber = 0; + Action itemCallback = (action) => actions.Add(action); + + compiler.SetNextActionCallback(itemCallback); + compiler.AddContext(CompileContext.BlockEndSequence); + compiler.AddContext(CompileContext.BlockSequence); + while(compiler.NextContext == CompileContext.BlockSequence) + { + // block weight + if(reader.PeekLooseToken().ID == R.LeftParen) + { + Stringes.Stringe firstToken = reader.ReadLooseToken(); + + // constant weight + if(reader.PeekLooseToken().ID == R.Text) + { + var value = reader.ReadLooseToken().Value; + double doubleValue; + if(!double.TryParse(value, out doubleValue)) + { + compiler.SyntaxError(value, "invalid constant weight"); + } + constantWeights.Add(new _(blockNumber, doubleValue)); + } + // dynamic weight + else + { + var weightActions = new List(); + + Action weightActionCallback = (action) => weightActions.Add(action); + + compiler.SetNextActionCallback(weightActionCallback); + compiler.AddContext(CompileContext.BlockWeight); + yield return Get(); + + if(weightActions.Count > 0) + { + firstToken = weightActions[0].Range; + } + + dynamicWeights.Add(new _(blockNumber, new RASequence(weightActions, firstToken))); + } + + reader.Read(R.RightParen, "end of weight"); + } + + var startToken = reader.PeekToken(); + yield return Get(); + items.Add(new RASequence(actions, startToken)); + actions.Clear(); + blockNumber++; + } + + compiler.LeaveContext(); + compiler.SetNextActionCallback(actionCallback); + + actionCallback(new RABlock(blockStartToken, items, dynamicWeights, constantWeights)); + yield break; + } + } +} diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 58834e3..21e8e90 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -20,10 +20,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext query.Carrier = new Carrier(); bool exclusiveRead = false; bool subtypeRead = false; + bool endOfQueryReached = false; - while(!reader.End) + while(!reader.End && !endOfQueryReached) { - var token = reader.ReadToken(); + var token = reader.ReadLooseToken(); switch(token.ID) { @@ -49,6 +50,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // read class filter case R.Hyphen: + do { bool blacklist = false; // check if it's a blacklist filter @@ -61,6 +63,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var rule = new ClassFilterRule(classFilterName.Value, !blacklist); query.ClassFilter.AddRule(rule); } + while(reader.TakeLoose(R.Pipe)); //fyi: this feature is undocumented break; // read regex filter @@ -152,13 +155,15 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // read carriers case R.DoubleColon: - ReadCarriers(reader, query.Carrier); + ReadCarriers(reader, query.Carrier, compiler); // this should be the last part of the query, so go to the end - goto end_of_loop; + endOfQueryReached = true; + break; // end of query case R.RightAngle: - goto end_of_loop; + endOfQueryReached = true; + break; case R.Whitespace: break; @@ -168,18 +173,21 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; } } - - end_of_loop: + + if(!endOfQueryReached) + { + compiler.SyntaxError(reader.PrevToken, "unexpected end-of-pattern"); + } actionCallback(new RAQuery(query, tableName)); yield break; } - private void ReadCarriers(TokenReader reader, Carrier carrier) + private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler compiler) { while(!reader.End) { - var token = reader.ReadToken(); + var token = reader.ReadLooseToken(); switch(token.ID) { @@ -270,6 +278,10 @@ private void ReadCarriers(TokenReader reader, Carrier carrier) // we're done, go away case R.RightAngle: return; + + default: + compiler.SyntaxError(token, "unexpected token"); + break; } } } diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index c2de447..02d36ca 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -23,31 +23,29 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; case R.LeftSquare: - // TODO: Tags + yield return Get(); break; case R.LeftCurly: reader.SkipSpace(); - // Tell the compiler that we're about to read a block - compiler.SetNextContext(CompileContext.BlockSequence); - yield return Get(); + yield return Get(); break; case R.Pipe: if (context == CompileContext.BlockSequence) { - // TODO: Complete the element and start reading the next one + yield break; } else { goto default; // Print it if we're not in a block } - break; case R.RightCurly: if (context == CompileContext.BlockSequence) { - // TODO: Complete the element and terminate the block + compiler.LeaveContext(); + yield break; } else { @@ -55,12 +53,43 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } break; + // end of argument + case R.Semicolon: + if(context == CompileContext.ArgumentSequence) + { + yield break; + } + // this is probably just a semicolon in text + actionCallback(new RAText(token)); + break; + + case R.RightSquare: + // end of arguments + if(context == CompileContext.ArgumentSequence || context == CompileContext.SubroutineBody) + { + compiler.LeaveContext(); + yield break; + } + compiler.SyntaxError(token, "Unexpected tag end", false); + break; + + case R.RightAngle: + compiler.SyntaxError(token, "Unexpected query end."); + break; + + // the end of a block weight, maybe + case R.RightParen: + if(context == CompileContext.BlockWeight) + { + compiler.LeaveContext(); + yield break; + } + actionCallback(new RAText(token)); + break; + case R.Whitespace: switch (context) { - case CompileContext.DefaultSequence: - actionCallback(new RAText(token)); - break; case CompileContext.BlockSequence: switch (reader.PeekType()) { @@ -69,6 +98,9 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext continue; // Ignore whitespace at the end of block elements } break; + default: + actionCallback(new RAText(token)); + break; } break; @@ -77,6 +109,10 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; case R.EOF: + if(context != CompileContext.DefaultSequence) + { + compiler.SyntaxError(token, "unexpected end-of-pattern"); + } yield break; default: // Handle text @@ -84,6 +120,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; } } + + if(reader.End && context != CompileContext.DefaultSequence) + { + compiler.SyntaxError(reader.PrevToken, "unexpected end-of-pattern"); + } } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs new file mode 100644 index 0000000..3bd74d9 --- /dev/null +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +using Rant.Core.Compiler.Syntax; +using Rant.Vocabulary.Querying; +using Rant.Core.Utilities; +using Rant.Core.Framework; + +namespace Rant.Core.Compiler.Parsing +{ + internal class TagParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + { + var nextType = reader.PeekType(); + + // replacer + if(nextType == R.Regex) + { + var regex = reader.Read(R.Regex, "replacer regex"); + reader.Read(R.Colon); + + var arguments = new List(); + + var iterator = ReadArguments(compiler, reader, arguments); + while(iterator.MoveNext()) + { + yield return iterator.Current; + } + + compiler.SetNextActionCallback(actionCallback); + if(arguments.Count < 2) + { + compiler.SyntaxError(regex, "replacer requires source text and replacement pattern.", false); + reader.Read(R.RightSquare, "replacer end"); + yield break; + } + else if(arguments.Count > 2) + { + compiler.SyntaxError(arguments[2].Range, "replacer only takes two arguments.", false); + reader.Read(R.RightSquare, "replacer end"); + yield break; + } + + actionCallback(new RAReplacer(regex, Util.ParseRegex(regex.Value), arguments[0], arguments[1])); + yield break; + } + // subroutine + else if(nextType == R.Dollar) + { + reader.ReadToken(); + var e = ParseSubroutine(compiler, context, reader, actionCallback); + while(e.MoveNext()) + { + yield return e.Current; + } + yield break; + } + // function + else + { + var e = ParseFunction(compiler, context, reader, actionCallback); + while(e.MoveNext()) + { + yield return e.Current; + } + + yield break; + } + } + + private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + { + var functionName = reader.Read(R.Text, "function name"); + + var arguments = new List(); + + if(reader.PeekType() == R.Colon) + { + reader.ReadToken(); + + var iterator = ReadArguments(compiler, reader, arguments); + while(iterator.MoveNext()) + { + yield return iterator.Current; + } + + compiler.SetNextActionCallback(actionCallback); + } + else + { + reader.Read(R.RightSquare, "function tag end"); + } + + if(!RantFunctionRegistry.FunctionExists(functionName.Value)) + { + compiler.SyntaxError(functionName, "function " + functionName.Value + " does not exist.", false); + yield break; + } + + var sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count); + if(sig == null) + { + compiler.SyntaxError(functionName, "function " + functionName.Value + " has no overload with " + arguments.Count + " arguments.", false); + yield break; + } + + actionCallback(new RAFunction(functionName, sig, arguments)); + yield break; + } + + private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + { + // subroutine definition + if(reader.TakeLoose(R.LeftSquare, false)) + { + var inModule = false; + + if(reader.TakeLoose(R.Subtype)) + { + inModule = true; + compiler.HasModule = true; + } + var subroutineName = reader.ReadLoose(R.Text, "subroutine name"); + var subroutine = new RADefineSubroutine(subroutineName); + subroutine.Parameters = new Dictionary(); + + if(reader.PeekLooseToken().ID == R.Colon) + { + reader.ReadLooseToken(); + + do + { + var type = SubroutineParameterType.Greedy; + if(reader.TakeLoose(R.At)) + { + type = SubroutineParameterType.Loose; + } + + subroutine.Parameters[reader.ReadLoose(R.Text, "argument name").Value] = type; + } while(reader.TakeLoose(R.Semicolon, false)); + } + + reader.ReadLoose(R.RightSquare, "end of subroutine definition arguments"); + var bodyStart = reader.ReadLoose(R.Colon); + + var actions = new List(); + Action bodyActionCallback = (action) => actions.Add(action); + + compiler.AddContext(CompileContext.SubroutineBody); + compiler.SetNextActionCallback(bodyActionCallback); + yield return Get(); + compiler.SetNextActionCallback(actionCallback); + + subroutine.Body = new RASequence(actions, bodyStart); + if(inModule) + { + compiler.Module.AddActionFunction(subroutineName.Value, subroutine); + } + actionCallback(subroutine); + yield break; + } + else + { + // subroutine call + var subroutineName = reader.Read(R.Text, "subroutine name"); + string moduleFunctionName = null; + + if(reader.TakeLoose(R.Subtype, false)) + { + moduleFunctionName = reader.Read(R.Text, "module function name").Value; + } + + var arguments = new List(); + + if(reader.PeekType() == R.Colon) + { + reader.ReadToken(); + + var iterator = ReadArguments(compiler, reader, arguments); + while(iterator.MoveNext()) + { + yield return iterator.Current; + } + + compiler.SetNextActionCallback(actionCallback); + } + else + { + reader.Read(R.RightSquare, "function tag end"); + } + + var subroutine = new RACallSubroutine(subroutineName, moduleFunctionName); + subroutine.Arguments = arguments; + + actionCallback(subroutine); + yield break; + } + } + + private IEnumerator ReadArguments(RantCompiler compiler, TokenReader reader, List arguments) + { + var actions = new List(); + + Action argActionCallback = (action) => actions.Add(action); + compiler.SetNextActionCallback(argActionCallback); + compiler.AddContext(CompileContext.FunctionEndContext); + compiler.AddContext(CompileContext.ArgumentSequence); + + while(compiler.NextContext == CompileContext.ArgumentSequence) + { + var startToken = reader.PeekToken(); + yield return Get(); + arguments.Add(new RASequence(actions, startToken)); + actions.Clear(); + } + + compiler.LeaveContext(); + } + } +} diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 8f74bb7..4ea4808 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -16,11 +16,12 @@ internal class RantCompiler private readonly string _sourceName; private readonly TokenReader _reader; - private CompileContext _nextContext = CompileContext.DefaultSequence; + private Stack _contextStack = new Stack(); private Action _nextActionCallback = null; internal bool HasModule = false; internal readonly RantModule Module; + internal CompileContext NextContext => _contextStack.Peek(); public RantCompiler(string sourceName, string source) { @@ -31,7 +32,9 @@ public RantCompiler(string sourceName, string source) _reader = new TokenReader(sourceName, RantLexer.GenerateTokens(sourceName, _source = source.ToStringe())); } - public void SetNextContext(CompileContext context) => _nextContext = context; + public void AddContext(CompileContext context) => _contextStack.Push(context); + + public void LeaveContext() => _contextStack.Pop(); public void SetNextActionCallback(Action callback) => _nextActionCallback = callback; @@ -40,10 +43,11 @@ public RantAction Compile() var parser = Parser.Get(); var stack = new Stack>(); var actionList = new List(); + _contextStack.Push(CompileContext.DefaultSequence); _nextActionCallback = a => actionList.Add(a); - stack.Push(parser.Parse(this, _nextContext, _reader, _nextActionCallback)); + stack.Push(parser.Parse(this, NextContext, _reader, _nextActionCallback)); top: while (stack.Any()) @@ -54,7 +58,7 @@ public RantAction Compile() { if (p.Current == null) continue; - stack.Push(p.Current.Parse(this, _nextContext, _reader, _nextActionCallback)); + stack.Push(p.Current.Parse(this, NextContext, _reader, _nextActionCallback)); goto top; } diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 216dc59..92ffbe5 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -167,11 +167,12 @@ + + - From a4ce8dbb5aa9c2b2c85939a6321d257f1a75caae Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 14 Aug 2016 04:13:05 -0500 Subject: [PATCH 034/213] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 40bbe5c..5b88b96 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,6 @@ If there is something you want fixed, added, or changed, feel free to submit an See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of the API and Rant language, as well as additional example code. ## Donate -If you love my work and want to support it by donating, you can do so [here](paypal.me/nicholasfleck). +If you love my work and want to support it by donating, you can do so [here](http://paypal.me/nicholasfleck). Donations help me afford better software and equipment for my projects, and any amount is very appreciated. Thank you! From 8c40d768e1cd42261d31b2362dbdeb03c2658e42 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 14 Aug 2016 15:27:01 -0500 Subject: [PATCH 035/213] Fix synchronizer and whitespace issues --- Rant.Tests/BasicInput.cs | 14 ++- Rant.Tests/Blocks.cs | 9 +- Rant/Core/Compiler/Parsing/BlockParser.cs | 21 +++-- Rant/Core/Compiler/Parsing/SequenceParser.cs | 2 +- Rant/Core/Compiler/Syntax/RABlock.cs | 1 + Rant/Core/Compiler/TokenLocation.cs | 22 +++++ Rant/Core/Constructs/BlockAttribs.cs | 4 +- Rant/Core/IO/Bson/BsonDocument.cs | 20 ++--- Rant/Core/Stringes/StringeReader.cs | 11 +++ Rant/Localization/de-DE.lang | 16 +++- Rant/Localization/en-US.lang | 12 +++ Rant/Vocabulary/RantDictionaryTable.Loader.cs | 8 -- Rant/Vocabulary/RantDictionaryTerm.cs | 86 +++++++++++++------ Rave/DicDoc/TablePageGenerator.cs | 6 +- Rebracer.xml | 5 +- 15 files changed, 173 insertions(+), 64 deletions(-) create mode 100644 Rant/Core/Compiler/TokenLocation.cs diff --git a/Rant.Tests/BasicInput.cs b/Rant.Tests/BasicInput.cs index 6d8601b..a76303c 100644 --- a/Rant.Tests/BasicInput.cs +++ b/Rant.Tests/BasicInput.cs @@ -42,6 +42,12 @@ public void EscapeSequences() Assert.AreEqual("[Lorem ipsum]", rant.Do(@"\[Lorem ipsum\]").Main); } + [Test] + public void EscapedSpaces() + { + Assert.AreEqual(" ", rant.Do(@"\s\s\s\s").Main); + } + [Test] public void UnicodeCharacters() { @@ -63,8 +69,12 @@ public void QuantifiedEscapeSequence() [Test] public void Whitespace() { - Assert.AreEqual(rant.Do(@" { \s \s \4,s } ").Main, " "); - } + Assert.AreEqual(" ", rant.Do(@"\s \s \4,s").Main); + Assert.AreEqual(" ", rant.Do(@"{\s\s\6,s}").Main); + Assert.AreEqual(" ", rant.Do(@"{\s \s \4,s}").Main); + Assert.AreEqual(" ", rant.Do(@" { \s \s \4,s} ").Main); + Assert.AreEqual(" ", rant.Do(@" { \s \s \4,s } ").Main); + } [Test] public void SymbolFunctions() diff --git a/Rant.Tests/Blocks.cs b/Rant.Tests/Blocks.cs index 29f796b..81d3832 100644 --- a/Rant.Tests/Blocks.cs +++ b/Rant.Tests/Blocks.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using NUnit.Framework; @@ -53,7 +54,11 @@ public void BlockDepth() [Test] public void LockedSynchronizer() { - Assert.IsTrue(rant.Do(@"[r:10k][x:_;locked]{A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|1|2|3|4|5|6|7|8|9|0}").Main.Distinct().Count() == 1); + var output = + rant.Do(@"[r:100][x:_;locked]{A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|1|2|3|4|5|6|7|8|9|0}", seed: 0) + .Main; + Console.WriteLine(output); + Assert.IsTrue(output.Distinct().Count() == 1); } [Test] diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 384620d..5b4e550 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -18,27 +18,33 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var actions = new List(); // "why are these not lists or arrays" i yell into the void, too lazy to find out why - var constantWeights = new List<_>(); - var dynamicWeights = new List<_>(); + List<_> constantWeights = null; + List<_> dynamicWeights = null; var blockNumber = 0; Action itemCallback = (action) => actions.Add(action); compiler.SetNextActionCallback(itemCallback); compiler.AddContext(CompileContext.BlockEndSequence); compiler.AddContext(CompileContext.BlockSequence); - while(compiler.NextContext == CompileContext.BlockSequence) + + //reader.SkipSpace(); + + while (compiler.NextContext == CompileContext.BlockSequence) { // block weight - if(reader.PeekLooseToken().ID == R.LeftParen) + if (reader.PeekLooseToken().ID == R.LeftParen) { + constantWeights = constantWeights ?? (constantWeights = new List<_>()); + dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); + Stringes.Stringe firstToken = reader.ReadLooseToken(); // constant weight - if(reader.PeekLooseToken().ID == R.Text) + if (reader.PeekLooseToken().ID == R.Text) { var value = reader.ReadLooseToken().Value; double doubleValue; - if(!double.TryParse(value, out doubleValue)) + if (!double.TryParse(value, out doubleValue)) { compiler.SyntaxError(value, "invalid constant weight"); } @@ -55,7 +61,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.AddContext(CompileContext.BlockWeight); yield return Get(); - if(weightActions.Count > 0) + if (weightActions.Count > 0) { firstToken = weightActions[0].Range; } @@ -77,7 +83,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.SetNextActionCallback(actionCallback); actionCallback(new RABlock(blockStartToken, items, dynamicWeights, constantWeights)); - yield break; } } } diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 30a3c1e..7139e1c 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -97,7 +97,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext case R.RightCurly: continue; // Ignore whitespace at the end of block elements } - break; + goto default; default: actionCallback(new RAText(token)); break; diff --git a/Rant/Core/Compiler/Syntax/RABlock.cs b/Rant/Core/Compiler/Syntax/RABlock.cs index 365306d..e244625 100644 --- a/Rant/Core/Compiler/Syntax/RABlock.cs +++ b/Rant/Core/Compiler/Syntax/RABlock.cs @@ -114,6 +114,7 @@ public override IEnumerator Run(Sandbox sb) block.Next(next); sb.Blocks.Pop(); // Don't allow separator to access block state + // Separator if (i > 0 && attribs.Separator != null) { diff --git a/Rant/Core/Compiler/TokenLocation.cs b/Rant/Core/Compiler/TokenLocation.cs new file mode 100644 index 0000000..180b3eb --- /dev/null +++ b/Rant/Core/Compiler/TokenLocation.cs @@ -0,0 +1,22 @@ +using Rant.Core.Stringes; + +namespace Rant.Core.Compiler +{ + internal struct TokenLocation + { + public int Line; + public int Column; + public int Index; + public int Length; + + public TokenLocation(int line, int column, int index, int length) + { + Line = line; + Column = column; + Index = index; + Length = length; + } + + public static TokenLocation FromStringe(Stringe stringe) => new TokenLocation(stringe.Line, stringe.Column, stringe.Offset, stringe.Length); + } +} \ No newline at end of file diff --git a/Rant/Core/Constructs/BlockAttribs.cs b/Rant/Core/Constructs/BlockAttribs.cs index 3847e3c..48ae0e7 100644 --- a/Rant/Core/Constructs/BlockAttribs.cs +++ b/Rant/Core/Constructs/BlockAttribs.cs @@ -1,4 +1,6 @@ -using Rant.Core.Compiler.Syntax; +using System; + +using Rant.Core.Compiler.Syntax; namespace Rant.Core.Constructs { diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs index 16cab82..0916655 100644 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ b/Rant/Core/IO/Bson/BsonDocument.cs @@ -45,10 +45,10 @@ public BsonItem this[string key] public Dictionary ReverseStringTable => _reverseStringTable; - private Dictionary _stringTable; - private Dictionary _reverseStringTable; // for reading + private readonly Dictionary _stringTable; + private readonly Dictionary _reverseStringTable; // for reading private int _stringTableIndex = 0; - private BsonStringTableMode _stringTableMode = BsonStringTableMode.None; + private readonly BsonStringTableMode _stringTableMode = BsonStringTableMode.None; /// /// Creates an empty BSON document. @@ -137,14 +137,12 @@ internal void Write(EasyWriter writer) internal void WriteStringTable(EasyWriter writer, bool include) { writer.Write(include); - if (include) - { - writer.Write((byte)_stringTableMode); - writer.Write((byte)STRING_TABLE_VERSION); - var stringTableBytes = GenerateStringTable(); - writer.Write(stringTableBytes.Length); - writer.Write(stringTableBytes); - } + if (!include) return; + writer.Write((byte)_stringTableMode); + writer.Write((byte)STRING_TABLE_VERSION); + var stringTableBytes = GenerateStringTable(); + writer.Write(stringTableBytes.Length); + writer.Write(stringTableBytes); } private void WriteItem(EasyWriter writer, BsonItem item, string name, bool isTop = false, bool isArray = false) diff --git a/Rant/Core/Stringes/StringeReader.cs b/Rant/Core/Stringes/StringeReader.cs index 9d311f9..bad76e1 100644 --- a/Rant/Core/Stringes/StringeReader.cs +++ b/Rant/Core/Stringes/StringeReader.cs @@ -110,6 +110,17 @@ public Stringe ReadUntilAny(params char[] values) return _stringe.Substringe(start, _pos - start); } + /// + /// Reads to the end of the current line. + /// + /// + public Stringe ReadRestOfLine() + { + int start = _pos; + while (_pos < _stringe.Length && !"\r\n".Contains(_stringe[_pos].Character)) _pos++; + return _stringe.Substringe(start, _pos - start); + } + /// /// Indicates whether the specified character occurs at the reader's current position, and consumes it. /// diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 1f4e107..184cc94 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -13,19 +13,33 @@ err-empty-pkg-id = "Der Paketbezeichner (ID) darf nicht leer sein." err-file-corrupt = "Die Datei ist fehlerhaft oder das Datenformat wird nicht unterstützt." err-invalid-tablename = "Ungültiger Tabellename: {0}" err-invalid-subtypes = "Ein oder mehrere Subtypnamen sind ungültig: {0}" +err-incomplete-term-split = "Begrifftrennindizes müssen entweder beide positiv, beide negativ oder beide null sein." +err-invalid-term-split = "Begrifftrennindex liegt außerhalb seiner entsprechenden Zeichenkette. Er muss kleiner oder gleich der Länge der Zeichenkette sein." +err-empty-entry = "Leeren Wörterbucheintrag gefunden." +err-missing-table-name = "#name-Anweisung vor der Eintragliste erwartet." +err-empty-property = "Leeres Eigenschaftsfeld gefunden." +err-misplaced-directive = "Die {0}-Anweisung darf nur im Header sein." +err-invalid-weight = "Ungültigen Eintragsgewichtswert gefunden." err-pattern-timeout = "Der Ausführungszeitraum ist abgelaufen ({0} Sekunden)." err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Maximaltiefe: {0})." err-generic-runtime = "Ein unspezifizierter Laufzeitfehler ist aufgetreten." err-generic-compiler = "Ein unspezifizierter Erstellungsfehler ist aufgetreten." -err-unknown-flag = "Unbekannter Flagwert: '{0}'" +err-unknown-flag = "Unbekannten Flagwert gefunden: '{0}'" err-compiler-eof = "Unerwartetes Dateiende." err-compiler-unexpected-token = "Unerwartetes Token gefunden: '{0}'" err-compiler-nonexistent-function = "Die Funktion '{0}' existiert nicht." err-compiler-missing-token = "{0} erwartet." err-compiler-bad-escape = "Unerkannte Escapesequenz: {0}" +err-compiler-empty-sylrange = "Leerer Silbenbereich." +err-compiler-bad-sylrange-value = "Silbenbereichswert muss Ganzzahl sein." +err-compiler-multiple-subtypes = "Mehrere Subtypen in Anfrage gefunden." + +token-carrier-name = "Anfragezustandspeichernamen" +token-table-name = "Tabellenamen" +token-class-filter-rule = "Klassenfilterteil" missing-table = "[Fehlende Tabelle]" bad-subtype = "[Ungültiger Subtyp]" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 51dd0e1..0a2a16c 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -13,6 +13,13 @@ err-empty-pkg-id = "The package ID cannot be empty." err-file-corrupt = "File is corrupt or in an unsupported/unrecognized format." err-invalid-tablename = "Invalid table name: {0}" err-invalid-subtypes = "Invalid subtype name(s) found: {0}" +err-incomplete-term-split = "Term split indices must be both positive or both negative." +err-invalid-term-split = "Split index is outside the range of its associated string. Must be less than or equal to the string length." +err-empty-entry = "Empty dictionary entry found." +err-missing-table-name = "Expected #name directive before entry list." +err-empty-property = "Empty property field found." +err-misplaced-directive = "The {0} directive can only be used in the file header." +err-invalid-weight = "Invalid entry weight value." err-pattern-timeout = "The pattern execution timed out ({0} seconds)." err-stack-overflow = "Exceeded the maximum stack size ({0})." @@ -26,6 +33,11 @@ err-compiler-unexpected-token = "Unexpected token found: '{0}'" err-compiler-nonexistent-function = "The specified function '{0}' does not exist." err-compiler-missing-token = "Expected {0}." err-compiler-bad-escape = "Invalid escape sequence: {0}" +err-compiler-empty-sylrange = "Empty syllable range." + +token-carrier-name = "carrier name" +token-table-name = "table name" +token-class-filter-rule = "class filter rule" missing-table = "[Missing Table]" bad-subtype = "[Bad Subtype]" diff --git a/Rant/Vocabulary/RantDictionaryTable.Loader.cs b/Rant/Vocabulary/RantDictionaryTable.Loader.cs index 9b4f38f..829d140 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Loader.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Loader.cs @@ -59,14 +59,6 @@ public static RantDictionaryTable FromFile(string path) if (!header) LoadError(path, token, "The #hidden directive may only be used in the file header."); if (Util.ValidateName(args[0])) hiddenClasses.Add(args[0]); break; - // Deprecated, remove in Rant 3 - case "nsfw": - scopedClassSet.Add("nsfw"); - break; - // Deprecated, remove in Rant 3 - case "sfw": - scopedClassSet.Remove("nsfw"); - break; case "class": { if (args.Length < 2) LoadError(path, token, "The #class directive expects an operation and at least one value."); diff --git a/Rant/Vocabulary/RantDictionaryTerm.cs b/Rant/Vocabulary/RantDictionaryTerm.cs index 34f24f6..0025ebe 100644 --- a/Rant/Vocabulary/RantDictionaryTerm.cs +++ b/Rant/Vocabulary/RantDictionaryTerm.cs @@ -1,5 +1,7 @@ using System; +using static Rant.Localization.Txtres; + namespace Rant.Vocabulary { /// @@ -8,10 +10,11 @@ namespace Rant.Vocabulary public sealed class RantDictionaryTerm { private string _value; - private string _pronunciation; - private string[] _pronParts; + private string _pronunciation = String.Empty; private string[] _syllables; private int _syllableCount; + private int _valueSplitIndex = -1; + private int _pronSplitIndex = -1; /// /// Creates a new dictionary term with the specified value. @@ -19,19 +22,40 @@ public sealed class RantDictionaryTerm /// The value of the term. public RantDictionaryTerm(string value) { - Value = value; - Pronunciation = ""; + if (value == null) throw new ArgumentNullException(nameof(value)); + _value = value; } /// /// Creates a new dictionary term with the specified value and pronunciation. /// /// The value of the term. - /// The pronunciation of the term. + /// The pronunciation of the term value. public RantDictionaryTerm(string value, string pronunciation) { - Value = value; - Pronunciation = pronunciation ?? ""; + if (value == null) throw new ArgumentNullException(nameof(value)); + _value = value; + _pronunciation = pronunciation ?? String.Empty; + } + + /// + /// Creates a new dictionary term with the specified value, pronunciation, and split indices. + /// + /// The value of the term. + /// The pronunciation of the term value. + /// The split index of the term value. Specify -1 for no split. + /// The split index of the term pronunciation string. Specify -1 for no split. Must be positive if the value is split and pronunciation data is present. + public RantDictionaryTerm(string value, string pronunciation, int valueSplitIndex, int pronSplitIndex) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + if (valueSplitIndex < 0 != pronSplitIndex < 0) throw new ArgumentException(GetString("err-incomplete-term-split")); + if (valueSplitIndex > _value.Length) throw new ArgumentException(GetString("err-invalid-term-split"), nameof(valueSplitIndex)); + if (pronSplitIndex > pronunciation?.Length) throw new ArgumentException(GetString("err-invalid-term-split"), nameof(pronSplitIndex)); + + _value = value; + _pronunciation = pronunciation ?? String.Empty; + _valueSplitIndex = valueSplitIndex; + _pronSplitIndex = pronSplitIndex; } /// @@ -40,7 +64,34 @@ public RantDictionaryTerm(string value, string pronunciation) public string Value { get { return _value; } - set { _value = value; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _value = value; + } + } + + /// + /// Determines whether the term is a split word. + /// + public bool IsSplit => _valueSplitIndex > -1; + + /// + /// Gets the split index of the term value. + /// + public int ValueSplitIndex + { + get { return _valueSplitIndex; } + set { _valueSplitIndex = value; } + } + + /// + /// Gets the split index of the term pronunciation string. + /// + public int PronunciationSplitIndex + { + get { return _pronSplitIndex; } + set { _pronSplitIndex = value; } } /// @@ -52,26 +103,14 @@ public string Pronunciation set { _pronunciation = value ?? ""; - if (_pronParts != null) CreatePronParts(); if (_syllables != null) CreateSyllables(); } } - /// - /// An array containing the individual elements of the pronunciation string. Used by the rhyming system. - /// - public string[] PronunciationParts - { - get { return _pronParts ?? CreatePronParts(); } - } - /// /// An array containing the individual syllables of the pronunciation string. /// - public string[] Syllables - { - get { return _syllables ?? CreateSyllables(); } - } + public string[] Syllables => _syllables ?? CreateSyllables(); /// /// The number of syllables in the pronunciation string. @@ -85,11 +124,6 @@ public int SyllableCount } } - private string[] CreatePronParts() - { - return _pronParts = _pronunciation.Split(new[] { ' ', '-' }, StringSplitOptions.RemoveEmptyEntries); - } - private string[] CreateSyllables() { _syllables = _pronunciation.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries); diff --git a/Rave/DicDoc/TablePageGenerator.cs b/Rave/DicDoc/TablePageGenerator.cs index 6eb4912..79756b6 100644 --- a/Rave/DicDoc/TablePageGenerator.cs +++ b/Rave/DicDoc/TablePageGenerator.cs @@ -189,7 +189,7 @@ public static string GenerateTableClassPage(RantDictionaryTable table, string ta writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.WriteEncodedText(e[i].Value); - if (e[i].PronunciationParts.Length > 0) + if (e[i].SyllableCount > 0) { writer.AddAttribute(HtmlTextWriterAttribute.Class, "terminfo"); writer.RenderBeginTag(HtmlTextWriterTag.Span); @@ -214,9 +214,9 @@ public static string GenerateTableClassPage(RantDictionaryTable table, string ta var notes = new List(); var otherClasses = e.GetClasses().Where(cl => cl != tableClass); - if (e.GetTerms().All(t => t.PronunciationParts.Length > 0)) + if (e.GetTerms().All(t => t.SyllableCount > 0)) notes.Add(html => html.WriteEncodedText("Full pronunciation")); - else if (e.GetTerms().Any(t => t.PronunciationParts.Length > 0)) + else if (e.GetTerms().Any(t => t.SyllableCount > 0)) notes.Add(html => html.WriteEncodedText("Partial pronunciation")); if (e.Weight != 1) notes.Add(html => html.WriteEncodedText("Weight: " + e.Weight)); diff --git a/Rebracer.xml b/Rebracer.xml index 5ad348b..2d39516 100644 --- a/Rebracer.xml +++ b/Rebracer.xml @@ -9,7 +9,10 @@ + 0 + 0 1 + 1 0 0 0 @@ -69,7 +72,7 @@ 1 0 1 - 1 + 0 0 0 1 From 4a66b557ac4345da24e59e47ecc86d79b1008227 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Sun, 14 Aug 2016 19:50:04 -0400 Subject: [PATCH 036/213] Exclusive query changes. --- Rant/Core/Compiler/Parsing/QueryParser.cs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index e59e986..11e4752 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -18,7 +18,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext query.ClassFilter = new ClassFilter(); query.RegexFilters = new List<_>(); query.Carrier = new Carrier(); - bool exclusiveRead = false; + query.Exclusive = reader.TakeLoose(R.Dollar); bool subtypeRead = false; bool endOfQueryReached = false; @@ -37,13 +37,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext reader.Read(R.Text, "query subtype name"); break; } - // if the exclusive sign has already been read, throw an error and ignore it - if(exclusiveRead) - { - compiler.SyntaxError(token, "subtype should be before exclusive query sign.", false); - reader.Read(R.Text, "query subtype name"); - break; - } query.Subtype = reader.Read(R.Text, "query subtype").Value; subtypeRead = true; break; @@ -78,12 +71,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } break; - // read exclusive sign - case R.Dollar: - exclusiveRead = true; - query.Exclusive = true; - break; - // read syllable range case R.LeftParen: // There are four possible types of values in a syllable range: From 044c009cdf62e95539d9c4e32b1d3e7f7875bf18 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 14 Aug 2016 19:53:06 -0500 Subject: [PATCH 037/213] Add a couple more tests, fix formatting --- Rant.Tests/Blocks.cs | 14 +++++++ Rant/Core/Compiler/Parsing/Parser.cs | 2 +- Rant/Core/Compiler/Parsing/SequenceParser.cs | 22 +++++----- Rant/Core/Compiler/Parsing/TagParser.cs | 42 ++++++++++---------- Rant/Core/Compiler/RantCompiler.cs | 2 +- 5 files changed, 48 insertions(+), 34 deletions(-) diff --git a/Rant.Tests/Blocks.cs b/Rant.Tests/Blocks.cs index 81d3832..a2d2b27 100644 --- a/Rant.Tests/Blocks.cs +++ b/Rant.Tests/Blocks.cs @@ -74,5 +74,19 @@ public void OxfordComma() Assert.AreEqual("dogs, dogs, dogs, and dogs", rant.Do(@"[r:4][s:,;,;and]{dogs}").Main); } + + [Test] + public void FormattedOxfordSeries() + { + Assert.AreEqual("Dogs, dogs, dogs, dogs, and dogs. Cats are also pretty neat.", + rant.Do(@"[case:sentence][r:5][s:,;,;and]{dogs}. cats are also pretty neat.").Main); + } + + [Test] + public void EnumerateItems() + { + Assert.AreEqual("ABCDEFGH", + rant.Do(@"[repeach][x:_;ordered]{A|B|C|D|E|F|G|H}").Main); + } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/Parser.cs b/Rant/Core/Compiler/Parsing/Parser.cs index cdc1eda..1b4dc6c 100644 --- a/Rant/Core/Compiler/Parsing/Parser.cs +++ b/Rant/Core/Compiler/Parsing/Parser.cs @@ -12,7 +12,7 @@ internal abstract class Parser public static T Get() where T : Parser { Parser parser; - if(!_parserMap.TryGetValue(typeof(T), out parser)) + if (!_parserMap.TryGetValue(typeof(T), out parser)) { parser = _parserMap[typeof(T)] = Activator.CreateInstance(typeof(T)) as T; } diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 7139e1c..5d335eb 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -12,11 +12,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { Token token; - while(!reader.End) + while (!reader.End) { token = reader.ReadToken(); - switch(token.ID) + switch (token.ID) { case R.LeftAngle: yield return Get(); @@ -32,7 +32,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; case R.Pipe: - if(context == CompileContext.BlockSequence) + if (context == CompileContext.BlockSequence) { yield break; } @@ -42,7 +42,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } case R.RightCurly: - if(context == CompileContext.BlockSequence) + if (context == CompileContext.BlockSequence) { compiler.LeaveContext(); yield break; @@ -55,7 +55,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // end of argument case R.Semicolon: - if(context == CompileContext.ArgumentSequence) + if (context == CompileContext.ArgumentSequence) { yield break; } @@ -65,7 +65,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext case R.RightSquare: // end of arguments - if(context == CompileContext.ArgumentSequence || context == CompileContext.SubroutineBody) + if (context == CompileContext.ArgumentSequence || context == CompileContext.SubroutineBody) { compiler.LeaveContext(); yield break; @@ -79,7 +79,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // the end of a block weight, maybe case R.RightParen: - if(context == CompileContext.BlockWeight) + if (context == CompileContext.BlockWeight) { compiler.LeaveContext(); yield break; @@ -88,10 +88,10 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; case R.Whitespace: - switch(context) + switch (context) { case CompileContext.BlockSequence: - switch(reader.PeekType()) + switch (reader.PeekType()) { case R.Pipe: case R.RightCurly: @@ -109,7 +109,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; case R.EOF: - if(context != CompileContext.DefaultSequence) + if (context != CompileContext.DefaultSequence) { compiler.SyntaxError(token, "unexpected end-of-pattern"); } @@ -121,7 +121,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } } - if(reader.End && context != CompileContext.DefaultSequence) + if (reader.End && context != CompileContext.DefaultSequence) { compiler.SyntaxError(reader.PrevToken, "unexpected end-of-pattern"); } diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index 50598bb..648cc49 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -16,7 +16,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var nextType = reader.PeekType(); // replacer - if(nextType == R.Regex) + if (nextType == R.Regex) { var regex = reader.Read(R.Regex, "replacer regex"); reader.Read(R.Colon); @@ -24,19 +24,19 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var arguments = new List(); var iterator = ReadArguments(compiler, reader, arguments); - while(iterator.MoveNext()) + while (iterator.MoveNext()) { yield return iterator.Current; } compiler.SetNextActionCallback(actionCallback); - if(arguments.Count < 2) + if (arguments.Count < 2) { compiler.SyntaxError(regex, "replacer requires source text and replacement pattern.", false); reader.Read(R.RightSquare, "replacer end"); yield break; } - else if(arguments.Count > 2) + else if (arguments.Count > 2) { compiler.SyntaxError(arguments[2].Range, "replacer only takes two arguments.", false); reader.Read(R.RightSquare, "replacer end"); @@ -47,11 +47,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext yield break; } // subroutine - else if(nextType == R.Dollar) + else if (nextType == R.Dollar) { reader.ReadToken(); var e = ParseSubroutine(compiler, context, reader, actionCallback); - while(e.MoveNext()) + while (e.MoveNext()) { yield return e.Current; } @@ -61,7 +61,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext else { var e = ParseFunction(compiler, context, reader, actionCallback); - while(e.MoveNext()) + while (e.MoveNext()) { yield return e.Current; } @@ -76,12 +76,12 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext var arguments = new List(); - if(reader.PeekType() == R.Colon) + if (reader.PeekType() == R.Colon) { reader.ReadToken(); var iterator = ReadArguments(compiler, reader, arguments); - while(iterator.MoveNext()) + while (iterator.MoveNext()) { yield return iterator.Current; } @@ -93,14 +93,14 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext reader.Read(R.RightSquare, "function tag end"); } - if(!RantFunctionRegistry.FunctionExists(functionName.Value)) + if (!RantFunctionRegistry.FunctionExists(functionName.Value)) { compiler.SyntaxError(functionName, "function " + functionName.Value + " does not exist.", false); yield break; } var sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count); - if(sig == null) + if (sig == null) { compiler.SyntaxError(functionName, "function " + functionName.Value + " has no overload with " + arguments.Count + " arguments.", false); yield break; @@ -113,11 +113,11 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { // subroutine definition - if(reader.TakeLoose(R.LeftSquare, false)) + if (reader.TakeLoose(R.LeftSquare, false)) { var inModule = false; - if(reader.TakeLoose(R.Subtype)) + if (reader.TakeLoose(R.Subtype)) { inModule = true; compiler.HasModule = true; @@ -126,20 +126,20 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex var subroutine = new RADefineSubroutine(subroutineName); subroutine.Parameters = new Dictionary(); - if(reader.PeekLooseToken().ID == R.Colon) + if (reader.PeekLooseToken().ID == R.Colon) { reader.ReadLooseToken(); do { var type = SubroutineParameterType.Greedy; - if(reader.TakeLoose(R.At)) + if (reader.TakeLoose(R.At)) { type = SubroutineParameterType.Loose; } subroutine.Parameters[reader.ReadLoose(R.Text, "argument name").Value] = type; - } while(reader.TakeLoose(R.Semicolon, false)); + } while (reader.TakeLoose(R.Semicolon, false)); } reader.ReadLoose(R.RightSquare, "end of subroutine definition arguments"); @@ -154,7 +154,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex compiler.SetNextActionCallback(actionCallback); subroutine.Body = new RASequence(actions, bodyStart); - if(inModule) + if (inModule) { compiler.Module.AddActionFunction(subroutineName.Value, subroutine); } @@ -167,19 +167,19 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex var subroutineName = reader.Read(R.Text, "subroutine name"); string moduleFunctionName = null; - if(reader.TakeLoose(R.Subtype, false)) + if (reader.TakeLoose(R.Subtype, false)) { moduleFunctionName = reader.Read(R.Text, "module function name").Value; } var arguments = new List(); - if(reader.PeekType() == R.Colon) + if (reader.PeekType() == R.Colon) { reader.ReadToken(); var iterator = ReadArguments(compiler, reader, arguments); - while(iterator.MoveNext()) + while (iterator.MoveNext()) { yield return iterator.Current; } @@ -208,7 +208,7 @@ private IEnumerator ReadArguments(RantCompiler compiler, TokenReader rea compiler.AddContext(CompileContext.FunctionEndContext); compiler.AddContext(CompileContext.ArgumentSequence); - while(compiler.NextContext == CompileContext.ArgumentSequence) + while (compiler.NextContext == CompileContext.ArgumentSequence) { var startToken = reader.PeekToken(); yield return Get(); diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 4ea4808..05118b8 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -16,7 +16,7 @@ internal class RantCompiler private readonly string _sourceName; private readonly TokenReader _reader; - private Stack _contextStack = new Stack(); + private readonly Stack _contextStack = new Stack(); private Action _nextActionCallback = null; internal bool HasModule = false; From 60bdfbe53da06eecaef5a7a516218ffa8494d9e0 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 14 Aug 2016 23:25:23 -0500 Subject: [PATCH 038/213] Add support for multiple compiler errors --- Rant.Tests/Compiler/Invalid.cs | 7 ++ Rant.Tests/Misc/Stringes.cs | 24 +++++ Rant.Tests/Rant.Tests.csproj | 1 + Rant/Core/Compiler/Parsing/TagParser.cs | 3 +- Rant/Core/Compiler/RantCompiler.cs | 71 ++++++++------ Rant/Core/Compiler/RantLexer.cs | 29 +++--- Rant/Core/Compiler/TokenReader.cs | 76 ++++++++++++--- Rant/Core/Stringes/Stringe.cs | 13 +-- Rant/Core/Stringes/StringeErrorDelegate.cs | 4 + Rant/Core/Stringes/StringeReader.cs | 11 +++ Rant/Localization/de-DE.lang | 3 + Rant/Localization/en-US.lang | 4 + Rant/Rant.csproj | 3 + Rant/RantCompilerException.cs | 108 ++++++++++++++------- Rant/RantCompilerMessage.cs | 31 ++++++ Rant/RantCompilerMessageType.cs | 11 +++ 16 files changed, 299 insertions(+), 100 deletions(-) create mode 100644 Rant.Tests/Misc/Stringes.cs create mode 100644 Rant/Core/Stringes/StringeErrorDelegate.cs create mode 100644 Rant/RantCompilerMessage.cs create mode 100644 Rant/RantCompilerMessageType.cs diff --git a/Rant.Tests/Compiler/Invalid.cs b/Rant.Tests/Compiler/Invalid.cs index 489e481..e1e8ae2 100644 --- a/Rant.Tests/Compiler/Invalid.cs +++ b/Rant.Tests/Compiler/Invalid.cs @@ -6,6 +6,13 @@ namespace Rant.Tests.Compiler [TestFixture] public class Invalid { + [Test] + [ExpectedException(typeof(RantCompilerException))] + public void IncompleteEscape() + { + RantPattern.FromString(@"\"); + } + [Test] [ExpectedException(typeof(RantCompilerException))] public void UnterminatedBlock() diff --git a/Rant.Tests/Misc/Stringes.cs b/Rant.Tests/Misc/Stringes.cs new file mode 100644 index 0000000..ed88bd1 --- /dev/null +++ b/Rant.Tests/Misc/Stringes.cs @@ -0,0 +1,24 @@ +using NUnit.Framework; + +using Rant.Core.Stringes; + +namespace Rant.Tests.Misc +{ + [TestFixture] + public class Stringes + { + [Test] + public void GlobalCol() + { + var s = new Stringe("Example"); + Assert.AreEqual(1, s.Column); + } + + [Test] + public void GlobalLine() + { + var s = new Stringe("Example"); + Assert.AreEqual(1, s.Line); + } + } +} \ No newline at end of file diff --git a/Rant.Tests/Rant.Tests.csproj b/Rant.Tests/Rant.Tests.csproj index 85af86b..8a7f096 100644 --- a/Rant.Tests/Rant.Tests.csproj +++ b/Rant.Tests/Rant.Tests.csproj @@ -70,6 +70,7 @@ + diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index 648cc49..da7b257 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -6,6 +6,7 @@ using Rant.Vocabulary.Querying; using Rant.Core.Utilities; using Rant.Core.Framework; +using Rant.Localization; namespace Rant.Core.Compiler.Parsing { @@ -95,7 +96,7 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext if (!RantFunctionRegistry.FunctionExists(functionName.Value)) { - compiler.SyntaxError(functionName, "function " + functionName.Value + " does not exist.", false); + compiler.SyntaxError(functionName, Txtres.GetString("err-compiler-nonexistent-function", functionName.Value), false); yield break; } diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 05118b8..60d52f0 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -15,10 +15,11 @@ internal class RantCompiler private readonly Stringe _source; private readonly string _sourceName; private readonly TokenReader _reader; - private readonly Stack _contextStack = new Stack(); private Action _nextActionCallback = null; + private List _errors; + // private List _warnings; internal bool HasModule = false; internal readonly RantModule Module; internal CompileContext NextContext => _contextStack.Peek(); @@ -28,10 +29,12 @@ public RantCompiler(string sourceName, string source) Module = new RantModule(sourceName); _sourceName = sourceName; - - _reader = new TokenReader(sourceName, RantLexer.GenerateTokens(sourceName, _source = source.ToStringe())); + _source = source.ToStringe(); + _reader = new TokenReader(sourceName, RantLexer.GenerateTokens(sourceName, _source, SyntaxError), this); } + public Stringe Source => _source; + public void AddContext(CompileContext context) => _contextStack.Push(context); public void LeaveContext() => _contextStack.Pop(); @@ -40,42 +43,56 @@ public RantCompiler(string sourceName, string source) public RantAction Compile() { - var parser = Parser.Get(); - var stack = new Stack>(); - var actionList = new List(); - _contextStack.Push(CompileContext.DefaultSequence); - - _nextActionCallback = a => actionList.Add(a); + try + { + var parser = Parser.Get(); + var stack = new Stack>(); + var actionList = new List(); + _contextStack.Push(CompileContext.DefaultSequence); - stack.Push(parser.Parse(this, NextContext, _reader, _nextActionCallback)); + _nextActionCallback = a => actionList.Add(a); - top: - while (stack.Any()) - { - var p = stack.Peek(); + stack.Push(parser.Parse(this, NextContext, _reader, _nextActionCallback)); - while (p.MoveNext()) + top: + while (stack.Any()) { - if (p.Current == null) continue; + var p = stack.Peek(); + + while (p.MoveNext()) + { + if (p.Current == null) continue; + + stack.Push(p.Current.Parse(this, NextContext, _reader, _nextActionCallback)); + goto top; + } - stack.Push(p.Current.Parse(this, NextContext, _reader, _nextActionCallback)); - goto top; + stack.Pop(); } - stack.Pop(); - } + if (_errors?.Count > 0) + throw new RantCompilerException(_sourceName, _errors); - return new RASequence(actionList, _source); + return new RASequence(actionList, _source); + } + catch (RantCompilerException) + { + throw; + } + catch (Exception ex) + { + throw new RantCompilerException(_sourceName, _errors, ex); + } } public void SyntaxError(Stringe token, string message, bool fatal = true) { - throw new RantCompilerException(_sourceName, token, message); - } - - public void SyntaxError(Stringe token, Exception innerException) - { - throw new RantCompilerException(_sourceName, token, innerException); + if (_errors == null) _errors = new List(); + _errors.Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, message, token?.Line ?? 0, token?.Column ?? 0, token?.Offset ?? -1)); + if (fatal) + { + throw new RantCompilerException(_sourceName, _errors); + } } } } diff --git a/Rant/Core/Compiler/RantLexer.cs b/Rant/Core/Compiler/RantLexer.cs index 00a67ca..1b70512 100644 --- a/Rant/Core/Compiler/RantLexer.cs +++ b/Rant/Core/Compiler/RantLexer.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Rant.Core.Stringes; +using Rant.Localization; namespace Rant.Core.Compiler { @@ -66,12 +67,20 @@ static RantLexer() reader => { if (!reader.Eat('\\')) return false; + if (reader.EndOfStringe) + { + reader.Error(reader.Stringe.Substringe(reader.Position - 1, 1), Txtres.GetString("err-compiler-incomplete-escape"), true); + return false; + } if (reader.EatWhile(Char.IsDigit)) { if (reader.Eat('.')) reader.EatWhile(Char.IsDigit); reader.EatAny('k', 'M', 'B'); if (!reader.Eat(',')) - throw new RantCompilerException(reader.Origin, reader.Stringe.Substringe(reader.Position - 1, 1), "Expected ',' after quantifier."); + { + reader.Error(reader.Stringe.Substringe(reader.Position - 1, 1), "Expected ',' after quantifier.", false); + return true; + } } if (reader.Eat('u')) { @@ -101,7 +110,10 @@ static RantLexer() if (reader.ReadChare() == '`') break; } if (reader.EndOfStringe) - throw new RantCompilerException(reader.Origin, token, "Unterminated regular expression."); + { + reader.Error(token, "Unterminated regular expression.", true); + return false; + } reader.Eat('i'); return true; }, R.Regex @@ -117,7 +129,8 @@ static RantLexer() reader.EatAll("\"\""); if (reader.ReadChare() == '"') return true; } - throw new RantCompilerException(reader.Origin, token, "Unterminated constant literal."); + reader.Error(token, "Unterminated constant literal.", true); + return false; }, R.ConstantLiteral }, {"[", R.LeftSquare}, {"]", R.RightSquare}, @@ -153,15 +166,9 @@ static RantLexer() Rules.Ignore(R.Ignore); } - /// - /// Generates beautiful tokens. - /// - /// The source name of the input. - /// The input string to tokenize. - /// - public static IEnumerable> GenerateTokens(string name, Stringe input) + public static IEnumerable> GenerateTokens(string name, Stringe input, StringeErrorDelegate errorCallback) { - var reader = new StringeReader(input) + var reader = new StringeReader(input, errorCallback) { Origin = name }; diff --git a/Rant/Core/Compiler/TokenReader.cs b/Rant/Core/Compiler/TokenReader.cs index c98b826..daaec46 100644 --- a/Rant/Core/Compiler/TokenReader.cs +++ b/Rant/Core/Compiler/TokenReader.cs @@ -4,17 +4,21 @@ using Rant.Core.Stringes; +using static Rant.Localization.Txtres; + namespace Rant.Core.Compiler { internal class TokenReader { private readonly string _sourceName; private readonly Token[] _tokens; + private readonly RantCompiler _compiler; private int _pos; - public TokenReader(string sourceName, IEnumerable> tokens) + public TokenReader(string sourceName, IEnumerable> tokens, RantCompiler compiler) { _sourceName = sourceName; + _compiler = compiler; _tokens = tokens.ToArray(); _pos = 0; } @@ -58,7 +62,11 @@ public Token PrevLooseToken /// public Token ReadToken() { - if (End) throw new RantCompilerException(_sourceName, null, "Unexpected end of file."); + if (End) + { + _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + return null; + } return _tokens[_pos++]; } @@ -77,7 +85,11 @@ public Token PeekToken() /// public Token PeekLooseToken() { - if (End) throw new RantCompilerException(_sourceName, null, "Unexpected end of file."); + if (End) + { + _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + return null; + } int pos = _pos; SkipSpace(); var token = _tokens[_pos]; @@ -129,7 +141,10 @@ public bool Take(R type, bool allowEof = true) if (End) { if (!allowEof) - throw new RantCompilerException(_sourceName, null, "Unexpected end-of-file."); + { + _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + return false; + } return false; } if (_tokens[_pos].ID != type) return false; @@ -148,7 +163,10 @@ public bool TakeLoose(R type, bool allowEof = true) if (End) { if (!allowEof) - throw new RantCompilerException(_sourceName, null, "Unexpected end-of-file."); + { + _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + return false; + } return false; } SkipSpace(); @@ -247,7 +265,10 @@ public bool TakeAll(R type, bool allowEof = true) if (End) { if (!allowEof) - throw new RantCompilerException(_sourceName, null, "Unexpected end-of-file."); + { + _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + return false; + } return false; } if (_tokens[_pos].ID != type) return false; @@ -269,7 +290,10 @@ public bool TakeAllLoose(R type, bool allowEof = true) if (End) { if (!allowEof) - throw new RantCompilerException(_sourceName, null, "Unexpected end-of-file."); + { + _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + return false; + } return false; } SkipSpace(); @@ -292,10 +316,14 @@ public bool TakeAllLoose(R type, bool allowEof = true) public Token Read(R type, string expectedTokenName = null) { if (End) - throw new RantCompilerException(_sourceName, null, "Expected " + (expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'") + ", but hit end of file."); + { + _compiler.SyntaxError(null, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + return null; + } if (_tokens[_pos].ID != type) { - throw new RantCompilerException(_sourceName, _tokens[_pos], "Expected " + (expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")); + _compiler.SyntaxError(_tokens[_pos], $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + return null; } return _tokens[_pos++]; } @@ -309,12 +337,17 @@ public Token Read(R type, string expectedTokenName = null) public Token ReadAny(params R[] types) { if (End) - throw new RantCompilerException(_sourceName, null, + { + _compiler.SyntaxError(null, $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}, but hit end of file."); + return null; + } if (!types.Contains(_tokens[_pos].ID)) // NOTE: .Contains isn't too fast but does it matter in this case? - throw new RantCompilerException(_sourceName, _tokens[_pos], - $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}."); + { + _compiler.SyntaxError(_tokens[_pos], $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}."); + return null; + } return _tokens[_pos++]; } @@ -329,11 +362,17 @@ public Token ReadAny(params R[] types) public Token ReadLoose(R type, string expectedTokenName = null) { if (End) - throw new RantCompilerException(_sourceName, null, "Expected " + (expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'") + ", but hit end of file."); + { + _compiler.SyntaxError(null, + $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + return null; + } SkipSpace(); if (_tokens[_pos].ID != type) { - throw new RantCompilerException(_sourceName, _tokens[_pos], "Expected " + (expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")); + _compiler.SyntaxError(_tokens[_pos], + $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}"); + return null; } var t = _tokens[_pos++]; SkipSpace(); @@ -397,7 +436,10 @@ public bool TakeSeriesLoose(Token[] buffer, int offset, params R[] types) public Token ReadLooseToken() { if (End) - throw new RantCompilerException(_sourceName, null, "Expected token, but hit end of file."); + { + _compiler.SyntaxError(null, GetString("err-compiler-eof")); + return null; + } SkipSpace(); var token = _tokens[_pos++]; SkipSpace(); @@ -416,7 +458,9 @@ public bool TakeAllWhile(Func, bool> predicate, bool allowEof = true) if (End) { if (!allowEof) - throw new RantCompilerException(_sourceName, null, "Unexpected end-of-file."); + { + _compiler.SyntaxError(null, GetString("err-compiler-eof")); + } return false; } diff --git a/Rant/Core/Stringes/Stringe.cs b/Rant/Core/Stringes/Stringe.cs index ee4fdd6..59916ae 100644 --- a/Rant/Core/Stringes/Stringe.cs +++ b/Rant/Core/Stringes/Stringe.cs @@ -727,16 +727,10 @@ public Stref(Stringe stringe, string str) String = str; Chares = new Chare[str.Length]; Bases = new bool[str.Length]; - if (str.Length == 0) - { - return; - } + if (str.Length == 0) return; var elems = StringInfo.GetTextElementEnumerator(str); - while (elems.MoveNext()) - { - Bases[elems.ElementIndex] = true; - } + while (elems.MoveNext()) Bases[elems.ElementIndex] = true; var length = str.Length; int line = 1; int col = 1; @@ -746,12 +740,13 @@ public Stref(Stringe stringe, string str) { line++; col = 1; + Chares[i] = new Chare(stringe, str[i], i, line, col); } else if (Bases[i]) // Advance column only for non-combining characters { + Chares[i] = new Chare(stringe, str[i], i, line, col); col++; } - Chares[i] = new Chare(stringe, str[i], i, line, col); } } } diff --git a/Rant/Core/Stringes/StringeErrorDelegate.cs b/Rant/Core/Stringes/StringeErrorDelegate.cs new file mode 100644 index 0000000..1001425 --- /dev/null +++ b/Rant/Core/Stringes/StringeErrorDelegate.cs @@ -0,0 +1,4 @@ +namespace Rant.Core.Stringes +{ + internal delegate void StringeErrorDelegate(Stringe token, string message, bool fatal); +} \ No newline at end of file diff --git a/Rant/Core/Stringes/StringeReader.cs b/Rant/Core/Stringes/StringeReader.cs index bad76e1..385bbe9 100644 --- a/Rant/Core/Stringes/StringeReader.cs +++ b/Rant/Core/Stringes/StringeReader.cs @@ -2,6 +2,8 @@ using System.Linq; using System.Text.RegularExpressions; +using Rant.Core.Compiler; + namespace Rant.Core.Stringes { /// @@ -11,6 +13,7 @@ internal sealed class StringeReader { private readonly Stringe _stringe; private int _pos; + private readonly StringeErrorDelegate _errorCallback; /// /// Gets or sets a string describing where the stringe originated from. Used for exception messages. @@ -42,11 +45,19 @@ public StringeReader(Stringe value) _pos = 0; } + public StringeReader(Stringe value, StringeErrorDelegate errorCallback) + { + _stringe = value; + _errorCallback = errorCallback; + } + /// /// Indicates whether the reader position is at the end of the input string. /// public bool EndOfStringe => _pos >= _stringe.Length; + public void Error(Stringe token, string message, bool fatal) => _errorCallback?.Invoke(token, message, fatal); + /// /// Reads a charactere from the input and advances the position by one. /// diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 184cc94..8b2ffe0 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -28,6 +28,9 @@ err-generic-runtime = "Ein unspezifizierter Laufzeitfehler ist aufgetreten." err-generic-compiler = "Ein unspezifizierter Erstellungsfehler ist aufgetreten." err-unknown-flag = "Unbekannten Flagwert gefunden: '{0}'" +compiler-errors-found = "{0} Erstellungsfehler sind aufgetreten:" +compiler-errors-also-found = "{0} Erstellungsfehler sind auch aufgetreten:" +compiler-error-also-found = "Einen Erstellungsfehler ist auch aufgetreten:" err-compiler-eof = "Unerwartetes Dateiende." err-compiler-unexpected-token = "Unerwartetes Token gefunden: '{0}'" err-compiler-nonexistent-function = "Die Funktion '{0}' existiert nicht." diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 0a2a16c..4b837db 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -28,12 +28,16 @@ err-generic-runtime = "An unspecified runtime error was encountered." err-generic-compiler = "An unspecified compiler error was encountered." err-unknown-flag = "Unknown flag value: '{0}'" +compiler-errors-found = "{0} compiler errors found:" +compiler-errors-also-found = "{0} compiler errors also found:" +compiler-error-also-found = "One compiler error also found:" err-compiler-eof = "Unexpected end of file." err-compiler-unexpected-token = "Unexpected token found: '{0}'" err-compiler-nonexistent-function = "The specified function '{0}' does not exist." err-compiler-missing-token = "Expected {0}." err-compiler-bad-escape = "Invalid escape sequence: {0}" err-compiler-empty-sylrange = "Empty syllable range." +err-compiler-incomplete-escape = "Incomplete escape sequence." token-carrier-name = "carrier name" token-table-name = "table name" diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 92ffbe5..34f5b3f 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -176,6 +176,7 @@ + @@ -234,6 +235,8 @@ + + diff --git a/Rant/RantCompilerException.cs b/Rant/RantCompilerException.cs index 3d58df1..ac9d99c 100644 --- a/Rant/RantCompilerException.cs +++ b/Rant/RantCompilerException.cs @@ -1,7 +1,12 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; using Rant.Core.Stringes; +using static Rant.Localization.Txtres; + namespace Rant { /// @@ -9,46 +14,77 @@ namespace Rant /// public sealed class RantCompilerException : Exception { - /// - /// The line on which the error occurred. - /// - public int Line { get; private set; } - /// - /// The column on which the error occurred. - /// - public int Column { get; private set; } - /// - /// The character index on which the error occurred. - /// - public int Index { get; private set; } - /// - /// The length of the token(s) on which the error occurred. - /// - public int Length { get; private set; } - - internal RantCompilerException(string name, Stringe source, string message) - : base(source != null - ? $"{name} @ Line {source.Line}, Col {source.Column}: {message}" - : $"{name}: {message}") + private readonly List _errorList; + + public string SourceName { get; } + public bool InternalError { get; } + + internal RantCompilerException(string sourceName, List errorList) + : base(GenerateErrorString(errorList)) + { + _errorList = errorList; + SourceName = sourceName; + InternalError = false; + } + + internal RantCompilerException(string sourceName, List errorList, Exception innerException) + : base(GenerateErrorStringWithInnerEx(errorList, innerException), innerException) + { + _errorList = errorList; + SourceName = sourceName; + InternalError = true; + } + + private static string GenerateErrorString(List list) + { + var writer = new StringBuilder(); + if (list.Count > 1) + { + writer.AppendLine(GetString("compiler-errors-found", list.Count)); + foreach (var error in list) + { + writer.Append('\t'); + writer.AppendLine(error.ToString()); + } + } + else + { + writer.Append(list.First()); + } + return writer.ToString(); + } + + private static string GenerateErrorStringWithInnerEx(List list, Exception inner) { - if (source == null) return; - Line = source.Line; - Column = source.Column; - Index = source.Offset; - Length = source.Length; + var writer = new StringBuilder(); + writer.AppendLine($"Compiler encountered an unexpected internal error of type '{inner.GetType().Name}'. See InnerException for details."); + + if (list != null && list.Any()) + { + writer.AppendLine(); + if (list.Count > 1) + { + writer.AppendLine(GetString("compiler-errors-also-found", list.Count)); + foreach (var error in list) + { + writer.Append('\t'); + writer.AppendLine(error.ToString()); + } + } + else + { + writer.AppendLine(GetString("compiler-error-also-found")); + writer.Append('\t'); + writer.AppendLine(list.First().ToString()); + } + } + return writer.ToString(); } - internal RantCompilerException(string name, Stringe source, Exception innerException) - : base(source != null - ? $"{name} @ Line {source.Line}, Col {source.Column}: {innerException.Message}" - : $"{name}: {innerException.Message}", - innerException) + public IEnumerable GetErrors() { - if (source == null) return; - Line = source.Line; - Column = source.Column; - Index = source.Offset; - Length = source.Length; + if (_errorList == null) yield break; + foreach (var error in _errorList) yield return error; } } } \ No newline at end of file diff --git a/Rant/RantCompilerMessage.cs b/Rant/RantCompilerMessage.cs new file mode 100644 index 0000000..7b378c9 --- /dev/null +++ b/Rant/RantCompilerMessage.cs @@ -0,0 +1,31 @@ +using Rant.Localization; + +namespace Rant +{ + public sealed class RantCompilerMessage + { + public RantCompilerMessageType Type { get; } + public string Source { get; } + public string Message { get; } + public int Line { get; } + public int Column { get; } + public int Index { get; } + + public RantCompilerMessage(RantCompilerMessageType type, string source, string message, int line, int column, int index) + { + Type = type; + Source = source; + Message = message; + Line = line; + Column = column; + Index = index; + } + + public override string ToString() + { + return Line > 0 + ? $"{Txtres.GetString("src-line-col", Source, Line, Column)} {Message}" + : $"({Source}) {Message}"; + } + } +} \ No newline at end of file diff --git a/Rant/RantCompilerMessageType.cs b/Rant/RantCompilerMessageType.cs new file mode 100644 index 0000000..a1cd6ae --- /dev/null +++ b/Rant/RantCompilerMessageType.cs @@ -0,0 +1,11 @@ +namespace Rant +{ + /// + /// Defines message types used by the Rant compiler. + /// + public enum RantCompilerMessageType + { + Warning, + Error + } +} \ No newline at end of file From 16af8cefde0bb16284dac4481b6a239bba1087f6 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 18 Aug 2016 23:33:46 -0500 Subject: [PATCH 039/213] Add compiler/runtime support for phrasal verbs --- Rant.Tests/Compiler/Invalid.cs | 6 ++ Rant.Tests/Compiler/Valid.cs | 50 +++++----- Rant/Core/Compiler/CompileContext.cs | 7 +- Rant/Core/Compiler/Parsing/BlockParser.cs | 22 ++--- Rant/Core/Compiler/Parsing/Parser.cs | 2 +- Rant/Core/Compiler/Parsing/QueryParser.cs | 72 +++++++++------ Rant/Core/Compiler/Parsing/SequenceParser.cs | 28 +++--- Rant/Core/Compiler/Parsing/TagParser.cs | 34 +++---- Rant/Core/Compiler/RantCompiler.cs | 10 +- Rant/Core/Compiler/Syntax/RAQuery.cs | 39 -------- .../Compiler/Syntax/{RantAction.cs => RST.cs} | 8 +- .../Syntax/{RABlock.cs => RstBlock.cs} | 16 ++-- ...CallSubroutine.cs => RstCallSubroutine.cs} | 12 +-- ...neSubroutine.cs => RstDefineSubroutine.cs} | 6 +- .../Syntax/{RAEscape.cs => RstEscape.cs} | 6 +- .../Syntax/{RAFunction.cs => RstFunction.cs} | 10 +- Rant/Core/Compiler/Syntax/RstQuery.cs | 79 ++++++++++++++++ .../Syntax/{RAReplacer.cs => RstReplacer.cs} | 10 +- .../Syntax/{RASequence.cs => RstSequence.cs} | 10 +- .../{RASubroutine.cs => RstSubroutine.cs} | 8 +- .../Compiler/Syntax/{RAText.cs => RstText.cs} | 8 +- Rant/Core/Constructs/BlockAttribs.cs | 14 +-- Rant/Core/Constructs/BlockManager.cs | 12 +-- Rant/Core/Framework/RantFunctionRegistry.cs | 92 +++++++++---------- Rant/Core/Framework/RantFunctionSignature.cs | 8 +- Rant/Core/ObjectModel/RantObject.cs | 8 +- Rant/Core/Sandbox.cs | 18 ++-- Rant/Rant.csproj | 23 ++--- Rant/RantPattern.cs | 2 +- Rant/Resources/RantModule.cs | 10 +- Rant/Vocabulary/Querying/Query.cs | 9 +- Rant/Vocabulary/RantDictionary.cs | 6 +- Rant/Vocabulary/RantDictionaryTable.cs | 11 ++- 33 files changed, 369 insertions(+), 287 deletions(-) delete mode 100644 Rant/Core/Compiler/Syntax/RAQuery.cs rename Rant/Core/Compiler/Syntax/{RantAction.cs => RST.cs} (62%) rename Rant/Core/Compiler/Syntax/{RABlock.cs => RstBlock.cs} (89%) rename Rant/Core/Compiler/Syntax/{RACallSubroutine.cs => RstCallSubroutine.cs} (79%) rename Rant/Core/Compiler/Syntax/{RADefineSubroutine.cs => RstDefineSubroutine.cs} (70%) rename Rant/Core/Compiler/Syntax/{RAEscape.cs => RstEscape.cs} (95%) rename Rant/Core/Compiler/Syntax/{RAFunction.cs => RstFunction.cs} (92%) create mode 100644 Rant/Core/Compiler/Syntax/RstQuery.cs rename Rant/Core/Compiler/Syntax/{RAReplacer.cs => RstReplacer.cs} (76%) rename Rant/Core/Compiler/Syntax/{RASequence.cs => RstSequence.cs} (59%) rename Rant/Core/Compiler/Syntax/{RASubroutine.cs => RstSubroutine.cs} (63%) rename Rant/Core/Compiler/Syntax/{RAText.cs => RstText.cs} (67%) diff --git a/Rant.Tests/Compiler/Invalid.cs b/Rant.Tests/Compiler/Invalid.cs index e1e8ae2..691f89c 100644 --- a/Rant.Tests/Compiler/Invalid.cs +++ b/Rant.Tests/Compiler/Invalid.cs @@ -181,5 +181,11 @@ public void MissingReplacerArgument() { RantPattern.FromString(@"[`\s*`:this is a test]"); } + + [Test] + [ExpectedException(typeof(RantCompilerException))] + { + RantPattern.FromString(@">"); + } } } \ No newline at end of file diff --git a/Rant.Tests/Compiler/Valid.cs b/Rant.Tests/Compiler/Valid.cs index 213369c..15c53e8 100644 --- a/Rant.Tests/Compiler/Valid.cs +++ b/Rant.Tests/Compiler/Valid.cs @@ -41,28 +41,34 @@ public void SubroutineParams(string args) RantPattern.FromString($"[$[test:{args}]:{{A|B|C|D}}]"); } - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] - [TestCase("")] + [TestCase(@"")] + [TestCase(@"< noun >")] + [TestCase(@"< noun.plural >")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@"")] + [TestCase(@" duck]>")] + [TestCase(@" ]>")] + [TestCase(@" ] -transitive>] -transitive>")] public void Queries(string query) { RantPattern.FromString(query); diff --git a/Rant/Core/Compiler/CompileContext.cs b/Rant/Core/Compiler/CompileContext.cs index 87efa88..7fce5d1 100644 --- a/Rant/Core/Compiler/CompileContext.cs +++ b/Rant/Core/Compiler/CompileContext.cs @@ -38,6 +38,11 @@ internal enum CompileContext /// /// The end of function arguments. /// - FunctionEndContext + FunctionEndContext, + + /// + /// Complement pattern for queries. + /// + QueryComplement } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 5b4e550..5f0f4ff 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -11,17 +11,17 @@ namespace Rant.Core.Compiler.Parsing { internal class BlockParser : Parser { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { var blockStartToken = reader.PrevLooseToken; - var items = new List(); - var actions = new List(); + var items = new List(); + var actions = new List(); // "why are these not lists or arrays" i yell into the void, too lazy to find out why List<_> constantWeights = null; - List<_> dynamicWeights = null; + List<_> dynamicWeights = null; var blockNumber = 0; - Action itemCallback = (action) => actions.Add(action); + Action itemCallback = (action) => actions.Add(action); compiler.SetNextActionCallback(itemCallback); compiler.AddContext(CompileContext.BlockEndSequence); @@ -35,7 +35,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext if (reader.PeekLooseToken().ID == R.LeftParen) { constantWeights = constantWeights ?? (constantWeights = new List<_>()); - dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); + dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); Stringes.Stringe firstToken = reader.ReadLooseToken(); @@ -53,9 +53,9 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // dynamic weight else { - var weightActions = new List(); + var weightActions = new List(); - Action weightActionCallback = (action) => weightActions.Add(action); + Action weightActionCallback = (action) => weightActions.Add(action); compiler.SetNextActionCallback(weightActionCallback); compiler.AddContext(CompileContext.BlockWeight); @@ -66,7 +66,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext firstToken = weightActions[0].Range; } - dynamicWeights.Add(new _(blockNumber, new RASequence(weightActions, firstToken))); + dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, firstToken))); } reader.Read(R.RightParen, "end of weight"); @@ -74,7 +74,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var startToken = reader.PeekToken(); yield return Get(); - items.Add(new RASequence(actions, startToken)); + items.Add(new RstSequence(actions, startToken)); actions.Clear(); blockNumber++; } @@ -82,7 +82,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.LeaveContext(); compiler.SetNextActionCallback(actionCallback); - actionCallback(new RABlock(blockStartToken, items, dynamicWeights, constantWeights)); + actionCallback(new RstBlock(blockStartToken, items, dynamicWeights, constantWeights)); } } } diff --git a/Rant/Core/Compiler/Parsing/Parser.cs b/Rant/Core/Compiler/Parsing/Parser.cs index 1b4dc6c..1051745 100644 --- a/Rant/Core/Compiler/Parsing/Parser.cs +++ b/Rant/Core/Compiler/Parsing/Parser.cs @@ -19,6 +19,6 @@ public static T Get() where T : Parser return parser as T; } - public abstract IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback); + public abstract IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback); } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 11e4752..50f57bf 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -3,6 +3,7 @@ using System.Text.RegularExpressions; using Rant.Core.Compiler.Syntax; +using Rant.Core.Stringes; using Rant.Vocabulary.Querying; using Rant.Core.Utilities; @@ -10,9 +11,9 @@ namespace Rant.Core.Compiler.Parsing { internal class QueryParser : Parser { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { - var tableName = reader.Read(R.Text, "query table name"); + var tableName = reader.ReadLoose(R.Text, "query table name"); var query = new Query(); query.Name = tableName.Value; query.ClassFilter = new ClassFilter(); @@ -20,34 +21,45 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext query.Carrier = new Carrier(); query.Exclusive = reader.TakeLoose(R.Dollar); bool subtypeRead = false; + bool directObjectRead = false; bool endOfQueryReached = false; - while(!reader.End && !endOfQueryReached) + while (!reader.End && !endOfQueryReached) { var token = reader.ReadLooseToken(); - switch(token.ID) + switch (token.ID) { // read subtype case R.Subtype: // if there's already a subtype, throw an error and ignore it - if(subtypeRead) + if (subtypeRead) { - compiler.SyntaxError(token, "multiple subtypes in a query", false); + compiler.SyntaxError(token, "multiple subtypes in query", false); reader.Read(R.Text, "query subtype name"); break; } query.Subtype = reader.Read(R.Text, "query subtype").Value; subtypeRead = true; break; - + // complement + case R.LeftSquare: + { + var seq = new List(); + compiler.AddContext(CompileContext.QueryComplement); + compiler.SetNextActionCallback(seq.Add); + yield return Get(); + compiler.SetNextActionCallback(actionCallback); + query.Complement = new RstSequence(seq, Stringe.Between(token, reader.PrevToken)); + } + break; // read class filter case R.Hyphen: do { bool blacklist = false; // check if it's a blacklist filter - if(reader.PeekType() == R.Exclamation) + if (reader.PeekType() == R.Exclamation) { blacklist = true; reader.ReadToken(); @@ -56,7 +68,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var rule = new ClassFilterRule(classFilterName.Value, !blacklist); query.ClassFilter.AddRule(rule); } - while(reader.TakeLoose(R.Pipe)); //fyi: this feature is undocumented + while (reader.TakeLoose(R.Pipe)); //fyi: this feature is undocumented break; // read regex filter @@ -77,25 +89,25 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // (a), (a-), (-b), (a-b) // either (a), (a-), or (a-b) - if(reader.PeekLooseToken().ID == R.Text) + if (reader.PeekLooseToken().ID == R.Text) { var firstNumberToken = reader.ReadLooseToken(); int firstNumber; - if(!Util.ParseInt(firstNumberToken.Value, out firstNumber)) + if (!Util.ParseInt(firstNumberToken.Value, out firstNumber)) { compiler.SyntaxError(firstNumberToken, "syllable range value is not a valid integer"); } // (a-) or (a-b) - if(reader.PeekLooseToken().ID == R.Hyphen) + if (reader.PeekLooseToken().ID == R.Hyphen) { reader.ReadLooseToken(); // (a-b) - if(reader.PeekLooseToken().ID == R.Text) + if (reader.PeekLooseToken().ID == R.Text) { var secondNumberToken = reader.ReadLooseToken(); int secondNumber; - if(!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) { compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); } @@ -115,19 +127,19 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } } // (-b) - else if(reader.PeekLooseToken().ID == R.Hyphen) + else if (reader.PeekLooseToken().ID == R.Hyphen) { reader.ReadLooseToken(); var secondNumberToken = reader.ReadLoose(R.Text, "syllable range value"); int secondNumber; - if(!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) { compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); } query.SyllablePredicate = new Range(null, secondNumber); } // () - else if(reader.PeekLooseToken().ID == R.RightParen) + else if (reader.PeekLooseToken().ID == R.RightParen) { compiler.SyntaxError(token, "empty syllable range", false); } @@ -161,22 +173,22 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } } - if(!endOfQueryReached) + if (!endOfQueryReached) { compiler.SyntaxError(reader.PrevToken, "unexpected end-of-pattern"); } - actionCallback(new RAQuery(query, tableName)); + actionCallback(new RstQuery(query, tableName)); yield break; } private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler compiler) { - while(!reader.End) + while (!reader.End) { var token = reader.ReadLooseToken(); - switch(token.ID) + switch (token.ID) { // match carrier case R.Equal: @@ -194,39 +206,39 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp { var carrierType = CarrierComponent.Associative; // disassociative - if(reader.PeekToken().ID == R.Exclamation) + if (reader.PeekToken().ID == R.Exclamation) { carrierType = CarrierComponent.Dissociative; reader.ReadToken(); } // divergent - else if(reader.PeekToken().ID == R.Plus) + else if (reader.PeekToken().ID == R.Plus) { carrierType = CarrierComponent.Divergent; reader.ReadToken(); } - else if(reader.PeekToken().ID == R.Question) + else if (reader.PeekToken().ID == R.Question) { carrierType = CarrierComponent.Relational; reader.ReadToken(); } // match - if(reader.PeekToken().ID == R.Equal) + if (reader.PeekToken().ID == R.Equal) { - if(carrierType == CarrierComponent.Associative) + if (carrierType == CarrierComponent.Associative) { carrierType = CarrierComponent.MatchAssociative; } - else if(carrierType == CarrierComponent.Dissociative) + else if (carrierType == CarrierComponent.Dissociative) { carrierType = CarrierComponent.MatchDissociative; } - else if(carrierType == CarrierComponent.Divergent) + else if (carrierType == CarrierComponent.Divergent) { carrierType = CarrierComponent.MatchDivergent; } - else if(carrierType == CarrierComponent.Relational) + else if (carrierType == CarrierComponent.Relational) { carrierType = CarrierComponent.MatchRelational; } @@ -243,7 +255,7 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp { var carrierType = CarrierComponent.Unique; // match unique - if(reader.PeekToken().ID == R.Equal) + if (reader.PeekToken().ID == R.Equal) { carrierType = CarrierComponent.MatchUnique; reader.ReadToken(); diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 5d335eb..2693659 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -8,7 +8,7 @@ namespace Rant.Core.Compiler.Parsing { internal class SequenceParser : Parser { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { Token token; @@ -36,10 +36,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { yield break; } - else - { - goto default; // Print it if we're not in a block - } + goto default; // Print it if we're not in a block case R.RightCurly: if (context == CompileContext.BlockSequence) @@ -60,15 +57,18 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext yield break; } // this is probably just a semicolon in text - actionCallback(new RAText(token)); + actionCallback(new RstText(token)); break; case R.RightSquare: - // end of arguments - if (context == CompileContext.ArgumentSequence || context == CompileContext.SubroutineBody) + // end of arguments / direct object in query + switch (context) { - compiler.LeaveContext(); - yield break; + case CompileContext.ArgumentSequence: + case CompileContext.SubroutineBody: + case CompileContext.QueryComplement: + compiler.LeaveContext(); + yield break; } compiler.SyntaxError(token, "Unexpected tag end", false); break; @@ -84,7 +84,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.LeaveContext(); yield break; } - actionCallback(new RAText(token)); + actionCallback(new RstText(token)); break; case R.Whitespace: @@ -99,13 +99,13 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } goto default; default: - actionCallback(new RAText(token)); + actionCallback(new RstText(token)); break; } break; case R.EscapeSequence: // Handle escape sequences - actionCallback(new RAEscape(token)); + actionCallback(new RstEscape(token)); break; case R.EOF: @@ -116,7 +116,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext yield break; default: // Handle text - actionCallback(new RAText(token)); + actionCallback(new RstText(token)); break; } } diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index da7b257..3282291 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -12,7 +12,7 @@ namespace Rant.Core.Compiler.Parsing { internal class TagParser : Parser { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { var nextType = reader.PeekType(); @@ -22,7 +22,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var regex = reader.Read(R.Regex, "replacer regex"); reader.Read(R.Colon); - var arguments = new List(); + var arguments = new List(); var iterator = ReadArguments(compiler, reader, arguments); while (iterator.MoveNext()) @@ -44,7 +44,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext yield break; } - actionCallback(new RAReplacer(regex, Util.ParseRegex(regex.Value), arguments[0], arguments[1])); + actionCallback(new RstReplacer(regex, Util.ParseRegex(regex.Value), arguments[0], arguments[1])); yield break; } // subroutine @@ -71,11 +71,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } } - private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { var functionName = reader.Read(R.Text, "function name"); - var arguments = new List(); + var arguments = new List(); if (reader.PeekType() == R.Colon) { @@ -107,11 +107,11 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext yield break; } - actionCallback(new RAFunction(functionName, sig, arguments)); + actionCallback(new RstFunction(functionName, sig, arguments)); yield break; } - private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) + private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { // subroutine definition if (reader.TakeLoose(R.LeftSquare, false)) @@ -124,7 +124,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex compiler.HasModule = true; } var subroutineName = reader.ReadLoose(R.Text, "subroutine name"); - var subroutine = new RADefineSubroutine(subroutineName); + var subroutine = new RstDefineSubroutine(subroutineName); subroutine.Parameters = new Dictionary(); if (reader.PeekLooseToken().ID == R.Colon) @@ -146,15 +146,15 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex reader.ReadLoose(R.RightSquare, "end of subroutine definition arguments"); var bodyStart = reader.ReadLoose(R.Colon); - var actions = new List(); - Action bodyActionCallback = (action) => actions.Add(action); + var actions = new List(); + Action bodyActionCallback = (action) => actions.Add(action); compiler.AddContext(CompileContext.SubroutineBody); compiler.SetNextActionCallback(bodyActionCallback); yield return Get(); compiler.SetNextActionCallback(actionCallback); - subroutine.Body = new RASequence(actions, bodyStart); + subroutine.Body = new RstSequence(actions, bodyStart); if (inModule) { compiler.Module.AddActionFunction(subroutineName.Value, subroutine); @@ -173,7 +173,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex moduleFunctionName = reader.Read(R.Text, "module function name").Value; } - var arguments = new List(); + var arguments = new List(); if (reader.PeekType() == R.Colon) { @@ -192,7 +192,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex reader.Read(R.RightSquare, "function tag end"); } - var subroutine = new RACallSubroutine(subroutineName, moduleFunctionName); + var subroutine = new RstCallSubroutine(subroutineName, moduleFunctionName); subroutine.Arguments = arguments; actionCallback(subroutine); @@ -200,11 +200,11 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex } } - private IEnumerator ReadArguments(RantCompiler compiler, TokenReader reader, List arguments) + private IEnumerator ReadArguments(RantCompiler compiler, TokenReader reader, List arguments) { - var actions = new List(); + var actions = new List(); - Action argActionCallback = (action) => actions.Add(action); + Action argActionCallback = (action) => actions.Add(action); compiler.SetNextActionCallback(argActionCallback); compiler.AddContext(CompileContext.FunctionEndContext); compiler.AddContext(CompileContext.ArgumentSequence); @@ -213,7 +213,7 @@ private IEnumerator ReadArguments(RantCompiler compiler, TokenReader rea { var startToken = reader.PeekToken(); yield return Get(); - arguments.Add(new RASequence(actions, startToken)); + arguments.Add(new RstSequence(actions, startToken)); actions.Clear(); } diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 60d52f0..0f65878 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -16,7 +16,7 @@ internal class RantCompiler private readonly string _sourceName; private readonly TokenReader _reader; private readonly Stack _contextStack = new Stack(); - private Action _nextActionCallback = null; + private Action _nextActionCallback = null; private List _errors; // private List _warnings; @@ -39,15 +39,15 @@ public RantCompiler(string sourceName, string source) public void LeaveContext() => _contextStack.Pop(); - public void SetNextActionCallback(Action callback) => _nextActionCallback = callback; + public void SetNextActionCallback(Action callback) => _nextActionCallback = callback; - public RantAction Compile() + public RST Compile() { try { var parser = Parser.Get(); var stack = new Stack>(); - var actionList = new List(); + var actionList = new List(); _contextStack.Push(CompileContext.DefaultSequence); _nextActionCallback = a => actionList.Add(a); @@ -73,7 +73,7 @@ public RantAction Compile() if (_errors?.Count > 0) throw new RantCompilerException(_sourceName, _errors); - return new RASequence(actionList, _source); + return new RstSequence(actionList, _source); } catch (RantCompilerException) { diff --git a/Rant/Core/Compiler/Syntax/RAQuery.cs b/Rant/Core/Compiler/Syntax/RAQuery.cs deleted file mode 100644 index d53f8b0..0000000 --- a/Rant/Core/Compiler/Syntax/RAQuery.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; - -using Rant.Core.Stringes; -using Rant.Localization; -using Rant.Vocabulary.Querying; - -namespace Rant.Core.Compiler.Syntax -{ - internal class RAQuery : RantAction - { - private readonly Query _query; - - public RAQuery(Query query, Stringe range) - : base(range) - { - _query = query; - } - - public override IEnumerator Run(Sandbox sb) - { - if (sb.Engine.Dictionary == null) - { - sb.Print(Txtres.GetString("missing-table")); - yield break; - } - // carrier erase query - if (_query.Name == null) - { - foreach (CarrierComponent type in Enum.GetValues(typeof(CarrierComponent))) - foreach (string name in _query.Carrier.GetCarriers(type)) - sb.CarrierState.RemoveType(type, name); - yield break; - } - var result = sb.Engine.Dictionary.Query(sb.RNG, _query, sb.CarrierState); - sb.Print(result); - } - } -} diff --git a/Rant/Core/Compiler/Syntax/RantAction.cs b/Rant/Core/Compiler/Syntax/RST.cs similarity index 62% rename from Rant/Core/Compiler/Syntax/RantAction.cs rename to Rant/Core/Compiler/Syntax/RST.cs index 9386260..b117ba0 100644 --- a/Rant/Core/Compiler/Syntax/RantAction.cs +++ b/Rant/Core/Compiler/Syntax/RST.cs @@ -5,13 +5,13 @@ namespace Rant.Core.Compiler.Syntax { /// - /// Represents an Abstract Syntax Tree (AST) node for a Rant pattern. This is the base class for all Rant actions. + /// Represents a Rant Syntax Tree (RST) node for a Rant pattern. This is the base class for all Rant actions. /// - internal abstract class RantAction + internal abstract class RST { internal Stringe Range; - protected RantAction(Stringe range) + protected RST(Stringe range) { Range = range; } @@ -21,6 +21,6 @@ protected RantAction(Stringe range) /// /// The sandbox on which to operate. /// - public abstract IEnumerator Run(Sandbox sb); + public abstract IEnumerator Run(Sandbox sb); } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RABlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs similarity index 89% rename from Rant/Core/Compiler/Syntax/RABlock.cs rename to Rant/Core/Compiler/Syntax/RstBlock.cs index e244625..500e174 100644 --- a/Rant/Core/Compiler/Syntax/RABlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -10,9 +10,9 @@ namespace Rant.Core.Compiler.Syntax /// /// Represents a block construct, which provides multiple options to the interpreter for the next sequence, one of which is chosen. /// - internal class RABlock : RantAction + internal class RstBlock : RST { - private readonly List _items = new List(); + private readonly List _items = new List(); private readonly int _count; // Item weights. @@ -20,26 +20,26 @@ internal class RABlock : RantAction // Constant weights can be used directly. This is used for optimization. // TODO: Move _weights to local scope for thread safety private readonly double[] _weights = null; - private readonly List<_> _dynamicWeights = null; + private readonly List<_> _dynamicWeights = null; private readonly double _constantWeightSum; private readonly bool _weighted = false; - public RABlock(Stringe range, params RantAction[] items) + public RstBlock(Stringe range, params RST[] items) : base(range) { _items.AddRange(items); _count = items.Length; } - public RABlock(Stringe range, List items) + public RstBlock(Stringe range, List items) : base(range) { _items.AddRange(items); _count = items.Count; } - public RABlock(Stringe range, List items, - List<_> dynamicWeights, List<_> constantWeights) + public RstBlock(Stringe range, List items, + List<_> dynamicWeights, List<_> constantWeights) : base(range) { _items.AddRange(items); @@ -58,7 +58,7 @@ public RABlock(Stringe range, List items, } } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { var attribs = sb.NextAttribs(this); diff --git a/Rant/Core/Compiler/Syntax/RACallSubroutine.cs b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs similarity index 79% rename from Rant/Core/Compiler/Syntax/RACallSubroutine.cs rename to Rant/Core/Compiler/Syntax/RstCallSubroutine.cs index 04fdd11..8364cc8 100644 --- a/Rant/Core/Compiler/Syntax/RACallSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs @@ -5,12 +5,12 @@ namespace Rant.Core.Compiler.Syntax { - internal class RACallSubroutine : RASubroutine + internal class RstCallSubroutine : RstSubroutine { private string _moduleFunctionName = null; private bool _inModule = false; - public RACallSubroutine(Stringe name, string moduleFunctionName = null) + public RstCallSubroutine(Stringe name, string moduleFunctionName = null) : base(name) { if (moduleFunctionName != null) @@ -18,7 +18,7 @@ public RACallSubroutine(Stringe name, string moduleFunctionName = null) _moduleFunctionName = moduleFunctionName; } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { if (_inModule) { @@ -37,11 +37,11 @@ public override IEnumerator Run(Sandbox sb) } else if (sb.Objects[Name] == null) throw new RantRuntimeException(sb.Pattern, _name, $"The subroutine '{Name}' does not exist."); - var sub = (RADefineSubroutine)(_inModule ? sb.Modules[Name][_moduleFunctionName] : sb.Objects[Name].Value); + var sub = (RstDefineSubroutine)(_inModule ? sb.Modules[Name][_moduleFunctionName] : sb.Objects[Name].Value); if (sub.Parameters.Keys.Count != Arguments.Count) throw new RantRuntimeException(sb.Pattern, _name, "Argument mismatch on subroutine call."); var action = sub.Body; - var args = new Dictionary(); + var args = new Dictionary(); var parameters = sub.Parameters.Keys.ToArray(); for (var i = 0; i < Arguments.Count; i++) { @@ -50,7 +50,7 @@ public override IEnumerator Run(Sandbox sb) sb.AddOutputWriter(); yield return Arguments[i]; var output = sb.Return(); - args[parameters[i]] = new RAText(_name, output.Main); + args[parameters[i]] = new RstText(_name, output.Main); } else args[parameters[i]] = Arguments[i]; diff --git a/Rant/Core/Compiler/Syntax/RADefineSubroutine.cs b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs similarity index 70% rename from Rant/Core/Compiler/Syntax/RADefineSubroutine.cs rename to Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs index 15404d4..0647ef1 100644 --- a/Rant/Core/Compiler/Syntax/RADefineSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs @@ -5,15 +5,15 @@ namespace Rant.Core.Compiler.Syntax { - internal class RADefineSubroutine : RASubroutine + internal class RstDefineSubroutine : RstSubroutine { public Dictionary Parameters; - public RADefineSubroutine(Stringe name) + public RstDefineSubroutine(Stringe name) : base(name) { } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { sb.Objects[Name] = new RantObject(this); yield break; diff --git a/Rant/Core/Compiler/Syntax/RAEscape.cs b/Rant/Core/Compiler/Syntax/RstEscape.cs similarity index 95% rename from Rant/Core/Compiler/Syntax/RAEscape.cs rename to Rant/Core/Compiler/Syntax/RstEscape.cs index d5b6e53..4146e95 100644 --- a/Rant/Core/Compiler/Syntax/RAEscape.cs +++ b/Rant/Core/Compiler/Syntax/RstEscape.cs @@ -7,7 +7,7 @@ namespace Rant.Core.Compiler.Syntax { - internal class RAEscape : RantAction + internal class RstEscape : RST { private static readonly Dictionary> EscapeTable = new Dictionary> { @@ -65,7 +65,7 @@ internal class RAEscape : RantAction private readonly int _times; private readonly bool _unicode; - public RAEscape(Stringe escapeSequence) : base(escapeSequence) + public RstEscape(Stringe escapeSequence) : base(escapeSequence) { var escape = escapeSequence.Value; @@ -102,7 +102,7 @@ public RAEscape(Stringe escapeSequence) : base(escapeSequence) } } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { if (_unicode) { diff --git a/Rant/Core/Compiler/Syntax/RAFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs similarity index 92% rename from Rant/Core/Compiler/Syntax/RAFunction.cs rename to Rant/Core/Compiler/Syntax/RstFunction.cs index fea3fb9..30bced0 100644 --- a/Rant/Core/Compiler/Syntax/RAFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -8,13 +8,13 @@ namespace Rant.Core.Compiler.Syntax { - internal class RAFunction : RantAction + internal class RstFunction : RST { private readonly RantFunctionSignature _funcInfo; - private readonly List _argActions; + private readonly List _argActions; private readonly int _argc; - public RAFunction(Stringe range, RantFunctionSignature funcInfo, List argActions) + public RstFunction(Stringe range, RantFunctionSignature funcInfo, List argActions) : base(range) { _funcInfo = funcInfo; @@ -29,7 +29,7 @@ private RantFunctionParameter GetParameter(int index) return _funcInfo.Parameters[index]; } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { // Convert arguments to their native types int paramc = _funcInfo.Parameters.Length; @@ -108,7 +108,7 @@ public override IEnumerator Run(Sandbox sb) } // Invoke the function - IEnumerator requester; + IEnumerator requester; if (_funcInfo.HasParamArray) { int required = paramc - 1; diff --git a/Rant/Core/Compiler/Syntax/RstQuery.cs b/Rant/Core/Compiler/Syntax/RstQuery.cs new file mode 100644 index 0000000..99f49c7 --- /dev/null +++ b/Rant/Core/Compiler/Syntax/RstQuery.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; + +using Rant.Core.Stringes; +using Rant.Localization; +using Rant.Vocabulary.Querying; + +namespace Rant.Core.Compiler.Syntax +{ + internal class RstQuery : RST + { + private readonly Query _query; + + public RstQuery(Query query, Stringe range) + : base(range) + { + _query = query; + } + + public override IEnumerator Run(Sandbox sb) + { + if (sb.Engine.Dictionary == null) + { + sb.Print(Txtres.GetString("missing-table")); + yield break; + } + // carrier erase query + if (_query.Name == null) + { + foreach (CarrierComponent type in Enum.GetValues(typeof(CarrierComponent))) + foreach (string name in _query.Carrier.GetCarriers(type)) + sb.CarrierState.RemoveType(type, name); + yield break; + } + var result = sb.Engine.Dictionary.Query(sb.RNG, _query, sb.CarrierState); + + if (result == null) + { + sb.Print("[No Match]"); + } + else + { + if (result.IsSplit) + { + if (result.ValueSplitIndex == 0) // Pushes complement to the left of the query result + { + yield return _query.Complement; + sb.Print(' '); + sb.Print(result.Value); + } + else if (result.ValueSplitIndex == result.Value.Length) + { + sb.Print(result.Value); + sb.Print(' '); + yield return _query.Complement; + } + else + { + sb.Print(result.Value.Substring(0, result.ValueSplitIndex)); + sb.Print(' '); + yield return _query.Complement; + sb.Print(' '); + sb.Print(result.Value.Substring(result.ValueSplitIndex)); + } + } + else + { + + sb.Print(result.Value); + if (_query.Complement != null) + { + sb.Print(' '); // TODO: Pull phrasal separator from format info + yield return _query.Complement; + } + } + } + } + } +} diff --git a/Rant/Core/Compiler/Syntax/RAReplacer.cs b/Rant/Core/Compiler/Syntax/RstReplacer.cs similarity index 76% rename from Rant/Core/Compiler/Syntax/RAReplacer.cs rename to Rant/Core/Compiler/Syntax/RstReplacer.cs index 03f4701..d033344 100644 --- a/Rant/Core/Compiler/Syntax/RAReplacer.cs +++ b/Rant/Core/Compiler/Syntax/RstReplacer.cs @@ -8,20 +8,20 @@ namespace Rant.Core.Compiler.Syntax /// /// Replaces text in a pattern output according to a regular expression and evaluator pattern. /// - internal class RAReplacer : RantAction + internal class RstReplacer : RST { - private readonly RantAction _sourceAction; - private readonly RantAction _matchEvalAction; + private readonly RST _sourceAction; + private readonly RST _matchEvalAction; private readonly Regex _regex; - public RAReplacer(Stringe range, Regex regex, RantAction sourceAction, RantAction matchEvalAction) : base(range) + public RstReplacer(Stringe range, Regex regex, RST sourceAction, RST matchEvalAction) : base(range) { _regex = regex; _sourceAction = sourceAction; _matchEvalAction = matchEvalAction; } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { sb.AddOutputWriter(); yield return _sourceAction; diff --git a/Rant/Core/Compiler/Syntax/RASequence.cs b/Rant/Core/Compiler/Syntax/RstSequence.cs similarity index 59% rename from Rant/Core/Compiler/Syntax/RASequence.cs rename to Rant/Core/Compiler/Syntax/RstSequence.cs index f7588ae..5ce6996 100644 --- a/Rant/Core/Compiler/Syntax/RASequence.cs +++ b/Rant/Core/Compiler/Syntax/RstSequence.cs @@ -8,20 +8,20 @@ namespace Rant.Core.Compiler.Syntax /// /// Performs a sequence of actions. /// - internal class RASequence : RantAction + internal class RstSequence : RST { - private readonly List _actions = new List(); + private readonly List _actions = new List(); - public List Actions => _actions; + public List Actions => _actions; - public RASequence(List actions, Stringe defaultRange) + public RstSequence(List actions, Stringe defaultRange) : base(actions.Any() ? Stringe.Range(actions[0].Range, actions[actions.Count - 1].Range) : defaultRange) { if (actions == null) return; _actions.AddRange(actions); } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { return _actions.GetEnumerator(); } diff --git a/Rant/Core/Compiler/Syntax/RASubroutine.cs b/Rant/Core/Compiler/Syntax/RstSubroutine.cs similarity index 63% rename from Rant/Core/Compiler/Syntax/RASubroutine.cs rename to Rant/Core/Compiler/Syntax/RstSubroutine.cs index 1e45504..9bcb270 100644 --- a/Rant/Core/Compiler/Syntax/RASubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstSubroutine.cs @@ -4,16 +4,16 @@ namespace Rant.Core.Compiler.Syntax { - internal abstract class RASubroutine : RantAction + internal abstract class RstSubroutine : RST { protected readonly Stringe _name; public string Name => _name.Value; - public List Arguments; - public RantAction Body; + public List Arguments; + public RST Body; public RantPattern Source; - public RASubroutine(Stringe name) + public RstSubroutine(Stringe name) : base(name) { _name = name; diff --git a/Rant/Core/Compiler/Syntax/RAText.cs b/Rant/Core/Compiler/Syntax/RstText.cs similarity index 67% rename from Rant/Core/Compiler/Syntax/RAText.cs rename to Rant/Core/Compiler/Syntax/RstText.cs index f10d9d6..7bd0334 100644 --- a/Rant/Core/Compiler/Syntax/RAText.cs +++ b/Rant/Core/Compiler/Syntax/RstText.cs @@ -8,23 +8,23 @@ namespace Rant.Core.Compiler.Syntax /// /// Prints a string constant to the output. /// - internal class RAText : RantAction + internal class RstText : RST { private readonly string _text; public string Text => _text; - public RAText(Stringe token) : base(token) + public RstText(Stringe token) : base(token) { _text = token.Value ?? String.Empty; } - public RAText(Stringe token, string text) : base(token) + public RstText(Stringe token, string text) : base(token) { _text = text ?? String.Empty; } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { sb.Print(_text); yield break; diff --git a/Rant/Core/Constructs/BlockAttribs.cs b/Rant/Core/Constructs/BlockAttribs.cs index 48ae0e7..487f92b 100644 --- a/Rant/Core/Constructs/BlockAttribs.cs +++ b/Rant/Core/Constructs/BlockAttribs.cs @@ -20,13 +20,13 @@ public int Repetitions public bool IsSeries { get; set; } public bool RepEach { get; set; } - public RantAction Separator { get; set; } - public RantAction EndSeparator { get; set; } - public RantAction EndConjunction { get; set; } - public RantAction Start { get; set; } - public RantAction Before { get; set; } - public RantAction After { get; set; } - public RantAction End { get; set; } + public RST Separator { get; set; } + public RST EndSeparator { get; set; } + public RST EndConjunction { get; set; } + public RST Start { get; set; } + public RST Before { get; set; } + public RST After { get; set; } + public RST End { get; set; } public Synchronizer Sync { get; set; } public double Chance { get; set; } public AttribPersistence Persistence { get; set; } diff --git a/Rant/Core/Constructs/BlockManager.cs b/Rant/Core/Constructs/BlockManager.cs index 5c729ac..2ee4ee8 100644 --- a/Rant/Core/Constructs/BlockManager.cs +++ b/Rant/Core/Constructs/BlockManager.cs @@ -8,14 +8,14 @@ namespace Rant.Core.Constructs { internal class BlockManager { - private readonly Dictionary> _blockList; + private readonly Dictionary> _blockList; private BlockAttribs _prevAttribs; private int _prevCount = 0; public BlockManager() { - _blockList = new Dictionary>(); + _blockList = new Dictionary>(); } public BlockAttribs SetPrevAttribs(BlockAttribs attribs) @@ -37,10 +37,10 @@ public BlockAttribs GetPrevious(int repeatMaximum) return new BlockAttribs(); } - public void Add(BlockAttribs attribs, RABlock block) + public void Add(BlockAttribs attribs, RstBlock block) { if (!_blockList.ContainsKey(attribs)) - _blockList.Add(attribs, new List() { block }); + _blockList.Add(attribs, new List() { block }); else _blockList[attribs].Add(block); } @@ -53,7 +53,7 @@ public void RemoveAttribs(BlockAttribs attribs) _blockList.Remove(attribs); } - public void RemoveBlock(BlockAttribs attribs, RABlock block) + public void RemoveBlock(BlockAttribs attribs, RstBlock block) { if (!_blockList.ContainsKey(attribs)) throw new InvalidOperationException("Attribs don't exist"); @@ -64,6 +64,6 @@ public void RemoveBlock(BlockAttribs attribs, RABlock block) _blockList[attribs].Remove(block); } - public BlockAttribs GetAttribs(RABlock block) => _blockList.Single(p => p.Value.Contains(block)).Key; + public BlockAttribs GetAttribs(RstBlock block) => _blockList.Single(p => p.Value.Contains(block)).Key; } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 75d696f..6d21ea0 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -50,11 +50,11 @@ private static void NumberFormat(Sandbox sb, [RantFunction("numfmt")] [RantDescription("Runs the specified pattern under a specific number formatting mode.")] - private static IEnumerator NumberFormatRange(Sandbox sb, + private static IEnumerator NumberFormatRange(Sandbox sb, [RantDescription("The number format to use.")] NumberFormat format, [RantDescription("The pattern to run.")] - RantAction rangeAction) + RST rangeAction) { var oldFmtMap = new Dictionary(); @@ -118,7 +118,7 @@ private static void RepEach(Sandbox sb) [RantDescription("Sets the separator pattern for the next block.")] private static void Sep(Sandbox sb, [RantDescription("The separator pattern to run between iterations of the next block.")] - RantAction separator) + RST separator) { sb.CurrentBlockAttribs.IsSeries = false; sb.CurrentBlockAttribs.Separator = separator; @@ -128,9 +128,9 @@ private static void Sep(Sandbox sb, [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] private static void Sep(Sandbox sb, [RantDescription("The separator pattern to run between items.")] - RantAction separator, + RST separator, [RantDescription("The conjunction pattern to run before the last item.")] - RantAction conjunction) + RST conjunction) { sb.CurrentBlockAttribs.IsSeries = true; sb.CurrentBlockAttribs.Separator = separator; @@ -141,11 +141,11 @@ private static void Sep(Sandbox sb, [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] private static void Sep(Sandbox sb, [RantDescription("The separator pattern to run between items.")] - RantAction separator, + RST separator, [RantDescription("The Oxford comma pattern to run before the last item.")] - RantAction oxford, + RST oxford, [RantDescription("The conjunction pattern to run before the last item in the series.")] - RantAction conjunction) + RST conjunction) { sb.CurrentBlockAttribs.IsSeries = true; sb.CurrentBlockAttribs.Separator = separator; @@ -159,7 +159,7 @@ private static void RepSep(Sandbox sb, [RantDescription("The number of times to repeat the next block.")] int times, [RantDescription("The separator pattern to run between iterations of the next block.")] - RantAction separator) + RST separator) { sb.CurrentBlockAttribs.IsSeries = false; sb.CurrentBlockAttribs.Repetitions = times; @@ -170,7 +170,7 @@ private static void RepSep(Sandbox sb, [RantDescription("Sets the prefix pattern for the next block.")] private static void Before(Sandbox sb, [RantDescription("The pattern to run before each iteration of the next block.")] - RantAction beforeAction) + RST beforeAction) { sb.CurrentBlockAttribs.Before = beforeAction; } @@ -179,7 +179,7 @@ private static void Before(Sandbox sb, [RantDescription("Sets the postfix pattern for the next block.")] private static void After(Sandbox sb, [RantDescription("The pattern to run after each iteration of the next block.")] - RantAction afterAction) + RST afterAction) { sb.CurrentBlockAttribs.After = afterAction; } @@ -313,9 +313,9 @@ private static void CapsInfer(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is the first.")] - private static IEnumerator First(Sandbox sb, + private static IEnumerator First(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; if (sb.Blocks.Peek().Iteration == 1) yield return action; @@ -323,9 +323,9 @@ private static IEnumerator First(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is not the first.")] - private static IEnumerator NotFirst(Sandbox sb, + private static IEnumerator NotFirst(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; if (sb.Blocks.Peek().Iteration > 1) yield return action; @@ -333,9 +333,9 @@ private static IEnumerator NotFirst(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is the last.")] - private static IEnumerator Last(Sandbox sb, + private static IEnumerator Last(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); @@ -344,9 +344,9 @@ private static IEnumerator Last(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is not the last.")] - private static IEnumerator NotLast(Sandbox sb, + private static IEnumerator NotLast(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); @@ -355,9 +355,9 @@ private static IEnumerator NotLast(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] - private static IEnumerator Middle(Sandbox sb, + private static IEnumerator Middle(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); @@ -366,9 +366,9 @@ private static IEnumerator Middle(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] - private static IEnumerator Ends(Sandbox sb, + private static IEnumerator Ends(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); @@ -442,9 +442,9 @@ private static void IndexOne(Sandbox sb) [RantFunction] [RantDescription("Runs a pattern if the current block iteration is an odd number.")] - private static IEnumerator Odd(Sandbox sb, + private static IEnumerator Odd(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; @@ -452,9 +452,9 @@ private static IEnumerator Odd(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is an even number.")] - private static IEnumerator Even(Sandbox sb, + private static IEnumerator Even(Sandbox sb, [RantDescription("The pattern to run when the condition is met.")] - RantAction action) + RST action) { if (!sb.Blocks.Any()) yield break; if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; @@ -462,7 +462,7 @@ private static IEnumerator Even(Sandbox sb, [RantFunction] [RantDescription("Returns the specified argument from the current subroutine.")] - private static IEnumerator Arg(Sandbox sb, + private static IEnumerator Arg(Sandbox sb, [RantDescription("The name of the argument to retrieve.")] string name) { @@ -548,9 +548,9 @@ private static void SyncReset(Sandbox sb, [RantFunction("quote", "q")] [RantDescription("Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] - private static IEnumerator Quote(Sandbox sb, + private static IEnumerator Quote(Sandbox sb, [RantDescription("The pattern to run whose output will be surrounded in quotes.")] - RantAction quoteAction) + RST quoteAction) { sb.IncreaseQuote(); sb.PrintOpeningQuote(); @@ -561,7 +561,7 @@ private static IEnumerator Quote(Sandbox sb, [RantFunction] [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] - private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RantAction pattern) + private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) { sb.Output.OpenChannel(channelName, visibility); yield return pattern; @@ -620,11 +620,11 @@ private static void ClearTarget(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] - private static IEnumerator Nth(Sandbox sb, + private static IEnumerator Nth(Sandbox sb, [RantDescription("The interval at which the pattern should be run.")] int interval, [RantDescription("The pattern to run when the condition is satisfied.")] - RantAction pattern) + RST pattern) { if (!sb.Blocks.Any()) yield break; if (sb.Blocks.Peek().Iteration % interval != 0) yield break; @@ -633,13 +633,13 @@ private static IEnumerator Nth(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] - private static IEnumerator NthO(Sandbox sb, + private static IEnumerator NthO(Sandbox sb, [RantDescription("The interval at which the pattern should be run.")] int interval, [RantDescription("The number of iterations to offset the interval by.")] int offset, [RantDescription("The pattern to run when the condition is satisfied.")] - RantAction pattern) + RST pattern) { if (!sb.Blocks.Any()) yield break; if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; @@ -648,11 +648,11 @@ private static IEnumerator NthO(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] - private static IEnumerator NotNth(Sandbox sb, + private static IEnumerator NotNth(Sandbox sb, [RantDescription("The interval at which the pattern should not be run.")] int interval, [RantDescription("The pattern to run when the condition is satisfied.")] - RantAction pattern) + RST pattern) { if (!sb.Blocks.Any()) yield break; if (sb.Blocks.Peek().Iteration % interval == 0) yield break; @@ -661,13 +661,13 @@ private static IEnumerator NotNth(Sandbox sb, [RantFunction] [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount.")] - private static IEnumerator NotNthO(Sandbox sb, + private static IEnumerator NotNthO(Sandbox sb, [RantDescription("The interval at which the pattern should not be run.")] int interval, [RantDescription("The number of iterations to offset the interval by.")] int offset, [RantDescription("The pattern to run when the condition is satisfied.")] - RantAction pattern) + RST pattern) { if (!sb.Blocks.Any()) yield break; if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; @@ -678,7 +678,7 @@ private static IEnumerator NotNthO(Sandbox sb, [RantDescription("Sets a pattern that will run before the next block.")] private static void Start(Sandbox sb, [RantDescription("The pattern to run before the next block.")] - RantAction beforePattern) + RST beforePattern) { sb.CurrentBlockAttribs.Start = beforePattern; } @@ -687,7 +687,7 @@ private static void Start(Sandbox sb, [RantDescription("Sets a pattern that will run after the next block.")] private static void End(Sandbox sb, [RantDescription("The pattern to run after the next block.")] - RantAction endPattern) + RST endPattern) { sb.CurrentBlockAttribs.End = endPattern; } @@ -702,11 +702,11 @@ private static void Persist(Sandbox sb, AttribPersistence persistence) [RantFunction] [RantDescription("Loads and runs a pattern from cache or file.")] - private static IEnumerator Import(Sandbox sb, + private static IEnumerator Import(Sandbox sb, [RantDescription("The name or path of the pattern to load.")] string name) { - RantAction action; + RST action; try { @@ -793,7 +793,7 @@ private static void IfNDef(Sandbox sb, params string[] flags) [RantFunction] [RantDescription("Executes a pattern if the current flag condition passes.")] - private static IEnumerator Then(Sandbox sb, RantAction conditionPassPattern) + private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) { if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) { @@ -803,7 +803,7 @@ private static IEnumerator Then(Sandbox sb, RantAction conditionPass [RantFunction] [RantDescription("Executes a pattern if the current flag condition fails.")] - private static IEnumerator Else(Sandbox sb, RantAction conditionFailPattern) + private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) { if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) { @@ -827,7 +827,7 @@ private static void Branch(Sandbox sb, string id) [RantFunction] [RantDescription("Branches the internal RNG, executes the specified action, and then merges the branch.")] - private static IEnumerator Branch(Sandbox sb, string id, RantAction branchAction) + private static IEnumerator Branch(Sandbox sb, string id, RST branchAction) { sb.RNG.Branch(id.Hash()); yield return branchAction; diff --git a/Rant/Core/Framework/RantFunctionSignature.cs b/Rant/Core/Framework/RantFunctionSignature.cs index 0b451d1..34a0954 100644 --- a/Rant/Core/Framework/RantFunctionSignature.cs +++ b/Rant/Core/Framework/RantFunctionSignature.cs @@ -62,7 +62,7 @@ public RantFunctionSignature(string name, string description, MethodInfo method) if (type.IsArray && i == parameters.Length - 1) type = type.GetElementType(); - if (type == typeof(RantAction) || type.IsSubclassOf(typeof(RantAction))) + if (type == typeof(RST) || type.IsSubclassOf(typeof(RST))) { rantType = RantFunctionParameterType.Pattern; } @@ -104,12 +104,12 @@ public RantFunctionSignature(string name, string description, MethodInfo method) Description = description; } - public IEnumerator Invoke(Sandbox sb, object[] arguments) + public IEnumerator Invoke(Sandbox sb, object[] arguments) { - return _delegate.Invoke(sb, arguments) as IEnumerator ?? CreateEmptyIterator(); + return _delegate.Invoke(sb, arguments) as IEnumerator ?? CreateEmptyIterator(); } - private static IEnumerator CreateEmptyIterator() + private static IEnumerator CreateEmptyIterator() { yield break; } diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index 494fbe6..8e16496 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -21,7 +21,7 @@ public class RantObject private List _list = null; private bool _boolean = false; private RantPattern _pattern = null; - private RantAction _action = null; + private RST _action = null; /// /// The type of the object. @@ -105,7 +105,7 @@ public RantObject(double num) _number = num; } - internal RantObject(RantAction action) + internal RantObject(RST action) { Type = RantObjectType.Action; _action = action; @@ -148,9 +148,9 @@ public RantObject(object obj) { _pattern = (RantPattern)obj; } - else if (obj is RantAction) + else if (obj is RST) { - _action = (RantAction)obj; + _action = (RST)obj; Type = RantObjectType.Action; } } diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 6d39d45..f47fbbc 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -37,7 +37,7 @@ internal class Sandbox private readonly Stack _blocks; private readonly Stack _matches; private readonly CarrierState _carrierState; - private readonly Stack> _subroutineArgs; + private readonly Stack> _subroutineArgs; private readonly SyncManager _syncManager; private readonly Stack _scriptObjectStack; private readonly Stopwatch _stopwatch; @@ -108,7 +108,7 @@ internal class Sandbox /// public RantPattern Pattern => _pattern; - public Stack> SubroutineArgs => _subroutineArgs; + public Stack> SubroutineArgs => _subroutineArgs; /// /// Gets the synchronizer manager instance for the current Sandbox. @@ -123,7 +123,7 @@ internal class Sandbox /// /// Gets the current RantAction being executed. /// - public RantAction CurrentAction { get; private set; } + public RST CurrentAction { get; private set; } /// /// Gets the last used timeout. @@ -180,7 +180,7 @@ public Sandbox(RantEngine engine, RantPattern pattern, RNG rng, int sizeLimit = _blocks = new Stack(); _matches = new Stack(); _carrierState = carrierState ?? new CarrierState(); - _subroutineArgs = new Stack>(); + _subroutineArgs = new Stack>(); _syncManager = new SyncManager(this); _blockManager = new BlockManager(); _scriptObjectStack = new Stack(); @@ -236,7 +236,7 @@ public void PrintClosingQuote() /// Dequeues the current block attribute set and returns it, queuing a new attribute set. /// /// - public BlockAttribs NextAttribs(RABlock block) + public BlockAttribs NextAttribs(RstBlock block) { BlockAttribs attribs = _newAttribs; @@ -279,8 +279,8 @@ public RantOutput Run(double timeout, RantPattern pattern = null) } _scriptObjectStack.Clear(); - var callStack = new Stack>(); - IEnumerator action; + var callStack = new Stack>(); + IEnumerator action; // Push the AST root CurrentAction = pattern.Action; @@ -337,8 +337,8 @@ public IEnumerable RunSerial(double timeout, RantPattern pattern = n } _scriptObjectStack.Clear(); - var callStack = new Stack>(); - IEnumerator action; + var callStack = new Stack>(); + IEnumerator action; // Push the AST root CurrentAction = pattern.Action; diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 34f5b3f..5eb52e6 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -173,6 +173,7 @@ + @@ -190,9 +191,9 @@ - - - + + + @@ -200,14 +201,14 @@ - - - - - - - - + + + + + + + + diff --git a/Rant/RantPattern.cs b/Rant/RantPattern.cs index ff422ea..819ed7c 100644 --- a/Rant/RantPattern.cs +++ b/Rant/RantPattern.cs @@ -42,7 +42,7 @@ public string Name /// public string Code { get; } - internal RantAction Action { get; } + internal RST Action { get; } internal RantModule Module { get; } diff --git a/Rant/Resources/RantModule.cs b/Rant/Resources/RantModule.cs index 291175d..a2c569d 100644 --- a/Rant/Resources/RantModule.cs +++ b/Rant/Resources/RantModule.cs @@ -24,7 +24,7 @@ public RantModule(string name) Name = name; } - internal RantAction this[string name] => (RantAction)_objects[name].Value; + internal RST this[string name] => (RST)_objects[name].Value; /// /// Adds a RantPattern containing a subroutine to this module. @@ -33,15 +33,15 @@ public RantModule(string name) /// The pattern that will make up the body of the function. public void AddSubroutineFunction(string name, RantPattern pattern) { - var action = (pattern.Action.GetType() == typeof(RASequence) ? - ((RASequence)pattern.Action).Actions[0] : + var action = (pattern.Action.GetType() == typeof(RstSequence) ? + ((RstSequence)pattern.Action).Actions[0] : pattern.Action); - if (action.GetType() != typeof(RADefineSubroutine)) + if (action.GetType() != typeof(RstDefineSubroutine)) throw new RantRuntimeException(pattern, pattern.Code, "Attempted to add non-subroutine pattern to a module."); _objects[name] = new RantObject(action); } - internal void AddActionFunction(string name, RantAction body) + internal void AddActionFunction(string name, RST body) { _objects[name] = new RantObject(body); } diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index 7532850..7792377 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Text.RegularExpressions; +using Rant.Core.Compiler.Syntax; + namespace Rant.Vocabulary.Querying { /// @@ -37,10 +39,15 @@ public sealed class Query /// The class filter to search by. /// public ClassFilter ClassFilter { get; set; } - + /// /// The regex filters to search by. /// public List<_> RegexFilters { get; set; } + + /// + /// Complement for phrasal verbs. Not yet available in public API. + /// + internal RST Complement { get; set; } } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index 8617196..1b96c21 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -6,6 +6,8 @@ using Rant.Core.Utilities; using Rant.Vocabulary.Querying; +using static Rant.Localization.Txtres; + namespace Rant.Vocabulary { /// @@ -129,11 +131,11 @@ public static RantDictionary FromMultiDirectory(params string[] directories) /// The search criteria to use. /// The state object to use for carrier synchronization. /// - internal string Query(RNG rng, Query query, CarrierState syncState) + internal RantDictionaryTerm Query(RNG rng, Query query, CarrierState syncState) { RantDictionaryTable table; return !_tables.TryGetValue(query.Name, out table) - ? "[Missing Table]" + ? null : table.Query(this, rng, query, syncState); } } diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 7480d82..6ef713d 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -181,15 +181,17 @@ public bool Merge(RantDictionaryTable other) return true; } - internal string Query(RantDictionary dictionary, RNG rng, Query query, CarrierState syncState) + internal RantDictionaryTerm Query(RantDictionary dictionary, RNG rng, Query query, CarrierState syncState) { var index = String.IsNullOrEmpty(query.Subtype) ? 0 : GetSubtypeIndex(query.Subtype); - if (index == -1) return "[Bad Subtype]"; + if (index == -1) return null; + // Apply class filter var pool = query.ClassFilter.IsEmpty ? _entriesHash : _entriesHash.Where(e => query.ClassFilter.Test(e, query.Exclusive)); + // Apply class hiding if (_hidden.Any()) { var hide = _hidden.Where(hc => !query.ClassFilter.AllowsClass(hc)) @@ -197,15 +199,16 @@ internal string Query(RantDictionary dictionary, RNG rng, Query query, CarrierSt pool = pool.Where(e => !hide.Any(e.ContainsClass)); } + // Apply regex filters if (query.RegexFilters.Any()) pool = query.RegexFilters.Aggregate(pool, (current, regex) => current.Where(e => regex.Item1 == regex.Item2.IsMatch(e[index].Value))); if (query.SyllablePredicate != null) pool = pool.Where(e => query.SyllablePredicate.Test(e[index].SyllableCount)); - if (!pool.Any()) return MissingTerm; + if (!pool.Any()) return null; - return syncState.GetEntry(query.Carrier, index, pool, rng)?[index].Value ?? MissingTerm; + return syncState.GetEntry(query.Carrier, index, pool, rng)?[index]; } } } \ No newline at end of file From 2e879f9c07ca8d6beb5c3cfbc4bf250a8cc5c840 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 18 Aug 2016 23:34:00 -0500 Subject: [PATCH 040/213] Forgot a file --- Rant.Tests/Compiler/Invalid.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Rant.Tests/Compiler/Invalid.cs b/Rant.Tests/Compiler/Invalid.cs index 691f89c..c1ae6e1 100644 --- a/Rant.Tests/Compiler/Invalid.cs +++ b/Rant.Tests/Compiler/Invalid.cs @@ -184,6 +184,7 @@ public void MissingReplacerArgument() [Test] [ExpectedException(typeof(RantCompilerException))] + public void UnterminatedQueryComplement() { RantPattern.FromString(@">"); } From 2ad4edbfedaab59764bb90bf36a361b34861dd27 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 20 Aug 2016 10:49:39 -0500 Subject: [PATCH 041/213] Make RSTs serializer-friendly --- Rant/Core/Compiler/Parsing/BlockParser.cs | 10 +-- Rant/Core/Compiler/Parsing/TagParser.cs | 12 +-- Rant/Core/Compiler/Syntax/RST.cs | 11 ++- Rant/Core/Compiler/Syntax/RstBlock.cs | 14 ++-- .../Core/Compiler/Syntax/RstCallSubroutine.cs | 12 +-- Rant/Core/Compiler/Syntax/RstFunction.cs | 8 +- Rant/Core/Compiler/Syntax/RstQuery.cs | 4 +- Rant/Core/Compiler/Syntax/RstReplacer.cs | 2 +- Rant/Core/Compiler/Syntax/RstSequence.cs | 9 ++- Rant/Core/Compiler/TokenLocation.cs | 8 +- Rant/Core/Framework/RantFunctionRegistry.cs | 10 +-- Rant/Core/Sandbox.cs | 16 ++-- Rant/Core/Stringes/Stringe.cs | 8 +- Rant/Core/Utilities/Util.cs | 20 +---- Rant/RantCompilerMessage.cs | 38 ++++++++- Rant/RantPattern.cs | 4 +- Rant/RantRuntimeException.cs | 80 ++++++------------- Rant/Resources/RantModule.cs | 11 +-- 18 files changed, 133 insertions(+), 144 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 5f0f4ff..a0becb3 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -55,18 +55,16 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { var weightActions = new List(); - Action weightActionCallback = (action) => weightActions.Add(action); + Action weightActionCallback = rst => weightActions.Add(rst); compiler.SetNextActionCallback(weightActionCallback); compiler.AddContext(CompileContext.BlockWeight); yield return Get(); - if (weightActions.Count > 0) - { - firstToken = weightActions[0].Range; - } + if (weightActions.Count == 0) + compiler.SyntaxError(firstToken, "err-compiler-empty-weight", false); - dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, firstToken))); + dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); } reader.Read(R.RightParen, "end of weight"); diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index 3282291..f877bc4 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -6,6 +6,7 @@ using Rant.Vocabulary.Querying; using Rant.Core.Utilities; using Rant.Core.Framework; +using Rant.Core.Stringes; using Rant.Localization; namespace Rant.Core.Compiler.Parsing @@ -16,6 +17,8 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { var nextType = reader.PeekType(); + var tagStart = reader.PrevToken; + // replacer if (nextType == R.Regex) { @@ -37,15 +40,15 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext reader.Read(R.RightSquare, "replacer end"); yield break; } - else if (arguments.Count > 2) + + if (arguments.Count > 2) { - compiler.SyntaxError(arguments[2].Range, "replacer only takes two arguments.", false); + compiler.SyntaxError(Stringe.Range(tagStart, reader.PrevToken), "replacer only takes two arguments.", false); reader.Read(R.RightSquare, "replacer end"); yield break; } actionCallback(new RstReplacer(regex, Util.ParseRegex(regex.Value), arguments[0], arguments[1])); - yield break; } // subroutine else if (nextType == R.Dollar) @@ -56,7 +59,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { yield return e.Current; } - yield break; } // function else @@ -66,8 +68,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { yield return e.Current; } - - yield break; } } diff --git a/Rant/Core/Compiler/Syntax/RST.cs b/Rant/Core/Compiler/Syntax/RST.cs index b117ba0..789b58c 100644 --- a/Rant/Core/Compiler/Syntax/RST.cs +++ b/Rant/Core/Compiler/Syntax/RST.cs @@ -9,11 +9,16 @@ namespace Rant.Core.Compiler.Syntax /// internal abstract class RST { - internal Stringe Range; + internal TokenLocation Location; - protected RST(Stringe range) + protected RST(Stringe location) { - Range = range; + Location = TokenLocation.FromStringe(location); + } + + protected RST(TokenLocation location) + { + Location = location; } /// diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index 500e174..c41023c 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -24,23 +24,23 @@ internal class RstBlock : RST private readonly double _constantWeightSum; private readonly bool _weighted = false; - public RstBlock(Stringe range, params RST[] items) - : base(range) + public RstBlock(Stringe location, params RST[] items) + : base(location) { _items.AddRange(items); _count = items.Length; } - public RstBlock(Stringe range, List items) - : base(range) + public RstBlock(Stringe location, List items) + : base(location) { _items.AddRange(items); _count = items.Count; } - public RstBlock(Stringe range, List items, + public RstBlock(Stringe location, List items, List<_> dynamicWeights, List<_> constantWeights) - : base(range) + : base(location) { _items.AddRange(items); _count = items.Count; @@ -83,7 +83,7 @@ public override IEnumerator Run(Sandbox sb) yield return dw.Item2; var strWeight = sb.Return().Main; if (!Double.TryParse(strWeight, out _weights[dw.Item1])) - throw new RantRuntimeException(sb.Pattern, dw.Item2.Range, + throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, $"Dynamic weight returned invalid weight value: '{strWeight}'"); weightSum += _weights[dw.Item1]; } diff --git a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs index 8364cc8..a347c7d 100644 --- a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs @@ -7,8 +7,8 @@ namespace Rant.Core.Compiler.Syntax { internal class RstCallSubroutine : RstSubroutine { - private string _moduleFunctionName = null; - private bool _inModule = false; + private readonly string _moduleFunctionName = null; + private readonly bool _inModule = false; public RstCallSubroutine(Stringe name, string moduleFunctionName = null) : base(name) @@ -25,21 +25,21 @@ public override IEnumerator Run(Sandbox sb) if (!sb.Modules.ContainsKey(Name)) throw new RantRuntimeException( sb.Pattern, - _name, + this, $"The module '{Name}' does not exist or has not been imported." ); if (sb.Modules[Name][_moduleFunctionName] == null) throw new RantRuntimeException( sb.Pattern, - _name, + this, $"The function '{_moduleFunctionName}' cannot be found in the module '{Name}'." ); } else if (sb.Objects[Name] == null) - throw new RantRuntimeException(sb.Pattern, _name, $"The subroutine '{Name}' does not exist."); + throw new RantRuntimeException(sb.Pattern, this, $"The subroutine '{Name}' does not exist."); var sub = (RstDefineSubroutine)(_inModule ? sb.Modules[Name][_moduleFunctionName] : sb.Objects[Name].Value); if (sub.Parameters.Keys.Count != Arguments.Count) - throw new RantRuntimeException(sb.Pattern, _name, "Argument mismatch on subroutine call."); + throw new RantRuntimeException(sb.Pattern, this, "Argument mismatch on subroutine call."); var action = sub.Body; var args = new Dictionary(); var parameters = sub.Parameters.Keys.ToArray(); diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index 30bced0..d974d3f 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -14,8 +14,8 @@ internal class RstFunction : RST private readonly List _argActions; private readonly int _argc; - public RstFunction(Stringe range, RantFunctionSignature funcInfo, List argActions) - : base(range) + public RstFunction(Stringe location, RantFunctionSignature funcInfo, List argActions) + : base(location) { _funcInfo = funcInfo; _argActions = argActions; @@ -78,7 +78,7 @@ public override IEnumerator Run(Sandbox sb) object value; if (!Util.TryParseEnum(p.NativeType, strMode, out value)) { - throw new RantRuntimeException(sb.Pattern, _argActions[i].Range, + throw new RantRuntimeException(sb.Pattern, _argActions[i].Location, $"Unknown mode value '{strMode}'."); } args[i] = value; @@ -97,7 +97,7 @@ public override IEnumerator Run(Sandbox sb) foreach(var flag in strFlags.Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries)) { if (!Util.TryParseEnum(enumType, flag, out value)) - throw new RantRuntimeException(sb.Pattern, _argActions[i].Range, + throw new RantRuntimeException(sb.Pattern, _argActions[i].Location, $"Unknown flag value '{flag}'."); flags |= Convert.ToInt64(value); } diff --git a/Rant/Core/Compiler/Syntax/RstQuery.cs b/Rant/Core/Compiler/Syntax/RstQuery.cs index 99f49c7..ec4a37e 100644 --- a/Rant/Core/Compiler/Syntax/RstQuery.cs +++ b/Rant/Core/Compiler/Syntax/RstQuery.cs @@ -11,8 +11,8 @@ internal class RstQuery : RST { private readonly Query _query; - public RstQuery(Query query, Stringe range) - : base(range) + public RstQuery(Query query, Stringe location) + : base(location) { _query = query; } diff --git a/Rant/Core/Compiler/Syntax/RstReplacer.cs b/Rant/Core/Compiler/Syntax/RstReplacer.cs index d033344..0d9c5cd 100644 --- a/Rant/Core/Compiler/Syntax/RstReplacer.cs +++ b/Rant/Core/Compiler/Syntax/RstReplacer.cs @@ -14,7 +14,7 @@ internal class RstReplacer : RST private readonly RST _matchEvalAction; private readonly Regex _regex; - public RstReplacer(Stringe range, Regex regex, RST sourceAction, RST matchEvalAction) : base(range) + public RstReplacer(Stringe location, Regex regex, RST sourceAction, RST matchEvalAction) : base(location) { _regex = regex; _sourceAction = sourceAction; diff --git a/Rant/Core/Compiler/Syntax/RstSequence.cs b/Rant/Core/Compiler/Syntax/RstSequence.cs index 5ce6996..3b2281e 100644 --- a/Rant/Core/Compiler/Syntax/RstSequence.cs +++ b/Rant/Core/Compiler/Syntax/RstSequence.cs @@ -15,7 +15,14 @@ internal class RstSequence : RST public List Actions => _actions; public RstSequence(List actions, Stringe defaultRange) - : base(actions.Any() ? Stringe.Range(actions[0].Range, actions[actions.Count - 1].Range) : defaultRange) + : base(actions.Any() ? actions[0].Location : TokenLocation.FromStringe(defaultRange)) + { + if (actions == null) return; + _actions.AddRange(actions); + } + + public RstSequence(List actions, TokenLocation loc) + : base(actions.Any() ? actions[0].Location : loc) { if (actions == null) return; _actions.AddRange(actions); diff --git a/Rant/Core/Compiler/TokenLocation.cs b/Rant/Core/Compiler/TokenLocation.cs index 180b3eb..08cf4ed 100644 --- a/Rant/Core/Compiler/TokenLocation.cs +++ b/Rant/Core/Compiler/TokenLocation.cs @@ -4,19 +4,19 @@ namespace Rant.Core.Compiler { internal struct TokenLocation { + public static readonly TokenLocation Unknown = new TokenLocation(-1, -1, -1); + public int Line; public int Column; public int Index; - public int Length; - public TokenLocation(int line, int column, int index, int length) + public TokenLocation(int line, int column, int index) { Line = line; Column = column; Index = index; - Length = length; } - public static TokenLocation FromStringe(Stringe stringe) => new TokenLocation(stringe.Line, stringe.Column, stringe.Offset, stringe.Length); + public static TokenLocation FromStringe(Stringe stringe) => new TokenLocation(stringe.Line, stringe.Column, stringe.Offset); } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 6d21ea0..fcb01a9 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -710,16 +710,16 @@ private static IEnumerator Import(Sandbox sb, try { - action = sb.Engine.GetPattern(name).Action; + action = sb.Engine.GetPattern(name).SyntaxTree; } catch (RantCompilerException e) { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Range, + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Failed to compile imported pattern '{name}':\n{e.Message}"); } catch (Exception e) { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Range, + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Failed to import '{name}':\n{e.Message}"); } @@ -923,10 +923,10 @@ private static void Use(Sandbox sb, string name) else if (File.Exists(name)) file = name; else - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Range, $"Could not find module '{name}'."); + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Could not find module '{name}'."); var pattern = RantPattern.FromFile(file); if (pattern.Module == null) - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Range, $"No module is defined in {file}."); + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"No module is defined in {file}."); sb.Modules[Path.GetFileNameWithoutExtension(name)] = pattern.Module; } diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index f47fbbc..c3584f5 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -283,8 +283,8 @@ public RantOutput Run(double timeout, RantPattern pattern = null) IEnumerator action; // Push the AST root - CurrentAction = pattern.Action; - callStack.Push(pattern.Action.Run(this)); + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); top: while (callStack.Any()) @@ -296,11 +296,11 @@ public RantOutput Run(double timeout, RantPattern pattern = null) while (action.MoveNext()) { if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - throw new RantRuntimeException(pattern, action.Current.Range, + throw new RantRuntimeException(pattern, action.Current.Location, GetString("err-pattern-timeout", timeout)); if (callStack.Count >= RantEngine.MaxStackSize) - throw new RantRuntimeException(pattern, action.Current.Range, + throw new RantRuntimeException(pattern, action.Current.Location, GetString("err-stack-overflow", RantEngine.MaxStackSize)); if (action.Current == null) break; @@ -341,8 +341,8 @@ public IEnumerable RunSerial(double timeout, RantPattern pattern = n IEnumerator action; // Push the AST root - CurrentAction = pattern.Action; - callStack.Push(pattern.Action.Run(this)); + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); top: while (callStack.Any()) @@ -354,11 +354,11 @@ public IEnumerable RunSerial(double timeout, RantPattern pattern = n while (action.MoveNext()) { if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - throw new RantRuntimeException(pattern, action.Current.Range, + throw new RantRuntimeException(pattern, action.Current.Location, GetString("err-pattern-timeout", timeout)); if (callStack.Count >= RantEngine.MaxStackSize) - throw new RantRuntimeException(pattern, action.Current.Range, + throw new RantRuntimeException(pattern, action.Current.Location, GetString("err-stack-overflow", RantEngine.MaxStackSize)); if (action.Current == null) break; diff --git a/Rant/Core/Stringes/Stringe.cs b/Rant/Core/Stringes/Stringe.cs index 59916ae..3e6c951 100644 --- a/Rant/Core/Stringes/Stringe.cs +++ b/Rant/Core/Stringes/Stringe.cs @@ -46,8 +46,8 @@ public static bool IsNullOrEmpty(Stringe stringe) /// public static Stringe Range(Stringe a, Stringe b) { - if (a == null) throw new ArgumentNullException("a"); - if (b == null) throw new ArgumentNullException("b"); + if (a == null) throw new ArgumentNullException(nameof(a)); + if (b == null) throw new ArgumentNullException(nameof(b)); if (a._stref != b._stref) throw new ArgumentException("The stringes do not belong to the same parent."); @@ -90,8 +90,8 @@ public static Stringe Range(Stringe a, Stringe b) /// public static Stringe Between(Stringe a, Stringe b) { - if (a == null) throw new ArgumentNullException("a"); - if (b == null) throw new ArgumentNullException("b"); + if (a == null) throw new ArgumentNullException(nameof(a)); + if (b == null) throw new ArgumentNullException(nameof(b)); if (a._stref != b._stref) throw new ArgumentException("The stringes do not belong to the same parent."); diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index 639393e..f84b7c4 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -4,9 +4,6 @@ using System.Text; using System.Text.RegularExpressions; -using Rant.Core.Compiler; -using Rant.Core.Stringes; - namespace Rant.Core.Utilities { internal static class Util @@ -204,7 +201,7 @@ public static string SnakeToCamel(string name) public static string CamelToSnake(string camelName) { var name = camelName.Trim(); - if (Util.IsNullOrWhiteSpace(name)) return name; + if (IsNullOrWhiteSpace(name)) return name; if (name.Length == 1) return name.ToLower(); var sb = new StringBuilder(); bool a, b; @@ -254,20 +251,5 @@ public static string Alt(string input, string alternate) } public static int Mod(int a, int b) => ((a % b) + b) % b; - - internal static RantRuntimeException Error(RantPattern source, Stringe token, string message = "A generic syntax error was encountered.") - { - return new RantRuntimeException(source, token, message); - } - - internal static RantRuntimeException Error(IEnumerable> tokens, RantPattern source, string message = "A generic syntax error was encountered.") - { - return new RantRuntimeException(tokens, source, message); - } - - internal static RantRuntimeException Error(string source, Stringe token, string message = "A generic syntax error was encountered.") - { - return new RantRuntimeException(source, token, message); - } } } \ No newline at end of file diff --git a/Rant/RantCompilerMessage.cs b/Rant/RantCompilerMessage.cs index 7b378c9..a9ef026 100644 --- a/Rant/RantCompilerMessage.cs +++ b/Rant/RantCompilerMessage.cs @@ -1,17 +1,43 @@ -using Rant.Localization; +using static Rant.Localization.Txtres; namespace Rant { + /// + /// Represents a message emitted by the Rant compiler while performing a job. + /// public sealed class RantCompilerMessage { + /// + /// The type of message. + /// public RantCompilerMessageType Type { get; } + + /// + /// The source path of the pattern being compiled when the message was generated. + /// public string Source { get; } + + /// + /// The message text. + /// public string Message { get; } + + /// + /// The line on which the message was generated. + /// public int Line { get; } + + /// + /// The column on which the message was generated. + /// public int Column { get; } - public int Index { get; } - public RantCompilerMessage(RantCompilerMessageType type, string source, string message, int line, int column, int index) + /// + /// The character index on which the message was generated. + /// + public int Index { get; } + + internal RantCompilerMessage(RantCompilerMessageType type, string source, string message, int line, int column, int index) { Type = type; Source = source; @@ -21,10 +47,14 @@ public RantCompilerMessage(RantCompilerMessageType type, string source, string m Index = index; } + /// + /// Generates a string representation of the message. + /// + /// public override string ToString() { return Line > 0 - ? $"{Txtres.GetString("src-line-col", Source, Line, Column)} {Message}" + ? $"{GetString("src-line-col", Source, Line, Column)} {Message}" : $"({Source}) {Message}"; } } diff --git a/Rant/RantPattern.cs b/Rant/RantPattern.cs index 819ed7c..be5023b 100644 --- a/Rant/RantPattern.cs +++ b/Rant/RantPattern.cs @@ -42,7 +42,7 @@ public string Name /// public string Code { get; } - internal RST Action { get; } + internal RST SyntaxTree { get; } internal RantModule Module { get; } @@ -52,7 +52,7 @@ internal RantPattern(string name, RantPatternOrigin type, string code) Type = type; Code = code; var compiler = new RantCompiler(name, code); - Action = compiler.Compile(); + SyntaxTree = compiler.Compile(); Module = compiler.HasModule ? compiler.Module : null; } diff --git a/Rant/RantRuntimeException.cs b/Rant/RantRuntimeException.cs index db2c6cc..dd1568f 100644 --- a/Rant/RantRuntimeException.cs +++ b/Rant/RantRuntimeException.cs @@ -3,8 +3,11 @@ using System.Linq; using Rant.Core.Compiler; +using Rant.Core.Compiler.Syntax; using Rant.Core.Stringes; +using static Rant.Localization.Txtres; + namespace Rant { /// @@ -51,65 +54,28 @@ internal void SetToken(Stringe token) _length = token.Length; } - internal RantRuntimeException(RantPattern source, Stringe token, string message = "A generic syntax error was encountered.") - : base((token != null ? ($"({source.Name} @ Ln {token.Line}, Col {token.Column}): ") : "") + message) - { - _source = source.Code; - if (token != null) - { - _line = token.Line; - _col = token.Column; - _index = token.Offset; - _length = token.Length; - } - else - { - _line = _col = 1; - _index = 0; - _length = 0; - } - } - - internal RantRuntimeException(IEnumerable> tokens, RantPattern source, string message = "A generic syntax error was encountered.") - : base((tokens != null ? ($"({source.Name} @ Ln {tokens.First().Line}, Col {tokens.First().Column}): ") : "") + message) + internal RantRuntimeException(RantPattern source, TokenLocation token, string errorMessageType = "err-generic-runtime", params object[] errorArgs) + : base((token.Index != -1 + ? ($"{GetString("src-line-col", source.Name, token.Line, token.Column)} ") + : $"({source.Name}) ") + GetString(errorMessageType, errorArgs)) { _source = source.Code; - - if (tokens != null) - { - var first = tokens.First(); - var last = tokens.Last(); - _line = first.Line; - _col = first.Column; - _index = first.Offset; - _length = (last.Offset + last.Length) - first.Offset; - } - else - { + _line = token.Line; + _col = token.Column; + _index = token.Index; + } - _line = _col = 1; - _index = 0; - _length = 0; - } - } - - internal RantRuntimeException(string source, Stringe token, string message = "A generic syntax error was encountered.") - : base((token != null ? ($"(Ln {token.Line}, Col {token.Column}) - ") : "") + message) - { - _source = source; - if (token != null) - { - _line = token.Line; - _col = token.Column; - _index = token.Offset; - _length = token.Length; - } - else - { - _line = _col = 1; - _index = 0; - _length = 0; - } - } + internal RantRuntimeException(RantPattern source, RST rst, string errorMessageType = "err-generic-runtime", + params object[] errorArgs) + : base(rst == null + ? $"({source.Name}) {GetString(errorMessageType, errorArgs)}" + : $"{GetString("src-line-col", source.Name, rst.Location.Line, rst.Location.Column)} {GetString(errorMessageType, errorArgs)}" + ) + { + _source = source.Code; + _line = rst?.Location.Line ?? 0; + _col = rst?.Location.Column ?? 0; + _index = rst?.Location.Index ?? -1; + } } } \ No newline at end of file diff --git a/Rant/Resources/RantModule.cs b/Rant/Resources/RantModule.cs index a2c569d..6caa5b7 100644 --- a/Rant/Resources/RantModule.cs +++ b/Rant/Resources/RantModule.cs @@ -1,4 +1,5 @@ -using Rant.Core.Compiler.Syntax; +using Rant.Core.Compiler; +using Rant.Core.Compiler.Syntax; using Rant.Core.ObjectModel; namespace Rant.Resources @@ -33,11 +34,11 @@ public RantModule(string name) /// The pattern that will make up the body of the function. public void AddSubroutineFunction(string name, RantPattern pattern) { - var action = (pattern.Action.GetType() == typeof(RstSequence) ? - ((RstSequence)pattern.Action).Actions[0] : - pattern.Action); + var action = (pattern.SyntaxTree.GetType() == typeof(RstSequence) ? + ((RstSequence)pattern.SyntaxTree).Actions[0] : + pattern.SyntaxTree); if (action.GetType() != typeof(RstDefineSubroutine)) - throw new RantRuntimeException(pattern, pattern.Code, "Attempted to add non-subroutine pattern to a module."); + throw new RantRuntimeException(pattern, TokenLocation.Unknown, "Attempted to add non-subroutine pattern to a module."); _objects[name] = new RantObject(action); } From b2c0ef4e4c8caed7f28214a9a92bd8a2e50d230b Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 20 Aug 2016 10:53:03 -0500 Subject: [PATCH 042/213] Fix whitespace in Rant.Core.IO classes --- Rant/Core/Compiler/Syntax/RstBlock.cs | 4 +- Rant/Core/IO/BitField.cs | 270 ++-- Rant/Core/IO/EasyReader.cs | 1696 ++++++++++++------------- Rant/Core/IO/EasyWriter.cs | 930 +++++++------- Rant/Core/IO/Endian.cs | 28 +- Rant/Core/IO/EndiannessAttribute.cs | 38 +- Rant/Core/IO/IOExtensions.cs | 38 +- Rant/Core/IO/IOUtil.cs | 186 +-- 8 files changed, 1595 insertions(+), 1595 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index c41023c..91a2196 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -58,7 +58,7 @@ public RstBlock(Stringe location, List items, } } - public override IEnumerator Run(Sandbox sb) + public override IEnumerator Run(Sandbox sb) { var attribs = sb.NextAttribs(this); @@ -88,7 +88,7 @@ public override IEnumerator Run(Sandbox sb) weightSum += _weights[dw.Item1]; } } - + sb.Blocks.Push(block); for (int i = 0; i < reps; i++) { diff --git a/Rant/Core/IO/BitField.cs b/Rant/Core/IO/BitField.cs index 08d7f8b..e5d2f51 100644 --- a/Rant/Core/IO/BitField.cs +++ b/Rant/Core/IO/BitField.cs @@ -3,153 +3,153 @@ namespace Rant.Core.IO { - /// - /// Represents a bit field of arbitrary length. - /// - internal class BitField - { - internal byte[] _field; + /// + /// Represents a bit field of arbitrary length. + /// + internal class BitField + { + internal byte[] _field; - /// - /// Creates a new instance of the Rant.IO.BitField class with the specified number of bits. - /// - /// The number of bits in the bit field. This value must be a multiple of 8. - public BitField(int bits) - { - if (bits % 8 != 0) - { - throw new ArgumentException("Bit count must be a multiple of 8."); - } + /// + /// Creates a new instance of the Rant.IO.BitField class with the specified number of bits. + /// + /// The number of bits in the bit field. This value must be a multiple of 8. + public BitField(int bits) + { + if (bits % 8 != 0) + { + throw new ArgumentException("Bit count must be a multiple of 8."); + } - _field = new byte[bits / 8]; - } + _field = new byte[bits / 8]; + } - internal BitField(byte[] data) - { - _field = data; - } + internal BitField(byte[] data) + { + _field = data; + } - /// - /// Creates a BitField object from the specified data. - /// - /// The type of data to pass. - /// The data to pass to the BitField. - /// - public static BitField FromValue(T value) where T : struct - { - int size = Marshal.SizeOf(typeof(T)); - byte[] data = new byte[size]; - IntPtr ptr = Marshal.AllocHGlobal(size); - Marshal.StructureToPtr(value, ptr, false); - Marshal.Copy(ptr, data, 0, size); - return new BitField(data); - } + /// + /// Creates a BitField object from the specified data. + /// + /// The type of data to pass. + /// The data to pass to the BitField. + /// + public static BitField FromValue(T value) where T : struct + { + int size = Marshal.SizeOf(typeof(T)); + byte[] data = new byte[size]; + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(value, ptr, false); + Marshal.Copy(ptr, data, 0, size); + return new BitField(data); + } - /// - /// Accesses the bit at the specified index in the bit field. - /// - /// The index of the bit to access. - /// - public bool this[int i] - { - get - { - return ((_field[i / 8] >> (i % 8)) & 1) == 1; - } - set - { - _field[i / 8] = (byte)((_field[i / 8] & ~(1 << (i % 8))) | ((value ? 1 << i % 8 : 0))); - } - } + /// + /// Accesses the bit at the specified index in the bit field. + /// + /// The index of the bit to access. + /// + public bool this[int i] + { + get + { + return ((_field[i / 8] >> (i % 8)) & 1) == 1; + } + set + { + _field[i / 8] = (byte)((_field[i / 8] & ~(1 << (i % 8))) | ((value ? 1 << i % 8 : 0))); + } + } - /// - /// The number of bits in the BitField. - /// - public int Bits - { - get { return _field.Length * 8; } - } + /// + /// The number of bits in the BitField. + /// + public int Bits + { + get { return _field.Length * 8; } + } - /// - /// The number of bytes in the BitField. - /// - public int Bytes - { - get { return _field.Length; } - } + /// + /// The number of bytes in the BitField. + /// + public int Bytes + { + get { return _field.Length; } + } - /// - /// Unsets all the flags in the bitfield. - /// - public void UnsetAll() - { - Array.Clear(_field, 0, _field.Length); - } + /// + /// Unsets all the flags in the bitfield. + /// + public void UnsetAll() + { + Array.Clear(_field, 0, _field.Length); + } - /// - /// Sets all the flags in the bitfield. - /// - public void SetAll() - { - for(int i = 0; i < _field.Length; i++) - { - _field[i] = 0xFF; - } - } + /// + /// Sets all the flags in the bitfield. + /// + public void SetAll() + { + for (int i = 0; i < _field.Length; i++) + { + _field[i] = 0xFF; + } + } - /// - /// Returns the number of set bits. - /// - /// The number of set bits. - public int GetSetCount() - { - int n = 0; - foreach(byte b in _field) - { - n += IOUtil.NumberOfSetBits(b); - } - return n; - } + /// + /// Returns the number of set bits. + /// + /// The number of set bits. + public int GetSetCount() + { + int n = 0; + foreach (byte b in _field) + { + n += IOUtil.NumberOfSetBits(b); + } + return n; + } - /// - /// Returns the number of unset bits. - /// - /// The number of unset bits. - public int GetUnsetCount() - { - return this.Bits - GetSetCount(); - } + /// + /// Returns the number of unset bits. + /// + /// The number of unset bits. + public int GetUnsetCount() + { + return this.Bits - GetSetCount(); + } - /// - /// Inverts the flags in the bit field. - /// - public void Invert() - { - for(int i = 0; i < _field.Length; i++) - { - _field[i] = (byte)~_field[i]; - } - } + /// + /// Inverts the flags in the bit field. + /// + public void Invert() + { + for (int i = 0; i < _field.Length; i++) + { + _field[i] = (byte)~_field[i]; + } + } - /// - /// Creates a new BitField from the specified array of bytes. - /// - /// The array of bytes to create the BitField from. - /// - public static BitField FromBytes(byte[] data) - { - var bf = new BitField(data.Length * 8); - Array.Copy(data, bf._field, data.Length); - return bf; - } + /// + /// Creates a new BitField from the specified array of bytes. + /// + /// The array of bytes to create the BitField from. + /// + public static BitField FromBytes(byte[] data) + { + var bf = new BitField(data.Length * 8); + Array.Copy(data, bf._field, data.Length); + return bf; + } - /// - /// Returns the BitField as an array of bytes. - /// - /// - public byte[] GetBytes() - { - return _field; - } - } + /// + /// Returns the BitField as an array of bytes. + /// + /// + public byte[] GetBytes() + { + return _field; + } + } } diff --git a/Rant/Core/IO/EasyReader.cs b/Rant/Core/IO/EasyReader.cs index 2d683ee..ad026f0 100644 --- a/Rant/Core/IO/EasyReader.cs +++ b/Rant/Core/IO/EasyReader.cs @@ -6,852 +6,852 @@ namespace Rant.Core.IO { - /// - /// Provides comprehensive binary data reading functionality including support for reading arrays and enumeration members. - /// - internal class EasyReader : IDisposable - { - private readonly Stream _stream; - private readonly bool _leaveOpen; - private Endian _endian; - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. - /// - /// The stream from which to read. - /// The endianness of the data to be read. - public EasyReader(Stream stream, Endian defaultEndianness = Endian.Little) - { - _stream = stream; - _endian = defaultEndianness; - _leaveOpen = false; - } - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. - /// - /// The stream from which to read. - /// Specifies whether or not to leave the stream open after the reader is disposed. - /// The endianness of the data to be read. - public EasyReader(Stream stream, bool leaveOpen, Endian defaultEndianness = Endian.Little) - { - _stream = stream; - _endian = defaultEndianness; - _leaveOpen = leaveOpen; - } - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from the specified file path. - /// - /// The path to the file to read. - /// Speficies how the operating system should open the file. - /// The index at which to start reading. - /// The endianness of the data to be read. - public EasyReader(string path, FileMode mode = FileMode.Open, int startIndex = 0, Endian defaultEndianness = Endian.Little) - { - _stream = File.Open(path, mode); - _stream.Position = startIndex; - _endian = defaultEndianness; - _leaveOpen = false; - } - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from a byte array. - /// - /// The byte array to read from. - /// The index at which to start reading. - /// The endianness of the data to be read. - public EasyReader(byte[] data, int startIndex = 0, Endian defaultEndianness = Endian.Little) - { - _stream = new MemoryStream(data); - _stream.Position = startIndex; - _endian = defaultEndianness; - } - - /// - /// Gets or sets the endianness in which data is read by the stream. - /// - public Endian Endianness - { - get { return _endian; } - set { _endian = value; } - } - - /// - /// Returns true if the stream has reached its end. - /// - public bool EndOfStream => _stream.Position == _stream.Length; - - /// - /// The amount of bytes that are remaining to be read. - /// - public long Remaining => _stream.Length - _stream.Position; - - /// - /// The length of the stream in bytes. - /// - public long Length => _stream.Length; - - /// - /// The underlying stream for this instance. - /// - public Stream BaseStream => _stream; - - - /// - /// Returns the next available byte but does not consume it. - /// - /// - public int Peek() - { - int c = _stream.ReadByte(); - _stream.Position--; - return c; - } - - /// - /// Reads a single byte. - /// - /// - public byte ReadByte() - { - return (byte)_stream.ReadByte(); - } - - /// - /// Reads a single byte. - /// - /// The byte that was read. - /// - public EasyReader ReadByte(out byte value) - { - value = (byte)_stream.ReadByte(); - return this; - } - - /// - /// Reads an array of bytes. - /// - /// The number of bytes to read. - /// - public byte[] ReadBytes(int count) - { - byte[] buffer = new byte[count]; - _stream.Read(buffer, 0, count); - return buffer; - } - - /// - /// Reads an array of bytes. - /// - /// The number of bytes to read. - /// The bytes that were read. - /// - public EasyReader ReadBytes(int count, out byte[] value) - { - value = new byte[count]; - _stream.Read(value, 0, count); - return this; - } - - /// - /// Reads all bytes from the stream. - /// - /// - public byte[] ReadAllBytes() - { - byte[] buffer = new byte[_stream.Length]; - _stream.Read(buffer, 0, buffer.Length); - return buffer; - } - - /// - /// Reads all bytes from the stream. - /// - /// The bytes from the stream. - public void ReadAllBytes(out byte[] value) - { - value = new byte[_stream.Length]; - _stream.Read(value, 0, value.Length); - } - - /// - /// Reads a signed byte. - /// - /// - public sbyte ReadSByte() - { - IntermediateByte ib = new IntermediateByte(); - ib.U = (byte)_stream.ReadByte(); - return ib.S; - } - - /// - /// Reads a signed byte. - /// - /// The value that was read. - /// - public EasyReader ReadSByte(out sbyte value) - { - IntermediateByte ib = new IntermediateByte(); - ib.U = (byte)_stream.ReadByte(); - value = ib.S; - return this; - } - - [StructLayout(LayoutKind.Explicit)] - private struct IntermediateByte - { - [FieldOffset(0)] - public byte U; - [FieldOffset(0)] - public sbyte S; - } - - /// - /// Reads a Unicode character. - /// - /// - public char ReadChar() - { - return BitConverter.ToChar(ReadAndFormat(2), 0); - } - - - /// - /// Reads a Unicode character. - /// - /// The character that was read. - /// - public EasyReader ReadChar(out char value) - { - value = BitConverter.ToChar(ReadAndFormat(2), 0); - return this; - } - - /// - /// Reads a 1-byte boolean value. - /// - /// - public bool ReadBoolean() - { - return ReadByte() != 0; - } - - /// - /// Reads a 1-byte boolean value. - /// - /// The boolean value that was read. - /// - public EasyReader ReadBoolean(out bool value) - { - value = ReadByte() != 0; - return this; - } - - /// - /// Reads a 16-bit unsigned integer. - /// - /// - public ushort ReadUInt16() - { - return BitConverter.ToUInt16(ReadAndFormat(2), 0); - } - - /// - /// Reads a 16-bit unsigned integer. - /// - /// The value that was read. - /// - public EasyReader ReadUInt16(out ushort value) - { - value = BitConverter.ToUInt16(ReadAndFormat(2), 0); - return this; - } - - /// - /// Reads a 16-bit signed integer. - /// - /// - public short ReadInt16() - { - return BitConverter.ToInt16(ReadAndFormat(2), 0); - } - - /// - /// Reads a 32-bit unsigned integer. - /// - /// - public uint ReadUInt32() - { - return BitConverter.ToUInt32(ReadAndFormat(4), 0); - } - - /// - /// Reads a 32-bit unsigned integer. - /// - /// The value that was read. - /// - public EasyReader ReadUInt32(out uint value) - { - value = BitConverter.ToUInt32(ReadAndFormat(4), 0); - return this; - } - - /// - /// Reads a 32-bit signed integer. - /// - /// - public int ReadInt32() - { - return BitConverter.ToInt32(ReadAndFormat(4), 0); - } - - /// - /// Reads a 32-bit signed integer. - /// - /// The value that was read. - /// - public EasyReader ReadInt32(out int value) - { - value = BitConverter.ToInt32(ReadAndFormat(4), 0); - return this; - } - - /// - /// Reads a 64-bit unsigned integer. - /// - /// - public ulong ReadUInt64() - { - return BitConverter.ToUInt64(ReadAndFormat(8), 0); - } - - /// - /// Reads a 64-bit unsigned integer. - /// - /// The value that was read. - /// - public EasyReader ReadUInt64(out ulong value) - { - value = BitConverter.ToUInt64(ReadAndFormat(8), 0); - return this; - } - - /// - /// Reads a 64-bit signed integer. - /// - /// - public long ReadInt64() - { - return BitConverter.ToInt64(ReadAndFormat(8), 0); - } - - /// - /// Reads a 64-bit signed integer. - /// - /// The value that was read. - /// - public EasyReader ReadInt64(out long value) - { - value = BitConverter.ToInt64(ReadAndFormat(8), 0); - return this; - } - - /// - /// Reads a single-precision floating point number. - /// - /// - public float ReadSingle() - { - return BitConverter.ToSingle(ReadAndFormat(4), 0); - } - - /// - /// Reads a single-precision floating point number. - /// - /// The value that was read. - /// - public EasyReader ReadSingle(out float value) - { - value = BitConverter.ToSingle(ReadAndFormat(4), 0); - return this; - } - - /// - /// Reads a double-precision floating-point number. - /// - /// - public double ReadDouble() - { - return BitConverter.ToDouble(ReadAndFormat(8), 0); - } - - /// - /// Reads a double-precision floating-point number. - /// - /// The value that was read. - /// - public EasyReader ReadDouble(out double value) - { - value = BitConverter.ToDouble(ReadAndFormat(8), 0); - return this; - } - - /// - /// Reads a 128-bit decimal number. - /// - /// - public decimal ReadDecimal() - { - return ReadStruct(); - } - - /// - /// Reads a 128-bit decimal number. - /// - /// The value that was read. - /// - public EasyReader ReadDecimal(out decimal value) - { - value = ReadStruct(); - return this; - } - - /// - /// Reads a Unicode string. - /// - /// - public string ReadString() - { - int bytes = ReadInt32(); - return Encoding.Unicode.GetString(ReadBytes(bytes)); - } - - /// - /// Reads a Unicode string. - /// - /// The string that was read. - /// - public EasyReader ReadString(out string value) - { - int bytes = ReadInt32(); - value = Encoding.Unicode.GetString(ReadBytes(bytes)); - return this; - } - - /// - /// Reads a string encoded in the specified encoding. - /// - /// The encoding of the string to be read. - /// - public string ReadString(Encoding encoding) - { - int bytes = ReadInt32(); - return encoding.GetString(ReadBytes(bytes)); - } - - /// - /// Reads a string encoded in the specified encoding. - /// - /// The encoding of the string to be read. - /// The string that was read. - /// - public EasyReader ReadString(Encoding encoding, out string value) - { - int bytes = ReadInt32(); - value = encoding.GetString(ReadBytes(bytes)); - return this; - } - - /// - /// Reads a null-terminated string (C-string). - /// - /// The string that was read. - public string ReadCString() - { - var bytes = new List(); - byte c; - while((c = ReadByte()) != 0x00) - bytes.Add(c); - return Encoding.UTF8.GetString(bytes.ToArray()); - } - - /// - /// Reads an array of Unicode strings. - /// - /// - public string[] ReadStringArray() - { - int length = ReadInt32(); - string[] array = new string[length]; - for(int i = 0; i < length; i++) - { - array[i] = ReadString(); - } - return array; - } - - /// - /// Reads an array of Unicode strings. - /// - /// The array of strings that was read. - /// - public EasyReader ReadStringArray(out string[] value) - { - int length = ReadInt32(); - string[] array = new string[length]; - for (int i = 0; i < length; i++) - { - array[i] = ReadString(); - } - value = array; - return this; - } - - /// - /// Reads a string array encoded in the specified encoding. - /// - /// The encoding of the strings to be read. - /// - public string[] ReadStringArray(Encoding encoding) - { - int length = ReadInt32(); - string[] array = new string[length]; - for(int i = 0; i < length; i++) - { - array[i] = ReadString(encoding); - } - return array; - } - - /// - /// Reads a string array encoded in the specified encoding. - /// - /// The encoding of the strings to be read. - /// The array of strings that was read. - /// - public EasyReader ReadStringArray(Encoding encoding, out string[] value) - { - int length = ReadInt32(); - string[] array = new string[length]; - for (int i = 0; i < length; i++) - { - array[i] = ReadString(encoding); - } - value = array; - return this; - } - - /// - /// Reads an array of the specified value type. - /// - /// The type stored in the array. - /// Indicates to the reader that the array length is 64-bit rather than 32-bit. - /// - public T[] ReadArray(bool use64bit = false) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - long count = use64bit ? ReadInt64() : ReadInt32(); - T[] array = new T[count]; - for(int i = 0; i < count; i++) - { - array[i] = ReadStruct(isNumeric); - } - return array; - } - - /// - /// Reads an array of the specified value type. - /// - /// The type stored in the array. - /// The array that was read. - /// Indicates to the reader that the array length is 64-bit rather than 32-bit. - /// - public EasyReader ReadArray(out T[] value, bool use64bit = false) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - long count = use64bit ? ReadInt64() : ReadInt32(); - T[] array = new T[count]; - for (int i = 0; i < count; i++) - { - array[i] = ReadStruct(isNumeric); - } - value = array; - return this; - } - - /// - /// Reads an array of the specified type and item count. - /// - /// The type stored in the array. - /// The length of the array. - /// - public T[] ReadArray(int length) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - T[] array = new T[length]; - for (int i = 0; i < length; i++) - { - array[i] = ReadStruct(isNumeric); - } - return array; - } - - /// - /// Reads an array of the specified type and item count. - /// - /// The type stored in the array. - /// The length of the array. - /// The array that was read. - /// - public EasyReader ReadArray(int length, out T[] value) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - T[] array = new T[length]; - for (int i = 0; i < length; i++) - { - array[i] = ReadStruct(isNumeric); - } - value = array; - return this; - } - - /// - /// Reads a dictionary of the specified key and value types. - /// - /// The key type of the dictionary. - /// The value type of the dictionary. - /// - public Dictionary ReadDictionary() - where TKey : IConvertible - where TValue : IConvertible - { - var ktype = typeof(TKey); - bool kIsString = ktype == typeof(String); - var vtype = typeof(TValue); - bool vIsString = vtype == typeof(String); - - if (!ktype.IsValueType && !kIsString) - { - throw new ArgumentException("TKey must be either a value type or System.String."); - } - else if (!vtype.IsValueType && !vIsString) - { - throw new ArgumentException("TValue must be either a value type or System.String."); - } - - bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); - bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); - int count = ReadInt32(); - var dict = new Dictionary(count); - TKey key; - TValue value; - for(int i = 0; i < count; i++) - { - if (kIsString) - { - key = (TKey)((object)ReadString()); - } - else - { - key = ReadStruct(isKNumeric); - } - - if (vIsString) - { - value = (TValue)((object)ReadString()); - } - else - { - value = ReadStruct(isVNumeric); - } - - dict.Add(key, value); - } - return dict; - } - - /// - /// Reads a dictionary of the specified key and value types. - /// - /// The key type of the dictionary. - /// The value type of the dictionary. - /// The dictionary that was read. - /// - public EasyReader ReadDictionary(out Dictionary value) - where TKey : IConvertible - where TValue : IConvertible - { - value = ReadDictionary(); - return this; - } - - /// - /// Reads an enumeration member. - /// - /// The enumeration type to read. - /// - public TEnum ReadEnum() where TEnum : struct, IConvertible - { - if (!typeof(TEnum).IsEnum) - { - throw new ArgumentException("T must be an enumerated type."); - } - byte size = (byte)Marshal.SizeOf(Enum.GetUnderlyingType(typeof(TEnum))); - byte[] data = ReadAndFormat(size); - Array.Resize(ref data, 8); - return (TEnum)Enum.ToObject(typeof(TEnum), BitConverter.ToInt64(data, 0)); - } - - /// - /// Reads an enumeration member. - /// - /// The enumeration type to read. - /// The enumeration member that was read. - /// - public EasyReader ReadEnum(out TEnum value) where TEnum : struct, IConvertible - { - value = ReadEnum(); - return this; - } - - /// - /// Reads a struct of the specified type. - /// - /// The struct to read. - /// - /// - public TStruct ReadStruct(bool convertEndian = true) - { - if (!typeof(TStruct).IsValueType) - { - throw new ArgumentException("TStruct must be a value type."); - } - int size = Marshal.SizeOf(typeof(TStruct)); - bool numeric = IOUtil.IsNumericType(typeof(TStruct)); - byte[] data = numeric ? ReadAndFormat(size) : ReadBytes(size); - IntPtr ptr = Marshal.AllocHGlobal(size); - Marshal.Copy(data, 0, ptr, size); - TStruct i = (TStruct)Marshal.PtrToStructure(ptr, typeof(TStruct)); - - if (convertEndian) - { - IOUtil.ConvertStructEndians(ref i); - } - - Marshal.FreeHGlobal(ptr); - return i; - } - - /// - /// Reads a struct of the specified type. - /// - /// The struct to read. - /// Specifies if struct members marked with the [Endianness(Endian)] attribute should have their endianness converted as necessary. - /// The struct that was read. - /// - public EasyReader ReadStruct(out TStruct value, bool convertEndian = true) - { - value = ReadStruct(convertEndian); - return this; - } - - /// - /// Reads a nullable value. - /// - /// The type of the value to read. - /// - public T? ReadNullable() - where T : struct - { - T? value = null; - bool hasValue = ReadBoolean(); - if (hasValue) - { - value = ReadStruct(); - } - return value; - } - - /// - /// Reads a nullable value. - /// - /// The type of the value to read. - /// The nullable value that was read. - /// - public EasyReader ReadNullable(out T? value) where T : struct - { - value = null; - bool hasValue = ReadBoolean(); - if (hasValue) - { - value = ReadStruct(); - } - return this; - } - - /// - /// Reads a bit field from the stream. - /// - /// The size of the bit field in bytes. - /// - public BitField ReadBitField(int sizeInBytes) - { - BitField bf = new BitField(new byte[sizeInBytes]); - _stream.Read(bf._field, 0, sizeInBytes); - return bf; - } - - /// - /// Reads a bit field from the stream. - /// - /// The size of the bit field in bytes. - /// The bit field that was read. - /// - public EasyReader ReadBitField(int sizeInBytes, out BitField value) - { - value = new BitField(new byte[sizeInBytes]); - _stream.Read(value._field, 0, sizeInBytes); - return this; - } - - private readonly byte[] _buffer = new byte[128]; - - private byte[] ReadAndFormat(int count) - { - if (BitConverter.IsLittleEndian != (_endian == Endian.Little)) - { - for (int i = 0; i < count; i++) - { - _stream.Read(_buffer, count - i - 1, 1); - } - } - else - { - _stream.Read(_buffer, 0, count); - } - - return _buffer; - } - - /// - /// Closes the reader and the underlying stream. - /// - public void Close() - { - _stream.Close(); - } - - /// - /// Releases all resources used by the current instance of the Rant.IO.EasyReader class. - /// - void IDisposable.Dispose() - { - if (!_leaveOpen) - { - _stream.Dispose(); - } - } - } + /// + /// Provides comprehensive binary data reading functionality including support for reading arrays and enumeration members. + /// + internal class EasyReader : IDisposable + { + private readonly Stream _stream; + private readonly bool _leaveOpen; + private Endian _endian; + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. + /// + /// The stream from which to read. + /// The endianness of the data to be read. + public EasyReader(Stream stream, Endian defaultEndianness = Endian.Little) + { + _stream = stream; + _endian = defaultEndianness; + _leaveOpen = false; + } + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. + /// + /// The stream from which to read. + /// Specifies whether or not to leave the stream open after the reader is disposed. + /// The endianness of the data to be read. + public EasyReader(Stream stream, bool leaveOpen, Endian defaultEndianness = Endian.Little) + { + _stream = stream; + _endian = defaultEndianness; + _leaveOpen = leaveOpen; + } + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from the specified file path. + /// + /// The path to the file to read. + /// Speficies how the operating system should open the file. + /// The index at which to start reading. + /// The endianness of the data to be read. + public EasyReader(string path, FileMode mode = FileMode.Open, int startIndex = 0, Endian defaultEndianness = Endian.Little) + { + _stream = File.Open(path, mode); + _stream.Position = startIndex; + _endian = defaultEndianness; + _leaveOpen = false; + } + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from a byte array. + /// + /// The byte array to read from. + /// The index at which to start reading. + /// The endianness of the data to be read. + public EasyReader(byte[] data, int startIndex = 0, Endian defaultEndianness = Endian.Little) + { + _stream = new MemoryStream(data); + _stream.Position = startIndex; + _endian = defaultEndianness; + } + + /// + /// Gets or sets the endianness in which data is read by the stream. + /// + public Endian Endianness + { + get { return _endian; } + set { _endian = value; } + } + + /// + /// Returns true if the stream has reached its end. + /// + public bool EndOfStream => _stream.Position == _stream.Length; + + /// + /// The amount of bytes that are remaining to be read. + /// + public long Remaining => _stream.Length - _stream.Position; + + /// + /// The length of the stream in bytes. + /// + public long Length => _stream.Length; + + /// + /// The underlying stream for this instance. + /// + public Stream BaseStream => _stream; + + + /// + /// Returns the next available byte but does not consume it. + /// + /// + public int Peek() + { + int c = _stream.ReadByte(); + _stream.Position--; + return c; + } + + /// + /// Reads a single byte. + /// + /// + public byte ReadByte() + { + return (byte)_stream.ReadByte(); + } + + /// + /// Reads a single byte. + /// + /// The byte that was read. + /// + public EasyReader ReadByte(out byte value) + { + value = (byte)_stream.ReadByte(); + return this; + } + + /// + /// Reads an array of bytes. + /// + /// The number of bytes to read. + /// + public byte[] ReadBytes(int count) + { + byte[] buffer = new byte[count]; + _stream.Read(buffer, 0, count); + return buffer; + } + + /// + /// Reads an array of bytes. + /// + /// The number of bytes to read. + /// The bytes that were read. + /// + public EasyReader ReadBytes(int count, out byte[] value) + { + value = new byte[count]; + _stream.Read(value, 0, count); + return this; + } + + /// + /// Reads all bytes from the stream. + /// + /// + public byte[] ReadAllBytes() + { + byte[] buffer = new byte[_stream.Length]; + _stream.Read(buffer, 0, buffer.Length); + return buffer; + } + + /// + /// Reads all bytes from the stream. + /// + /// The bytes from the stream. + public void ReadAllBytes(out byte[] value) + { + value = new byte[_stream.Length]; + _stream.Read(value, 0, value.Length); + } + + /// + /// Reads a signed byte. + /// + /// + public sbyte ReadSByte() + { + IntermediateByte ib = new IntermediateByte(); + ib.U = (byte)_stream.ReadByte(); + return ib.S; + } + + /// + /// Reads a signed byte. + /// + /// The value that was read. + /// + public EasyReader ReadSByte(out sbyte value) + { + IntermediateByte ib = new IntermediateByte(); + ib.U = (byte)_stream.ReadByte(); + value = ib.S; + return this; + } + + [StructLayout(LayoutKind.Explicit)] + private struct IntermediateByte + { + [FieldOffset(0)] + public byte U; + [FieldOffset(0)] + public sbyte S; + } + + /// + /// Reads a Unicode character. + /// + /// + public char ReadChar() + { + return BitConverter.ToChar(ReadAndFormat(2), 0); + } + + + /// + /// Reads a Unicode character. + /// + /// The character that was read. + /// + public EasyReader ReadChar(out char value) + { + value = BitConverter.ToChar(ReadAndFormat(2), 0); + return this; + } + + /// + /// Reads a 1-byte boolean value. + /// + /// + public bool ReadBoolean() + { + return ReadByte() != 0; + } + + /// + /// Reads a 1-byte boolean value. + /// + /// The boolean value that was read. + /// + public EasyReader ReadBoolean(out bool value) + { + value = ReadByte() != 0; + return this; + } + + /// + /// Reads a 16-bit unsigned integer. + /// + /// + public ushort ReadUInt16() + { + return BitConverter.ToUInt16(ReadAndFormat(2), 0); + } + + /// + /// Reads a 16-bit unsigned integer. + /// + /// The value that was read. + /// + public EasyReader ReadUInt16(out ushort value) + { + value = BitConverter.ToUInt16(ReadAndFormat(2), 0); + return this; + } + + /// + /// Reads a 16-bit signed integer. + /// + /// + public short ReadInt16() + { + return BitConverter.ToInt16(ReadAndFormat(2), 0); + } + + /// + /// Reads a 32-bit unsigned integer. + /// + /// + public uint ReadUInt32() + { + return BitConverter.ToUInt32(ReadAndFormat(4), 0); + } + + /// + /// Reads a 32-bit unsigned integer. + /// + /// The value that was read. + /// + public EasyReader ReadUInt32(out uint value) + { + value = BitConverter.ToUInt32(ReadAndFormat(4), 0); + return this; + } + + /// + /// Reads a 32-bit signed integer. + /// + /// + public int ReadInt32() + { + return BitConverter.ToInt32(ReadAndFormat(4), 0); + } + + /// + /// Reads a 32-bit signed integer. + /// + /// The value that was read. + /// + public EasyReader ReadInt32(out int value) + { + value = BitConverter.ToInt32(ReadAndFormat(4), 0); + return this; + } + + /// + /// Reads a 64-bit unsigned integer. + /// + /// + public ulong ReadUInt64() + { + return BitConverter.ToUInt64(ReadAndFormat(8), 0); + } + + /// + /// Reads a 64-bit unsigned integer. + /// + /// The value that was read. + /// + public EasyReader ReadUInt64(out ulong value) + { + value = BitConverter.ToUInt64(ReadAndFormat(8), 0); + return this; + } + + /// + /// Reads a 64-bit signed integer. + /// + /// + public long ReadInt64() + { + return BitConverter.ToInt64(ReadAndFormat(8), 0); + } + + /// + /// Reads a 64-bit signed integer. + /// + /// The value that was read. + /// + public EasyReader ReadInt64(out long value) + { + value = BitConverter.ToInt64(ReadAndFormat(8), 0); + return this; + } + + /// + /// Reads a single-precision floating point number. + /// + /// + public float ReadSingle() + { + return BitConverter.ToSingle(ReadAndFormat(4), 0); + } + + /// + /// Reads a single-precision floating point number. + /// + /// The value that was read. + /// + public EasyReader ReadSingle(out float value) + { + value = BitConverter.ToSingle(ReadAndFormat(4), 0); + return this; + } + + /// + /// Reads a double-precision floating-point number. + /// + /// + public double ReadDouble() + { + return BitConverter.ToDouble(ReadAndFormat(8), 0); + } + + /// + /// Reads a double-precision floating-point number. + /// + /// The value that was read. + /// + public EasyReader ReadDouble(out double value) + { + value = BitConverter.ToDouble(ReadAndFormat(8), 0); + return this; + } + + /// + /// Reads a 128-bit decimal number. + /// + /// + public decimal ReadDecimal() + { + return ReadStruct(); + } + + /// + /// Reads a 128-bit decimal number. + /// + /// The value that was read. + /// + public EasyReader ReadDecimal(out decimal value) + { + value = ReadStruct(); + return this; + } + + /// + /// Reads a Unicode string. + /// + /// + public string ReadString() + { + int bytes = ReadInt32(); + return Encoding.Unicode.GetString(ReadBytes(bytes)); + } + + /// + /// Reads a Unicode string. + /// + /// The string that was read. + /// + public EasyReader ReadString(out string value) + { + int bytes = ReadInt32(); + value = Encoding.Unicode.GetString(ReadBytes(bytes)); + return this; + } + + /// + /// Reads a string encoded in the specified encoding. + /// + /// The encoding of the string to be read. + /// + public string ReadString(Encoding encoding) + { + int bytes = ReadInt32(); + return encoding.GetString(ReadBytes(bytes)); + } + + /// + /// Reads a string encoded in the specified encoding. + /// + /// The encoding of the string to be read. + /// The string that was read. + /// + public EasyReader ReadString(Encoding encoding, out string value) + { + int bytes = ReadInt32(); + value = encoding.GetString(ReadBytes(bytes)); + return this; + } + + /// + /// Reads a null-terminated string (C-string). + /// + /// The string that was read. + public string ReadCString() + { + var bytes = new List(); + byte c; + while ((c = ReadByte()) != 0x00) + bytes.Add(c); + return Encoding.UTF8.GetString(bytes.ToArray()); + } + + /// + /// Reads an array of Unicode strings. + /// + /// + public string[] ReadStringArray() + { + int length = ReadInt32(); + string[] array = new string[length]; + for (int i = 0; i < length; i++) + { + array[i] = ReadString(); + } + return array; + } + + /// + /// Reads an array of Unicode strings. + /// + /// The array of strings that was read. + /// + public EasyReader ReadStringArray(out string[] value) + { + int length = ReadInt32(); + string[] array = new string[length]; + for (int i = 0; i < length; i++) + { + array[i] = ReadString(); + } + value = array; + return this; + } + + /// + /// Reads a string array encoded in the specified encoding. + /// + /// The encoding of the strings to be read. + /// + public string[] ReadStringArray(Encoding encoding) + { + int length = ReadInt32(); + string[] array = new string[length]; + for (int i = 0; i < length; i++) + { + array[i] = ReadString(encoding); + } + return array; + } + + /// + /// Reads a string array encoded in the specified encoding. + /// + /// The encoding of the strings to be read. + /// The array of strings that was read. + /// + public EasyReader ReadStringArray(Encoding encoding, out string[] value) + { + int length = ReadInt32(); + string[] array = new string[length]; + for (int i = 0; i < length; i++) + { + array[i] = ReadString(encoding); + } + value = array; + return this; + } + + /// + /// Reads an array of the specified value type. + /// + /// The type stored in the array. + /// Indicates to the reader that the array length is 64-bit rather than 32-bit. + /// + public T[] ReadArray(bool use64bit = false) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + long count = use64bit ? ReadInt64() : ReadInt32(); + T[] array = new T[count]; + for (int i = 0; i < count; i++) + { + array[i] = ReadStruct(isNumeric); + } + return array; + } + + /// + /// Reads an array of the specified value type. + /// + /// The type stored in the array. + /// The array that was read. + /// Indicates to the reader that the array length is 64-bit rather than 32-bit. + /// + public EasyReader ReadArray(out T[] value, bool use64bit = false) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + long count = use64bit ? ReadInt64() : ReadInt32(); + T[] array = new T[count]; + for (int i = 0; i < count; i++) + { + array[i] = ReadStruct(isNumeric); + } + value = array; + return this; + } + + /// + /// Reads an array of the specified type and item count. + /// + /// The type stored in the array. + /// The length of the array. + /// + public T[] ReadArray(int length) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + T[] array = new T[length]; + for (int i = 0; i < length; i++) + { + array[i] = ReadStruct(isNumeric); + } + return array; + } + + /// + /// Reads an array of the specified type and item count. + /// + /// The type stored in the array. + /// The length of the array. + /// The array that was read. + /// + public EasyReader ReadArray(int length, out T[] value) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + T[] array = new T[length]; + for (int i = 0; i < length; i++) + { + array[i] = ReadStruct(isNumeric); + } + value = array; + return this; + } + + /// + /// Reads a dictionary of the specified key and value types. + /// + /// The key type of the dictionary. + /// The value type of the dictionary. + /// + public Dictionary ReadDictionary() + where TKey : IConvertible + where TValue : IConvertible + { + var ktype = typeof(TKey); + bool kIsString = ktype == typeof(String); + var vtype = typeof(TValue); + bool vIsString = vtype == typeof(String); + + if (!ktype.IsValueType && !kIsString) + { + throw new ArgumentException("TKey must be either a value type or System.String."); + } + else if (!vtype.IsValueType && !vIsString) + { + throw new ArgumentException("TValue must be either a value type or System.String."); + } + + bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); + bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); + int count = ReadInt32(); + var dict = new Dictionary(count); + TKey key; + TValue value; + for (int i = 0; i < count; i++) + { + if (kIsString) + { + key = (TKey)((object)ReadString()); + } + else + { + key = ReadStruct(isKNumeric); + } + + if (vIsString) + { + value = (TValue)((object)ReadString()); + } + else + { + value = ReadStruct(isVNumeric); + } + + dict.Add(key, value); + } + return dict; + } + + /// + /// Reads a dictionary of the specified key and value types. + /// + /// The key type of the dictionary. + /// The value type of the dictionary. + /// The dictionary that was read. + /// + public EasyReader ReadDictionary(out Dictionary value) + where TKey : IConvertible + where TValue : IConvertible + { + value = ReadDictionary(); + return this; + } + + /// + /// Reads an enumeration member. + /// + /// The enumeration type to read. + /// + public TEnum ReadEnum() where TEnum : struct, IConvertible + { + if (!typeof(TEnum).IsEnum) + { + throw new ArgumentException("T must be an enumerated type."); + } + byte size = (byte)Marshal.SizeOf(Enum.GetUnderlyingType(typeof(TEnum))); + byte[] data = ReadAndFormat(size); + Array.Resize(ref data, 8); + return (TEnum)Enum.ToObject(typeof(TEnum), BitConverter.ToInt64(data, 0)); + } + + /// + /// Reads an enumeration member. + /// + /// The enumeration type to read. + /// The enumeration member that was read. + /// + public EasyReader ReadEnum(out TEnum value) where TEnum : struct, IConvertible + { + value = ReadEnum(); + return this; + } + + /// + /// Reads a struct of the specified type. + /// + /// The struct to read. + /// + /// + public TStruct ReadStruct(bool convertEndian = true) + { + if (!typeof(TStruct).IsValueType) + { + throw new ArgumentException("TStruct must be a value type."); + } + int size = Marshal.SizeOf(typeof(TStruct)); + bool numeric = IOUtil.IsNumericType(typeof(TStruct)); + byte[] data = numeric ? ReadAndFormat(size) : ReadBytes(size); + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.Copy(data, 0, ptr, size); + TStruct i = (TStruct)Marshal.PtrToStructure(ptr, typeof(TStruct)); + + if (convertEndian) + { + IOUtil.ConvertStructEndians(ref i); + } + + Marshal.FreeHGlobal(ptr); + return i; + } + + /// + /// Reads a struct of the specified type. + /// + /// The struct to read. + /// Specifies if struct members marked with the [Endianness(Endian)] attribute should have their endianness converted as necessary. + /// The struct that was read. + /// + public EasyReader ReadStruct(out TStruct value, bool convertEndian = true) + { + value = ReadStruct(convertEndian); + return this; + } + + /// + /// Reads a nullable value. + /// + /// The type of the value to read. + /// + public T? ReadNullable() + where T : struct + { + T? value = null; + bool hasValue = ReadBoolean(); + if (hasValue) + { + value = ReadStruct(); + } + return value; + } + + /// + /// Reads a nullable value. + /// + /// The type of the value to read. + /// The nullable value that was read. + /// + public EasyReader ReadNullable(out T? value) where T : struct + { + value = null; + bool hasValue = ReadBoolean(); + if (hasValue) + { + value = ReadStruct(); + } + return this; + } + + /// + /// Reads a bit field from the stream. + /// + /// The size of the bit field in bytes. + /// + public BitField ReadBitField(int sizeInBytes) + { + BitField bf = new BitField(new byte[sizeInBytes]); + _stream.Read(bf._field, 0, sizeInBytes); + return bf; + } + + /// + /// Reads a bit field from the stream. + /// + /// The size of the bit field in bytes. + /// The bit field that was read. + /// + public EasyReader ReadBitField(int sizeInBytes, out BitField value) + { + value = new BitField(new byte[sizeInBytes]); + _stream.Read(value._field, 0, sizeInBytes); + return this; + } + + private readonly byte[] _buffer = new byte[128]; + + private byte[] ReadAndFormat(int count) + { + if (BitConverter.IsLittleEndian != (_endian == Endian.Little)) + { + for (int i = 0; i < count; i++) + { + _stream.Read(_buffer, count - i - 1, 1); + } + } + else + { + _stream.Read(_buffer, 0, count); + } + + return _buffer; + } + + /// + /// Closes the reader and the underlying stream. + /// + public void Close() + { + _stream.Close(); + } + + /// + /// Releases all resources used by the current instance of the Rant.IO.EasyReader class. + /// + void IDisposable.Dispose() + { + if (!_leaveOpen) + { + _stream.Dispose(); + } + } + } } diff --git a/Rant/Core/IO/EasyWriter.cs b/Rant/Core/IO/EasyWriter.cs index fd6beca..c9f94da 100644 --- a/Rant/Core/IO/EasyWriter.cs +++ b/Rant/Core/IO/EasyWriter.cs @@ -6,469 +6,469 @@ namespace Rant.Core.IO { - /// - /// Provides comprehensive binary writing functionality including support for writing arrays and enumeration members. - /// - internal class EasyWriter : IDisposable - { - private const byte TrueByte = 1; - private const byte FalseByte = 0; - - private readonly Stream _stream; - private readonly bool _leaveOpen; - private Endian _endian; - - /// - /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. - /// - /// The stream to write to. - public EasyWriter(Stream stream) - { - _stream = stream; - _endian = Endian.Little; - _leaveOpen = false; - } - - /// - /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. - /// - /// The stream to write to. - /// The endianness in which to write data. - /// Specifies whether or not to leave the stream open after the writer is disposed. - public EasyWriter(Stream stream, Endian endianness = Endian.Little, bool leaveOpen = false) - { - _stream = stream; - _endian = endianness; - _leaveOpen = leaveOpen; - } - - /// - /// Creates a new instance of the Rant.IO.EasyWriter class from the specified file path and mode. - /// - /// The path to the file to write. - /// The endianness in which to write data. - /// Specifies how the operating system should open the file. - public EasyWriter(string path, FileMode mode = FileMode.Create, Endian endianness = Endian.Little) - { - _stream = File.Open(path, mode); - _endian = endianness; - _leaveOpen = false; - } - - /// - /// The underlying stream for this instance. - /// - public Stream BaseStream => _stream; - - /// - /// Gets or sets the endianness in which data is written. - /// - public Endian Endianness - { - get { return _endian; } - set { _endian = value; } - } - - /// - /// The current writing position of the stream. - /// - public long Position - { - get { return _stream.Position; } - set { _stream.Position = value; } - } - - /// - /// The current length of the stream. - /// - public long Length - { - get { return _stream.Length; } - set { _stream.SetLength(value); } - } - - /// - /// Writes a byte to the stream. - /// - /// The byte to write. - public EasyWriter Write(byte value) - { - _stream.WriteByte(value); - return this; - } - - /// - /// Writes an series of bytes to the stream. - /// - /// The byte array to write. - /// - public EasyWriter WriteBytes(byte[] value) - { - _stream.Write(value, 0, value.Length); - return this; - } - - public EasyWriter Write(bool value) - { - _stream.Write(new[] {value ? TrueByte : FalseByte}, 0, 1); - return this; - } - - /// - /// Writes a signed byte to the stream. - /// - /// The signed byte to write. - public EasyWriter Write(sbyte value) - { - _stream.Write(BitConverter.GetBytes(value), 0, 1); - return this; - } - - /// - /// Writes a 16-bit unsigned integer to the stream. - /// - /// The 16-bit unsigned integer to write. - public EasyWriter Write(ushort value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 2); - return this; - } - - /// - /// Writes a 16-bit signed integer to the stream. - /// - /// The 16-bit signed integer to write. - public EasyWriter Write(short value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 2); - return this; - } - - /// - /// Writes a 32-bit unsigned integer to the stream. - /// - /// The 32-bit unsigned integer to write. - public EasyWriter Write(uint value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 4); - return this; - } - - /// - /// Writes a 32-bit signed integer to the stream. - /// - /// The 32-bit signed integer to write. - public EasyWriter Write(int value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 4); - return this; - } - - /// - /// Writes a 64-bit unsigned integer to the stream. - /// - /// The 64-bit unsigned integer to write. - public EasyWriter Write(ulong value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 8); - return this; - } - - /// - /// Writes a 64-bit signed integer to the stream. - /// - /// The 64-bit signed integer to write. - public EasyWriter Write(long value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 8); - return this; - } - - /// - /// Writes a single-precision floating-point number to the stream. - /// - /// The single-precision floating-point number to write. - public EasyWriter Write(float value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 4); - return this; - } - - /// - /// Writes a double-precision floating-point number to the stream. - /// - /// The double-precision floating-point number to write. - public EasyWriter Write(double value) - { - byte[] data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, _endian); - _stream.Write(data, 0, 8); - return this; - } - - /// - /// Writes a 128-bit decimal number to the stream. - /// - /// The 128-bit decimal number to write. - public EasyWriter Write(decimal value) - { - Write(value); - return this; - } - - /// - /// Writes a Unicode string to the stream. - /// - /// The Unicode string to write. - /// Whether or not the string should be written as a C-string. - public EasyWriter Write(string value, bool nullTerminated = false) - { - var bytes = Encoding.Unicode.GetBytes(value); - if(!nullTerminated) - Write(bytes.Length); - _stream.Write(bytes, 0, bytes.Length); - if (nullTerminated) - _stream.WriteByte(0); - return this; - } - - /// - /// Writes a string of the specified encoding to the stream. - /// - /// The string to write to the stream. - /// The encoding to write the string in. - public EasyWriter Write(string value, Encoding encoding, bool nullTerminated = false) - { - var bytes = encoding.GetBytes(value); - if (!nullTerminated) - Write(bytes.Length); - _stream.Write(bytes, 0, bytes.Length); - if (nullTerminated) - _stream.WriteByte(0); - return this; - } - - /// - /// Writes a Unicode string array to the stream. - /// - /// The Unicode string array to write. - public EasyWriter Write(string[] value) - { - int count = value.Length; - Write(count); - foreach(var str in value) - { - Write(str); - } - return this; - } - - /// - /// Writes a string array of the specified encoding to the stream. - /// - /// The string array to write. - /// The encoding to write the strings in. - public EasyWriter Write(string[] value, Encoding encoding) - { - int count = value.Length; - Write(count); - foreach(string str in value) - { - Write(str, encoding); - } - return this; - } - - /// - /// Writes an array of values to the stream. - /// - /// The type of value stored in the array. - /// The array to write. - /// Indices to the writer if the array length should be prefixed to the data. - /// Indicates to the writer that the array length is 64-bit rather than 32-bit. - public EasyWriter WriteArray(T[] array, bool prefixLength = false, bool use64bit = false) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - if (prefixLength) - { - if (use64bit) - { - Write(array.LongLength); - } - else - { - Write(array.Length); - } - } - - foreach(T item in array) - { - Write(item, isNumeric); - } - return this; - } - - /// - /// Writes the specified byte array to the stream. - /// - /// The byte array to write. - public EasyWriter Write(byte[] value) - { - _stream.Write(value, 0, value.Length); - return this; - } - - /// - /// Writes a dictionary of the specified key and value types to the stream. - /// - /// The key type of the dictionary. - /// The value type of the dictionary. - /// The dictionary to write. - public EasyWriter Write(Dictionary value) - { - var ktype = typeof(TKey); - bool kIsString = ktype == typeof(String); - var vtype = typeof(TValue); - bool vIsString = vtype == typeof(String); - - if (!ktype.IsValueType && !kIsString) - { - throw new ArgumentException("TKey must be either a value type or System.String."); - } - else if (!vtype.IsValueType && !vIsString) - { - throw new ArgumentException("TValue must be either a value type or System.String."); - } - - Write(value.Count); - - bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); - bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); - - foreach(KeyValuePair pair in value) - { - if (kIsString) - { - Write(pair.Key.ToString()); - } - else - { - Write(pair.Key, isKNumeric); - } - - if (vIsString) - { - Write(pair.Value.ToString()); - } - else - { - Write(pair.Value, isVNumeric); - } - } - return this; - } - - /// - /// Writes a struct or enumeration member to the stream. - /// - /// The type of the struct or enum. - /// The object to write. - /// Indicates to the writer if endianness attributes should be regarded. - public EasyWriter Write(TStruct value, bool convertEndian = true) - { - if (!typeof(TStruct).IsValueType) - { - throw new ArgumentException("TStruct must be a value type."); - } - - var type = typeof(TStruct); - int size = type.IsEnum ? Marshal.SizeOf(Enum.GetUnderlyingType(type)) : Marshal.SizeOf(value); - byte[] data = new byte[size]; - IntPtr ptr = Marshal.AllocHGlobal(size); - - if (type.IsEnum) - { - object i = Convert.ChangeType(value, Enum.GetUnderlyingType(type)); - Marshal.StructureToPtr(i, ptr, false); - } - else if (convertEndian) - { - TStruct i = value; - IOUtil.ConvertStructEndians(ref i); - Marshal.StructureToPtr(i, ptr, false); - } - - Marshal.Copy(ptr, data, 0, size); - - if (convertEndian && (IOUtil.IsNumericType(type) || type.IsEnum)) - { - IOUtil.ConvertEndian(data, _endian); - } - - Marshal.FreeHGlobal(ptr); - _stream.Write(data, 0, size); - return this; - } - - /// - /// Write a bit field to the stream. - /// - /// The bit field to write. - /// - public EasyWriter Write(BitField value) - { - _stream.Write(value._field, 0, value._field.Length); - return this; - } - - /// - /// Writes a nullable value to the stream. - /// - /// The type of the value to write. - /// The nullable value to write. - public EasyWriter Write(T? value) - where T : struct - { - bool hasValue = value.HasValue; - Write(hasValue); - if (hasValue) - { - Write(value.Value); - } - return this; - } - - /// - /// Closes the writer and the underlying stream. - /// - public void Close() - { - _stream.Close(); - } - - /// - /// Releases all resources used by the current instance of the Rant.IO.EasyWriter class. - /// - public void Dispose() - { - if (!_leaveOpen) - { - _stream.Dispose(); - } - } - } + /// + /// Provides comprehensive binary writing functionality including support for writing arrays and enumeration members. + /// + internal class EasyWriter : IDisposable + { + private const byte TrueByte = 1; + private const byte FalseByte = 0; + + private readonly Stream _stream; + private readonly bool _leaveOpen; + private Endian _endian; + + /// + /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. + /// + /// The stream to write to. + public EasyWriter(Stream stream) + { + _stream = stream; + _endian = Endian.Little; + _leaveOpen = false; + } + + /// + /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. + /// + /// The stream to write to. + /// The endianness in which to write data. + /// Specifies whether or not to leave the stream open after the writer is disposed. + public EasyWriter(Stream stream, Endian endianness = Endian.Little, bool leaveOpen = false) + { + _stream = stream; + _endian = endianness; + _leaveOpen = leaveOpen; + } + + /// + /// Creates a new instance of the Rant.IO.EasyWriter class from the specified file path and mode. + /// + /// The path to the file to write. + /// The endianness in which to write data. + /// Specifies how the operating system should open the file. + public EasyWriter(string path, FileMode mode = FileMode.Create, Endian endianness = Endian.Little) + { + _stream = File.Open(path, mode); + _endian = endianness; + _leaveOpen = false; + } + + /// + /// The underlying stream for this instance. + /// + public Stream BaseStream => _stream; + + /// + /// Gets or sets the endianness in which data is written. + /// + public Endian Endianness + { + get { return _endian; } + set { _endian = value; } + } + + /// + /// The current writing position of the stream. + /// + public long Position + { + get { return _stream.Position; } + set { _stream.Position = value; } + } + + /// + /// The current length of the stream. + /// + public long Length + { + get { return _stream.Length; } + set { _stream.SetLength(value); } + } + + /// + /// Writes a byte to the stream. + /// + /// The byte to write. + public EasyWriter Write(byte value) + { + _stream.WriteByte(value); + return this; + } + + /// + /// Writes an series of bytes to the stream. + /// + /// The byte array to write. + /// + public EasyWriter WriteBytes(byte[] value) + { + _stream.Write(value, 0, value.Length); + return this; + } + + public EasyWriter Write(bool value) + { + _stream.Write(new[] { value ? TrueByte : FalseByte }, 0, 1); + return this; + } + + /// + /// Writes a signed byte to the stream. + /// + /// The signed byte to write. + public EasyWriter Write(sbyte value) + { + _stream.Write(BitConverter.GetBytes(value), 0, 1); + return this; + } + + /// + /// Writes a 16-bit unsigned integer to the stream. + /// + /// The 16-bit unsigned integer to write. + public EasyWriter Write(ushort value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 2); + return this; + } + + /// + /// Writes a 16-bit signed integer to the stream. + /// + /// The 16-bit signed integer to write. + public EasyWriter Write(short value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 2); + return this; + } + + /// + /// Writes a 32-bit unsigned integer to the stream. + /// + /// The 32-bit unsigned integer to write. + public EasyWriter Write(uint value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 4); + return this; + } + + /// + /// Writes a 32-bit signed integer to the stream. + /// + /// The 32-bit signed integer to write. + public EasyWriter Write(int value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 4); + return this; + } + + /// + /// Writes a 64-bit unsigned integer to the stream. + /// + /// The 64-bit unsigned integer to write. + public EasyWriter Write(ulong value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 8); + return this; + } + + /// + /// Writes a 64-bit signed integer to the stream. + /// + /// The 64-bit signed integer to write. + public EasyWriter Write(long value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 8); + return this; + } + + /// + /// Writes a single-precision floating-point number to the stream. + /// + /// The single-precision floating-point number to write. + public EasyWriter Write(float value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 4); + return this; + } + + /// + /// Writes a double-precision floating-point number to the stream. + /// + /// The double-precision floating-point number to write. + public EasyWriter Write(double value) + { + byte[] data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, _endian); + _stream.Write(data, 0, 8); + return this; + } + + /// + /// Writes a 128-bit decimal number to the stream. + /// + /// The 128-bit decimal number to write. + public EasyWriter Write(decimal value) + { + Write(value); + return this; + } + + /// + /// Writes a Unicode string to the stream. + /// + /// The Unicode string to write. + /// Whether or not the string should be written as a C-string. + public EasyWriter Write(string value, bool nullTerminated = false) + { + var bytes = Encoding.Unicode.GetBytes(value); + if (!nullTerminated) + Write(bytes.Length); + _stream.Write(bytes, 0, bytes.Length); + if (nullTerminated) + _stream.WriteByte(0); + return this; + } + + /// + /// Writes a string of the specified encoding to the stream. + /// + /// The string to write to the stream. + /// The encoding to write the string in. + public EasyWriter Write(string value, Encoding encoding, bool nullTerminated = false) + { + var bytes = encoding.GetBytes(value); + if (!nullTerminated) + Write(bytes.Length); + _stream.Write(bytes, 0, bytes.Length); + if (nullTerminated) + _stream.WriteByte(0); + return this; + } + + /// + /// Writes a Unicode string array to the stream. + /// + /// The Unicode string array to write. + public EasyWriter Write(string[] value) + { + int count = value.Length; + Write(count); + foreach (var str in value) + { + Write(str); + } + return this; + } + + /// + /// Writes a string array of the specified encoding to the stream. + /// + /// The string array to write. + /// The encoding to write the strings in. + public EasyWriter Write(string[] value, Encoding encoding) + { + int count = value.Length; + Write(count); + foreach (string str in value) + { + Write(str, encoding); + } + return this; + } + + /// + /// Writes an array of values to the stream. + /// + /// The type of value stored in the array. + /// The array to write. + /// Indices to the writer if the array length should be prefixed to the data. + /// Indicates to the writer that the array length is 64-bit rather than 32-bit. + public EasyWriter WriteArray(T[] array, bool prefixLength = false, bool use64bit = false) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + if (prefixLength) + { + if (use64bit) + { + Write(array.LongLength); + } + else + { + Write(array.Length); + } + } + + foreach (T item in array) + { + Write(item, isNumeric); + } + return this; + } + + /// + /// Writes the specified byte array to the stream. + /// + /// The byte array to write. + public EasyWriter Write(byte[] value) + { + _stream.Write(value, 0, value.Length); + return this; + } + + /// + /// Writes a dictionary of the specified key and value types to the stream. + /// + /// The key type of the dictionary. + /// The value type of the dictionary. + /// The dictionary to write. + public EasyWriter Write(Dictionary value) + { + var ktype = typeof(TKey); + bool kIsString = ktype == typeof(String); + var vtype = typeof(TValue); + bool vIsString = vtype == typeof(String); + + if (!ktype.IsValueType && !kIsString) + { + throw new ArgumentException("TKey must be either a value type or System.String."); + } + else if (!vtype.IsValueType && !vIsString) + { + throw new ArgumentException("TValue must be either a value type or System.String."); + } + + Write(value.Count); + + bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); + bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); + + foreach (KeyValuePair pair in value) + { + if (kIsString) + { + Write(pair.Key.ToString()); + } + else + { + Write(pair.Key, isKNumeric); + } + + if (vIsString) + { + Write(pair.Value.ToString()); + } + else + { + Write(pair.Value, isVNumeric); + } + } + return this; + } + + /// + /// Writes a struct or enumeration member to the stream. + /// + /// The type of the struct or enum. + /// The object to write. + /// Indicates to the writer if endianness attributes should be regarded. + public EasyWriter Write(TStruct value, bool convertEndian = true) + { + if (!typeof(TStruct).IsValueType) + { + throw new ArgumentException("TStruct must be a value type."); + } + + var type = typeof(TStruct); + int size = type.IsEnum ? Marshal.SizeOf(Enum.GetUnderlyingType(type)) : Marshal.SizeOf(value); + byte[] data = new byte[size]; + IntPtr ptr = Marshal.AllocHGlobal(size); + + if (type.IsEnum) + { + object i = Convert.ChangeType(value, Enum.GetUnderlyingType(type)); + Marshal.StructureToPtr(i, ptr, false); + } + else if (convertEndian) + { + TStruct i = value; + IOUtil.ConvertStructEndians(ref i); + Marshal.StructureToPtr(i, ptr, false); + } + + Marshal.Copy(ptr, data, 0, size); + + if (convertEndian && (IOUtil.IsNumericType(type) || type.IsEnum)) + { + IOUtil.ConvertEndian(data, _endian); + } + + Marshal.FreeHGlobal(ptr); + _stream.Write(data, 0, size); + return this; + } + + /// + /// Write a bit field to the stream. + /// + /// The bit field to write. + /// + public EasyWriter Write(BitField value) + { + _stream.Write(value._field, 0, value._field.Length); + return this; + } + + /// + /// Writes a nullable value to the stream. + /// + /// The type of the value to write. + /// The nullable value to write. + public EasyWriter Write(T? value) + where T : struct + { + bool hasValue = value.HasValue; + Write(hasValue); + if (hasValue) + { + Write(value.Value); + } + return this; + } + + /// + /// Closes the writer and the underlying stream. + /// + public void Close() + { + _stream.Close(); + } + + /// + /// Releases all resources used by the current instance of the Rant.IO.EasyWriter class. + /// + public void Dispose() + { + if (!_leaveOpen) + { + _stream.Dispose(); + } + } + } } diff --git a/Rant/Core/IO/Endian.cs b/Rant/Core/IO/Endian.cs index 7f64811..6b4d57e 100644 --- a/Rant/Core/IO/Endian.cs +++ b/Rant/Core/IO/Endian.cs @@ -1,17 +1,17 @@ namespace Rant.Core.IO { - /// - /// Indicates byte ordering of binary fields. - /// - internal enum Endian - { - /// - /// Big endian. - /// - Big, - /// - /// Little endian. - /// - Little - } + /// + /// Indicates byte ordering of binary fields. + /// + internal enum Endian + { + /// + /// Big endian. + /// + Big, + /// + /// Little endian. + /// + Little + } } diff --git a/Rant/Core/IO/EndiannessAttribute.cs b/Rant/Core/IO/EndiannessAttribute.cs index 643e23f..32701b8 100644 --- a/Rant/Core/IO/EndiannessAttribute.cs +++ b/Rant/Core/IO/EndiannessAttribute.cs @@ -2,24 +2,24 @@ namespace Rant.Core.IO { - /// - /// Specifies the byte order in which a field should be written and read by EasyWriter/EasyReader. - /// - [AttributeUsage(AttributeTargets.Field)] - internal class EndiannessAttribute : Attribute - { - /// - /// The endianness to represent the data in. - /// - public readonly Endian Endian; + /// + /// Specifies the byte order in which a field should be written and read by EasyWriter/EasyReader. + /// + [AttributeUsage(AttributeTargets.Field)] + internal class EndiannessAttribute : Attribute + { + /// + /// The endianness to represent the data in. + /// + public readonly Endian Endian; - /// - /// Initializes a new instance of the EasyIO.EndiannessAttribute class with the specified endianness. - /// - /// The endianness to represent the field data in. - public EndiannessAttribute(Endian endianness) - { - Endian = endianness; - } - } + /// + /// Initializes a new instance of the EasyIO.EndiannessAttribute class with the specified endianness. + /// + /// The endianness to represent the field data in. + public EndiannessAttribute(Endian endianness) + { + Endian = endianness; + } + } } diff --git a/Rant/Core/IO/IOExtensions.cs b/Rant/Core/IO/IOExtensions.cs index ee41fa9..c7677b5 100644 --- a/Rant/Core/IO/IOExtensions.cs +++ b/Rant/Core/IO/IOExtensions.cs @@ -1,25 +1,25 @@ namespace Rant.Core.IO { - internal static class IOExtensions - { - public static bool GetFlag(this byte field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } + internal static class IOExtensions + { + public static bool GetFlag(this byte field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } - public static bool GetFlag(this short field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } + public static bool GetFlag(this short field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } - public static bool GetFlag(this int field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } + public static bool GetFlag(this int field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } - public static bool GetFlag(this long field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } - } + public static bool GetFlag(this long field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } + } } diff --git a/Rant/Core/IO/IOUtil.cs b/Rant/Core/IO/IOUtil.cs index eeda8ac..df13f17 100644 --- a/Rant/Core/IO/IOUtil.cs +++ b/Rant/Core/IO/IOUtil.cs @@ -4,105 +4,105 @@ namespace Rant.Core.IO { - internal static class IOUtil - { - public static int NumberOfSetBits(uint i) - { - i = i - ((i >> 1) & 0x55555555); - i = (i & 0x33333333) + ((i >> 2) & 0x33333333); - return (int)(((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; - } + internal static class IOUtil + { + public static int NumberOfSetBits(uint i) + { + i = i - ((i >> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >> 2) & 0x33333333); + return (int)(((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; + } - public static bool EndianConvertNeeded(Endian endianness) - { - return (BitConverter.IsLittleEndian && endianness == Endian.Big) || (!BitConverter.IsLittleEndian && endianness == Endian.Little); - } + public static bool EndianConvertNeeded(Endian endianness) + { + return (BitConverter.IsLittleEndian && endianness == Endian.Big) || (!BitConverter.IsLittleEndian && endianness == Endian.Little); + } - public static bool IsNumericType(Type t) - { - switch (Type.GetTypeCode(t)) - { - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.UInt16: - case TypeCode.UInt32: - case TypeCode.UInt64: - case TypeCode.Int16: - case TypeCode.Int32: - case TypeCode.Int64: - case TypeCode.Decimal: - case TypeCode.Double: - case TypeCode.Single: - return true; - default: - return false; - } - } + public static bool IsNumericType(Type t) + { + switch (Type.GetTypeCode(t)) + { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Decimal: + case TypeCode.Double: + case TypeCode.Single: + return true; + default: + return false; + } + } - /// - /// Converts the endianness of a series of bytes according to the endianness of the data. This process works both for system-side and data-side conversions. - /// - /// The data to convert. - /// The endianness to convert to or from. - public static void ConvertEndian(byte[] data, Endian dataEndianness) - { - if (BitConverter.IsLittleEndian != (dataEndianness == Endian.Little)) - { - Array.Reverse(data); - } - } + /// + /// Converts the endianness of a series of bytes according to the endianness of the data. This process works both for system-side and data-side conversions. + /// + /// The data to convert. + /// The endianness to convert to or from. + public static void ConvertEndian(byte[] data, Endian dataEndianness) + { + if (BitConverter.IsLittleEndian != (dataEndianness == Endian.Little)) + { + Array.Reverse(data); + } + } - public static void ConvertStructEndians(ref TStruct o) - { - if (!typeof(TStruct).IsValueType) - { - throw new ArgumentException("TStruct must be a value type."); - } - object boxed = o; - foreach (var field in typeof(TStruct).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) - { - Type ftype = field.FieldType; - if (!IOUtil.IsNumericType(ftype)) - { - continue; - } + public static void ConvertStructEndians(ref TStruct o) + { + if (!typeof(TStruct).IsValueType) + { + throw new ArgumentException("TStruct must be a value type."); + } + object boxed = o; + foreach (var field in typeof(TStruct).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) + { + Type ftype = field.FieldType; + if (!IOUtil.IsNumericType(ftype)) + { + continue; + } - var attrs = field.GetCustomAttributes(true); - foreach (var attr in attrs) - { - if (attr.GetType() == typeof(EndiannessAttribute)) - { - var endian = ((EndiannessAttribute)attr).Endian; - if (EndianConvertNeeded(endian)) - { - // Get the field size, allocate a pointer and a buffer for flipping bytes. - int length = Marshal.SizeOf(ftype); - IntPtr vptr = Marshal.AllocHGlobal(length); - byte[] vData = new byte[length]; + var attrs = field.GetCustomAttributes(true); + foreach (var attr in attrs) + { + if (attr.GetType() == typeof(EndiannessAttribute)) + { + var endian = ((EndiannessAttribute)attr).Endian; + if (EndianConvertNeeded(endian)) + { + // Get the field size, allocate a pointer and a buffer for flipping bytes. + int length = Marshal.SizeOf(ftype); + IntPtr vptr = Marshal.AllocHGlobal(length); + byte[] vData = new byte[length]; - // Fetch the field value and store it. - object value = field.GetValue(boxed); + // Fetch the field value and store it. + object value = field.GetValue(boxed); - // Transfer the field value to the pointer and copy it to the array. - Marshal.StructureToPtr(value, vptr, false); - Marshal.Copy(vptr, vData, 0, length); - - // Reverse. - Array.Reverse(vData); + // Transfer the field value to the pointer and copy it to the array. + Marshal.StructureToPtr(value, vptr, false); + Marshal.Copy(vptr, vData, 0, length); - // Copy it back to the pointer. - Marshal.Copy(vData, 0, vptr, length); - value = Marshal.PtrToStructure(vptr, ftype); - // Plug it back into the field. - field.SetValue(boxed, value); - // Deallocate the pointer. - Marshal.FreeHGlobal(vptr); - o = (TStruct)boxed; - } - break; // Go to the next field. - } - } - } - } - } + // Reverse. + Array.Reverse(vData); + + // Copy it back to the pointer. + Marshal.Copy(vData, 0, vptr, length); + value = Marshal.PtrToStructure(vptr, ftype); + // Plug it back into the field. + field.SetValue(boxed, value); + // Deallocate the pointer. + Marshal.FreeHGlobal(vptr); + o = (TStruct)boxed; + } + break; // Go to the next field. + } + } + } + } + } } From 9805bf981307c84474fdde4ad2ef5de68b1485cd Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 20 Aug 2016 12:59:19 -0500 Subject: [PATCH 043/213] Localization/XML docs work --- Rant/Core/Compiler/Parsing/BlockParser.cs | 4 +- Rant/Core/Compiler/Parsing/QueryParser.cs | 23 +-- Rant/Core/Compiler/Parsing/SequenceParser.cs | 13 +- Rant/Core/Compiler/Parsing/TagParser.cs | 8 +- Rant/Core/Compiler/RantCompiler.cs | 4 +- Rant/Core/Compiler/RantLexer.cs | 8 +- Rant/Core/Compiler/Syntax/RstBlock.cs | 6 +- Rant/Core/Compiler/TokenReader.cs | 28 ++-- Rant/Core/IO/Bson/BsonDocument.cs | 3 +- Rant/Core/IO/Compression/ICoder.cs | 6 +- Rant/Core/ObjectModel/RantObject.cs | 156 ++++++++++--------- Rant/Core/Stringes/StringeErrorDelegate.cs | 2 +- Rant/Core/Stringes/StringeReader.cs | 14 +- Rant/Localization/Txtres.cs | 3 +- Rant/Localization/de-DE.lang | 4 + Rant/Localization/en-US.lang | 5 + Rant/RantCompilerException.cs | 7 + Rant/RantCompilerMessageType.cs | 7 + Rant/RantOutputEntry.cs | 3 + Rant/RantPatternArgs.cs | 3 + Rant/Resources/RantPackage.cs | 4 + Rant/Resources/RantPackageVersion.cs | 2 + Rant/Vocabulary/RantDictionary.cs | 2 - 23 files changed, 177 insertions(+), 138 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index a0becb3..a3b72a3 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -46,7 +46,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext double doubleValue; if (!double.TryParse(value, out doubleValue)) { - compiler.SyntaxError(value, "invalid constant weight"); + compiler.SyntaxError(value, false, "invalid constant weight"); } constantWeights.Add(new _(blockNumber, doubleValue)); } @@ -62,7 +62,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext yield return Get(); if (weightActions.Count == 0) - compiler.SyntaxError(firstToken, "err-compiler-empty-weight", false); + compiler.SyntaxError(firstToken, false, "err-compiler-empty-weight"); dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); } diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 50f57bf..8876aa2 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -21,7 +21,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext query.Carrier = new Carrier(); query.Exclusive = reader.TakeLoose(R.Dollar); bool subtypeRead = false; - bool directObjectRead = false; + bool complementRead = false; bool endOfQueryReached = false; while (!reader.End && !endOfQueryReached) @@ -35,7 +35,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // if there's already a subtype, throw an error and ignore it if (subtypeRead) { - compiler.SyntaxError(token, "multiple subtypes in query", false); + compiler.SyntaxError(token, false, "err-compiler-multiple-subtypes"); reader.Read(R.Text, "query subtype name"); break; } @@ -45,12 +45,14 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // complement case R.LeftSquare: { + if (complementRead) compiler.SyntaxError(token, false, "err-compiler-multiple-complements"); var seq = new List(); compiler.AddContext(CompileContext.QueryComplement); compiler.SetNextActionCallback(seq.Add); yield return Get(); compiler.SetNextActionCallback(actionCallback); query.Complement = new RstSequence(seq, Stringe.Between(token, reader.PrevToken)); + complementRead = true; } break; // read class filter @@ -95,7 +97,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext int firstNumber; if (!Util.ParseInt(firstNumberToken.Value, out firstNumber)) { - compiler.SyntaxError(firstNumberToken, "syllable range value is not a valid integer"); + compiler.SyntaxError(firstNumberToken, false, "err-compiler-bad-sylrange-value"); } // (a-) or (a-b) @@ -109,7 +111,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext int secondNumber; if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) { - compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); + compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); } query.SyllablePredicate = new Range(firstNumber, secondNumber); @@ -134,19 +136,19 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext int secondNumber; if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) { - compiler.SyntaxError(secondNumberToken, "syllable range value is not a valid integer"); + compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); } query.SyllablePredicate = new Range(null, secondNumber); } // () else if (reader.PeekLooseToken().ID == R.RightParen) { - compiler.SyntaxError(token, "empty syllable range", false); + compiler.SyntaxError(token, false, "err-compiler-empty-sylrange"); } // (something else) else { - compiler.SyntaxError(reader.PeekLooseToken(), "unexpected token in syllable range"); + compiler.SyntaxError(reader.PeekLooseToken(), false, "err-compiler-unknown-sylrange-token"); } reader.ReadLoose(R.RightParen, "syllable range end"); @@ -168,18 +170,17 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext break; default: - compiler.SyntaxError(token, "unexpected token"); + compiler.SyntaxError(token, false, "err-compiler-unexpected-token"); break; } } if (!endOfQueryReached) { - compiler.SyntaxError(reader.PrevToken, "unexpected end-of-pattern"); + compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); } actionCallback(new RstQuery(query, tableName)); - yield break; } private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler compiler) @@ -279,7 +280,7 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp return; default: - compiler.SyntaxError(token, "unexpected token"); + compiler.SyntaxError(token, false, "err-compiler-unexpected-token"); break; } } diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 2693659..df40780 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -44,10 +44,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.LeaveContext(); yield break; } - else - { - compiler.SyntaxError(token, "Unexpected block terminator"); - } + compiler.SyntaxError(token, false, "err-compiler-unexpected-block-end"); break; // end of argument @@ -70,11 +67,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.LeaveContext(); yield break; } - compiler.SyntaxError(token, "Unexpected tag end", false); + compiler.SyntaxError(token, false, "err-compiler-unexpected-tag-end"); break; case R.RightAngle: - compiler.SyntaxError(token, "Unexpected query end."); + compiler.SyntaxError(token, false, "err-compiler-unexpected-query-end"); break; // the end of a block weight, maybe @@ -111,7 +108,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext case R.EOF: if (context != CompileContext.DefaultSequence) { - compiler.SyntaxError(token, "unexpected end-of-pattern"); + compiler.SyntaxError(token, true, "err-compiler-eof"); } yield break; @@ -123,7 +120,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext if (reader.End && context != CompileContext.DefaultSequence) { - compiler.SyntaxError(reader.PrevToken, "unexpected end-of-pattern"); + compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); } } } diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index f877bc4..1b95c8b 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -36,14 +36,14 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.SetNextActionCallback(actionCallback); if (arguments.Count < 2) { - compiler.SyntaxError(regex, "replacer requires source text and replacement pattern.", false); + compiler.SyntaxError(regex, false, "replacer requires source text and replacement pattern."); reader.Read(R.RightSquare, "replacer end"); yield break; } if (arguments.Count > 2) { - compiler.SyntaxError(Stringe.Range(tagStart, reader.PrevToken), "replacer only takes two arguments.", false); + compiler.SyntaxError(Stringe.Range(tagStart, reader.PrevToken), false, "replacer only takes two arguments."); reader.Read(R.RightSquare, "replacer end"); yield break; } @@ -96,14 +96,14 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext if (!RantFunctionRegistry.FunctionExists(functionName.Value)) { - compiler.SyntaxError(functionName, Txtres.GetString("err-compiler-nonexistent-function", functionName.Value), false); + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-function", functionName.Value); yield break; } var sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count); if (sig == null) { - compiler.SyntaxError(functionName, "function " + functionName.Value + " has no overload with " + arguments.Count + " arguments.", false); + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-overload", functionName.Value, arguments.Count); yield break; } diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 0f65878..38d9024 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -85,10 +85,10 @@ public RST Compile() } } - public void SyntaxError(Stringe token, string message, bool fatal = true) + public void SyntaxError(Stringe token, bool fatal, string errorMessageType, params object[] errorMessageArgs) { if (_errors == null) _errors = new List(); - _errors.Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, message, token?.Line ?? 0, token?.Column ?? 0, token?.Offset ?? -1)); + _errors.Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, errorMessageType, token?.Line ?? 0, token?.Column ?? 0, token?.Offset ?? -1)); if (fatal) { throw new RantCompilerException(_sourceName, _errors); diff --git a/Rant/Core/Compiler/RantLexer.cs b/Rant/Core/Compiler/RantLexer.cs index 1b70512..021654f 100644 --- a/Rant/Core/Compiler/RantLexer.cs +++ b/Rant/Core/Compiler/RantLexer.cs @@ -69,7 +69,7 @@ static RantLexer() if (!reader.Eat('\\')) return false; if (reader.EndOfStringe) { - reader.Error(reader.Stringe.Substringe(reader.Position - 1, 1), Txtres.GetString("err-compiler-incomplete-escape"), true); + reader.Error(reader.Stringe.Substringe(reader.Position - 1, 1), true, "err-compiler-incomplete-escape"); return false; } if (reader.EatWhile(Char.IsDigit)) @@ -78,7 +78,7 @@ static RantLexer() reader.EatAny('k', 'M', 'B'); if (!reader.Eat(',')) { - reader.Error(reader.Stringe.Substringe(reader.Position - 1, 1), "Expected ',' after quantifier.", false); + reader.Error(reader.Stringe.Substringe(reader.Position - 1, 1), true, "Expected ',' after quantifier."); // TODO: Localize error message return true; } } @@ -111,7 +111,7 @@ static RantLexer() } if (reader.EndOfStringe) { - reader.Error(token, "Unterminated regular expression.", true); + reader.Error(token, true, "Unterminated regular expression."); // TODO: Localize error message return false; } reader.Eat('i'); @@ -129,7 +129,7 @@ static RantLexer() reader.EatAll("\"\""); if (reader.ReadChare() == '"') return true; } - reader.Error(token, "Unterminated constant literal.", true); + reader.Error(token, true, "Unterminated constant literal."); // TODO: Localize error message return false; }, R.ConstantLiteral }, diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index 91a2196..a0a816b 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -5,6 +5,8 @@ using Rant.Core.Constructs; using Rant.Core.Stringes; +using static Rant.Localization.Txtres; + namespace Rant.Core.Compiler.Syntax { /// @@ -83,8 +85,8 @@ public override IEnumerator Run(Sandbox sb) yield return dw.Item2; var strWeight = sb.Return().Main; if (!Double.TryParse(strWeight, out _weights[dw.Item1])) - throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, - $"Dynamic weight returned invalid weight value: '{strWeight}'"); + throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, GetString("err-runtime-invalid-dynamic-weight", strWeight)); + weightSum += _weights[dw.Item1]; } } diff --git a/Rant/Core/Compiler/TokenReader.cs b/Rant/Core/Compiler/TokenReader.cs index daaec46..37c93bc 100644 --- a/Rant/Core/Compiler/TokenReader.cs +++ b/Rant/Core/Compiler/TokenReader.cs @@ -64,7 +64,7 @@ public Token ReadToken() { if (End) { - _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + _compiler.SyntaxError(null, true, GetString("err-compiler-eof")); return null; } return _tokens[_pos++]; @@ -87,7 +87,7 @@ public Token PeekLooseToken() { if (End) { - _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + _compiler.SyntaxError(null, true, "err-compiler-eof"); return null; } int pos = _pos; @@ -142,7 +142,7 @@ public bool Take(R type, bool allowEof = true) { if (!allowEof) { - _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + _compiler.SyntaxError(null, true, "err-compiler-eof"); return false; } return false; @@ -164,7 +164,7 @@ public bool TakeLoose(R type, bool allowEof = true) { if (!allowEof) { - _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + _compiler.SyntaxError(null, true, "err-compiler-eof"); return false; } return false; @@ -266,7 +266,7 @@ public bool TakeAll(R type, bool allowEof = true) { if (!allowEof) { - _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + _compiler.SyntaxError(null, true, "err-compiler-eof"); return false; } return false; @@ -291,7 +291,7 @@ public bool TakeAllLoose(R type, bool allowEof = true) { if (!allowEof) { - _compiler.SyntaxError(null, GetString("err-compiler-eof"), true); + _compiler.SyntaxError(null, true, "err-compiler-eof"); return false; } return false; @@ -317,12 +317,12 @@ public Token Read(R type, string expectedTokenName = null) { if (End) { - _compiler.SyntaxError(null, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + _compiler.SyntaxError(null, true, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); return null; } if (_tokens[_pos].ID != type) { - _compiler.SyntaxError(_tokens[_pos], $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + _compiler.SyntaxError(_tokens[_pos], true, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); return null; } return _tokens[_pos++]; @@ -338,14 +338,14 @@ public Token ReadAny(params R[] types) { if (End) { - _compiler.SyntaxError(null, + _compiler.SyntaxError(null, true, $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}, but hit end of file."); return null; } if (!types.Contains(_tokens[_pos].ID)) // NOTE: .Contains isn't too fast but does it matter in this case? { - _compiler.SyntaxError(_tokens[_pos], $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}."); + _compiler.SyntaxError(_tokens[_pos], true, $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}."); return null; } @@ -363,14 +363,14 @@ public Token ReadLoose(R type, string expectedTokenName = null) { if (End) { - _compiler.SyntaxError(null, + _compiler.SyntaxError(null, true, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); return null; } SkipSpace(); if (_tokens[_pos].ID != type) { - _compiler.SyntaxError(_tokens[_pos], + _compiler.SyntaxError(_tokens[_pos], true, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}"); return null; } @@ -437,7 +437,7 @@ public Token ReadLooseToken() { if (End) { - _compiler.SyntaxError(null, GetString("err-compiler-eof")); + _compiler.SyntaxError(null, true, "err-compiler-eof"); return null; } SkipSpace(); @@ -459,7 +459,7 @@ public bool TakeAllWhile(Func, bool> predicate, bool allowEof = true) { if (!allowEof) { - _compiler.SyntaxError(null, GetString("err-compiler-eof")); + _compiler.SyntaxError(null, true, "err-compiler-eof"); } return false; } diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs index 0916655..431a792 100644 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ b/Rant/Core/IO/Bson/BsonDocument.cs @@ -52,7 +52,7 @@ public BsonItem this[string key] /// /// Creates an empty BSON document. - /// Whether or not to generate and use a string table. + /// Whether or not to generate and use a string table. /// public BsonDocument( BsonStringTableMode mode = BsonStringTableMode.None, @@ -95,6 +95,7 @@ public byte[] GenerateStringTable() /// Writes this BSON document to the specified path. /// /// The path to write to. + /// public void Write(string path, bool includeStringTable = false) { var stream = File.Open(path, FileMode.Create); diff --git a/Rant/Core/IO/Compression/ICoder.cs b/Rant/Core/IO/Compression/ICoder.cs index ad496be..ab4986a 100644 --- a/Rant/Core/IO/Compression/ICoder.cs +++ b/Rant/Core/IO/Compression/ICoder.cs @@ -98,15 +98,15 @@ internal enum CoderPropID /// BlockSize, /// - /// Specifies number of postion state bits for LZMA (0 <= x <= 4). + /// Specifies number of postion state bits for LZMA (0 <= x <= 4). /// PosStateBits, /// - /// Specifies number of literal context bits for LZMA (0 <= x <= 8). + /// Specifies number of literal context bits for LZMA (0 <= x <= 8). /// LitContextBits, /// - /// Specifies number of literal position bits for LZMA (0 <= x <= 4). + /// Specifies number of literal position bits for LZMA (0 <= x <= 4). /// LitPosBits, /// diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index 8e16496..39b0220 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -63,10 +63,10 @@ public RantObject() { } - /// - /// Creates a new RantObject instance with a list value. - /// - /// The list to assign to the object. + /// + /// Creates a new RantObject instance with a list value. + /// + /// The list to assign to the object. public RantObject(List list) { if (list == null) return; @@ -74,20 +74,20 @@ public RantObject(List list) _list = list; } - /// - /// Creates a new RantObject instance with a boolean value. - /// - /// The boolean value to assign to the object. + /// + /// Creates a new RantObject instance with a boolean value. + /// + /// The boolean value to assign to the object. public RantObject(bool boolean) { Type = RantObjectType.Boolean; _boolean = boolean; } - /// - /// Creates a new RantObject instance with a string value. - /// - /// The string to assign to the object. + /// + /// Creates a new RantObject instance with a string value. + /// + /// The string to assign to the object. public RantObject(string str) { if (str == null) return; @@ -95,10 +95,10 @@ public RantObject(string str) _string = str; } - /// - /// Creates a new RantObject instance with a decimal number value. - /// - /// The number to assign to the object. + /// + /// Creates a new RantObject instance with a decimal number value. + /// + /// The number to assign to the object. public RantObject(double num) { Type = RantObjectType.Number; @@ -111,10 +111,10 @@ internal RantObject(RST action) _action = action; } - /// - /// Creates a new RantObject instance from the specified object. - /// - /// The value to assign to the object. + /// + /// Creates a new RantObject instance from the specified object. + /// + /// The value to assign to the object. public RantObject(object obj) { if (obj == null) return; @@ -155,16 +155,20 @@ public RantObject(object obj) } } - public RantObject(RantObjectType type) - { - Type = type; - } + /// + /// Creates a new RantObject with the specified object type and a default value. + /// + /// The type of object to create. + public RantObject(RantObjectType type) + { + Type = type; + } - /// - /// Converts the current object to a RantObject of the specified type and returns it. - /// - /// The object type to convert to. - /// + /// + /// Converts the current object to a RantObject of the specified type and returns it. + /// + /// The object type to convert to. + /// public RantObject ConvertTo(RantObjectType type) { if (Type == type) return Clone(); @@ -246,10 +250,10 @@ public RantObject ConvertTo(RantObjectType type) return No; } - /// - /// Returns another RantObject instance with the exact same value as the current instance. - /// - /// + /// + /// Returns another RantObject instance with the exact same value as the current instance. + /// + /// public RantObject Clone() { return new RantObject @@ -264,15 +268,15 @@ public RantObject Clone() }; } - /// - /// Returns the sum of two RantObjects. - /// - /// The first object. - /// The second object. - /// + /// + /// Returns the sum of two RantObjects. + /// + /// The first object. + /// The second object. + /// public static RantObject operator +(RantObject a, RantObject b) { - switch (a.Type) // TODO: Cover all cases + switch (a.Type) // TODO: Cover all cases { case RantObjectType.Number: { @@ -299,12 +303,12 @@ public RantObject Clone() return No; } - /// - /// Subtracts a RantObject from another. - /// - /// The object to subtract from. - /// The object to subtract. - /// + /// + /// Subtracts a RantObject from another. + /// + /// The object to subtract from. + /// The object to subtract. + /// public static RantObject operator -(RantObject a, RantObject b) { switch (a.Type) @@ -323,12 +327,12 @@ public RantObject Clone() return No; } - /// - /// Returns the product of two RantObjects. - /// - /// The first object. - /// The second object. - /// + /// + /// Returns the product of two RantObjects. + /// + /// The first object. + /// The second object. + /// public static RantObject operator *(RantObject a, RantObject b) { switch (a.Type) @@ -343,33 +347,33 @@ public RantObject Clone() break; } case RantObjectType.String: - { - switch (b.Type) { - case RantObjectType.Number: + switch (b.Type) { - var sb = new StringBuilder(); - int c = (int)b._number; - for (int i = 0; i < c; i++) - { - sb.Append(a._string); - } - return new RantObject(sb.ToString()); + case RantObjectType.Number: + { + var sb = new StringBuilder(); + int c = (int)b._number; + for (int i = 0; i < c; i++) + { + sb.Append(a._string); + } + return new RantObject(sb.ToString()); + } } + break; } - break; - } } return No; } - /// - /// Divides one RantObject by another. - /// - /// The object to divide. - /// The object to divide by. - /// + /// + /// Divides one RantObject by another. + /// + /// The object to divide. + /// The object to divide by. + /// public static RantObject operator /(RantObject a, RantObject b) { switch (a.Type) @@ -388,10 +392,10 @@ public RantObject Clone() return No; } - /// - /// Returns a string representation of the current RantObject. - /// - /// + /// + /// Returns a string representation of the current RantObject. + /// + /// public override string ToString() { switch (Type) @@ -402,8 +406,8 @@ public override string ToString() return _string; case RantObjectType.No: return "no"; - case RantObjectType.Undefined: - return "???"; + case RantObjectType.Undefined: + return "???"; case RantObjectType.Number: return _number.ToString(); case RantObjectType.Pattern: diff --git a/Rant/Core/Stringes/StringeErrorDelegate.cs b/Rant/Core/Stringes/StringeErrorDelegate.cs index 1001425..75a7c35 100644 --- a/Rant/Core/Stringes/StringeErrorDelegate.cs +++ b/Rant/Core/Stringes/StringeErrorDelegate.cs @@ -1,4 +1,4 @@ namespace Rant.Core.Stringes { - internal delegate void StringeErrorDelegate(Stringe token, string message, bool fatal); + internal delegate void StringeErrorDelegate(Stringe token, bool fatal, string messageType, params object[] args); } \ No newline at end of file diff --git a/Rant/Core/Stringes/StringeReader.cs b/Rant/Core/Stringes/StringeReader.cs index 385bbe9..4195774 100644 --- a/Rant/Core/Stringes/StringeReader.cs +++ b/Rant/Core/Stringes/StringeReader.cs @@ -2,8 +2,6 @@ using System.Linq; using System.Text.RegularExpressions; -using Rant.Core.Compiler; - namespace Rant.Core.Stringes { /// @@ -56,7 +54,7 @@ public StringeReader(Stringe value, StringeErrorDelegate errorCallback) /// public bool EndOfStringe => _pos >= _stringe.Length; - public void Error(Stringe token, string message, bool fatal) => _errorCallback?.Invoke(token, message, fatal); + public void Error(Stringe token, bool fatal, string messageType, params object[] args) => _errorCallback?.Invoke(token, fatal, messageType, args); /// /// Reads a charactere from the input and advances the position by one. @@ -260,7 +258,7 @@ public bool Eat(Regex regex) /// public bool Eat(Regex regex, out Stringe result) { - if (regex == null) throw new ArgumentNullException("regex"); + if (regex == null) throw new ArgumentNullException(nameof(regex)); result = null; var match = regex.Match(_stringe.Value, _pos); if (!match.Success || match.Index != _pos) return false; @@ -306,7 +304,7 @@ public bool IsNext(string value, StringComparison strcmp = StringComparison.Inva /// public bool IsNext(Regex regex) { - if (regex == null) throw new ArgumentNullException("regex"); + if (regex == null) throw new ArgumentNullException(nameof(regex)); var match = regex.Match(_stringe.Value, _pos); return match.Success && match.Index == _pos; } @@ -319,7 +317,7 @@ public bool IsNext(Regex regex) /// public bool IsNext(Regex regex, out Stringe result) { - if (regex == null) throw new ArgumentNullException("regex"); + if (regex == null) throw new ArgumentNullException(nameof(regex)); result = null; var match = regex.Match(_stringe.Value, _pos); if (!match.Success || match.Index != _pos) return false; @@ -511,6 +509,8 @@ public Token ReadToken(Lexer rules) where T : struct throw new InvalidOperationException(String.Concat("(Ln ", bad.Line, ", Col ", bad.Column, ") Invalid token '", bad, "'")); } + // ReSharper disable once LoopVariableIsNeverChangedInsideLoop + // ReSharper disable once ConditionIsAlwaysTrueOrFalse } while (captureUndef); throw new InvalidOperationException("This should never happen."); @@ -526,7 +526,7 @@ public int Position { if (value < 0 || value > _stringe.Length) { - throw new ArgumentOutOfRangeException("value"); + throw new ArgumentOutOfRangeException(nameof(value)); } _pos = value; } diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index 7a11c4e..862b463 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -14,7 +14,7 @@ internal static class Txtres public const string LanguageResourceNamespace = "Rant.Localization"; public const string FallbackLanguageCode = "en-US"; - private static readonly Dictionary> _languages = new Dictionary>(); + private static readonly Dictionary> _languages = new Dictionary>(); private static Dictionary _currentTable = new Dictionary(); private static string _langName = CultureInfo.CurrentCulture.Name; @@ -42,6 +42,7 @@ static Txtres() Console.WriteLine($"Loaded string resources for {CultureInfo.CurrentCulture.Name}"); #endif } + catch (Exception ex) { #if DEBUG diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 8b2ffe0..ab896d8 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -38,7 +38,11 @@ err-compiler-missing-token = "{0} erwartet." err-compiler-bad-escape = "Unerkannte Escapesequenz: {0}" err-compiler-empty-sylrange = "Leerer Silbenbereich." err-compiler-bad-sylrange-value = "Silbenbereichswert muss Ganzzahl sein." +err-compiler-incomplete-escape = "Unvollständige Escapesequenz gefunden." err-compiler-multiple-subtypes = "Mehrere Subtypen in Anfrage gefunden." +err-compiler-nonexistent-overload = "Funktion '{0}' hat keine Überladung mit {1} Argument(en)." + +err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat ein ungültiges Gewichtswert zurückgegeben: '{0}'" token-carrier-name = "Anfragezustandspeichernamen" token-table-name = "Tabellenamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 4b837db..9c1abf9 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -37,7 +37,12 @@ err-compiler-nonexistent-function = "The specified function '{0}' does not exist err-compiler-missing-token = "Expected {0}." err-compiler-bad-escape = "Invalid escape sequence: {0}" err-compiler-empty-sylrange = "Empty syllable range." +err-compiler-bad-sylrange-value = "Syllable range values can only be integers." err-compiler-incomplete-escape = "Incomplete escape sequence." +err-compiler-multiple-subtypes = "Too many subtypes in query. Only one is allowed." +err-compiler-nonexistent-overload = "Function '{0}' has no overload that takes {1} argument(s)." + +err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" token-carrier-name = "carrier name" token-table-name = "table name" diff --git a/Rant/RantCompilerException.cs b/Rant/RantCompilerException.cs index ac9d99c..81ce934 100644 --- a/Rant/RantCompilerException.cs +++ b/Rant/RantCompilerException.cs @@ -16,7 +16,14 @@ public sealed class RantCompilerException : Exception { private readonly List _errorList; + /// + /// The name of the source pattern on which the error occurred. + /// public string SourceName { get; } + + /// + /// Indicates whether the exception is the result of an internal engine error. + /// public bool InternalError { get; } internal RantCompilerException(string sourceName, List errorList) diff --git a/Rant/RantCompilerMessageType.cs b/Rant/RantCompilerMessageType.cs index a1cd6ae..dd1b375 100644 --- a/Rant/RantCompilerMessageType.cs +++ b/Rant/RantCompilerMessageType.cs @@ -5,7 +5,14 @@ /// public enum RantCompilerMessageType { + /// + /// Indicates a problem that did not interfere with compilation. + /// Warning, + + /// + /// Indicates a problem that made compilation impossible, usually a syntax error. + /// Error } } \ No newline at end of file diff --git a/Rant/RantOutputEntry.cs b/Rant/RantOutputEntry.cs index 4991ef1..975697a 100644 --- a/Rant/RantOutputEntry.cs +++ b/Rant/RantOutputEntry.cs @@ -17,6 +17,9 @@ public sealed class RantOutputEntry /// public string Value { get; } + /// + /// The visibility of the channel that created the output entry. + /// public ChannelVisibility Visiblity { get; } internal RantOutputEntry(string name, string value, ChannelVisibility visiblity) diff --git a/Rant/RantPatternArgs.cs b/Rant/RantPatternArgs.cs index 5a73080..3a767a2 100644 --- a/Rant/RantPatternArgs.cs +++ b/Rant/RantPatternArgs.cs @@ -17,6 +17,9 @@ public sealed class RantPatternArgs private readonly Dictionary _args = new Dictionary(); + /// + /// Create a new, empty RantPatternArgs instance. + /// public RantPatternArgs() { diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 27c6b65..40abfbb 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -430,6 +430,10 @@ public static RantPackage Load(Stream source) } } + /// + /// Returns a string containing the title and version of the package. + /// + /// public override string ToString() => $"{Title}, v{Version}"; } } \ No newline at end of file diff --git a/Rant/Resources/RantPackageVersion.cs b/Rant/Resources/RantPackageVersion.cs index 3ce57dc..4b1ad5c 100644 --- a/Rant/Resources/RantPackageVersion.cs +++ b/Rant/Resources/RantPackageVersion.cs @@ -3,6 +3,8 @@ using Rant.Core.Utilities; +#pragma warning disable 1591 // I am *not* writing XML docs for operator overloads with blatantly obvious usages. + namespace Rant.Resources { /// diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index 1b96c21..92140e3 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -29,7 +29,6 @@ public RantDictionary() /// Creates a new RantDictionary object from the specified dictionary collection. /// /// The tables to store in the dictionary. - /// The merging strategy to employ. public RantDictionary(IEnumerable tables) { _tables = new Dictionary(); @@ -107,7 +106,6 @@ public IEnumerable GetTables() /// Loads all dictionary (.dic) files from the specified directory and returns a RantDictionary object that contains the loaded data. /// /// The directory from which to load dictionaries. - /// The merging strategy to employ. /// public static RantDictionary FromDirectory(string directory) { From 22a48732639114d01ab4ae050057eb896ed82d66 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 20 Aug 2016 13:12:43 -0500 Subject: [PATCH 044/213] Fix grammar error in German translation --- Rant/Localization/de-DE.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index ab896d8..c9d644a 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -1,7 +1,7 @@ untitled-package = "Unbenanntes Paket" default-package-id = "Paket" -src-line-col = "({0}: Z {1} S {2})" +src-line-col = "({0}: Zeile {1} Spalte {2})" err-zero-or-negative = "Wert muss größer als Null sein." err-empty-path = "Der Dateipfad darf nicht leer oder NULL sein." @@ -42,7 +42,7 @@ err-compiler-incomplete-escape = "Unvollständige Escapesequenz gefunden." err-compiler-multiple-subtypes = "Mehrere Subtypen in Anfrage gefunden." err-compiler-nonexistent-overload = "Funktion '{0}' hat keine Überladung mit {1} Argument(en)." -err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat ein ungültiges Gewichtswert zurückgegeben: '{0}'" +err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" token-carrier-name = "Anfragezustandspeichernamen" token-table-name = "Tabellenamen" From 40ab40318f137b2b3e3c2da093adb9dd99ca171d Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 21 Aug 2016 17:06:39 -0500 Subject: [PATCH 045/213] Add more XML comments/translations --- Rant/Core/Compiler/Syntax/RST.cs | 19 ++++++++++++++++++- Rant/Formats/Pluralizer.cs | 5 +++++ Rant/Formats/RantFormat.cs | 7 +++++++ Rant/Localization/Txtres.cs | 2 ++ Rant/Localization/de-DE.lang | 1 + Rant/Localization/en-US.lang | 1 + Rant/Rant.csproj | 2 -- Rant/RantCompilerException.cs | 6 +++++- Rant/Vocabulary/Querying/EntryVariantHint.cs | 12 ------------ Rant/Vocabulary/Querying/TableSource.cs | 16 ---------------- 10 files changed, 39 insertions(+), 32 deletions(-) delete mode 100644 Rant/Vocabulary/Querying/EntryVariantHint.cs delete mode 100644 Rant/Vocabulary/Querying/TableSource.cs diff --git a/Rant/Core/Compiler/Syntax/RST.cs b/Rant/Core/Compiler/Syntax/RST.cs index 789b58c..384d384 100644 --- a/Rant/Core/Compiler/Syntax/RST.cs +++ b/Rant/Core/Compiler/Syntax/RST.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; +using Rant.Core.IO; using Rant.Core.Stringes; namespace Rant.Core.Compiler.Syntax @@ -22,10 +23,26 @@ protected RST(TokenLocation location) } /// - /// Performs the operations defined in the action, given a specific sandbox to operate upon. + /// Performs the operations defined in the RST, given a specific sandbox to operate upon. /// /// The sandbox on which to operate. /// public abstract IEnumerator Run(Sandbox sb); + + public void SerializeObject(EasyWriter output) + { + // TODO: Write type code + //Serialize(output); + } + + public void DeserializeObject(EasyReader input) + { + // Type code has already been read + //Deserialize(input); + } + + //protected abstract void Serialize(EasyWriter output); + + //protected abstract void Deserialize(EasyReader input); } } \ No newline at end of file diff --git a/Rant/Formats/Pluralizer.cs b/Rant/Formats/Pluralizer.cs index b5207b2..76a537a 100644 --- a/Rant/Formats/Pluralizer.cs +++ b/Rant/Formats/Pluralizer.cs @@ -5,6 +5,11 @@ /// public abstract class Pluralizer { + /// + /// Converts the specified input noun to a plural version. + /// + /// The noun to convert. + /// public abstract string Pluralize(string input); } } \ No newline at end of file diff --git a/Rant/Formats/RantFormat.cs b/Rant/Formats/RantFormat.cs index 00da498..c9784c5 100644 --- a/Rant/Formats/RantFormat.cs +++ b/Rant/Formats/RantFormat.cs @@ -25,10 +25,17 @@ static RantFormat() "are", "you", "why", "from"); } + /// + /// Creates a new RantFormat instance with default values. + /// public RantFormat() { } + /// + /// Creates a new RantFormat instance with the specified culture. + /// + /// The culture to associate with the format. public RantFormat(CultureInfo culture) { Culture = culture; diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index 862b463..f4bb48f 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -7,6 +7,8 @@ using System.Runtime.CompilerServices; using System.Text; +#pragma warning disable 0168 + namespace Rant.Localization { internal static class Txtres diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index c9d644a..c8020cd 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -31,6 +31,7 @@ err-unknown-flag = "Unbekannten Flagwert gefunden: '{0}'" compiler-errors-found = "{0} Erstellungsfehler sind aufgetreten:" compiler-errors-also-found = "{0} Erstellungsfehler sind auch aufgetreten:" compiler-error-also-found = "Einen Erstellungsfehler ist auch aufgetreten:" +err-compiler-internal = "Interner Fehler des Typs '{0}' beim Erstellen aufgetreten (siehe InnerException).\n\nFehlermeldung: {1}" err-compiler-eof = "Unerwartetes Dateiende." err-compiler-unexpected-token = "Unerwartetes Token gefunden: '{0}'" err-compiler-nonexistent-function = "Die Funktion '{0}' existiert nicht." diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 9c1abf9..e3869f8 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -31,6 +31,7 @@ err-unknown-flag = "Unknown flag value: '{0}'" compiler-errors-found = "{0} compiler errors found:" compiler-errors-also-found = "{0} compiler errors also found:" compiler-error-also-found = "One compiler error also found:" +err-compiler-internal = "Internal exception of type '{0}' occurred while compiling. See InnerExcpetion for details.\n\nException message: {1}" err-compiler-eof = "Unexpected end of file." err-compiler-unexpected-token = "Unexpected token found: '{0}'" err-compiler-nonexistent-function = "The specified function '{0}' does not exist." diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 5eb52e6..1605b7e 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -277,8 +277,6 @@ - - diff --git a/Rant/RantCompilerException.cs b/Rant/RantCompilerException.cs index 81ce934..bb1fa65 100644 --- a/Rant/RantCompilerException.cs +++ b/Rant/RantCompilerException.cs @@ -64,7 +64,7 @@ private static string GenerateErrorString(List list) private static string GenerateErrorStringWithInnerEx(List list, Exception inner) { var writer = new StringBuilder(); - writer.AppendLine($"Compiler encountered an unexpected internal error of type '{inner.GetType().Name}'. See InnerException for details."); + writer.AppendLine(GetString("err-compiler-internal", inner.GetType().Name, inner.Message)); if (list != null && list.Any()) { @@ -88,6 +88,10 @@ private static string GenerateErrorStringWithInnerEx(List l return writer.ToString(); } + /// + /// Enumerates the errors collected from the compiler. + /// + /// public IEnumerable GetErrors() { if (_errorList == null) yield break; diff --git a/Rant/Vocabulary/Querying/EntryVariantHint.cs b/Rant/Vocabulary/Querying/EntryVariantHint.cs deleted file mode 100644 index dbdfab5..0000000 --- a/Rant/Vocabulary/Querying/EntryVariantHint.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Rant.Vocabulary.Querying -{ - public enum EntryVariantHint - { - None, - Uncommon, - Informal, - Vulgar, - Slang, - Polite - } -} \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/TableSource.cs b/Rant/Vocabulary/Querying/TableSource.cs deleted file mode 100644 index 98dd785..0000000 --- a/Rant/Vocabulary/Querying/TableSource.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Rant.Vocabulary.Querying -{ - internal class TableSource - { - public string Name { get; } - public string Subtype { get; } - public EntryVariantHint Hint { get; } = EntryVariantHint.None; - - public TableSource(string name, string subtype, EntryVariantHint hint = EntryVariantHint.None) - { - Name = name; - Subtype = subtype; - Hint = hint; - } - } -} \ No newline at end of file From e5f1d246876b922e8f577074d46953d4c76c559e Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 21 Aug 2016 17:23:07 -0500 Subject: [PATCH 046/213] Fix Stringes bug --- Rant/Core/Compiler/RantCompiler.cs | 3 +++ Rant/Core/Stringes/Stringe.cs | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 38d9024..2c883ad 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -75,14 +75,17 @@ public RST Compile() return new RstSequence(actionList, _source); } + catch (RantCompilerException) { throw; } +#if !DEBUG catch (Exception ex) { throw new RantCompilerException(_sourceName, _errors, ex); } +#endif } public void SyntaxError(Stringe token, bool fatal, string errorMessageType, params object[] errorMessageArgs) diff --git a/Rant/Core/Stringes/Stringe.cs b/Rant/Core/Stringes/Stringe.cs index 3e6c951..121dcc3 100644 --- a/Rant/Core/Stringes/Stringe.cs +++ b/Rant/Core/Stringes/Stringe.cs @@ -139,12 +139,12 @@ public static Stringe Between(Stringe a, Stringe b) /// /// The 1-based line number at which the stringe begins. /// - public int Line => _stref.Chares[_offset].Line; + public int Line => _stref.String?.Length > 0 ? _stref.Chares[_offset].Line : 1; /// /// The 1-based column at which the stringe begins. /// - public int Column => _stref.Chares[_offset].Column; + public int Column => _stref.String?.Length > 0 ? _stref.Chares[_offset].Column : 1; /// /// The index at which the stringe ends in the string. From 6531a194ec4701dcb03d3c883e92c7df86252a1e Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 21 Aug 2016 19:36:04 -0500 Subject: [PATCH 047/213] Make compiler error formatting more helpful --- Rant/Core/Compiler/Parsing/TagParser.cs | 88 +++++++++++-------------- Rant/Core/Compiler/RantCompiler.cs | 14 ++-- Rant/Localization/de-DE.lang | 3 +- Rant/Localization/en-US.lang | 3 +- Rant/RantCompilerException.cs | 19 ++++-- 5 files changed, 65 insertions(+), 62 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index 1b95c8b..373df1a 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -1,13 +1,10 @@ using System; using System.Collections.Generic; -using System.Text.RegularExpressions; using Rant.Core.Compiler.Syntax; -using Rant.Vocabulary.Querying; -using Rant.Core.Utilities; using Rant.Core.Framework; using Rant.Core.Stringes; -using Rant.Localization; +using Rant.Core.Utilities; namespace Rant.Core.Compiler.Parsing { @@ -20,54 +17,51 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var tagStart = reader.PrevToken; // replacer - if (nextType == R.Regex) + switch (nextType) { - var regex = reader.Read(R.Regex, "replacer regex"); - reader.Read(R.Colon); + case R.Regex: + { + var regex = reader.Read(R.Regex, "replacer regex"); + reader.Read(R.Colon); - var arguments = new List(); + var arguments = new List(); - var iterator = ReadArguments(compiler, reader, arguments); - while (iterator.MoveNext()) - { - yield return iterator.Current; - } + var iterator = ReadArguments(compiler, reader, arguments); + while (iterator.MoveNext()) + { + yield return iterator.Current; + } - compiler.SetNextActionCallback(actionCallback); - if (arguments.Count < 2) - { - compiler.SyntaxError(regex, false, "replacer requires source text and replacement pattern."); - reader.Read(R.RightSquare, "replacer end"); - yield break; - } + compiler.SetNextActionCallback(actionCallback); - if (arguments.Count > 2) - { - compiler.SyntaxError(Stringe.Range(tagStart, reader.PrevToken), false, "replacer only takes two arguments."); - reader.Read(R.RightSquare, "replacer end"); - yield break; - } + if (arguments.Count != 2) + { + compiler.SyntaxError(Stringe.Range(tagStart, reader.PrevToken), false, "err-compiler-replacer-argcount"); + yield break; + } - actionCallback(new RstReplacer(regex, Util.ParseRegex(regex.Value), arguments[0], arguments[1])); - } - // subroutine - else if (nextType == R.Dollar) - { - reader.ReadToken(); - var e = ParseSubroutine(compiler, context, reader, actionCallback); - while (e.MoveNext()) - { - yield return e.Current; - } - } - // function - else - { - var e = ParseFunction(compiler, context, reader, actionCallback); - while (e.MoveNext()) - { - yield return e.Current; - } + actionCallback(new RstReplacer(regex, Util.ParseRegex(regex.Value), arguments[0], arguments[1])); + } + break; + case R.Dollar: + { + reader.ReadToken(); + var e = ParseSubroutine(compiler, context, reader, actionCallback); + while (e.MoveNext()) + { + yield return e.Current; + } + } + break; + default: + { + var e = ParseFunction(compiler, context, reader, actionCallback); + while (e.MoveNext()) + { + yield return e.Current; + } + } + break; } } @@ -108,7 +102,6 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext } actionCallback(new RstFunction(functionName, sig, arguments)); - yield break; } private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) @@ -160,7 +153,6 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex compiler.Module.AddActionFunction(subroutineName.Value, subroutine); } actionCallback(subroutine); - yield break; } else { diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 2c883ad..7a52442 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -8,6 +8,8 @@ using Rant.Core.Stringes; using Rant.Resources; +using static Rant.Localization.Txtres; + namespace Rant.Core.Compiler { internal class RantCompiler @@ -75,7 +77,7 @@ public RST Compile() return new RstSequence(actionList, _source); } - + catch (RantCompilerException) { throw; @@ -90,12 +92,10 @@ public RST Compile() public void SyntaxError(Stringe token, bool fatal, string errorMessageType, params object[] errorMessageArgs) { - if (_errors == null) _errors = new List(); - _errors.Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, errorMessageType, token?.Line ?? 0, token?.Column ?? 0, token?.Offset ?? -1)); - if (fatal) - { - throw new RantCompilerException(_sourceName, _errors); - } + (_errors ?? (_errors = new List())) + .Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, GetString(errorMessageType, errorMessageArgs), + token?.Line ?? 0, token?.Column ?? 0, token?.Offset ?? -1)); + if (fatal) throw new RantCompilerException(_sourceName, _errors); } } } diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index c8020cd..449667a 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -1,7 +1,7 @@ untitled-package = "Unbenanntes Paket" default-package-id = "Paket" -src-line-col = "({0}: Zeile {1} Spalte {2})" +src-line-col = "({0}: Zeile {1}, Spalte {2})" err-zero-or-negative = "Wert muss größer als Null sein." err-empty-path = "Der Dateipfad darf nicht leer oder NULL sein." @@ -42,6 +42,7 @@ err-compiler-bad-sylrange-value = "Silbenbereichswert muss Ganzzahl sein." err-compiler-incomplete-escape = "Unvollständige Escapesequenz gefunden." err-compiler-multiple-subtypes = "Mehrere Subtypen in Anfrage gefunden." err-compiler-nonexistent-overload = "Funktion '{0}' hat keine Überladung mit {1} Argument(en)." +err-compiler-replacer-argcount = "Ersetzer erwarten zwei Argumente." err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index e3869f8..4027b0d 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -1,7 +1,7 @@ untitled-package = "Untitled Package" default-package-id = "Package" -src-line-col = "({0}: Ln {1} Col {2})" +src-line-col = "({0}: Ln {1}, Col {2})" err-zero-or-negative = "Value must be greater than zero." err-empty-path = "File path cannot be null or empty." @@ -42,6 +42,7 @@ err-compiler-bad-sylrange-value = "Syllable range values can only be integers." err-compiler-incomplete-escape = "Incomplete escape sequence." err-compiler-multiple-subtypes = "Too many subtypes in query. Only one is allowed." err-compiler-nonexistent-overload = "Function '{0}' has no overload that takes {1} argument(s)." +err-compiler-replacer-argcount = "Replacers require exactly two arguments." err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" diff --git a/Rant/RantCompilerException.cs b/Rant/RantCompilerException.cs index bb1fa65..9e75b34 100644 --- a/Rant/RantCompilerException.cs +++ b/Rant/RantCompilerException.cs @@ -26,10 +26,16 @@ public sealed class RantCompilerException : Exception /// public bool InternalError { get; } + /// + /// Gets the number of errors returned by the compiler. + /// + public int ErrorCount { get; } + internal RantCompilerException(string sourceName, List errorList) : base(GenerateErrorString(errorList)) { _errorList = errorList; + ErrorCount = _errorList.Count; SourceName = sourceName; InternalError = false; } @@ -38,6 +44,7 @@ internal RantCompilerException(string sourceName, List erro : base(GenerateErrorStringWithInnerEx(errorList, innerException), innerException) { _errorList = errorList; + ErrorCount = _errorList.Count; SourceName = sourceName; InternalError = true; } @@ -48,9 +55,10 @@ private static string GenerateErrorString(List list) if (list.Count > 1) { writer.AppendLine(GetString("compiler-errors-found", list.Count)); - foreach (var error in list) + for (int i = 0; i < list.Count; i++) { - writer.Append('\t'); + var error = list[i]; + writer.Append($" {i + 1}. "); writer.AppendLine(error.ToString()); } } @@ -72,16 +80,17 @@ private static string GenerateErrorStringWithInnerEx(List l if (list.Count > 1) { writer.AppendLine(GetString("compiler-errors-also-found", list.Count)); - foreach (var error in list) + for (int i = 0; i < list.Count; i++) { - writer.Append('\t'); + var error = list[i]; + writer.Append($" {i + 1}. "); writer.AppendLine(error.ToString()); } } else { writer.AppendLine(GetString("compiler-error-also-found")); - writer.Append('\t'); + writer.Append(" "); writer.AppendLine(list.First().ToString()); } } From 1269b6567e0d0901a3e66846767b4b6e39d349b1 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 22 Aug 2016 12:24:30 -0500 Subject: [PATCH 048/213] Compiler and localization fixes --- Rant/Core/Compiler/Parsing/QueryParser.cs | 37 ++++++++++------- Rant/Core/Compiler/Parsing/SequenceParser.cs | 6 +-- Rant/Core/Compiler/Parsing/TagParser.cs | 41 +++++++++++-------- Rant/Core/Compiler/RantCompiler.cs | 1 - Rant/Core/Compiler/TokenReader.cs | 14 +++---- .../Framework/RantFunctionRegistry.Loader.cs | 1 + Rant/Localization/de-DE.lang | 16 ++++++-- Rant/Localization/en-US.lang | 14 +++++-- Rant/RantCompilerException.cs | 4 +- 9 files changed, 81 insertions(+), 53 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 8876aa2..a6f6893 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -13,9 +13,9 @@ internal class QueryParser : Parser { public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { - var tableName = reader.ReadLoose(R.Text, "query table name"); + var tableName = reader.ReadLoose(R.Text, "acc-table-name"); var query = new Query(); - query.Name = tableName.Value; + query.Name = tableName?.Value; query.ClassFilter = new ClassFilter(); query.RegexFilters = new List<_>(); query.Carrier = new Carrier(); @@ -66,7 +66,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext blacklist = true; reader.ReadToken(); } - var classFilterName = reader.Read(R.Text, "class filter rule"); + var classFilterName = reader.Read(R.Text, "acc-class-filter-rule"); var rule = new ClassFilterRule(classFilterName.Value, !blacklist); query.ClassFilter.AddRule(rule); } @@ -132,7 +132,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext else if (reader.PeekLooseToken().ID == R.Hyphen) { reader.ReadLooseToken(); - var secondNumberToken = reader.ReadLoose(R.Text, "syllable range value"); + var secondNumberToken = reader.ReadLoose(R.Text, "acc-syllable-range-value"); int secondNumber; if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) { @@ -148,10 +148,12 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // (something else) else { - compiler.SyntaxError(reader.PeekLooseToken(), false, "err-compiler-unknown-sylrange-token"); + var errorToken = reader.ReadLooseToken(); + compiler.SyntaxError(errorToken, false, "err-compiler-unknown-sylrange-token", errorToken.Value); + reader.TakeAllWhile(t => !reader.IsNext(R.RightParen)); } - reader.ReadLoose(R.RightParen, "syllable range end"); + reader.ReadLoose(R.RightParen); break; // read carriers @@ -180,7 +182,8 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); } - actionCallback(new RstQuery(query, tableName)); + if (tableName != null) + actionCallback(new RstQuery(query, tableName)); } private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler compiler) @@ -194,8 +197,9 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp // match carrier case R.Equal: { - var name = reader.Read(R.Text, "carrier name"); - carrier.AddComponent(CarrierComponent.Match, name.Value); + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name != null) + carrier.AddComponent(CarrierComponent.Match, name.Value); } break; @@ -246,8 +250,9 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp reader.ReadToken(); } - var name = reader.Read(R.Text, "carrier name"); - carrier.AddComponent(carrierType, name.Value); + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name != null) + carrier.AddComponent(carrierType, name.Value); } break; @@ -262,16 +267,18 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp reader.ReadToken(); } - var name = reader.Read(R.Text, "carrier name"); - carrier.AddComponent(carrierType, name.Value); + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name != null) + carrier.AddComponent(carrierType, name.Value); } break; // rhyming case R.Ampersand: { - var name = reader.Read(R.Text, "carrier name"); - carrier.AddComponent(CarrierComponent.Rhyme, name.Value); + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name != null) + carrier.AddComponent(CarrierComponent.Rhyme, name.Value); } break; diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index df40780..2e6bad6 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -44,7 +44,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.LeaveContext(); yield break; } - compiler.SyntaxError(token, false, "err-compiler-unexpected-block-end"); + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); break; // end of argument @@ -67,11 +67,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.LeaveContext(); yield break; } - compiler.SyntaxError(token, false, "err-compiler-unexpected-tag-end"); + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); break; case R.RightAngle: - compiler.SyntaxError(token, false, "err-compiler-unexpected-query-end"); + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); break; // the end of a block weight, maybe diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index 373df1a..0ecb1fe 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -67,7 +67,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) { - var functionName = reader.Read(R.Text, "function name"); + var functionName = reader.Read(R.Text, "acc-function-name"); var arguments = new List(); @@ -85,23 +85,29 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext } else { - reader.Read(R.RightSquare, "function tag end"); + reader.Read(R.RightSquare); } - if (!RantFunctionRegistry.FunctionExists(functionName.Value)) - { - compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-function", functionName.Value); - yield break; - } + RantFunctionSignature sig = null; - var sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count); - if (sig == null) + if (functionName != null) { - compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-overload", functionName.Value, arguments.Count); - yield break; + if (!RantFunctionRegistry.FunctionExists(functionName.Value)) + { + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-function", functionName.Value); + yield break; + } + + if ((sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count)) == null) + { + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-overload", functionName?.Value, arguments.Count); + yield break; + } + + actionCallback(new RstFunction(functionName, sig, arguments)); } - actionCallback(new RstFunction(functionName, sig, arguments)); + } private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, Action actionCallback) @@ -116,9 +122,11 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex inModule = true; compiler.HasModule = true; } - var subroutineName = reader.ReadLoose(R.Text, "subroutine name"); - var subroutine = new RstDefineSubroutine(subroutineName); - subroutine.Parameters = new Dictionary(); + var subroutineName = reader.ReadLoose(R.Text, "acc-subroutine-name"); + var subroutine = new RstDefineSubroutine(subroutineName) + { + Parameters = new Dictionary() + }; if (reader.PeekLooseToken().ID == R.Colon) { @@ -136,7 +144,8 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex } while (reader.TakeLoose(R.Semicolon, false)); } - reader.ReadLoose(R.RightSquare, "end of subroutine definition arguments"); + reader.ReadLoose(R.RightSquare); + var bodyStart = reader.ReadLoose(R.Colon); var actions = new List(); diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 7a52442..6affb00 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -4,7 +4,6 @@ using Rant.Core.Compiler.Parsing; using Rant.Core.Compiler.Syntax; -using Rant.Core.Framework; using Rant.Core.Stringes; using Rant.Resources; diff --git a/Rant/Core/Compiler/TokenReader.cs b/Rant/Core/Compiler/TokenReader.cs index 37c93bc..23b7b12 100644 --- a/Rant/Core/Compiler/TokenReader.cs +++ b/Rant/Core/Compiler/TokenReader.cs @@ -317,12 +317,12 @@ public Token Read(R type, string expectedTokenName = null) { if (End) { - _compiler.SyntaxError(null, true, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + _compiler.SyntaxError(null, true, "err-compiler-missing-token-eof", expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.Rules.GetSymbolForId(type)); return null; } if (_tokens[_pos].ID != type) { - _compiler.SyntaxError(_tokens[_pos], true, $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + _compiler.SyntaxError(_tokens[_pos], false, "err-compiler-missing-token", expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.Rules.GetSymbolForId(type)); return null; } return _tokens[_pos++]; @@ -339,13 +339,13 @@ public Token ReadAny(params R[] types) if (End) { _compiler.SyntaxError(null, true, - $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}, but hit end of file."); + "err-compiler-missing-token-any-eof", String.Join(" ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())); return null; } if (!types.Contains(_tokens[_pos].ID)) // NOTE: .Contains isn't too fast but does it matter in this case? { - _compiler.SyntaxError(_tokens[_pos], true, $"Expected any from {{{String.Join(", ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())}}}."); + _compiler.SyntaxError(_tokens[_pos], false, "err-compiler-missing-token-any", String.Join(" ", types.Select(t => RantLexer.Rules.GetSymbolForId(t)).ToArray())); return null; } @@ -363,15 +363,13 @@ public Token ReadLoose(R type, string expectedTokenName = null) { if (End) { - _compiler.SyntaxError(null, true, - $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}, but hit end of file."); + _compiler.SyntaxError(null, true, "err-compiler-missing-token-eof", expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.Rules.GetSymbolForId(type)); return null; } SkipSpace(); if (_tokens[_pos].ID != type) { - _compiler.SyntaxError(_tokens[_pos], true, - $"Expected {(expectedTokenName ?? "'" + RantLexer.Rules.GetSymbolForId(type) + "'")}"); + _compiler.SyntaxError(_tokens[_pos], false, "err-compiler-missing-token", expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.Rules.GetSymbolForId(type)); return null; } var t = _tokens[_pos++]; diff --git a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs index ebc2726..90a541e 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs @@ -84,6 +84,7 @@ public static string GetFunctionDescription(string funcName, int paramc) => public static RantFunction GetFunctionGroup(string name) { + if (name == null) return null; RantFunction group; return !FunctionTable.TryGetValue(ResolveAlias(name), out group) ? null : group; } diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 449667a..fc81b21 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -30,7 +30,7 @@ err-unknown-flag = "Unbekannten Flagwert gefunden: '{0}'" compiler-errors-found = "{0} Erstellungsfehler sind aufgetreten:" compiler-errors-also-found = "{0} Erstellungsfehler sind auch aufgetreten:" -compiler-error-also-found = "Einen Erstellungsfehler ist auch aufgetreten:" +compiler-error-also-found = "Ein Erstellungsfehler ist auch aufgetreten:" err-compiler-internal = "Interner Fehler des Typs '{0}' beim Erstellen aufgetreten (siehe InnerException).\n\nFehlermeldung: {1}" err-compiler-eof = "Unerwartetes Dateiende." err-compiler-unexpected-token = "Unerwartetes Token gefunden: '{0}'" @@ -43,12 +43,20 @@ err-compiler-incomplete-escape = "Unvollständige Escapesequenz gefunden." err-compiler-multiple-subtypes = "Mehrere Subtypen in Anfrage gefunden." err-compiler-nonexistent-overload = "Funktion '{0}' hat keine Überladung mit {1} Argument(en)." err-compiler-replacer-argcount = "Ersetzer erwarten zwei Argumente." +err-compiler-missing-token-eof = "{0} erwartet, aber Dateiende gefunden." +err-compiler-missing-token-any = "Eines dieser Tokens erwartet: {0}" +err-compiler-missing-token-any-eof = "Unerwartetes Dateiende. Eines dieser Tokens erwartet: {0}" +err-compiler-unknown-sylrange-token = "Unerwartetes Token in Silbenbereich gefunden: {0}" err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" -token-carrier-name = "Anfragezustandspeichernamen" -token-table-name = "Tabellenamen" -token-class-filter-rule = "Klassenfilterteil" +acc-carrier-name = "Anfragezustandspeichernamen" +acc-table-name = "Tabellenamen" +acc-class-filter-rule = "Klassenfilterteil" +acc-syllable-range-value = "Silbenbereichswert" +acc-function-name = "Funktionnamen" +acc-subroutine-name = "Unterprogrammnamen" +acc-arg-name = "Argumentnamen" missing-table = "[Fehlende Tabelle]" bad-subtype = "[Ungültiger Subtyp]" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 4027b0d..513aaa8 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -43,12 +43,20 @@ err-compiler-incomplete-escape = "Incomplete escape sequence." err-compiler-multiple-subtypes = "Too many subtypes in query. Only one is allowed." err-compiler-nonexistent-overload = "Function '{0}' has no overload that takes {1} argument(s)." err-compiler-replacer-argcount = "Replacers require exactly two arguments." +err-compiler-missing-token-eof = "{0} expected, but reached the end of the file." +err-compiler-missing-token-any = "One of these tokens expected: {0}" +err-compiler-missing-token-any-eof = "Unexpected end-of-file. One of these tokens expected: {0}" +err-compiler-unknown-sylrange-token = "Unexpected token in syllable range: {0}" err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" -token-carrier-name = "carrier name" -token-table-name = "table name" -token-class-filter-rule = "class filter rule" +acc-carrier-name = "carrier name" +acc-table-name = "table name" +acc-class-filter-rule = "class filter rule" +acc-syllable-range-value = "syllable range value" +acc-function-name = "function name" +acc-subroutine-name = "subroutine name" +acc-arg-name = "argument name" missing-table = "[Missing Table]" bad-subtype = "[Bad Subtype]" diff --git a/Rant/RantCompilerException.cs b/Rant/RantCompilerException.cs index 9e75b34..ef28172 100644 --- a/Rant/RantCompilerException.cs +++ b/Rant/RantCompilerException.cs @@ -3,8 +3,6 @@ using System.Linq; using System.Text; -using Rant.Core.Stringes; - using static Rant.Localization.Txtres; namespace Rant @@ -73,7 +71,7 @@ private static string GenerateErrorStringWithInnerEx(List l { var writer = new StringBuilder(); writer.AppendLine(GetString("err-compiler-internal", inner.GetType().Name, inner.Message)); - + if (list != null && list.Any()) { writer.AppendLine(); From b64852a7de10f4f5d7cf82e258a39868c9b7e729 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 22 Aug 2016 18:22:32 -0500 Subject: [PATCH 049/213] Localize block weight messages in compiler --- Rant/Core/Compiler/Parsing/BlockParser.cs | 25 ++++++++++++-------- Rant/Core/Compiler/Parsing/SequenceParser.cs | 1 + Rant/Core/Compiler/RantCompiler.cs | 1 - Rant/Localization/de-DE.lang | 2 ++ Rant/Localization/en-US.lang | 2 ++ 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index a3b72a3..03216ec 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -1,11 +1,8 @@ using System; using System.Collections.Generic; -using System.Text.RegularExpressions; using Rant.Core.Compiler.Syntax; -using Rant.Vocabulary.Querying; -using Rant.Core.Utilities; -using Rant.Core.Framework; +using Rant.Core.Stringes; namespace Rant.Core.Compiler.Parsing { @@ -37,7 +34,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext constantWeights = constantWeights ?? (constantWeights = new List<_>()); dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); - Stringes.Stringe firstToken = reader.ReadLooseToken(); + Stringe firstToken = reader.ReadLooseToken(); // constant weight if (reader.PeekLooseToken().ID == R.Text) @@ -46,9 +43,13 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext double doubleValue; if (!double.TryParse(value, out doubleValue)) { - compiler.SyntaxError(value, false, "invalid constant weight"); + compiler.SyntaxError(value, false, "err-compiler-invalid-constweight"); } - constantWeights.Add(new _(blockNumber, doubleValue)); + else + { + constantWeights.Add(new _(blockNumber, doubleValue)); + } + reader.Read(R.RightParen); } // dynamic weight else @@ -62,12 +63,16 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext yield return Get(); if (weightActions.Count == 0) + { compiler.SyntaxError(firstToken, false, "err-compiler-empty-weight"); - - dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); + } + else + { + dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); + } } - reader.Read(R.RightParen, "end of weight"); + } var startToken = reader.PeekToken(); diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 2e6bad6..617c166 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -78,6 +78,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext case R.RightParen: if (context == CompileContext.BlockWeight) { + reader.SkipSpace(); compiler.LeaveContext(); yield break; } diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 6affb00..09afafd 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -76,7 +76,6 @@ public RST Compile() return new RstSequence(actionList, _source); } - catch (RantCompilerException) { throw; diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index fc81b21..2c3f3b3 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -47,6 +47,8 @@ err-compiler-missing-token-eof = "{0} erwartet, aber Dateiende gefunden." err-compiler-missing-token-any = "Eines dieser Tokens erwartet: {0}" err-compiler-missing-token-any-eof = "Unerwartetes Dateiende. Eines dieser Tokens erwartet: {0}" err-compiler-unknown-sylrange-token = "Unerwartetes Token in Silbenbereich gefunden: {0}" +err-compiler-empty-weight = "Leeres Blockelementgewicht." +err-compiler-invalid-constweight = "Ungültige Gewichtskonstante. Sie muss eine positive Zahl sein." err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 513aaa8..40c92b8 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -47,6 +47,8 @@ err-compiler-missing-token-eof = "{0} expected, but reached the end of the file. err-compiler-missing-token-any = "One of these tokens expected: {0}" err-compiler-missing-token-any-eof = "Unexpected end-of-file. One of these tokens expected: {0}" err-compiler-unknown-sylrange-token = "Unexpected token in syllable range: {0}" +err-compiler-empty-weight = "Empty block weight." +err-compiler-invalid-constweight = "Invalid weight constant." err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" From d5a961633aa6e32cfb5b8516cc5029cbda0cda30 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 23 Aug 2016 14:33:10 -0500 Subject: [PATCH 050/213] Fix dynamic weights --- Rant/Core/Compiler/Parsing/BlockParser.cs | 10 +++------- Rant/Core/Compiler/Syntax/RstBlock.cs | 3 ++- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 03216ec..1b68471 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -19,13 +19,10 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext List<_> dynamicWeights = null; var blockNumber = 0; Action itemCallback = (action) => actions.Add(action); - - compiler.SetNextActionCallback(itemCallback); + compiler.AddContext(CompileContext.BlockEndSequence); compiler.AddContext(CompileContext.BlockSequence); - //reader.SkipSpace(); - while (compiler.NextContext == CompileContext.BlockSequence) { // block weight @@ -57,7 +54,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var weightActions = new List(); Action weightActionCallback = rst => weightActions.Add(rst); - + compiler.SetNextActionCallback(weightActionCallback); compiler.AddContext(CompileContext.BlockWeight); yield return Get(); @@ -71,10 +68,9 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); } } - - } + compiler.SetNextActionCallback(itemCallback); var startToken = reader.PeekToken(); yield return Get(); items.Add(new RstSequence(actions, startToken)); diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index a0a816b..8d1b7b0 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -113,7 +113,8 @@ public override IEnumerator Run(Sandbox sb) } if (next == -1) break; - block.Next(next); + + block.Next(next); // Set next block index sb.Blocks.Pop(); // Don't allow separator to access block state From 6080c3d084ee55265fccb1f8807f9edf57b0d4de Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 23 Aug 2016 15:29:15 -0500 Subject: [PATCH 051/213] Remove unmanaged exports from Rant --- Rant.Console/Rant.Console.csproj | 6 -- Rant.Console/packages.config | 4 -- Rant.Tests/Rant.Tests.csproj | 5 -- Rant.Tests/packages.config | 1 - Rant/Rant.csproj | 12 ---- Rant/Unmanaged/ErrorCode.cs | 14 ---- Rant/Unmanaged/Exports.cs | 93 -------------------------- Rant/Unmanaged/PatternOptions.cs | 15 ----- Rant/Unmanaged/UnmanagedOutput.cs | 29 -------- Rant/Unmanaged/UnmanagedPattern.cs | 29 -------- Rant/Unmanaged/UnmanagedRantContext.cs | 59 ---------------- Rant/packages.config | 4 -- Rave/Rave.csproj | 5 -- Rave/packages.config | 1 - 14 files changed, 277 deletions(-) delete mode 100644 Rant.Console/packages.config delete mode 100644 Rant/Unmanaged/ErrorCode.cs delete mode 100644 Rant/Unmanaged/Exports.cs delete mode 100644 Rant/Unmanaged/PatternOptions.cs delete mode 100644 Rant/Unmanaged/UnmanagedOutput.cs delete mode 100644 Rant/Unmanaged/UnmanagedPattern.cs delete mode 100644 Rant/Unmanaged/UnmanagedRantContext.cs delete mode 100644 Rant/packages.config diff --git a/Rant.Console/Rant.Console.csproj b/Rant.Console/Rant.Console.csproj index a005b7f..f2a3a0e 100644 --- a/Rant.Console/Rant.Console.csproj +++ b/Rant.Console/Rant.Console.csproj @@ -45,10 +45,6 @@ - - ..\packages\UnmanagedExports.1.2.7\lib\net\RGiesecke.DllExport.Metadata.dll - False - @@ -66,7 +62,6 @@ - @@ -75,7 +70,6 @@ - + \ No newline at end of file diff --git a/Rant.Benchmark/Test.cs b/Rant.Benchmark/Test.cs new file mode 100644 index 0000000..46f5a61 --- /dev/null +++ b/Rant.Benchmark/Test.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rant.Benchmark +{ + public class Test : Attribute + { + public string Name; + public string Desc; + } +} diff --git a/Rant.Benchmark/Tests/Query.cs b/Rant.Benchmark/Tests/Query.cs new file mode 100644 index 0000000..3fc7d91 --- /dev/null +++ b/Rant.Benchmark/Tests/Query.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Rant; + +namespace Rant.Benchmark.Tests +{ + public class Query + { + [Test(Name = "Bare Query (10k)")] + public string BareQuery(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}").Main; + } + + [Test(Name = "Query With Class Filter (10k)")] + public string QueryOneClass(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}").Main; + } + + [Test(Name = "Query With Multiple Class Filters (10k)")] + public string QueryMultiClass(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}").Main; + } + + [Test(Name = "Query With Syllable Count Filter (Min) (10k)")] + public string QuerySyllableMin(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}"); + } + + [Test(Name = "Query With Syllable Count Filter (Exact) (10k)")] + public string QuerySyllableExact(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}"); + } + + [Test(Name = "Query With Syllable Count Filter (Max) (10k)")] + public string QuerySyllableMax(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}"); + } + + [Test(Name = "Query With Syllable Count Filter (Range) (10k)")] + public string QuerySyllableRange(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}"); + } + + [Test(Name = "Query With Syllable Count And Class Filter (10k)")] + public string QuerySyllableClassRange(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}"); + } + + [Test(Name = "Negative Class Filter (10k)")] + public string NegativeClassFilter(RantEngine rant) + { + return rant.Do(@"[rs:10k;\s]{}").Main; + } + } +} diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 5ae733d..b3d8407 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -6,6 +6,7 @@ using System.Text; using Rant; +using Rant.Vocabulary; using static System.Console; @@ -15,9 +16,14 @@ namespace RantConsole { internal class Program { +#if !DEBUG public const double PATTERN_TIMEOUT = 10.0; +#else + public const double PATTERN_TIMEOUT = 0.0; +#endif public static readonly string FILE = GetPaths().FirstOrDefault(); public static readonly string PKG_PATH = Property("package"); + public static readonly string LEGACY_DIC_PATH = Property("ldict"); public static readonly long SEED; public static readonly bool USE_SEED; @@ -37,6 +43,16 @@ private static void Main(string[] args) try { #endif + if(!string.IsNullOrEmpty(LEGACY_DIC_PATH)) + { + var tables = + Directory + .GetFiles(LEGACY_DIC_PATH) + .Where(f => Path.GetExtension(f) == ".dic") + .Select(f => RantDictionaryTable.FromLegacyFile(f)); + rant.Dictionary = new RantDictionary(tables); + } + if (!string.IsNullOrEmpty(PKG_PATH)) { #if DEBUG diff --git a/Rant.sln b/Rant.sln index c2603ca..50a316e 100644 --- a/Rant.sln +++ b/Rant.sln @@ -21,6 +21,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{91992F EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rant.Tools", "Rant.Tools\Rant.Tools.csproj", "{409C7DD6-8DEB-4DF9-9D1E-91861B782A35}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rant.Benchmark", "Rant.Benchmark\Rant.Benchmark.csproj", "{3DA28B64-BD56-4F33-9249-33C1ACB499DA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -133,6 +135,30 @@ Global {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|x64.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|x86.ActiveCfg = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|x86.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|x64.ActiveCfg = Debug|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|x64.Build.0 = Debug|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|x86.Build.0 = Debug|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Install|Any CPU.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Install|Any CPU.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Install|x64.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Install|x64.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Install|x86.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Install|x86.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|Any CPU.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|x64.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|x64.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|x86.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|x86.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|Any CPU.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|Any CPU.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x64.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x64.Build.0 = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x86.ActiveCfg = Release|Any CPU + {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 21995b5..1bc0ee7 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -259,6 +259,9 @@ + + + @@ -268,6 +271,7 @@ + diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs new file mode 100644 index 0000000..f711e24 --- /dev/null +++ b/Rant/Vocabulary/ClassTree.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rant.Vocabulary +{ + public class ClassTree + { + public ClassTreeNode RootNode; + + public ClassTree(IEnumerable entries) + { + RootNode = new ClassTreeNode() { + Name = "root", + Classes = new string [] { }, + Entries = entries.Where(e => !e.HasClasses).ToList() + }; + + var rootClasses = OrderClasses(new string[] { }, entries); + foreach(var className in rootClasses) + { + var node = new ClassTreeNode() { Name = className, Classes = new string[] { className } }; + + PopulateNode(node, entries.Where(e => e.ContainsClass(className))); + CountNode(node); + + RootNode.ChildNodes[className] = node; + } + } + + public IEnumerable Query(IEnumerable classes) + { + return QueryNode(RootNode, new HashSet(classes)); + } + + private IEnumerable QueryNode(ClassTreeNode node, HashSet classes) + { + // find the largest class + var largestClass = RootNode.ChildNodes + .Where(kv => classes.Contains(kv.Key)) + .OrderByDescending(kv => kv.Value.Count) + .Select(kv => kv.Value) + .FirstOrDefault(); + + if(largestClass == default(ClassTreeNode)) + { + return node.Entries; + } + + return QueryNode(largestClass, new HashSet(classes.Where(c => c != largestClass.Name))); + } + + private void PopulateNode(ClassTreeNode node, IEnumerable entries) + { + node.Entries = entries.Where(e => e.ClassCount == node.Classes.Length).ToList(); + if(node.Entries.Count == entries.Count()) return; + + var otherEntries = entries.Where(e => e.ClassCount > node.Classes.Length); + var classes = OrderClasses(node.Classes, otherEntries); + + foreach(var className in classes) + { + var childNode = new ClassTreeNode() { Name = className, Classes = node.Classes.Concat(new string[] { className }).ToArray() }; + + PopulateNode(childNode, otherEntries.Where(e => e.ContainsClass(className))); + CountNode(node); + + node.ChildNodes[className] = childNode; + } + } + + private int CountNode(ClassTreeNode node) + { + var count = node.Entries.Count; + + foreach(var child in node.ChildNodes.Values) + { + count += CountNode(child); + } + + node.Count = count; + return count; + } + + private IEnumerable OrderClasses(string[] ignoreClasses, IEnumerable entries) + { + var classCounts = new Dictionary(); + + foreach(var entry in entries) + { + foreach(var c in entry.GetClasses()) + { + if(ignoreClasses.Contains(c)) continue; + + classCounts[c] = (classCounts.ContainsKey(c) ? classCounts[c] + 1 : 1); + } + } + + return classCounts.OrderByDescending(kv => kv.Value).Select(kv => kv.Key); + } + } + + public class ClassTreeNode + { + public string Name; + public string[] Classes; + public int Count = 0; + public Dictionary ChildNodes = new Dictionary(); + public List Entries = new List(); + } +} diff --git a/Rant/Vocabulary/Legacy/DicLexer.cs b/Rant/Vocabulary/Legacy/DicLexer.cs new file mode 100644 index 0000000..4d49f51 --- /dev/null +++ b/Rant/Vocabulary/Legacy/DicLexer.cs @@ -0,0 +1,105 @@ +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Text; + +using Rant.Core.Compiler; + +namespace Rant.Vocabulary +{ + internal static class DicLexer + { + public static IEnumerable Tokenize(string source, string data) + { + var reader = new StringReader(data); + string currentLine; + char firstChar; + int lineNumber = 1; + + while(reader.Peek() >= 0) + { + lineNumber++; + + currentLine = reader.ReadLine().Trim(); + if(string.IsNullOrWhiteSpace(currentLine)) continue; + firstChar = currentLine[0]; + + switch(firstChar) + { + case '#': + yield return new DicToken(DicTokenType.Directive, lineNumber, currentLine.Substring(1).Trim()); + break; + case '@': + break; + case '>': + { + currentLine = currentLine.Substring(1); + + bool diffmark = false; + if(currentLine[0] == '>') + { + diffmark = true; + currentLine = currentLine.Substring(1); + } + + yield return new DicToken(diffmark ? DicTokenType.DiffEntry : DicTokenType.Entry, lineNumber, currentLine.Trim()); + break; + } + case '|': + yield return new DicToken(DicTokenType.Property, lineNumber, currentLine.Substring(1).Trim()); + break; + default: + throw new InvalidDataException($"{source}: (Line {lineNumber}, Col 1) Unexpected token: '{firstChar}'."); + } + } + + yield return new DicToken(DicTokenType.EOF, lineNumber, null); + } + } + + internal enum DicTokenType + { + Directive, + Entry, + DiffEntry, + Property, + Ignore, + EOF + } + + internal struct DicToken + { + public static readonly DicToken None = new DicToken(DicTokenType.Ignore, 1, null); + public DicTokenType Type; + public string Value; + public int Line; + + public DicToken(DicTokenType type, int line, string value) + { + Type = type; + Value = value; + Line = line; + } + + public DicToken(DicTokenType type, int line, char value) + { + Type = type; + Value = value.ToString(CultureInfo.InvariantCulture); + Line = line; + } + + public static implicit operator string(DicToken token) + { + return token.Value; + } + + public static implicit operator DicToken(string data) + { + return new DicToken(DicTokenType.Ignore, 1, data); + } + + public int Length => Value?.Length ?? 0; + } +} \ No newline at end of file diff --git a/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs b/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs new file mode 100644 index 0000000..d4a787b --- /dev/null +++ b/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs @@ -0,0 +1,289 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +using Rant.Core.Utilities; +using Rant.Vocabulary.Utilities; + +namespace Rant.Vocabulary +{ + public sealed partial class RantDictionaryTable + { + /// + /// Loads a RantDictionary from the file at the specified path. + /// + /// The path to the file to load. + /// + public static RantDictionaryTable FromLegacyFile(string path) + { + var name = ""; + string[] subtypes = { "default" }; + bool header = true; + + var scopedClassSet = new HashSet(); + RantDictionaryEntry entry = null; + var entries = new List(); + var entryStringes = new List(); + var types = new Dictionary(); + var hiddenClasses = new HashSet { "nsfw" }; + + foreach(var token in DicLexer.Tokenize(path, File.ReadAllText(path))) + { + switch(token.Type) + { + case DicTokenType.Directive: + { + var parts = VocabUtils.GetArgs(token.Value).ToArray(); + if(!parts.Any()) continue; + var dirName = parts.First().ToLower(); + var args = parts.Skip(1).ToArray(); + + switch(dirName) + { + case "name": + if(!header) LoadError(path, token, "The #name directive may only be used in the file header."); + if(args.Length != 1) LoadError(path, token, "#name directive expected one word:\r\n\r\n" + token.Value); + if(!Util.ValidateName(args[0])) LoadError(path, token, $"Invalid #name value: '{args[1]}'"); + name = args[0].ToLower(); + break; + case "subs": + if(!header) LoadError(path, token, "The #subs directive may only be used in the file header."); + subtypes = args.Select(s => s.Trim().ToLower()).ToArray(); + break; + case "version": // Kept here for backwards-compatability + if(!header) LoadError(path, token, "The #version directive may only be used in the file header."); + break; + case "hidden": + if(!header) LoadError(path, token, "The #hidden directive may only be used in the file header."); + if(Util.ValidateName(args[0])) hiddenClasses.Add(args[0]); + break; + // Deprecated, remove in Rant 3 + case "nsfw": + scopedClassSet.Add("nsfw"); + break; + // Deprecated, remove in Rant 3 + case "sfw": + scopedClassSet.Remove("nsfw"); + break; + case "class": + { + if(args.Length < 2) LoadError(path, token, "The #class directive expects an operation and at least one value."); + switch(args[0].ToLower()) + { + case "add": + foreach(var cl in args.Skip(1)) + scopedClassSet.Add(cl.ToLower()); + break; + case "remove": + foreach(var cl in args.Skip(1)) + scopedClassSet.Remove(cl.ToLower()); + break; + } + } + break; + case "type": + { + if(!header) LoadError(path, token, "The #type directive may only be used in the file header."); + if(args.Length != 3) LoadError(path, token, "#type directive requires 3 arguments."); + types.Add(args[0], new EntryTypeDef(args[0], args[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), + Util.IsNullOrWhiteSpace(args[2]) ? null : new EntryTypeDefFilter(args[2]))); + } + break; + } + } + break; + case DicTokenType.Entry: + { + if(Util.IsNullOrWhiteSpace(name)) + LoadError(path, token, "Missing table name before entry list."); + if(Util.IsNullOrWhiteSpace(token.Value)) + LoadError(path, token, "Encountered empty entry."); + header = false; + entry = new RantDictionaryEntry(token.Value.Split('/').Select(s => s.Trim()).ToArray(), scopedClassSet); + entries.Add(entry); + entryStringes.Add(token); + } + break; + case DicTokenType.DiffEntry: + { + if(Util.IsNullOrWhiteSpace(name)) + LoadError(path, token, "Missing table name before entry list."); + if(Util.IsNullOrWhiteSpace(token.Value)) + LoadError(path, token, "Encountered empty entry."); + header = false; + string first = null; + entry = new RantDictionaryEntry(token.Value.Split('/') + .Select((s, i) => + { + if(i > 0) return Diff.Mark(first, s); + return first = s.Trim(); + }).ToArray(), scopedClassSet); + entries.Add(entry); + entryStringes.Add(token); + } + break; + case DicTokenType.Property: + { + var parts = token.Value.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); + if(!parts.Any()) LoadError(path, token, "Empty property field."); + switch(parts[0].ToLower()) + { + case "class": + { + if(parts.Length < 2) continue; + foreach(var cl in parts[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) + { + bool opt = cl.EndsWith("?"); + entry.AddClass(VocabUtils.GetString(opt ? cl.Substring(0, cl.Length - 1) : cl), opt); + } + } + break; + case "weight": + { + if(parts.Length != 2) LoadError(path, token, "'weight' property expected a value."); + int weight; + if(!Int32.TryParse(parts[1], out weight)) + LoadError(path, token, "Invalid weight value: '" + parts[1] + "'"); + entry.Weight = weight; + } + break; + case "pron": + { + if(parts.Length != 2) LoadError(path, token, "'" + parts[0] + "' property expected a value."); + var pron = + parts[1].Split('/') + .Select(s => s.Trim()) + .ToArray(); + if(subtypes.Length == pron.Length) + { + for(int i = 0; i < entry.TermCount; i++) + entry[i].Pronunciation = pron[i]; + } + } + break; + default: + { + EntryTypeDef typeDef; + if(!types.TryGetValue(parts[0], out typeDef)) + LoadError(path, token, $"Unknown property name '{parts[0]}'."); + // Okay, it's a type. + if(parts.Length != 2) LoadError(path, token, "Missing type value."); + entry.AddClass(VocabUtils.GetString(parts[1])); + if(!typeDef.IsValidValue(parts[1])) + LoadError(path, token, $"'{parts[1]}' is not a valid value for type '{typeDef.Name}'."); + break; + } + } + } + break; + } + } + + if(types.Any()) + { + var eEntries = entries.GetEnumerator(); + var eEntryStringes = entryStringes.GetEnumerator(); + while(eEntries.MoveNext() && eEntryStringes.MoveNext()) + { + foreach(var type in types.Values) + { + if(!type.Test(eEntries.Current)) + { + // TODO: Find a way to output multiple non-fatal table load errors without making a gigantic exception message. + LoadError(path, eEntryStringes.Current, $"Entry '{eEntries.Current}' does not satisfy type '{type.Name}'."); + } + } + } + } + + var table = new RantDictionaryTable(name, subtypes.Length, hiddenClasses); + for(var i = 0; i < subtypes.Length; i++) + { + table.AddSubtype(subtypes[i], i); + } + + for(var i = 0; i < entries.Count; i++) + { + table.AddEntry(entries[i]); + } + + table.Commit(); + + return table; + } + + private static void LoadError(string file, DicToken data, string message) + { + throw new RantLegacyTableLoadException(file, data, message); + } + } + + internal class RantLegacyTableLoadException : Exception + { + public RantLegacyTableLoadException(string file, DicToken data, string message) + : base($"{file}: (Line {data.Line}) {message}") + { + + } + } + + internal class EntryTypeDefFilter + { + private readonly Regex _filterRegex = new Regex(@"!?\w+"); + private readonly _[] _filterParts; + + public EntryTypeDefFilter(string filter) + { + if(filter.Trim() == "*") return; + _filterParts = filter + .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) + .Where(s => _filterRegex.IsMatch(s)) + .Select(s => _.Create(s.TrimStart('!'), s.StartsWith("!"))) + .ToArray(); + } + + private bool DoTest(RantDictionaryEntry entry) + { + return _filterParts == null || _filterParts.All(f => entry.ContainsClass(f.Item1) == f.Item2); + } + + /// + /// Determines whether a type should apply to the specifed entry according to the specified filter. + /// + /// The filter to test with. + /// The entry to test. + /// + public static bool Test(EntryTypeDefFilter filter, RantDictionaryEntry entry) => filter?.DoTest(entry) ?? false; + } + + internal class EntryTypeDef + { + private readonly HashSet _classes; + + public string Name { get; } + + public EntryTypeDefFilter Filter { get; } + + public IEnumerator GetTypeClasses() => _classes.AsEnumerable().GetEnumerator(); + + public EntryTypeDef(string name, IEnumerable classes, EntryTypeDefFilter filter) + { + Name = name; + _classes = new HashSet(); + foreach(var c in classes) _classes.Add(c); + Filter = filter; + } + + public bool IsValidValue(string value) => _classes.Contains(value); + + public bool Test(RantDictionaryEntry entry) + { + if(!EntryTypeDefFilter.Test(Filter, entry)) return true; + return entry.GetClasses().Where(IsValidValue).Count() == 1; + } + } +} diff --git a/Rant/Vocabulary/Querying/ClassFilter.cs b/Rant/Vocabulary/Querying/ClassFilter.cs index 51e1a22..bec11a8 100644 --- a/Rant/Vocabulary/Querying/ClassFilter.cs +++ b/Rant/Vocabulary/Querying/ClassFilter.cs @@ -17,6 +17,13 @@ internal sealed class ClassFilter : Filter /// public bool IsEmpty => _items.Count == 0; + public string[] RequiredClasses => _items.Where(i => i.Length == 1 && i[0].ShouldMatch).Select(i => i[0].Class).ToArray(); + + /// + /// Whether the class filter is simple, i.e. there are no switch rules and every rule should match. + /// + public bool SimpleFilter => _items.All(i => i.Length == 1 && i[0].ShouldMatch); + /// /// Adds a single-class rule to the filter. /// diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index e06f5d8..d073293 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -43,6 +43,16 @@ internal sealed class Query public int FilterCount => _filters.Count; + /// + /// Returns whether the query is a "bare query" - should only return the table itself. + /// + public bool BareQuery => _filters.Count == 0 && !Exclusive && !HasCarrier; + + /// + /// Returns whether the query has a carrier. + /// + public bool HasCarrier => Carrier != null && Carrier.GetTotalCount() != 0; + public void AddFilter(Filter filter) => _filters.Add(filter); public IEnumerable GetFilters() diff --git a/Rant/Vocabulary/RantDictionaryEntry.cs b/Rant/Vocabulary/RantDictionaryEntry.cs index ac35376..746828e 100644 --- a/Rant/Vocabulary/RantDictionaryEntry.cs +++ b/Rant/Vocabulary/RantDictionaryEntry.cs @@ -76,6 +76,16 @@ public RantDictionaryEntry(IEnumerable terms, IEnumerable public int TermCount { get; } + /// + /// Gets the number of classes in the current entry. + /// + public int ClassCount => _classes.Count; + + /// + /// Returns whether or not the entry has classes. + /// + public bool HasClasses => _classes.Any(); + /// /// Gets or sets the term at the specified index. /// diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index abb58ee..603da98 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -274,6 +274,8 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) } } + table.Commit(); + return table; } diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 2dad4d6..f62bfad 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -6,6 +6,7 @@ using Rant.Core.IO.Bson; using Rant.Core.Utilities; using Rant.Resources; +using Rant.Vocabulary.Utilities; using Rant.Vocabulary.Querying; namespace Rant.Vocabulary @@ -22,19 +23,28 @@ public sealed partial class RantDictionaryTable : RantResource private readonly HashSet _hidden = new HashSet(new[] { NSFW }); private readonly Dictionary> _subtypeIndexMap = new Dictionary>(); private readonly Dictionary _subtypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + private ClassTree _classTree = new ClassTree(new RantDictionaryEntry[] { }); + private SyllableBuckets[] _syllableBuckets; /// /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. /// /// The name of the table. /// The number of terms to store in each entry. - public RantDictionaryTable(string name, int termsPerEntry) + public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) { - if (name == null) throw new ArgumentNullException(nameof(name)); - if (termsPerEntry <= 0) throw new ArgumentException("Terms per entry must be greater than zero."); - if (!Util.ValidateName(name)) throw new ArgumentException($"Invalid table name: '{name}'"); + if(name == null) throw new ArgumentNullException(nameof(name)); + if(termsPerEntry <= 0) throw new ArgumentException("Terms per entry must be greater than zero."); + if(!Util.ValidateName(name)) throw new ArgumentException($"Invalid table name: '{name}'"); + if(hidden != null) _hidden = hidden; TermsPerEntry = termsPerEntry; Name = name; + + _syllableBuckets = new SyllableBuckets[termsPerEntry]; + for(var i = 0; i < termsPerEntry; i++) + { + _syllableBuckets[i] = new SyllableBuckets(i, new RantDictionaryEntry[] { }); + } } internal RantDictionaryTable() @@ -73,7 +83,7 @@ internal RantDictionaryTable() /// public IEnumerable GetEntries() { - foreach (var entry in _entriesHash) yield return entry; + foreach(var entry in _entriesHash) yield return entry; } /// @@ -89,7 +99,7 @@ public IEnumerable GetEntries() /// public bool IsClassHidden(string className) { - if (className == null) throw new ArgumentNullException(nameof(className)); + if(className == null) throw new ArgumentNullException(nameof(className)); return _hidden.Contains(className); } @@ -114,9 +124,9 @@ public bool IsClassHidden(string className) /// True if successfully added; otherwise, False. public bool AddEntry(RantDictionaryEntry entry) { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - if (entry.TermCount != TermsPerEntry) return false; - if (!_entriesHash.Add(entry)) return false; + if(entry == null) throw new ArgumentNullException(nameof(entry)); + if(entry.TermCount != TermsPerEntry) return false; + if(!_entriesHash.Add(entry)) return false; _entriesList.Add(entry); return true; } @@ -128,8 +138,8 @@ public bool AddEntry(RantDictionaryEntry entry) /// True if successfully removed; otherwise, False. public bool RemoveEntry(RantDictionaryEntry entry) { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - if (!_entriesHash.Remove(entry)) return false; + if(entry == null) throw new ArgumentNullException(nameof(entry)); + if(!_entriesHash.Remove(entry)) return false; _entriesList.Remove(entry); return true; } @@ -141,7 +151,7 @@ public bool RemoveEntry(RantDictionaryEntry entry) /// True if found, False if not. public bool ContainsEntry(RantDictionaryEntry entry) { - if (entry == null) throw new ArgumentNullException(nameof(entry)); + if(entry == null) throw new ArgumentNullException(nameof(entry)); return _entriesHash.Contains(entry); } @@ -153,9 +163,9 @@ public IEnumerable GetClasses() { var lstClasses = new HashSet(); - foreach (string c in _entriesHash.SelectMany(e => e.GetClasses())) + foreach(string c in _entriesHash.SelectMany(e => e.GetClasses())) { - if (lstClasses.Add(c)) yield return c; + if(lstClasses.Add(c)) yield return c; } } @@ -173,12 +183,12 @@ public IEnumerable GetClasses() /// public bool AddSubtype(string subtypeName, int index) { - if (index < 0 || index >= TermsPerEntry) return false; - if (subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); - if (!Util.ValidateName(subtypeName)) return false; + if(index < 0 || index >= TermsPerEntry) return false; + if(subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); + if(!Util.ValidateName(subtypeName)) return false; _subtypes[subtypeName] = index; HashSet subs; - if (!_subtypeIndexMap.TryGetValue(index, out subs)) + if(!_subtypeIndexMap.TryGetValue(index, out subs)) { _subtypeIndexMap[index] = subs = new HashSet(); } @@ -194,10 +204,10 @@ public bool AddSubtype(string subtypeName, int index) /// TRUE if the subtype was found and removed. FALSE if the subtype was not found. public bool RemoveSubtype(string subtypeName) { - if (Util.IsNullOrWhiteSpace(subtypeName)) return false; - if (!_subtypes.ContainsKey(subtypeName)) return false; + if(Util.IsNullOrWhiteSpace(subtypeName)) return false; + if(!_subtypes.ContainsKey(subtypeName)) return false; HashSet subs; - if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out subs)) + if(_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out subs)) { return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); } @@ -213,10 +223,10 @@ public bool RemoveSubtype(string subtypeName) /// public int GetSubtypeIndex(string subtype) { - if (Util.IsNullOrWhiteSpace(subtype)) return 0; - if (!Util.ValidateName(subtype)) return -1; + if(Util.IsNullOrWhiteSpace(subtype)) return 0; + if(!Util.ValidateName(subtype)) return -1; int index; - if (int.TryParse(subtype, out index) && index >= 0) return index; + if(int.TryParse(subtype, out index) && index >= 0) return index; return _subtypes.TryGetValue(subtype, out index) ? index : -1; } @@ -227,10 +237,10 @@ public int GetSubtypeIndex(string subtype) /// public IEnumerable GetSubtypesForIndex(int index) { - if (index < 0 || index >= TermsPerEntry) yield break; + if(index < 0 || index >= TermsPerEntry) yield break; HashSet subs; - if (!_subtypeIndexMap.TryGetValue(index, out subs)) yield break; - foreach (string sub in subs) yield return sub; + if(!_subtypeIndexMap.TryGetValue(index, out subs)) yield break; + foreach(string sub in subs) yield return sub; } /// @@ -240,28 +250,83 @@ public IEnumerable GetSubtypesForIndex(int index) /// True if merge succeeded; otherwise, False. public bool Merge(RantDictionaryTable other) { - if (other.Name != Name || other == this) return false; - if (other.TermsPerEntry != TermsPerEntry) return false; + if(other.Name != Name || other == this) return false; + if(other.TermsPerEntry != TermsPerEntry) return false; _entriesHash.AddRange(other._entriesHash); _entriesList.AddRange(other._entriesHash); return true; } + /// + /// Optimizes the table. Call this after writing items to the table or removing items from a table. + /// If you're writing or removing multiple items, call this after all the actions have been performed. + /// + public void Commit() + { + _classTree = new ClassTree(_entriesHash); + for(var i = 0; i < TermsPerEntry; i++) + { + _syllableBuckets[i] = new SyllableBuckets(i, _entriesList); + } + } + internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) { - int index = sb.TakePlural() - ? string.IsNullOrEmpty(query.PluralSubtype) + int index = sb.TakePlural() + ? string.IsNullOrEmpty(query.PluralSubtype) ? GetSubtypeIndex(query.Subtype) : GetSubtypeIndex(query.PluralSubtype) : GetSubtypeIndex(query.Subtype); - if (index == -1) return null; + if(index == -1) return null; + + if(query.BareQuery) return _entriesList.PickEntry(sb.RNG)?[index]; + + // process simple class filters using class tree + var filters = query.GetFilters(); + var classes = filters + .Where(f => f is ClassFilter) + .SelectMany(f => (f as ClassFilter).RequiredClasses); - var pool = _entriesHash.Where((e, i) => query.GetFilters().OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, i, query))); + filters = filters.Where(f => !(f is ClassFilter) || !(f as ClassFilter).SimpleFilter); - if (!pool.Any()) return null; + IEnumerable pool = _entriesList; + if(classes.Any()) + { + pool = _classTree.Query(classes); + } - return syncState.GetEntry(query.Carrier, index, pool, sb.RNG)?[index]; + // if it's just the class filters, let's leave now + if(!filters.Any() && !query.HasCarrier) + { + return pool.ToList().PickEntry(sb.RNG)?[index]; + } + + // process syllable count filters using syllable buckets + var rangeFilters = filters.Where(f => f is RangeFilter).Select(f => f as RangeFilter); + if(rangeFilters.Any()) + { + foreach(var filter in rangeFilters) + { + pool = pool.Intersect(_syllableBuckets[index].Query(filter)); + } + + filters = filters.Where(f => !(f is RangeFilter)); + } + + if(filters.Any()) + { + pool = pool.Where((e, i) => filters.OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, index, query))); + } + + if(!pool.Any()) return null; + + if(query.HasCarrier) + { + return syncState.GetEntry(query.Carrier, index, pool, sb.RNG)?[index]; + } + + return pool.PickEntry(sb.RNG)?[index]; } internal override void DeserializeData(BsonItem data) @@ -274,9 +339,9 @@ internal override void DeserializeData(BsonItem data) // Subtypes var subs = data["subs"].Values; int si = 0; - foreach (var subList in subs) + foreach(var subList in subs) { - foreach (var sub in subList.Values) + foreach(var sub in subList.Values) { AddSubtype(sub, si); } @@ -284,13 +349,13 @@ internal override void DeserializeData(BsonItem data) } // Hidden classes - foreach (var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); + foreach(var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); var entries = data["entries"]; int count = entries.Count; // Entries - for (int i = 0; i < count; i++) + for(int i = 0; i < count; i++) { var entryData = entries[i]; @@ -308,20 +373,22 @@ from BsonItem termData in entryData["terms"].Values var entry = new RantDictionaryEntry(termArray, entryClasses, entryData["weight"] ?? 1); // Optional classes - foreach (var optionalClass in entryData["optional-classes"].Values) + foreach(var optionalClass in entryData["optional-classes"].Values) { entry.AddClass(optionalClass, true); } // Metadata var meta = entryData["metadata"]; - foreach (string metaKey in meta.Keys) + foreach(string metaKey in meta.Keys) { entry.SetMetadata(metaKey, meta[metaKey].Value); } AddEntry(entry); } + + Commit(); } internal override BsonItem SerializeData() @@ -334,7 +401,7 @@ internal override BsonItem SerializeData() }; var subs = new BsonItem[TermsPerEntry]; - for (int i = 0; i < TermsPerEntry; i++) + for(int i = 0; i < TermsPerEntry; i++) { subs[i] = new BsonItem(GetSubtypesForIndex(i).ToArray()); } @@ -343,12 +410,12 @@ internal override BsonItem SerializeData() data["hidden-classes"] = new BsonItem(_hidden.ToArray()); var entries = new BsonItem[_entriesList.Count]; - for (int i = 0; i < _entriesList.Count; i++) + for(int i = 0; i < _entriesList.Count; i++) { var entry = _entriesList[i]; var entryData = new BsonItem(); var termData = new BsonItem[TermsPerEntry]; - for (int j = 0; j < TermsPerEntry; j++) + for(int j = 0; j < TermsPerEntry; j++) { termData[j] = new BsonItem { @@ -364,7 +431,7 @@ internal override BsonItem SerializeData() entryData["optional-classes"] = new BsonItem(entry.GetOptionalClasses().ToArray()); var metaData = new BsonItem(); - foreach (string metaKey in entry.GetMetadataKeys()) + foreach(string metaKey in entry.GetMetadataKeys()) { metaData[metaKey] = new BsonItem(entry.GetMetadata(metaKey)); } diff --git a/Rant/Vocabulary/SyllableBuckets.cs b/Rant/Vocabulary/SyllableBuckets.cs new file mode 100644 index 0000000..0dea270 --- /dev/null +++ b/Rant/Vocabulary/SyllableBuckets.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Rant.Vocabulary.Querying; + +namespace Rant.Vocabulary +{ + internal class SyllableBuckets + { + private readonly Dictionary> _buckets = new Dictionary>(); + + public SyllableBuckets(int termIndex, IEnumerable entries) + { + foreach(var entry in entries) + { + var syllableCount = entry[termIndex].SyllableCount; + if(syllableCount == 0) continue; + + if(!_buckets.ContainsKey(syllableCount)) + { + _buckets[syllableCount] = new List(); + } + + _buckets[syllableCount].Add(entry); + } + } + + public List Query(RangeFilter filter) + { + var min = (filter.Minimum == null ? 1 : (int)filter.Minimum); + var max = (filter.Maximum == null ? min : (int)filter.Maximum); + + // go through twice, first to find out the size to allocate + var size = 0; + for(var i = min; i <= max; i++) + { + size += _buckets[i].Count; + } + + var list = new List(size); + for(var i = min; i <= max; i++) + { + list.AddRange(_buckets[i]); + } + + return list; + } + } +} diff --git a/Rant/Vocabulary/Utilities/VocabUtils.cs b/Rant/Vocabulary/Utilities/VocabUtils.cs index 37b63a0..138474f 100644 --- a/Rant/Vocabulary/Utilities/VocabUtils.cs +++ b/Rant/Vocabulary/Utilities/VocabUtils.cs @@ -8,6 +8,10 @@ internal static class VocabUtils { private static readonly Dictionary StringCache = new Dictionary(); + public static RantDictionaryEntry PickEntry(this List hash, RNG rng) + { + return hash.Any() ? hash[rng.Next(hash.Count)] : null; + } public static RantDictionaryEntry PickEntry(this IEnumerable enumerable, RNG rng) { var array = enumerable as RantDictionaryEntry[] ?? enumerable.ToArray(); From 305363cf3c94454046c71c66652a7268d9de1a85 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 28 Feb 2017 10:32:36 -0600 Subject: [PATCH 106/213] Add license header to main source files --- Rant/Core/Compiler/CompileContext.cs | 27 +- Rant/Core/Compiler/LineCol.cs | 27 +- Rant/Core/Compiler/Parsing/BlockParser.cs | 35 +- Rant/Core/Compiler/Parsing/Parser.cs | 29 +- Rant/Core/Compiler/Parsing/QueryParser.cs | 47 +- Rant/Core/Compiler/Parsing/SequenceParser.cs | 35 +- Rant/Core/Compiler/Parsing/TagParser.cs | 45 +- Rant/Core/Compiler/R.cs | 27 +- Rant/Core/Compiler/RantCompiler.cs | 27 +- Rant/Core/Compiler/RantLexer.cs | 29 +- .../Compiler/Syntax/DeserializeRequest.cs | 27 +- Rant/Core/Compiler/Syntax/RST.cs | 29 +- Rant/Core/Compiler/Syntax/RSTAttribute.cs | 27 +- Rant/Core/Compiler/Syntax/RstBlock.cs | 42 +- .../Core/Compiler/Syntax/RstCallSubroutine.cs | 37 +- .../Compiler/Syntax/RstDefineSubroutine.cs | 27 +- Rant/Core/Compiler/Syntax/RstEscape.cs | 145 +++--- Rant/Core/Compiler/Syntax/RstFunction.cs | 31 +- Rant/Core/Compiler/Syntax/RstQuery.cs | 33 +- Rant/Core/Compiler/Syntax/RstReplacer.cs | 27 +- Rant/Core/Compiler/Syntax/RstSequence.cs | 27 +- .../Core/Compiler/Syntax/RstSubroutineBase.cs | 27 +- Rant/Core/Compiler/Syntax/RstText.cs | 27 +- Rant/Core/Compiler/Token.cs | 27 +- Rant/Core/Compiler/TokenReader.cs | 33 +- Rant/Core/Constructs/AttribPersistence.cs | 27 +- Rant/Core/Constructs/BlockAttribs.cs | 29 +- Rant/Core/Constructs/BlockManager.cs | 27 +- Rant/Core/Constructs/BlockState.cs | 27 +- Rant/Core/Constructs/Comparison.cs | 27 +- Rant/Core/Constructs/SyncManager.cs | 33 +- Rant/Core/Constructs/SyncType.cs | 27 +- Rant/Core/Constructs/Synchronizer.cs | 33 +- Rant/Core/Formatting/Accent.cs | 27 +- Rant/Core/Formatting/Capitalization.cs | 27 +- Rant/Core/Formatting/Emoji.cs | 27 +- Rant/Core/Formatting/Endianness.cs | 27 +- Rant/Core/Formatting/HexFormat.cs | 27 +- Rant/Core/Formatting/NumberFormat.cs | 27 +- Rant/Core/Formatting/NumberFormatter.cs | 45 +- Rant/Core/Formatting/Numerals.cs | 37 +- Rant/Core/Formatting/Unicode.cs | 132 +++--- Rant/Core/Framework/RantFunction.cs | 27 +- Rant/Core/Framework/RantFunctionParameter.cs | 33 +- .../Framework/RantFunctionParameterType.cs | 27 +- .../Framework/RantFunctionRegistry.Loader.cs | 27 +- Rant/Core/Framework/RantFunctionRegistry.cs | 83 ++-- Rant/Core/Framework/RantFunctionSignature.cs | 47 +- Rant/Core/IO/BitField.cs | 37 +- Rant/Core/IO/Bson/BsonDocument.cs | 27 +- Rant/Core/IO/Bson/BsonItem.cs | 45 +- Rant/Core/IO/Bson/BsonStringTableMode.cs | 27 +- Rant/Core/IO/Compression/CRC.cs | 31 +- Rant/Core/IO/Compression/EasyCompressor.cs | 29 +- Rant/Core/IO/Compression/ICoder.cs | 33 +- Rant/Core/IO/Compression/LZ/IMatchFinder.cs | 25 +- Rant/Core/IO/Compression/LZ/LzBinTree.cs | 77 ++- Rant/Core/IO/Compression/LZ/LzInWindow.cs | 29 +- Rant/Core/IO/Compression/LZ/LzOutWindow.cs | 30 +- Rant/Core/IO/Compression/LZMA/LzmaBase.cs | 31 +- Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs | 173 ++++--- Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs | 121 +++-- .../IO/Compression/RangeCoder/RangeCoder.cs | 35 +- .../Compression/RangeCoder/RangeCoderBit.cs | 41 +- .../RangeCoder/RangeCoderBitTree.cs | 33 +- Rant/Core/IO/EasyReader.cs | 77 ++- Rant/Core/IO/EasyWriter.cs | 59 ++- Rant/Core/IO/Endian.cs | 27 +- Rant/Core/IO/EndiannessAttribute.cs | 27 +- Rant/Core/IO/IOExtensions.cs | 27 +- Rant/Core/IO/IOUtil.cs | 41 +- Rant/Core/ObjectModel/ObjectStack.cs | 35 +- Rant/Core/ObjectModel/ObjectTable.cs | 27 +- Rant/Core/ObjectModel/RantObject.cs | 29 +- Rant/Core/ObjectModel/RantObjectType.cs | 27 +- Rant/Core/Output/ChannelVisibility.cs | 27 +- Rant/Core/Output/OutputChain.cs | 37 +- Rant/Core/Output/OutputChainArticleBuffer.cs | 43 +- Rant/Core/Output/OutputChainBuffer.cs | 45 +- Rant/Core/Output/OutputWriter.cs | 33 +- Rant/Core/Sandbox.cs | 29 +- Rant/Core/Utilities/Extensions.cs | 31 +- Rant/Core/Utilities/Limit.cs | 27 +- Rant/Core/Utilities/Util.cs | 41 +- Rant/Core/Utilities/Witchcraft.cs | 35 +- Rant/Formats/EnglishPluralizer.cs | 29 +- Rant/Formats/Pluralizer.cs | 27 +- Rant/Formats/RantFormat.cs | 35 +- Rant/Localization/Txtres.cs | 31 +- Rant/Metadata/IRantFunction.cs | 27 +- Rant/Metadata/IRantFunctionGroup.cs | 27 +- Rant/Metadata/IRantModeValue.cs | 27 +- Rant/Metadata/IRantParameter.cs | 27 +- Rant/Metadata/RantDescriptionAttribute.cs | 27 +- Rant/Metadata/RantFunctionAttribute.cs | 27 +- Rant/Metadata/RantModeValue.cs | 25 + Rant/Properties/AssemblyInfo.cs | 27 +- Rant/RNG.cs | 29 +- Rant/RantArgAttribute.cs | 27 +- Rant/RantCompilerException.cs | 27 +- Rant/RantCompilerMessage.cs | 27 +- Rant/RantCompilerMessageType.cs | 27 +- Rant/RantEngine.cs | 43 +- Rant/RantInternalException.cs | 27 +- Rant/RantOutput.cs | 31 +- Rant/RantOutputEntry.cs | 27 +- Rant/RantProgram.cs | 27 +- Rant/RantProgramArgs.cs | 31 +- Rant/RantProgramOrigin.cs | 27 +- Rant/RantRuntimeException.cs | 33 +- Rant/RantUtils.cs | 27 +- Rant/Resources/RantDependencyResolver.cs | 31 +- Rant/Resources/RantModule.cs | 31 +- Rant/Resources/RantPackage.cs | 31 +- Rant/Resources/RantPackageDependency.cs | 27 +- Rant/Resources/RantPackageVersion.cs | 29 +- Rant/Resources/RantResource.cs | 27 +- Rant/Tuple.cs | 27 +- Rant/Vocabulary/Querying/Carrier.cs | 33 +- Rant/Vocabulary/Querying/CarrierComponent.cs | 27 +- Rant/Vocabulary/Querying/CarrierState.cs | 43 +- Rant/Vocabulary/Querying/ClassFilter.cs | 33 +- Rant/Vocabulary/Querying/ClassFilterRule.cs | 27 +- Rant/Vocabulary/Querying/Filter.cs | 30 +- Rant/Vocabulary/Querying/Query.cs | 27 +- Rant/Vocabulary/Querying/RangeFilter.cs | 30 +- Rant/Vocabulary/Querying/RegexFilter.cs | 29 +- Rant/Vocabulary/RantDictionary.cs | 33 +- Rant/Vocabulary/RantDictionaryEntry.cs | 33 +- .../RantDictionaryTable.Importer.cs | 69 +-- Rant/Vocabulary/RantDictionaryTable.cs | 49 +- Rant/Vocabulary/RantDictionaryTerm.cs | 27 +- Rant/Vocabulary/RantTableLoadException.cs | 27 +- Rant/Vocabulary/Utilities/Diff.cs | 73 ++- Rant/Vocabulary/Utilities/DoubleMetaphone.cs | 439 +++++------------- Rant/Vocabulary/Utilities/Rhymer.cs | 49 +- Rant/Vocabulary/Utilities/VocabUtils.cs | 29 +- 137 files changed, 4050 insertions(+), 1298 deletions(-) diff --git a/Rant/Core/Compiler/CompileContext.cs b/Rant/Core/Compiler/CompileContext.cs index 7fce5d1..21eac67 100644 --- a/Rant/Core/Compiler/CompileContext.cs +++ b/Rant/Core/Compiler/CompileContext.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Compiler +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Compiler { /// /// Distinguishes execution contexts to the compiler to make it aware of context-specific token behaviors. diff --git a/Rant/Core/Compiler/LineCol.cs b/Rant/Core/Compiler/LineCol.cs index 558862a..e0df140 100644 --- a/Rant/Core/Compiler/LineCol.cs +++ b/Rant/Core/Compiler/LineCol.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Compiler +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Compiler { internal struct LineCol { diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 2ae01a6..db23595 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using Rant.Core.Compiler.Syntax; @@ -39,13 +64,9 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext string value = reader.ReadLooseToken().Value; double doubleValue; if (!double.TryParse(value, out doubleValue)) - { compiler.SyntaxError(reader.PrevLooseToken, false, "err-compiler-invalid-constweight"); - } else - { constantWeights.Add(new _(blockNumber, doubleValue)); - } reader.Read(R.RightParen); } // dynamic weight @@ -60,13 +81,9 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext yield return Get(); if (weightActions.Count == 0) - { compiler.SyntaxError(firstToken, false, "err-compiler-empty-weight"); - } else - { dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); - } } } diff --git a/Rant/Core/Compiler/Parsing/Parser.cs b/Rant/Core/Compiler/Parsing/Parser.cs index 7ede53b..f0737f5 100644 --- a/Rant/Core/Compiler/Parsing/Parser.cs +++ b/Rant/Core/Compiler/Parsing/Parser.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using Rant.Core.Compiler.Syntax; @@ -13,9 +38,7 @@ public static T Get() where T : Parser { Parser parser; if (!_parserMap.TryGetValue(typeof(T), out parser)) - { parser = _parserMap[typeof(T)] = Activator.CreateInstance(typeof(T)) as T; - } return parser as T; } diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 0e77b34..5fddf4d 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Text.RegularExpressions; @@ -95,7 +120,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext case R.Question: { reader.SkipSpace(); - bool blacklist = (token.Type == R.Without); + bool blacklist = token.Type == R.Without; var regexFilter = reader.Read(R.Regex, "regex filter rule"); var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; @@ -103,7 +128,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { var flagsToken = reader.ReadToken(); foreach (char flag in flagsToken.Value) - { switch (flag) { case 'i': @@ -113,7 +137,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext options |= RegexOptions.Multiline; break; } - } } if (regexFilter.Value == null) break; query.AddFilter(new RegexFilter(new Regex(regexFilter.Value, options), !blacklist)); @@ -131,9 +154,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var firstNumberToken = reader.ReadLooseToken(); int firstNumber; if (!Util.ParseInt(firstNumberToken.Value, out firstNumber)) - { compiler.SyntaxError(firstNumberToken, false, "err-compiler-bad-sylrange-value"); - } // (a-) or (a-b) if (reader.PeekLooseToken().Type == R.Hyphen) @@ -145,9 +166,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var secondNumberToken = reader.ReadLooseToken(); int secondNumber; if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) - { compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); - } query.AddFilter(new RangeFilter(firstNumber, secondNumber)); } @@ -170,9 +189,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var secondNumberToken = reader.ReadLoose(R.Text, "acc-syllable-range-value"); int secondNumber; if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) - { compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); - } query.AddFilter(new RangeFilter(null, secondNumber)); } // () @@ -213,9 +230,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } if (!endOfQueryReached) - { compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); - } if (tableName.Value != null) actionCallback(new RstQuery(query, tableName.ToLocation())); @@ -267,21 +282,13 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp if (reader.PeekToken().Type == R.Equal) { if (carrierType == CarrierComponentType.Associative) - { carrierType = CarrierComponentType.MatchAssociative; - } else if (carrierType == CarrierComponentType.Dissociative) - { carrierType = CarrierComponentType.MatchDissociative; - } else if (carrierType == CarrierComponentType.Divergent) - { carrierType = CarrierComponentType.MatchDivergent; - } else if (carrierType == CarrierComponentType.Relational) - { carrierType = CarrierComponentType.MatchRelational; - } reader.ReadToken(); } diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index b96300c..62b8c60 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Globalization; @@ -34,9 +59,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext case R.Pipe: if (context == CompileContext.BlockSequence) - { yield break; - } goto default; // Print it if we're not in a block case R.RightCurly: @@ -51,9 +74,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // end of argument case R.Semicolon: if (context == CompileContext.ArgumentSequence) - { yield break; - } // this is probably just a semicolon in text actionCallback(new RstText(token.Value, token.ToLocation())); break; @@ -192,9 +213,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext case R.EOF: if (context != CompileContext.DefaultSequence) - { compiler.SyntaxError(token, true, "err-compiler-eof"); - } yield break; default: // Handle text @@ -204,9 +223,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } if (reader.End && context != CompileContext.DefaultSequence) - { compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); - } } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index d42ecd5..df20d01 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Text.RegularExpressions; @@ -27,7 +52,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext { var flagsToken = reader.ReadToken(); foreach (char flag in flagsToken.Value) - { switch (flag) { case 'i': @@ -37,7 +61,6 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext options |= RegexOptions.Multiline; break; } - } } reader.Read(R.Colon); @@ -46,9 +69,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var iterator = ReadArguments(compiler, reader, arguments); while (iterator.MoveNext()) - { yield return iterator.Current; - } compiler.SetNextActionCallback(actionCallback); @@ -66,18 +87,14 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext reader.ReadToken(); var e = ParseSubroutine(compiler, context, reader, actionCallback); while (e.MoveNext()) - { yield return e.Current; - } } break; default: { var e = ParseFunction(compiler, context, reader, actionCallback); while (e.MoveNext()) - { yield return e.Current; - } } break; } @@ -96,9 +113,7 @@ private IEnumerator ParseFunction(RantCompiler compiler, CompileContext var iterator = ReadArguments(compiler, reader, arguments); while (iterator.MoveNext()) - { yield return iterator.Current; - } compiler.SetNextActionCallback(actionCallback); } @@ -155,9 +170,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex { var type = SubroutineParameterType.Greedy; if (reader.TakeLoose(R.At)) - { type = SubroutineParameterType.Loose; - } subroutine.Parameters[reader.ReadLoose(R.Text, "argument name").Value] = type; } while (reader.TakeLoose(R.Semicolon, false)); @@ -177,9 +190,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex subroutine.Body = new RstSequence(actions, bodyStart.ToLocation()); if (inModule) - { compiler.Module.AddActionFunction(subroutineName.Value, subroutine); - } actionCallback(subroutine); } else @@ -189,9 +200,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex string moduleFunctionName = null; if (reader.TakeLoose(R.Period, false)) - { moduleFunctionName = reader.Read(R.Text, "module function name").Value; - } var arguments = new List(); @@ -201,9 +210,7 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex var iterator = ReadArguments(compiler, reader, arguments); while (iterator.MoveNext()) - { yield return iterator.Current; - } compiler.SetNextActionCallback(actionCallback); } diff --git a/Rant/Core/Compiler/R.cs b/Rant/Core/Compiler/R.cs index 82e2ab8..326ee89 100644 --- a/Rant/Core/Compiler/R.cs +++ b/Rant/Core/Compiler/R.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Compiler +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Compiler { internal enum R { diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 39b428e..d9c787f 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using Rant.Core.Compiler.Parsing; diff --git a/Rant/Core/Compiler/RantLexer.cs b/Rant/Core/Compiler/RantLexer.cs index 613605c..5d56220 100644 --- a/Rant/Core/Compiler/RantLexer.cs +++ b/Rant/Core/Compiler/RantLexer.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Text; using Rant.Core.Utilities; @@ -136,7 +161,7 @@ public static IEnumerable Lex(RantCompiler compiler, string input) while (i < len && input[i] != '\n') i++; goto iterate; - // Escape sequence + // Escape sequence case '\\': { if (text.Length > 0) diff --git a/Rant/Core/Compiler/Syntax/DeserializeRequest.cs b/Rant/Core/Compiler/Syntax/DeserializeRequest.cs index 149dc37..160eb42 100644 --- a/Rant/Core/Compiler/Syntax/DeserializeRequest.cs +++ b/Rant/Core/Compiler/Syntax/DeserializeRequest.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Compiler.Syntax +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Compiler.Syntax { internal sealed class DeserializeRequest { diff --git a/Rant/Core/Compiler/Syntax/RST.cs b/Rant/Core/Compiler/Syntax/RST.cs index 5264f56..c0d342e 100644 --- a/Rant/Core/Compiler/Syntax/RST.cs +++ b/Rant/Core/Compiler/Syntax/RST.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -47,7 +72,6 @@ public static void SerializeRST(RST rst, EasyWriter output) var serializer = stack.Peek(); while (serializer.MoveNext()) - { if (serializer.Current == null) { output.Write(NullRST); @@ -57,7 +81,6 @@ public static void SerializeRST(RST rst, EasyWriter output) stack.Push(serializer.Current.SerializeObject(output)); goto top; } - } stack.Pop(); } diff --git a/Rant/Core/Compiler/Syntax/RSTAttribute.cs b/Rant/Core/Compiler/Syntax/RSTAttribute.cs index c842f3f..d0b295c 100644 --- a/Rant/Core/Compiler/Syntax/RSTAttribute.cs +++ b/Rant/Core/Compiler/Syntax/RSTAttribute.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Text; namespace Rant.Core.Compiler.Syntax diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index d85cff8..6e59ecc 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Linq; using Rant.Core.Constructs; @@ -43,9 +68,7 @@ public RstBlock(LineCol location, List items, _weights = new double[_count]; for (int i = 0; i < _count; i++) _weights[i] = 1; foreach (var cw in constantWeights) - { _weights[cw.Item1] = cw.Item2; - } _constantWeightSum = _weights.Sum() - _dynamicWeights.Count; _weighted = true; } @@ -57,9 +80,7 @@ public override IEnumerator Run(Sandbox sb) // Skip if chance doesn't fall within range if (attribs.Chance < 100 && sb.RNG.NextDouble(0, 100) > attribs.Chance) - { yield break; - } int next = -1; int reps = attribs.RepEach ? _elements.Count : attribs.Repetitions; @@ -69,7 +90,6 @@ public override IEnumerator Run(Sandbox sb) if (attribs.Start != null) yield return attribs.Start; if (_weighted && attribs.Sync == null) - { foreach (var dw in _dynamicWeights) { sb.AddOutputWriter(); @@ -81,7 +101,6 @@ public override IEnumerator Run(Sandbox sb) weightSum += _weights[dw.Item1]; } - } if (attribs.Sync?.Index == 0 && attribs.StartIndex >= 0) attribs.Sync.Index = attribs.StartIndex; @@ -119,7 +138,6 @@ public override IEnumerator Run(Sandbox sb) // Separator if (i > 0 && attribs.Separator != null) - { if (attribs.IsSeries) { // Check if we're on the last separator in a series @@ -127,10 +145,7 @@ public override IEnumerator Run(Sandbox sb) { // Add the oxford comma if specified if (attribs.EndSeparator != null) - { - // If there are more than two items, print it! if (reps > 2) yield return attribs.EndSeparator; - } sb.Print(sb.Format.StandardSpace); @@ -151,7 +166,6 @@ public override IEnumerator Run(Sandbox sb) { yield return attribs.Separator; } - } sb.Blocks.Push(block); // Now put it back // Prefix @@ -182,9 +196,7 @@ protected override IEnumerator Serialize(EasyWriter output) output.Write(true); output.Write(_constantWeightSum); for (int i = 0; i < _count; i++) - { output.Write(_weights[i]); - } } else { @@ -223,9 +235,7 @@ protected override IEnumerator Deserialize(EasyReader input) input.ReadDouble(out _constantWeightSum); _weights = new double[_count]; for (int i = 0; i < _count; i++) - { input.ReadDouble(out _weights[i]); - } } // Read dynamic weights diff --git a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs index 6a953ce..a6c8bcd 100644 --- a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Linq; using Rant.Core.IO; @@ -35,16 +60,18 @@ public override IEnumerator Run(Sandbox sb) sb.Pattern, this, $"The module '{Name}' does not exist or has not been imported." - ); + ); if (sb.Modules[Name][_moduleFunctionName] == null) throw new RantRuntimeException( sb.Pattern, this, $"The function '{_moduleFunctionName}' cannot be found in the module '{Name}'." - ); + ); } else if (sb.Objects[Name] == null) + { throw new RantRuntimeException(sb.Pattern, this, $"The subroutine '{Name}' does not exist."); + } var sub = (RstDefineSubroutine)(_inModule ? sb.Modules[Name][_moduleFunctionName] : sb.Objects[Name].Value); if (sub.Parameters.Keys.Count != Arguments.Count) throw new RantRuntimeException(sb.Pattern, this, "Argument mismatch on subroutine call."); @@ -52,7 +79,6 @@ public override IEnumerator Run(Sandbox sb) var args = new Dictionary(); var parameters = sub.Parameters.Keys.ToArray(); for (int i = 0; i < Arguments.Count; i++) - { if (sub.Parameters[parameters[i]] == SubroutineParameterType.Greedy) { sb.AddOutputWriter(); @@ -61,8 +87,9 @@ public override IEnumerator Run(Sandbox sb) args[parameters[i]] = new RstText(Location, output.Main); } else + { args[parameters[i]] = Arguments[i]; - } + } sb.SubroutineArgs.Push(args); yield return action; sb.SubroutineArgs.Pop(); diff --git a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs index ba5234e..6433235 100644 --- a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.IO; using Rant.Core.ObjectModel; diff --git a/Rant/Core/Compiler/Syntax/RstEscape.cs b/Rant/Core/Compiler/Syntax/RstEscape.cs index 6db1442..2ea04a2 100644 --- a/Rant/Core/Compiler/Syntax/RstEscape.cs +++ b/Rant/Core/Compiler/Syntax/RstEscape.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Text; @@ -11,68 +36,68 @@ internal class RstEscape : RST { private static readonly Dictionary> EscapeTable = new Dictionary > - { - { 'n', (sb, c) => sb.Print(new string('\n', c)) }, { - 'N', (sb, c) => + { 'n', (sb, c) => sb.Print(new string('\n', c)) }, { - var b = new StringBuilder(); - for (int i = 0; i < c; i++) b.Append(Environment.NewLine); - sb.Print(b); - } - }, - { 'r', (sb, c) => sb.Print(new string('\r', c)) }, - { 't', (sb, c) => sb.Print(new string('\t', c)) }, - { 'b', (sb, c) => sb.Print(new string('\b', c)) }, - { 'f', (sb, c) => sb.Print(new string('\f', c)) }, - { 'v', (sb, c) => sb.Print(new string('\v', c)) }, - { 's', (sb, c) => sb.Print(new string(' ', c)) }, - { 'd', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(48, 58)), c) }, - { 'D', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(49, 58)), c) }, - { - 'c', - (sb, c) => - sb.PrintMany( - () => char.ToLowerInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) - }, - { - 'C', - (sb, c) => - sb.PrintMany( - () => char.ToUpperInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) - }, - { 'x', (sb, c) => sb.PrintMany(() => "0123456789abcdef"[sb.RNG.Next(16)], c) }, - { 'X', (sb, c) => sb.PrintMany(() => "0123456789ABCDEF"[sb.RNG.Next(16)], c) }, - { - 'w', (sb, c) => + 'N', (sb, c) => + { + var b = new StringBuilder(); + for (int i = 0; i < c; i++) b.Append(Environment.NewLine); + sb.Print(b); + } + }, + { 'r', (sb, c) => sb.Print(new string('\r', c)) }, + { 't', (sb, c) => sb.Print(new string('\t', c)) }, + { 'b', (sb, c) => sb.Print(new string('\b', c)) }, + { 'f', (sb, c) => sb.Print(new string('\f', c)) }, + { 'v', (sb, c) => sb.Print(new string('\v', c)) }, + { 's', (sb, c) => sb.Print(new string(' ', c)) }, + { 'd', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(48, 58)), c) }, + { 'D', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(49, 58)), c) }, + { + 'c', + (sb, c) => + sb.PrintMany( + () => char.ToLowerInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) + }, { - int i; - sb.PrintMany(() => + 'C', + (sb, c) => + sb.PrintMany( + () => char.ToUpperInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) + }, + { 'x', (sb, c) => sb.PrintMany(() => "0123456789abcdef"[sb.RNG.Next(16)], c) }, + { 'X', (sb, c) => sb.PrintMany(() => "0123456789ABCDEF"[sb.RNG.Next(16)], c) }, + { + 'w', (sb, c) => { - i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); - return i >= 10 - ? char.ToLowerInvariant(sb.Format.LettersInternal[i - 10]) - : Convert.ToChar(i + 48); - }, c); - } - }, - { - 'W', (sb, c) => + int i; + sb.PrintMany(() => + { + i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); + return i >= 10 + ? char.ToLowerInvariant(sb.Format.LettersInternal[i - 10]) + : Convert.ToChar(i + 48); + }, c); + } + }, { - int i; - sb.PrintMany(() => + 'W', (sb, c) => { - i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); - return i >= 10 - ? char.ToUpperInvariant(sb.Format.LettersInternal[i - 10]) - : Convert.ToChar(i + 48); - }, c); + int i; + sb.PrintMany(() => + { + i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); + return i >= 10 + ? char.ToUpperInvariant(sb.Format.LettersInternal[i - 10]) + : Convert.ToChar(i + 48); + }, c); + } + }, + { + 'a', (sb, c) => sb.Output.Do(chain => chain.AddArticleBuffer()) } - }, - { - 'a', (sb, c) => sb.Output.Do(chain => chain.AddArticleBuffer()) - } - }; + }; private char _codeLow, _codeHigh; private int _times; @@ -97,29 +122,21 @@ public override IEnumerator Run(Sandbox sb) if (_unicode) { if (_codeLow != '\0') - { for (int i = 0; i < _times; i++) { sb.Print(_codeHigh); sb.Print(_codeLow); } - } else - { sb.Print(new string(_codeHigh, _times)); - } } else { Action func; if (!EscapeTable.TryGetValue(_codeHigh, out func)) - { sb.Print(new string(_codeHigh, _times)); - } else - { func(sb, _times); - } } yield break; } diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index fb61a0a..ed66cfa 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -83,10 +108,8 @@ public override IEnumerator Run(Sandbox sb) string strMode = sb.Return().Main; object value; if (!Util.TryParseEnum(p.NativeType, strMode, out value)) - { throw new RantRuntimeException(sb.Pattern, _args[i].Location, $"Unknown mode value '{strMode}'."); - } args[i] = value; break; } @@ -129,9 +152,7 @@ public override IEnumerator Run(Sandbox sb) } while (requester.MoveNext()) - { yield return requester.Current; - } } protected override IEnumerator Serialize(EasyWriter output) diff --git a/Rant/Core/Compiler/Syntax/RstQuery.cs b/Rant/Core/Compiler/Syntax/RstQuery.cs index 9e930ae..971d16b 100644 --- a/Rant/Core/Compiler/Syntax/RstQuery.cs +++ b/Rant/Core/Compiler/Syntax/RstQuery.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using Rant.Core.IO; @@ -34,8 +59,8 @@ public override IEnumerator Run(Sandbox sb) if (_query.Name == null) { foreach (CarrierComponentType type in Enum.GetValues(typeof(CarrierComponentType))) - foreach (string name in _query.Carrier.GetComponentsOfType(type)) - sb.CarrierState.RemoveType(type, name); + foreach (string name in _query.Carrier.GetComponentsOfType(type)) + sb.CarrierState.RemoveType(type, name); yield break; } @@ -95,9 +120,7 @@ protected override IEnumerator Serialize(EasyWriter output) output.Write(_query.Exclusive); output.Write(_query.FilterCount); foreach (var filter in _query.GetFilters()) - { filter.Serialize(output); - } // Carrier if (_query.Carrier != null) diff --git a/Rant/Core/Compiler/Syntax/RstReplacer.cs b/Rant/Core/Compiler/Syntax/RstReplacer.cs index 9e62975..da04357 100644 --- a/Rant/Core/Compiler/Syntax/RstReplacer.cs +++ b/Rant/Core/Compiler/Syntax/RstReplacer.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Text.RegularExpressions; using Rant.Core.IO; diff --git a/Rant/Core/Compiler/Syntax/RstSequence.cs b/Rant/Core/Compiler/Syntax/RstSequence.cs index a2fb9c5..29dc1d7 100644 --- a/Rant/Core/Compiler/Syntax/RstSequence.cs +++ b/Rant/Core/Compiler/Syntax/RstSequence.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Linq; using Rant.Core.IO; diff --git a/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs b/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs index 12bafc3..ffe117e 100644 --- a/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs +++ b/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.IO; diff --git a/Rant/Core/Compiler/Syntax/RstText.cs b/Rant/Core/Compiler/Syntax/RstText.cs index 8b7dbcb..2bda377 100644 --- a/Rant/Core/Compiler/Syntax/RstText.cs +++ b/Rant/Core/Compiler/Syntax/RstText.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.IO; diff --git a/Rant/Core/Compiler/Token.cs b/Rant/Core/Compiler/Token.cs index 1b88a77..e16fb55 100644 --- a/Rant/Core/Compiler/Token.cs +++ b/Rant/Core/Compiler/Token.cs @@ -1,4 +1,29 @@ -using System.Globalization; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Globalization; namespace Rant.Core.Compiler { diff --git a/Rant/Core/Compiler/TokenReader.cs b/Rant/Core/Compiler/TokenReader.cs index ed4982b..34b670b 100644 --- a/Rant/Core/Compiler/TokenReader.cs +++ b/Rant/Core/Compiler/TokenReader.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -59,9 +84,7 @@ public R LastNonSpaceType if (Position == 0) return R.EOF; R Type; for (int i = Position; i >= 0; i--) - { if ((Type = _tokens[i].Type) != R.Whitespace) return Type; - } return R.EOF; } } @@ -463,9 +486,7 @@ public bool TakeAllWhile(Func predicate, bool allowEof = true) if (End) { if (!allowEof) - { _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - } return false; } @@ -475,9 +496,7 @@ public bool TakeAllWhile(Func predicate, bool allowEof = true) { t = _tokens[Position]; if (!predicate(t)) - { return Position > i; - } Position++; } return true; diff --git a/Rant/Core/Constructs/AttribPersistence.cs b/Rant/Core/Constructs/AttribPersistence.cs index 8737d53..d2b452c 100644 --- a/Rant/Core/Constructs/AttribPersistence.cs +++ b/Rant/Core/Constructs/AttribPersistence.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Constructs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Constructs { /// /// Defines persistence modes for block attributes. diff --git a/Rant/Core/Constructs/BlockAttribs.cs b/Rant/Core/Constructs/BlockAttribs.cs index e596731..534f500 100644 --- a/Rant/Core/Constructs/BlockAttribs.cs +++ b/Rant/Core/Constructs/BlockAttribs.cs @@ -1,4 +1,29 @@ -using Rant.Core.Compiler.Syntax; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Core.Compiler.Syntax; namespace Rant.Core.Constructs { @@ -58,9 +83,7 @@ public int NextIndex(int blockItemCount, RNG rng) { // Use synchronizer if available if (Sync != null) - { return Sync.NextItem(blockItemCount); - } return rng.Next(blockItemCount); } diff --git a/Rant/Core/Constructs/BlockManager.cs b/Rant/Core/Constructs/BlockManager.cs index b0c4b58..b690efa 100644 --- a/Rant/Core/Constructs/BlockManager.cs +++ b/Rant/Core/Constructs/BlockManager.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; diff --git a/Rant/Core/Constructs/BlockState.cs b/Rant/Core/Constructs/BlockState.cs index dd3c021..a509398 100644 --- a/Rant/Core/Constructs/BlockState.cs +++ b/Rant/Core/Constructs/BlockState.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Constructs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Constructs { /// /// Supplies state information about an active block, such as the iteration, item count, and current index. diff --git a/Rant/Core/Constructs/Comparison.cs b/Rant/Core/Constructs/Comparison.cs index fb99a00..413cac7 100644 --- a/Rant/Core/Constructs/Comparison.cs +++ b/Rant/Core/Constructs/Comparison.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Core.Utilities; diff --git a/Rant/Core/Constructs/SyncManager.cs b/Rant/Core/Constructs/SyncManager.cs index 86ef721..d93f31b 100644 --- a/Rant/Core/Constructs/SyncManager.cs +++ b/Rant/Core/Constructs/SyncManager.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; namespace Rant.Core.Constructs { @@ -45,17 +70,11 @@ public void SetPinned(string name, bool isPinned) { Synchronizer sync; if (_syncTable.TryGetValue(name, out sync)) - { sync.Pinned = isPinned; - } else if (isPinned) - { _pinQueue.Add(name); - } else - { _pinQueue.Remove(name); - } } public void Step(string name) diff --git a/Rant/Core/Constructs/SyncType.cs b/Rant/Core/Constructs/SyncType.cs index e229628..3a1b849 100644 --- a/Rant/Core/Constructs/SyncType.cs +++ b/Rant/Core/Constructs/SyncType.cs @@ -1,4 +1,29 @@ -using Rant.Metadata; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Metadata; namespace Rant.Core.Constructs { diff --git a/Rant/Core/Constructs/Synchronizer.cs b/Rant/Core/Constructs/Synchronizer.cs index f0d5867..9e210cb 100644 --- a/Rant/Core/Constructs/Synchronizer.cs +++ b/Rant/Core/Constructs/Synchronizer.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Core.Utilities; @@ -59,7 +84,6 @@ public int Step(bool force) { if (Type == SyncType.Locked) return _state[0]; if (Index >= _state.Length) - { switch (Type) { case SyncType.Deck: @@ -74,14 +98,13 @@ public int Step(bool force) Index = 0; break; } - } if (Pinned && !force) return _state[Index]; switch (Type) { case SyncType.Ping: case SyncType.Pong: - return _bounce ? _state[(_state.Length - 1) - Index++] : _state[Index++]; + return _bounce ? _state[_state.Length - 1 - Index++] : _state[Index++]; default: return _state[Index++]; } @@ -99,7 +122,7 @@ private void FillSlots() break; case SyncType.Reverse: case SyncType.Pong: - for (int i = 0; i < _state.Length; _state[(_state.Length - 1) - i] = i++) + for (int i = 0; i < _state.Length; _state[_state.Length - 1 - i] = i++) { } break; diff --git a/Rant/Core/Formatting/Accent.cs b/Rant/Core/Formatting/Accent.cs index 93f15e3..c854a48 100644 --- a/Rant/Core/Formatting/Accent.cs +++ b/Rant/Core/Formatting/Accent.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Formatting +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Formatting { internal enum Accent { diff --git a/Rant/Core/Formatting/Capitalization.cs b/Rant/Core/Formatting/Capitalization.cs index 2b67f88..39ed56f 100644 --- a/Rant/Core/Formatting/Capitalization.cs +++ b/Rant/Core/Formatting/Capitalization.cs @@ -1,4 +1,29 @@ -using Rant.Metadata; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Metadata; namespace Rant.Core.Formatting { diff --git a/Rant/Core/Formatting/Emoji.cs b/Rant/Core/Formatting/Emoji.cs index 35529de..190403d 100644 --- a/Rant/Core/Formatting/Emoji.cs +++ b/Rant/Core/Formatting/Emoji.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; namespace Rant.Core.Formatting { diff --git a/Rant/Core/Formatting/Endianness.cs b/Rant/Core/Formatting/Endianness.cs index 7e32c61..0ecf11a 100644 --- a/Rant/Core/Formatting/Endianness.cs +++ b/Rant/Core/Formatting/Endianness.cs @@ -1,4 +1,29 @@ -using Rant.Metadata; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Metadata; namespace Rant.Core.Formatting { diff --git a/Rant/Core/Formatting/HexFormat.cs b/Rant/Core/Formatting/HexFormat.cs index a503ec4..efffea6 100644 --- a/Rant/Core/Formatting/HexFormat.cs +++ b/Rant/Core/Formatting/HexFormat.cs @@ -1,4 +1,29 @@ -using Rant.Metadata; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Metadata; namespace Rant.Core.Formatting { diff --git a/Rant/Core/Formatting/NumberFormat.cs b/Rant/Core/Formatting/NumberFormat.cs index c6aa914..88b7e9f 100644 --- a/Rant/Core/Formatting/NumberFormat.cs +++ b/Rant/Core/Formatting/NumberFormat.cs @@ -1,4 +1,29 @@ -using Rant.Metadata; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Metadata; namespace Rant.Core.Formatting { diff --git a/Rant/Core/Formatting/NumberFormatter.cs b/Rant/Core/Formatting/NumberFormatter.cs index 65e117e..047535b 100644 --- a/Rant/Core/Formatting/NumberFormatter.cs +++ b/Rant/Core/Formatting/NumberFormatter.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Globalization; using System.Linq; @@ -58,23 +83,21 @@ public string FormatNumber(double number) private string GetHex(long number, bool uppercase) { string hexString = Convert.ToString(number, 16); - int targetLength = (BinaryFormat == BinaryFormat.Pad && hexString.Length < BinaryFormatDigits + int targetLength = BinaryFormat == BinaryFormat.Pad && hexString.Length < BinaryFormatDigits ? BinaryFormatDigits - : hexString.Length); + : hexString.Length; int numBytes = targetLength % 2 != 0 ? (int)Math.Ceiling((double)targetLength / 2) : targetLength / 2; var bytes = new string[numBytes]; if (BinaryFormat == BinaryFormat.Pad && hexString.Length < BinaryFormatDigits) - { for (int i = hexString.Length; i < BinaryFormatDigits; i++) hexString = '0' + hexString; - } if (hexString.Length % 2 != 0) hexString = "0" + hexString; for (int i = 0; i < bytes.Length; i++) bytes[i] = hexString[i * 2].ToString() + hexString[i * 2 + 1].ToString(); - if (Endianness != Endianness.Default && (BitConverter.IsLittleEndian != (Endianness == Endianness.Little))) + if (Endianness != Endianness.Default && BitConverter.IsLittleEndian != (Endianness == Endianness.Little)) bytes = bytes.Reverse().ToArray(); string finalString = string.Join("", bytes); @@ -85,7 +108,7 @@ private string GetHex(long number, bool uppercase) private string GetBinary(long number) { bool needsReverse = Endianness != Endianness.Default && - (BitConverter.IsLittleEndian != (Endianness == Endianness.Little)); + BitConverter.IsLittleEndian != (Endianness == Endianness.Little); string hexString = Convert.ToString(number, 2); if (needsReverse && hexString.Length % 8 != 0) hexString = new string('0', hexString.Length % 8) + hexString; @@ -103,12 +126,8 @@ private string GetBinary(long number) if (needsReverse) { for (int i = 0; i < origLength; i += 8) - { - for (int j = 0; j < 8; j++) - { - chars[finalLength - i - (8 - j)] = hexString[i + j]; - } - } + for (int j = 0; j < 8; j++) + chars[finalLength - i - (8 - j)] = hexString[i + j]; } else { diff --git a/Rant/Core/Formatting/Numerals.cs b/Rant/Core/Formatting/Numerals.cs index 8a2218b..16b52f1 100644 --- a/Rant/Core/Formatting/Numerals.cs +++ b/Rant/Core/Formatting/Numerals.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; @@ -94,9 +119,7 @@ public static string ToRoman(double number, bool lowerCase = false) .ToArray(); var sb = new StringBuilder(); for (int i = intArr.Length; i-- > 0;) - { sb.Append(RomanNumerals[i][intArr[i]]); - } return lowerCase ? sb.ToString().ToLower() : sb.ToString(); } @@ -136,16 +159,10 @@ public static string ToVerbal(long number) if (value == 0) continue; if (numBuilder.Length > 0) - { if (input.Any()) - { numBuilder.Append(", "); - } else if (value > 0) - { numBuilder.Append(" and "); - } - } buffer.Length = 0; @@ -174,9 +191,7 @@ public static string ToVerbal(long number) numBuilder.Append(buffer); if (pair.Item2.Length > 0) - { numBuilder.Append(" ").Append(pair.Item2); - } } return numBuilder.ToString(); } diff --git a/Rant/Core/Formatting/Unicode.cs b/Rant/Core/Formatting/Unicode.cs index f4093e7..6f23251 100644 --- a/Rant/Core/Formatting/Unicode.cs +++ b/Rant/Core/Formatting/Unicode.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Text; @@ -6,56 +31,6 @@ namespace Rant.Core.Formatting { internal static class Unicode { - public static string GetByName(string name) - { - if (name == null) throw new ArgumentNullException(nameof(name)); - uint codePoint; - string result; - if (!_unicodeCharacterMap.TryGetValue(name, out codePoint)) - { - var sb = new StringBuilder(); - bool space = false; - for(int i = 0; i < name.Length; i++) - { - if (Char.IsLetterOrDigit(name[i])) - { - if (space) - { - space = false; - if (sb.Length > 0) sb.Append(' '); - } - sb.Append(Char.ToUpper(name[i])); - continue; - } - - space = true; - } - - if (!_unicodeCharacterMap.TryGetValue(sb.ToString(), out codePoint)) - return String.Empty; - } - - if (_cache.TryGetValue(codePoint, out result)) return result; - - const uint minSurrogateCodePoint = 0x10000; - const uint lowSurrogateMask = 0x3ff; - const uint highSurrogateMask = lowSurrogateMask << 10; - const uint lowSurrogateOffset = 0xDC00; - const uint highSurrogateOffset = 0xD800; - - if (codePoint < minSurrogateCodePoint) - return _cache[codePoint] = ((char)codePoint).ToString(); - - uint sp = codePoint - minSurrogateCodePoint; - - result = _cache[codePoint] = new string(new[]{ - (char)(((sp & highSurrogateMask) >> 10) + highSurrogateOffset), - (char)((sp & lowSurrogateMask) + lowSurrogateOffset) - }); - - return result; - } - private static readonly Dictionary _cache = new Dictionary(); private static readonly Dictionary _unicodeCharacterMap; @@ -63,7 +38,7 @@ public static string GetByName(string name) static Unicode() { _unicodeCharacterMap = new Dictionary(); - + _unicodeCharacterMap.Add("NULL", 0); _unicodeCharacterMap.Add("START OF HEADING", 1); _unicodeCharacterMap.Add("START OF TEXT", 2); @@ -30633,7 +30608,58 @@ static Unicode() _unicodeCharacterMap.Add("VARIATION SELECTOR 253", 917996); _unicodeCharacterMap.Add("VARIATION SELECTOR 254", 917997); _unicodeCharacterMap.Add("VARIATION SELECTOR 255", 917998); - _unicodeCharacterMap.Add("VARIATION SELECTOR 256", 917999); + _unicodeCharacterMap.Add("VARIATION SELECTOR 256", 917999); + } + + public static string GetByName(string name) + { + if (name == null) throw new ArgumentNullException(nameof(name)); + uint codePoint; + string result; + if (!_unicodeCharacterMap.TryGetValue(name, out codePoint)) + { + var sb = new StringBuilder(); + bool space = false; + for (int i = 0; i < name.Length; i++) + { + if (Char.IsLetterOrDigit(name[i])) + { + if (space) + { + space = false; + if (sb.Length > 0) sb.Append(' '); + } + sb.Append(Char.ToUpper(name[i])); + continue; + } + + space = true; + } + + if (!_unicodeCharacterMap.TryGetValue(sb.ToString(), out codePoint)) + return String.Empty; + } + + if (_cache.TryGetValue(codePoint, out result)) return result; + + const uint minSurrogateCodePoint = 0x10000; + const uint lowSurrogateMask = 0x3ff; + const uint highSurrogateMask = lowSurrogateMask << 10; + const uint lowSurrogateOffset = 0xDC00; + const uint highSurrogateOffset = 0xD800; + + if (codePoint < minSurrogateCodePoint) + return _cache[codePoint] = ((char)codePoint).ToString(); + + uint sp = codePoint - minSurrogateCodePoint; + + result = _cache[codePoint] = new string(new[] + { + (char)(((sp & highSurrogateMask) >> 10) + highSurrogateOffset), + (char)((sp & lowSurrogateMask) + lowSurrogateOffset) + }); + + return result; } } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunction.cs b/Rant/Core/Framework/RantFunction.cs index cba9207..fb18617 100644 --- a/Rant/Core/Framework/RantFunction.cs +++ b/Rant/Core/Framework/RantFunction.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; diff --git a/Rant/Core/Framework/RantFunctionParameter.cs b/Rant/Core/Framework/RantFunctionParameter.cs index 3d97a4c..1fc1e62 100644 --- a/Rant/Core/Framework/RantFunctionParameter.cs +++ b/Rant/Core/Framework/RantFunctionParameter.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -28,11 +53,9 @@ public IEnumerable GetEnumValues() { if (!NativeType.IsEnum) yield break; foreach (string value in Enum.GetNames(NativeType)) - { yield return new RantModeValue(Util.CamelToSnake(value), - (NativeType.GetMember(value)[0].GetCustomAttributes(typeof(RantDescriptionAttribute), true).First() as - RantDescriptionAttribute)?.Description ?? string.Empty); - } + (NativeType.GetMember(value)[0].GetCustomAttributes(typeof(RantDescriptionAttribute), true).First() as + RantDescriptionAttribute)?.Description ?? string.Empty); } } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionParameterType.cs b/Rant/Core/Framework/RantFunctionParameterType.cs index 558fa6d..387e7fe 100644 --- a/Rant/Core/Framework/RantFunctionParameterType.cs +++ b/Rant/Core/Framework/RantFunctionParameterType.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Framework +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Framework { /// /// Defines parameter types for Rant functions. diff --git a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs index 804a9c3..56cd42b 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index f9b3525..18049f6 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Globalization; using System.IO; @@ -68,10 +93,10 @@ private static IEnumerator NumberFormatRange(Sandbox sb, private static void Digits(Sandbox sb, [RantDescription("The digit format to use.")] BinaryFormat format, [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => - { - chain.Last.NumberFormatter.BinaryFormat = format; - chain.Last.NumberFormatter.BinaryFormatDigits = digits; - }); + { + chain.Last.NumberFormatter.BinaryFormat = format; + chain.Last.NumberFormatter.BinaryFormatDigits = digits; + }); [RantFunction] [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] @@ -171,21 +196,13 @@ private static void CapsInfer(Sandbox sb, { string word = words[0]; if (word.Length == 1) - { output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); - } else if (Util.IsUppercase(word)) - { output.Capitalize(Capitalization.Upper); - } else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - { output.Capitalize(Capitalization.First); - } else - { output.Capitalize(Capitalization.None); - } } else { @@ -239,21 +256,13 @@ private static void CapsInfer(Sandbox sb, } if (sentences.Length > 1 && all) - { output.Capitalize(Capitalization.Sentence); - } else if (none) - { output.Capitalize(Capitalization.Lower); - } else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - { output.Capitalize(Capitalization.First); - } else - { output.Capitalize(Capitalization.None); - } } } @@ -545,7 +554,7 @@ private static IEnumerator NotNth(Sandbox sb, [RantFunction] [RantDescription( "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." - )] + )] private static IEnumerator NotNthO(Sandbox sb, [RantDescription("The interval at which the pattern should not be run.")] int interval, [RantDescription("The number of iterations to offset the interval by.")] int offset, @@ -618,16 +627,10 @@ private static void Undef(Sandbox sb, private static void Toggle(Sandbox sb, params string[] flags) { foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - { if (sb.Engine.Flags.Contains(flag)) - { sb.Engine.Flags.Remove(flag); - } else - { sb.Engine.Flags.Add(flag); - } - } } [RantFunction] @@ -763,21 +766,13 @@ private static void Use(Sandbox sb, string name) } string file; if (File.Exists(name + ".module.rant")) - { file = name + ".module.rant"; - } else if (File.Exists(name + ".rant")) - { file = name + ".rant"; - } else if (File.Exists(name)) - { file = name; - } else - { throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Could not find module '{name}'."); - } var pattern = RantProgram.CompileFile(file); if (pattern.Module == null) throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"No module is defined in {file}."); @@ -799,7 +794,6 @@ private static void Reverse(Sandbox sb, int numCombiners = 0; int lastIndex = input.Length - 1; for (int i = lastIndex; i >= 0; i--) - { if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) { // It's combining, so increase the combiner count until we hit a regular char @@ -809,13 +803,11 @@ private static void Reverse(Sandbox sb, { // We've hit a non-combining character with combiners added. // First thing to do is add the character to the buffer. - buffer[(lastIndex - i) - numCombiners] = input[i]; + buffer[lastIndex - i - numCombiners] = input[i]; // Then we insert all the combining characters that come after it. for (int j = 1; j <= numCombiners; j++) - { - buffer[(lastIndex - i) - numCombiners + j] = input[i + j]; - } + buffer[lastIndex - i - numCombiners + j] = input[i + j]; numCombiners = 0; } else if (char.IsLowSurrogate(input[i])) @@ -830,7 +822,6 @@ private static void Reverse(Sandbox sb, { buffer[lastIndex - i] = input[i]; } - } sb.Print(new string(buffer)); } @@ -844,7 +835,6 @@ private static void ReverseEx(Sandbox sb, int numCombiners = 0; int lastIndex = input.Length - 1; for (int i = lastIndex; i >= 0; i--) - { if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) { // It's combining, so increase the combiner count until we hit a regular char @@ -854,13 +844,11 @@ private static void ReverseEx(Sandbox sb, { // We've hit a non-combining character with combiners added. // First thing to do is add the character to the buffer. - buffer[(lastIndex - i) - numCombiners] = Util.ReverseChar(input[i]); + buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); // Then we insert all the combining characters that come after it. for (int j = 1; j <= numCombiners; j++) - { - buffer[(lastIndex - i) - numCombiners + j] = input[i + j]; - } + buffer[lastIndex - i - numCombiners + j] = input[i + j]; numCombiners = 0; } else if (char.IsLowSurrogate(input[i])) @@ -875,7 +863,6 @@ private static void ReverseEx(Sandbox sb, { buffer[lastIndex - i] = Util.ReverseChar(input[i]); } - } sb.Print(new string(buffer)); } diff --git a/Rant/Core/Framework/RantFunctionSignature.cs b/Rant/Core/Framework/RantFunctionSignature.cs index 86fb321..714f8b1 100644 --- a/Rant/Core/Framework/RantFunctionSignature.cs +++ b/Rant/Core/Framework/RantFunctionSignature.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -47,43 +72,31 @@ public RantFunctionSignature(string name, string description, MethodInfo method) type = type.GetElementType(); if (type == typeof(RST) || type.IsSubclassOf(typeof(RST))) - { rantType = RantFunctionParameterType.Pattern; - } else if (type == typeof(string)) - { rantType = RantFunctionParameterType.String; - } else if (type.IsEnum) - { rantType = type.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? RantFunctionParameterType.Flags : RantFunctionParameterType.Mode; - } else if (IOUtil.IsNumericType(type)) - { rantType = RantFunctionParameterType.Number; - } else if (type == typeof(RantObject)) - { rantType = RantFunctionParameterType.RantObject; - } else - { throw new ArgumentException( $"({method.Name}) Unsupported type '{type}' for parameter '{parameters[i].Name}'. Must be a string, number, or RantAction."); - } // If there is a [RantDescription] attribute on the parameter, retrieve its value. Default to empty string if there isn't one. string paramDescription = - (parameters[i].GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as - RantDescriptionAttribute)?.Description ?? ""; + (parameters[i].GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as + RantDescriptionAttribute)?.Description ?? ""; // Create Rant parameter Parameters[i - 1] = new RantFunctionParameter(parameters[i].Name, type, rantType, HasParamArray = - (i == parameters.Length - 1 && - parameters[i].GetCustomAttributes(typeof(ParamArrayAttribute), false).FirstOrDefault() != null)) + i == parameters.Length - 1 && + parameters[i].GetCustomAttributes(typeof(ParamArrayAttribute), false).FirstOrDefault() != null) { Description = paramDescription }; diff --git a/Rant/Core/IO/BitField.cs b/Rant/Core/IO/BitField.cs index 03b5d9f..4c3cb3d 100644 --- a/Rant/Core/IO/BitField.cs +++ b/Rant/Core/IO/BitField.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Runtime.InteropServices; namespace Rant.Core.IO @@ -17,9 +42,7 @@ internal class BitField public BitField(int bits) { if (bits % 8 != 0) - { throw new ArgumentException("Bit count must be a multiple of 8."); - } _field = new byte[bits / 8]; } @@ -37,7 +60,7 @@ internal BitField(byte[] data) public bool this[int i] { get { return ((_field[i / 8] >> (i % 8)) & 1) == 1; } - set { _field[i / 8] = (byte)((_field[i / 8] & ~(1 << (i % 8))) | ((value ? 1 << i % 8 : 0))); } + set { _field[i / 8] = (byte)((_field[i / 8] & ~(1 << (i % 8))) | (value ? 1 << (i % 8) : 0)); } } /// @@ -86,9 +109,7 @@ public void UnsetAll() public void SetAll() { for (int i = 0; i < _field.Length; i++) - { _field[i] = 0xFF; - } } /// @@ -99,9 +120,7 @@ public int GetSetCount() { int n = 0; foreach (byte b in _field) - { n += IOUtil.NumberOfSetBits(b); - } return n; } @@ -120,9 +139,7 @@ public int GetUnsetCount() public void Invert() { for (int i = 0; i < _field.Length; i++) - { _field[i] = (byte)~_field[i]; - } } /// diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs index 1bfb9cb..ceedcf4 100644 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ b/Rant/Core/IO/Bson/BsonDocument.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Text; diff --git a/Rant/Core/IO/Bson/BsonItem.cs b/Rant/Core/IO/Bson/BsonItem.cs index 5451484..7e6f585 100644 --- a/Rant/Core/IO/Bson/BsonItem.cs +++ b/Rant/Core/IO/Bson/BsonItem.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -221,17 +246,11 @@ private void PossiblyCreateArray() object[] arr; if (type.IsArray) - { arr = _value as object[]; - } else if (_value is IList) - { arr = (_value as IList).OfType().ToArray(); - } else - { return; - } if (arr == null) return; _type = 0x04; // array @@ -239,13 +258,9 @@ private void PossiblyCreateArray() _objectValues = new Dictionary(); _value = null; for (int i = 0; i < arr.Length; i++) - { - _objectValues[i.ToString()] = ( - arr[i] is BsonItem - ? (BsonItem)arr[i] - : new BsonItem(arr[i]) - ); - } + _objectValues[i.ToString()] = arr[i] is BsonItem + ? (BsonItem)arr[i] + : new BsonItem(arr[i]); } private void DetermineType() @@ -271,9 +286,7 @@ private void DetermineType() else if (_value is int) _type = 0x10; else - { _type = 0x00; - } } } } \ No newline at end of file diff --git a/Rant/Core/IO/Bson/BsonStringTableMode.cs b/Rant/Core/IO/Bson/BsonStringTableMode.cs index 9021c8a..cc4366f 100644 --- a/Rant/Core/IO/Bson/BsonStringTableMode.cs +++ b/Rant/Core/IO/Bson/BsonStringTableMode.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.IO.Bson +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.IO.Bson { /// /// Defines the available string table types for BSON documents. diff --git a/Rant/Core/IO/Compression/CRC.cs b/Rant/Core/IO/Compression/CRC.cs index 0aaa968..8f59dd5 100644 --- a/Rant/Core/IO/Compression/CRC.cs +++ b/Rant/Core/IO/Compression/CRC.cs @@ -1,4 +1,27 @@ -// Common/CRC.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion namespace Rant.Core.IO.Compression { @@ -30,13 +53,13 @@ public void Init() public void UpdateByte(byte b) { - _value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8); + _value = Table[(byte)_value ^ b] ^ (_value >> 8); } public void Update(byte[] data, uint offset, uint size) { for (uint i = 0; i < size; i++) - _value = Table[(((byte)(_value)) ^ data[offset + i])] ^ (_value >> 8); + _value = Table[(byte)_value ^ data[offset + i]] ^ (_value >> 8); } public uint GetDigest() @@ -54,7 +77,7 @@ private static uint CalculateDigest(byte[] data, uint offset, uint size) private static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) { - return (CalculateDigest(data, offset, size) == digest); + return CalculateDigest(data, offset, size) == digest; } } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/EasyCompressor.cs b/Rant/Core/IO/Compression/EasyCompressor.cs index 90b37a4..c606a39 100644 --- a/Rant/Core/IO/Compression/EasyCompressor.cs +++ b/Rant/Core/IO/Compression/EasyCompressor.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.IO; using Rant.Core.IO.Compression.LZMA; @@ -43,7 +68,7 @@ public static byte[] Decompress(byte[] data) dec.SetDecoderProperties(props); long outSize = 0; for (int i = 0; i < 8; i++) - outSize |= ((long)(byte)inStream.ReadByte()) << (8 * i); + outSize |= (long)(byte)inStream.ReadByte() << (8 * i); long compressedSize = inStream.Length - inStream.Position; dec.Code(inStream, outStream, compressedSize, outSize, progress); inStream.Close(); diff --git a/Rant/Core/IO/Compression/ICoder.cs b/Rant/Core/IO/Compression/ICoder.cs index 460fb09..d673da8 100644 --- a/Rant/Core/IO/Compression/ICoder.cs +++ b/Rant/Core/IO/Compression/ICoder.cs @@ -1,4 +1,27 @@ -// ICoder.h +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System; using System.IO; @@ -37,7 +60,7 @@ internal interface ICodeProgress /// output size. -1 if unknown. /// void SetProgress(long inSize, long outSize); - }; + } internal interface ICoder { @@ -64,7 +87,7 @@ internal interface ICoder /// void Code(Stream inStream, Stream outStream, long inSize, long outSize, ICodeProgress progress); - }; + } /* public interface ICoder2 @@ -156,13 +179,13 @@ internal enum CoderPropID /// Specifies mode with end marker. /// EndMarker - }; + } internal interface ISetCoderProperties { void SetCoderProperties(CoderPropID[] propIDs, object[] properties); - }; + } internal interface IWriteCoderProperties { diff --git a/Rant/Core/IO/Compression/LZ/IMatchFinder.cs b/Rant/Core/IO/Compression/LZ/IMatchFinder.cs index 90d7273..1a4cc58 100644 --- a/Rant/Core/IO/Compression/LZ/IMatchFinder.cs +++ b/Rant/Core/IO/Compression/LZ/IMatchFinder.cs @@ -1,4 +1,27 @@ -// IMatchFinder.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System.IO; diff --git a/Rant/Core/IO/Compression/LZ/LzBinTree.cs b/Rant/Core/IO/Compression/LZ/LzBinTree.cs index 3bd8c8e..d286842 100644 --- a/Rant/Core/IO/Compression/LZ/LzBinTree.cs +++ b/Rant/Core/IO/Compression/LZ/LzBinTree.cs @@ -1,4 +1,27 @@ -// LzBinTree.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System; using System.IO; @@ -84,13 +107,13 @@ public void Create(uint historySize, uint keepAddBufferBefore, if (HASH_ARRAY) { hs = historySize - 1; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); + hs |= hs >> 1; + hs |= hs >> 2; + hs |= hs >> 4; + hs |= hs >> 8; hs >>= 1; hs |= 0xFFFF; - if (hs > (1 << 24)) + if (hs > 1 << 24) hs >>= 1; _hashMask = hs; hs++; @@ -104,7 +127,9 @@ public uint GetMatches(uint[] distances) { uint lenLimit; if (_pos + _matchMaxLen <= _streamPos) + { lenLimit = _matchMaxLen; + } else { lenLimit = _streamPos - _pos; @@ -116,7 +141,7 @@ public uint GetMatches(uint[] distances) } uint offset = 0; - uint matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; uint cur = _bufferOffset + _pos; uint maxLen = kStartMaxLen; // to avoid items for len < hashSize; uint hashValue, hash2Value = 0, hash3Value = 0; @@ -125,12 +150,14 @@ public uint GetMatches(uint[] distances) { uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; hash2Value = temp & (kHash2Size - 1); - temp ^= ((uint)(_bufferBase[cur + 2]) << 8); + temp ^= (uint)_bufferBase[cur + 2] << 8; hash3Value = temp & (kHash3Size - 1); hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; } else - hashValue = _bufferBase[cur] ^ ((uint)(_bufferBase[cur + 1]) << 8); + { + hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); + } uint curMatch = _hash[kFixHashSize + hashValue]; if (HASH_ARRAY) @@ -164,23 +191,19 @@ public uint GetMatches(uint[] distances) _hash[kFixHashSize + hashValue] = _pos; uint ptr0 = (_cyclicBufferPos << 1) + 1; - uint ptr1 = (_cyclicBufferPos << 1); + uint ptr1 = _cyclicBufferPos << 1; uint len0, len1; len0 = len1 = kNumHashDirectBytes; if (kNumHashDirectBytes != 0) - { if (curMatch > matchMinPos) - { if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != _bufferBase[cur + kNumHashDirectBytes]) { distances[offset++] = maxLen = kNumHashDirectBytes; distances[offset++] = _pos - curMatch - 1; } - } - } uint count = _cutValue; @@ -192,9 +215,9 @@ public uint GetMatches(uint[] distances) break; } uint delta = _pos - curMatch; - uint cyclicPos = ((delta <= _cyclicBufferPos) - ? (_cyclicBufferPos - delta) - : (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + uint cyclicPos = (delta <= _cyclicBufferPos + ? _cyclicBufferPos - delta + : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; uint pby1 = _bufferOffset + curMatch; uint len = Math.Min(len0, len1); @@ -240,7 +263,9 @@ public void Skip(uint num) { uint lenLimit; if (_pos + _matchMaxLen <= _streamPos) + { lenLimit = _matchMaxLen; + } else { lenLimit = _streamPos - _pos; @@ -251,7 +276,7 @@ public void Skip(uint num) } } - uint matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; uint cur = _bufferOffset + _pos; uint hashValue; @@ -261,19 +286,21 @@ public void Skip(uint num) uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; uint hash2Value = temp & (kHash2Size - 1); _hash[hash2Value] = _pos; - temp ^= ((uint)(_bufferBase[cur + 2]) << 8); + temp ^= (uint)_bufferBase[cur + 2] << 8; uint hash3Value = temp & (kHash3Size - 1); _hash[kHash3Offset + hash3Value] = _pos; hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; } else - hashValue = _bufferBase[cur] ^ ((uint)(_bufferBase[cur + 1]) << 8); + { + hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); + } uint curMatch = _hash[kFixHashSize + hashValue]; _hash[kFixHashSize + hashValue] = _pos; uint ptr0 = (_cyclicBufferPos << 1) + 1; - uint ptr1 = (_cyclicBufferPos << 1); + uint ptr1 = _cyclicBufferPos << 1; uint len0, len1; len0 = len1 = kNumHashDirectBytes; @@ -288,9 +315,9 @@ public void Skip(uint num) } uint delta = _pos - curMatch; - uint cyclicPos = ((delta <= _cyclicBufferPos) - ? (_cyclicBufferPos - delta) - : (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + uint cyclicPos = (delta <= _cyclicBufferPos + ? _cyclicBufferPos - delta + : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; uint pby1 = _bufferOffset + curMatch; uint len = Math.Min(len0, len1); @@ -327,7 +354,7 @@ public void Skip(uint num) public void SetType(int numHashBytes) { - HASH_ARRAY = (numHashBytes > 2); + HASH_ARRAY = numHashBytes > 2; if (HASH_ARRAY) { kNumHashDirectBytes = 0; diff --git a/Rant/Core/IO/Compression/LZ/LzInWindow.cs b/Rant/Core/IO/Compression/LZ/LzInWindow.cs index 6408e39..360e72e 100644 --- a/Rant/Core/IO/Compression/LZ/LzInWindow.cs +++ b/Rant/Core/IO/Compression/LZ/LzInWindow.cs @@ -1,4 +1,27 @@ -// LzInWindow.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System.IO; @@ -39,7 +62,7 @@ public virtual void ReadBlock() return; while (true) { - int size = (int)((0 - _bufferOffset) + _blockSize - _streamPos); + int size = (int)(0 - _bufferOffset + _blockSize - _streamPos); if (size == 0) return; int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size); @@ -118,7 +141,7 @@ public byte GetIndexByte(int index) public uint GetMatchLen(int index, uint distance, uint limit) { if (_streamEndWasReached) - if ((_pos + index) + limit > _streamPos) + if (_pos + index + limit > _streamPos) limit = _streamPos - (uint)(_pos + index); distance++; // Byte *pby = _buffer + (size_t)_pos + index; diff --git a/Rant/Core/IO/Compression/LZ/LzOutWindow.cs b/Rant/Core/IO/Compression/LZ/LzOutWindow.cs index 5656fe2..6116b74 100644 --- a/Rant/Core/IO/Compression/LZ/LzOutWindow.cs +++ b/Rant/Core/IO/Compression/LZ/LzOutWindow.cs @@ -1,4 +1,27 @@ -// LzOutWindow.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System.IO; @@ -16,10 +39,7 @@ internal class OutWindow public void Create(uint windowSize) { if (_windowSize != windowSize) - { - // System.GC.Collect(); _buffer = new byte[windowSize]; - } _windowSize = windowSize; _pos = 0; _streamPos = 0; @@ -40,7 +60,7 @@ public void Init(Stream stream, bool solid) public bool Train(Stream stream) { long len = stream.Length; - uint size = (len < _windowSize) ? (uint)len : _windowSize; + uint size = len < _windowSize ? (uint)len : _windowSize; TrainSize = size; stream.Position = len - size; _streamPos = _pos = 0; diff --git a/Rant/Core/IO/Compression/LZMA/LzmaBase.cs b/Rant/Core/IO/Compression/LZMA/LzmaBase.cs index 217285d..ca2e6f0 100644 --- a/Rant/Core/IO/Compression/LZMA/LzmaBase.cs +++ b/Rant/Core/IO/Compression/LZMA/LzmaBase.cs @@ -1,4 +1,27 @@ -// LzmaBase.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion namespace Rant.Core.IO.Compression.LZMA { @@ -16,7 +39,7 @@ internal abstract class Base public const uint kMatchMinLen = 2; public const int kNumAlignBits = 4; public const uint kAlignTableSize = 1 << kNumAlignBits; - public const uint kAlignMask = (kAlignTableSize - 1); + public const uint kAlignMask = kAlignTableSize - 1; public const uint kStartPosModelIndex = 4; public const uint kEndPosModelIndex = 14; public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; @@ -24,9 +47,9 @@ internal abstract class Base public const uint kNumLitPosStatesBitsEncodingMax = 4; public const uint kNumLitContextBitsMax = 8; public const int kNumPosStatesBitsMax = 4; - public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax); + public const uint kNumPosStatesMax = 1 << kNumPosStatesBitsMax; public const int kNumPosStatesBitsEncodingMax = 4; - public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); + public const uint kNumPosStatesEncodingMax = 1 << kNumPosStatesBitsEncodingMax; public const int kNumLowLenBits = 3; public const int kNumMidLenBits = 3; public const int kNumHighLenBits = 8; diff --git a/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs b/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs index 340e82c..5645e55 100644 --- a/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs +++ b/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs @@ -1,4 +1,27 @@ -// LzmaDecoder.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System; using System.IO; @@ -58,96 +81,98 @@ public void Code(Stream inStream, Stream outStream, } while (nowPos64 < outSize64) { - // UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64); - // while(nowPos64 < next) + uint posState = (uint)nowPos64 & m_PosStateMask; + if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) { - uint posState = (uint)nowPos64 & m_PosStateMask; - if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - byte b; - byte prevByte = m_OutWindow.GetByte(0); - if (!state.IsCharState()) - b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, - (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); - else - b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); - m_OutWindow.PutByte(b); - state.UpdateChar(); - nowPos64++; - } + byte b; + byte prevByte = m_OutWindow.GetByte(0); + if (!state.IsCharState()) + b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, + (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); else + b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); + m_OutWindow.PutByte(b); + state.UpdateChar(); + nowPos64++; + } + else + { + uint len; + if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) { - uint len; - if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) + if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) { - if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) + if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) { - if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - state.UpdateShortRep(); - m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); - nowPos64++; - continue; - } + state.UpdateShortRep(); + m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); + nowPos64++; + continue; + } + } + else + { + uint distance; + if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) + { + distance = rep1; } else { - uint distance; - if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) + if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) { - distance = rep1; + distance = rep2; } else { - if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) - distance = rep2; - else - { - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; + distance = rep3; + rep3 = rep2; } - rep1 = rep0; - rep0 = distance; + rep2 = rep1; } - len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; - state.UpdateRep(); + rep1 = rep0; + rep0 = distance; } - else + len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; + state.UpdateRep(); + } + else + { + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); + state.UpdateMatch(); + uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); + if (posSlot >= Base.kStartPosModelIndex) { - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); - state.UpdateMatch(); - uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); - if (posSlot >= Base.kStartPosModelIndex) + int numDirectBits = (int)((posSlot >> 1) - 1); + rep0 = (2 | (posSlot & 1)) << numDirectBits; + if (posSlot < Base.kEndPosModelIndex) { - int numDirectBits = (int)((posSlot >> 1) - 1); - rep0 = ((2 | (posSlot & 1)) << numDirectBits); - if (posSlot < Base.kEndPosModelIndex) - rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, - rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); - else - { - rep0 += (m_RangeDecoder.DecodeDirectBits( - numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits); - rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); - } + rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, + rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); } else - rep0 = posSlot; + { + rep0 += m_RangeDecoder.DecodeDirectBits( + numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits; + rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); + } } - if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) + else { - if (rep0 == 0xFFFFFFFF) - break; - throw new DataErrorException(); + rep0 = posSlot; } - m_OutWindow.CopyBlock(rep0, len); - nowPos64 += len; } + if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) + { + if (rep0 == 0xFFFFFFFF) + break; + throw new DataErrorException(); + } + m_OutWindow.CopyBlock(rep0, len); + nowPos64 += len; } } m_OutWindow.Flush(); @@ -167,7 +192,7 @@ public void SetDecoderProperties(byte[] properties) throw new InvalidParamException(); uint dictionarySize = 0; for (int i = 0; i < 4; i++) - dictionarySize += ((uint)(properties[1 + i])) << (i * 8); + dictionarySize += (uint)properties[1 + i] << (i * 8); SetDictionarySize(dictionarySize); SetLiteralProperties(lp, lc); SetPosBitsProperties(pb); @@ -179,7 +204,7 @@ private void SetDictionarySize(uint dictionarySize) { m_DictionarySize = dictionarySize; m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); - uint blockSize = Math.Max(m_DictionarySizeCheck, (1 << 12)); + uint blockSize = Math.Max(m_DictionarySizeCheck, 1 << 12); m_OutWindow.Create(blockSize); } } @@ -278,7 +303,9 @@ public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState) return m_LowCoder[posState].Decode(rangeDecoder); uint symbol = Base.kNumLowLenSymbols; if (m_Choice2.Decode(rangeDecoder) == 0) + { symbol += m_MidCoder[posState].Decode(rangeDecoder); + } else { symbol += Base.kNumMidLenSymbols; @@ -349,7 +376,9 @@ public byte DecodeNormal(RangeCoder.Decoder rangeDecoder) { uint symbol = 1; do - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); while (symbol < 0x100); + { + symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); + } while (symbol < 0x100); return (byte)symbol; } @@ -372,6 +401,6 @@ public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) return (byte)symbol; } } - }; + } } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs b/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs index 42ceaec..87fca20 100644 --- a/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs +++ b/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs @@ -1,4 +1,27 @@ -// LzmaEncoder.cs +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System; using System.IO; @@ -48,9 +71,9 @@ internal class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties private readonly uint[] tempPrices = new uint[Base.kNumFullDistances]; private uint _additionalOffset; private uint _alignPriceCount; - private uint _dictionarySize = (1 << kDefaultDictionaryLogSize); + private uint _dictionarySize = 1 << kDefaultDictionaryLogSize; private uint _dictionarySizePrev = 0xFFFFFFFF; - private uint _distTableSize = (kDefaultDictionaryLogSize * 2); + private uint _distTableSize = kDefaultDictionaryLogSize * 2; private bool _finished; private Stream _inStream; private uint _longestMatchLength; @@ -68,7 +91,7 @@ internal class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties private uint _optimumEndIndex; private BitTreeEncoder _posAlignEncoder = new BitTreeEncoder(Base.kNumAlignBits); private int _posStateBits = 2; - private uint _posStateMask = (4 - 1); + private uint _posStateMask = 4 - 1; private byte _previousByte; private Base.State _state = new Base.State(); private uint _trainSize = 0; @@ -83,7 +106,7 @@ static Encoder() g_FastPos[1] = 1; for (byte slotFast = 2; slotFast < kFastSlots; slotFast++) { - uint k = ((uint)1 << ((slotFast >> 1) - 1)); + uint k = (uint)1 << ((slotFast >> 1) - 1); for (uint j = 0; j < k; j++, c++) g_FastPos[c] = slotFast; } @@ -113,9 +136,7 @@ public void Code(Stream inStream, Stream outStream, if (finished) return; if (progress != null) - { progress.SetProgress(processedInSize, processedOutSize); - } } } finally @@ -181,7 +202,7 @@ public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) _dictionarySize = (uint)dictionarySize; int dicLogSize; for (dicLogSize = 0; dicLogSize < (uint)kDicLogSizeMaxCompress; dicLogSize++) - if (dictionarySize <= ((uint)(1) << dicLogSize)) + if (dictionarySize <= (uint)1 << dicLogSize) break; _distTableSize = (uint)dicLogSize * 2; break; @@ -194,7 +215,7 @@ public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) if (v < 0 || v > (uint)Base.kNumPosStatesBitsEncodingMax) throw new InvalidParamException(); _posStateBits = v; - _posStateMask = (((uint)1) << _posStateBits) - 1; + _posStateMask = ((uint)1 << _posStateBits) - 1; break; } case CoderPropID.LitPosBits: @@ -241,18 +262,18 @@ public void WriteCoderProperties(Stream outStream) private static uint GetPosSlot(uint pos) { - if (pos < (1 << 11)) + if (pos < 1 << 11) return g_FastPos[pos]; - if (pos < (1 << 21)) + if (pos < 1 << 21) return (uint)(g_FastPos[pos >> 10] + 20); return (uint)(g_FastPos[pos >> 20] + 40); } private static uint GetPosSlot2(uint pos) { - if (pos < (1 << 17)) + if (pos < 1 << 17) return (uint)(g_FastPos[pos >> 6] + 12); - if (pos < (1 << 27)) + if (pos < 1 << 27) return (uint)(g_FastPos[pos >> 16] + 32); return (uint)(g_FastPos[pos >> 26] + 52); } @@ -367,7 +388,9 @@ private uint GetPureRepPrice(uint repIndex, Base.State state, uint posState) { price = _isRepG0[state.Index].GetPrice1(); if (repIndex == 1) + { price += _isRepG1[state.Index].GetPrice0(); + } else { price += _isRepG1[state.Index].GetPrice1(); @@ -388,7 +411,7 @@ private uint GetPosLenPrice(uint pos, uint len, uint posState) uint price; uint lenToPosState = Base.GetLenToPosState(len); if (pos < Base.kNumFullDistances) - price = _distancesPrices[(lenToPosState * Base.kNumFullDistances) + pos]; + price = _distancesPrices[lenToPosState * Base.kNumFullDistances + pos]; else price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + _alignPrices[pos & Base.kAlignMask]; @@ -495,7 +518,7 @@ private uint GetOptimum(uint position, out uint backRes) _optimum[0].State = _state; - uint posState = (position & _posStateMask); + uint posState = position & _posStateMask; _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + _literalEncoder.GetSubCoder(position, _previousByte) @@ -515,7 +538,7 @@ private uint GetOptimum(uint position, out uint backRes) } } - uint lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); + uint lenEnd = lenMain >= repLens[repMaxIndex] ? lenMain : repLens[repMaxIndex]; if (lenEnd < 2) { @@ -532,7 +555,9 @@ private uint GetOptimum(uint position, out uint backRes) uint len = lenEnd; do - _optimum[len--].Price = kIfinityPrice; while (len >= 2); + { + _optimum[len--].Price = kIfinityPrice; + } while (len >= 2); for (i = 0; i < Base.kNumRepDistances; i++) { @@ -556,7 +581,7 @@ private uint GetOptimum(uint position, out uint backRes) uint normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); - len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + len = repLens[0] >= 2 ? repLens[0] + 1 : 2; if (len <= lenMain) { uint offs = 0; @@ -614,11 +639,15 @@ private uint GetOptimum(uint position, out uint backRes) state.UpdateMatch(); } else + { state = _optimum[posPrev].State; + } state.UpdateChar(); } else + { state = _optimum[posPrev].State; + } if (posPrev == cur - 1) { if (_optimum[cur].IsShortRep()) @@ -677,7 +706,7 @@ private uint GetOptimum(uint position, out uint backRes) } else { - reps[0] = (pos - Base.kNumRepDistances); + reps[0] = pos - Base.kNumRepDistances; reps[1] = opt.Backs0; reps[2] = opt.Backs1; reps[3] = opt.Backs2; @@ -693,7 +722,7 @@ private uint GetOptimum(uint position, out uint backRes) currentByte = _matchFinder.GetIndexByte(0 - 1); matchByte = _matchFinder.GetIndexByte((int)(0 - reps[0] - 1 - 1)); - posState = (position & _posStateMask); + posState = position & _posStateMask; uint curAnd1Price = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + @@ -753,7 +782,7 @@ private uint GetOptimum(uint position, out uint backRes) while (lenEnd < offset) _optimum[++lenEnd].Price = kIfinityPrice; uint curAndLenPrice = nextRepMatchPrice + GetRepPrice( - 0, lenTest2, state2, posStateNext); + 0, lenTest2, state2, posStateNext); var optimum = _optimum[offset]; if (curAndLenPrice < optimum.Price) { @@ -809,8 +838,8 @@ private uint GetOptimum(uint position, out uint backRes) _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + _literalEncoder.GetSubCoder(position + lenTest, _matchFinder.GetIndexByte((int)lenTest - 1 - 1)).GetPrice(true, - _matchFinder.GetIndexByte((int)lenTest - 1 - (int)(reps[repIndex] + 1)), - _matchFinder.GetIndexByte((int)lenTest - 1)); + _matchFinder.GetIndexByte((int)lenTest - 1 - (int)(reps[repIndex] + 1)), + _matchFinder.GetIndexByte((int)lenTest - 1)); state2.UpdateChar(); posStateNext = (position + lenTest + 1) & _posStateMask; uint nextMatchPrice = curAndLenCharPrice + @@ -883,7 +912,7 @@ private uint GetOptimum(uint position, out uint backRes) uint curAndLenCharPrice = curAndLenPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((int)lenTest - 1 - 1)). + _matchFinder.GetIndexByte((int)lenTest - 1 - 1)). GetPrice(true, _matchFinder.GetIndexByte((int)lenTest - (int)(curBack + 1) - 1), _matchFinder.GetIndexByte((int)lenTest - 1)); @@ -922,7 +951,7 @@ private uint GetOptimum(uint position, out uint backRes) private bool ChangePair(uint smallDist, uint bigDist) { const int kDif = 7; - return (smallDist < ((uint)(1) << (32 - kDif)) && bigDist >= (smallDist << kDif)); + return smallDist < (uint)1 << (32 - kDif) && bigDist >= smallDist << kDif; } private void WriteEndMarker(uint posState) @@ -939,7 +968,7 @@ private void WriteEndMarker(uint posState) uint lenToPosState = Base.GetLenToPosState(len); _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); int footerBits = 30; - uint posReduced = (((uint)1) << footerBits) - 1; + uint posReduced = ((uint)1 << footerBits) - 1; _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); } @@ -983,11 +1012,11 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) } uint len, numDistancePairs; // it's not used ReadMatchDistances(out len, out numDistancePairs); - uint posState = (uint)(nowPos64) & _posStateMask; + uint posState = (uint)nowPos64 & _posStateMask; _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); _state.UpdateChar(); byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); - _literalEncoder.GetSubCoder((uint)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte); + _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte).Encode(_rangeEncoder, curByte); _previousByte = curByte; _additionalOffset--; nowPos64++; @@ -1002,7 +1031,7 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) uint pos; uint len = GetOptimum((uint)nowPos64, out pos); - uint posState = ((uint)nowPos64) & _posStateMask; + uint posState = (uint)nowPos64 & _posStateMask; uint complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState; if (len == 1 && pos == 0xFFFFFFFF) { @@ -1015,7 +1044,9 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); } else + { subCoder.Encode(_rangeEncoder, curByte); + } _previousByte = curByte; _state.UpdateChar(); } @@ -1037,7 +1068,9 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) { _isRepG0[_state.Index].Encode(_rangeEncoder, 1); if (pos == 1) + { _isRepG1[_state.Index].Encode(_rangeEncoder, 0); + } else { _isRepG1[_state.Index].Encode(_rangeEncoder, 1); @@ -1045,7 +1078,9 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) } } if (len == 1) + { _state.UpdateShortRep(); + } else { _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); @@ -1072,12 +1107,14 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) if (posSlot >= Base.kStartPosModelIndex) { int footerBits = (int)((posSlot >> 1) - 1); - uint baseVal = ((2 | (posSlot & 1)) << footerBits); + uint baseVal = (2 | (posSlot & 1)) << footerBits; uint posReduced = pos - baseVal; if (posSlot < Base.kEndPosModelIndex) + { BitTreeEncoder.ReverseEncode(_posEncoders, baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); + } else { _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); @@ -1098,7 +1135,7 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) if (_additionalOffset == 0) { // if (!_fastMode) - if (_matchPriceCount >= (1 << 7)) + if (_matchPriceCount >= 1 << 7) FillDistancesPrices(); if (_alignPriceCount >= Base.kAlignTableSize) FillAlignPrices(); @@ -1110,7 +1147,7 @@ public void CodeOneBlock(out long inSize, out long outSize, out bool finished) return; } - if (nowPos64 - progressPosValuePrev >= (1 << 12)) + if (nowPos64 - progressPosValuePrev >= 1 << 12) { _finished = false; finished = false; @@ -1174,7 +1211,7 @@ private void FillDistancesPrices() { uint posSlot = GetPosSlot(i); int footerBits = (int)((posSlot >> 1) - 1); - uint baseVal = ((2 | (posSlot & 1)) << footerBits); + uint baseVal = (2 | (posSlot & 1)) << footerBits; tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, baseVal - posSlot - 1, footerBits, i - baseVal); } @@ -1184,11 +1221,11 @@ private void FillDistancesPrices() uint posSlot; var encoder = _posSlotEncoder[lenToPosState]; - uint st = (lenToPosState << Base.kNumPosSlotBits); + uint st = lenToPosState << Base.kNumPosSlotBits; for (posSlot = 0; posSlot < _distTableSize; posSlot++) _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << BitEncoder.kNumBitPriceShiftBits); + _posSlotPrices[st + posSlot] += ((posSlot >> 1) - 1 - Base.kNumAlignBits) << BitEncoder.kNumBitPriceShiftBits; uint st2 = lenToPosState * Base.kNumFullDistances; uint i; @@ -1224,7 +1261,7 @@ private enum EMatchFinderType { BT2, BT4 - }; + } private class LiteralEncoder { @@ -1294,8 +1331,8 @@ public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte if (same) { uint matchBit = (uint)((matchByte >> i) & 1); - state += ((1 + matchBit) << 8); - same = (matchBit == bit); + state += (1 + matchBit) << 8; + same = matchBit == bit; } m_Encoders[state].Encode(rangeEncoder, bit); context = (context << 1) | bit; @@ -1308,7 +1345,6 @@ public uint GetPrice(bool matchMode, byte matchByte, byte symbol) uint context = 1; int i = 7; if (matchMode) - { for (; i >= 0; i--) { uint matchBit = (uint)(matchByte >> i) & 1; @@ -1321,7 +1357,6 @@ public uint GetPrice(bool matchMode, byte matchByte, byte symbol) break; } } - } for (; i >= 0; i--) { uint bit = (uint)(symbol >> i) & 1; @@ -1408,7 +1443,7 @@ public void SetPrices(uint posState, uint numSymbols, uint[] prices, uint st) for (; i < numSymbols; i++) prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); } - }; + } private class LenPriceTableEncoder : LenEncoder { @@ -1476,8 +1511,8 @@ public void MakeAsShortRep() public bool IsShortRep() { - return (BackPrev == 0); + return BackPrev == 0; } - }; + } } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs index 5ad4ee8..f586876 100644 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs +++ b/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs @@ -1,10 +1,35 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + using System.IO; namespace Rant.Core.IO.Compression.RangeCoder { internal class Encoder { - public const uint kTopValue = (1 << 24); + public const uint kTopValue = 1 << 24; private byte _cache; private uint _cacheSize; public ulong Low; @@ -69,10 +94,10 @@ public void ShiftLow() Stream.WriteByte((byte)(temp + (Low >> 32))); temp = 0xFF; } while (--_cacheSize != 0); - _cache = (byte)(((uint)Low) >> 24); + _cache = (byte)((uint)Low >> 24); } _cacheSize++; - Low = ((uint)Low) << 8; + Low = (uint)Low << 8; } public void EncodeDirectBits(uint v, int numTotalBits) @@ -94,7 +119,9 @@ public void EncodeBit(uint size0, int numTotalBits, uint symbol) { uint newBound = (Range >> numTotalBits) * size0; if (symbol == 0) + { Range = newBound; + } else { Low += newBound; @@ -117,7 +144,7 @@ public long GetProcessedSizeAdd() internal class Decoder { - public const uint kTopValue = (1 << 24); + public const uint kTopValue = 1 << 24; public uint Code; public uint Range; // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16); diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs index a536924..ee2a926 100644 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs +++ b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs @@ -1,9 +1,34 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + namespace Rant.Core.IO.Compression.RangeCoder { internal struct BitEncoder { public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); + public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; private const int kNumMoveBits = 5; private const int kNumMoveReducingBits = 2; public const int kNumBitPriceShiftBits = 6; @@ -12,7 +37,7 @@ internal struct BitEncoder static BitEncoder() { - const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); + const int kNumBits = kNumBitModelTotalBits - kNumMoveReducingBits; for (int i = kNumBits - 1; i >= 0; i--) { uint start = (uint)1 << (kNumBits - i - 1); @@ -33,7 +58,7 @@ public void UpdateModel(uint symbol) if (symbol == 0) Prob += (kBitModelTotal - Prob) >> kNumMoveBits; else - Prob -= (Prob) >> kNumMoveBits; + Prob -= Prob >> kNumMoveBits; } public void Encode(Encoder encoder, uint symbol) @@ -50,7 +75,7 @@ public void Encode(Encoder encoder, uint symbol) { encoder.Low += newBound; encoder.Range -= newBound; - Prob -= (Prob) >> kNumMoveBits; + Prob -= Prob >> kNumMoveBits; } if (encoder.Range < Encoder.kTopValue) { @@ -61,7 +86,7 @@ public void Encode(Encoder encoder, uint symbol) public uint GetPrice(uint symbol) { - return ProbPrices[(((Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; + return ProbPrices[(((Prob - symbol) ^ -(int)symbol) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; } public uint GetPrice0() @@ -78,7 +103,7 @@ public uint GetPrice1() internal struct BitDecoder { public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); + public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; private const int kNumMoveBits = 5; private uint Prob; @@ -87,7 +112,7 @@ public void UpdateModel(int numMoveBits, uint symbol) if (symbol == 0) Prob += (kBitModelTotal - Prob) >> numMoveBits; else - Prob -= (Prob) >> numMoveBits; + Prob -= Prob >> numMoveBits; } public void Init() @@ -111,7 +136,7 @@ public uint Decode(Decoder rangeDecoder) } rangeDecoder.Range -= newBound; rangeDecoder.Code -= newBound; - Prob -= (Prob) >> kNumMoveBits; + Prob -= Prob >> kNumMoveBits; if (rangeDecoder.Range < Decoder.kTopValue) { rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs index 1577b2f..392dfb5 100644 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs +++ b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs @@ -1,3 +1,28 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + namespace Rant.Core.IO.Compression.RangeCoder { internal struct BitTreeEncoder @@ -13,7 +38,7 @@ public BitTreeEncoder(int numBitLevels) public void Init() { - for (uint i = 1; i < (1 << NumBitLevels); i++) + for (uint i = 1; i < 1 << NumBitLevels; i++) Models[i].Init(); } @@ -111,7 +136,7 @@ public BitTreeDecoder(int numBitLevels) public void Init() { - for (uint i = 1; i < (1 << NumBitLevels); i++) + for (uint i = 1; i < 1 << NumBitLevels; i++) Models[i].Init(); } @@ -132,7 +157,7 @@ public uint ReverseDecode(Decoder rangeDecoder) uint bit = Models[m].Decode(rangeDecoder); m <<= 1; m += bit; - symbol |= (bit << bitIndex); + symbol |= bit << bitIndex; } return symbol; } @@ -147,7 +172,7 @@ public static uint ReverseDecode(BitDecoder[] Models, uint startIndex, uint bit = Models[startIndex + m].Decode(rangeDecoder); m <<= 1; m += bit; - symbol |= (bit << bitIndex); + symbol |= bit << bitIndex; } return symbol; } diff --git a/Rant/Core/IO/EasyReader.cs b/Rant/Core/IO/EasyReader.cs index 2b766c5..b305ae6 100644 --- a/Rant/Core/IO/EasyReader.cs +++ b/Rant/Core/IO/EasyReader.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; @@ -99,9 +124,7 @@ public EasyReader(byte[] data, int startIndex = 0, Endian defaultEndianness = En void IDisposable.Dispose() { if (!_leaveOpen) - { BaseStream.Dispose(); - } } /// @@ -494,9 +517,7 @@ public string[] ReadStringArray() int length = ReadInt32(); var array = new string[length]; for (int i = 0; i < length; i++) - { array[i] = ReadString(); - } return array; } @@ -510,9 +531,7 @@ public EasyReader ReadStringArray(out string[] value) int length = ReadInt32(); var array = new string[length]; for (int i = 0; i < length; i++) - { array[i] = ReadString(); - } value = array; return this; } @@ -527,9 +546,7 @@ public string[] ReadStringArray(Encoding encoding) int length = ReadInt32(); var array = new string[length]; for (int i = 0; i < length; i++) - { array[i] = ReadString(encoding); - } return array; } @@ -544,9 +561,7 @@ public EasyReader ReadStringArray(Encoding encoding, out string[] value) int length = ReadInt32(); var array = new string[length]; for (int i = 0; i < length; i++) - { array[i] = ReadString(encoding); - } value = array; return this; } @@ -563,9 +578,7 @@ public T[] ReadArray(bool use64bit = false) where T : struct long count = use64bit ? ReadInt64() : ReadInt32(); var array = new T[count]; for (int i = 0; i < count; i++) - { array[i] = ReadStruct(isNumeric); - } return array; } @@ -582,9 +595,7 @@ public EasyReader ReadArray(out T[] value, bool use64bit = false) where T : s long count = use64bit ? ReadInt64() : ReadInt32(); var array = new T[count]; for (int i = 0; i < count; i++) - { array[i] = ReadStruct(isNumeric); - } value = array; return this; } @@ -600,9 +611,7 @@ public T[] ReadArray(int length) where T : struct bool isNumeric = IOUtil.IsNumericType(typeof(T)); var array = new T[length]; for (int i = 0; i < length; i++) - { array[i] = ReadStruct(isNumeric); - } return array; } @@ -618,9 +627,7 @@ public EasyReader ReadArray(int length, out T[] value) where T : struct bool isNumeric = IOUtil.IsNumericType(typeof(T)); var array = new T[length]; for (int i = 0; i < length; i++) - { array[i] = ReadStruct(isNumeric); - } value = array; return this; } @@ -641,13 +648,9 @@ public Dictionary ReadDictionary() bool vIsString = vtype == typeof(string); if (!ktype.IsValueType && !kIsString) - { throw new ArgumentException("TKey must be either a value type or System.String."); - } if (!vtype.IsValueType && !vIsString) - { throw new ArgumentException("TValue must be either a value type or System.String."); - } bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); @@ -658,22 +661,14 @@ public Dictionary ReadDictionary() for (int i = 0; i < count; i++) { if (kIsString) - { - key = (TKey)((object)ReadString()); - } + key = (TKey)(object)ReadString(); else - { key = ReadStruct(isKNumeric); - } if (vIsString) - { - value = (TValue)((object)ReadString()); - } + value = (TValue)(object)ReadString(); else - { value = ReadStruct(isVNumeric); - } dict.Add(key, value); } @@ -703,9 +698,7 @@ public EasyReader ReadDictionary(out Dictionary valu public TEnum ReadEnum() where TEnum : struct, IConvertible { if (!typeof(TEnum).IsEnum) - { throw new ArgumentException("T must be an enumerated type."); - } byte size = (byte)Marshal.SizeOf(Enum.GetUnderlyingType(typeof(TEnum))); var data = ReadAndFormat(size); Array.Resize(ref data, 8); @@ -733,9 +726,7 @@ public EasyReader ReadEnum(out TEnum value) where TEnum : struct, IConver public TStruct ReadStruct(bool convertEndian = true) { if (!typeof(TStruct).IsValueType) - { throw new ArgumentException("TStruct must be a value type."); - } int size = Marshal.SizeOf(typeof(TStruct)); bool numeric = IOUtil.IsNumericType(typeof(TStruct)); var data = numeric ? ReadAndFormat(size) : ReadBytes(size); @@ -744,9 +735,7 @@ public TStruct ReadStruct(bool convertEndian = true) var i = (TStruct)Marshal.PtrToStructure(ptr, typeof(TStruct)); if (convertEndian) - { IOUtil.ConvertStructEndians(ref i); - } Marshal.FreeHGlobal(ptr); return i; @@ -779,9 +768,7 @@ public EasyReader ReadStruct(out TStruct value, bool convertEndian = tr T? value = null; bool hasValue = ReadBoolean(); if (hasValue) - { value = ReadStruct(); - } return value; } @@ -796,9 +783,7 @@ public EasyReader ReadNullable(out T? value) where T : struct value = null; bool hasValue = ReadBoolean(); if (hasValue) - { value = ReadStruct(); - } return this; } @@ -830,16 +815,10 @@ public EasyReader ReadBitField(int sizeInBytes, out BitField value) private byte[] ReadAndFormat(int count) { if (BitConverter.IsLittleEndian != (Endianness == Endian.Little)) - { for (int i = 0; i < count; i++) - { BaseStream.Read(_buffer, count - i - 1, 1); - } - } else - { BaseStream.Read(_buffer, 0, count); - } return _buffer; } diff --git a/Rant/Core/IO/EasyWriter.cs b/Rant/Core/IO/EasyWriter.cs index 2f1ef16..fb88281 100644 --- a/Rant/Core/IO/EasyWriter.cs +++ b/Rant/Core/IO/EasyWriter.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; @@ -86,9 +111,7 @@ public long Length public void Dispose() { if (!_leaveOpen) - { BaseStream.Dispose(); - } } /// @@ -298,9 +321,7 @@ public EasyWriter Write(string[] value) int count = value.Length; Write(count); foreach (string str in value) - { Write(str); - } return this; } @@ -314,9 +335,7 @@ public EasyWriter Write(string[] value, Encoding encoding) int count = value.Length; Write(count); foreach (string str in value) - { Write(str, encoding); - } return this; } @@ -331,21 +350,13 @@ public EasyWriter WriteArray(T[] array, bool prefixLength = false, bool use64 { bool isNumeric = IOUtil.IsNumericType(typeof(T)); if (prefixLength) - { if (use64bit) - { Write(array.LongLength); - } else - { Write(array.Length); - } - } foreach (var item in array) - { Write(item, isNumeric); - } return this; } @@ -373,13 +384,9 @@ public EasyWriter Write(Dictionary value) bool vIsString = vtype == typeof(string); if (!ktype.IsValueType && !kIsString) - { throw new ArgumentException("TKey must be either a value type or System.String."); - } if (!vtype.IsValueType && !vIsString) - { throw new ArgumentException("TValue must be either a value type or System.String."); - } Write(value.Count); @@ -389,22 +396,14 @@ public EasyWriter Write(Dictionary value) foreach (var pair in value) { if (kIsString) - { Write(pair.Key.ToString()); - } else - { Write(pair.Key, isKNumeric); - } if (vIsString) - { Write(pair.Value.ToString()); - } else - { Write(pair.Value, isVNumeric); - } } return this; } @@ -418,9 +417,7 @@ public EasyWriter Write(Dictionary value) public EasyWriter Write(TStruct value, bool convertEndian = true) { if (!typeof(TStruct).IsValueType) - { throw new ArgumentException("TStruct must be a value type."); - } var type = typeof(TStruct); int size = type.IsEnum ? Marshal.SizeOf(Enum.GetUnderlyingType(type)) : Marshal.SizeOf(value); @@ -442,9 +439,7 @@ public EasyWriter Write(TStruct value, bool convertEndian = true) Marshal.Copy(ptr, data, 0, size); if (convertEndian && (IOUtil.IsNumericType(type) || type.IsEnum)) - { IOUtil.ConvertEndian(data, Endianness); - } Marshal.FreeHGlobal(ptr); BaseStream.Write(data, 0, size); @@ -473,9 +468,7 @@ public EasyWriter Write(T? value) bool hasValue = value.HasValue; Write(hasValue); if (hasValue) - { Write(value.Value); - } return this; } diff --git a/Rant/Core/IO/Endian.cs b/Rant/Core/IO/Endian.cs index 9be77b7..0fe06a0 100644 --- a/Rant/Core/IO/Endian.cs +++ b/Rant/Core/IO/Endian.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.IO +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.IO { /// /// Indicates byte ordering of binary fields. diff --git a/Rant/Core/IO/EndiannessAttribute.cs b/Rant/Core/IO/EndiannessAttribute.cs index 50d1389..ca7f2b7 100644 --- a/Rant/Core/IO/EndiannessAttribute.cs +++ b/Rant/Core/IO/EndiannessAttribute.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; namespace Rant.Core.IO { diff --git a/Rant/Core/IO/IOExtensions.cs b/Rant/Core/IO/IOExtensions.cs index 6720e79..0d0e7d9 100644 --- a/Rant/Core/IO/IOExtensions.cs +++ b/Rant/Core/IO/IOExtensions.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.IO +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.IO { internal static class IOExtensions { diff --git a/Rant/Core/IO/IOUtil.cs b/Rant/Core/IO/IOUtil.cs index 2a64a7c..7a797a7 100644 --- a/Rant/Core/IO/IOUtil.cs +++ b/Rant/Core/IO/IOUtil.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Reflection; using System.Runtime.InteropServices; @@ -15,8 +40,8 @@ public static int NumberOfSetBits(uint i) public static bool EndianConvertNeeded(Endian endianness) { - return (BitConverter.IsLittleEndian && endianness == Endian.Big) || - (!BitConverter.IsLittleEndian && endianness == Endian.Little); + return BitConverter.IsLittleEndian && endianness == Endian.Big || + !BitConverter.IsLittleEndian && endianness == Endian.Little; } public static bool IsNumericType(Type t) @@ -49,30 +74,23 @@ public static bool IsNumericType(Type t) public static void ConvertEndian(byte[] data, Endian dataEndianness) { if (BitConverter.IsLittleEndian != (dataEndianness == Endian.Little)) - { Array.Reverse(data); - } } public static void ConvertStructEndians(ref TStruct o) { if (!typeof(TStruct).IsValueType) - { throw new ArgumentException("TStruct must be a value type."); - } object boxed = o; foreach (var field in typeof(TStruct).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) - ) + ) { var ftype = field.FieldType; if (!IsNumericType(ftype)) - { continue; - } var attrs = field.GetCustomAttributes(true); foreach (var attr in attrs) - { if (attr.GetType() == typeof(EndiannessAttribute)) { var endian = ((EndiannessAttribute)attr).Endian; @@ -104,7 +122,6 @@ public static void ConvertStructEndians(ref TStruct o) } break; // Go to the next field. } - } } } } diff --git a/Rant/Core/ObjectModel/ObjectStack.cs b/Rant/Core/ObjectModel/ObjectStack.cs index fc52aa4..753e75b 100644 --- a/Rant/Core/ObjectModel/ObjectStack.cs +++ b/Rant/Core/ObjectModel/ObjectStack.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.Utilities; @@ -36,13 +61,9 @@ public RantObject this[string name] if (value == null) { if (_level == 0) - { _table.Globals.Remove(name); - } else - { CurrentLocals.Remove(name); - } return; } @@ -66,9 +87,7 @@ public RantObject this[string name] public void EnterScope() { if (++_level >= _scopes.Count) - { _scopes.Add(new HashSet()); - } } public void ExitScope() @@ -76,9 +95,7 @@ public void ExitScope() if (_level == 0) return; var garbage = _scopes[--_level]; foreach (string name in garbage) - { CurrentLocals.Remove(name); - } garbage.Clear(); } diff --git a/Rant/Core/ObjectModel/ObjectTable.cs b/Rant/Core/ObjectModel/ObjectTable.cs index 4a687f0..f6327cb 100644 --- a/Rant/Core/ObjectModel/ObjectTable.cs +++ b/Rant/Core/ObjectModel/ObjectTable.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.Utilities; diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index 57cd77c..d4a8fff 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; @@ -356,9 +381,7 @@ public RantObject Clone() var sb = new StringBuilder(); int c = (int)b._number; for (int i = 0; i < c; i++) - { sb.Append(a._string); - } return new RantObject(sb.ToString()); } } diff --git a/Rant/Core/ObjectModel/RantObjectType.cs b/Rant/Core/ObjectModel/RantObjectType.cs index 6b2d7c2..99b718f 100644 --- a/Rant/Core/ObjectModel/RantObjectType.cs +++ b/Rant/Core/ObjectModel/RantObjectType.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.ObjectModel +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.ObjectModel { /// /// Defines object types used by Rant. diff --git a/Rant/Core/Output/ChannelVisibility.cs b/Rant/Core/Output/ChannelVisibility.cs index ec3b21f..d2b43db 100644 --- a/Rant/Core/Output/ChannelVisibility.cs +++ b/Rant/Core/Output/ChannelVisibility.cs @@ -1,4 +1,29 @@ -using Rant.Metadata; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Metadata; namespace Rant.Core.Output { diff --git a/Rant/Core/Output/OutputChain.cs b/Rant/Core/Output/OutputChain.cs index c3db89f..994db77 100644 --- a/Rant/Core/Output/OutputChain.cs +++ b/Rant/Core/Output/OutputChain.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Text; namespace Rant.Core.Output @@ -40,15 +65,9 @@ public void InsertTarget(string targetName) // Check if the buffer was already created OutputChainBuffer buffer; if (!targets.TryGetValue(targetName, out buffer)) - { - // If not, make a new one and insert it buffer = targets[targetName] = AddBuffer(); - } else - { - // If it does exist, just create a new instance of it with the same buffer and add it in. Last = new OutputChainBuffer(sandbox, Last, buffer); - } // Then add an empty buffer after it so we don't start printing onto the target. AddBuffer(); @@ -58,9 +77,7 @@ public void PrintToTarget(string targetName, string value) { OutputChainBuffer buffer; if (!targets.TryGetValue(targetName, out buffer)) - { buffer = targets[targetName] = new OutputChainBuffer(sandbox, null); - } buffer.Print(value); } @@ -69,9 +86,7 @@ public void ClearTarget(string targetName) { OutputChainBuffer buffer; if (targets.TryGetValue(targetName, out buffer)) - { buffer.Clear(); - } } public string GetTargetValue(string targetName) diff --git a/Rant/Core/Output/OutputChainArticleBuffer.cs b/Rant/Core/Output/OutputChainArticleBuffer.cs index a05e120..bd14a3d 100644 --- a/Rant/Core/Output/OutputChainArticleBuffer.cs +++ b/Rant/Core/Output/OutputChainArticleBuffer.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -10,15 +35,15 @@ internal class OutputChainArticleBuffer : OutputChainBuffer new HashSet(new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', 'é', 'É' }); private static readonly string[] ignorePrefixes = - { "uni", "use", "uri", "urol", "U.", "one", "uvu", "eul", "euk", "eur" }; + { "uni", "use", "uri", "urol", "U.", "one", "uvu", "eul", "euk", "eur" }; private static readonly string[] allowPrefixes = - { "honest", "honor", "hour", "8" }; + { "honest", "honor", "hour", "8" }; private static readonly string[] ignoreWords = { "u" }; private static readonly string[] allowWords = - { "f", "fbi", "fcc", "fda", "x", "l", "m", "n", "s", "h" }; + { "f", "fbi", "fcc", "fda", "x", "l", "m", "n", "s", "h" }; public OutputChainArticleBuffer(Sandbox sb, OutputChainBuffer prev) : base(sb, prev) { @@ -73,11 +98,11 @@ private static bool CheckRules(string value) { if (string.IsNullOrEmpty(value)) return false; return - (allowWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase)) - || allowPrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase))) - || (vowels.Contains(value[0]) - && !ignorePrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase)) - && !ignoreWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase))); + allowWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase)) + || allowPrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase)) + || vowels.Contains(value[0]) + && !ignorePrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase)) + && !ignoreWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase)); } } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputChainBuffer.cs b/Rant/Core/Output/OutputChainBuffer.cs index 0721422..cd61955 100644 --- a/Rant/Core/Output/OutputChainBuffer.cs +++ b/Rant/Core/Output/OutputChainBuffer.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Text; @@ -113,7 +138,7 @@ public void Print(object value) { str = value.ToString(); } - + Format(ref str); _buffer.Append(str); PrintedSinceCapsChange = true; @@ -160,9 +185,7 @@ protected void Format(ref string value) ? _buffer[_buffer.Length - 1] : Prev?.LastChar ?? '\0'; if (char.IsWhiteSpace(lastChar) || _wordSepChars.Contains(lastChar) || lastChar == '\0') - { CapitalizeFirstLetter(ref value); - } } break; case Capitalization.Sentence: @@ -176,7 +199,7 @@ protected void Format(ref string value) if (_buffer.Length == 0) { // Check if we're at the start - if (Prev == null || (Prev.Prev == null && Prev.Length == 0)) + if (Prev == null || Prev.Prev == null && Prev.Length == 0) { CapitalizeFirstLetter(ref value); break; @@ -221,7 +244,6 @@ protected static void CapitalizeSentences(ref string value) var sb = new StringBuilder(); bool capitalize = false; foreach (char c in value) - { if (capitalize && char.IsLetter(c)) { sb.Append(char.ToUpperInvariant(c)); @@ -232,7 +254,6 @@ protected static void CapitalizeSentences(ref string value) if (_sentenceTerminators.Contains(c)) capitalize = true; sb.Append(c); } - } value = sb.ToString(); } @@ -258,15 +279,12 @@ protected static bool CapitalizeTitleString(ref string value, RantFormat format, var titleBuffer = new StringBuilder(value.Length); bool first = true; foreach (char c in value) - { if (char.IsWhiteSpace(c)) { if (wordBuffer.Length > 0) { - if ((first && capitalizeFirstLetter) || !format.Excludes(wordBuffer.ToString())) - { + if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); - } first = false; titleBuffer.Append(wordBuffer); wordBuffer.Length = 0; @@ -277,13 +295,10 @@ protected static bool CapitalizeTitleString(ref string value, RantFormat format, { wordBuffer.Append(c); } - } if (wordBuffer.Length > 0) { - if ((first && capitalizeFirstLetter) || !format.Excludes(wordBuffer.ToString())) - { + if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); - } titleBuffer.Append(wordBuffer); } value = titleBuffer.ToString(); diff --git a/Rant/Core/Output/OutputWriter.cs b/Rant/Core/Output/OutputWriter.cs index c13088a..f57326f 100644 --- a/Rant/Core/Output/OutputWriter.cs +++ b/Rant/Core/Output/OutputWriter.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using Rant.Core.Formatting; @@ -33,13 +58,9 @@ public void OpenChannel(string name, ChannelVisibility visibility) { OutputChain chain; if (!chains.TryGetValue(name, out chain)) - { chain = chains[name] = new OutputChain(sandbox, name); - } else if (activeChains.Contains(chain)) - { return; - } chain.Visibility = visibility; chainStack.Push(chain); activeChains.Add(chain); @@ -57,9 +78,7 @@ public void Do(Action chainAction) case ChannelVisibility.Public: if (fInternal) return; if (chain != mainChain) - { chainAction(mainChain); - } return; case ChannelVisibility.Private: return; diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index e74c72e..057523c 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -27,8 +52,8 @@ internal class Sandbox private readonly BlockManager _blockManager; private readonly Stack _outputs; private readonly Stopwatch _stopwatch; - private int _quoteLevel = 0; private bool _plural = false; + private int _quoteLevel = 0; /// /// Gets the currently loaded modules. diff --git a/Rant/Core/Utilities/Extensions.cs b/Rant/Core/Utilities/Extensions.cs index 9bd45c4..c178965 100644 --- a/Rant/Core/Utilities/Extensions.cs +++ b/Rant/Core/Utilities/Extensions.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; namespace Rant.Core.Utilities { @@ -6,12 +31,12 @@ internal static class Extensions { public static ulong RotL(this ulong data, int times) { - return (data << (times % 64)) | (data >> (64 - (times % 64))); + return (data << (times % 64)) | (data >> (64 - times % 64)); } public static ulong RotR(this ulong data, int times) { - return (data >> (times % 64)) | (data << (64 - (times % 64))); + return (data >> (times % 64)) | (data << (64 - times % 64)); } public static long Hash(this string input) diff --git a/Rant/Core/Utilities/Limit.cs b/Rant/Core/Utilities/Limit.cs index a262ee9..1a265bb 100644 --- a/Rant/Core/Utilities/Limit.cs +++ b/Rant/Core/Utilities/Limit.cs @@ -1,4 +1,29 @@ -namespace Rant.Core.Utilities +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Core.Utilities { internal sealed class Limit { diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index 9bf0935..8ad2c8e 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -22,7 +47,6 @@ public static bool IsUppercase(string sample) int longest = 0; int curLength = 0; for (int i = 0; i < sample.Length; i++) - { if (char.IsUpper(sample[i])) { if (++curLength > longest) longest++; @@ -31,7 +55,6 @@ public static bool IsUppercase(string sample) { curLength = 0; } - } return longest > 1; } @@ -137,20 +160,12 @@ public static string SnakeToCamel(string name) if (string.IsNullOrEmpty(name)) return name; var sb = new StringBuilder(); for (int i = 0; i < name.Length; i++) - { if (i == 0) - { sb.Append(char.ToUpper(name[i])); - } else if ((name[i] == '_' || name[i] == '-') && i + 1 < name.Length) - { sb.Append(char.ToUpper(name[++i])); - } else - { sb.Append(char.ToLower(name[i])); - } - } return sb.ToString(); } @@ -166,7 +181,7 @@ public static string CamelToSnake(string camelName) { a = char.IsUpper(name[i]); b = char.IsUpper(name[i + 1]); - if ((last && a && !b)) sb.Append('-'); + if (last && a && !b) sb.Append('-'); sb.Append(char.ToLower(name[i])); if (!a && b) sb.Append('-'); last = a; @@ -201,7 +216,7 @@ public static string Alt(string input, string alternate) return string.IsNullOrEmpty(input) ? alternate : input; } - public static int Mod(int a, int b) => ((a % b) + b) % b; + public static int Mod(int a, int b) => (a % b + b) % b; #if !UNITY [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif diff --git a/Rant/Core/Utilities/Witchcraft.cs b/Rant/Core/Utilities/Witchcraft.cs index df7a41d..ecf4474 100644 --- a/Rant/Core/Utilities/Witchcraft.cs +++ b/Rant/Core/Utilities/Witchcraft.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -64,16 +89,10 @@ static Witchcraft() var lstFuncTypes = new List(); var lstVoidTypes = new List(); foreach (var type in ass.GetTypes().Where(t => t.IsSubclassOf(typeof(Witchcraft)) && t.IsGenericTypeDefinition)) - { if (type.IsSubclassOf(typeof(WitchcraftVoid))) - { lstVoidTypes.Add(type); - } else - { lstFuncTypes.Add(type); - } - } _funcTypes = lstFuncTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); _voidTypes = lstVoidTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); @@ -93,9 +112,7 @@ public static Witchcraft Create(MethodInfo methodInfo) if (argTypes.Length == 0) { if (isVoid) - { return new WitchcraftNoParamsVoid(methodInfo); - } return new WitchcraftNoParams(methodInfo); } diff --git a/Rant/Formats/EnglishPluralizer.cs b/Rant/Formats/EnglishPluralizer.cs index d8104c8..8fb3bf5 100644 --- a/Rant/Formats/EnglishPluralizer.cs +++ b/Rant/Formats/EnglishPluralizer.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -13,7 +38,7 @@ public sealed class EnglishPluralizer : Pluralizer { private static readonly HashSet consonants = new HashSet(new[] - { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z' }); + { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z' }); private static readonly HashSet hardConsonants = new HashSet(new[] { 'b', 'c', 'd', 'f', 'g', 'j', 'm', 'q', 's', 'v', 'x', 'z' }); diff --git a/Rant/Formats/Pluralizer.cs b/Rant/Formats/Pluralizer.cs index 76a537a..509aaff 100644 --- a/Rant/Formats/Pluralizer.cs +++ b/Rant/Formats/Pluralizer.cs @@ -1,4 +1,29 @@ -namespace Rant.Formats +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Formats { /// /// The base class for pluralizers, which infer the plural form of a given noun. diff --git a/Rant/Formats/RantFormat.cs b/Rant/Formats/RantFormat.cs index d25f4bf..5b108a5 100644 --- a/Rant/Formats/RantFormat.cs +++ b/Rant/Formats/RantFormat.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -165,10 +190,10 @@ public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, public IEnumerable Letters => LettersInternal.AsEnumerable(); internal char[] LettersInternal { get; } = - { - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' - }; + { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' + }; /// /// The standard space character used in automated formatting, such as series. diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index 4dccfb5..b4cba01 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Globalization; using System.IO; @@ -74,7 +99,7 @@ private static void LoadStringTableData(string lang, Stream stream, Dictionary table; if (!_languages.TryGetValue(_langName, out table)) - { using ( var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{_langName}.lang")) @@ -155,7 +179,6 @@ private static void CheckLanguage() table = new Dictionary(); LoadStringTableData(_langName, stream, table); } - } _currentTable = table; } catch (Exception ex) diff --git a/Rant/Metadata/IRantFunction.cs b/Rant/Metadata/IRantFunction.cs index 6011579..77e31c5 100644 --- a/Rant/Metadata/IRantFunction.cs +++ b/Rant/Metadata/IRantFunction.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; namespace Rant.Metadata { diff --git a/Rant/Metadata/IRantFunctionGroup.cs b/Rant/Metadata/IRantFunctionGroup.cs index ffc860c..f948cb7 100644 --- a/Rant/Metadata/IRantFunctionGroup.cs +++ b/Rant/Metadata/IRantFunctionGroup.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; namespace Rant.Metadata { diff --git a/Rant/Metadata/IRantModeValue.cs b/Rant/Metadata/IRantModeValue.cs index 6036520..16b49eb 100644 --- a/Rant/Metadata/IRantModeValue.cs +++ b/Rant/Metadata/IRantModeValue.cs @@ -1,4 +1,29 @@ -namespace Rant.Metadata +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Metadata { /// /// Provides information on Rant's mode values, like number formats and synchronizer types. diff --git a/Rant/Metadata/IRantParameter.cs b/Rant/Metadata/IRantParameter.cs index cd3ba92..44ee56f 100644 --- a/Rant/Metadata/IRantParameter.cs +++ b/Rant/Metadata/IRantParameter.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.Framework; diff --git a/Rant/Metadata/RantDescriptionAttribute.cs b/Rant/Metadata/RantDescriptionAttribute.cs index 992285b..7946eee 100644 --- a/Rant/Metadata/RantDescriptionAttribute.cs +++ b/Rant/Metadata/RantDescriptionAttribute.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; namespace Rant.Metadata { diff --git a/Rant/Metadata/RantFunctionAttribute.cs b/Rant/Metadata/RantFunctionAttribute.cs index fa58882..17de76f 100644 --- a/Rant/Metadata/RantFunctionAttribute.cs +++ b/Rant/Metadata/RantFunctionAttribute.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; namespace Rant.Metadata { diff --git a/Rant/Metadata/RantModeValue.cs b/Rant/Metadata/RantModeValue.cs index 4974ab7..4d23e06 100644 --- a/Rant/Metadata/RantModeValue.cs +++ b/Rant/Metadata/RantModeValue.cs @@ -1,3 +1,28 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + namespace Rant.Metadata { internal class RantModeValue : IRantModeValue diff --git a/Rant/Properties/AssemblyInfo.cs b/Rant/Properties/AssemblyInfo.cs index d8c987e..b1467fd 100644 --- a/Rant/Properties/AssemblyInfo.cs +++ b/Rant/Properties/AssemblyInfo.cs @@ -1,4 +1,29 @@ -using System.Reflection; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/Rant/RNG.cs b/Rant/RNG.cs index dd71dff..11b725d 100644 --- a/Rant/RNG.cs +++ b/Rant/RNG.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Runtime.InteropServices; @@ -178,13 +203,11 @@ public static long GetRaw(long s, long g) { _hashState.Init(s, g); for (int i = 0; i < 8; i++) - { _hashState.HashUnsigned = (_hashState.HashUnsigned + 31 * Table[((_hashState.Seed ^ _hashState.HashUnsigned) >> (i * 8)) & 0xff].RotR(i) + 47 * Table[((_hashState.Generation ^ _hashState.HashUnsigned) >> (i * 8)) & 0xff].RotL(i) + 11) * 6364136223846793005; - } return _hashState.HashSigned; } } diff --git a/Rant/RantArgAttribute.cs b/Rant/RantArgAttribute.cs index 8504d2c..a35677e 100644 --- a/Rant/RantArgAttribute.cs +++ b/Rant/RantArgAttribute.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; namespace Rant { diff --git a/Rant/RantCompilerException.cs b/Rant/RantCompilerException.cs index 0bafca7..baf7c72 100644 --- a/Rant/RantCompilerException.cs +++ b/Rant/RantCompilerException.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/Rant/RantCompilerMessage.cs b/Rant/RantCompilerMessage.cs index 6032683..9cbe121 100644 --- a/Rant/RantCompilerMessage.cs +++ b/Rant/RantCompilerMessage.cs @@ -1,4 +1,29 @@ -using static Rant.Localization.Txtres; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using static Rant.Localization.Txtres; namespace Rant { diff --git a/Rant/RantCompilerMessageType.cs b/Rant/RantCompilerMessageType.cs index dd1b375..ea78466 100644 --- a/Rant/RantCompilerMessageType.cs +++ b/Rant/RantCompilerMessageType.cs @@ -1,4 +1,29 @@ -namespace Rant +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant { /// /// Defines message types used by the Rant compiler. diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index e81d7a9..d9d9e43 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Runtime.CompilerServices; @@ -398,7 +423,7 @@ public RantOutput Do(RantProgram input, RNG rng, int charLimit = 0, double timeo /// public IEnumerable DoSerial(RantProgram input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -414,7 +439,7 @@ public IEnumerable DoSerial(RantProgram input, int charLimit = 0, do /// public IEnumerable DoSerial(RantProgram input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -430,7 +455,7 @@ public IEnumerable DoSerial(RantProgram input, long seed, int charLi /// public IEnumerable DoSerial(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -445,8 +470,8 @@ public IEnumerable DoSerial(RantProgram input, RNG rng, int charLimi /// public IEnumerable DoSerial(string input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), - args).RunSerial(timeout); + new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), + args).RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -462,8 +487,8 @@ public IEnumerable DoSerial(string input, int charLimit = 0, double /// public IEnumerable DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args) - .RunSerial(timeout); + new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args) + .RunSerial(timeout); /// /// Executes the specified pattern and returns a series of outputs. @@ -479,7 +504,7 @@ public IEnumerable DoSerial(string input, long seed, int charLimit = /// public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); /// /// Executes a pattern that has been loaded from a package and returns the resulting output. diff --git a/Rant/RantInternalException.cs b/Rant/RantInternalException.cs index b924663..4d7c3d1 100644 --- a/Rant/RantInternalException.cs +++ b/Rant/RantInternalException.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; namespace Rant { diff --git a/Rant/RantOutput.cs b/Rant/RantOutput.cs index bca26be..c26d0f2 100644 --- a/Rant/RantOutput.cs +++ b/Rant/RantOutput.cs @@ -1,4 +1,29 @@ -using System.Collections; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections; using System.Collections.Generic; using System.Linq; @@ -55,13 +80,9 @@ public string[] this[params string[] channels] } RantOutputEntry value; if (_outputs.TryGetValue(channels[i], out value)) - { channels[i] = value.Value; - } else - { channels[i] = string.Empty; - } } return channels; } diff --git a/Rant/RantOutputEntry.cs b/Rant/RantOutputEntry.cs index 840a48d..5ddccba 100644 --- a/Rant/RantOutputEntry.cs +++ b/Rant/RantOutputEntry.cs @@ -1,4 +1,29 @@ -using Rant.Core.Output; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Core.Output; namespace Rant { diff --git a/Rant/RantProgram.cs b/Rant/RantProgram.cs index 051d90f..7f8cccb 100644 --- a/Rant/RantProgram.cs +++ b/Rant/RantProgram.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/Rant/RantProgramArgs.cs b/Rant/RantProgramArgs.cs index 868e2d5..8702c17 100644 --- a/Rant/RantProgramArgs.cs +++ b/Rant/RantProgramArgs.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -42,13 +67,9 @@ internal RantProgramArgs(object value) if ((attrName = prop.GetCustomAttributes().FirstOrDefault()) != null) #endif - { map[attrName.Name] = prop; - } else - { map[prop.Name] = prop; - } } } diff --git a/Rant/RantProgramOrigin.cs b/Rant/RantProgramOrigin.cs index fcc9f89..56ff8bd 100644 --- a/Rant/RantProgramOrigin.cs +++ b/Rant/RantProgramOrigin.cs @@ -1,4 +1,29 @@ -namespace Rant +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant { /// /// Indicates the manner in which a referenced code source was created. diff --git a/Rant/RantRuntimeException.cs b/Rant/RantRuntimeException.cs index 32bd1d9..087f94a 100644 --- a/Rant/RantRuntimeException.cs +++ b/Rant/RantRuntimeException.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Core.Compiler; using Rant.Core.Compiler.Syntax; @@ -15,8 +40,8 @@ public sealed class RantRuntimeException : Exception internal RantRuntimeException(RantProgram source, LineCol token, string errorMessageType = "err-generic-runtime", params object[] errorArgs) : base((token.Index != -1 - ? ($"{GetString("src-line-col", source.Name, token.Line, token.Column)} ") - : $"({source.Name}) ") + GetString(errorMessageType, errorArgs)) + ? $"{GetString("src-line-col", source.Name, token.Line, token.Column)} " + : $"({source.Name}) ") + GetString(errorMessageType, errorArgs)) { Code = source.Code; Line = token.Line; @@ -29,7 +54,7 @@ internal RantRuntimeException(RantProgram source, RST rst, string errorMessageTy : base(rst == null ? $"({source.Name}) {GetString(errorMessageType, errorArgs)}" : $"{GetString("src-line-col", source.Name, rst.Location.Line, rst.Location.Column)} {GetString(errorMessageType, errorArgs)}" - ) + ) { Code = source.Code; Line = rst?.Location.Line ?? 0; diff --git a/Rant/RantUtils.cs b/Rant/RantUtils.cs index 911aa6b..75f46b2 100644 --- a/Rant/RantUtils.cs +++ b/Rant/RantUtils.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.Framework; using Rant.Metadata; diff --git a/Rant/Resources/RantDependencyResolver.cs b/Rant/Resources/RantDependencyResolver.cs index dadaa4c..1ae6b93 100644 --- a/Rant/Resources/RantDependencyResolver.cs +++ b/Rant/Resources/RantDependencyResolver.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; @@ -39,7 +64,7 @@ public virtual bool TryResolvePackage(RantPackageDependency depdendency, out Ran var match = FallbackRegex.Match(Path.GetFileNameWithoutExtension(p)); if (!match.Success) return false; version = RantPackageVersion.Parse(match.Groups["version"].Value); - return (depdendency.AllowNewer && version >= depdendency.Version) || depdendency.Version == version; + return depdendency.AllowNewer && version >= depdendency.Version || depdendency.Version == version; }); if (path == null) return false; } @@ -47,7 +72,7 @@ public virtual bool TryResolvePackage(RantPackageDependency depdendency, out Ran { var pkg = RantPackage.Load(path); if (pkg.ID != depdendency.ID) return false; - if ((depdendency.AllowNewer && pkg.Version >= depdendency.Version) || pkg.Version == depdendency.Version) + if (depdendency.AllowNewer && pkg.Version >= depdendency.Version || pkg.Version == depdendency.Version) { package = pkg; return true; diff --git a/Rant/Resources/RantModule.cs b/Rant/Resources/RantModule.cs index 57330e3..b6382fc 100644 --- a/Rant/Resources/RantModule.cs +++ b/Rant/Resources/RantModule.cs @@ -1,4 +1,29 @@ -using Rant.Core.Compiler; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using Rant.Core.Compiler; using Rant.Core.Compiler.Syntax; using Rant.Core.ObjectModel; @@ -34,9 +59,9 @@ public RantModule(string name) /// The pattern that will make up the body of the function. public void AddSubroutineFunction(string name, RantProgram pattern) { - var action = (pattern.SyntaxTree.GetType() == typeof(RstSequence) + var action = pattern.SyntaxTree.GetType() == typeof(RstSequence) ? ((RstSequence)pattern.SyntaxTree).Actions[0] - : pattern.SyntaxTree); + : pattern.SyntaxTree; if (action.GetType() != typeof(RstDefineSubroutine)) throw new RantRuntimeException(pattern, LineCol.Unknown, "Attempted to add non-subroutine pattern to a module."); diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 336b01e..cdfd66e 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -220,9 +245,7 @@ public void Save( BsonStringTableMode stringTableMode = BsonStringTableMode.None) { if (string.IsNullOrEmpty(Path.GetExtension(path))) - { path += EXTENSION; - } using (var writer = new EasyWriter(File.Create(path))) { @@ -310,7 +333,6 @@ public static RantPackage Load(Stream source) var deps = info["dependencies"]; if (deps != null && deps.IsArray) - { for (int i = 0; i < deps.Count; i++) { var dep = deps[i]; @@ -322,7 +344,6 @@ public static RantPackage Load(Stream source) AllowNewer = depAllowNewer }); } - } package._resources.AddRange(doc["resources"].Values.Select(RantResource.DeserializeResource).Where(res => res != null)); diff --git a/Rant/Resources/RantPackageDependency.cs b/Rant/Resources/RantPackageDependency.cs index 7200c6f..ed50630 100644 --- a/Rant/Resources/RantPackageDependency.cs +++ b/Rant/Resources/RantPackageDependency.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Core.Utilities; diff --git a/Rant/Resources/RantPackageVersion.cs b/Rant/Resources/RantPackageVersion.cs index e5f92d0..290430c 100644 --- a/Rant/Resources/RantPackageVersion.cs +++ b/Rant/Resources/RantPackageVersion.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Globalization; using Rant.Core.Utilities; @@ -180,6 +205,6 @@ public override bool Equals(object obj) return this == b; } - public override int GetHashCode() => unchecked((_major + 12345) * (_minor + 47) * (_revision * 31)); + public override int GetHashCode() => unchecked((_major + 12345) * (_minor + 47) * _revision * 31); } } \ No newline at end of file diff --git a/Rant/Resources/RantResource.cs b/Rant/Resources/RantResource.cs index 7382483..71971b7 100644 --- a/Rant/Resources/RantResource.cs +++ b/Rant/Resources/RantResource.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Reflection; diff --git a/Rant/Tuple.cs b/Rant/Tuple.cs index ffd8410..716b37e 100644 --- a/Rant/Tuple.cs +++ b/Rant/Tuple.cs @@ -1,4 +1,29 @@ -using static Rant.Core.Utilities.Util; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using static Rant.Core.Utilities.Util; namespace Rant { diff --git a/Rant/Vocabulary/Querying/Carrier.cs b/Rant/Vocabulary/Querying/Carrier.cs index 905078f..0121772 100644 --- a/Rant/Vocabulary/Querying/Carrier.cs +++ b/Rant/Vocabulary/Querying/Carrier.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using Rant.Core.IO; @@ -58,9 +83,7 @@ public IEnumerable GetComponentsOfType(CarrierComponentType type) HashSet set; if (!_components.TryGetValue(type, out set)) yield break; foreach (string value in set) - { yield return value; - } } /// @@ -83,9 +106,7 @@ internal void Serialize(EasyWriter output) output.Write((byte)kv.Key); output.Write(kv.Value.Count); foreach (string compName in kv.Value) - { output.Write(compName); - } } } @@ -97,9 +118,7 @@ internal void Deserialize(EasyReader input) var type = input.ReadEnum(); int num = input.ReadInt32(); for (int j = 0; j < num; j++) - { AddComponent(type, input.ReadString()); - } } } } diff --git a/Rant/Vocabulary/Querying/CarrierComponent.cs b/Rant/Vocabulary/Querying/CarrierComponent.cs index 18350fc..61626ca 100644 --- a/Rant/Vocabulary/Querying/CarrierComponent.cs +++ b/Rant/Vocabulary/Querying/CarrierComponent.cs @@ -1,4 +1,29 @@ -namespace Rant.Vocabulary.Querying +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Vocabulary.Querying { /// /// Defines carrier types for queries. diff --git a/Rant/Vocabulary/Querying/CarrierState.cs b/Rant/Vocabulary/Querying/CarrierState.cs index 9980d97..6b38bca 100644 --- a/Rant/Vocabulary/Querying/CarrierState.cs +++ b/Rant/Vocabulary/Querying/CarrierState.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Linq; using Rant.Core.Utilities; @@ -81,61 +106,45 @@ internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumer { HashSet usedSet; if (!_uniqueTable.TryGetValue(unique, out usedSet)) - { usedSet = _uniqueTable[unique] = new HashSet(); - } pool = pool.Except(usedSet); } // Handle match-unique carriers foreach (string munique in carrier.GetComponentsOfType(CarrierComponentType.Unique)) - { if (_matchTable.TryGetValue(munique, out result)) pool = pool.Where(e => e != result); - } // Handle relational carriers foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.Relational)) - { if (_assocTable.TryGetValue(relate, out result)) pool = pool.Where(e => e.RelatesWith(result)); - } // Handle match-relational carriers foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.MatchRelational)) - { if (_matchTable.TryGetValue(relate, out result)) pool = pool.Where(e => e.RelatesWith(result)); - } // Handle dissociative carriers foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.Dissociative)) - { if (_assocTable.TryGetValue(relate, out result)) pool = pool.Where(e => !e.RelatesWith(result)); - } // Handle match-dissociative carriers foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.MatchDissociative)) - { if (_matchTable.TryGetValue(relate, out result)) pool = pool.Where(e => !e.RelatesWith(result)); - } // Handle divergent carriers foreach (string diverge in carrier.GetComponentsOfType(CarrierComponentType.Divergent)) - { if (_assocTable.TryGetValue(diverge, out result)) pool = pool.Where(e => e.DivergesFrom(result)); - } // Handle match-divergent carriers foreach (string diverge in carrier.GetComponentsOfType(CarrierComponentType.MatchDivergent)) - { if (_matchTable.TryGetValue(diverge, out result)) pool = pool.Where(e => e.DivergesFrom(result)); - } result = pool.PickEntry(rng); diff --git a/Rant/Vocabulary/Querying/ClassFilter.cs b/Rant/Vocabulary/Querying/ClassFilter.cs index 51e1a22..9e2162a 100644 --- a/Rant/Vocabulary/Querying/ClassFilter.cs +++ b/Rant/Vocabulary/Querying/ClassFilter.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Linq; using Rant.Core.IO; @@ -17,6 +42,8 @@ internal sealed class ClassFilter : Filter /// public bool IsEmpty => _items.Count == 0; + public override int Priority => 0; + /// /// Adds a single-class rule to the filter. /// @@ -47,15 +74,13 @@ public override bool Test(RantDictionary dictionary, RantDictionaryTable table, return match && !hidden.Any(entry.ContainsClass); } - public override int Priority => 0; - /// /// Returns a boolean value indicating whether the specified class is explicitly allowed by the current ClassFilter. /// /// The class to test. /// public bool AllowsClass(string className) => - _items.Any(item => item.Any(rule => (rule.Class == className) && rule.ShouldMatch)); + _items.Any(item => item.Any(rule => rule.Class == className && rule.ShouldMatch)); public override void Serialize(EasyWriter output) { diff --git a/Rant/Vocabulary/Querying/ClassFilterRule.cs b/Rant/Vocabulary/Querying/ClassFilterRule.cs index 381033c..096c7bb 100644 --- a/Rant/Vocabulary/Querying/ClassFilterRule.cs +++ b/Rant/Vocabulary/Querying/ClassFilterRule.cs @@ -1,4 +1,29 @@ -namespace Rant.Vocabulary.Querying +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Vocabulary.Querying { /// /// Defines a query filter for a single dictionary entry class. diff --git a/Rant/Vocabulary/Querying/Filter.cs b/Rant/Vocabulary/Querying/Filter.cs index 7de697c..e7a0b2d 100644 --- a/Rant/Vocabulary/Querying/Filter.cs +++ b/Rant/Vocabulary/Querying/Filter.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Core.IO; @@ -11,6 +36,7 @@ internal abstract class Filter internal const ushort FILTER_REGEX = 0x0002; internal const ushort FILTER_SYLRANGE = 0x0003; internal const ushort FILTER_BIT_OTHER = 0x8000; + public abstract int Priority { get; } public static Filter GetFilterInstance(ushort filterTypeCode) { @@ -39,7 +65,7 @@ public static Filter GetFilterInstance(ushort filterTypeCode) /// The originating query. /// public abstract bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query); - public abstract int Priority { get; } + public abstract void Deserialize(EasyReader input); public abstract void Serialize(EasyWriter output); } diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index e06f5d8..67eb082 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using Rant.Core.Compiler.Syntax; diff --git a/Rant/Vocabulary/Querying/RangeFilter.cs b/Rant/Vocabulary/Querying/RangeFilter.cs index fb3777a..8dd0318 100644 --- a/Rant/Vocabulary/Querying/RangeFilter.cs +++ b/Rant/Vocabulary/Querying/RangeFilter.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Core.IO; @@ -62,6 +87,8 @@ public int? Maximum /// public static RangeFilter Anything => new RangeFilter(null, null); + public override int Priority => 1; + /// /// Determines if the specified number is within the current range. /// @@ -105,7 +132,6 @@ public bool TestAgainst(int value) public static RangeFilter Between(int min, int max) => new RangeFilter(min, max); public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) => TestAgainst(entry[termIndex].SyllableCount); - public override int Priority => 1; public override void Deserialize(EasyReader input) { diff --git a/Rant/Vocabulary/Querying/RegexFilter.cs b/Rant/Vocabulary/Querying/RegexFilter.cs index 9b5ef20..dffcc09 100644 --- a/Rant/Vocabulary/Querying/RegexFilter.cs +++ b/Rant/Vocabulary/Querying/RegexFilter.cs @@ -1,4 +1,29 @@ -using System.Text.RegularExpressions; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Text.RegularExpressions; using Rant.Core.IO; @@ -19,8 +44,8 @@ public RegexFilter() public Regex Regex { get; set; } public bool Outcome { get; set; } - public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) => Regex.IsMatch(entry[termIndex].Value) == Outcome; public override int Priority => 100; + public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) => Regex.IsMatch(entry[termIndex].Value) == Outcome; public override void Deserialize(EasyReader input) { diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index 9347793..0a2168c 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -35,16 +60,10 @@ public RantDictionary(IEnumerable tables) RantDictionaryTable table; foreach (var list in tables) - { if (_tables.TryGetValue(list.Name, out table)) - { table.Merge(list); - } else - { _tables[list.Name] = list; - } - } } /// diff --git a/Rant/Vocabulary/RantDictionaryEntry.cs b/Rant/Vocabulary/RantDictionaryEntry.cs index ac35376..2fbc4bd 100644 --- a/Rant/Vocabulary/RantDictionaryEntry.cs +++ b/Rant/Vocabulary/RantDictionaryEntry.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -11,9 +36,9 @@ public sealed class RantDictionaryEntry { private const int INITIAL_METADATA_CAPACITY = 4; private readonly HashSet _classes; - private Dictionary _metadata; private readonly HashSet _optionalClasses; private readonly RantDictionaryTerm[] _terms; + private Dictionary _metadata; /// /// Creates a new instance of the object from the specified term array. @@ -56,7 +81,6 @@ public RantDictionaryEntry(IEnumerable terms, IEnumerable(); _optionalClasses = new HashSet(); foreach (string c in classes) - { if (c.EndsWith("?")) { string trimmed = string.Intern(c.Substring(0, c.Length - 1)); @@ -67,7 +91,6 @@ public RantDictionaryEntry(IEnumerable terms, IEnumerable terms, IEnumerable public RantDictionaryTerm this[int index] { - get { return (index < 0 || index >= _terms.Length) ? null : _terms[index]; } + get { return index < 0 || index >= _terms.Length ? null : _terms[index]; } set { if (index < 0 || index <= _terms.Length) diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index abb58ee..2d44c2b 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Globalization; using System.IO; @@ -51,7 +76,7 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) case '#': continue; - // Directive + // Directive case '@': { // Read directive name @@ -171,24 +196,16 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) case "endclass": { if (args.Count == 0) - { if (autoClassStack.Count > 0) - { foreach (string cName in autoClassStack.Pop()) - { autoClasses.Remove(cName); - } - } else - { foreach (var cArg in args) { if (!Tools.ValidateClassName(cArg.Value)) throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); autoClasses.Remove(cArg.Value); } - } - } break; } } @@ -253,19 +270,13 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) if (args.Count != table.TermsPerEntry) continue; for (int j = 0; j < currentEntry.TermCount; j++) - { currentEntry[j].Pronunciation = args[j].Value; - } break; default: if (args.Count == 1) - { currentEntry.SetMetadata(propName, args[0].Value); - } else - { currentEntry.SetMetadata(propName, args.Select(a => a.Value).ToArray()); - } break; } break; @@ -297,9 +308,7 @@ public static void ConstructTable(string origin, string name, Dictionary -1) throw new RantTableLoadException(origin, line, i, "err-table-multiple-splits"); @@ -478,7 +484,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i continue; case 'u': { - if ((i + 4) > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (i + 4 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); ushort codePoint; if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); @@ -488,7 +494,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i } case 'U': { - if ((i + 8) > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (i + 8 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); char high, low; if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); @@ -527,7 +533,6 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i } continue; } - } done: @@ -561,7 +566,6 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int { if (++i >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); while (i < len) - { switch (c = str[i++]) { case '\"': @@ -596,7 +600,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int continue; case 'u': { - if ((i + 4) >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); ushort codePoint; if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); @@ -606,7 +610,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int } case 'U': { - if ((i + 8) >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); char high, low; if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); @@ -623,7 +627,6 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int buffer.Append(c); break; } - } throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); } @@ -631,7 +634,6 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int // If it isn't a string literal, simply read until a comma is reached. while (i < len) - { switch (c = str[i++]) { case ',': @@ -670,7 +672,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int continue; case 'u': { - if ((i + 4) >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); ushort codePoint; if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); @@ -680,7 +682,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int } case 'U': { - if ((i + 8) >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); char high, low; if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); @@ -712,7 +714,6 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int } continue; } - } result = new Argument(start, buffer.ToString()); return true; diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 2dad4d6..07e1ce4 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; @@ -154,9 +179,7 @@ public IEnumerable GetClasses() var lstClasses = new HashSet(); foreach (string c in _entriesHash.SelectMany(e => e.GetClasses())) - { if (lstClasses.Add(c)) yield return c; - } } /// @@ -179,9 +202,7 @@ public bool AddSubtype(string subtypeName, int index) _subtypes[subtypeName] = index; HashSet subs; if (!_subtypeIndexMap.TryGetValue(index, out subs)) - { _subtypeIndexMap[index] = subs = new HashSet(); - } subs.Add(subtypeName); return true; } @@ -198,9 +219,7 @@ public bool RemoveSubtype(string subtypeName) if (!_subtypes.ContainsKey(subtypeName)) return false; HashSet subs; if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out subs)) - { return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); - } return false; } @@ -249,8 +268,8 @@ public bool Merge(RantDictionaryTable other) internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) { - int index = sb.TakePlural() - ? string.IsNullOrEmpty(query.PluralSubtype) + int index = sb.TakePlural() + ? string.IsNullOrEmpty(query.PluralSubtype) ? GetSubtypeIndex(query.Subtype) : GetSubtypeIndex(query.PluralSubtype) : GetSubtypeIndex(query.Subtype); @@ -277,9 +296,7 @@ internal override void DeserializeData(BsonItem data) foreach (var subList in subs) { foreach (var sub in subList.Values) - { AddSubtype(sub, si); - } si++; } @@ -309,16 +326,12 @@ from BsonItem termData in entryData["terms"].Values // Optional classes foreach (var optionalClass in entryData["optional-classes"].Values) - { entry.AddClass(optionalClass, true); - } // Metadata var meta = entryData["metadata"]; foreach (string metaKey in meta.Keys) - { entry.SetMetadata(metaKey, meta[metaKey].Value); - } AddEntry(entry); } @@ -335,9 +348,7 @@ internal override BsonItem SerializeData() var subs = new BsonItem[TermsPerEntry]; for (int i = 0; i < TermsPerEntry; i++) - { subs[i] = new BsonItem(GetSubtypesForIndex(i).ToArray()); - } data["subs"] = new BsonItem(subs); data["hidden-classes"] = new BsonItem(_hidden.ToArray()); @@ -349,7 +360,6 @@ internal override BsonItem SerializeData() var entryData = new BsonItem(); var termData = new BsonItem[TermsPerEntry]; for (int j = 0; j < TermsPerEntry; j++) - { termData[j] = new BsonItem { ["value"] = entry[j].Value, @@ -357,7 +367,6 @@ internal override BsonItem SerializeData() ["value-split"] = entry[j].ValueSplitIndex, ["pron-split"] = entry[j].PronunciationSplitIndex }; - } entryData["terms"] = new BsonItem(termData); entryData["classes"] = new BsonItem(entry.GetRequiredClasses().ToArray()); @@ -365,9 +374,7 @@ internal override BsonItem SerializeData() var metaData = new BsonItem(); foreach (string metaKey in entry.GetMetadataKeys()) - { metaData[metaKey] = new BsonItem(entry.GetMetadata(metaKey)); - } entryData["metadata"] = metaData; entries[i] = entryData; } diff --git a/Rant/Vocabulary/RantDictionaryTerm.cs b/Rant/Vocabulary/RantDictionaryTerm.cs index 6c8dc7b..1b3c217 100644 --- a/Rant/Vocabulary/RantDictionaryTerm.cs +++ b/Rant/Vocabulary/RantDictionaryTerm.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Core.Utilities; diff --git a/Rant/Vocabulary/RantTableLoadException.cs b/Rant/Vocabulary/RantTableLoadException.cs index d255ffe..c6422cc 100644 --- a/Rant/Vocabulary/RantTableLoadException.cs +++ b/Rant/Vocabulary/RantTableLoadException.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using Rant.Localization; diff --git a/Rant/Vocabulary/Utilities/Diff.cs b/Rant/Vocabulary/Utilities/Diff.cs index 3e9cbcb..d30d563 100644 --- a/Rant/Vocabulary/Utilities/Diff.cs +++ b/Rant/Vocabulary/Utilities/Diff.cs @@ -1,4 +1,29 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -38,7 +63,6 @@ public Diff(string patternString) public string Mark(string baseString) { foreach (var rule in _rules) - { switch (rule.Type) { case DiffRuleType.Add: @@ -56,7 +80,6 @@ public string Mark(string baseString) baseString = ReplaceWord(baseString, rule.ConcatString, rule.Factor, rule.Prepend); continue; } - } return baseString; } @@ -88,17 +111,13 @@ internal static string ReplaceWord(string baseString, string replacement, int fa { a = b; while (a < baseString.Length && !char.IsLetterOrDigit(baseString[a])) - { a++; - } if (a >= baseString.Length) return baseString; b = a; while (b < baseString.Length && char.IsLetterOrDigit(baseString[b])) - { b++; - } currentWordIndex++; } @@ -110,17 +129,13 @@ internal static string ReplaceWord(string baseString, string replacement, int fa { b = a; while (b > 0 && !char.IsLetterOrDigit(baseString[b - 1])) - { b--; - } if (b <= 0) return baseString; a = b; while (a > 0 && char.IsLetterOrDigit(baseString[a - 1])) - { a--; - } currentWordIndex++; } @@ -274,18 +289,14 @@ internal static bool LongestCommonSubstring(string a, string b, int matchIndex = 0; for (int i = 0; i < minor.Length; i++) - { - for (int j = i + 1; j <= minor.Length; j++) + for (int j = i + 1; j <= minor.Length; j++) + if (j - i > length + && (matchIndex = major.IndexOf(minor.Substring(i, j - i), StringComparison.InvariantCulture)) > -1) { - if (j - i > length - && (matchIndex = major.IndexOf(minor.Substring(i, j - i), StringComparison.InvariantCulture)) > -1) - { - majorStart = matchIndex; - minorStart = i; - length = j - i; - } + majorStart = matchIndex; + minorStart = i; + length = j - i; } - } if (a.Length >= b.Length) { @@ -307,9 +318,7 @@ private static int LongestLeftMatch(string a, string b) int l = Math.Min(a.Length, b.Length); for (int i = 0; i < l; i++) - { if (a[i] != b[i]) return i; - } return l; } @@ -318,9 +327,7 @@ private static int LongestRightMatch(string a, string b) if (a.Length * b.Length == 0) return 0; int l = Math.Min(a.Length, b.Length); for (int i = 0; i < l; i++) - { - if (a[(a.Length - 1) - i] != b[(b.Length - 1) - i]) return i; - } + if (a[a.Length - 1 - i] != b[b.Length - 1 - i]) return i; return l; } @@ -360,20 +367,12 @@ public static Rule Parse(Token[] tokens) int factor = 0; if (ruleType != DiffRuleType.Add) - { if (prepend) - { factor += tokens.Reverse().TakeWhile(t => t.Type == op).Count(); - } else - { factor += tokens.TakeWhile(t => t.Type == op).Count(); - } - } else - { factor++; - } var sb = new StringBuilder(); @@ -382,9 +381,7 @@ public static Rule Parse(Token[] tokens) .Reverse() .SkipWhile(t => RuleMap.ContainsKey(t.Type)) .Reverse()) - { sb.Append(token.Value); - } return new Rule(sb.ToString(), prepend, ruleType, factor); } @@ -442,9 +439,7 @@ private static IEnumerable GetTokens(string patternString) nextToken = null; } if (text.Length > 0) - { yield return new Token(DM.Text, text.ToString().Trim()); - } } public static IEnumerable> Lex(string patternString) @@ -452,7 +447,6 @@ public static IEnumerable> Lex(string patternString) var tokens = GetTokens(patternString); var list = new List(); foreach (var token in tokens) - { if (token.Type == DM.Delimiter && list.Any()) { yield return list.ToArray(); @@ -462,7 +456,6 @@ public static IEnumerable> Lex(string patternString) { list.Add(token); } - } if (list.Any()) yield return list.ToArray(); } diff --git a/Rant/Vocabulary/Utilities/DoubleMetaphone.cs b/Rant/Vocabulary/Utilities/DoubleMetaphone.cs index e883c04..b2eb07a 100644 --- a/Rant/Vocabulary/Utilities/DoubleMetaphone.cs +++ b/Rant/Vocabulary/Utilities/DoubleMetaphone.cs @@ -1,27 +1,27 @@ -/* -Copyright (c) 2008 Anthony Tong Lee - -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. -*/ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion using System; using System.Diagnostics.CodeAnalysis; @@ -49,22 +49,18 @@ public static string GenerateDoubleMetaphone(this string self) int current = 0; if (self.Length < 1) - { return self; - } int last = self.Length - 1; //zero based index string workingString = self.ToUpperInvariant() + " "; - bool isSlavoGermanic = (self.IndexOf('W') > -1) || (self.IndexOf('K') > -1) || - (self.IndexOf("CZ", StringComparison.OrdinalIgnoreCase) > -1) - || (self.IndexOf("WITZ", StringComparison.OrdinalIgnoreCase) > -1); + bool isSlavoGermanic = self.IndexOf('W') > -1 || self.IndexOf('K') > -1 || + self.IndexOf("CZ", StringComparison.OrdinalIgnoreCase) > -1 + || self.IndexOf("WITZ", StringComparison.OrdinalIgnoreCase) > -1; //skip these when at start of word if (workingString.StartsWith(StringComparison.OrdinalIgnoreCase, "GN", "KN", "PN", "WR", "PS")) - { current += 1; - } //Initial 'X' is pronounced 'Z' e.g. 'Xavier' if (workingString[0] == 'X') @@ -73,12 +69,10 @@ public static string GenerateDoubleMetaphone(this string self) current += 1; } - while ((metaphoneData.PrimaryLength < 4) || (metaphoneData.SecondaryLength < 4)) + while (metaphoneData.PrimaryLength < 4 || metaphoneData.SecondaryLength < 4) { if (current >= self.Length) - { break; - } switch (workingString[current]) { @@ -89,10 +83,7 @@ public static string GenerateDoubleMetaphone(this string self) case 'U': case 'Y': if (current == 0) - { - //all init vowels now map to 'A' metaphoneData.Add("A"); - } current += 1; break; @@ -101,13 +92,9 @@ public static string GenerateDoubleMetaphone(this string self) metaphoneData.Add("P"); if (workingString[current + 1] == 'B') - { current += 2; - } else - { current += 1; - } break; case 'Ã': @@ -117,10 +104,8 @@ public static string GenerateDoubleMetaphone(this string self) case 'C': //various germanic - if ((current > 1) && !IsVowel(workingString[current - 2]) && StringAt(workingString, (current - 1), "ACH") - && - ((workingString[current + 2] != 'I') && - ((workingString[current + 2] != 'E') || StringAt(workingString, (current - 2), "BACHER", "MACHER")))) + if (current > 1 && !IsVowel(workingString[current - 2]) && StringAt(workingString, current - 1, "ACH") && workingString[current + 2] != 'I' && + (workingString[current + 2] != 'E' || StringAt(workingString, current - 2, "BACHER", "MACHER"))) { metaphoneData.Add("K"); current += 2; @@ -128,7 +113,7 @@ public static string GenerateDoubleMetaphone(this string self) } //special case 'caesar' - if ((current == 0) && StringAt(workingString, current, "CAESAR")) + if (current == 0 && StringAt(workingString, current, "CAESAR")) { metaphoneData.Add("S"); current += 2; @@ -146,7 +131,7 @@ public static string GenerateDoubleMetaphone(this string self) if (StringAt(workingString, current, "CH")) { //find 'michael' - if ((current > 0) && StringAt(workingString, current, "CHAE")) + if (current > 0 && StringAt(workingString, current, "CHAE")) { metaphoneData.Add("K", "X"); current += 2; @@ -154,9 +139,9 @@ public static string GenerateDoubleMetaphone(this string self) } //greek roots e.g. 'chemistry', 'chorus' - if ((current == 0) && - (StringAt(workingString, (current + 1), "HARAC", "HARIS") || - StringAt(workingString, (current + 1), "HOR", "HYM", "HIA", "HEM")) + if (current == 0 && + (StringAt(workingString, current + 1, "HARAC", "HARIS") || + StringAt(workingString, current + 1, "HOR", "HYM", "HIA", "HEM")) && !StringAt(workingString, 0, "CHORE")) { metaphoneData.Add("K"); @@ -165,41 +150,32 @@ public static string GenerateDoubleMetaphone(this string self) } //germanic, greek, or otherwise 'ch' for 'kh' sound - if ((StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH")) - // 'architect but not 'arch', 'orchestra', 'orchid' - || StringAt(workingString, (current - 2), "ORCHES", "ARCHIT", "ORCHID") || - StringAt(workingString, (current + 2), "T", "S") + if (StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH") + // 'architect but not 'arch', 'orchestra', 'orchid' + || StringAt(workingString, current - 2, "ORCHES", "ARCHIT", "ORCHID") || + StringAt(workingString, current + 2, "T", "S") || - ((StringAt(workingString, (current - 1), "A", "O", "U", "E") || (current == 0)) - //e.g., 'wachtler', 'wechsler', but not 'tichner' - && StringAt(workingString, (current + 2), "L", "R", "N", "M", "B", "H", "F", "V", "W", " "))) + (StringAt(workingString, current - 1, "A", "O", "U", "E") || current == 0) + //e.g., 'wachtler', 'wechsler', but not 'tichner' + && StringAt(workingString, current + 2, "L", "R", "N", "M", "B", "H", "F", "V", "W", " ")) { metaphoneData.Add("K"); } else { if (current > 0) - { if (StringAt(workingString, 0, "MC")) - { - //e.g., "McHugh" metaphoneData.Add("K"); - } else - { metaphoneData.Add("X", "K"); - } - } else - { metaphoneData.Add("X"); - } } current += 2; break; } //e.g, 'czerny' - if (StringAt(workingString, current, "CZ") && !StringAt(workingString, (current - 2), "WICZ")) + if (StringAt(workingString, current, "CZ") && !StringAt(workingString, current - 2, "WICZ")) { metaphoneData.Add("S", "X"); current += 2; @@ -207,7 +183,7 @@ public static string GenerateDoubleMetaphone(this string self) } //e.g., 'focaccia' - if (StringAt(workingString, (current + 1), "CIA")) + if (StringAt(workingString, current + 1, "CIA")) { metaphoneData.Add("X"); current += 3; @@ -215,22 +191,18 @@ public static string GenerateDoubleMetaphone(this string self) } //double 'C', but not if e.g. 'McClellan' - if (StringAt(workingString, current, "CC") && !((current == 1) && (workingString[0] == 'M'))) + if (StringAt(workingString, current, "CC") && !(current == 1 && workingString[0] == 'M')) { //'bellocchio' but not 'bacchus' - if (StringAt(workingString, (current + 2), "I", "E", "H") && !StringAt(workingString, (current + 2), "HU")) + if (StringAt(workingString, current + 2, "I", "E", "H") && !StringAt(workingString, current + 2, "HU")) { //'accident', 'accede' 'succeed' - if (((current == 1) && (workingString[current - 1] == 'A')) || - StringAt(workingString, (current - 1), "UCCEE", "UCCES")) - { + if (current == 1 && workingString[current - 1] == 'A' || + StringAt(workingString, current - 1, "UCCEE", "UCCES")) metaphoneData.Add("KS"); - } //'bacci', 'bertucci', other italian else - { metaphoneData.Add("X"); - } current += 3; break; } @@ -251,13 +223,9 @@ public static string GenerateDoubleMetaphone(this string self) { //italian vs. english if (StringAt(workingString, current, "CIO", "CIE", "CIA")) - { metaphoneData.Add("S", "X"); - } else - { metaphoneData.Add("S"); - } current += 2; break; } @@ -266,24 +234,18 @@ public static string GenerateDoubleMetaphone(this string self) metaphoneData.Add("K"); //name sent in 'mac caffrey', 'mac gregor - if (StringAt(workingString, (current + 1), " C", " Q", " G")) - { + if (StringAt(workingString, current + 1, " C", " Q", " G")) current += 3; - } - else if (StringAt(workingString, (current + 1), "C", "K", "Q") && !StringAt(workingString, (current + 1), "CE", "CI")) - { + else if (StringAt(workingString, current + 1, "C", "K", "Q") && !StringAt(workingString, current + 1, "CE", "CI")) current += 2; - } else - { current += 1; - } break; case 'D': if (StringAt(workingString, current, "DG")) { - if (StringAt(workingString, (current + 2), "I", "E", "Y")) + if (StringAt(workingString, current + 2, "I", "E", "Y")) { //e.g. 'edge' metaphoneData.Add("J"); @@ -310,20 +272,16 @@ public static string GenerateDoubleMetaphone(this string self) case 'F': if (workingString[current + 1] == 'F') - { current += 2; - } else - { current += 1; - } metaphoneData.Add("F"); break; case 'G': if (workingString[current + 1] == 'H') { - if ((current > 0) && !IsVowel(workingString[current - 1])) + if (current > 0 && !IsVowel(workingString[current - 1])) { metaphoneData.Add("K"); current += 2; @@ -331,40 +289,29 @@ public static string GenerateDoubleMetaphone(this string self) } if (current < 3) - { - //'ghislane', ghiradelli if (current == 0) { if (workingString[current + 2] == 'I') - { metaphoneData.Add("J"); - } else - { metaphoneData.Add("K"); - } current += 2; break; } - } //Parker's rule (with some further refinements) - e.g., 'hugh' - if (((current > 1) && StringAt(workingString, (current - 2), "B", "H", "D")) //e.g., 'bough' - || ((current > 2) && StringAt(workingString, (current - 3), "B", "H", "D")) //e.g., 'broughton' - || ((current > 3) && StringAt(workingString, (current - 4), "B", "H"))) + if (current > 1 && StringAt(workingString, current - 2, "B", "H", "D") //e.g., 'bough' + || current > 2 && StringAt(workingString, current - 3, "B", "H", "D") //e.g., 'broughton' + || current > 3 && StringAt(workingString, current - 4, "B", "H")) { current += 2; break; } //e.g., 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough' - if ((current > 2) && (workingString[current - 1] == 'U') && - StringAt(workingString, (current - 3), "C", "G", "L", "R", "T")) - { + if (current > 2 && workingString[current - 1] == 'U' && + StringAt(workingString, current - 3, "C", "G", "L", "R", "T")) metaphoneData.Add("F"); - } - else if ((current > 0) && workingString[current - 1] != 'I') - { + else if (current > 0 && workingString[current - 1] != 'I') metaphoneData.Add("K"); - } current += 2; break; @@ -372,26 +319,20 @@ public static string GenerateDoubleMetaphone(this string self) if (workingString[current + 1] == 'N') { - if ((current == 1) && IsVowel(workingString[0]) && !isSlavoGermanic) - { + if (current == 1 && IsVowel(workingString[0]) && !isSlavoGermanic) metaphoneData.Add("KN", "N"); - } else - //not e.g. 'cagney' - if (!StringAt(workingString, (current + 2), "EY") && (workingString[current + 1] != 'Y') && !isSlavoGermanic) - { - metaphoneData.Add("N", "KN"); - } - else - { - metaphoneData.Add("KN"); - } + //not e.g. 'cagney' + if (!StringAt(workingString, current + 2, "EY") && workingString[current + 1] != 'Y' && !isSlavoGermanic) + metaphoneData.Add("N", "KN"); + else + metaphoneData.Add("KN"); current += 2; break; } //'tagliaro' - if (StringAt(workingString, (current + 1), "LI") && !isSlavoGermanic) + if (StringAt(workingString, current + 1, "LI") && !isSlavoGermanic) { metaphoneData.Add("KL", "L"); current += 2; @@ -399,10 +340,10 @@ public static string GenerateDoubleMetaphone(this string self) } //-ges-,-gep-,-gel-, -gie- at beginning - if ((current == 0) + if (current == 0 && - ((workingString[current + 1] == 'Y') || - StringAt(workingString, (current + 1), "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER"))) + (workingString[current + 1] == 'Y' || + StringAt(workingString, current + 1, "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER"))) { metaphoneData.Add("K", "J"); current += 2; @@ -410,9 +351,9 @@ public static string GenerateDoubleMetaphone(this string self) } // -ger-, -gy- - if ((StringAt(workingString, (current + 1), "ER") || (workingString[current + 1] == 'Y')) && + if ((StringAt(workingString, current + 1, "ER") || workingString[current + 1] == 'Y') && !StringAt(workingString, 0, "DANGER", "RANGER", "MANGER") - && !StringAt(workingString, (current - 1), "E", "I") && !StringAt(workingString, (current - 1), "RGY", "OGY")) + && !StringAt(workingString, current - 1, "E", "I") && !StringAt(workingString, current - 1, "RGY", "OGY")) { metaphoneData.Add("K", "J"); current += 2; @@ -420,43 +361,33 @@ public static string GenerateDoubleMetaphone(this string self) } // italian e.g, 'biaggi' - if (StringAt(workingString, (current + 1), "E", "I", "Y") || - StringAt(workingString, (current - 1), "AGGI", "OGGI")) + if (StringAt(workingString, current + 1, "E", "I", "Y") || + StringAt(workingString, current - 1, "AGGI", "OGGI")) { //obvious germanic - if ((StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH")) || - StringAt(workingString, (current + 1), "ET")) - { + if (StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH") || + StringAt(workingString, current + 1, "ET")) metaphoneData.Add("K"); - } else - //always soft if french ending - if (StringAt(workingString, (current + 1), "IER ")) - { - metaphoneData.Add("J"); - } - else - { - metaphoneData.Add("J", "K"); - } + //always soft if french ending + if (StringAt(workingString, current + 1, "IER ")) + metaphoneData.Add("J"); + else + metaphoneData.Add("J", "K"); current += 2; break; } if (workingString[current + 1] == 'G') - { current += 2; - } else - { current += 1; - } metaphoneData.Add("K"); break; case 'H': //only keep if first & before vowel or btw. 2 vowels - if (((current == 0) || IsVowel(workingString[current - 1])) && IsVowel(workingString[current + 1])) + if ((current == 0 || IsVowel(workingString[current - 1])) && IsVowel(workingString[current + 1])) { metaphoneData.Add("H"); current += 2; @@ -471,58 +402,38 @@ public static string GenerateDoubleMetaphone(this string self) //obvious spanish, 'jose', 'san jacinto' if (StringAt(workingString, current, "JOSE") || StringAt(workingString, 0, "SAN ")) { - if (((current == 0) && (workingString[current + 4] == ' ')) || StringAt(workingString, 0, "SAN ")) - { + if (current == 0 && workingString[current + 4] == ' ' || StringAt(workingString, 0, "SAN ")) metaphoneData.Add("H"); - } else - { metaphoneData.Add("J", "H"); - } current += 1; break; } - if ((current == 0) && !StringAt(workingString, current, "JOSE")) - { + if (current == 0 && !StringAt(workingString, current, "JOSE")) metaphoneData.Add("J", "A"); //Yankelovich/Jankelowicz - } else - //spanish pron. of e.g. 'bajador' - if (IsVowel(workingString[current - 1]) && !isSlavoGermanic && - ((workingString[current + 1] == 'A') || (workingString[current + 1] == 'O'))) - { - metaphoneData.Add("J", "H"); - } - else if (current == last) - { - metaphoneData.Add("J", " "); - } - else if (!StringAt(workingString, (current + 1), "L", "T", "K", "S", "N", "M", "B", "Z") && - !StringAt(workingString, (current - 1), "S", "K", "L")) - { - metaphoneData.Add("J"); - } + //spanish pron. of e.g. 'bajador' + if (IsVowel(workingString[current - 1]) && !isSlavoGermanic && + (workingString[current + 1] == 'A' || workingString[current + 1] == 'O')) + metaphoneData.Add("J", "H"); + else if (current == last) + metaphoneData.Add("J", " "); + else if (!StringAt(workingString, current + 1, "L", "T", "K", "S", "N", "M", "B", "Z") && + !StringAt(workingString, current - 1, "S", "K", "L")) + metaphoneData.Add("J"); if (workingString[current + 1] == 'J') //it could happen! - { current += 2; - } else - { current += 1; - } break; case 'K': if (workingString[current + 1] == 'K') - { current += 2; - } else - { current += 1; - } metaphoneData.Add("K"); break; @@ -530,10 +441,10 @@ public static string GenerateDoubleMetaphone(this string self) if (workingString[current + 1] == 'L') { //spanish e.g. 'cabrillo', 'gallegos' - if (((current == (self.Length - 3)) && StringAt(workingString, (current - 1), "ILLO", "ILLA", "ALLE")) + if (current == self.Length - 3 && StringAt(workingString, current - 1, "ILLO", "ILLA", "ALLE") || - ((StringAt(workingString, (last - 1), "AS", "OS") || StringAt(workingString, last, "A", "O")) && - StringAt(workingString, (current - 1), "ALLE"))) + (StringAt(workingString, last - 1, "AS", "OS") || StringAt(workingString, last, "A", "O")) && + StringAt(workingString, current - 1, "ALLE")) { metaphoneData.Add("L", " "); current += 2; @@ -549,28 +460,20 @@ public static string GenerateDoubleMetaphone(this string self) break; case 'M': - if ((StringAt(workingString, (current - 1), "UMB") && - (((current + 1) == last) || StringAt(workingString, (current + 2), "ER"))) //'dumb','thumb' - || (workingString[current + 1] == 'M')) - { + if (StringAt(workingString, current - 1, "UMB") && + (current + 1 == last || StringAt(workingString, current + 2, "ER")) //'dumb','thumb' + || workingString[current + 1] == 'M') current += 2; - } else - { current += 1; - } metaphoneData.Add("M"); break; case 'N': if (workingString[current + 1] == 'N') - { current += 2; - } else - { current += 1; - } metaphoneData.Add("N"); break; @@ -588,61 +491,45 @@ public static string GenerateDoubleMetaphone(this string self) } //also account for "campbell", "raspberry" - if (StringAt(workingString, (current + 1), "P", "B")) - { + if (StringAt(workingString, current + 1, "P", "B")) current += 2; - } else - { current += 1; - } metaphoneData.Add("P"); break; case 'Q': if (workingString[current + 1] == 'Q') - { current += 2; - } else - { current += 1; - } metaphoneData.Add("K"); break; case 'R': //french e.g. 'rogier', but exclude 'hochmeier' - if ((current == last) && !isSlavoGermanic && StringAt(workingString, (current - 2), "IE") && - !StringAt(workingString, (current - 4), "ME", "MA")) - { + if (current == last && !isSlavoGermanic && StringAt(workingString, current - 2, "IE") && + !StringAt(workingString, current - 4, "ME", "MA")) metaphoneData.Add("", "R"); - } else - { metaphoneData.Add("R"); - } if (workingString[current + 1] == 'R') - { current += 2; - } else - { current += 1; - } break; case 'S': //special cases 'island', 'isle', 'carlisle', 'carlysle' - if (StringAt(workingString, (current - 1), "ISL", "YSL")) + if (StringAt(workingString, current - 1, "ISL", "YSL")) { current += 1; break; } //special case 'sugar-' - if ((current == 0) && StringAt(workingString, current, "SUGAR")) + if (current == 0 && StringAt(workingString, current, "SUGAR")) { metaphoneData.Add("X", "S"); current += 1; @@ -652,14 +539,10 @@ public static string GenerateDoubleMetaphone(this string self) if (StringAt(workingString, current, "SH")) { //germanic - if (StringAt(workingString, (current + 1), "HEIM", "HOEK", "HOLM", "HOLZ")) - { + if (StringAt(workingString, current + 1, "HEIM", "HOEK", "HOLM", "HOLZ")) metaphoneData.Add("S"); - } else - { metaphoneData.Add("X"); - } current += 2; break; } @@ -668,31 +551,23 @@ public static string GenerateDoubleMetaphone(this string self) if (StringAt(workingString, current, "SIO", "SIA") || StringAt(workingString, current, "SIAN")) { if (!isSlavoGermanic) - { metaphoneData.Add("S", "X"); - } else - { metaphoneData.Add("S"); - } current += 3; break; } //german & anglicisations, e.g. 'smith' match 'schmidt', 'snider' match 'schneider' //also, -sz- in slavic language altho in hungarian it is pronounced 's' - if (((current == 0) && StringAt(workingString, (current + 1), "M", "N", "L", "W")) || - StringAt(workingString, (current + 1), "Z")) + if (current == 0 && StringAt(workingString, current + 1, "M", "N", "L", "W") || + StringAt(workingString, current + 1, "Z")) { metaphoneData.Add("S", "X"); - if (StringAt(workingString, (current + 1), "Z")) - { + if (StringAt(workingString, current + 1, "Z")) current += 2; - } else - { current += 1; - } break; } @@ -702,33 +577,25 @@ public static string GenerateDoubleMetaphone(this string self) if (workingString[current + 2] == 'H') { //dutch origin, e.g. 'school', 'schooner' - if (StringAt(workingString, (current + 3), "OO", "ER", "EN", "UY", "ED", "EM")) + if (StringAt(workingString, current + 3, "OO", "ER", "EN", "UY", "ED", "EM")) { //'schermerhorn', 'schenker' - if (StringAt(workingString, (current + 3), "ER", "EN")) - { + if (StringAt(workingString, current + 3, "ER", "EN")) metaphoneData.Add("X", "SK"); - } else - { metaphoneData.Add("SK"); - } current += 3; break; } - if ((current == 0) && !IsVowel(workingString[3]) && (workingString[3] != 'W')) - { + if (current == 0 && !IsVowel(workingString[3]) && workingString[3] != 'W') metaphoneData.Add("X", "S"); - } else - { metaphoneData.Add("X"); - } current += 3; break; } - if (StringAt(workingString, (current + 2), "I", "E", "Y")) + if (StringAt(workingString, current + 2, "I", "E", "Y")) { metaphoneData.Add("S"); current += 3; @@ -741,23 +608,15 @@ public static string GenerateDoubleMetaphone(this string self) } //french e.g. 'resnais', 'artois' - if ((current == last) && StringAt(workingString, (current - 2), "AI", "OI")) - { + if (current == last && StringAt(workingString, current - 2, "AI", "OI")) metaphoneData.Add("", "S"); - } else - { metaphoneData.Add("S"); - } - if (StringAt(workingString, (current + 1), "S", "Z")) - { + if (StringAt(workingString, current + 1, "S", "Z")) current += 2; - } else - { current += 1; - } break; case 'T': @@ -778,39 +637,27 @@ public static string GenerateDoubleMetaphone(this string self) if (StringAt(workingString, current, "TH") || StringAt(workingString, current, "TTH")) { //special case 'thomas', 'thames' or germanic - if (StringAt(workingString, (current + 2), "OM", "AM") || StringAt(workingString, 0, "VAN ", "VON ") || + if (StringAt(workingString, current + 2, "OM", "AM") || StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH")) - { metaphoneData.Add("T"); - } else - { metaphoneData.Add("O", "T"); - } current += 2; break; } - if (StringAt(workingString, (current + 1), "T", "D")) - { + if (StringAt(workingString, current + 1, "T", "D")) current += 2; - } else - { current += 1; - } metaphoneData.Add("T"); break; case 'V': if (workingString[current + 1] == 'V') - { current += 2; - } else - { current += 1; - } metaphoneData.Add("F"); break; @@ -823,23 +670,15 @@ public static string GenerateDoubleMetaphone(this string self) break; } - if ((current == 0) && (IsVowel(workingString[current + 1]) || StringAt(workingString, current, "WH"))) - { - //Wasserman should match Vasserman + if (current == 0 && (IsVowel(workingString[current + 1]) || StringAt(workingString, current, "WH"))) if (IsVowel(workingString[current + 1])) - { metaphoneData.Add("A", "F"); - } else - { - //need Uomo to match Womo metaphoneData.Add("A"); - } - } //Arnow should match Arnoff - if (((current == last) && IsVowel(workingString[current - 1])) || - StringAt(workingString, (current - 1), "EWSKI", "EWSKY", "OWSKI", "OWSKY") + if (current == last && IsVowel(workingString[current - 1]) || + StringAt(workingString, current - 1, "EWSKI", "EWSKY", "OWSKI", "OWSKY") || StringAt(workingString, 0, "SCH")) { metaphoneData.Add("", "F"); @@ -862,20 +701,14 @@ public static string GenerateDoubleMetaphone(this string self) case 'X': //french e.g. breaux if ( - !((current == last) && - (StringAt(workingString, (current - 3), "IAU", "EAU") || StringAt(workingString, (current - 2), "AU", "OU")))) - { + !(current == last && + (StringAt(workingString, current - 3, "IAU", "EAU") || StringAt(workingString, current - 2, "AU", "OU")))) metaphoneData.Add("KS"); - } - if (StringAt(workingString, (current + 1), "C", "X")) - { + if (StringAt(workingString, current + 1, "C", "X")) current += 2; - } else - { current += 1; - } break; case 'Z': @@ -886,24 +719,16 @@ public static string GenerateDoubleMetaphone(this string self) current += 2; break; } - if (StringAt(workingString, (current + 1), "ZO", "ZI", "ZA") || - (isSlavoGermanic && ((current > 0) && workingString[current - 1] != 'T'))) - { + if (StringAt(workingString, current + 1, "ZO", "ZI", "ZA") || + isSlavoGermanic && current > 0 && workingString[current - 1] != 'T') metaphoneData.Add("S", "TS"); - } else - { metaphoneData.Add("S"); - } if (workingString[current + 1] == 'Z') - { current += 2; - } else - { current += 1; - } break; default: @@ -917,35 +742,25 @@ public static string GenerateDoubleMetaphone(this string self) private static bool IsVowel(this char self) { - return (self == 'A') || (self == 'E') || (self == 'I') || (self == 'O') || (self == 'U') || (self == 'Y'); + return self == 'A' || self == 'E' || self == 'I' || self == 'O' || self == 'U' || self == 'Y'; } private static bool StartsWith(this string self, StringComparison comparison, params string[] strings) { foreach (string str in strings) - { if (self.StartsWith(str, comparison)) - { return true; - } - } return false; } private static bool StringAt(this string self, int startIndex, params string[] strings) { if (startIndex < 0) - { startIndex = 0; - } foreach (string str in strings) - { if (self.IndexOf(str, startIndex, StringComparison.OrdinalIgnoreCase) >= startIndex) - { return true; - } - } return false; } @@ -966,24 +781,18 @@ internal void Add(string main) internal void Add(string main, string alternative) { if (main != null) - { _primary.Append(main); - } if (alternative != null) { Alternative = true; if (alternative.Trim().Length > 0) - { _secondary.Append(alternative); - } } else { if (main != null && main.Trim().Length > 0) - { _secondary.Append(main); - } } } @@ -992,9 +801,7 @@ public override string ToString() string ret = (Alternative ? _secondary : _primary).ToString(); //only give back 4 char metaph if (ret.Length > 4) - { ret = ret.Substring(0, 4); - } return ret; } diff --git a/Rant/Vocabulary/Utilities/Rhymer.cs b/Rant/Vocabulary/Utilities/Rhymer.cs index ce0645b..2f2760a 100644 --- a/Rant/Vocabulary/Utilities/Rhymer.cs +++ b/Rant/Vocabulary/Utilities/Rhymer.cs @@ -1,3 +1,28 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + using System; using System.Linq; @@ -32,23 +57,18 @@ public bool Rhyme(RantDictionaryTerm term1, RantDictionaryTerm term2) } // last syllables are the same if (IsEnabled(RhymeFlags.Syllabic)) - { if (term1.Syllables.Last() == term2.Syllables.Last()) return true; - } // penultimate syllable is stressed but does not rhyme, last syllable rhymes if (IsEnabled(RhymeFlags.Weak) && hasStress) - { if ( term1.SyllableCount >= 2 && term2.SyllableCount >= 2 && term1.Syllables[term1.SyllableCount - 2].IndexOf('"') > -1 && term2.Syllables[term2.SyllableCount - 2].IndexOf('"') > -1 && GetFirstVowelSound(term1.Syllables.Last()) == GetFirstVowelSound(term2.Syllables.Last()) - ) + ) return true; - } if (IsEnabled(RhymeFlags.Semirhyme)) - { if (Math.Abs(term1.SyllableCount - term2.SyllableCount) == 1) { var longestWord = term1.SyllableCount > term2.SyllableCount ? term1 : term2; @@ -58,14 +78,13 @@ public bool Rhyme(RantDictionaryTerm term1, RantDictionaryTerm term2) GetFirstVowelSound(shortestWord.Syllables.Last())) return true; } - } // psuedo-sound similar if (IsEnabled(RhymeFlags.Forced)) { int distance = LevenshteinDistance( term1.Value.GenerateDoubleMetaphone(), term2.Value.GenerateDoubleMetaphone() - ); + ); if (distance <= 1) return true; } @@ -80,13 +99,10 @@ public bool Rhyme(RantDictionaryTerm term1, RantDictionaryTerm term2) } // matching first consonants if (IsEnabled(RhymeFlags.Alliteration)) - { if (GetFirstConsonants(term1.Value) == GetFirstConsonants(term2.Value)) return true; - } // matching all consonants if (IsEnabled(RhymeFlags.Pararhyme)) - { if (term1.Value .Where(x => !_vowels.Contains(x)) .SequenceEqual( @@ -94,7 +110,6 @@ public bool Rhyme(RantDictionaryTerm term1, RantDictionaryTerm term2) .Where(x => !_vowels.Contains(x)) )) return true; - } return false; } @@ -103,10 +118,8 @@ public string GetFirstConsonants(string word) { int i; for (i = 0; i < word.Length; i++) - { if (_vowels.Contains(word[i])) break; - } if (i > 0) return word.Substring(0, i); return word; @@ -117,10 +130,8 @@ public string GetFirstVowelSound(string pron) { int i; for (i = 0; i < pron.Length; i++) - { if (_vowelSounds.Contains(pron[i])) break; - } return pron.Substring(i); } @@ -155,10 +166,10 @@ public int LevenshteinDistance(string source, string target) int previousRow = currentRow ^ 1; for (int j = 1; j <= m; j++) { - int cost = (target[j - 1] == source[i - 1] ? 0 : 1); + int cost = target[j - 1] == source[i - 1] ? 0 : 1; distance[currentRow, j] = Math.Min(Math.Min( - distance[previousRow, j] + 1, - distance[currentRow, j - 1] + 1), + distance[previousRow, j] + 1, + distance[currentRow, j - 1] + 1), distance[previousRow, j - 1] + cost); } } diff --git a/Rant/Vocabulary/Utilities/VocabUtils.cs b/Rant/Vocabulary/Utilities/VocabUtils.cs index 37b63a0..4532430 100644 --- a/Rant/Vocabulary/Utilities/VocabUtils.cs +++ b/Rant/Vocabulary/Utilities/VocabUtils.cs @@ -1,4 +1,29 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Linq; using System.Text; @@ -25,7 +50,7 @@ public static IEnumerable GetArgs(string argString) var sb = new StringBuilder(); do { - if (i >= length || (char.IsWhiteSpace(argString[i]) && !scope)) + if (i >= length || char.IsWhiteSpace(argString[i]) && !scope) { if (sb.Length == 0 && !scopeUsed) continue; yield return sb.ToString(); From 2fbd703c4b3003e3829776d1ec05e1f35651a91f Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 28 Feb 2017 10:43:45 -0600 Subject: [PATCH 107/213] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 39c95fc..efcc2bc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Nicholas Fleck +Copyright (c) 2014-present Nicholas Fleck Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 3f6c6edec30e11016b13ccc57f9a64f08d18db32 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Wed, 1 Mar 2017 15:28:16 -0500 Subject: [PATCH 108/213] Fix new dictionary import bug. --- .../RantDictionaryTable.Importer.cs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index 469ebea..b21c5b4 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -1,4 +1,4 @@ -#region License +#region License // https://github.com/TheBerkin/Rant // @@ -196,16 +196,20 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) case "endclass": { if (args.Count == 0) + { if (autoClassStack.Count > 0) foreach (string cName in autoClassStack.Pop()) autoClasses.Remove(cName); - else - foreach (var cArg in args) - { - if (!Tools.ValidateClassName(cArg.Value)) - throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); - autoClasses.Remove(cArg.Value); - } + } + else + { + foreach (var cArg in args) + { + if (!Tools.ValidateClassName(cArg.Value)) + throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); + autoClasses.Remove(cArg.Value); + } + } break; } } @@ -735,4 +739,4 @@ public Argument(int charIndex, string value) public override string ToString() => Value; } } -} \ No newline at end of file +} From 180ecf17831f08146c9877a6a0b4390b943e3722 Mon Sep 17 00:00:00 2001 From: cpancake Date: Wed, 1 Mar 2017 16:19:43 -0500 Subject: [PATCH 109/213] Ensure syllable buckets are created. --- Rant/Vocabulary/RantDictionaryTable.cs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 4bdfaff..778acf3 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -65,11 +65,7 @@ public RantDictionaryTable(string name, int termsPerEntry, HashSet hidde TermsPerEntry = termsPerEntry; Name = name; - _syllableBuckets = new SyllableBuckets[termsPerEntry]; - for(var i = 0; i < termsPerEntry; i++) - { - _syllableBuckets[i] = new SyllableBuckets(i, new RantDictionaryEntry[] { }); - } + CreateSyllableBuckets(); } internal RantDictionaryTable() @@ -283,7 +279,8 @@ public bool Merge(RantDictionaryTable other) public void Commit() { _classTree = new ClassTree(_entriesHash); - for(var i = 0; i < TermsPerEntry; i++) + CreateSyllableBuckets(); + for (var i = 0; i < TermsPerEntry; i++) { _syllableBuckets[i] = new SyllableBuckets(i, _entriesList); } @@ -320,12 +317,14 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q { return pool.ToList().PickEntry(sb.RNG)?[index]; } - + // process syllable count filters using syllable buckets var rangeFilters = filters.Where(f => f is RangeFilter).Select(f => f as RangeFilter); if(rangeFilters.Any()) { - foreach(var filter in rangeFilters) + CreateSyllableBuckets(); + + foreach (var filter in rangeFilters) { pool = pool.Intersect(_syllableBuckets[index].Query(filter)); } @@ -455,5 +454,15 @@ internal override void Load(RantEngine engine) { engine.Dictionary.AddTable(this); } + + internal void CreateSyllableBuckets() + { + if (_syllableBuckets != null) return; + _syllableBuckets = new SyllableBuckets[TermsPerEntry]; + for (var i = 0; i < TermsPerEntry; i++) + { + _syllableBuckets[i] = new SyllableBuckets(i, new RantDictionaryEntry[] { }); + } + } } } \ No newline at end of file From dca94d064be737024310d2e3b129ec8a5523a331 Mon Sep 17 00:00:00 2001 From: cpancake Date: Fri, 3 Mar 2017 00:35:40 -0500 Subject: [PATCH 110/213] Added class tree depth limit. --- Rant/Vocabulary/ClassTree.cs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs index f711e24..302d183 100644 --- a/Rant/Vocabulary/ClassTree.cs +++ b/Rant/Vocabulary/ClassTree.cs @@ -8,6 +8,8 @@ namespace Rant.Vocabulary { public class ClassTree { + private const int MAX_DEPTH = 4; + public ClassTreeNode RootNode; public ClassTree(IEnumerable entries) @@ -37,6 +39,11 @@ public IEnumerable Query(IEnumerable classes) private IEnumerable QueryNode(ClassTreeNode node, HashSet classes) { + if(node.DepthLimit) + { + return node.Entries.Where(e => classes.All(c => e.ContainsClass(c))); + } + // find the largest class var largestClass = RootNode.ChildNodes .Where(kv => classes.Contains(kv.Key)) @@ -54,15 +61,22 @@ private IEnumerable QueryNode(ClassTreeNode node, HashSet entries) { - node.Entries = entries.Where(e => e.ClassCount == node.Classes.Length).ToList(); + node.Entries = entries.Where(e => e.ClassCount >= node.Classes.Length).ToList(); if(node.Entries.Count == entries.Count()) return; var otherEntries = entries.Where(e => e.ClassCount > node.Classes.Length); - var classes = OrderClasses(node.Classes, otherEntries); - - foreach(var className in classes) + + if(node.Depth == MAX_DEPTH) + { + node.DepthLimit = true; + return; + } + + var classes = OrderClasses(node.Classes, otherEntries); + foreach (var className in classes) { var childNode = new ClassTreeNode() { Name = className, Classes = node.Classes.Concat(new string[] { className }).ToArray() }; + childNode.Depth = node.Depth + 1; PopulateNode(childNode, otherEntries.Where(e => e.ContainsClass(className))); CountNode(node); @@ -109,5 +123,7 @@ public class ClassTreeNode public int Count = 0; public Dictionary ChildNodes = new Dictionary(); public List Entries = new List(); + public int Depth = 1; + public bool DepthLimit = false; } } From e7c32f47794728d2901c47f33e9e0d565e5e8b15 Mon Sep 17 00:00:00 2001 From: cpancake Date: Fri, 3 Mar 2017 00:49:33 -0500 Subject: [PATCH 111/213] Handle syllable buckets with no syllable data. --- Rant/Vocabulary/SyllableBuckets.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Rant/Vocabulary/SyllableBuckets.cs b/Rant/Vocabulary/SyllableBuckets.cs index 0dea270..0f5c88d 100644 --- a/Rant/Vocabulary/SyllableBuckets.cs +++ b/Rant/Vocabulary/SyllableBuckets.cs @@ -29,6 +29,8 @@ public SyllableBuckets(int termIndex, IEnumerable entries) public List Query(RangeFilter filter) { + if (_buckets.Count == 0) return new List(); + var min = (filter.Minimum == null ? 1 : (int)filter.Minimum); var max = (filter.Maximum == null ? min : (int)filter.Maximum); From 9b509452a7f64bee85672e1384384a30c79087f7 Mon Sep 17 00:00:00 2001 From: cpancake Date: Fri, 3 Mar 2017 00:58:26 -0500 Subject: [PATCH 112/213] Fix formatting. --- Rant.Benchmark/Program.cs | 44 +++++++------- Rant/Vocabulary/ClassTree.cs | 55 +++++++++--------- Rant/Vocabulary/RantDictionaryTable.cs | 80 +++++++++++++------------- Rant/Vocabulary/SyllableBuckets.cs | 14 ++--- 4 files changed, 98 insertions(+), 95 deletions(-) diff --git a/Rant.Benchmark/Program.cs b/Rant.Benchmark/Program.cs index 1e1603e..a104a40 100644 --- a/Rant.Benchmark/Program.cs +++ b/Rant.Benchmark/Program.cs @@ -1,15 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using Rant.Vocabulary; +using System; +using System.Diagnostics; using System.IO; -using System.Text; -using System.Threading.Tasks; +using System.Linq; using System.Reflection; -using System.Diagnostics; - -using Rant; -using Rant.Vocabulary; - +using System.Runtime.ExceptionServices; using static Rant.Common.CmdLine; namespace Rant.Benchmark @@ -22,14 +17,14 @@ class Program static Program() { - if(!int.TryParse(Property("iterations"), out ITERATIONS)) + if (!int.TryParse(Property("iterations"), out ITERATIONS)) ITERATIONS = 5; } static void Main(string[] args) { var rant = new RantEngine(); - if(!string.IsNullOrEmpty(LEGACY_DIC_PATH)) + if (!string.IsNullOrEmpty(LEGACY_DIC_PATH)) { var tables = Directory @@ -39,13 +34,13 @@ static void Main(string[] args) rant.Dictionary = new RantDictionary(tables); } - if(!string.IsNullOrEmpty(PKG_PATH)) + if (!string.IsNullOrEmpty(PKG_PATH)) { rant.LoadPackage(PKG_PATH); } else { - foreach(string pkg in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.rantpkg", SearchOption.AllDirectories)) + foreach (string pkg in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.rantpkg", SearchOption.AllDirectories)) { rant.LoadPackage(pkg); } @@ -57,26 +52,33 @@ static void Main(string[] args) var classes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetMethods().Any(m => m.GetCustomAttributes().Any())); PrintWithColor($"Displaying averages of {ITERATIONS} runs.", ConsoleColor.Cyan); - - foreach(var type in classes) + + foreach (var type in classes) { var suiteObj = Activator.CreateInstance(type); var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); PrintWithColor(type.ToString() + ":", ConsoleColor.Yellow); - foreach(var method in methods) + foreach (var method in methods) { var test = method.GetCustomAttribute(); Console.Write("\t" + test.Name + ": "); var totalSpan = new TimeSpan(0, 0, 0, 0, 0); - - for(var i = 0; i < ITERATIONS; i++) + + for (var i = 0; i < ITERATIONS; i++) { stopwatch.Reset(); stopwatch.Start(); - - var result = method.Invoke(suiteObj, new object[] { rant }); + + try + { + var result = method.Invoke(suiteObj, new object[] { rant }); + } + catch (TargetInvocationException e) + { + ExceptionDispatchInfo.Capture(e.InnerException).Throw(); + } stopwatch.Stop(); diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs index 302d183..c36592a 100644 --- a/Rant/Vocabulary/ClassTree.cs +++ b/Rant/Vocabulary/ClassTree.cs @@ -8,20 +8,21 @@ namespace Rant.Vocabulary { public class ClassTree { - private const int MAX_DEPTH = 4; + private const int MAX_DEPTH = 4; public ClassTreeNode RootNode; public ClassTree(IEnumerable entries) { - RootNode = new ClassTreeNode() { + RootNode = new ClassTreeNode() + { Name = "root", - Classes = new string [] { }, + Classes = new string[] { }, Entries = entries.Where(e => !e.HasClasses).ToList() }; var rootClasses = OrderClasses(new string[] { }, entries); - foreach(var className in rootClasses) + foreach (var className in rootClasses) { var node = new ClassTreeNode() { Name = className, Classes = new string[] { className } }; @@ -39,10 +40,10 @@ public IEnumerable Query(IEnumerable classes) private IEnumerable QueryNode(ClassTreeNode node, HashSet classes) { - if(node.DepthLimit) - { - return node.Entries.Where(e => classes.All(c => e.ContainsClass(c))); - } + if (node.DepthLimit) + { + return node.Entries.Where(e => classes.All(c => e.ContainsClass(c))); + } // find the largest class var largestClass = RootNode.ChildNodes @@ -51,7 +52,7 @@ private IEnumerable QueryNode(ClassTreeNode node, HashSet kv.Value) .FirstOrDefault(); - if(largestClass == default(ClassTreeNode)) + if (largestClass == default(ClassTreeNode)) { return node.Entries; } @@ -62,21 +63,21 @@ private IEnumerable QueryNode(ClassTreeNode node, HashSet entries) { node.Entries = entries.Where(e => e.ClassCount >= node.Classes.Length).ToList(); - if(node.Entries.Count == entries.Count()) return; + if (node.Entries.Count == entries.Count()) return; var otherEntries = entries.Where(e => e.ClassCount > node.Classes.Length); - - if(node.Depth == MAX_DEPTH) - { - node.DepthLimit = true; - return; - } - - var classes = OrderClasses(node.Classes, otherEntries); - foreach (var className in classes) + + if (node.Depth == MAX_DEPTH) + { + node.DepthLimit = true; + return; + } + + var classes = OrderClasses(node.Classes, otherEntries); + foreach (var className in classes) { var childNode = new ClassTreeNode() { Name = className, Classes = node.Classes.Concat(new string[] { className }).ToArray() }; - childNode.Depth = node.Depth + 1; + childNode.Depth = node.Depth + 1; PopulateNode(childNode, otherEntries.Where(e => e.ContainsClass(className))); CountNode(node); @@ -89,7 +90,7 @@ private int CountNode(ClassTreeNode node) { var count = node.Entries.Count; - foreach(var child in node.ChildNodes.Values) + foreach (var child in node.ChildNodes.Values) { count += CountNode(child); } @@ -97,16 +98,16 @@ private int CountNode(ClassTreeNode node) node.Count = count; return count; } - + private IEnumerable OrderClasses(string[] ignoreClasses, IEnumerable entries) { var classCounts = new Dictionary(); - foreach(var entry in entries) + foreach (var entry in entries) { - foreach(var c in entry.GetClasses()) + foreach (var c in entry.GetClasses()) { - if(ignoreClasses.Contains(c)) continue; + if (ignoreClasses.Contains(c)) continue; classCounts[c] = (classCounts.ContainsKey(c) ? classCounts[c] + 1 : 1); } @@ -123,7 +124,7 @@ public class ClassTreeNode public int Count = 0; public Dictionary ChildNodes = new Dictionary(); public List Entries = new List(); - public int Depth = 1; - public bool DepthLimit = false; + public int Depth = 1; + public bool DepthLimit = false; } } diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 778acf3..203760f 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -58,10 +58,10 @@ public sealed partial class RantDictionaryTable : RantResource /// The number of terms to store in each entry. public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) { - if(name == null) throw new ArgumentNullException(nameof(name)); - if(termsPerEntry <= 0) throw new ArgumentException("Terms per entry must be greater than zero."); - if(!Util.ValidateName(name)) throw new ArgumentException($"Invalid table name: '{name}'"); - if(hidden != null) _hidden = hidden; + if (name == null) throw new ArgumentNullException(nameof(name)); + if (termsPerEntry <= 0) throw new ArgumentException("Terms per entry must be greater than zero."); + if (!Util.ValidateName(name)) throw new ArgumentException($"Invalid table name: '{name}'"); + if (hidden != null) _hidden = hidden; TermsPerEntry = termsPerEntry; Name = name; @@ -104,7 +104,7 @@ internal RantDictionaryTable() /// public IEnumerable GetEntries() { - foreach(var entry in _entriesHash) yield return entry; + foreach (var entry in _entriesHash) yield return entry; } /// @@ -120,7 +120,7 @@ public IEnumerable GetEntries() /// public bool IsClassHidden(string className) { - if(className == null) throw new ArgumentNullException(nameof(className)); + if (className == null) throw new ArgumentNullException(nameof(className)); return _hidden.Contains(className); } @@ -145,9 +145,9 @@ public bool IsClassHidden(string className) /// True if successfully added; otherwise, False. public bool AddEntry(RantDictionaryEntry entry) { - if(entry == null) throw new ArgumentNullException(nameof(entry)); - if(entry.TermCount != TermsPerEntry) return false; - if(!_entriesHash.Add(entry)) return false; + if (entry == null) throw new ArgumentNullException(nameof(entry)); + if (entry.TermCount != TermsPerEntry) return false; + if (!_entriesHash.Add(entry)) return false; _entriesList.Add(entry); return true; } @@ -159,8 +159,8 @@ public bool AddEntry(RantDictionaryEntry entry) /// True if successfully removed; otherwise, False. public bool RemoveEntry(RantDictionaryEntry entry) { - if(entry == null) throw new ArgumentNullException(nameof(entry)); - if(!_entriesHash.Remove(entry)) return false; + if (entry == null) throw new ArgumentNullException(nameof(entry)); + if (!_entriesHash.Remove(entry)) return false; _entriesList.Remove(entry); return true; } @@ -172,7 +172,7 @@ public bool RemoveEntry(RantDictionaryEntry entry) /// True if found, False if not. public bool ContainsEntry(RantDictionaryEntry entry) { - if(entry == null) throw new ArgumentNullException(nameof(entry)); + if (entry == null) throw new ArgumentNullException(nameof(entry)); return _entriesHash.Contains(entry); } @@ -202,9 +202,9 @@ public IEnumerable GetClasses() /// public bool AddSubtype(string subtypeName, int index) { - if(index < 0 || index >= TermsPerEntry) return false; - if(subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); - if(!Util.ValidateName(subtypeName)) return false; + if (index < 0 || index >= TermsPerEntry) return false; + if (subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); + if (!Util.ValidateName(subtypeName)) return false; _subtypes[subtypeName] = index; HashSet subs; if (!_subtypeIndexMap.TryGetValue(index, out subs)) @@ -221,8 +221,8 @@ public bool AddSubtype(string subtypeName, int index) /// TRUE if the subtype was found and removed. FALSE if the subtype was not found. public bool RemoveSubtype(string subtypeName) { - if(Util.IsNullOrWhiteSpace(subtypeName)) return false; - if(!_subtypes.ContainsKey(subtypeName)) return false; + if (Util.IsNullOrWhiteSpace(subtypeName)) return false; + if (!_subtypes.ContainsKey(subtypeName)) return false; HashSet subs; if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out subs)) return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); @@ -238,10 +238,10 @@ public bool RemoveSubtype(string subtypeName) /// public int GetSubtypeIndex(string subtype) { - if(Util.IsNullOrWhiteSpace(subtype)) return 0; - if(!Util.ValidateName(subtype)) return -1; + if (Util.IsNullOrWhiteSpace(subtype)) return 0; + if (!Util.ValidateName(subtype)) return -1; int index; - if(int.TryParse(subtype, out index) && index >= 0) return index; + if (int.TryParse(subtype, out index) && index >= 0) return index; return _subtypes.TryGetValue(subtype, out index) ? index : -1; } @@ -252,10 +252,10 @@ public int GetSubtypeIndex(string subtype) /// public IEnumerable GetSubtypesForIndex(int index) { - if(index < 0 || index >= TermsPerEntry) yield break; + if (index < 0 || index >= TermsPerEntry) yield break; HashSet subs; - if(!_subtypeIndexMap.TryGetValue(index, out subs)) yield break; - foreach(string sub in subs) yield return sub; + if (!_subtypeIndexMap.TryGetValue(index, out subs)) yield break; + foreach (string sub in subs) yield return sub; } /// @@ -265,8 +265,8 @@ public IEnumerable GetSubtypesForIndex(int index) /// True if merge succeeded; otherwise, False. public bool Merge(RantDictionaryTable other) { - if(other.Name != Name || other == this) return false; - if(other.TermsPerEntry != TermsPerEntry) return false; + if (other.Name != Name || other == this) return false; + if (other.TermsPerEntry != TermsPerEntry) return false; _entriesHash.AddRange(other._entriesHash); _entriesList.AddRange(other._entriesHash); return true; @@ -294,9 +294,9 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q : GetSubtypeIndex(query.PluralSubtype) : GetSubtypeIndex(query.Subtype); - if(index == -1) return null; + if (index == -1) return null; - if(query.BareQuery) return _entriesList.PickEntry(sb.RNG)?[index]; + if (query.BareQuery) return _entriesList.PickEntry(sb.RNG)?[index]; // process simple class filters using class tree var filters = query.GetFilters(); @@ -307,20 +307,20 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q filters = filters.Where(f => !(f is ClassFilter) || !(f as ClassFilter).SimpleFilter); IEnumerable pool = _entriesList; - if(classes.Any()) + if (classes.Any()) { pool = _classTree.Query(classes); } // if it's just the class filters, let's leave now - if(!filters.Any() && !query.HasCarrier) + if (!filters.Any() && !query.HasCarrier) { return pool.ToList().PickEntry(sb.RNG)?[index]; } - + // process syllable count filters using syllable buckets var rangeFilters = filters.Where(f => f is RangeFilter).Select(f => f as RangeFilter); - if(rangeFilters.Any()) + if (rangeFilters.Any()) { CreateSyllableBuckets(); @@ -332,14 +332,14 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q filters = filters.Where(f => !(f is RangeFilter)); } - if(filters.Any()) + if (filters.Any()) { pool = pool.Where((e, i) => filters.OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, index, query))); } - if(!pool.Any()) return null; + if (!pool.Any()) return null; - if(query.HasCarrier) + if (query.HasCarrier) { return syncState.GetEntry(query.Carrier, index, pool, sb.RNG)?[index]; } @@ -357,20 +357,20 @@ internal override void DeserializeData(BsonItem data) // Subtypes var subs = data["subs"].Values; int si = 0; - foreach(var subList in subs) + foreach (var subList in subs) { - foreach (var sub in subList.Values) AddSubtype(sub, si); + foreach (var sub in subList.Values) AddSubtype(sub, si); si++; } // Hidden classes - foreach(var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); + foreach (var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); var entries = data["entries"]; int count = entries.Count; // Entries - for(int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { var entryData = entries[i]; @@ -419,12 +419,12 @@ internal override BsonItem SerializeData() data["hidden-classes"] = new BsonItem(_hidden.ToArray()); var entries = new BsonItem[_entriesList.Count]; - for(int i = 0; i < _entriesList.Count; i++) + for (int i = 0; i < _entriesList.Count; i++) { var entry = _entriesList[i]; var entryData = new BsonItem(); var termData = new BsonItem[TermsPerEntry]; - + for (int j = 0; j < TermsPerEntry; j++) termData[j] = new BsonItem { diff --git a/Rant/Vocabulary/SyllableBuckets.cs b/Rant/Vocabulary/SyllableBuckets.cs index 0f5c88d..5ff9a81 100644 --- a/Rant/Vocabulary/SyllableBuckets.cs +++ b/Rant/Vocabulary/SyllableBuckets.cs @@ -10,15 +10,15 @@ namespace Rant.Vocabulary internal class SyllableBuckets { private readonly Dictionary> _buckets = new Dictionary>(); - + public SyllableBuckets(int termIndex, IEnumerable entries) { - foreach(var entry in entries) + foreach (var entry in entries) { var syllableCount = entry[termIndex].SyllableCount; - if(syllableCount == 0) continue; + if (syllableCount == 0) continue; - if(!_buckets.ContainsKey(syllableCount)) + if (!_buckets.ContainsKey(syllableCount)) { _buckets[syllableCount] = new List(); } @@ -29,20 +29,20 @@ public SyllableBuckets(int termIndex, IEnumerable entries) public List Query(RangeFilter filter) { - if (_buckets.Count == 0) return new List(); + if (_buckets.Count == 0) return new List(); var min = (filter.Minimum == null ? 1 : (int)filter.Minimum); var max = (filter.Maximum == null ? min : (int)filter.Maximum); // go through twice, first to find out the size to allocate var size = 0; - for(var i = min; i <= max; i++) + for (var i = min; i <= max; i++) { size += _buckets[i].Count; } var list = new List(size); - for(var i = min; i <= max; i++) + for (var i = min; i <= max; i++) { list.AddRange(_buckets[i]); } From 72fab69befb3097a955fb4b8edc93a76fe6ae5b2 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 3 Mar 2017 00:38:01 -0600 Subject: [PATCH 113/213] Only allow queries with plural subtype to consume plurals --- Rant.Tools/Properties/AssemblyInfo.cs | 4 ++-- Rant/Vocabulary/RantDictionaryTable.cs | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Rant.Tools/Properties/AssemblyInfo.cs b/Rant.Tools/Properties/AssemblyInfo.cs index 3492878..f5d6e27 100644 --- a/Rant.Tools/Properties/AssemblyInfo.cs +++ b/Rant.Tools/Properties/AssemblyInfo.cs @@ -5,11 +5,11 @@ // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("Rave")] +[assembly: AssemblyTitle("Rant Command Line Tools")] [assembly: AssemblyDescription("Command-line utilities for Rant")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Rave")] +[assembly: AssemblyProduct("Rant Command Line Tools")] [assembly: AssemblyCopyright("Copyright © Nicholas Fleck 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 778acf3..3e380ba 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -288,11 +288,9 @@ public void Commit() internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) { - int index = sb.TakePlural() - ? string.IsNullOrEmpty(query.PluralSubtype) - ? GetSubtypeIndex(query.Subtype) - : GetSubtypeIndex(query.PluralSubtype) - : GetSubtypeIndex(query.Subtype); + int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() + ? GetSubtypeIndex(query.PluralSubtype) + : GetSubtypeIndex(query.Subtype); if(index == -1) return null; From cf8bec1310697a9f087cf6f0558318de74cf2d15 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 3 Mar 2017 21:14:46 -0600 Subject: [PATCH 114/213] Fix some nasty table load bugs --- Rant.Console/Program.cs | 2 +- Rant/Localization/en-US.lang | 1 + .../RantDictionaryTable.Importer.cs | 1367 +++++++++-------- 3 files changed, 688 insertions(+), 682 deletions(-) diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index b3d8407..d6a6a5a 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -105,7 +105,7 @@ private static void Main(string[] args) while (true) { ForegroundColor = Flag("nsfw") ? ConsoleColor.DarkRed : ConsoleColor.Gray; - Write("RANT> "); // real number symbol + Write("RANT> "); ForegroundColor = ConsoleColor.White; string input = ReadLine(); if (input == null) diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index eb3f317..baec3d3 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -63,6 +63,7 @@ err-compiler-missing-quantity-comma = "Expected comma after quantity." err-table-invalid-class = "Invalid class name: {0}" err-table-too-few-terms = "Too few terms in entry: Expected {0}, found {1}." +err-table-argc-mismatch = "Argument count mismatch: {0} expects {1}, found {2}" err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index b21c5b4..6534435 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -35,708 +35,713 @@ namespace Rant.Vocabulary { - public partial class RantDictionaryTable - { - public static RantDictionaryTable FromStream(string origin, Stream stream) - { - string name = null; // Stores the table name before final table construction - int termsPerEntry = 0; // Stores the term count - var subtypes = new Dictionary(); // Stores subtypes before final table construction - RantDictionaryTable table = null; // The table object, constructed when first entry is found - string l; // Current line string - int line = 0; // Current line number - int len, i; // Length and character index of current line - bool dummy = false; // Determines if the next entry is a dummy entry - string tId = null; // Template ID - RantDictionaryEntry activeTemplate = null; // Current template - var templates = new Dictionary(); - RantDictionaryEntry currentEntry = null; - var autoClasses = new HashSet(); - var autoClassStack = new Stack>(); - - using (var reader = new StreamReader(stream)) - { - while (!reader.EndOfStream) - { - line++; - - // Skip blank lines - if (Util.IsNullOrWhiteSpace(l = reader.ReadLine())) continue; - - // Update line info - len = l.Length; - i = 0; - - // Skip whitespace at the start of the line - while (i < len && char.IsWhiteSpace(l[i])) i++; - - switch (l[i++]) - { - // Comments - case '#': - continue; - - // Directive - case '@': - { - // Read directive name - string directiveName; - int dPos = i; - if (!Tools.ReadDirectiveName(l, len, ref i, out directiveName)) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-directive-name"); - - // Read arguments - var args = new List(); - Argument arg; - while (Tools.ReadArg(origin, l, len, line, ref i, out arg)) args.Add(arg); - - switch (directiveName.ToLowerInvariant()) - { - // Table name definition - case "name": - { - // Do not allow this to appear anywhere except at the top of the file - if (table != null) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); - // Do not allow multiple @name directives - if (name != null) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-multiple-names"); - // One argument required - if (args.Count != 1) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-name-args"); - // Must meet standard identifier requirements - if (!Util.ValidateName(args[0].Value)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-name", args[0].Value); - name = args[0].Value; - break; - } - - // Subtype definition - case "sub": - { - // Do not allow this to appear anywhere except at the top of the file - if (table != null) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); - // @sub requires at least one argument - if (args.Count == 0) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-subtype-args"); - - int termIndex; - // If the first argument is a number, use it as the subtype index. - if (int.TryParse(args[0].Value, out termIndex)) - { - // Disallow negative term indices - if (termIndex < 0) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-index-negative", termIndex); - // Requires at least one name - if (args.Count < 2) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-missing-name"); - // If the index is outside the current term index range, increase the number. - if (termIndex >= termsPerEntry) - termsPerEntry = termIndex + 1; - // Assign all following names to the index - for (int j = 1; j < args.Count; j++) - { - // Validate subtype name - if (!Util.ValidateName(args[j].Value)) - throw new RantTableLoadException(origin, line, args[j].CharIndex + 1, "err-table-bad-subtype", args[j].Value); - subtypes[args[j].Value] = termIndex; - } - } - else - { - // Add to last index - termIndex = termsPerEntry++; - // Assign all following names to the index - foreach (var a in args) - { - // Validate subtype name - if (!Util.ValidateName(a.Value)) - throw new RantTableLoadException(origin, line, a.CharIndex + 1, "err-table-bad-subtype", a.Value); - subtypes[a.Value] = termIndex; - } - } - break; - } - case "dummy": - if (args.Count != 0) - throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 0, args.Count); - dummy = true; - break; - case "id": - if (args.Count != 1) - throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); - if (!Util.ValidateName(args[0].Value)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); - tId = args[0].Value; - break; - case "using": - if (args.Count != 1) - throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); - if (!Util.ValidateName(args[0].Value)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); - if (!templates.TryGetValue(args[0].Value, out activeTemplate)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-template-not-found", args[0].Value); - break; - case "class": - { - var cList = new List(); - if (args.Count == 0) - throw new RantTableLoadException(origin, line, i, "err-table-args-expected", directiveName); - foreach (var cArg in args) - { - if (!Tools.ValidateClassName(cArg.Value)) - throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); - cList.Add(cArg.Value); - autoClasses.Add(cArg.Value); - } - autoClassStack.Push(cList); - break; - } - case "endclass": - { - if (args.Count == 0) - { - if (autoClassStack.Count > 0) - foreach (string cName in autoClassStack.Pop()) - autoClasses.Remove(cName); - } - else - { - foreach (var cArg in args) - { - if (!Tools.ValidateClassName(cArg.Value)) - throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); - autoClasses.Remove(cArg.Value); - } - } - break; - } - } - break; - } - - // Entry - case '>': - Tools.ConstructTable(origin, name, subtypes, ref termsPerEntry, ref table); - Tools.ReadTerms(origin, l, len, line, ref i, table, activeTemplate, templates, out currentEntry); - if (!dummy) table.AddEntry(currentEntry); - foreach (string autoClass in autoClasses) currentEntry.AddClass(autoClass); - if (tId != null) - { - templates[tId] = currentEntry; - tId = null; - } - dummy = false; - activeTemplate = null; - break; - - // Property - case '-': - { - Tools.ConstructTable(origin, name, subtypes, ref termsPerEntry, ref table); - Tools.SkipSpace(l, len, ref i); - - // Read property name - string propName; - int dPos = i; - if (!Tools.ReadDirectiveName(l, len, ref i, out propName)) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-property-name"); - - // Read arguments - var args = new List(); - Argument arg; - while (Tools.ReadArg(origin, l, len, line, ref i, out arg)) args.Add(arg); - - // No args? Skip it. - if (args.Count == 0) - continue; - - switch (propName.ToLowerInvariant()) - { - case "class": - foreach (var cArg in args) - { - if (!Tools.ValidateClassName(cArg.Value)) - throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); - currentEntry.AddClass(cArg.Value); - } - break; - case "weight": - { - int weight; - if (!int.TryParse(args[0].Value, out weight) || weight <= 0) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-weight", args[0].Value); - currentEntry.Weight = weight; - break; - } - case "pron": - if (args.Count != table.TermsPerEntry) - continue; - for (int j = 0; j < currentEntry.TermCount; j++) - currentEntry[j].Pronunciation = args[j].Value; - break; - default: - if (args.Count == 1) - currentEntry.SetMetadata(propName, args[0].Value); - else - currentEntry.SetMetadata(propName, args.Select(a => a.Value).ToArray()); - break; - } - break; - } - } - } - } - - table.Commit(); - - return table; - } - - private static class Tools - { + public partial class RantDictionaryTable + { + public static RantDictionaryTable FromStream(string origin, Stream stream) + { + string name = null; // Stores the table name before final table construction + int termsPerEntry = 0; // Stores the term count + var subtypes = new Dictionary(); // Stores subtypes before final table construction + RantDictionaryTable table = null; // The table object, constructed when first entry is found + string l; // Current line string + int line = 0; // Current line number + int len, i; // Length and character index of current line + bool dummy = false; // Determines if the next entry is a dummy entry + string tId = null; // Template ID + RantDictionaryEntry activeTemplate = null; // Current template + var templates = new Dictionary(); + RantDictionaryEntry currentEntry = null; + var autoClasses = new HashSet(); + var autoClassStack = new Stack>(); + + using (var reader = new StreamReader(stream)) + { + while (!reader.EndOfStream) + { + line++; + + // Skip blank lines + if (Util.IsNullOrWhiteSpace(l = reader.ReadLine())) continue; + + // Update line info + len = l.Length; + i = 0; + + // Skip whitespace at the start of the line + while (i < len && char.IsWhiteSpace(l[i])) i++; + + switch (l[i++]) + { + // Comments + case '#': + continue; + + // Directive + case '@': + { + // Read directive name + string directiveName; + int dPos = i; + if (!Tools.ReadDirectiveName(l, len, ref i, out directiveName)) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-directive-name"); + + // Read arguments + var args = new List(); + Argument arg; + while (Tools.ReadArg(origin, l, len, line, ref i, out arg)) args.Add(arg); + + switch (directiveName.ToLowerInvariant()) + { + // Table name definition + case "name": + { + // Do not allow this to appear anywhere except at the top of the file + if (table != null) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); + // Do not allow multiple @name directives + if (name != null) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-multiple-names"); + // One argument required + if (args.Count != 1) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-name-args"); + // Must meet standard identifier requirements + if (!Util.ValidateName(args[0].Value)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-name", args[0].Value); + name = args[0].Value; + break; + } + + // Subtype definition + case "sub": + { + // Do not allow this to appear anywhere except at the top of the file + if (table != null) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); + // @sub requires at least one argument + if (args.Count == 0) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-subtype-args"); + + int termIndex; + // If the first argument is a number, use it as the subtype index. + if (int.TryParse(args[0].Value, out termIndex)) + { + // Disallow negative term indices + if (termIndex < 0) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-index-negative", termIndex); + // Requires at least one name + if (args.Count < 2) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-missing-name"); + // If the index is outside the current term index range, increase the number. + if (termIndex >= termsPerEntry) + termsPerEntry = termIndex + 1; + // Assign all following names to the index + for (int j = 1; j < args.Count; j++) + { + // Validate subtype name + if (!Util.ValidateName(args[j].Value)) + throw new RantTableLoadException(origin, line, args[j].CharIndex + 1, "err-table-bad-subtype", args[j].Value); + subtypes[args[j].Value] = termIndex; + } + } + else + { + // Add to last index + termIndex = termsPerEntry++; + // Assign all following names to the index + foreach (var a in args) + { + // Validate subtype name + if (!Util.ValidateName(a.Value)) + throw new RantTableLoadException(origin, line, a.CharIndex + 1, "err-table-bad-subtype", a.Value); + subtypes[a.Value] = termIndex; + } + } + break; + } + case "dummy": + if (args.Count != 0) + throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 0, args.Count); + dummy = true; + break; + case "id": + if (args.Count != 1) + throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); + if (!Util.ValidateName(args[0].Value)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); + tId = args[0].Value; + break; + case "using": + if (args.Count != 1) + throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); + if (!Util.ValidateName(args[0].Value)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); + if (!templates.TryGetValue(args[0].Value, out activeTemplate)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-template-not-found", args[0].Value); + break; + case "class": + { + var cList = new List(); + if (args.Count == 0) + throw new RantTableLoadException(origin, line, i, "err-table-args-expected", directiveName); + foreach (var cArg in args) + { + if (!Tools.ValidateClassName(cArg.Value)) + throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); + cList.Add(cArg.Value); + autoClasses.Add(cArg.Value); + } + autoClassStack.Push(cList); + break; + } + case "endclass": + { + if (args.Count == 0) + { + if (autoClassStack.Count > 0) + foreach (string cName in autoClassStack.Pop()) + autoClasses.Remove(cName); + } + else + { + foreach (var cArg in args) + { + if (!Tools.ValidateClassName(cArg.Value)) + throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); + autoClasses.Remove(cArg.Value); + } + } + break; + } + } + break; + } + + // Entry + case '>': + Tools.ConstructTable(origin, name, subtypes, ref termsPerEntry, ref table); + Tools.ReadTerms(origin, l, len, line, ref i, table, activeTemplate, templates, out currentEntry); + if (!dummy) table.AddEntry(currentEntry); + foreach (string autoClass in autoClasses) currentEntry.AddClass(autoClass); + if (tId != null) + { + templates[tId] = currentEntry; + tId = null; + } + dummy = false; + activeTemplate = null; + break; + + // Property + case '-': + { + Tools.ConstructTable(origin, name, subtypes, ref termsPerEntry, ref table); + Tools.SkipSpace(l, len, ref i); + + // Read property name + string propName; + int dPos = i; + if (!Tools.ReadDirectiveName(l, len, ref i, out propName)) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-property-name"); + + // Read arguments + var args = new List(); + Argument arg; + while (Tools.ReadArg(origin, l, len, line, ref i, out arg)) args.Add(arg); + + // No args? Skip it. + if (args.Count == 0) + continue; + + switch (propName.ToLowerInvariant()) + { + case "class": + foreach (var cArg in args) + { + if (!Tools.ValidateClassName(cArg.Value)) + throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); + currentEntry.AddClass(cArg.Value); + } + break; + case "weight": + { + int weight; + if (!int.TryParse(args[0].Value, out weight) || weight <= 0) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-weight", args[0].Value); + currentEntry.Weight = weight; + break; + } + case "pron": + if (args.Count != table.TermsPerEntry) + continue; + for (int j = 0; j < currentEntry.TermCount; j++) + currentEntry[j].Pronunciation = args[j].Value; + break; + default: + if (args.Count == 1) + currentEntry.SetMetadata(propName, args[0].Value); + else + currentEntry.SetMetadata(propName, args.Select(a => a.Value).ToArray()); + break; + } + break; + } + } + } + } + + table.Commit(); + + return table; + } + + private static class Tools + { #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static void ConstructTable(string origin, string name, Dictionary subs, ref int termCount, ref RantDictionaryTable table) - { - if (table != null) return; - if (name == null) - throw new RantTableLoadException(origin, 1, 1, "err-table-missing-name"); + public static void ConstructTable(string origin, string name, Dictionary subs, ref int termCount, ref RantDictionaryTable table) + { + if (table != null) return; + if (name == null) + throw new RantTableLoadException(origin, 1, 1, "err-table-missing-name"); - if (termCount == 0 || subs.Count == 0) - { - subs.Add("default", 0); - termCount = 1; - } + if (termCount == 0 || subs.Count == 0) + { + subs.Add("default", 0); + termCount = 1; + } - table = new RantDictionaryTable(name, termCount); + table = new RantDictionaryTable(name, termCount); - foreach (var sub in subs) - table.AddSubtype(sub.Key, sub.Value); - } + foreach (var sub in subs) + table.AddSubtype(sub.Key, sub.Value); + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool ReadDirectiveName(string str, int len, ref int i, out string result) - { - result = null; - if (i >= len) return false; - int start = i; - while (i < len && (char.IsLetterOrDigit(str[i]) || str[i] == '_')) i++; - if (i == start) return false; - result = str.Substring(start, i - start); - return true; - } + public static bool ReadDirectiveName(string str, int len, ref int i, out string result) + { + result = null; + if (i >= len) return false; + int start = i; + while (i < len && (char.IsLetterOrDigit(str[i]) || str[i] == '_')) i++; + if (i == start) return false; + result = str.Substring(start, i - start); + return true; + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static void SkipSpace(string str, int len, ref int i) - { - while (i < len && char.IsWhiteSpace(str[i])) i++; - } + public static void SkipSpace(string str, int len, ref int i) + { + while (i < len && char.IsWhiteSpace(str[i])) i++; + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool ValidateClassName(string input) - { - if (input == null || input.Length == 0) return false; - for (int i = 0; i < input.Length; i++) - if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' || i < input.Length - 1 && input[i] == '?') return false; - return true; - } + public static bool ValidateClassName(string input) + { + if (input == null || input.Length == 0) return false; + for (int i = 0; i < input.Length; i++) + if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' || i < input.Length - 1 && input[i] == '?') return false; + return true; + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static void ReadTerms(string origin, string str, int len, int line, ref int i, - RantDictionaryTable table, RantDictionaryEntry activeTemplate, Dictionary templates, out RantDictionaryEntry result) - { - SkipSpace(str, len, ref i); - int t = 0; - var terms = new RantDictionaryTerm[table.TermsPerEntry]; - int split = -1; - char c = '\0'; - var buffer = new StringBuilder(); - var white = new StringBuilder(); - while (i < len) - switch (c = str[i++]) - { - // Inline comment - case '#': - goto done; - // Phrasal split operator - case '+': - if (split > -1) - throw new RantTableLoadException(origin, line, i, "err-table-multiple-splits"); - white.Length = 0; - split = buffer.Length; - SkipSpace(str, len, ref i); - break; - // Term reference - case '[': - { - SkipSpace(str, len, ref i); - if (i >= len) - throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); - int start = i; - int termIndex = -1; - if (white.Length > 0) - { - buffer.Append(white); - white.Length = 0; - } - switch (str[i++]) - { - // Current term from active template - case ']': - buffer.Append(activeTemplate[t].Value); - break; - // Custom term from active template - case '.': - { - if (activeTemplate == null) - throw new RantTableLoadException(origin, line, start + 1, "err-table-no-template"); - while (i < len && IsValidSubtypeChar(str[i])) i++; // Read subtype name - if (str[i] != ']') - throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); - string subName = str.Substring(start + 1, i - start - 1); - if (subName.Length == 0) - throw new RantTableLoadException(origin, line, start + 1, "err-table-empty-subtype-reference"); - int templateSubIndex = table.GetSubtypeIndex(subName); - if (templateSubIndex == -1) - throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", subName); - - // Add term value to buffer - buffer.Append(activeTemplate[templateSubIndex].Value); - i++; // Skip past closing bracket - break; - } - // It is probably a reference to another entry, let's see. - default: - { - while (i < len && IsValidSubtypeChar(str[i]) || str[i] == '.') i++; - if (str[i] != ']') - throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); - var id = str.Substring(start, i - start).Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); - switch (id.Length) - { - // It's just a template ID. - case 1: - { - RantDictionaryEntry entry; - if (!templates.TryGetValue(id[0], out entry)) - throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); - // Append term value to buffer - buffer.Append(entry[termIndex].Value); - break; - } - // Template ID and custom subtype - case 2: - { - RantDictionaryEntry entry; - if (!templates.TryGetValue(id[0], out entry)) - throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); - int templateSubIndex = table.GetSubtypeIndex(id[1]); - if (templateSubIndex == -1 || templateSubIndex >= table.TermsPerEntry) - throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", id[1]); - buffer.Append(entry[templateSubIndex].Value); - break; - } - // ??? - default: - throw new RantTableLoadException(origin, line, start + 1, "err-table-invalid-term-reference"); - } - - i++; // Skip past closing bracket - break; - } - } - break; - } - case '\\': - { - if (white.Length > 0) - { - buffer.Append(white); - white.Length = 0; - } - switch (c = str[i++]) - { - case 'n': - buffer.Append('\n'); - continue; - case 'r': - buffer.Append('\r'); - continue; - case 't': - buffer.Append('\t'); - continue; - case 'v': - buffer.Append('\v'); - continue; - case 'f': - buffer.Append('\f'); - continue; - case 'b': - buffer.Append('\b'); - continue; - case 's': - buffer.Append(' '); - continue; - case 'u': - { - if (i + 4 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - ushort codePoint; - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append((char)codePoint); - i += 4; - continue; - } - case 'U': - { - if (i + 8 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - char high, low; - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append(high).Append(low); - i += 8; - continue; - } - default: - buffer.Append(c); - continue; - } - continue; - } - case ',': - if (t >= terms.Length) - throw new RantTableLoadException(origin, line, i, "err-table-too-many-terms", terms.Length, t); - terms[t++] = new RantDictionaryTerm(buffer.ToString(), split); - buffer.Length = 0; - white.Length = 0; - split = -1; - SkipSpace(str, len, ref i); - break; - default: - if (char.IsWhiteSpace(c)) - { - white.Append(c); - } - else - { - if (white.Length > 0) - { - buffer.Append(white); - white.Length = 0; - } - buffer.Append(c); - } - continue; - } - - done: - - if (t != terms.Length - 1) - throw new RantTableLoadException(origin, line, i, "err-table-too-few-terms", terms.Length, t + 1); - - terms[t] = new RantDictionaryTerm(buffer.ToString()); - - result = new RantDictionaryEntry(terms); - } + public static void ReadTerms(string origin, string str, int len, int line, ref int i, + RantDictionaryTable table, RantDictionaryEntry activeTemplate, Dictionary templates, out RantDictionaryEntry result) + { + SkipSpace(str, len, ref i); + int t = 0; + var terms = new RantDictionaryTerm[table.TermsPerEntry]; + int split = -1; + char c = '\0'; + var buffer = new StringBuilder(); + var white = new StringBuilder(); + while (i < len) + switch (c = str[i++]) + { + // Inline comment + case '#': + goto done; + // Phrasal split operator + case '+': + if (split > -1) + throw new RantTableLoadException(origin, line, i, "err-table-multiple-splits"); + white.Length = 0; + split = buffer.Length; + SkipSpace(str, len, ref i); + break; + // Term reference + case '[': + { + SkipSpace(str, len, ref i); + if (i >= len) + throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); + int start = i; + int termIndex = -1; + if (white.Length > 0) + { + buffer.Append(white); + white.Length = 0; + } + switch (str[i++]) + { + // Current term from active template + case ']': + if (t == -1) + throw new RantTableLoadException(origin, line, start + 1, "err-table-no-template"); + buffer.Append(activeTemplate[t].Value); + break; + // Custom term from active template + case '.': + { + if (activeTemplate == null) + throw new RantTableLoadException(origin, line, start + 1, "err-table-no-template"); + while (i < len && IsValidSubtypeChar(str[i])) i++; // Read subtype name + if (str[i] != ']') + throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); + string subName = str.Substring(start + 1, i - start - 1); + if (subName.Length == 0) + throw new RantTableLoadException(origin, line, start + 1, "err-table-empty-subtype-reference"); + int templateSubIndex = table.GetSubtypeIndex(subName); + if (templateSubIndex == -1) + throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", subName); + + // Add term value to buffer + buffer.Append(activeTemplate[templateSubIndex].Value); + i++; // Skip past closing bracket + break; + } + // It is probably a reference to another entry, let's see. + default: + { + while (i < len && IsValidSubtypeChar(str[i]) || str[i] == '.') i++; + if (str[i] != ']') + throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); + var id = str.Substring(start, i - start).Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); + switch (id.Length) + { + // It's just a template ID. + case 1: + { + RantDictionaryEntry entry; + if (!templates.TryGetValue(id[0], out entry)) + throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); + // Append term value to buffer + buffer.Append(entry[t].Value); + break; + } + // Template ID and custom subtype + case 2: + { + RantDictionaryEntry entry; + if (!templates.TryGetValue(id[0], out entry)) + throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); + int templateSubIndex = table.GetSubtypeIndex(id[1]); + if (templateSubIndex == -1 || templateSubIndex >= table.TermsPerEntry) + throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", id[1]); + buffer.Append(entry[templateSubIndex].Value); + break; + } + // ??? + default: + throw new RantTableLoadException(origin, line, start + 1, "err-table-invalid-term-reference"); + } + + i++; // Skip past closing bracket + break; + } + } + break; + } + case '\\': + { + if (white.Length > 0) + { + buffer.Append(white); + white.Length = 0; + } + switch (c = str[i++]) + { + case 'n': + buffer.Append('\n'); + continue; + case 'r': + buffer.Append('\r'); + continue; + case 't': + buffer.Append('\t'); + continue; + case 'v': + buffer.Append('\v'); + continue; + case 'f': + buffer.Append('\f'); + continue; + case 'b': + buffer.Append('\b'); + continue; + case 's': + buffer.Append(' '); + continue; + case 'u': + { + if (i + 4 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + ushort codePoint; + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append((char)codePoint); + i += 4; + continue; + } + case 'U': + { + if (i + 8 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + char high, low; + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append(high).Append(low); + i += 8; + continue; + } + default: + buffer.Append(c); + continue; + } + continue; + } + case ',': + if (t >= terms.Length) + throw new RantTableLoadException(origin, line, i, "err-table-too-many-terms", terms.Length, t); + terms[t++] = new RantDictionaryTerm(buffer.ToString(), split); + buffer.Length = 0; + white.Length = 0; + split = -1; + SkipSpace(str, len, ref i); + break; + default: + if (char.IsWhiteSpace(c)) + { + white.Append(c); + } + else + { + if (white.Length > 0) + { + buffer.Append(white); + white.Length = 0; + } + buffer.Append(c); + } + continue; + } + + done: + + if (t != terms.Length - 1) + throw new RantTableLoadException(origin, line, i, "err-table-too-few-terms", terms.Length, t + 1); + + terms[t] = new RantDictionaryTerm(buffer.ToString()); + + result = new RantDictionaryEntry(terms); + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool IsValidSubtypeChar(char c) => char.IsLetterOrDigit(c) || c == '_'; + public static bool IsValidSubtypeChar(char c) => char.IsLetterOrDigit(c) || c == '_'; #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool ReadArg(string origin, string str, int len, int line, ref int i, out Argument result) - { - result = null; - while (i < len && char.IsWhiteSpace(str[i])) i++; - if (i == len || str[i] == '#') return false; - int start = i; - var buffer = new StringBuilder(); - char c; - - // Handle string literal - if (str[i] == '\"') - { - if (++i >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); - while (i < len) - switch (c = str[i++]) - { - case '\"': - while (i < len && char.IsWhiteSpace(str[i])) i++; - if (i < len && str[i] == ',') i++; - result = new Argument(start, buffer.ToString()); - return true; - case '\\': - if (i >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - switch (c = str[i++]) - { - case 'n': - buffer.Append('\n'); - continue; - case 'r': - buffer.Append('\r'); - continue; - case 't': - buffer.Append('\t'); - continue; - case 'v': - buffer.Append('\v'); - continue; - case 'f': - buffer.Append('\f'); - continue; - case 'b': - buffer.Append('\b'); - continue; - case 's': - buffer.Append(' '); - continue; - case 'u': - { - if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - ushort codePoint; - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append((char)codePoint); - i += 4; - continue; - } - case 'U': - { - if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - char high, low; - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append(high).Append(low); - i += 8; - continue; - } - default: - buffer.Append(c); - continue; - } - break; - default: - buffer.Append(c); - break; - } - throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); - } - - var white = new StringBuilder(); - - // If it isn't a string literal, simply read until a comma is reached. - while (i < len) - switch (c = str[i++]) - { - case ',': - case '#': - result = new Argument(start, buffer.ToString()); - return true; - case '\\': - { - if (white.Length > 0) - { - buffer.Append(white); - white.Length = 0; - } - switch (c = str[i++]) - { - case 'n': - buffer.Append('\n'); - continue; - case 'r': - buffer.Append('\r'); - continue; - case 't': - buffer.Append('\t'); - continue; - case 'v': - buffer.Append('\v'); - continue; - case 'f': - buffer.Append('\f'); - continue; - case 'b': - buffer.Append('\b'); - continue; - case 's': - buffer.Append(' '); - continue; - case 'u': - { - if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - ushort codePoint; - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append((char)codePoint); - i += 4; - continue; - } - case 'U': - { - if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - char high, low; - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append(high).Append(low); - i += 8; - continue; - } - default: - buffer.Append(c); - continue; - } - continue; - } - case '\"': - throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); - default: - if (char.IsWhiteSpace(c)) - { - white.Append(c); - } - else - { - if (white.Length > 0) - { - buffer.Append(white); - white.Length = 0; - } - buffer.Append(c); - } - continue; - } - - result = new Argument(start, buffer.ToString()); - return true; - } - } - - internal sealed class Argument - { - public Argument(int charIndex, string value) - { - CharIndex = charIndex; - Value = value; - } - - public int CharIndex { get; } - public string Value { get; } - public override string ToString() => Value; - } - } + public static bool ReadArg(string origin, string str, int len, int line, ref int i, out Argument result) + { + result = null; + while (i < len && char.IsWhiteSpace(str[i])) i++; + if (i == len || str[i] == '#') return false; + int start = i; + var buffer = new StringBuilder(); + char c; + + // Handle string literal + if (str[i] == '\"') + { + if (++i >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); + while (i < len) + switch (c = str[i++]) + { + case '\"': + while (i < len && char.IsWhiteSpace(str[i])) i++; + if (i < len && str[i] == ',') i++; + result = new Argument(start, buffer.ToString()); + return true; + case '\\': + if (i >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + switch (c = str[i++]) + { + case 'n': + buffer.Append('\n'); + continue; + case 'r': + buffer.Append('\r'); + continue; + case 't': + buffer.Append('\t'); + continue; + case 'v': + buffer.Append('\v'); + continue; + case 'f': + buffer.Append('\f'); + continue; + case 'b': + buffer.Append('\b'); + continue; + case 's': + buffer.Append(' '); + continue; + case 'u': + { + if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + ushort codePoint; + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append((char)codePoint); + i += 4; + continue; + } + case 'U': + { + if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + char high, low; + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append(high).Append(low); + i += 8; + continue; + } + default: + buffer.Append(c); + continue; + } + break; + default: + buffer.Append(c); + break; + } + throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); + } + + var white = new StringBuilder(); + + // If it isn't a string literal, simply read until a comma is reached. + while (i < len) + switch (c = str[i++]) + { + case ',': + result = new Argument(start, buffer.ToString()); + return true; + case '#': + result = new Argument(start, buffer.ToString()); + i = len; + return true; + case '\\': + { + if (white.Length > 0) + { + buffer.Append(white); + white.Length = 0; + } + switch (c = str[i++]) + { + case 'n': + buffer.Append('\n'); + continue; + case 'r': + buffer.Append('\r'); + continue; + case 't': + buffer.Append('\t'); + continue; + case 'v': + buffer.Append('\v'); + continue; + case 'f': + buffer.Append('\f'); + continue; + case 'b': + buffer.Append('\b'); + continue; + case 's': + buffer.Append(' '); + continue; + case 'u': + { + if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + ushort codePoint; + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append((char)codePoint); + i += 4; + continue; + } + case 'U': + { + if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + char high, low; + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append(high).Append(low); + i += 8; + continue; + } + default: + buffer.Append(c); + continue; + } + continue; + } + case '\"': + throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); + default: + if (char.IsWhiteSpace(c)) + { + white.Append(c); + } + else + { + if (white.Length > 0) + { + buffer.Append(white); + white.Length = 0; + } + buffer.Append(c); + } + continue; + } + + result = new Argument(start, buffer.ToString()); + return true; + } + } + + internal sealed class Argument + { + public Argument(int charIndex, string value) + { + CharIndex = charIndex; + Value = value; + } + + public int CharIndex { get; } + public string Value { get; } + public override string ToString() => Value; + } + } } From 97b7243dfce3c02dd246308fe95c6c3ce804c62f Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 3 Mar 2017 21:44:15 -0600 Subject: [PATCH 115/213] Fix table bugs, replace console's -package option with -pkgdir --- Rant.Console/Program.cs | 9 ++++++--- Rant/Vocabulary/RantDictionaryTable.Importer.cs | 13 +++++++++++++ Rant/Vocabulary/RantDictionaryTable.cs | 7 ++++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index d6a6a5a..d6d51d3 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -22,7 +22,7 @@ internal class Program public const double PATTERN_TIMEOUT = 0.0; #endif public static readonly string FILE = GetPaths().FirstOrDefault(); - public static readonly string PKG_PATH = Property("package"); + public static readonly string PKG_DIR = Property("pkgdir"); public static readonly string LEGACY_DIC_PATH = Property("ldict"); public static readonly long SEED; public static readonly bool USE_SEED; @@ -53,12 +53,15 @@ private static void Main(string[] args) rant.Dictionary = new RantDictionary(tables); } - if (!string.IsNullOrEmpty(PKG_PATH)) + if (!string.IsNullOrEmpty(PKG_DIR)) { #if DEBUG Stopwatch timer = Stopwatch.StartNew(); #endif - rant.LoadPackage(PKG_PATH); + foreach(var pkg in Directory.GetFiles(PKG_DIR, "*.rantpkg")) + { + rant.LoadPackage(pkg); + } #if DEBUG timer.Stop(); WriteLine($"Package loading: {timer.ElapsedMilliseconds}ms"); diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index 6534435..11ae1b9 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -550,6 +550,19 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i terms[t] = new RantDictionaryTerm(buffer.ToString()); result = new RantDictionaryEntry(terms); + + // Add classes from template + if (activeTemplate != null) + { + foreach(var cl in activeTemplate.GetRequiredClasses()) + { + result.AddClass(cl, false); + } + foreach (var cl in activeTemplate.GetOptionalClasses()) + { + result.AddClass(cl, true); + } + } } #if !UNITY diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index fc78d77..65310e3 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -269,6 +269,7 @@ public bool Merge(RantDictionaryTable other) if (other.TermsPerEntry != TermsPerEntry) return false; _entriesHash.AddRange(other._entriesHash); _entriesList.AddRange(other._entriesHash); + Commit(); return true; } @@ -288,9 +289,9 @@ public void Commit() internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) { - int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() - ? GetSubtypeIndex(query.PluralSubtype) - : GetSubtypeIndex(query.Subtype); + int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() + ? GetSubtypeIndex(query.PluralSubtype) + : GetSubtypeIndex(query.Subtype); if (index == -1) return null; From f7545a9f7d31f7a7d87f172d0ab5ca393bf7b5ef Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sat, 4 Mar 2017 14:46:06 -0600 Subject: [PATCH 116/213] Add support for hidden classes to table format --- Rant/Vocabulary/RantDictionaryTable.Importer.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index 11ae1b9..e204c06 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -42,6 +42,7 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) string name = null; // Stores the table name before final table construction int termsPerEntry = 0; // Stores the term count var subtypes = new Dictionary(); // Stores subtypes before final table construction + var hidden = new HashSet(StringComparer.InvariantCultureIgnoreCase); RantDictionaryTable table = null; // The table object, constructed when first entry is found string l; // Current line string int line = 0; // Current line number @@ -158,6 +159,15 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) } break; } + case "hide": + if (args.Count == 0) break; + foreach(var a in args) + { + if (!Util.ValidateName(a.Value)) + throw new RantTableLoadException(origin, line, i, "err-table-invalid-class", a.Value); + hidden.Add(String.Intern(a.Value)); + } + break; case "dummy": if (args.Count != 0) throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 0, args.Count); @@ -289,6 +299,12 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) } } + // Add hidden classes + foreach(var hc in hidden) + { + table.HideClass(hc); + } + table.Commit(); return table; From 9c4160bab5a2e272ec384f13568ff6ccc3962625 Mon Sep 17 00:00:00 2001 From: cpancake Date: Sat, 4 Mar 2017 20:28:12 -0500 Subject: [PATCH 117/213] Fix class tree bugs. --- Rant/Vocabulary/ClassTree.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs index c36592a..e52bd5f 100644 --- a/Rant/Vocabulary/ClassTree.cs +++ b/Rant/Vocabulary/ClassTree.cs @@ -46,7 +46,7 @@ private IEnumerable QueryNode(ClassTreeNode node, HashSet classes.Contains(kv.Key)) .OrderByDescending(kv => kv.Value.Count) .Select(kv => kv.Value) @@ -54,6 +54,8 @@ private IEnumerable QueryNode(ClassTreeNode node, HashSet(); return node.Entries; } @@ -63,8 +65,6 @@ private IEnumerable QueryNode(ClassTreeNode node, HashSet entries) { node.Entries = entries.Where(e => e.ClassCount >= node.Classes.Length).ToList(); - if (node.Entries.Count == entries.Count()) return; - var otherEntries = entries.Where(e => e.ClassCount > node.Classes.Length); if (node.Depth == MAX_DEPTH) From 3d2ce2680d2374e9ba54652796bc992686ef2774 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 5 Mar 2017 19:04:18 -0600 Subject: [PATCH 118/213] Fix optional classes not being read --- Rant/Vocabulary/RantDictionaryTable.Importer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index e204c06..c6a3536 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -362,7 +362,7 @@ public static bool ValidateClassName(string input) { if (input == null || input.Length == 0) return false; for (int i = 0; i < input.Length; i++) - if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' || i < input.Length - 1 && input[i] == '?') return false; + if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' && (i < input.Length - 1 && input[i] == '?')) return false; return true; } From 3e9ffeaaa929f0898839994527c0c489179ef1e1 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 5 Mar 2017 19:32:45 -0600 Subject: [PATCH 119/213] Make @endclass parameterless --- Rant/Vocabulary/RantDictionaryTable.Importer.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index c6a3536..078c919 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -211,15 +211,6 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) foreach (string cName in autoClassStack.Pop()) autoClasses.Remove(cName); } - else - { - foreach (var cArg in args) - { - if (!Tools.ValidateClassName(cArg.Value)) - throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); - autoClasses.Remove(cArg.Value); - } - } break; } } From b6c47b74a3bdd1117d8ffcd5f9617636b17ffd19 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 9 Mar 2017 23:47:57 -0600 Subject: [PATCH 120/213] Various bugfixes and improvements - Fix: Missing angle bracket reversal case - Fix: Mode enumeration crashing on missing description - Fix: Incorrect function param name formatting - Add: Description for [char] - Change: Use new C# 7 inline variables - Change: Load unicode character name list from embedded resource instead of a shockingly gigantic chain of Add() calls --- Rant/Core/Formatting/Unicode.cs | 30639 +--------------- Rant/Core/Formatting/unicode_code_points.dat | 30570 +++++++++++++++ Rant/Core/Framework/RantFunctionParameter.cs | 4 +- Rant/Core/Framework/RantFunctionRegistry.cs | 5 +- Rant/Core/Utilities/Util.cs | 4 +- Rant/Rant.csproj | 4 +- Rant/Vocabulary/RantDictionary.cs | 43 +- Rant/Vocabulary/RantDictionaryEntry.cs | 5 +- .../RantDictionaryTable.Importer.cs | 43 +- Rant/Vocabulary/RantDictionaryTable.cs | 24 +- Rant/Vocabulary/Utilities/VocabUtils.cs | 5 +- 11 files changed, 30670 insertions(+), 30676 deletions(-) create mode 100644 Rant/Core/Formatting/unicode_code_points.dat diff --git a/Rant/Core/Formatting/Unicode.cs b/Rant/Core/Formatting/Unicode.cs index 6f23251..d402623 100644 --- a/Rant/Core/Formatting/Unicode.cs +++ b/Rant/Core/Formatting/Unicode.cs @@ -25,6 +25,8 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Reflection; using System.Text; namespace Rant.Core.Formatting @@ -37,30610 +39,49 @@ internal static class Unicode static Unicode() { - _unicodeCharacterMap = new Dictionary(); - - _unicodeCharacterMap.Add("NULL", 0); - _unicodeCharacterMap.Add("START OF HEADING", 1); - _unicodeCharacterMap.Add("START OF TEXT", 2); - _unicodeCharacterMap.Add("END OF TEXT", 3); - _unicodeCharacterMap.Add("END OF TRANSMISSION", 4); - _unicodeCharacterMap.Add("ENQUIRY", 5); - _unicodeCharacterMap.Add("ACKNOWLEDGE", 6); - _unicodeCharacterMap.Add("BEL", 7); - _unicodeCharacterMap.Add("BACKSPACE", 8); - _unicodeCharacterMap.Add("CHARACTER TABULATION", 9); - _unicodeCharacterMap.Add("LINE FEED", 10); - _unicodeCharacterMap.Add("LINE TABULATION", 11); - _unicodeCharacterMap.Add("FORM FEED", 12); - _unicodeCharacterMap.Add("CARRIAGE RETURN", 13); - _unicodeCharacterMap.Add("SHIFT OUT", 14); - _unicodeCharacterMap.Add("SHIFT IN", 15); - _unicodeCharacterMap.Add("DATA LINK ESCAPE", 16); - _unicodeCharacterMap.Add("DEVICE CONTROL ONE", 17); - _unicodeCharacterMap.Add("DEVICE CONTROL TWO", 18); - _unicodeCharacterMap.Add("DEVICE CONTROL THREE", 19); - _unicodeCharacterMap.Add("DEVICE CONTROL FOUR", 20); - _unicodeCharacterMap.Add("NEGATIVE ACKNOWLEDGE", 21); - _unicodeCharacterMap.Add("SYNCHRONOUS IDLE", 22); - _unicodeCharacterMap.Add("END OF TRANSMISSION BLOCK", 23); - _unicodeCharacterMap.Add("CANCEL", 24); - _unicodeCharacterMap.Add("END OF MEDIUM", 25); - _unicodeCharacterMap.Add("SUBSTITUTE", 26); - _unicodeCharacterMap.Add("ESCAPE", 27); - _unicodeCharacterMap.Add("INFORMATION SEPARATOR FOUR", 28); - _unicodeCharacterMap.Add("INFORMATION SEPARATOR THREE", 29); - _unicodeCharacterMap.Add("INFORMATION SEPARATOR TWO", 30); - _unicodeCharacterMap.Add("INFORMATION SEPARATOR ONE", 31); - _unicodeCharacterMap.Add("SPACE", 32); - _unicodeCharacterMap.Add("EXCLAMATION MARK", 33); - _unicodeCharacterMap.Add("QUOTATION MARK", 34); - _unicodeCharacterMap.Add("NUMBER SIGN", 35); - _unicodeCharacterMap.Add("DOLLAR SIGN", 36); - _unicodeCharacterMap.Add("PERCENT SIGN", 37); - _unicodeCharacterMap.Add("AMPERSAND", 38); - _unicodeCharacterMap.Add("APOSTROPHE", 39); - _unicodeCharacterMap.Add("LEFT PARENTHESIS", 40); - _unicodeCharacterMap.Add("RIGHT PARENTHESIS", 41); - _unicodeCharacterMap.Add("ASTERISK", 42); - _unicodeCharacterMap.Add("PLUS SIGN", 43); - _unicodeCharacterMap.Add("COMMA", 44); - _unicodeCharacterMap.Add("HYPHEN MINUS", 45); - _unicodeCharacterMap.Add("FULL STOP", 46); - _unicodeCharacterMap.Add("SOLIDUS", 47); - _unicodeCharacterMap.Add("DIGIT ZERO", 48); - _unicodeCharacterMap.Add("DIGIT ONE", 49); - _unicodeCharacterMap.Add("DIGIT TWO", 50); - _unicodeCharacterMap.Add("DIGIT THREE", 51); - _unicodeCharacterMap.Add("DIGIT FOUR", 52); - _unicodeCharacterMap.Add("DIGIT FIVE", 53); - _unicodeCharacterMap.Add("DIGIT SIX", 54); - _unicodeCharacterMap.Add("DIGIT SEVEN", 55); - _unicodeCharacterMap.Add("DIGIT EIGHT", 56); - _unicodeCharacterMap.Add("DIGIT NINE", 57); - _unicodeCharacterMap.Add("COLON", 58); - _unicodeCharacterMap.Add("SEMICOLON", 59); - _unicodeCharacterMap.Add("LESS THAN SIGN", 60); - _unicodeCharacterMap.Add("EQUALS SIGN", 61); - _unicodeCharacterMap.Add("GREATER THAN SIGN", 62); - _unicodeCharacterMap.Add("QUESTION MARK", 63); - _unicodeCharacterMap.Add("COMMERCIAL AT", 64); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A", 65); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B", 66); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C", 67); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D", 68); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E", 69); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER F", 70); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G", 71); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H", 72); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I", 73); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER J", 74); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K", 75); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L", 76); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER M", 77); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N", 78); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O", 79); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P", 80); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Q", 81); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R", 82); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S", 83); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T", 84); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U", 85); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER V", 86); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W", 87); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER X", 88); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y", 89); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z", 90); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET", 91); - _unicodeCharacterMap.Add("REVERSE SOLIDUS", 92); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET", 93); - _unicodeCharacterMap.Add("CIRCUMFLEX ACCENT", 94); - _unicodeCharacterMap.Add("LOW LINE", 95); - _unicodeCharacterMap.Add("GRAVE ACCENT", 96); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A", 97); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B", 98); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C", 99); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D", 100); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E", 101); - _unicodeCharacterMap.Add("LATIN SMALL LETTER F", 102); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G", 103); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H", 104); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I", 105); - _unicodeCharacterMap.Add("LATIN SMALL LETTER J", 106); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K", 107); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L", 108); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M", 109); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N", 110); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O", 111); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P", 112); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Q", 113); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R", 114); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S", 115); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T", 116); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U", 117); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V", 118); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W", 119); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X", 120); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y", 121); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z", 122); - _unicodeCharacterMap.Add("LEFT CURLY BRACKET", 123); - _unicodeCharacterMap.Add("VERTICAL LINE", 124); - _unicodeCharacterMap.Add("RIGHT CURLY BRACKET", 125); - _unicodeCharacterMap.Add("TILDE", 126); - _unicodeCharacterMap.Add("DELETE", 127); - _unicodeCharacterMap.Add("PADDING CHARACTER", 128); - _unicodeCharacterMap.Add("HIGH OCTET PRESET", 129); - _unicodeCharacterMap.Add("BREAK PERMITTED HERE", 130); - _unicodeCharacterMap.Add("NO BREAK HERE", 131); - _unicodeCharacterMap.Add("INDEX", 132); - _unicodeCharacterMap.Add("NEXT LINE", 133); - _unicodeCharacterMap.Add("START OF SELECTED AREA", 134); - _unicodeCharacterMap.Add("END OF SELECTED AREA", 135); - _unicodeCharacterMap.Add("CHARACTER TABULATION SET", 136); - _unicodeCharacterMap.Add("HORIZONTAL TABULATION SET", 136); - _unicodeCharacterMap.Add("CHARACTER TABULATION WITH JUSTIFICATION", 137); - _unicodeCharacterMap.Add("HORIZONTAL TABULATION WITH JUSTIFICATION", 137); - _unicodeCharacterMap.Add("LINE TABULATION SET", 138); - _unicodeCharacterMap.Add("VERTICAL TABULATION SET", 138); - _unicodeCharacterMap.Add("PARTIAL LINE FORWARD", 139); - _unicodeCharacterMap.Add("PARTIAL LINE DOWN", 139); - _unicodeCharacterMap.Add("PARTIAL LINE BACKWARD", 140); - _unicodeCharacterMap.Add("PARTIAL LINE UP", 140); - _unicodeCharacterMap.Add("REVERSE LINE FEED", 141); - _unicodeCharacterMap.Add("REVERSE INDEX", 141); - _unicodeCharacterMap.Add("SINGLE SHIFT TWO", 142); - _unicodeCharacterMap.Add("SINGLE SHIFT THREE", 143); - _unicodeCharacterMap.Add("DEVICE CONTROL STRING", 144); - _unicodeCharacterMap.Add("PRIVATE USE ONE", 145); - _unicodeCharacterMap.Add("PRIVATE USE TWO", 146); - _unicodeCharacterMap.Add("SET TRANSMIT STATE", 147); - _unicodeCharacterMap.Add("CANCEL CHARACTER", 148); - _unicodeCharacterMap.Add("MESSAGE WAITING", 149); - _unicodeCharacterMap.Add("START OF GUARDED AREA", 150); - _unicodeCharacterMap.Add("END OF GUARDED AREA", 151); - _unicodeCharacterMap.Add("START OF STRING", 152); - _unicodeCharacterMap.Add("SINGLE GRAPHIC CHARACTER INTRODUCER", 153); - _unicodeCharacterMap.Add("SINGLE CHARACTER INTRODUCER", 154); - _unicodeCharacterMap.Add("CONTROL SEQUENCE INTRODUCER", 155); - _unicodeCharacterMap.Add("STRING TERMINATOR", 156); - _unicodeCharacterMap.Add("OPERATING SYSTEM COMMAND", 157); - _unicodeCharacterMap.Add("PRIVACY MESSAGE", 158); - _unicodeCharacterMap.Add("APPLICATION PROGRAM COMMAND", 159); - _unicodeCharacterMap.Add("NO BREAK SPACE", 160); - _unicodeCharacterMap.Add("INVERTED EXCLAMATION MARK", 161); - _unicodeCharacterMap.Add("CENT SIGN", 162); - _unicodeCharacterMap.Add("POUND SIGN", 163); - _unicodeCharacterMap.Add("CURRENCY SIGN", 164); - _unicodeCharacterMap.Add("YEN SIGN", 165); - _unicodeCharacterMap.Add("BROKEN BAR", 166); - _unicodeCharacterMap.Add("SECTION SIGN", 167); - _unicodeCharacterMap.Add("DIAERESIS", 168); - _unicodeCharacterMap.Add("COPYRIGHT SIGN", 169); - _unicodeCharacterMap.Add("FEMININE ORDINAL INDICATOR", 170); - _unicodeCharacterMap.Add("LEFT POINTING DOUBLE ANGLE QUOTATION MARK", 171); - _unicodeCharacterMap.Add("NOT SIGN", 172); - _unicodeCharacterMap.Add("SOFT HYPHEN", 173); - _unicodeCharacterMap.Add("REGISTERED SIGN", 174); - _unicodeCharacterMap.Add("MACRON", 175); - _unicodeCharacterMap.Add("DEGREE SIGN", 176); - _unicodeCharacterMap.Add("PLUS MINUS SIGN", 177); - _unicodeCharacterMap.Add("SUPERSCRIPT TWO", 178); - _unicodeCharacterMap.Add("SUPERSCRIPT THREE", 179); - _unicodeCharacterMap.Add("ACUTE ACCENT", 180); - _unicodeCharacterMap.Add("MICRO SIGN", 181); - _unicodeCharacterMap.Add("PILCROW SIGN", 182); - _unicodeCharacterMap.Add("MIDDLE DOT", 183); - _unicodeCharacterMap.Add("CEDILLA", 184); - _unicodeCharacterMap.Add("SUPERSCRIPT ONE", 185); - _unicodeCharacterMap.Add("MASCULINE ORDINAL INDICATOR", 186); - _unicodeCharacterMap.Add("RIGHT POINTING DOUBLE ANGLE QUOTATION MARK", 187); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE QUARTER", 188); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE HALF", 189); - _unicodeCharacterMap.Add("VULGAR FRACTION THREE QUARTERS", 190); - _unicodeCharacterMap.Add("INVERTED QUESTION MARK", 191); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH GRAVE", 192); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH ACUTE", 193); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH CIRCUMFLEX", 194); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH TILDE", 195); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH DIAERESIS", 196); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH RING ABOVE", 197); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AE", 198); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH CEDILLA", 199); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH GRAVE", 200); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH ACUTE", 201); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CIRCUMFLEX", 202); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH DIAERESIS", 203); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH GRAVE", 204); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH ACUTE", 205); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH CIRCUMFLEX", 206); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH DIAERESIS", 207); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER ETH", 208); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH TILDE", 209); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH GRAVE", 210); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH ACUTE", 211); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH CIRCUMFLEX", 212); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH TILDE", 213); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH DIAERESIS", 214); - _unicodeCharacterMap.Add("MULTIPLICATION SIGN", 215); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH STROKE", 216); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH GRAVE", 217); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH ACUTE", 218); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH CIRCUMFLEX", 219); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DIAERESIS", 220); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH ACUTE", 221); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER THORN", 222); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SHARP S", 223); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH GRAVE", 224); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH ACUTE", 225); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH CIRCUMFLEX", 226); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH TILDE", 227); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH DIAERESIS", 228); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH RING ABOVE", 229); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AE", 230); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH CEDILLA", 231); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH GRAVE", 232); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH ACUTE", 233); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CIRCUMFLEX", 234); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH DIAERESIS", 235); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH GRAVE", 236); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH ACUTE", 237); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH CIRCUMFLEX", 238); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH DIAERESIS", 239); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ETH", 240); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH TILDE", 241); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH GRAVE", 242); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH ACUTE", 243); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH CIRCUMFLEX", 244); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH TILDE", 245); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH DIAERESIS", 246); - _unicodeCharacterMap.Add("DIVISION SIGN", 247); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH STROKE", 248); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH GRAVE", 249); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH ACUTE", 250); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH CIRCUMFLEX", 251); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DIAERESIS", 252); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH ACUTE", 253); - _unicodeCharacterMap.Add("LATIN SMALL LETTER THORN", 254); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH DIAERESIS", 255); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH MACRON", 256); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH MACRON", 257); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH BREVE", 258); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH BREVE", 259); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH OGONEK", 260); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH OGONEK", 261); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH ACUTE", 262); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH ACUTE", 263); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH CIRCUMFLEX", 264); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH CIRCUMFLEX", 265); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH DOT ABOVE", 266); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH DOT ABOVE", 267); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH CARON", 268); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH CARON", 269); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH CARON", 270); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH CARON", 271); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH STROKE", 272); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH STROKE", 273); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH MACRON", 274); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH MACRON", 275); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH BREVE", 276); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH BREVE", 277); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH DOT ABOVE", 278); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH DOT ABOVE", 279); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH OGONEK", 280); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH OGONEK", 281); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CARON", 282); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CARON", 283); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH CIRCUMFLEX", 284); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH CIRCUMFLEX", 285); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH BREVE", 286); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH BREVE", 287); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH DOT ABOVE", 288); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH DOT ABOVE", 289); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH CEDILLA", 290); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH CEDILLA", 291); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH CIRCUMFLEX", 292); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH CIRCUMFLEX", 293); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH STROKE", 294); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH STROKE", 295); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH TILDE", 296); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH TILDE", 297); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH MACRON", 298); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH MACRON", 299); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH BREVE", 300); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH BREVE", 301); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH OGONEK", 302); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH OGONEK", 303); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH DOT ABOVE", 304); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DOTLESS I", 305); - _unicodeCharacterMap.Add("LATIN CAPITAL LIGATURE IJ", 306); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE IJ", 307); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER J WITH CIRCUMFLEX", 308); - _unicodeCharacterMap.Add("LATIN SMALL LETTER J WITH CIRCUMFLEX", 309); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH CEDILLA", 310); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH CEDILLA", 311); - _unicodeCharacterMap.Add("LATIN SMALL LETTER KRA", 312); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH ACUTE", 313); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH ACUTE", 314); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH CEDILLA", 315); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH CEDILLA", 316); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH CARON", 317); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH CARON", 318); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH MIDDLE DOT", 319); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH MIDDLE DOT", 320); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH STROKE", 321); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH STROKE", 322); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH ACUTE", 323); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH ACUTE", 324); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH CEDILLA", 325); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH CEDILLA", 326); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH CARON", 327); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH CARON", 328); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N PRECEDED BY APOSTROPHE", 329); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER ENG", 330); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ENG", 331); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH MACRON", 332); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH MACRON", 333); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH BREVE", 334); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH BREVE", 335); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH DOUBLE ACUTE", 336); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH DOUBLE ACUTE", 337); - _unicodeCharacterMap.Add("LATIN CAPITAL LIGATURE OE", 338); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE OE", 339); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH ACUTE", 340); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH ACUTE", 341); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH CEDILLA", 342); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH CEDILLA", 343); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH CARON", 344); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH CARON", 345); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH ACUTE", 346); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH ACUTE", 347); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH CIRCUMFLEX", 348); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH CIRCUMFLEX", 349); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH CEDILLA", 350); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH CEDILLA", 351); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH CARON", 352); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH CARON", 353); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH CEDILLA", 354); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH CEDILLA", 355); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH CARON", 356); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH CARON", 357); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH STROKE", 358); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH STROKE", 359); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH TILDE", 360); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH TILDE", 361); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH MACRON", 362); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH MACRON", 363); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH BREVE", 364); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH BREVE", 365); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH RING ABOVE", 366); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH RING ABOVE", 367); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DOUBLE ACUTE", 368); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DOUBLE ACUTE", 369); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH OGONEK", 370); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH OGONEK", 371); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W WITH CIRCUMFLEX", 372); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH CIRCUMFLEX", 373); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH CIRCUMFLEX", 374); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH CIRCUMFLEX", 375); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH DIAERESIS", 376); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH ACUTE", 377); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH ACUTE", 378); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH DOT ABOVE", 379); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH DOT ABOVE", 380); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH CARON", 381); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH CARON", 382); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LONG S", 383); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH STROKE", 384); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B WITH HOOK", 385); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B WITH TOPBAR", 386); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH TOPBAR", 387); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TONE SIX", 388); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TONE SIX", 389); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER OPEN O", 390); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH HOOK", 391); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH HOOK", 392); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AFRICAN D", 393); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH HOOK", 394); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH TOPBAR", 395); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH TOPBAR", 396); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED DELTA", 397); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER REVERSED E", 398); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER SCHWA", 399); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER OPEN E", 400); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER F WITH HOOK", 401); - _unicodeCharacterMap.Add("LATIN SMALL LETTER F WITH HOOK", 402); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH HOOK", 403); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER GAMMA", 404); - _unicodeCharacterMap.Add("LATIN SMALL LETTER HV", 405); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER IOTA", 406); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH STROKE", 407); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH HOOK", 408); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH HOOK", 409); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH BAR", 410); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LAMBDA WITH STROKE", 411); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED M", 412); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH LEFT HOOK", 413); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH LONG RIGHT LEG", 414); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH MIDDLE TILDE", 415); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH HORN", 416); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH HORN", 417); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER OI", 418); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OI", 419); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P WITH HOOK", 420); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH HOOK", 421); - _unicodeCharacterMap.Add("LATIN LETTER YR", 422); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TONE TWO", 423); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TONE TWO", 424); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER ESH", 425); - _unicodeCharacterMap.Add("LATIN LETTER REVERSED ESH LOOP", 426); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH PALATAL HOOK", 427); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH HOOK", 428); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH HOOK", 429); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH RETROFLEX HOOK", 430); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH HORN", 431); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH HORN", 432); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER UPSILON", 433); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER V WITH HOOK", 434); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH HOOK", 435); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH HOOK", 436); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH STROKE", 437); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH STROKE", 438); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER EZH", 439); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER EZH REVERSED", 440); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EZH REVERSED", 441); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EZH WITH TAIL", 442); - _unicodeCharacterMap.Add("LATIN LETTER TWO WITH STROKE", 443); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TONE FIVE", 444); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TONE FIVE", 445); - _unicodeCharacterMap.Add("LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE", 446); - _unicodeCharacterMap.Add("LATIN LETTER WYNN", 447); - _unicodeCharacterMap.Add("LATIN LETTER DENTAL CLICK", 448); - _unicodeCharacterMap.Add("LATIN LETTER LATERAL CLICK", 449); - _unicodeCharacterMap.Add("LATIN LETTER ALVEOLAR CLICK", 450); - _unicodeCharacterMap.Add("LATIN LETTER RETROFLEX CLICK", 451); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER DZ WITH CARON", 452); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON", 453); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DZ WITH CARON", 454); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER LJ", 455); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH SMALL LETTER J", 456); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LJ", 457); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER NJ", 458); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH SMALL LETTER J", 459); - _unicodeCharacterMap.Add("LATIN SMALL LETTER NJ", 460); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH CARON", 461); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH CARON", 462); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH CARON", 463); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH CARON", 464); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH CARON", 465); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH CARON", 466); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH CARON", 467); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH CARON", 468); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON", 469); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DIAERESIS AND MACRON", 470); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE", 471); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE", 472); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON", 473); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DIAERESIS AND CARON", 474); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE", 475); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE", 476); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED E", 477); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON", 478); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH DIAERESIS AND MACRON", 479); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON", 480); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON", 481); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AE WITH MACRON", 482); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AE WITH MACRON", 483); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH STROKE", 484); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH STROKE", 485); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH CARON", 486); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH CARON", 487); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH CARON", 488); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH CARON", 489); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH OGONEK", 490); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH OGONEK", 491); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH OGONEK AND MACRON", 492); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH OGONEK AND MACRON", 493); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER EZH WITH CARON", 494); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EZH WITH CARON", 495); - _unicodeCharacterMap.Add("LATIN SMALL LETTER J WITH CARON", 496); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER DZ", 497); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH SMALL LETTER Z", 498); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DZ", 499); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH ACUTE", 500); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH ACUTE", 501); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER HWAIR", 502); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER WYNN", 503); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH GRAVE", 504); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH GRAVE", 505); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE", 506); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE", 507); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AE WITH ACUTE", 508); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AE WITH ACUTE", 509); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH STROKE AND ACUTE", 510); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH STROKE AND ACUTE", 511); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH DOUBLE GRAVE", 512); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH DOUBLE GRAVE", 513); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH INVERTED BREVE", 514); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH INVERTED BREVE", 515); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH DOUBLE GRAVE", 516); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH DOUBLE GRAVE", 517); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH INVERTED BREVE", 518); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH INVERTED BREVE", 519); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH DOUBLE GRAVE", 520); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH DOUBLE GRAVE", 521); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH INVERTED BREVE", 522); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH INVERTED BREVE", 523); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH DOUBLE GRAVE", 524); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH DOUBLE GRAVE", 525); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH INVERTED BREVE", 526); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH INVERTED BREVE", 527); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH DOUBLE GRAVE", 528); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH DOUBLE GRAVE", 529); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH INVERTED BREVE", 530); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH INVERTED BREVE", 531); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DOUBLE GRAVE", 532); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DOUBLE GRAVE", 533); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH INVERTED BREVE", 534); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH INVERTED BREVE", 535); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH COMMA BELOW", 536); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH COMMA BELOW", 537); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH COMMA BELOW", 538); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH COMMA BELOW", 539); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER YOGH", 540); - _unicodeCharacterMap.Add("LATIN SMALL LETTER YOGH", 541); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH CARON", 542); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH CARON", 543); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH LONG RIGHT LEG", 544); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH CURL", 545); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER OU", 546); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OU", 547); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH HOOK", 548); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH HOOK", 549); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH DOT ABOVE", 550); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH DOT ABOVE", 551); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CEDILLA", 552); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CEDILLA", 553); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON", 554); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH DIAERESIS AND MACRON", 555); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH TILDE AND MACRON", 556); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH TILDE AND MACRON", 557); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH DOT ABOVE", 558); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH DOT ABOVE", 559); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON", 560); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON", 561); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH MACRON", 562); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH MACRON", 563); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH CURL", 564); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH CURL", 565); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH CURL", 566); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DOTLESS J", 567); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DB DIGRAPH", 568); - _unicodeCharacterMap.Add("LATIN SMALL LETTER QP DIGRAPH", 569); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH STROKE", 570); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH STROKE", 571); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH STROKE", 572); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH BAR", 573); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH DIAGONAL STROKE", 574); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH SWASH TAIL", 575); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH SWASH TAIL", 576); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER GLOTTAL STOP", 577); - _unicodeCharacterMap.Add("LATIN SMALL LETTER GLOTTAL STOP", 578); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B WITH STROKE", 579); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U BAR", 580); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED V", 581); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH STROKE", 582); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH STROKE", 583); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER J WITH STROKE", 584); - _unicodeCharacterMap.Add("LATIN SMALL LETTER J WITH STROKE", 585); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL", 586); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Q WITH HOOK TAIL", 587); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH STROKE", 588); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH STROKE", 589); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH STROKE", 590); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH STROKE", 591); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED A", 592); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ALPHA", 593); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED ALPHA", 594); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH HOOK", 595); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OPEN O", 596); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH CURL", 597); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH TAIL", 598); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH HOOK", 599); - _unicodeCharacterMap.Add("LATIN SMALL LETTER REVERSED E", 600); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SCHWA", 601); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SCHWA WITH HOOK", 602); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OPEN E", 603); - _unicodeCharacterMap.Add("LATIN SMALL LETTER REVERSED OPEN E", 604); - _unicodeCharacterMap.Add("LATIN SMALL LETTER REVERSED OPEN E WITH HOOK", 605); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CLOSED REVERSED OPEN E", 606); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DOTLESS J WITH STROKE", 607); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH HOOK", 608); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SCRIPT G", 609); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL G", 610); - _unicodeCharacterMap.Add("LATIN SMALL LETTER GAMMA", 611); - _unicodeCharacterMap.Add("LATIN SMALL LETTER RAMS HORN", 612); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED H", 613); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH HOOK", 614); - _unicodeCharacterMap.Add("LATIN SMALL LETTER HENG WITH HOOK", 615); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH STROKE", 616); - _unicodeCharacterMap.Add("LATIN SMALL LETTER IOTA", 617); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL I", 618); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH MIDDLE TILDE", 619); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH BELT", 620); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH RETROFLEX HOOK", 621); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LEZH", 622); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED M", 623); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED M WITH LONG LEG", 624); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M WITH HOOK", 625); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH LEFT HOOK", 626); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH RETROFLEX HOOK", 627); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL N", 628); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BARRED O", 629); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL OE", 630); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CLOSED OMEGA", 631); - _unicodeCharacterMap.Add("LATIN SMALL LETTER PHI", 632); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED R", 633); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED R WITH LONG LEG", 634); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED R WITH HOOK", 635); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH LONG LEG", 636); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH TAIL", 637); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH FISHHOOK", 638); - _unicodeCharacterMap.Add("LATIN SMALL LETTER REVERSED R WITH FISHHOOK", 639); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL R", 640); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL INVERTED R", 641); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH HOOK", 642); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ESH", 643); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK", 644); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SQUAT REVERSED ESH", 645); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ESH WITH CURL", 646); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED T", 647); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH RETROFLEX HOOK", 648); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U BAR", 649); - _unicodeCharacterMap.Add("LATIN SMALL LETTER UPSILON", 650); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V WITH HOOK", 651); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED V", 652); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED W", 653); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED Y", 654); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL Y", 655); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH RETROFLEX HOOK", 656); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH CURL", 657); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EZH", 658); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EZH WITH CURL", 659); - _unicodeCharacterMap.Add("LATIN LETTER GLOTTAL STOP", 660); - _unicodeCharacterMap.Add("LATIN LETTER PHARYNGEAL VOICED FRICATIVE", 661); - _unicodeCharacterMap.Add("LATIN LETTER INVERTED GLOTTAL STOP", 662); - _unicodeCharacterMap.Add("LATIN LETTER STRETCHED C", 663); - _unicodeCharacterMap.Add("LATIN LETTER BILABIAL CLICK", 664); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL B", 665); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CLOSED OPEN E", 666); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL G WITH HOOK", 667); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL H", 668); - _unicodeCharacterMap.Add("LATIN SMALL LETTER J WITH CROSSED TAIL", 669); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED K", 670); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL L", 671); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Q WITH HOOK", 672); - _unicodeCharacterMap.Add("LATIN LETTER GLOTTAL STOP WITH STROKE", 673); - _unicodeCharacterMap.Add("LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE", 674); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DZ DIGRAPH", 675); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DEZH DIGRAPH", 676); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DZ DIGRAPH WITH CURL", 677); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TS DIGRAPH", 678); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TESH DIGRAPH", 679); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TC DIGRAPH WITH CURL", 680); - _unicodeCharacterMap.Add("LATIN SMALL LETTER FENG DIGRAPH", 681); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LS DIGRAPH", 682); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LZ DIGRAPH", 683); - _unicodeCharacterMap.Add("LATIN LETTER BILABIAL PERCUSSIVE", 684); - _unicodeCharacterMap.Add("LATIN LETTER BIDENTAL PERCUSSIVE", 685); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED H WITH FISHHOOK", 686); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL", 687); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL H", 688); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL H WITH HOOK", 689); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL J", 690); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL R", 691); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED R", 692); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED R WITH HOOK", 693); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL CAPITAL INVERTED R", 694); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL W", 695); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL Y", 696); - _unicodeCharacterMap.Add("MODIFIER LETTER PRIME", 697); - _unicodeCharacterMap.Add("MODIFIER LETTER DOUBLE PRIME", 698); - _unicodeCharacterMap.Add("MODIFIER LETTER TURNED COMMA", 699); - _unicodeCharacterMap.Add("MODIFIER LETTER APOSTROPHE", 700); - _unicodeCharacterMap.Add("MODIFIER LETTER REVERSED COMMA", 701); - _unicodeCharacterMap.Add("MODIFIER LETTER RIGHT HALF RING", 702); - _unicodeCharacterMap.Add("MODIFIER LETTER LEFT HALF RING", 703); - _unicodeCharacterMap.Add("MODIFIER LETTER GLOTTAL STOP", 704); - _unicodeCharacterMap.Add("MODIFIER LETTER REVERSED GLOTTAL STOP", 705); - _unicodeCharacterMap.Add("MODIFIER LETTER LEFT ARROWHEAD", 706); - _unicodeCharacterMap.Add("MODIFIER LETTER RIGHT ARROWHEAD", 707); - _unicodeCharacterMap.Add("MODIFIER LETTER UP ARROWHEAD", 708); - _unicodeCharacterMap.Add("MODIFIER LETTER DOWN ARROWHEAD", 709); - _unicodeCharacterMap.Add("MODIFIER LETTER CIRCUMFLEX ACCENT", 710); - _unicodeCharacterMap.Add("CARON", 711); - _unicodeCharacterMap.Add("MODIFIER LETTER VERTICAL LINE", 712); - _unicodeCharacterMap.Add("MODIFIER LETTER MACRON", 713); - _unicodeCharacterMap.Add("MODIFIER LETTER ACUTE ACCENT", 714); - _unicodeCharacterMap.Add("MODIFIER LETTER GRAVE ACCENT", 715); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW VERTICAL LINE", 716); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW MACRON", 717); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW GRAVE ACCENT", 718); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW ACUTE ACCENT", 719); - _unicodeCharacterMap.Add("MODIFIER LETTER TRIANGULAR COLON", 720); - _unicodeCharacterMap.Add("MODIFIER LETTER HALF TRIANGULAR COLON", 721); - _unicodeCharacterMap.Add("MODIFIER LETTER CENTRED RIGHT HALF RING", 722); - _unicodeCharacterMap.Add("MODIFIER LETTER CENTRED LEFT HALF RING", 723); - _unicodeCharacterMap.Add("MODIFIER LETTER UP TACK", 724); - _unicodeCharacterMap.Add("MODIFIER LETTER DOWN TACK", 725); - _unicodeCharacterMap.Add("MODIFIER LETTER PLUS SIGN", 726); - _unicodeCharacterMap.Add("MODIFIER LETTER MINUS SIGN", 727); - _unicodeCharacterMap.Add("BREVE", 728); - _unicodeCharacterMap.Add("DOT ABOVE", 729); - _unicodeCharacterMap.Add("RING ABOVE", 730); - _unicodeCharacterMap.Add("OGONEK", 731); - _unicodeCharacterMap.Add("SMALL TILDE", 732); - _unicodeCharacterMap.Add("DOUBLE ACUTE ACCENT", 733); - _unicodeCharacterMap.Add("MODIFIER LETTER RHOTIC HOOK", 734); - _unicodeCharacterMap.Add("MODIFIER LETTER CROSS ACCENT", 735); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL GAMMA", 736); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL L", 737); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL S", 738); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL X", 739); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL REVERSED GLOTTAL STOP", 740); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA HIGH TONE BAR", 741); - _unicodeCharacterMap.Add("MODIFIER LETTER HIGH TONE BAR", 742); - _unicodeCharacterMap.Add("MODIFIER LETTER MID TONE BAR", 743); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW TONE BAR", 744); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA LOW TONE BAR", 745); - _unicodeCharacterMap.Add("MODIFIER LETTER YIN DEPARTING TONE MARK", 746); - _unicodeCharacterMap.Add("MODIFIER LETTER YANG DEPARTING TONE MARK", 747); - _unicodeCharacterMap.Add("MODIFIER LETTER VOICING", 748); - _unicodeCharacterMap.Add("MODIFIER LETTER UNASPIRATED", 749); - _unicodeCharacterMap.Add("MODIFIER LETTER DOUBLE APOSTROPHE", 750); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW DOWN ARROWHEAD", 751); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW UP ARROWHEAD", 752); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW LEFT ARROWHEAD", 753); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW RIGHT ARROWHEAD", 754); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW RING", 755); - _unicodeCharacterMap.Add("MODIFIER LETTER MIDDLE GRAVE ACCENT", 756); - _unicodeCharacterMap.Add("MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT", 757); - _unicodeCharacterMap.Add("MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT", 758); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW TILDE", 759); - _unicodeCharacterMap.Add("MODIFIER LETTER RAISED COLON", 760); - _unicodeCharacterMap.Add("MODIFIER LETTER BEGIN HIGH TONE", 761); - _unicodeCharacterMap.Add("MODIFIER LETTER END HIGH TONE", 762); - _unicodeCharacterMap.Add("MODIFIER LETTER BEGIN LOW TONE", 763); - _unicodeCharacterMap.Add("MODIFIER LETTER END LOW TONE", 764); - _unicodeCharacterMap.Add("MODIFIER LETTER SHELF", 765); - _unicodeCharacterMap.Add("MODIFIER LETTER OPEN SHELF", 766); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW LEFT ARROW", 767); - _unicodeCharacterMap.Add("COMBINING GRAVE ACCENT", 768); - _unicodeCharacterMap.Add("COMBINING ACUTE ACCENT", 769); - _unicodeCharacterMap.Add("COMBINING CIRCUMFLEX ACCENT", 770); - _unicodeCharacterMap.Add("COMBINING TILDE", 771); - _unicodeCharacterMap.Add("COMBINING MACRON", 772); - _unicodeCharacterMap.Add("COMBINING OVERLINE", 773); - _unicodeCharacterMap.Add("COMBINING BREVE", 774); - _unicodeCharacterMap.Add("COMBINING DOT ABOVE", 775); - _unicodeCharacterMap.Add("COMBINING DIAERESIS", 776); - _unicodeCharacterMap.Add("COMBINING HOOK ABOVE", 777); - _unicodeCharacterMap.Add("COMBINING RING ABOVE", 778); - _unicodeCharacterMap.Add("COMBINING DOUBLE ACUTE ACCENT", 779); - _unicodeCharacterMap.Add("COMBINING CARON", 780); - _unicodeCharacterMap.Add("COMBINING VERTICAL LINE ABOVE", 781); - _unicodeCharacterMap.Add("COMBINING DOUBLE VERTICAL LINE ABOVE", 782); - _unicodeCharacterMap.Add("COMBINING DOUBLE GRAVE ACCENT", 783); - _unicodeCharacterMap.Add("COMBINING CANDRABINDU", 784); - _unicodeCharacterMap.Add("COMBINING INVERTED BREVE", 785); - _unicodeCharacterMap.Add("COMBINING TURNED COMMA ABOVE", 786); - _unicodeCharacterMap.Add("COMBINING COMMA ABOVE", 787); - _unicodeCharacterMap.Add("COMBINING REVERSED COMMA ABOVE", 788); - _unicodeCharacterMap.Add("COMBINING COMMA ABOVE RIGHT", 789); - _unicodeCharacterMap.Add("COMBINING GRAVE ACCENT BELOW", 790); - _unicodeCharacterMap.Add("COMBINING ACUTE ACCENT BELOW", 791); - _unicodeCharacterMap.Add("COMBINING LEFT TACK BELOW", 792); - _unicodeCharacterMap.Add("COMBINING RIGHT TACK BELOW", 793); - _unicodeCharacterMap.Add("COMBINING LEFT ANGLE ABOVE", 794); - _unicodeCharacterMap.Add("COMBINING HORN", 795); - _unicodeCharacterMap.Add("COMBINING LEFT HALF RING BELOW", 796); - _unicodeCharacterMap.Add("COMBINING UP TACK BELOW", 797); - _unicodeCharacterMap.Add("COMBINING DOWN TACK BELOW", 798); - _unicodeCharacterMap.Add("COMBINING PLUS SIGN BELOW", 799); - _unicodeCharacterMap.Add("COMBINING MINUS SIGN BELOW", 800); - _unicodeCharacterMap.Add("COMBINING PALATALIZED HOOK BELOW", 801); - _unicodeCharacterMap.Add("COMBINING RETROFLEX HOOK BELOW", 802); - _unicodeCharacterMap.Add("COMBINING DOT BELOW", 803); - _unicodeCharacterMap.Add("COMBINING DIAERESIS BELOW", 804); - _unicodeCharacterMap.Add("COMBINING RING BELOW", 805); - _unicodeCharacterMap.Add("COMBINING COMMA BELOW", 806); - _unicodeCharacterMap.Add("COMBINING CEDILLA", 807); - _unicodeCharacterMap.Add("COMBINING OGONEK", 808); - _unicodeCharacterMap.Add("COMBINING VERTICAL LINE BELOW", 809); - _unicodeCharacterMap.Add("COMBINING BRIDGE BELOW", 810); - _unicodeCharacterMap.Add("COMBINING INVERTED DOUBLE ARCH BELOW", 811); - _unicodeCharacterMap.Add("COMBINING CARON BELOW", 812); - _unicodeCharacterMap.Add("COMBINING CIRCUMFLEX ACCENT BELOW", 813); - _unicodeCharacterMap.Add("COMBINING BREVE BELOW", 814); - _unicodeCharacterMap.Add("COMBINING INVERTED BREVE BELOW", 815); - _unicodeCharacterMap.Add("COMBINING TILDE BELOW", 816); - _unicodeCharacterMap.Add("COMBINING MACRON BELOW", 817); - _unicodeCharacterMap.Add("COMBINING LOW LINE", 818); - _unicodeCharacterMap.Add("COMBINING DOUBLE LOW LINE", 819); - _unicodeCharacterMap.Add("COMBINING TILDE OVERLAY", 820); - _unicodeCharacterMap.Add("COMBINING SHORT STROKE OVERLAY", 821); - _unicodeCharacterMap.Add("COMBINING LONG STROKE OVERLAY", 822); - _unicodeCharacterMap.Add("COMBINING SHORT SOLIDUS OVERLAY", 823); - _unicodeCharacterMap.Add("COMBINING LONG SOLIDUS OVERLAY", 824); - _unicodeCharacterMap.Add("COMBINING RIGHT HALF RING BELOW", 825); - _unicodeCharacterMap.Add("COMBINING INVERTED BRIDGE BELOW", 826); - _unicodeCharacterMap.Add("COMBINING SQUARE BELOW", 827); - _unicodeCharacterMap.Add("COMBINING SEAGULL BELOW", 828); - _unicodeCharacterMap.Add("COMBINING X ABOVE", 829); - _unicodeCharacterMap.Add("COMBINING VERTICAL TILDE", 830); - _unicodeCharacterMap.Add("COMBINING DOUBLE OVERLINE", 831); - _unicodeCharacterMap.Add("COMBINING GRAVE TONE MARK", 832); - _unicodeCharacterMap.Add("COMBINING ACUTE TONE MARK", 833); - _unicodeCharacterMap.Add("COMBINING GREEK PERISPOMENI", 834); - _unicodeCharacterMap.Add("COMBINING GREEK KORONIS", 835); - _unicodeCharacterMap.Add("COMBINING GREEK DIALYTIKA TONOS", 836); - _unicodeCharacterMap.Add("COMBINING GREEK YPOGEGRAMMENI", 837); - _unicodeCharacterMap.Add("COMBINING BRIDGE ABOVE", 838); - _unicodeCharacterMap.Add("COMBINING EQUALS SIGN BELOW", 839); - _unicodeCharacterMap.Add("COMBINING DOUBLE VERTICAL LINE BELOW", 840); - _unicodeCharacterMap.Add("COMBINING LEFT ANGLE BELOW", 841); - _unicodeCharacterMap.Add("COMBINING NOT TILDE ABOVE", 842); - _unicodeCharacterMap.Add("COMBINING HOMOTHETIC ABOVE", 843); - _unicodeCharacterMap.Add("COMBINING ALMOST EQUAL TO ABOVE", 844); - _unicodeCharacterMap.Add("COMBINING LEFT RIGHT ARROW BELOW", 845); - _unicodeCharacterMap.Add("COMBINING UPWARDS ARROW BELOW", 846); - _unicodeCharacterMap.Add("COMBINING GRAPHEME JOINER", 847); - _unicodeCharacterMap.Add("COMBINING RIGHT ARROWHEAD ABOVE", 848); - _unicodeCharacterMap.Add("COMBINING LEFT HALF RING ABOVE", 849); - _unicodeCharacterMap.Add("COMBINING FERMATA", 850); - _unicodeCharacterMap.Add("COMBINING X BELOW", 851); - _unicodeCharacterMap.Add("COMBINING LEFT ARROWHEAD BELOW", 852); - _unicodeCharacterMap.Add("COMBINING RIGHT ARROWHEAD BELOW", 853); - _unicodeCharacterMap.Add("COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW", 854); - _unicodeCharacterMap.Add("COMBINING RIGHT HALF RING ABOVE", 855); - _unicodeCharacterMap.Add("COMBINING DOT ABOVE RIGHT", 856); - _unicodeCharacterMap.Add("COMBINING ASTERISK BELOW", 857); - _unicodeCharacterMap.Add("COMBINING DOUBLE RING BELOW", 858); - _unicodeCharacterMap.Add("COMBINING ZIGZAG ABOVE", 859); - _unicodeCharacterMap.Add("COMBINING DOUBLE BREVE BELOW", 860); - _unicodeCharacterMap.Add("COMBINING DOUBLE BREVE", 861); - _unicodeCharacterMap.Add("COMBINING DOUBLE MACRON", 862); - _unicodeCharacterMap.Add("COMBINING DOUBLE MACRON BELOW", 863); - _unicodeCharacterMap.Add("COMBINING DOUBLE TILDE", 864); - _unicodeCharacterMap.Add("COMBINING DOUBLE INVERTED BREVE", 865); - _unicodeCharacterMap.Add("COMBINING DOUBLE RIGHTWARDS ARROW BELOW", 866); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER A", 867); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER E", 868); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER I", 869); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER O", 870); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER U", 871); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER C", 872); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER D", 873); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER H", 874); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER M", 875); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER R", 876); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER T", 877); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER V", 878); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER X", 879); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER HETA", 880); - _unicodeCharacterMap.Add("GREEK SMALL LETTER HETA", 881); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ARCHAIC SAMPI", 882); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ARCHAIC SAMPI", 883); - _unicodeCharacterMap.Add("GREEK NUMERAL SIGN", 884); - _unicodeCharacterMap.Add("GREEK LOWER NUMERAL SIGN", 885); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA", 886); - _unicodeCharacterMap.Add("GREEK SMALL LETTER PAMPHYLIAN DIGAMMA", 887); - _unicodeCharacterMap.Add("GREEK YPOGEGRAMMENI", 890); - _unicodeCharacterMap.Add("GREEK SMALL REVERSED LUNATE SIGMA SYMBOL", 891); - _unicodeCharacterMap.Add("GREEK SMALL DOTTED LUNATE SIGMA SYMBOL", 892); - _unicodeCharacterMap.Add("GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL", 893); - _unicodeCharacterMap.Add("GREEK QUESTION MARK", 894); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER YOT", 895); - _unicodeCharacterMap.Add("GREEK TONOS", 900); - _unicodeCharacterMap.Add("GREEK DIALYTIKA TONOS", 901); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH TONOS", 902); - _unicodeCharacterMap.Add("GREEK ANO TELEIA", 903); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH TONOS", 904); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH TONOS", 905); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH TONOS", 906); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH TONOS", 908); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH TONOS", 910); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH TONOS", 911); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS", 912); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA", 913); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER BETA", 914); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER GAMMA", 915); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER DELTA", 916); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON", 917); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ZETA", 918); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA", 919); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER THETA", 920); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA", 921); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER KAPPA", 922); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER LAMDA", 923); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER MU", 924); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER NU", 925); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER XI", 926); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON", 927); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER PI", 928); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER RHO", 929); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER SIGMA", 931); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER TAU", 932); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON", 933); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER PHI", 934); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER CHI", 935); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER PSI", 936); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA", 937); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH DIALYTIKA", 938); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA", 939); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH TONOS", 940); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH TONOS", 941); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH TONOS", 942); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH TONOS", 943); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS", 944); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA", 945); - _unicodeCharacterMap.Add("GREEK SMALL LETTER BETA", 946); - _unicodeCharacterMap.Add("GREEK SMALL LETTER GAMMA", 947); - _unicodeCharacterMap.Add("GREEK SMALL LETTER DELTA", 948); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON", 949); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ZETA", 950); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA", 951); - _unicodeCharacterMap.Add("GREEK SMALL LETTER THETA", 952); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA", 953); - _unicodeCharacterMap.Add("GREEK SMALL LETTER KAPPA", 954); - _unicodeCharacterMap.Add("GREEK SMALL LETTER LAMDA", 955); - _unicodeCharacterMap.Add("GREEK SMALL LETTER MU", 956); - _unicodeCharacterMap.Add("GREEK SMALL LETTER NU", 957); - _unicodeCharacterMap.Add("GREEK SMALL LETTER XI", 958); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON", 959); - _unicodeCharacterMap.Add("GREEK SMALL LETTER PI", 960); - _unicodeCharacterMap.Add("GREEK SMALL LETTER RHO", 961); - _unicodeCharacterMap.Add("GREEK SMALL LETTER FINAL SIGMA", 962); - _unicodeCharacterMap.Add("GREEK SMALL LETTER SIGMA", 963); - _unicodeCharacterMap.Add("GREEK SMALL LETTER TAU", 964); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON", 965); - _unicodeCharacterMap.Add("GREEK SMALL LETTER PHI", 966); - _unicodeCharacterMap.Add("GREEK SMALL LETTER CHI", 967); - _unicodeCharacterMap.Add("GREEK SMALL LETTER PSI", 968); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA", 969); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DIALYTIKA", 970); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DIALYTIKA", 971); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH TONOS", 972); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH TONOS", 973); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH TONOS", 974); - _unicodeCharacterMap.Add("GREEK CAPITAL KAI SYMBOL", 975); - _unicodeCharacterMap.Add("GREEK BETA SYMBOL", 976); - _unicodeCharacterMap.Add("GREEK THETA SYMBOL", 977); - _unicodeCharacterMap.Add("GREEK UPSILON WITH HOOK SYMBOL", 978); - _unicodeCharacterMap.Add("GREEK UPSILON WITH ACUTE AND HOOK SYMBOL", 979); - _unicodeCharacterMap.Add("GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL", 980); - _unicodeCharacterMap.Add("GREEK PHI SYMBOL", 981); - _unicodeCharacterMap.Add("GREEK PI SYMBOL", 982); - _unicodeCharacterMap.Add("GREEK KAI SYMBOL", 983); - _unicodeCharacterMap.Add("GREEK LETTER ARCHAIC KOPPA", 984); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ARCHAIC KOPPA", 985); - _unicodeCharacterMap.Add("GREEK LETTER STIGMA", 986); - _unicodeCharacterMap.Add("GREEK SMALL LETTER STIGMA", 987); - _unicodeCharacterMap.Add("GREEK LETTER DIGAMMA", 988); - _unicodeCharacterMap.Add("GREEK SMALL LETTER DIGAMMA", 989); - _unicodeCharacterMap.Add("GREEK LETTER KOPPA", 990); - _unicodeCharacterMap.Add("GREEK SMALL LETTER KOPPA", 991); - _unicodeCharacterMap.Add("GREEK LETTER SAMPI", 992); - _unicodeCharacterMap.Add("GREEK SMALL LETTER SAMPI", 993); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER SHEI", 994); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER SHEI", 995); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER FEI", 996); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER FEI", 997); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER KHEI", 998); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER KHEI", 999); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER HORI", 1000); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER HORI", 1001); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER GANGIA", 1002); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER GANGIA", 1003); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER SHIMA", 1004); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER SHIMA", 1005); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER DEI", 1006); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER DEI", 1007); - _unicodeCharacterMap.Add("GREEK KAPPA SYMBOL", 1008); - _unicodeCharacterMap.Add("GREEK RHO SYMBOL", 1009); - _unicodeCharacterMap.Add("GREEK LUNATE SIGMA SYMBOL", 1010); - _unicodeCharacterMap.Add("GREEK LETTER YOT", 1011); - _unicodeCharacterMap.Add("GREEK CAPITAL THETA SYMBOL", 1012); - _unicodeCharacterMap.Add("GREEK LUNATE EPSILON SYMBOL", 1013); - _unicodeCharacterMap.Add("GREEK REVERSED LUNATE EPSILON SYMBOL", 1014); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER SHO", 1015); - _unicodeCharacterMap.Add("GREEK SMALL LETTER SHO", 1016); - _unicodeCharacterMap.Add("GREEK CAPITAL LUNATE SIGMA SYMBOL", 1017); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER SAN", 1018); - _unicodeCharacterMap.Add("GREEK SMALL LETTER SAN", 1019); - _unicodeCharacterMap.Add("GREEK RHO WITH STROKE SYMBOL", 1020); - _unicodeCharacterMap.Add("GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL", 1021); - _unicodeCharacterMap.Add("GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL", 1022); - _unicodeCharacterMap.Add("GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL", 1023); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IE WITH GRAVE", 1024); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IO", 1025); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DJE", 1026); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER GJE", 1027); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER UKRAINIAN IE", 1028); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DZE", 1029); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BYELORUSSIAN UKRAINIAN I", 1030); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YI", 1031); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER JE", 1032); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER LJE", 1033); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER NJE", 1034); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TSHE", 1035); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KJE", 1036); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER I WITH GRAVE", 1037); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHORT U", 1038); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DZHE", 1039); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER A", 1040); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BE", 1041); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER VE", 1042); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER GHE", 1043); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DE", 1044); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IE", 1045); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZHE", 1046); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZE", 1047); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER I", 1048); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHORT I", 1049); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KA", 1050); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EL", 1051); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EM", 1052); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EN", 1053); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER O", 1054); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER PE", 1055); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ER", 1056); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ES", 1057); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TE", 1058); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER U", 1059); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EF", 1060); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER HA", 1061); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TSE", 1062); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER CHE", 1063); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHA", 1064); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHCHA", 1065); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER HARD SIGN", 1066); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YERU", 1067); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SOFT SIGN", 1068); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER E", 1069); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YU", 1070); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YA", 1071); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER A", 1072); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BE", 1073); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER VE", 1074); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER GHE", 1075); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DE", 1076); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IE", 1077); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZHE", 1078); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZE", 1079); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER I", 1080); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHORT I", 1081); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KA", 1082); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EL", 1083); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EM", 1084); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EN", 1085); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER O", 1086); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER PE", 1087); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ER", 1088); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ES", 1089); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TE", 1090); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER U", 1091); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EF", 1092); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER HA", 1093); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TSE", 1094); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER CHE", 1095); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHA", 1096); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHCHA", 1097); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER HARD SIGN", 1098); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YERU", 1099); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SOFT SIGN", 1100); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER E", 1101); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YU", 1102); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YA", 1103); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IE WITH GRAVE", 1104); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IO", 1105); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DJE", 1106); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER GJE", 1107); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER UKRAINIAN IE", 1108); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DZE", 1109); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BYELORUSSIAN UKRAINIAN I", 1110); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YI", 1111); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER JE", 1112); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER LJE", 1113); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER NJE", 1114); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TSHE", 1115); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KJE", 1116); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER I WITH GRAVE", 1117); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHORT U", 1118); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DZHE", 1119); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER OMEGA", 1120); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER OMEGA", 1121); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YAT", 1122); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YAT", 1123); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IOTIFIED E", 1124); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IOTIFIED E", 1125); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER LITTLE YUS", 1126); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER LITTLE YUS", 1127); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS", 1128); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS", 1129); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BIG YUS", 1130); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BIG YUS", 1131); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS", 1132); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IOTIFIED BIG YUS", 1133); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KSI", 1134); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KSI", 1135); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER PSI", 1136); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER PSI", 1137); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER FITA", 1138); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER FITA", 1139); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IZHITSA", 1140); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IZHITSA", 1141); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT", 1142); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT", 1143); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER UK", 1144); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER UK", 1145); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ROUND OMEGA", 1146); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ROUND OMEGA", 1147); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER OMEGA WITH TITLO", 1148); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER OMEGA WITH TITLO", 1149); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER OT", 1150); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER OT", 1151); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOPPA", 1152); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOPPA", 1153); - _unicodeCharacterMap.Add("CYRILLIC THOUSANDS SIGN", 1154); - _unicodeCharacterMap.Add("COMBINING CYRILLIC TITLO", 1155); - _unicodeCharacterMap.Add("COMBINING CYRILLIC PALATALIZATION", 1156); - _unicodeCharacterMap.Add("COMBINING CYRILLIC DASIA PNEUMATA", 1157); - _unicodeCharacterMap.Add("COMBINING CYRILLIC PSILI PNEUMATA", 1158); - _unicodeCharacterMap.Add("COMBINING CYRILLIC POKRYTIE", 1159); - _unicodeCharacterMap.Add("COMBINING CYRILLIC HUNDRED THOUSANDS SIGN", 1160); - _unicodeCharacterMap.Add("COMBINING CYRILLIC MILLIONS SIGN", 1161); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHORT I WITH TAIL", 1162); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHORT I WITH TAIL", 1163); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SEMISOFT SIGN", 1164); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SEMISOFT SIGN", 1165); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ER WITH TICK", 1166); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ER WITH TICK", 1167); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER GHE WITH UPTURN", 1168); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER GHE WITH UPTURN", 1169); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER GHE WITH STROKE", 1170); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER GHE WITH STROKE", 1171); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK", 1172); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK", 1173); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER", 1174); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZHE WITH DESCENDER", 1175); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZE WITH DESCENDER", 1176); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZE WITH DESCENDER", 1177); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KA WITH DESCENDER", 1178); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KA WITH DESCENDER", 1179); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE", 1180); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE", 1181); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KA WITH STROKE", 1182); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KA WITH STROKE", 1183); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BASHKIR KA", 1184); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BASHKIR KA", 1185); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EN WITH DESCENDER", 1186); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EN WITH DESCENDER", 1187); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LIGATURE EN GHE", 1188); - _unicodeCharacterMap.Add("CYRILLIC SMALL LIGATURE EN GHE", 1189); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK", 1190); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK", 1191); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ABKHASIAN HA", 1192); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ABKHASIAN HA", 1193); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ES WITH DESCENDER", 1194); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ES WITH DESCENDER", 1195); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TE WITH DESCENDER", 1196); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TE WITH DESCENDER", 1197); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER STRAIGHT U", 1198); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER STRAIGHT U", 1199); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE", 1200); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE", 1201); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER HA WITH DESCENDER", 1202); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER HA WITH DESCENDER", 1203); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LIGATURE TE TSE", 1204); - _unicodeCharacterMap.Add("CYRILLIC SMALL LIGATURE TE TSE", 1205); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER CHE WITH DESCENDER", 1206); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER CHE WITH DESCENDER", 1207); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE", 1208); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE", 1209); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHHA", 1210); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHHA", 1211); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ABKHASIAN CHE", 1212); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ABKHASIAN CHE", 1213); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER", 1214); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER", 1215); - _unicodeCharacterMap.Add("CYRILLIC LETTER PALOCHKA", 1216); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZHE WITH BREVE", 1217); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZHE WITH BREVE", 1218); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KA WITH HOOK", 1219); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KA WITH HOOK", 1220); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EL WITH TAIL", 1221); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EL WITH TAIL", 1222); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EN WITH HOOK", 1223); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EN WITH HOOK", 1224); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EN WITH TAIL", 1225); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EN WITH TAIL", 1226); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KHAKASSIAN CHE", 1227); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KHAKASSIAN CHE", 1228); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EM WITH TAIL", 1229); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EM WITH TAIL", 1230); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER PALOCHKA", 1231); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER A WITH BREVE", 1232); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER A WITH BREVE", 1233); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER A WITH DIAERESIS", 1234); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER A WITH DIAERESIS", 1235); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LIGATURE A IE", 1236); - _unicodeCharacterMap.Add("CYRILLIC SMALL LIGATURE A IE", 1237); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IE WITH BREVE", 1238); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IE WITH BREVE", 1239); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SCHWA", 1240); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SCHWA", 1241); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS", 1242); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS", 1243); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS", 1244); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZHE WITH DIAERESIS", 1245); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS", 1246); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZE WITH DIAERESIS", 1247); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ABKHASIAN DZE", 1248); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ABKHASIAN DZE", 1249); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER I WITH MACRON", 1250); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER I WITH MACRON", 1251); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER I WITH DIAERESIS", 1252); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER I WITH DIAERESIS", 1253); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER O WITH DIAERESIS", 1254); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER O WITH DIAERESIS", 1255); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BARRED O", 1256); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BARRED O", 1257); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS", 1258); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS", 1259); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER E WITH DIAERESIS", 1260); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER E WITH DIAERESIS", 1261); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER U WITH MACRON", 1262); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER U WITH MACRON", 1263); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER U WITH DIAERESIS", 1264); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER U WITH DIAERESIS", 1265); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE", 1266); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE", 1267); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS", 1268); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER CHE WITH DIAERESIS", 1269); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER GHE WITH DESCENDER", 1270); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER GHE WITH DESCENDER", 1271); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS", 1272); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YERU WITH DIAERESIS", 1273); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK", 1274); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK", 1275); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER HA WITH HOOK", 1276); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER HA WITH HOOK", 1277); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER HA WITH STROKE", 1278); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER HA WITH STROKE", 1279); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI DE", 1280); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI DE", 1281); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI DJE", 1282); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI DJE", 1283); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI ZJE", 1284); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI ZJE", 1285); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI DZJE", 1286); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI DZJE", 1287); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI LJE", 1288); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI LJE", 1289); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI NJE", 1290); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI NJE", 1291); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI SJE", 1292); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI SJE", 1293); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER KOMI TJE", 1294); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER KOMI TJE", 1295); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER REVERSED ZE", 1296); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER REVERSED ZE", 1297); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EL WITH HOOK", 1298); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EL WITH HOOK", 1299); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER LHA", 1300); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER LHA", 1301); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER RHA", 1302); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER RHA", 1303); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YAE", 1304); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YAE", 1305); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER QA", 1306); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER QA", 1307); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER WE", 1308); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER WE", 1309); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ALEUT KA", 1310); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ALEUT KA", 1311); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK", 1312); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK", 1313); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK", 1314); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK", 1315); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER PE WITH DESCENDER", 1316); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER PE WITH DESCENDER", 1317); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER", 1318); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHHA WITH DESCENDER", 1319); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK", 1320); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EN WITH LEFT HOOK", 1321); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DZZHE", 1322); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DZZHE", 1323); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DCHE", 1324); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DCHE", 1325); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER EL WITH DESCENDER", 1326); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER EL WITH DESCENDER", 1327); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER AYB", 1329); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER BEN", 1330); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER GIM", 1331); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER DA", 1332); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER ECH", 1333); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER ZA", 1334); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER EH", 1335); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER ET", 1336); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER TO", 1337); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER ZHE", 1338); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER INI", 1339); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER LIWN", 1340); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER XEH", 1341); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER CA", 1342); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER KEN", 1343); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER HO", 1344); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER JA", 1345); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER GHAD", 1346); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER CHEH", 1347); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER MEN", 1348); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER YI", 1349); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER NOW", 1350); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER SHA", 1351); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER VO", 1352); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER CHA", 1353); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER PEH", 1354); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER JHEH", 1355); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER RA", 1356); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER SEH", 1357); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER VEW", 1358); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER TIWN", 1359); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER REH", 1360); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER CO", 1361); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER YIWN", 1362); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER PIWR", 1363); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER KEH", 1364); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER OH", 1365); - _unicodeCharacterMap.Add("ARMENIAN CAPITAL LETTER FEH", 1366); - _unicodeCharacterMap.Add("ARMENIAN MODIFIER LETTER LEFT HALF RING", 1369); - _unicodeCharacterMap.Add("ARMENIAN APOSTROPHE", 1370); - _unicodeCharacterMap.Add("ARMENIAN EMPHASIS MARK", 1371); - _unicodeCharacterMap.Add("ARMENIAN EXCLAMATION MARK", 1372); - _unicodeCharacterMap.Add("ARMENIAN COMMA", 1373); - _unicodeCharacterMap.Add("ARMENIAN QUESTION MARK", 1374); - _unicodeCharacterMap.Add("ARMENIAN ABBREVIATION MARK", 1375); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER AYB", 1377); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER BEN", 1378); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER GIM", 1379); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER DA", 1380); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER ECH", 1381); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER ZA", 1382); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER EH", 1383); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER ET", 1384); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER TO", 1385); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER ZHE", 1386); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER INI", 1387); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER LIWN", 1388); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER XEH", 1389); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER CA", 1390); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER KEN", 1391); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER HO", 1392); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER JA", 1393); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER GHAD", 1394); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER CHEH", 1395); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER MEN", 1396); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER YI", 1397); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER NOW", 1398); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER SHA", 1399); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER VO", 1400); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER CHA", 1401); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER PEH", 1402); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER JHEH", 1403); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER RA", 1404); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER SEH", 1405); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER VEW", 1406); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER TIWN", 1407); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER REH", 1408); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER CO", 1409); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER YIWN", 1410); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER PIWR", 1411); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER KEH", 1412); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER OH", 1413); - _unicodeCharacterMap.Add("ARMENIAN SMALL LETTER FEH", 1414); - _unicodeCharacterMap.Add("ARMENIAN SMALL LIGATURE ECH YIWN", 1415); - _unicodeCharacterMap.Add("ARMENIAN FULL STOP", 1417); - _unicodeCharacterMap.Add("ARMENIAN HYPHEN", 1418); - _unicodeCharacterMap.Add("RIGHT FACING ARMENIAN ETERNITY SIGN", 1421); - _unicodeCharacterMap.Add("LEFT FACING ARMENIAN ETERNITY SIGN", 1422); - _unicodeCharacterMap.Add("ARMENIAN DRAM SIGN", 1423); - _unicodeCharacterMap.Add("HEBREW ACCENT ETNAHTA", 1425); - _unicodeCharacterMap.Add("HEBREW ACCENT SEGOL", 1426); - _unicodeCharacterMap.Add("HEBREW ACCENT SHALSHELET", 1427); - _unicodeCharacterMap.Add("HEBREW ACCENT ZAQEF QATAN", 1428); - _unicodeCharacterMap.Add("HEBREW ACCENT ZAQEF GADOL", 1429); - _unicodeCharacterMap.Add("HEBREW ACCENT TIPEHA", 1430); - _unicodeCharacterMap.Add("HEBREW ACCENT REVIA", 1431); - _unicodeCharacterMap.Add("HEBREW ACCENT ZARQA", 1432); - _unicodeCharacterMap.Add("HEBREW ACCENT PASHTA", 1433); - _unicodeCharacterMap.Add("HEBREW ACCENT YETIV", 1434); - _unicodeCharacterMap.Add("HEBREW ACCENT TEVIR", 1435); - _unicodeCharacterMap.Add("HEBREW ACCENT GERESH", 1436); - _unicodeCharacterMap.Add("HEBREW ACCENT GERESH MUQDAM", 1437); - _unicodeCharacterMap.Add("HEBREW ACCENT GERSHAYIM", 1438); - _unicodeCharacterMap.Add("HEBREW ACCENT QARNEY PARA", 1439); - _unicodeCharacterMap.Add("HEBREW ACCENT TELISHA GEDOLA", 1440); - _unicodeCharacterMap.Add("HEBREW ACCENT PAZER", 1441); - _unicodeCharacterMap.Add("HEBREW ACCENT ATNAH HAFUKH", 1442); - _unicodeCharacterMap.Add("HEBREW ACCENT MUNAH", 1443); - _unicodeCharacterMap.Add("HEBREW ACCENT MAHAPAKH", 1444); - _unicodeCharacterMap.Add("HEBREW ACCENT MERKHA", 1445); - _unicodeCharacterMap.Add("HEBREW ACCENT MERKHA KEFULA", 1446); - _unicodeCharacterMap.Add("HEBREW ACCENT DARGA", 1447); - _unicodeCharacterMap.Add("HEBREW ACCENT QADMA", 1448); - _unicodeCharacterMap.Add("HEBREW ACCENT TELISHA QETANA", 1449); - _unicodeCharacterMap.Add("HEBREW ACCENT YERAH BEN YOMO", 1450); - _unicodeCharacterMap.Add("HEBREW ACCENT OLE", 1451); - _unicodeCharacterMap.Add("HEBREW ACCENT ILUY", 1452); - _unicodeCharacterMap.Add("HEBREW ACCENT DEHI", 1453); - _unicodeCharacterMap.Add("HEBREW ACCENT ZINOR", 1454); - _unicodeCharacterMap.Add("HEBREW MARK MASORA CIRCLE", 1455); - _unicodeCharacterMap.Add("HEBREW POINT SHEVA", 1456); - _unicodeCharacterMap.Add("HEBREW POINT HATAF SEGOL", 1457); - _unicodeCharacterMap.Add("HEBREW POINT HATAF PATAH", 1458); - _unicodeCharacterMap.Add("HEBREW POINT HATAF QAMATS", 1459); - _unicodeCharacterMap.Add("HEBREW POINT HIRIQ", 1460); - _unicodeCharacterMap.Add("HEBREW POINT TSERE", 1461); - _unicodeCharacterMap.Add("HEBREW POINT SEGOL", 1462); - _unicodeCharacterMap.Add("HEBREW POINT PATAH", 1463); - _unicodeCharacterMap.Add("HEBREW POINT QAMATS", 1464); - _unicodeCharacterMap.Add("HEBREW POINT HOLAM", 1465); - _unicodeCharacterMap.Add("HEBREW POINT HOLAM HASER FOR VAV", 1466); - _unicodeCharacterMap.Add("HEBREW POINT QUBUTS", 1467); - _unicodeCharacterMap.Add("HEBREW POINT DAGESH OR MAPIQ", 1468); - _unicodeCharacterMap.Add("HEBREW POINT METEG", 1469); - _unicodeCharacterMap.Add("HEBREW PUNCTUATION MAQAF", 1470); - _unicodeCharacterMap.Add("HEBREW POINT RAFE", 1471); - _unicodeCharacterMap.Add("HEBREW PUNCTUATION PASEQ", 1472); - _unicodeCharacterMap.Add("HEBREW POINT SHIN DOT", 1473); - _unicodeCharacterMap.Add("HEBREW POINT SIN DOT", 1474); - _unicodeCharacterMap.Add("HEBREW PUNCTUATION SOF PASUQ", 1475); - _unicodeCharacterMap.Add("HEBREW MARK UPPER DOT", 1476); - _unicodeCharacterMap.Add("HEBREW MARK LOWER DOT", 1477); - _unicodeCharacterMap.Add("HEBREW PUNCTUATION NUN HAFUKHA", 1478); - _unicodeCharacterMap.Add("HEBREW POINT QAMATS QATAN", 1479); - _unicodeCharacterMap.Add("HEBREW LETTER ALEF", 1488); - _unicodeCharacterMap.Add("HEBREW LETTER BET", 1489); - _unicodeCharacterMap.Add("HEBREW LETTER GIMEL", 1490); - _unicodeCharacterMap.Add("HEBREW LETTER DALET", 1491); - _unicodeCharacterMap.Add("HEBREW LETTER HE", 1492); - _unicodeCharacterMap.Add("HEBREW LETTER VAV", 1493); - _unicodeCharacterMap.Add("HEBREW LETTER ZAYIN", 1494); - _unicodeCharacterMap.Add("HEBREW LETTER HET", 1495); - _unicodeCharacterMap.Add("HEBREW LETTER TET", 1496); - _unicodeCharacterMap.Add("HEBREW LETTER YOD", 1497); - _unicodeCharacterMap.Add("HEBREW LETTER FINAL KAF", 1498); - _unicodeCharacterMap.Add("HEBREW LETTER KAF", 1499); - _unicodeCharacterMap.Add("HEBREW LETTER LAMED", 1500); - _unicodeCharacterMap.Add("HEBREW LETTER FINAL MEM", 1501); - _unicodeCharacterMap.Add("HEBREW LETTER MEM", 1502); - _unicodeCharacterMap.Add("HEBREW LETTER FINAL NUN", 1503); - _unicodeCharacterMap.Add("HEBREW LETTER NUN", 1504); - _unicodeCharacterMap.Add("HEBREW LETTER SAMEKH", 1505); - _unicodeCharacterMap.Add("HEBREW LETTER AYIN", 1506); - _unicodeCharacterMap.Add("HEBREW LETTER FINAL PE", 1507); - _unicodeCharacterMap.Add("HEBREW LETTER PE", 1508); - _unicodeCharacterMap.Add("HEBREW LETTER FINAL TSADI", 1509); - _unicodeCharacterMap.Add("HEBREW LETTER TSADI", 1510); - _unicodeCharacterMap.Add("HEBREW LETTER QOF", 1511); - _unicodeCharacterMap.Add("HEBREW LETTER RESH", 1512); - _unicodeCharacterMap.Add("HEBREW LETTER SHIN", 1513); - _unicodeCharacterMap.Add("HEBREW LETTER TAV", 1514); - _unicodeCharacterMap.Add("HEBREW LIGATURE YIDDISH DOUBLE VAV", 1520); - _unicodeCharacterMap.Add("HEBREW LIGATURE YIDDISH VAV YOD", 1521); - _unicodeCharacterMap.Add("HEBREW LIGATURE YIDDISH DOUBLE YOD", 1522); - _unicodeCharacterMap.Add("HEBREW PUNCTUATION GERESH", 1523); - _unicodeCharacterMap.Add("HEBREW PUNCTUATION GERSHAYIM", 1524); - _unicodeCharacterMap.Add("ARABIC NUMBER SIGN", 1536); - _unicodeCharacterMap.Add("ARABIC SIGN SANAH", 1537); - _unicodeCharacterMap.Add("ARABIC FOOTNOTE MARKER", 1538); - _unicodeCharacterMap.Add("ARABIC SIGN SAFHA", 1539); - _unicodeCharacterMap.Add("ARABIC SIGN SAMVAT", 1540); - _unicodeCharacterMap.Add("ARABIC NUMBER MARK ABOVE", 1541); - _unicodeCharacterMap.Add("ARABIC INDIC CUBE ROOT", 1542); - _unicodeCharacterMap.Add("ARABIC INDIC FOURTH ROOT", 1543); - _unicodeCharacterMap.Add("ARABIC RAY", 1544); - _unicodeCharacterMap.Add("ARABIC INDIC PER MILLE SIGN", 1545); - _unicodeCharacterMap.Add("ARABIC INDIC PER TEN THOUSAND SIGN", 1546); - _unicodeCharacterMap.Add("AFGHANI SIGN", 1547); - _unicodeCharacterMap.Add("ARABIC COMMA", 1548); - _unicodeCharacterMap.Add("ARABIC DATE SEPARATOR", 1549); - _unicodeCharacterMap.Add("ARABIC POETIC VERSE SIGN", 1550); - _unicodeCharacterMap.Add("ARABIC SIGN MISRA", 1551); - _unicodeCharacterMap.Add("ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM", 1552); - _unicodeCharacterMap.Add("ARABIC SIGN ALAYHE ASSALLAM", 1553); - _unicodeCharacterMap.Add("ARABIC SIGN RAHMATULLAH ALAYHE", 1554); - _unicodeCharacterMap.Add("ARABIC SIGN RADI ALLAHOU ANHU", 1555); - _unicodeCharacterMap.Add("ARABIC SIGN TAKHALLUS", 1556); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH TAH", 1557); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH", 1558); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH ZAIN", 1559); - _unicodeCharacterMap.Add("ARABIC SMALL FATHA", 1560); - _unicodeCharacterMap.Add("ARABIC SMALL DAMMA", 1561); - _unicodeCharacterMap.Add("ARABIC SMALL KASRA", 1562); - _unicodeCharacterMap.Add("ARABIC SEMICOLON", 1563); - _unicodeCharacterMap.Add("ARABIC LETTER MARK", 1564); - _unicodeCharacterMap.Add("ARABIC TRIPLE DOT PUNCTUATION MARK", 1566); - _unicodeCharacterMap.Add("ARABIC QUESTION MARK", 1567); - _unicodeCharacterMap.Add("ARABIC LETTER KASHMIRI YEH", 1568); - _unicodeCharacterMap.Add("ARABIC LETTER HAMZA", 1569); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH MADDA ABOVE", 1570); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH HAMZA ABOVE", 1571); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH HAMZA ABOVE", 1572); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH HAMZA BELOW", 1573); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH HAMZA ABOVE", 1574); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF", 1575); - _unicodeCharacterMap.Add("ARABIC LETTER BEH", 1576); - _unicodeCharacterMap.Add("ARABIC LETTER TEH MARBUTA", 1577); - _unicodeCharacterMap.Add("ARABIC LETTER TEH", 1578); - _unicodeCharacterMap.Add("ARABIC LETTER THEH", 1579); - _unicodeCharacterMap.Add("ARABIC LETTER JEEM", 1580); - _unicodeCharacterMap.Add("ARABIC LETTER HAH", 1581); - _unicodeCharacterMap.Add("ARABIC LETTER KHAH", 1582); - _unicodeCharacterMap.Add("ARABIC LETTER DAL", 1583); - _unicodeCharacterMap.Add("ARABIC LETTER THAL", 1584); - _unicodeCharacterMap.Add("ARABIC LETTER REH", 1585); - _unicodeCharacterMap.Add("ARABIC LETTER ZAIN", 1586); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN", 1587); - _unicodeCharacterMap.Add("ARABIC LETTER SHEEN", 1588); - _unicodeCharacterMap.Add("ARABIC LETTER SAD", 1589); - _unicodeCharacterMap.Add("ARABIC LETTER DAD", 1590); - _unicodeCharacterMap.Add("ARABIC LETTER TAH", 1591); - _unicodeCharacterMap.Add("ARABIC LETTER ZAH", 1592); - _unicodeCharacterMap.Add("ARABIC LETTER AIN", 1593); - _unicodeCharacterMap.Add("ARABIC LETTER GHAIN", 1594); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH WITH TWO DOTS ABOVE", 1595); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH WITH THREE DOTS BELOW", 1596); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH WITH INVERTED V", 1597); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE", 1598); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE", 1599); - _unicodeCharacterMap.Add("ARABIC TATWEEL", 1600); - _unicodeCharacterMap.Add("ARABIC LETTER FEH", 1601); - _unicodeCharacterMap.Add("ARABIC LETTER QAF", 1602); - _unicodeCharacterMap.Add("ARABIC LETTER KAF", 1603); - _unicodeCharacterMap.Add("ARABIC LETTER LAM", 1604); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM", 1605); - _unicodeCharacterMap.Add("ARABIC LETTER NOON", 1606); - _unicodeCharacterMap.Add("ARABIC LETTER HEH", 1607); - _unicodeCharacterMap.Add("ARABIC LETTER WAW", 1608); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF MAKSURA", 1609); - _unicodeCharacterMap.Add("ARABIC LETTER YEH", 1610); - _unicodeCharacterMap.Add("ARABIC FATHATAN", 1611); - _unicodeCharacterMap.Add("ARABIC DAMMATAN", 1612); - _unicodeCharacterMap.Add("ARABIC KASRATAN", 1613); - _unicodeCharacterMap.Add("ARABIC FATHA", 1614); - _unicodeCharacterMap.Add("ARABIC DAMMA", 1615); - _unicodeCharacterMap.Add("ARABIC KASRA", 1616); - _unicodeCharacterMap.Add("ARABIC SHADDA", 1617); - _unicodeCharacterMap.Add("ARABIC SUKUN", 1618); - _unicodeCharacterMap.Add("ARABIC MADDAH ABOVE", 1619); - _unicodeCharacterMap.Add("ARABIC HAMZA ABOVE", 1620); - _unicodeCharacterMap.Add("ARABIC HAMZA BELOW", 1621); - _unicodeCharacterMap.Add("ARABIC SUBSCRIPT ALEF", 1622); - _unicodeCharacterMap.Add("ARABIC INVERTED DAMMA", 1623); - _unicodeCharacterMap.Add("ARABIC MARK NOON GHUNNA", 1624); - _unicodeCharacterMap.Add("ARABIC ZWARAKAY", 1625); - _unicodeCharacterMap.Add("ARABIC VOWEL SIGN SMALL V ABOVE", 1626); - _unicodeCharacterMap.Add("ARABIC VOWEL SIGN INVERTED SMALL V ABOVE", 1627); - _unicodeCharacterMap.Add("ARABIC VOWEL SIGN DOT BELOW", 1628); - _unicodeCharacterMap.Add("ARABIC REVERSED DAMMA", 1629); - _unicodeCharacterMap.Add("ARABIC FATHA WITH TWO DOTS", 1630); - _unicodeCharacterMap.Add("ARABIC WAVY HAMZA BELOW", 1631); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT ZERO", 1632); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT ONE", 1633); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT TWO", 1634); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT THREE", 1635); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT FOUR", 1636); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT FIVE", 1637); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT SIX", 1638); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT SEVEN", 1639); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT EIGHT", 1640); - _unicodeCharacterMap.Add("ARABIC INDIC DIGIT NINE", 1641); - _unicodeCharacterMap.Add("ARABIC PERCENT SIGN", 1642); - _unicodeCharacterMap.Add("ARABIC DECIMAL SEPARATOR", 1643); - _unicodeCharacterMap.Add("ARABIC THOUSANDS SEPARATOR", 1644); - _unicodeCharacterMap.Add("ARABIC FIVE POINTED STAR", 1645); - _unicodeCharacterMap.Add("ARABIC LETTER DOTLESS BEH", 1646); - _unicodeCharacterMap.Add("ARABIC LETTER DOTLESS QAF", 1647); - _unicodeCharacterMap.Add("ARABIC LETTER SUPERSCRIPT ALEF", 1648); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WASLA", 1649); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE", 1650); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH WAVY HAMZA BELOW", 1651); - _unicodeCharacterMap.Add("ARABIC LETTER HIGH HAMZA", 1652); - _unicodeCharacterMap.Add("ARABIC LETTER HIGH HAMZA ALEF", 1653); - _unicodeCharacterMap.Add("ARABIC LETTER HIGH HAMZA WAW", 1654); - _unicodeCharacterMap.Add("ARABIC LETTER U WITH HAMZA ABOVE", 1655); - _unicodeCharacterMap.Add("ARABIC LETTER HIGH HAMZA YEH", 1656); - _unicodeCharacterMap.Add("ARABIC LETTER TTEH", 1657); - _unicodeCharacterMap.Add("ARABIC LETTER TTEHEH", 1658); - _unicodeCharacterMap.Add("ARABIC LETTER BEEH", 1659); - _unicodeCharacterMap.Add("ARABIC LETTER TEH WITH RING", 1660); - _unicodeCharacterMap.Add("ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS", 1661); - _unicodeCharacterMap.Add("ARABIC LETTER PEH", 1662); - _unicodeCharacterMap.Add("ARABIC LETTER TEHEH", 1663); - _unicodeCharacterMap.Add("ARABIC LETTER BEHEH", 1664); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH HAMZA ABOVE", 1665); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE", 1666); - _unicodeCharacterMap.Add("ARABIC LETTER NYEH", 1667); - _unicodeCharacterMap.Add("ARABIC LETTER DYEH", 1668); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH THREE DOTS ABOVE", 1669); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEH", 1670); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEHEH", 1671); - _unicodeCharacterMap.Add("ARABIC LETTER DDAL", 1672); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH RING", 1673); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH DOT BELOW", 1674); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH", 1675); - _unicodeCharacterMap.Add("ARABIC LETTER DAHAL", 1676); - _unicodeCharacterMap.Add("ARABIC LETTER DDAHAL", 1677); - _unicodeCharacterMap.Add("ARABIC LETTER DUL", 1678); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS", 1679); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH FOUR DOTS ABOVE", 1680); - _unicodeCharacterMap.Add("ARABIC LETTER RREH", 1681); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH SMALL V", 1682); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH RING", 1683); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH DOT BELOW", 1684); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH SMALL V BELOW", 1685); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE", 1686); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH TWO DOTS ABOVE", 1687); - _unicodeCharacterMap.Add("ARABIC LETTER JEH", 1688); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH FOUR DOTS ABOVE", 1689); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE", 1690); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH THREE DOTS BELOW", 1691); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE", 1692); - _unicodeCharacterMap.Add("ARABIC LETTER SAD WITH TWO DOTS BELOW", 1693); - _unicodeCharacterMap.Add("ARABIC LETTER SAD WITH THREE DOTS ABOVE", 1694); - _unicodeCharacterMap.Add("ARABIC LETTER TAH WITH THREE DOTS ABOVE", 1695); - _unicodeCharacterMap.Add("ARABIC LETTER AIN WITH THREE DOTS ABOVE", 1696); - _unicodeCharacterMap.Add("ARABIC LETTER DOTLESS FEH", 1697); - _unicodeCharacterMap.Add("ARABIC LETTER FEH WITH DOT MOVED BELOW", 1698); - _unicodeCharacterMap.Add("ARABIC LETTER FEH WITH DOT BELOW", 1699); - _unicodeCharacterMap.Add("ARABIC LETTER VEH", 1700); - _unicodeCharacterMap.Add("ARABIC LETTER FEH WITH THREE DOTS BELOW", 1701); - _unicodeCharacterMap.Add("ARABIC LETTER PEHEH", 1702); - _unicodeCharacterMap.Add("ARABIC LETTER QAF WITH DOT ABOVE", 1703); - _unicodeCharacterMap.Add("ARABIC LETTER QAF WITH THREE DOTS ABOVE", 1704); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH", 1705); - _unicodeCharacterMap.Add("ARABIC LETTER SWASH KAF", 1706); - _unicodeCharacterMap.Add("ARABIC LETTER KAF WITH RING", 1707); - _unicodeCharacterMap.Add("ARABIC LETTER KAF WITH DOT ABOVE", 1708); - _unicodeCharacterMap.Add("ARABIC LETTER NG", 1709); - _unicodeCharacterMap.Add("ARABIC LETTER KAF WITH THREE DOTS BELOW", 1710); - _unicodeCharacterMap.Add("ARABIC LETTER GAF", 1711); - _unicodeCharacterMap.Add("ARABIC LETTER GAF WITH RING", 1712); - _unicodeCharacterMap.Add("ARABIC LETTER NGOEH", 1713); - _unicodeCharacterMap.Add("ARABIC LETTER GAF WITH TWO DOTS BELOW", 1714); - _unicodeCharacterMap.Add("ARABIC LETTER GUEH", 1715); - _unicodeCharacterMap.Add("ARABIC LETTER GAF WITH THREE DOTS ABOVE", 1716); - _unicodeCharacterMap.Add("ARABIC LETTER LAM WITH SMALL V", 1717); - _unicodeCharacterMap.Add("ARABIC LETTER LAM WITH DOT ABOVE", 1718); - _unicodeCharacterMap.Add("ARABIC LETTER LAM WITH THREE DOTS ABOVE", 1719); - _unicodeCharacterMap.Add("ARABIC LETTER LAM WITH THREE DOTS BELOW", 1720); - _unicodeCharacterMap.Add("ARABIC LETTER NOON WITH DOT BELOW", 1721); - _unicodeCharacterMap.Add("ARABIC LETTER NOON GHUNNA", 1722); - _unicodeCharacterMap.Add("ARABIC LETTER RNOON", 1723); - _unicodeCharacterMap.Add("ARABIC LETTER NOON WITH RING", 1724); - _unicodeCharacterMap.Add("ARABIC LETTER NOON WITH THREE DOTS ABOVE", 1725); - _unicodeCharacterMap.Add("ARABIC LETTER HEH DOACHASHMEE", 1726); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEH WITH DOT ABOVE", 1727); - _unicodeCharacterMap.Add("ARABIC LETTER HEH WITH YEH ABOVE", 1728); - _unicodeCharacterMap.Add("ARABIC LETTER HEH GOAL", 1729); - _unicodeCharacterMap.Add("ARABIC LETTER HEH GOAL WITH HAMZA ABOVE", 1730); - _unicodeCharacterMap.Add("ARABIC LETTER TEH MARBUTA GOAL", 1731); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH RING", 1732); - _unicodeCharacterMap.Add("ARABIC LETTER KIRGHIZ OE", 1733); - _unicodeCharacterMap.Add("ARABIC LETTER OE", 1734); - _unicodeCharacterMap.Add("ARABIC LETTER U", 1735); - _unicodeCharacterMap.Add("ARABIC LETTER YU", 1736); - _unicodeCharacterMap.Add("ARABIC LETTER KIRGHIZ YU", 1737); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH TWO DOTS ABOVE", 1738); - _unicodeCharacterMap.Add("ARABIC LETTER VE", 1739); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH", 1740); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH TAIL", 1741); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH SMALL V", 1742); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH DOT ABOVE", 1743); - _unicodeCharacterMap.Add("ARABIC LETTER E", 1744); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH THREE DOTS BELOW", 1745); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE", 1746); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE", 1747); - _unicodeCharacterMap.Add("ARABIC FULL STOP", 1748); - _unicodeCharacterMap.Add("ARABIC LETTER AE", 1749); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA", 1750); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA", 1751); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH MEEM INITIAL FORM", 1752); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH LAM ALEF", 1753); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH JEEM", 1754); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH THREE DOTS", 1755); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH SEEN", 1756); - _unicodeCharacterMap.Add("ARABIC END OF AYAH", 1757); - _unicodeCharacterMap.Add("ARABIC START OF RUB EL HIZB", 1758); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH ROUNDED ZERO", 1759); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO", 1760); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH DOTLESS HEAD OF KHAH", 1761); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH MEEM ISOLATED FORM", 1762); - _unicodeCharacterMap.Add("ARABIC SMALL LOW SEEN", 1763); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH MADDA", 1764); - _unicodeCharacterMap.Add("ARABIC SMALL WAW", 1765); - _unicodeCharacterMap.Add("ARABIC SMALL YEH", 1766); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH YEH", 1767); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH NOON", 1768); - _unicodeCharacterMap.Add("ARABIC PLACE OF SAJDAH", 1769); - _unicodeCharacterMap.Add("ARABIC EMPTY CENTRE LOW STOP", 1770); - _unicodeCharacterMap.Add("ARABIC EMPTY CENTRE HIGH STOP", 1771); - _unicodeCharacterMap.Add("ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE", 1772); - _unicodeCharacterMap.Add("ARABIC SMALL LOW MEEM", 1773); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH INVERTED V", 1774); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH INVERTED V", 1775); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT ZERO", 1776); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT ONE", 1777); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT TWO", 1778); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT THREE", 1779); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT FOUR", 1780); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT FIVE", 1781); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT SIX", 1782); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT SEVEN", 1783); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT EIGHT", 1784); - _unicodeCharacterMap.Add("EXTENDED ARABIC INDIC DIGIT NINE", 1785); - _unicodeCharacterMap.Add("ARABIC LETTER SHEEN WITH DOT BELOW", 1786); - _unicodeCharacterMap.Add("ARABIC LETTER DAD WITH DOT BELOW", 1787); - _unicodeCharacterMap.Add("ARABIC LETTER GHAIN WITH DOT BELOW", 1788); - _unicodeCharacterMap.Add("ARABIC SIGN SINDHI AMPERSAND", 1789); - _unicodeCharacterMap.Add("ARABIC SIGN SINDHI POSTPOSITION MEN", 1790); - _unicodeCharacterMap.Add("ARABIC LETTER HEH WITH INVERTED V", 1791); - _unicodeCharacterMap.Add("SYRIAC END OF PARAGRAPH", 1792); - _unicodeCharacterMap.Add("SYRIAC SUPRALINEAR FULL STOP", 1793); - _unicodeCharacterMap.Add("SYRIAC SUBLINEAR FULL STOP", 1794); - _unicodeCharacterMap.Add("SYRIAC SUPRALINEAR COLON", 1795); - _unicodeCharacterMap.Add("SYRIAC SUBLINEAR COLON", 1796); - _unicodeCharacterMap.Add("SYRIAC HORIZONTAL COLON", 1797); - _unicodeCharacterMap.Add("SYRIAC COLON SKEWED LEFT", 1798); - _unicodeCharacterMap.Add("SYRIAC COLON SKEWED RIGHT", 1799); - _unicodeCharacterMap.Add("SYRIAC SUPRALINEAR COLON SKEWED LEFT", 1800); - _unicodeCharacterMap.Add("SYRIAC SUBLINEAR COLON SKEWED RIGHT", 1801); - _unicodeCharacterMap.Add("SYRIAC CONTRACTION", 1802); - _unicodeCharacterMap.Add("SYRIAC HARKLEAN OBELUS", 1803); - _unicodeCharacterMap.Add("SYRIAC HARKLEAN METOBELUS", 1804); - _unicodeCharacterMap.Add("SYRIAC HARKLEAN ASTERISCUS", 1805); - _unicodeCharacterMap.Add("SYRIAC ABBREVIATION MARK", 1807); - _unicodeCharacterMap.Add("SYRIAC LETTER ALAPH", 1808); - _unicodeCharacterMap.Add("SYRIAC LETTER SUPERSCRIPT ALAPH", 1809); - _unicodeCharacterMap.Add("SYRIAC LETTER BETH", 1810); - _unicodeCharacterMap.Add("SYRIAC LETTER GAMAL", 1811); - _unicodeCharacterMap.Add("SYRIAC LETTER GAMAL GARSHUNI", 1812); - _unicodeCharacterMap.Add("SYRIAC LETTER DALATH", 1813); - _unicodeCharacterMap.Add("SYRIAC LETTER DOTLESS DALATH RISH", 1814); - _unicodeCharacterMap.Add("SYRIAC LETTER HE", 1815); - _unicodeCharacterMap.Add("SYRIAC LETTER WAW", 1816); - _unicodeCharacterMap.Add("SYRIAC LETTER ZAIN", 1817); - _unicodeCharacterMap.Add("SYRIAC LETTER HETH", 1818); - _unicodeCharacterMap.Add("SYRIAC LETTER TETH", 1819); - _unicodeCharacterMap.Add("SYRIAC LETTER TETH GARSHUNI", 1820); - _unicodeCharacterMap.Add("SYRIAC LETTER YUDH", 1821); - _unicodeCharacterMap.Add("SYRIAC LETTER YUDH HE", 1822); - _unicodeCharacterMap.Add("SYRIAC LETTER KAPH", 1823); - _unicodeCharacterMap.Add("SYRIAC LETTER LAMADH", 1824); - _unicodeCharacterMap.Add("SYRIAC LETTER MIM", 1825); - _unicodeCharacterMap.Add("SYRIAC LETTER NUN", 1826); - _unicodeCharacterMap.Add("SYRIAC LETTER SEMKATH", 1827); - _unicodeCharacterMap.Add("SYRIAC LETTER FINAL SEMKATH", 1828); - _unicodeCharacterMap.Add("SYRIAC LETTER E", 1829); - _unicodeCharacterMap.Add("SYRIAC LETTER PE", 1830); - _unicodeCharacterMap.Add("SYRIAC LETTER REVERSED PE", 1831); - _unicodeCharacterMap.Add("SYRIAC LETTER SADHE", 1832); - _unicodeCharacterMap.Add("SYRIAC LETTER QAPH", 1833); - _unicodeCharacterMap.Add("SYRIAC LETTER RISH", 1834); - _unicodeCharacterMap.Add("SYRIAC LETTER SHIN", 1835); - _unicodeCharacterMap.Add("SYRIAC LETTER TAW", 1836); - _unicodeCharacterMap.Add("SYRIAC LETTER PERSIAN BHETH", 1837); - _unicodeCharacterMap.Add("SYRIAC LETTER PERSIAN GHAMAL", 1838); - _unicodeCharacterMap.Add("SYRIAC LETTER PERSIAN DHALATH", 1839); - _unicodeCharacterMap.Add("SYRIAC PTHAHA ABOVE", 1840); - _unicodeCharacterMap.Add("SYRIAC PTHAHA BELOW", 1841); - _unicodeCharacterMap.Add("SYRIAC PTHAHA DOTTED", 1842); - _unicodeCharacterMap.Add("SYRIAC ZQAPHA ABOVE", 1843); - _unicodeCharacterMap.Add("SYRIAC ZQAPHA BELOW", 1844); - _unicodeCharacterMap.Add("SYRIAC ZQAPHA DOTTED", 1845); - _unicodeCharacterMap.Add("SYRIAC RBASA ABOVE", 1846); - _unicodeCharacterMap.Add("SYRIAC RBASA BELOW", 1847); - _unicodeCharacterMap.Add("SYRIAC DOTTED ZLAMA HORIZONTAL", 1848); - _unicodeCharacterMap.Add("SYRIAC DOTTED ZLAMA ANGULAR", 1849); - _unicodeCharacterMap.Add("SYRIAC HBASA ABOVE", 1850); - _unicodeCharacterMap.Add("SYRIAC HBASA BELOW", 1851); - _unicodeCharacterMap.Add("SYRIAC HBASA ESASA DOTTED", 1852); - _unicodeCharacterMap.Add("SYRIAC ESASA ABOVE", 1853); - _unicodeCharacterMap.Add("SYRIAC ESASA BELOW", 1854); - _unicodeCharacterMap.Add("SYRIAC RWAHA", 1855); - _unicodeCharacterMap.Add("SYRIAC FEMININE DOT", 1856); - _unicodeCharacterMap.Add("SYRIAC QUSHSHAYA", 1857); - _unicodeCharacterMap.Add("SYRIAC RUKKAKHA", 1858); - _unicodeCharacterMap.Add("SYRIAC TWO VERTICAL DOTS ABOVE", 1859); - _unicodeCharacterMap.Add("SYRIAC TWO VERTICAL DOTS BELOW", 1860); - _unicodeCharacterMap.Add("SYRIAC THREE DOTS ABOVE", 1861); - _unicodeCharacterMap.Add("SYRIAC THREE DOTS BELOW", 1862); - _unicodeCharacterMap.Add("SYRIAC OBLIQUE LINE ABOVE", 1863); - _unicodeCharacterMap.Add("SYRIAC OBLIQUE LINE BELOW", 1864); - _unicodeCharacterMap.Add("SYRIAC MUSIC", 1865); - _unicodeCharacterMap.Add("SYRIAC BARREKH", 1866); - _unicodeCharacterMap.Add("SYRIAC LETTER SOGDIAN ZHAIN", 1869); - _unicodeCharacterMap.Add("SYRIAC LETTER SOGDIAN KHAPH", 1870); - _unicodeCharacterMap.Add("SYRIAC LETTER SOGDIAN FE", 1871); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW", 1872); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE", 1873); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW", 1874); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE", 1875); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE", 1876); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH INVERTED SMALL V BELOW", 1877); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH SMALL V", 1878); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH TWO DOTS ABOVE", 1879); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW", 1880); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH", 1881); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH INVERTED SMALL V BELOW", 1882); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH STROKE", 1883); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH FOUR DOTS ABOVE", 1884); - _unicodeCharacterMap.Add("ARABIC LETTER AIN WITH TWO DOTS ABOVE", 1885); - _unicodeCharacterMap.Add("ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE", 1886); - _unicodeCharacterMap.Add("ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE", 1887); - _unicodeCharacterMap.Add("ARABIC LETTER FEH WITH TWO DOTS BELOW", 1888); - _unicodeCharacterMap.Add("ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW", 1889); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH WITH DOT ABOVE", 1890); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH WITH THREE DOTS ABOVE", 1891); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW", 1892); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM WITH DOT ABOVE", 1893); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM WITH DOT BELOW", 1894); - _unicodeCharacterMap.Add("ARABIC LETTER NOON WITH TWO DOTS BELOW", 1895); - _unicodeCharacterMap.Add("ARABIC LETTER NOON WITH SMALL TAH", 1896); - _unicodeCharacterMap.Add("ARABIC LETTER NOON WITH SMALL V", 1897); - _unicodeCharacterMap.Add("ARABIC LETTER LAM WITH BAR", 1898); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE", 1899); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH HAMZA ABOVE", 1900); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE", 1901); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW", 1902); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS", 1903); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS", 1904); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS", 1905); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE", 1906); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE", 1907); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE", 1908); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE", 1909); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE", 1910); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC INDIC DIGIT FOUR BELOW", 1911); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE", 1912); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE", 1913); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE", 1914); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE", 1915); - _unicodeCharacterMap.Add("ARABIC LETTER HAH WITH EXTENDED ARABIC INDIC DIGIT FOUR BELOW", 1916); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH EXTENDED ARABIC INDIC DIGIT FOUR ABOVE", 1917); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN WITH INVERTED V", 1918); - _unicodeCharacterMap.Add("ARABIC LETTER KAF WITH TWO DOTS ABOVE", 1919); - _unicodeCharacterMap.Add("THAANA LETTER HAA", 1920); - _unicodeCharacterMap.Add("THAANA LETTER SHAVIYANI", 1921); - _unicodeCharacterMap.Add("THAANA LETTER NOONU", 1922); - _unicodeCharacterMap.Add("THAANA LETTER RAA", 1923); - _unicodeCharacterMap.Add("THAANA LETTER BAA", 1924); - _unicodeCharacterMap.Add("THAANA LETTER LHAVIYANI", 1925); - _unicodeCharacterMap.Add("THAANA LETTER KAAFU", 1926); - _unicodeCharacterMap.Add("THAANA LETTER ALIFU", 1927); - _unicodeCharacterMap.Add("THAANA LETTER VAAVU", 1928); - _unicodeCharacterMap.Add("THAANA LETTER MEEMU", 1929); - _unicodeCharacterMap.Add("THAANA LETTER FAAFU", 1930); - _unicodeCharacterMap.Add("THAANA LETTER DHAALU", 1931); - _unicodeCharacterMap.Add("THAANA LETTER THAA", 1932); - _unicodeCharacterMap.Add("THAANA LETTER LAAMU", 1933); - _unicodeCharacterMap.Add("THAANA LETTER GAAFU", 1934); - _unicodeCharacterMap.Add("THAANA LETTER GNAVIYANI", 1935); - _unicodeCharacterMap.Add("THAANA LETTER SEENU", 1936); - _unicodeCharacterMap.Add("THAANA LETTER DAVIYANI", 1937); - _unicodeCharacterMap.Add("THAANA LETTER ZAVIYANI", 1938); - _unicodeCharacterMap.Add("THAANA LETTER TAVIYANI", 1939); - _unicodeCharacterMap.Add("THAANA LETTER YAA", 1940); - _unicodeCharacterMap.Add("THAANA LETTER PAVIYANI", 1941); - _unicodeCharacterMap.Add("THAANA LETTER JAVIYANI", 1942); - _unicodeCharacterMap.Add("THAANA LETTER CHAVIYANI", 1943); - _unicodeCharacterMap.Add("THAANA LETTER TTAA", 1944); - _unicodeCharacterMap.Add("THAANA LETTER HHAA", 1945); - _unicodeCharacterMap.Add("THAANA LETTER KHAA", 1946); - _unicodeCharacterMap.Add("THAANA LETTER THAALU", 1947); - _unicodeCharacterMap.Add("THAANA LETTER ZAA", 1948); - _unicodeCharacterMap.Add("THAANA LETTER SHEENU", 1949); - _unicodeCharacterMap.Add("THAANA LETTER SAADHU", 1950); - _unicodeCharacterMap.Add("THAANA LETTER DAADHU", 1951); - _unicodeCharacterMap.Add("THAANA LETTER TO", 1952); - _unicodeCharacterMap.Add("THAANA LETTER ZO", 1953); - _unicodeCharacterMap.Add("THAANA LETTER AINU", 1954); - _unicodeCharacterMap.Add("THAANA LETTER GHAINU", 1955); - _unicodeCharacterMap.Add("THAANA LETTER QAAFU", 1956); - _unicodeCharacterMap.Add("THAANA LETTER WAAVU", 1957); - _unicodeCharacterMap.Add("THAANA ABAFILI", 1958); - _unicodeCharacterMap.Add("THAANA AABAAFILI", 1959); - _unicodeCharacterMap.Add("THAANA IBIFILI", 1960); - _unicodeCharacterMap.Add("THAANA EEBEEFILI", 1961); - _unicodeCharacterMap.Add("THAANA UBUFILI", 1962); - _unicodeCharacterMap.Add("THAANA OOBOOFILI", 1963); - _unicodeCharacterMap.Add("THAANA EBEFILI", 1964); - _unicodeCharacterMap.Add("THAANA EYBEYFILI", 1965); - _unicodeCharacterMap.Add("THAANA OBOFILI", 1966); - _unicodeCharacterMap.Add("THAANA OABOAFILI", 1967); - _unicodeCharacterMap.Add("THAANA SUKUN", 1968); - _unicodeCharacterMap.Add("THAANA LETTER NAA", 1969); - _unicodeCharacterMap.Add("NKO DIGIT ZERO", 1984); - _unicodeCharacterMap.Add("NKO DIGIT ONE", 1985); - _unicodeCharacterMap.Add("NKO DIGIT TWO", 1986); - _unicodeCharacterMap.Add("NKO DIGIT THREE", 1987); - _unicodeCharacterMap.Add("NKO DIGIT FOUR", 1988); - _unicodeCharacterMap.Add("NKO DIGIT FIVE", 1989); - _unicodeCharacterMap.Add("NKO DIGIT SIX", 1990); - _unicodeCharacterMap.Add("NKO DIGIT SEVEN", 1991); - _unicodeCharacterMap.Add("NKO DIGIT EIGHT", 1992); - _unicodeCharacterMap.Add("NKO DIGIT NINE", 1993); - _unicodeCharacterMap.Add("NKO LETTER A", 1994); - _unicodeCharacterMap.Add("NKO LETTER EE", 1995); - _unicodeCharacterMap.Add("NKO LETTER I", 1996); - _unicodeCharacterMap.Add("NKO LETTER E", 1997); - _unicodeCharacterMap.Add("NKO LETTER U", 1998); - _unicodeCharacterMap.Add("NKO LETTER OO", 1999); - _unicodeCharacterMap.Add("NKO LETTER O", 2000); - _unicodeCharacterMap.Add("NKO LETTER DAGBASINNA", 2001); - _unicodeCharacterMap.Add("NKO LETTER N", 2002); - _unicodeCharacterMap.Add("NKO LETTER BA", 2003); - _unicodeCharacterMap.Add("NKO LETTER PA", 2004); - _unicodeCharacterMap.Add("NKO LETTER TA", 2005); - _unicodeCharacterMap.Add("NKO LETTER JA", 2006); - _unicodeCharacterMap.Add("NKO LETTER CHA", 2007); - _unicodeCharacterMap.Add("NKO LETTER DA", 2008); - _unicodeCharacterMap.Add("NKO LETTER RA", 2009); - _unicodeCharacterMap.Add("NKO LETTER RRA", 2010); - _unicodeCharacterMap.Add("NKO LETTER SA", 2011); - _unicodeCharacterMap.Add("NKO LETTER GBA", 2012); - _unicodeCharacterMap.Add("NKO LETTER FA", 2013); - _unicodeCharacterMap.Add("NKO LETTER KA", 2014); - _unicodeCharacterMap.Add("NKO LETTER LA", 2015); - _unicodeCharacterMap.Add("NKO LETTER NA WOLOSO", 2016); - _unicodeCharacterMap.Add("NKO LETTER MA", 2017); - _unicodeCharacterMap.Add("NKO LETTER NYA", 2018); - _unicodeCharacterMap.Add("NKO LETTER NA", 2019); - _unicodeCharacterMap.Add("NKO LETTER HA", 2020); - _unicodeCharacterMap.Add("NKO LETTER WA", 2021); - _unicodeCharacterMap.Add("NKO LETTER YA", 2022); - _unicodeCharacterMap.Add("NKO LETTER NYA WOLOSO", 2023); - _unicodeCharacterMap.Add("NKO LETTER JONA JA", 2024); - _unicodeCharacterMap.Add("NKO LETTER JONA CHA", 2025); - _unicodeCharacterMap.Add("NKO LETTER JONA RA", 2026); - _unicodeCharacterMap.Add("NKO COMBINING SHORT HIGH TONE", 2027); - _unicodeCharacterMap.Add("NKO COMBINING SHORT LOW TONE", 2028); - _unicodeCharacterMap.Add("NKO COMBINING SHORT RISING TONE", 2029); - _unicodeCharacterMap.Add("NKO COMBINING LONG DESCENDING TONE", 2030); - _unicodeCharacterMap.Add("NKO COMBINING LONG HIGH TONE", 2031); - _unicodeCharacterMap.Add("NKO COMBINING LONG LOW TONE", 2032); - _unicodeCharacterMap.Add("NKO COMBINING LONG RISING TONE", 2033); - _unicodeCharacterMap.Add("NKO COMBINING NASALIZATION MARK", 2034); - _unicodeCharacterMap.Add("NKO COMBINING DOUBLE DOT ABOVE", 2035); - _unicodeCharacterMap.Add("NKO HIGH TONE APOSTROPHE", 2036); - _unicodeCharacterMap.Add("NKO LOW TONE APOSTROPHE", 2037); - _unicodeCharacterMap.Add("NKO SYMBOL OO DENNEN", 2038); - _unicodeCharacterMap.Add("NKO SYMBOL GBAKURUNEN", 2039); - _unicodeCharacterMap.Add("NKO COMMA", 2040); - _unicodeCharacterMap.Add("NKO EXCLAMATION MARK", 2041); - _unicodeCharacterMap.Add("NKO LAJANYALAN", 2042); - _unicodeCharacterMap.Add("SAMARITAN LETTER ALAF", 2048); - _unicodeCharacterMap.Add("SAMARITAN LETTER BIT", 2049); - _unicodeCharacterMap.Add("SAMARITAN LETTER GAMAN", 2050); - _unicodeCharacterMap.Add("SAMARITAN LETTER DALAT", 2051); - _unicodeCharacterMap.Add("SAMARITAN LETTER IY", 2052); - _unicodeCharacterMap.Add("SAMARITAN LETTER BAA", 2053); - _unicodeCharacterMap.Add("SAMARITAN LETTER ZEN", 2054); - _unicodeCharacterMap.Add("SAMARITAN LETTER IT", 2055); - _unicodeCharacterMap.Add("SAMARITAN LETTER TIT", 2056); - _unicodeCharacterMap.Add("SAMARITAN LETTER YUT", 2057); - _unicodeCharacterMap.Add("SAMARITAN LETTER KAAF", 2058); - _unicodeCharacterMap.Add("SAMARITAN LETTER LABAT", 2059); - _unicodeCharacterMap.Add("SAMARITAN LETTER MIM", 2060); - _unicodeCharacterMap.Add("SAMARITAN LETTER NUN", 2061); - _unicodeCharacterMap.Add("SAMARITAN LETTER SINGAAT", 2062); - _unicodeCharacterMap.Add("SAMARITAN LETTER IN", 2063); - _unicodeCharacterMap.Add("SAMARITAN LETTER FI", 2064); - _unicodeCharacterMap.Add("SAMARITAN LETTER TSAADIY", 2065); - _unicodeCharacterMap.Add("SAMARITAN LETTER QUF", 2066); - _unicodeCharacterMap.Add("SAMARITAN LETTER RISH", 2067); - _unicodeCharacterMap.Add("SAMARITAN LETTER SHAN", 2068); - _unicodeCharacterMap.Add("SAMARITAN LETTER TAAF", 2069); - _unicodeCharacterMap.Add("SAMARITAN MARK IN", 2070); - _unicodeCharacterMap.Add("SAMARITAN MARK IN ALAF", 2071); - _unicodeCharacterMap.Add("SAMARITAN MARK OCCLUSION", 2072); - _unicodeCharacterMap.Add("SAMARITAN MARK DAGESH", 2073); - _unicodeCharacterMap.Add("SAMARITAN MODIFIER LETTER EPENTHETIC YUT", 2074); - _unicodeCharacterMap.Add("SAMARITAN MARK EPENTHETIC YUT", 2075); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN LONG E", 2076); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN E", 2077); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN OVERLONG AA", 2078); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN LONG AA", 2079); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN AA", 2080); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN OVERLONG A", 2081); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN LONG A", 2082); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN A", 2083); - _unicodeCharacterMap.Add("SAMARITAN MODIFIER LETTER SHORT A", 2084); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN SHORT A", 2085); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN LONG U", 2086); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN U", 2087); - _unicodeCharacterMap.Add("SAMARITAN MODIFIER LETTER I", 2088); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN LONG I", 2089); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN I", 2090); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN O", 2091); - _unicodeCharacterMap.Add("SAMARITAN VOWEL SIGN SUKUN", 2092); - _unicodeCharacterMap.Add("SAMARITAN MARK NEQUDAA", 2093); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION NEQUDAA", 2096); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION AFSAAQ", 2097); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION ANGED", 2098); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION BAU", 2099); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION ATMAAU", 2100); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION SHIYYAALAA", 2101); - _unicodeCharacterMap.Add("SAMARITAN ABBREVIATION MARK", 2102); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION MELODIC QITSA", 2103); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION ZIQAA", 2104); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION QITSA", 2105); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION ZAEF", 2106); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION TURU", 2107); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION ARKAANU", 2108); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION SOF MASHFAAT", 2109); - _unicodeCharacterMap.Add("SAMARITAN PUNCTUATION ANNAAU", 2110); - _unicodeCharacterMap.Add("MANDAIC LETTER HALQA", 2112); - _unicodeCharacterMap.Add("MANDAIC LETTER AB", 2113); - _unicodeCharacterMap.Add("MANDAIC LETTER AG", 2114); - _unicodeCharacterMap.Add("MANDAIC LETTER AD", 2115); - _unicodeCharacterMap.Add("MANDAIC LETTER AH", 2116); - _unicodeCharacterMap.Add("MANDAIC LETTER USHENNA", 2117); - _unicodeCharacterMap.Add("MANDAIC LETTER AZ", 2118); - _unicodeCharacterMap.Add("MANDAIC LETTER IT", 2119); - _unicodeCharacterMap.Add("MANDAIC LETTER ATT", 2120); - _unicodeCharacterMap.Add("MANDAIC LETTER AKSA", 2121); - _unicodeCharacterMap.Add("MANDAIC LETTER AK", 2122); - _unicodeCharacterMap.Add("MANDAIC LETTER AL", 2123); - _unicodeCharacterMap.Add("MANDAIC LETTER AM", 2124); - _unicodeCharacterMap.Add("MANDAIC LETTER AN", 2125); - _unicodeCharacterMap.Add("MANDAIC LETTER AS", 2126); - _unicodeCharacterMap.Add("MANDAIC LETTER IN", 2127); - _unicodeCharacterMap.Add("MANDAIC LETTER AP", 2128); - _unicodeCharacterMap.Add("MANDAIC LETTER ASZ", 2129); - _unicodeCharacterMap.Add("MANDAIC LETTER AQ", 2130); - _unicodeCharacterMap.Add("MANDAIC LETTER AR", 2131); - _unicodeCharacterMap.Add("MANDAIC LETTER ASH", 2132); - _unicodeCharacterMap.Add("MANDAIC LETTER AT", 2133); - _unicodeCharacterMap.Add("MANDAIC LETTER DUSHENNA", 2134); - _unicodeCharacterMap.Add("MANDAIC LETTER KAD", 2135); - _unicodeCharacterMap.Add("MANDAIC LETTER AIN", 2136); - _unicodeCharacterMap.Add("MANDAIC AFFRICATION MARK", 2137); - _unicodeCharacterMap.Add("MANDAIC VOCALIZATION MARK", 2138); - _unicodeCharacterMap.Add("MANDAIC GEMINATION MARK", 2139); - _unicodeCharacterMap.Add("MANDAIC PUNCTUATION", 2142); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH SMALL V BELOW", 2208); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH HAMZA ABOVE", 2209); - _unicodeCharacterMap.Add("ARABIC LETTER JEEM WITH TWO DOTS ABOVE", 2210); - _unicodeCharacterMap.Add("ARABIC LETTER TAH WITH TWO DOTS ABOVE", 2211); - _unicodeCharacterMap.Add("ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE", 2212); - _unicodeCharacterMap.Add("ARABIC LETTER QAF WITH DOT BELOW", 2213); - _unicodeCharacterMap.Add("ARABIC LETTER LAM WITH DOUBLE BAR", 2214); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM WITH THREE DOTS ABOVE", 2215); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE", 2216); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE", 2217); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH LOOP", 2218); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH DOT WITHIN", 2219); - _unicodeCharacterMap.Add("ARABIC LETTER ROHINGYA YEH", 2220); - _unicodeCharacterMap.Add("ARABIC LETTER LOW ALEF", 2221); - _unicodeCharacterMap.Add("ARABIC LETTER DAL WITH THREE DOTS BELOW", 2222); - _unicodeCharacterMap.Add("ARABIC LETTER SAD WITH THREE DOTS BELOW", 2223); - _unicodeCharacterMap.Add("ARABIC LETTER GAF WITH INVERTED STROKE", 2224); - _unicodeCharacterMap.Add("ARABIC LETTER STRAIGHT WAW", 2225); - _unicodeCharacterMap.Add("ARABIC LETTER ZAIN WITH INVERTED V ABOVE", 2226); - _unicodeCharacterMap.Add("ARABIC LETTER AIN WITH THREE DOTS BELOW", 2227); - _unicodeCharacterMap.Add("ARABIC LETTER KAF WITH DOT BELOW", 2228); - _unicodeCharacterMap.Add("ARABIC LETTER BEH WITH SMALL MEEM ABOVE", 2230); - _unicodeCharacterMap.Add("ARABIC LETTER PEH WITH SMALL MEEM ABOVE", 2231); - _unicodeCharacterMap.Add("ARABIC LETTER TEH WITH SMALL TEH ABOVE", 2232); - _unicodeCharacterMap.Add("ARABIC LETTER REH WITH SMALL NOON ABOVE", 2233); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE", 2234); - _unicodeCharacterMap.Add("ARABIC LETTER AFRICAN FEH", 2235); - _unicodeCharacterMap.Add("ARABIC LETTER AFRICAN QAF", 2236); - _unicodeCharacterMap.Add("ARABIC LETTER AFRICAN NOON", 2237); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WORD AR RUB", 2260); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH SAD", 2261); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH AIN", 2262); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH QAF", 2263); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH NOON WITH KASRA", 2264); - _unicodeCharacterMap.Add("ARABIC SMALL LOW NOON WITH KASRA", 2265); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WORD ATH THALATHA", 2266); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WORD AS SAJDA", 2267); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WORD AN NISF", 2268); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WORD SAKTA", 2269); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WORD QIF", 2270); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WORD WAQFA", 2271); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH FOOTNOTE MARKER", 2272); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH SIGN SAFHA", 2273); - _unicodeCharacterMap.Add("ARABIC DISPUTED END OF AYAH", 2274); - _unicodeCharacterMap.Add("ARABIC TURNED DAMMA BELOW", 2275); - _unicodeCharacterMap.Add("ARABIC CURLY FATHA", 2276); - _unicodeCharacterMap.Add("ARABIC CURLY DAMMA", 2277); - _unicodeCharacterMap.Add("ARABIC CURLY KASRA", 2278); - _unicodeCharacterMap.Add("ARABIC CURLY FATHATAN", 2279); - _unicodeCharacterMap.Add("ARABIC CURLY DAMMATAN", 2280); - _unicodeCharacterMap.Add("ARABIC CURLY KASRATAN", 2281); - _unicodeCharacterMap.Add("ARABIC TONE ONE DOT ABOVE", 2282); - _unicodeCharacterMap.Add("ARABIC TONE TWO DOTS ABOVE", 2283); - _unicodeCharacterMap.Add("ARABIC TONE LOOP ABOVE", 2284); - _unicodeCharacterMap.Add("ARABIC TONE ONE DOT BELOW", 2285); - _unicodeCharacterMap.Add("ARABIC TONE TWO DOTS BELOW", 2286); - _unicodeCharacterMap.Add("ARABIC TONE LOOP BELOW", 2287); - _unicodeCharacterMap.Add("ARABIC OPEN FATHATAN", 2288); - _unicodeCharacterMap.Add("ARABIC OPEN DAMMATAN", 2289); - _unicodeCharacterMap.Add("ARABIC OPEN KASRATAN", 2290); - _unicodeCharacterMap.Add("ARABIC SMALL HIGH WAW", 2291); - _unicodeCharacterMap.Add("ARABIC FATHA WITH RING", 2292); - _unicodeCharacterMap.Add("ARABIC FATHA WITH DOT ABOVE", 2293); - _unicodeCharacterMap.Add("ARABIC KASRA WITH DOT BELOW", 2294); - _unicodeCharacterMap.Add("ARABIC LEFT ARROWHEAD ABOVE", 2295); - _unicodeCharacterMap.Add("ARABIC RIGHT ARROWHEAD ABOVE", 2296); - _unicodeCharacterMap.Add("ARABIC LEFT ARROWHEAD BELOW", 2297); - _unicodeCharacterMap.Add("ARABIC RIGHT ARROWHEAD BELOW", 2298); - _unicodeCharacterMap.Add("ARABIC DOUBLE RIGHT ARROWHEAD ABOVE", 2299); - _unicodeCharacterMap.Add("ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT", 2300); - _unicodeCharacterMap.Add("ARABIC RIGHT ARROWHEAD ABOVE WITH DOT", 2301); - _unicodeCharacterMap.Add("ARABIC DAMMA WITH DOT", 2302); - _unicodeCharacterMap.Add("ARABIC MARK SIDEWAYS NOON GHUNNA", 2303); - _unicodeCharacterMap.Add("DEVANAGARI SIGN INVERTED CANDRABINDU", 2304); - _unicodeCharacterMap.Add("DEVANAGARI SIGN CANDRABINDU", 2305); - _unicodeCharacterMap.Add("DEVANAGARI SIGN ANUSVARA", 2306); - _unicodeCharacterMap.Add("DEVANAGARI SIGN VISARGA", 2307); - _unicodeCharacterMap.Add("DEVANAGARI LETTER SHORT A", 2308); - _unicodeCharacterMap.Add("DEVANAGARI LETTER A", 2309); - _unicodeCharacterMap.Add("DEVANAGARI LETTER AA", 2310); - _unicodeCharacterMap.Add("DEVANAGARI LETTER I", 2311); - _unicodeCharacterMap.Add("DEVANAGARI LETTER II", 2312); - _unicodeCharacterMap.Add("DEVANAGARI LETTER U", 2313); - _unicodeCharacterMap.Add("DEVANAGARI LETTER UU", 2314); - _unicodeCharacterMap.Add("DEVANAGARI LETTER VOCALIC R", 2315); - _unicodeCharacterMap.Add("DEVANAGARI LETTER VOCALIC L", 2316); - _unicodeCharacterMap.Add("DEVANAGARI LETTER CANDRA E", 2317); - _unicodeCharacterMap.Add("DEVANAGARI LETTER SHORT E", 2318); - _unicodeCharacterMap.Add("DEVANAGARI LETTER E", 2319); - _unicodeCharacterMap.Add("DEVANAGARI LETTER AI", 2320); - _unicodeCharacterMap.Add("DEVANAGARI LETTER CANDRA O", 2321); - _unicodeCharacterMap.Add("DEVANAGARI LETTER SHORT O", 2322); - _unicodeCharacterMap.Add("DEVANAGARI LETTER O", 2323); - _unicodeCharacterMap.Add("DEVANAGARI LETTER AU", 2324); - _unicodeCharacterMap.Add("DEVANAGARI LETTER KA", 2325); - _unicodeCharacterMap.Add("DEVANAGARI LETTER KHA", 2326); - _unicodeCharacterMap.Add("DEVANAGARI LETTER GA", 2327); - _unicodeCharacterMap.Add("DEVANAGARI LETTER GHA", 2328); - _unicodeCharacterMap.Add("DEVANAGARI LETTER NGA", 2329); - _unicodeCharacterMap.Add("DEVANAGARI LETTER CA", 2330); - _unicodeCharacterMap.Add("DEVANAGARI LETTER CHA", 2331); - _unicodeCharacterMap.Add("DEVANAGARI LETTER JA", 2332); - _unicodeCharacterMap.Add("DEVANAGARI LETTER JHA", 2333); - _unicodeCharacterMap.Add("DEVANAGARI LETTER NYA", 2334); - _unicodeCharacterMap.Add("DEVANAGARI LETTER TTA", 2335); - _unicodeCharacterMap.Add("DEVANAGARI LETTER TTHA", 2336); - _unicodeCharacterMap.Add("DEVANAGARI LETTER DDA", 2337); - _unicodeCharacterMap.Add("DEVANAGARI LETTER DDHA", 2338); - _unicodeCharacterMap.Add("DEVANAGARI LETTER NNA", 2339); - _unicodeCharacterMap.Add("DEVANAGARI LETTER TA", 2340); - _unicodeCharacterMap.Add("DEVANAGARI LETTER THA", 2341); - _unicodeCharacterMap.Add("DEVANAGARI LETTER DA", 2342); - _unicodeCharacterMap.Add("DEVANAGARI LETTER DHA", 2343); - _unicodeCharacterMap.Add("DEVANAGARI LETTER NA", 2344); - _unicodeCharacterMap.Add("DEVANAGARI LETTER NNNA", 2345); - _unicodeCharacterMap.Add("DEVANAGARI LETTER PA", 2346); - _unicodeCharacterMap.Add("DEVANAGARI LETTER PHA", 2347); - _unicodeCharacterMap.Add("DEVANAGARI LETTER BA", 2348); - _unicodeCharacterMap.Add("DEVANAGARI LETTER BHA", 2349); - _unicodeCharacterMap.Add("DEVANAGARI LETTER MA", 2350); - _unicodeCharacterMap.Add("DEVANAGARI LETTER YA", 2351); - _unicodeCharacterMap.Add("DEVANAGARI LETTER RA", 2352); - _unicodeCharacterMap.Add("DEVANAGARI LETTER RRA", 2353); - _unicodeCharacterMap.Add("DEVANAGARI LETTER LA", 2354); - _unicodeCharacterMap.Add("DEVANAGARI LETTER LLA", 2355); - _unicodeCharacterMap.Add("DEVANAGARI LETTER LLLA", 2356); - _unicodeCharacterMap.Add("DEVANAGARI LETTER VA", 2357); - _unicodeCharacterMap.Add("DEVANAGARI LETTER SHA", 2358); - _unicodeCharacterMap.Add("DEVANAGARI LETTER SSA", 2359); - _unicodeCharacterMap.Add("DEVANAGARI LETTER SA", 2360); - _unicodeCharacterMap.Add("DEVANAGARI LETTER HA", 2361); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN OE", 2362); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN OOE", 2363); - _unicodeCharacterMap.Add("DEVANAGARI SIGN NUKTA", 2364); - _unicodeCharacterMap.Add("DEVANAGARI SIGN AVAGRAHA", 2365); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN AA", 2366); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN I", 2367); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN II", 2368); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN U", 2369); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN UU", 2370); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN VOCALIC R", 2371); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN VOCALIC RR", 2372); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN CANDRA E", 2373); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN SHORT E", 2374); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN E", 2375); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN AI", 2376); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN CANDRA O", 2377); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN SHORT O", 2378); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN O", 2379); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN AU", 2380); - _unicodeCharacterMap.Add("DEVANAGARI SIGN VIRAMA", 2381); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN PRISHTHAMATRA E", 2382); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN AW", 2383); - _unicodeCharacterMap.Add("DEVANAGARI OM", 2384); - _unicodeCharacterMap.Add("DEVANAGARI STRESS SIGN UDATTA", 2385); - _unicodeCharacterMap.Add("DEVANAGARI STRESS SIGN ANUDATTA", 2386); - _unicodeCharacterMap.Add("DEVANAGARI GRAVE ACCENT", 2387); - _unicodeCharacterMap.Add("DEVANAGARI ACUTE ACCENT", 2388); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN CANDRA LONG E", 2389); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN UE", 2390); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN UUE", 2391); - _unicodeCharacterMap.Add("DEVANAGARI LETTER QA", 2392); - _unicodeCharacterMap.Add("DEVANAGARI LETTER KHHA", 2393); - _unicodeCharacterMap.Add("DEVANAGARI LETTER GHHA", 2394); - _unicodeCharacterMap.Add("DEVANAGARI LETTER ZA", 2395); - _unicodeCharacterMap.Add("DEVANAGARI LETTER DDDHA", 2396); - _unicodeCharacterMap.Add("DEVANAGARI LETTER RHA", 2397); - _unicodeCharacterMap.Add("DEVANAGARI LETTER FA", 2398); - _unicodeCharacterMap.Add("DEVANAGARI LETTER YYA", 2399); - _unicodeCharacterMap.Add("DEVANAGARI LETTER VOCALIC RR", 2400); - _unicodeCharacterMap.Add("DEVANAGARI LETTER VOCALIC LL", 2401); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN VOCALIC L", 2402); - _unicodeCharacterMap.Add("DEVANAGARI VOWEL SIGN VOCALIC LL", 2403); - _unicodeCharacterMap.Add("DEVANAGARI DANDA", 2404); - _unicodeCharacterMap.Add("DEVANAGARI DOUBLE DANDA", 2405); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT ZERO", 2406); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT ONE", 2407); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT TWO", 2408); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT THREE", 2409); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT FOUR", 2410); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT FIVE", 2411); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT SIX", 2412); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT SEVEN", 2413); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT EIGHT", 2414); - _unicodeCharacterMap.Add("DEVANAGARI DIGIT NINE", 2415); - _unicodeCharacterMap.Add("DEVANAGARI ABBREVIATION SIGN", 2416); - _unicodeCharacterMap.Add("DEVANAGARI SIGN HIGH SPACING DOT", 2417); - _unicodeCharacterMap.Add("DEVANAGARI LETTER CANDRA A", 2418); - _unicodeCharacterMap.Add("DEVANAGARI LETTER OE", 2419); - _unicodeCharacterMap.Add("DEVANAGARI LETTER OOE", 2420); - _unicodeCharacterMap.Add("DEVANAGARI LETTER AW", 2421); - _unicodeCharacterMap.Add("DEVANAGARI LETTER UE", 2422); - _unicodeCharacterMap.Add("DEVANAGARI LETTER UUE", 2423); - _unicodeCharacterMap.Add("DEVANAGARI LETTER MARWARI DDA", 2424); - _unicodeCharacterMap.Add("DEVANAGARI LETTER ZHA", 2425); - _unicodeCharacterMap.Add("DEVANAGARI LETTER HEAVY YA", 2426); - _unicodeCharacterMap.Add("DEVANAGARI LETTER GGA", 2427); - _unicodeCharacterMap.Add("DEVANAGARI LETTER JJA", 2428); - _unicodeCharacterMap.Add("DEVANAGARI LETTER GLOTTAL STOP", 2429); - _unicodeCharacterMap.Add("DEVANAGARI LETTER DDDA", 2430); - _unicodeCharacterMap.Add("DEVANAGARI LETTER BBA", 2431); - _unicodeCharacterMap.Add("BENGALI ANJI", 2432); - _unicodeCharacterMap.Add("BENGALI SIGN CANDRABINDU", 2433); - _unicodeCharacterMap.Add("BENGALI SIGN ANUSVARA", 2434); - _unicodeCharacterMap.Add("BENGALI SIGN VISARGA", 2435); - _unicodeCharacterMap.Add("BENGALI LETTER A", 2437); - _unicodeCharacterMap.Add("BENGALI LETTER AA", 2438); - _unicodeCharacterMap.Add("BENGALI LETTER I", 2439); - _unicodeCharacterMap.Add("BENGALI LETTER II", 2440); - _unicodeCharacterMap.Add("BENGALI LETTER U", 2441); - _unicodeCharacterMap.Add("BENGALI LETTER UU", 2442); - _unicodeCharacterMap.Add("BENGALI LETTER VOCALIC R", 2443); - _unicodeCharacterMap.Add("BENGALI LETTER VOCALIC L", 2444); - _unicodeCharacterMap.Add("BENGALI LETTER E", 2447); - _unicodeCharacterMap.Add("BENGALI LETTER AI", 2448); - _unicodeCharacterMap.Add("BENGALI LETTER O", 2451); - _unicodeCharacterMap.Add("BENGALI LETTER AU", 2452); - _unicodeCharacterMap.Add("BENGALI LETTER KA", 2453); - _unicodeCharacterMap.Add("BENGALI LETTER KHA", 2454); - _unicodeCharacterMap.Add("BENGALI LETTER GA", 2455); - _unicodeCharacterMap.Add("BENGALI LETTER GHA", 2456); - _unicodeCharacterMap.Add("BENGALI LETTER NGA", 2457); - _unicodeCharacterMap.Add("BENGALI LETTER CA", 2458); - _unicodeCharacterMap.Add("BENGALI LETTER CHA", 2459); - _unicodeCharacterMap.Add("BENGALI LETTER JA", 2460); - _unicodeCharacterMap.Add("BENGALI LETTER JHA", 2461); - _unicodeCharacterMap.Add("BENGALI LETTER NYA", 2462); - _unicodeCharacterMap.Add("BENGALI LETTER TTA", 2463); - _unicodeCharacterMap.Add("BENGALI LETTER TTHA", 2464); - _unicodeCharacterMap.Add("BENGALI LETTER DDA", 2465); - _unicodeCharacterMap.Add("BENGALI LETTER DDHA", 2466); - _unicodeCharacterMap.Add("BENGALI LETTER NNA", 2467); - _unicodeCharacterMap.Add("BENGALI LETTER TA", 2468); - _unicodeCharacterMap.Add("BENGALI LETTER THA", 2469); - _unicodeCharacterMap.Add("BENGALI LETTER DA", 2470); - _unicodeCharacterMap.Add("BENGALI LETTER DHA", 2471); - _unicodeCharacterMap.Add("BENGALI LETTER NA", 2472); - _unicodeCharacterMap.Add("BENGALI LETTER PA", 2474); - _unicodeCharacterMap.Add("BENGALI LETTER PHA", 2475); - _unicodeCharacterMap.Add("BENGALI LETTER BA", 2476); - _unicodeCharacterMap.Add("BENGALI LETTER BHA", 2477); - _unicodeCharacterMap.Add("BENGALI LETTER MA", 2478); - _unicodeCharacterMap.Add("BENGALI LETTER YA", 2479); - _unicodeCharacterMap.Add("BENGALI LETTER RA", 2480); - _unicodeCharacterMap.Add("BENGALI LETTER LA", 2482); - _unicodeCharacterMap.Add("BENGALI LETTER SHA", 2486); - _unicodeCharacterMap.Add("BENGALI LETTER SSA", 2487); - _unicodeCharacterMap.Add("BENGALI LETTER SA", 2488); - _unicodeCharacterMap.Add("BENGALI LETTER HA", 2489); - _unicodeCharacterMap.Add("BENGALI SIGN NUKTA", 2492); - _unicodeCharacterMap.Add("BENGALI SIGN AVAGRAHA", 2493); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN AA", 2494); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN I", 2495); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN II", 2496); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN U", 2497); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN UU", 2498); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN VOCALIC R", 2499); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN VOCALIC RR", 2500); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN E", 2503); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN AI", 2504); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN O", 2507); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN AU", 2508); - _unicodeCharacterMap.Add("BENGALI SIGN VIRAMA", 2509); - _unicodeCharacterMap.Add("BENGALI LETTER KHANDA TA", 2510); - _unicodeCharacterMap.Add("BENGALI AU LENGTH MARK", 2519); - _unicodeCharacterMap.Add("BENGALI LETTER RRA", 2524); - _unicodeCharacterMap.Add("BENGALI LETTER RHA", 2525); - _unicodeCharacterMap.Add("BENGALI LETTER YYA", 2527); - _unicodeCharacterMap.Add("BENGALI LETTER VOCALIC RR", 2528); - _unicodeCharacterMap.Add("BENGALI LETTER VOCALIC LL", 2529); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN VOCALIC L", 2530); - _unicodeCharacterMap.Add("BENGALI VOWEL SIGN VOCALIC LL", 2531); - _unicodeCharacterMap.Add("BENGALI DIGIT ZERO", 2534); - _unicodeCharacterMap.Add("BENGALI DIGIT ONE", 2535); - _unicodeCharacterMap.Add("BENGALI DIGIT TWO", 2536); - _unicodeCharacterMap.Add("BENGALI DIGIT THREE", 2537); - _unicodeCharacterMap.Add("BENGALI DIGIT FOUR", 2538); - _unicodeCharacterMap.Add("BENGALI DIGIT FIVE", 2539); - _unicodeCharacterMap.Add("BENGALI DIGIT SIX", 2540); - _unicodeCharacterMap.Add("BENGALI DIGIT SEVEN", 2541); - _unicodeCharacterMap.Add("BENGALI DIGIT EIGHT", 2542); - _unicodeCharacterMap.Add("BENGALI DIGIT NINE", 2543); - _unicodeCharacterMap.Add("BENGALI LETTER RA WITH MIDDLE DIAGONAL", 2544); - _unicodeCharacterMap.Add("BENGALI LETTER RA WITH LOWER DIAGONAL", 2545); - _unicodeCharacterMap.Add("BENGALI RUPEE MARK", 2546); - _unicodeCharacterMap.Add("BENGALI RUPEE SIGN", 2547); - _unicodeCharacterMap.Add("BENGALI CURRENCY NUMERATOR ONE", 2548); - _unicodeCharacterMap.Add("BENGALI CURRENCY NUMERATOR TWO", 2549); - _unicodeCharacterMap.Add("BENGALI CURRENCY NUMERATOR THREE", 2550); - _unicodeCharacterMap.Add("BENGALI CURRENCY NUMERATOR FOUR", 2551); - _unicodeCharacterMap.Add("BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR", 2552); - _unicodeCharacterMap.Add("BENGALI CURRENCY DENOMINATOR SIXTEEN", 2553); - _unicodeCharacterMap.Add("BENGALI ISSHAR", 2554); - _unicodeCharacterMap.Add("BENGALI GANDA MARK", 2555); - _unicodeCharacterMap.Add("GURMUKHI SIGN ADAK BINDI", 2561); - _unicodeCharacterMap.Add("GURMUKHI SIGN BINDI", 2562); - _unicodeCharacterMap.Add("GURMUKHI SIGN VISARGA", 2563); - _unicodeCharacterMap.Add("GURMUKHI LETTER A", 2565); - _unicodeCharacterMap.Add("GURMUKHI LETTER AA", 2566); - _unicodeCharacterMap.Add("GURMUKHI LETTER I", 2567); - _unicodeCharacterMap.Add("GURMUKHI LETTER II", 2568); - _unicodeCharacterMap.Add("GURMUKHI LETTER U", 2569); - _unicodeCharacterMap.Add("GURMUKHI LETTER UU", 2570); - _unicodeCharacterMap.Add("GURMUKHI LETTER EE", 2575); - _unicodeCharacterMap.Add("GURMUKHI LETTER AI", 2576); - _unicodeCharacterMap.Add("GURMUKHI LETTER OO", 2579); - _unicodeCharacterMap.Add("GURMUKHI LETTER AU", 2580); - _unicodeCharacterMap.Add("GURMUKHI LETTER KA", 2581); - _unicodeCharacterMap.Add("GURMUKHI LETTER KHA", 2582); - _unicodeCharacterMap.Add("GURMUKHI LETTER GA", 2583); - _unicodeCharacterMap.Add("GURMUKHI LETTER GHA", 2584); - _unicodeCharacterMap.Add("GURMUKHI LETTER NGA", 2585); - _unicodeCharacterMap.Add("GURMUKHI LETTER CA", 2586); - _unicodeCharacterMap.Add("GURMUKHI LETTER CHA", 2587); - _unicodeCharacterMap.Add("GURMUKHI LETTER JA", 2588); - _unicodeCharacterMap.Add("GURMUKHI LETTER JHA", 2589); - _unicodeCharacterMap.Add("GURMUKHI LETTER NYA", 2590); - _unicodeCharacterMap.Add("GURMUKHI LETTER TTA", 2591); - _unicodeCharacterMap.Add("GURMUKHI LETTER TTHA", 2592); - _unicodeCharacterMap.Add("GURMUKHI LETTER DDA", 2593); - _unicodeCharacterMap.Add("GURMUKHI LETTER DDHA", 2594); - _unicodeCharacterMap.Add("GURMUKHI LETTER NNA", 2595); - _unicodeCharacterMap.Add("GURMUKHI LETTER TA", 2596); - _unicodeCharacterMap.Add("GURMUKHI LETTER THA", 2597); - _unicodeCharacterMap.Add("GURMUKHI LETTER DA", 2598); - _unicodeCharacterMap.Add("GURMUKHI LETTER DHA", 2599); - _unicodeCharacterMap.Add("GURMUKHI LETTER NA", 2600); - _unicodeCharacterMap.Add("GURMUKHI LETTER PA", 2602); - _unicodeCharacterMap.Add("GURMUKHI LETTER PHA", 2603); - _unicodeCharacterMap.Add("GURMUKHI LETTER BA", 2604); - _unicodeCharacterMap.Add("GURMUKHI LETTER BHA", 2605); - _unicodeCharacterMap.Add("GURMUKHI LETTER MA", 2606); - _unicodeCharacterMap.Add("GURMUKHI LETTER YA", 2607); - _unicodeCharacterMap.Add("GURMUKHI LETTER RA", 2608); - _unicodeCharacterMap.Add("GURMUKHI LETTER LA", 2610); - _unicodeCharacterMap.Add("GURMUKHI LETTER LLA", 2611); - _unicodeCharacterMap.Add("GURMUKHI LETTER VA", 2613); - _unicodeCharacterMap.Add("GURMUKHI LETTER SHA", 2614); - _unicodeCharacterMap.Add("GURMUKHI LETTER SA", 2616); - _unicodeCharacterMap.Add("GURMUKHI LETTER HA", 2617); - _unicodeCharacterMap.Add("GURMUKHI SIGN NUKTA", 2620); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN AA", 2622); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN I", 2623); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN II", 2624); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN U", 2625); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN UU", 2626); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN EE", 2631); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN AI", 2632); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN OO", 2635); - _unicodeCharacterMap.Add("GURMUKHI VOWEL SIGN AU", 2636); - _unicodeCharacterMap.Add("GURMUKHI SIGN VIRAMA", 2637); - _unicodeCharacterMap.Add("GURMUKHI SIGN UDAAT", 2641); - _unicodeCharacterMap.Add("GURMUKHI LETTER KHHA", 2649); - _unicodeCharacterMap.Add("GURMUKHI LETTER GHHA", 2650); - _unicodeCharacterMap.Add("GURMUKHI LETTER ZA", 2651); - _unicodeCharacterMap.Add("GURMUKHI LETTER RRA", 2652); - _unicodeCharacterMap.Add("GURMUKHI LETTER FA", 2654); - _unicodeCharacterMap.Add("GURMUKHI DIGIT ZERO", 2662); - _unicodeCharacterMap.Add("GURMUKHI DIGIT ONE", 2663); - _unicodeCharacterMap.Add("GURMUKHI DIGIT TWO", 2664); - _unicodeCharacterMap.Add("GURMUKHI DIGIT THREE", 2665); - _unicodeCharacterMap.Add("GURMUKHI DIGIT FOUR", 2666); - _unicodeCharacterMap.Add("GURMUKHI DIGIT FIVE", 2667); - _unicodeCharacterMap.Add("GURMUKHI DIGIT SIX", 2668); - _unicodeCharacterMap.Add("GURMUKHI DIGIT SEVEN", 2669); - _unicodeCharacterMap.Add("GURMUKHI DIGIT EIGHT", 2670); - _unicodeCharacterMap.Add("GURMUKHI DIGIT NINE", 2671); - _unicodeCharacterMap.Add("GURMUKHI TIPPI", 2672); - _unicodeCharacterMap.Add("GURMUKHI ADDAK", 2673); - _unicodeCharacterMap.Add("GURMUKHI IRI", 2674); - _unicodeCharacterMap.Add("GURMUKHI URA", 2675); - _unicodeCharacterMap.Add("GURMUKHI EK ONKAR", 2676); - _unicodeCharacterMap.Add("GURMUKHI SIGN YAKASH", 2677); - _unicodeCharacterMap.Add("GUJARATI SIGN CANDRABINDU", 2689); - _unicodeCharacterMap.Add("GUJARATI SIGN ANUSVARA", 2690); - _unicodeCharacterMap.Add("GUJARATI SIGN VISARGA", 2691); - _unicodeCharacterMap.Add("GUJARATI LETTER A", 2693); - _unicodeCharacterMap.Add("GUJARATI LETTER AA", 2694); - _unicodeCharacterMap.Add("GUJARATI LETTER I", 2695); - _unicodeCharacterMap.Add("GUJARATI LETTER II", 2696); - _unicodeCharacterMap.Add("GUJARATI LETTER U", 2697); - _unicodeCharacterMap.Add("GUJARATI LETTER UU", 2698); - _unicodeCharacterMap.Add("GUJARATI LETTER VOCALIC R", 2699); - _unicodeCharacterMap.Add("GUJARATI LETTER VOCALIC L", 2700); - _unicodeCharacterMap.Add("GUJARATI VOWEL CANDRA E", 2701); - _unicodeCharacterMap.Add("GUJARATI LETTER E", 2703); - _unicodeCharacterMap.Add("GUJARATI LETTER AI", 2704); - _unicodeCharacterMap.Add("GUJARATI VOWEL CANDRA O", 2705); - _unicodeCharacterMap.Add("GUJARATI LETTER O", 2707); - _unicodeCharacterMap.Add("GUJARATI LETTER AU", 2708); - _unicodeCharacterMap.Add("GUJARATI LETTER KA", 2709); - _unicodeCharacterMap.Add("GUJARATI LETTER KHA", 2710); - _unicodeCharacterMap.Add("GUJARATI LETTER GA", 2711); - _unicodeCharacterMap.Add("GUJARATI LETTER GHA", 2712); - _unicodeCharacterMap.Add("GUJARATI LETTER NGA", 2713); - _unicodeCharacterMap.Add("GUJARATI LETTER CA", 2714); - _unicodeCharacterMap.Add("GUJARATI LETTER CHA", 2715); - _unicodeCharacterMap.Add("GUJARATI LETTER JA", 2716); - _unicodeCharacterMap.Add("GUJARATI LETTER JHA", 2717); - _unicodeCharacterMap.Add("GUJARATI LETTER NYA", 2718); - _unicodeCharacterMap.Add("GUJARATI LETTER TTA", 2719); - _unicodeCharacterMap.Add("GUJARATI LETTER TTHA", 2720); - _unicodeCharacterMap.Add("GUJARATI LETTER DDA", 2721); - _unicodeCharacterMap.Add("GUJARATI LETTER DDHA", 2722); - _unicodeCharacterMap.Add("GUJARATI LETTER NNA", 2723); - _unicodeCharacterMap.Add("GUJARATI LETTER TA", 2724); - _unicodeCharacterMap.Add("GUJARATI LETTER THA", 2725); - _unicodeCharacterMap.Add("GUJARATI LETTER DA", 2726); - _unicodeCharacterMap.Add("GUJARATI LETTER DHA", 2727); - _unicodeCharacterMap.Add("GUJARATI LETTER NA", 2728); - _unicodeCharacterMap.Add("GUJARATI LETTER PA", 2730); - _unicodeCharacterMap.Add("GUJARATI LETTER PHA", 2731); - _unicodeCharacterMap.Add("GUJARATI LETTER BA", 2732); - _unicodeCharacterMap.Add("GUJARATI LETTER BHA", 2733); - _unicodeCharacterMap.Add("GUJARATI LETTER MA", 2734); - _unicodeCharacterMap.Add("GUJARATI LETTER YA", 2735); - _unicodeCharacterMap.Add("GUJARATI LETTER RA", 2736); - _unicodeCharacterMap.Add("GUJARATI LETTER LA", 2738); - _unicodeCharacterMap.Add("GUJARATI LETTER LLA", 2739); - _unicodeCharacterMap.Add("GUJARATI LETTER VA", 2741); - _unicodeCharacterMap.Add("GUJARATI LETTER SHA", 2742); - _unicodeCharacterMap.Add("GUJARATI LETTER SSA", 2743); - _unicodeCharacterMap.Add("GUJARATI LETTER SA", 2744); - _unicodeCharacterMap.Add("GUJARATI LETTER HA", 2745); - _unicodeCharacterMap.Add("GUJARATI SIGN NUKTA", 2748); - _unicodeCharacterMap.Add("GUJARATI SIGN AVAGRAHA", 2749); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN AA", 2750); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN I", 2751); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN II", 2752); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN U", 2753); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN UU", 2754); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN VOCALIC R", 2755); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN VOCALIC RR", 2756); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN CANDRA E", 2757); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN E", 2759); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN AI", 2760); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN CANDRA O", 2761); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN O", 2763); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN AU", 2764); - _unicodeCharacterMap.Add("GUJARATI SIGN VIRAMA", 2765); - _unicodeCharacterMap.Add("GUJARATI OM", 2768); - _unicodeCharacterMap.Add("GUJARATI LETTER VOCALIC RR", 2784); - _unicodeCharacterMap.Add("GUJARATI LETTER VOCALIC LL", 2785); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN VOCALIC L", 2786); - _unicodeCharacterMap.Add("GUJARATI VOWEL SIGN VOCALIC LL", 2787); - _unicodeCharacterMap.Add("GUJARATI DIGIT ZERO", 2790); - _unicodeCharacterMap.Add("GUJARATI DIGIT ONE", 2791); - _unicodeCharacterMap.Add("GUJARATI DIGIT TWO", 2792); - _unicodeCharacterMap.Add("GUJARATI DIGIT THREE", 2793); - _unicodeCharacterMap.Add("GUJARATI DIGIT FOUR", 2794); - _unicodeCharacterMap.Add("GUJARATI DIGIT FIVE", 2795); - _unicodeCharacterMap.Add("GUJARATI DIGIT SIX", 2796); - _unicodeCharacterMap.Add("GUJARATI DIGIT SEVEN", 2797); - _unicodeCharacterMap.Add("GUJARATI DIGIT EIGHT", 2798); - _unicodeCharacterMap.Add("GUJARATI DIGIT NINE", 2799); - _unicodeCharacterMap.Add("GUJARATI ABBREVIATION SIGN", 2800); - _unicodeCharacterMap.Add("GUJARATI RUPEE SIGN", 2801); - _unicodeCharacterMap.Add("GUJARATI LETTER ZHA", 2809); - _unicodeCharacterMap.Add("ORIYA SIGN CANDRABINDU", 2817); - _unicodeCharacterMap.Add("ORIYA SIGN ANUSVARA", 2818); - _unicodeCharacterMap.Add("ORIYA SIGN VISARGA", 2819); - _unicodeCharacterMap.Add("ORIYA LETTER A", 2821); - _unicodeCharacterMap.Add("ORIYA LETTER AA", 2822); - _unicodeCharacterMap.Add("ORIYA LETTER I", 2823); - _unicodeCharacterMap.Add("ORIYA LETTER II", 2824); - _unicodeCharacterMap.Add("ORIYA LETTER U", 2825); - _unicodeCharacterMap.Add("ORIYA LETTER UU", 2826); - _unicodeCharacterMap.Add("ORIYA LETTER VOCALIC R", 2827); - _unicodeCharacterMap.Add("ORIYA LETTER VOCALIC L", 2828); - _unicodeCharacterMap.Add("ORIYA LETTER E", 2831); - _unicodeCharacterMap.Add("ORIYA LETTER AI", 2832); - _unicodeCharacterMap.Add("ORIYA LETTER O", 2835); - _unicodeCharacterMap.Add("ORIYA LETTER AU", 2836); - _unicodeCharacterMap.Add("ORIYA LETTER KA", 2837); - _unicodeCharacterMap.Add("ORIYA LETTER KHA", 2838); - _unicodeCharacterMap.Add("ORIYA LETTER GA", 2839); - _unicodeCharacterMap.Add("ORIYA LETTER GHA", 2840); - _unicodeCharacterMap.Add("ORIYA LETTER NGA", 2841); - _unicodeCharacterMap.Add("ORIYA LETTER CA", 2842); - _unicodeCharacterMap.Add("ORIYA LETTER CHA", 2843); - _unicodeCharacterMap.Add("ORIYA LETTER JA", 2844); - _unicodeCharacterMap.Add("ORIYA LETTER JHA", 2845); - _unicodeCharacterMap.Add("ORIYA LETTER NYA", 2846); - _unicodeCharacterMap.Add("ORIYA LETTER TTA", 2847); - _unicodeCharacterMap.Add("ORIYA LETTER TTHA", 2848); - _unicodeCharacterMap.Add("ORIYA LETTER DDA", 2849); - _unicodeCharacterMap.Add("ORIYA LETTER DDHA", 2850); - _unicodeCharacterMap.Add("ORIYA LETTER NNA", 2851); - _unicodeCharacterMap.Add("ORIYA LETTER TA", 2852); - _unicodeCharacterMap.Add("ORIYA LETTER THA", 2853); - _unicodeCharacterMap.Add("ORIYA LETTER DA", 2854); - _unicodeCharacterMap.Add("ORIYA LETTER DHA", 2855); - _unicodeCharacterMap.Add("ORIYA LETTER NA", 2856); - _unicodeCharacterMap.Add("ORIYA LETTER PA", 2858); - _unicodeCharacterMap.Add("ORIYA LETTER PHA", 2859); - _unicodeCharacterMap.Add("ORIYA LETTER BA", 2860); - _unicodeCharacterMap.Add("ORIYA LETTER BHA", 2861); - _unicodeCharacterMap.Add("ORIYA LETTER MA", 2862); - _unicodeCharacterMap.Add("ORIYA LETTER YA", 2863); - _unicodeCharacterMap.Add("ORIYA LETTER RA", 2864); - _unicodeCharacterMap.Add("ORIYA LETTER LA", 2866); - _unicodeCharacterMap.Add("ORIYA LETTER LLA", 2867); - _unicodeCharacterMap.Add("ORIYA LETTER VA", 2869); - _unicodeCharacterMap.Add("ORIYA LETTER SHA", 2870); - _unicodeCharacterMap.Add("ORIYA LETTER SSA", 2871); - _unicodeCharacterMap.Add("ORIYA LETTER SA", 2872); - _unicodeCharacterMap.Add("ORIYA LETTER HA", 2873); - _unicodeCharacterMap.Add("ORIYA SIGN NUKTA", 2876); - _unicodeCharacterMap.Add("ORIYA SIGN AVAGRAHA", 2877); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN AA", 2878); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN I", 2879); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN II", 2880); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN U", 2881); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN UU", 2882); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN VOCALIC R", 2883); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN VOCALIC RR", 2884); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN E", 2887); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN AI", 2888); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN O", 2891); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN AU", 2892); - _unicodeCharacterMap.Add("ORIYA SIGN VIRAMA", 2893); - _unicodeCharacterMap.Add("ORIYA AI LENGTH MARK", 2902); - _unicodeCharacterMap.Add("ORIYA AU LENGTH MARK", 2903); - _unicodeCharacterMap.Add("ORIYA LETTER RRA", 2908); - _unicodeCharacterMap.Add("ORIYA LETTER RHA", 2909); - _unicodeCharacterMap.Add("ORIYA LETTER YYA", 2911); - _unicodeCharacterMap.Add("ORIYA LETTER VOCALIC RR", 2912); - _unicodeCharacterMap.Add("ORIYA LETTER VOCALIC LL", 2913); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN VOCALIC L", 2914); - _unicodeCharacterMap.Add("ORIYA VOWEL SIGN VOCALIC LL", 2915); - _unicodeCharacterMap.Add("ORIYA DIGIT ZERO", 2918); - _unicodeCharacterMap.Add("ORIYA DIGIT ONE", 2919); - _unicodeCharacterMap.Add("ORIYA DIGIT TWO", 2920); - _unicodeCharacterMap.Add("ORIYA DIGIT THREE", 2921); - _unicodeCharacterMap.Add("ORIYA DIGIT FOUR", 2922); - _unicodeCharacterMap.Add("ORIYA DIGIT FIVE", 2923); - _unicodeCharacterMap.Add("ORIYA DIGIT SIX", 2924); - _unicodeCharacterMap.Add("ORIYA DIGIT SEVEN", 2925); - _unicodeCharacterMap.Add("ORIYA DIGIT EIGHT", 2926); - _unicodeCharacterMap.Add("ORIYA DIGIT NINE", 2927); - _unicodeCharacterMap.Add("ORIYA ISSHAR", 2928); - _unicodeCharacterMap.Add("ORIYA LETTER WA", 2929); - _unicodeCharacterMap.Add("ORIYA FRACTION ONE QUARTER", 2930); - _unicodeCharacterMap.Add("ORIYA FRACTION ONE HALF", 2931); - _unicodeCharacterMap.Add("ORIYA FRACTION THREE QUARTERS", 2932); - _unicodeCharacterMap.Add("ORIYA FRACTION ONE SIXTEENTH", 2933); - _unicodeCharacterMap.Add("ORIYA FRACTION ONE EIGHTH", 2934); - _unicodeCharacterMap.Add("ORIYA FRACTION THREE SIXTEENTHS", 2935); - _unicodeCharacterMap.Add("TAMIL SIGN ANUSVARA", 2946); - _unicodeCharacterMap.Add("TAMIL SIGN VISARGA", 2947); - _unicodeCharacterMap.Add("TAMIL LETTER A", 2949); - _unicodeCharacterMap.Add("TAMIL LETTER AA", 2950); - _unicodeCharacterMap.Add("TAMIL LETTER I", 2951); - _unicodeCharacterMap.Add("TAMIL LETTER II", 2952); - _unicodeCharacterMap.Add("TAMIL LETTER U", 2953); - _unicodeCharacterMap.Add("TAMIL LETTER UU", 2954); - _unicodeCharacterMap.Add("TAMIL LETTER E", 2958); - _unicodeCharacterMap.Add("TAMIL LETTER EE", 2959); - _unicodeCharacterMap.Add("TAMIL LETTER AI", 2960); - _unicodeCharacterMap.Add("TAMIL LETTER O", 2962); - _unicodeCharacterMap.Add("TAMIL LETTER OO", 2963); - _unicodeCharacterMap.Add("TAMIL LETTER AU", 2964); - _unicodeCharacterMap.Add("TAMIL LETTER KA", 2965); - _unicodeCharacterMap.Add("TAMIL LETTER NGA", 2969); - _unicodeCharacterMap.Add("TAMIL LETTER CA", 2970); - _unicodeCharacterMap.Add("TAMIL LETTER JA", 2972); - _unicodeCharacterMap.Add("TAMIL LETTER NYA", 2974); - _unicodeCharacterMap.Add("TAMIL LETTER TTA", 2975); - _unicodeCharacterMap.Add("TAMIL LETTER NNA", 2979); - _unicodeCharacterMap.Add("TAMIL LETTER TA", 2980); - _unicodeCharacterMap.Add("TAMIL LETTER NA", 2984); - _unicodeCharacterMap.Add("TAMIL LETTER NNNA", 2985); - _unicodeCharacterMap.Add("TAMIL LETTER PA", 2986); - _unicodeCharacterMap.Add("TAMIL LETTER MA", 2990); - _unicodeCharacterMap.Add("TAMIL LETTER YA", 2991); - _unicodeCharacterMap.Add("TAMIL LETTER RA", 2992); - _unicodeCharacterMap.Add("TAMIL LETTER RRA", 2993); - _unicodeCharacterMap.Add("TAMIL LETTER LA", 2994); - _unicodeCharacterMap.Add("TAMIL LETTER LLA", 2995); - _unicodeCharacterMap.Add("TAMIL LETTER LLLA", 2996); - _unicodeCharacterMap.Add("TAMIL LETTER VA", 2997); - _unicodeCharacterMap.Add("TAMIL LETTER SHA", 2998); - _unicodeCharacterMap.Add("TAMIL LETTER SSA", 2999); - _unicodeCharacterMap.Add("TAMIL LETTER SA", 3000); - _unicodeCharacterMap.Add("TAMIL LETTER HA", 3001); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN AA", 3006); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN I", 3007); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN II", 3008); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN U", 3009); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN UU", 3010); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN E", 3014); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN EE", 3015); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN AI", 3016); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN O", 3018); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN OO", 3019); - _unicodeCharacterMap.Add("TAMIL VOWEL SIGN AU", 3020); - _unicodeCharacterMap.Add("TAMIL SIGN VIRAMA", 3021); - _unicodeCharacterMap.Add("TAMIL OM", 3024); - _unicodeCharacterMap.Add("TAMIL AU LENGTH MARK", 3031); - _unicodeCharacterMap.Add("TAMIL DIGIT ZERO", 3046); - _unicodeCharacterMap.Add("TAMIL DIGIT ONE", 3047); - _unicodeCharacterMap.Add("TAMIL DIGIT TWO", 3048); - _unicodeCharacterMap.Add("TAMIL DIGIT THREE", 3049); - _unicodeCharacterMap.Add("TAMIL DIGIT FOUR", 3050); - _unicodeCharacterMap.Add("TAMIL DIGIT FIVE", 3051); - _unicodeCharacterMap.Add("TAMIL DIGIT SIX", 3052); - _unicodeCharacterMap.Add("TAMIL DIGIT SEVEN", 3053); - _unicodeCharacterMap.Add("TAMIL DIGIT EIGHT", 3054); - _unicodeCharacterMap.Add("TAMIL DIGIT NINE", 3055); - _unicodeCharacterMap.Add("TAMIL NUMBER TEN", 3056); - _unicodeCharacterMap.Add("TAMIL NUMBER ONE HUNDRED", 3057); - _unicodeCharacterMap.Add("TAMIL NUMBER ONE THOUSAND", 3058); - _unicodeCharacterMap.Add("TAMIL DAY SIGN", 3059); - _unicodeCharacterMap.Add("TAMIL MONTH SIGN", 3060); - _unicodeCharacterMap.Add("TAMIL YEAR SIGN", 3061); - _unicodeCharacterMap.Add("TAMIL DEBIT SIGN", 3062); - _unicodeCharacterMap.Add("TAMIL CREDIT SIGN", 3063); - _unicodeCharacterMap.Add("TAMIL AS ABOVE SIGN", 3064); - _unicodeCharacterMap.Add("TAMIL RUPEE SIGN", 3065); - _unicodeCharacterMap.Add("TAMIL NUMBER SIGN", 3066); - _unicodeCharacterMap.Add("TELUGU SIGN COMBINING CANDRABINDU ABOVE", 3072); - _unicodeCharacterMap.Add("TELUGU SIGN CANDRABINDU", 3073); - _unicodeCharacterMap.Add("TELUGU SIGN ANUSVARA", 3074); - _unicodeCharacterMap.Add("TELUGU SIGN VISARGA", 3075); - _unicodeCharacterMap.Add("TELUGU LETTER A", 3077); - _unicodeCharacterMap.Add("TELUGU LETTER AA", 3078); - _unicodeCharacterMap.Add("TELUGU LETTER I", 3079); - _unicodeCharacterMap.Add("TELUGU LETTER II", 3080); - _unicodeCharacterMap.Add("TELUGU LETTER U", 3081); - _unicodeCharacterMap.Add("TELUGU LETTER UU", 3082); - _unicodeCharacterMap.Add("TELUGU LETTER VOCALIC R", 3083); - _unicodeCharacterMap.Add("TELUGU LETTER VOCALIC L", 3084); - _unicodeCharacterMap.Add("TELUGU LETTER E", 3086); - _unicodeCharacterMap.Add("TELUGU LETTER EE", 3087); - _unicodeCharacterMap.Add("TELUGU LETTER AI", 3088); - _unicodeCharacterMap.Add("TELUGU LETTER O", 3090); - _unicodeCharacterMap.Add("TELUGU LETTER OO", 3091); - _unicodeCharacterMap.Add("TELUGU LETTER AU", 3092); - _unicodeCharacterMap.Add("TELUGU LETTER KA", 3093); - _unicodeCharacterMap.Add("TELUGU LETTER KHA", 3094); - _unicodeCharacterMap.Add("TELUGU LETTER GA", 3095); - _unicodeCharacterMap.Add("TELUGU LETTER GHA", 3096); - _unicodeCharacterMap.Add("TELUGU LETTER NGA", 3097); - _unicodeCharacterMap.Add("TELUGU LETTER CA", 3098); - _unicodeCharacterMap.Add("TELUGU LETTER CHA", 3099); - _unicodeCharacterMap.Add("TELUGU LETTER JA", 3100); - _unicodeCharacterMap.Add("TELUGU LETTER JHA", 3101); - _unicodeCharacterMap.Add("TELUGU LETTER NYA", 3102); - _unicodeCharacterMap.Add("TELUGU LETTER TTA", 3103); - _unicodeCharacterMap.Add("TELUGU LETTER TTHA", 3104); - _unicodeCharacterMap.Add("TELUGU LETTER DDA", 3105); - _unicodeCharacterMap.Add("TELUGU LETTER DDHA", 3106); - _unicodeCharacterMap.Add("TELUGU LETTER NNA", 3107); - _unicodeCharacterMap.Add("TELUGU LETTER TA", 3108); - _unicodeCharacterMap.Add("TELUGU LETTER THA", 3109); - _unicodeCharacterMap.Add("TELUGU LETTER DA", 3110); - _unicodeCharacterMap.Add("TELUGU LETTER DHA", 3111); - _unicodeCharacterMap.Add("TELUGU LETTER NA", 3112); - _unicodeCharacterMap.Add("TELUGU LETTER PA", 3114); - _unicodeCharacterMap.Add("TELUGU LETTER PHA", 3115); - _unicodeCharacterMap.Add("TELUGU LETTER BA", 3116); - _unicodeCharacterMap.Add("TELUGU LETTER BHA", 3117); - _unicodeCharacterMap.Add("TELUGU LETTER MA", 3118); - _unicodeCharacterMap.Add("TELUGU LETTER YA", 3119); - _unicodeCharacterMap.Add("TELUGU LETTER RA", 3120); - _unicodeCharacterMap.Add("TELUGU LETTER RRA", 3121); - _unicodeCharacterMap.Add("TELUGU LETTER LA", 3122); - _unicodeCharacterMap.Add("TELUGU LETTER LLA", 3123); - _unicodeCharacterMap.Add("TELUGU LETTER LLLA", 3124); - _unicodeCharacterMap.Add("TELUGU LETTER VA", 3125); - _unicodeCharacterMap.Add("TELUGU LETTER SHA", 3126); - _unicodeCharacterMap.Add("TELUGU LETTER SSA", 3127); - _unicodeCharacterMap.Add("TELUGU LETTER SA", 3128); - _unicodeCharacterMap.Add("TELUGU LETTER HA", 3129); - _unicodeCharacterMap.Add("TELUGU SIGN AVAGRAHA", 3133); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN AA", 3134); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN I", 3135); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN II", 3136); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN U", 3137); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN UU", 3138); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN VOCALIC R", 3139); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN VOCALIC RR", 3140); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN E", 3142); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN EE", 3143); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN AI", 3144); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN O", 3146); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN OO", 3147); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN AU", 3148); - _unicodeCharacterMap.Add("TELUGU SIGN VIRAMA", 3149); - _unicodeCharacterMap.Add("TELUGU LENGTH MARK", 3157); - _unicodeCharacterMap.Add("TELUGU AI LENGTH MARK", 3158); - _unicodeCharacterMap.Add("TELUGU LETTER TSA", 3160); - _unicodeCharacterMap.Add("TELUGU LETTER DZA", 3161); - _unicodeCharacterMap.Add("TELUGU LETTER RRRA", 3162); - _unicodeCharacterMap.Add("TELUGU LETTER VOCALIC RR", 3168); - _unicodeCharacterMap.Add("TELUGU LETTER VOCALIC LL", 3169); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN VOCALIC L", 3170); - _unicodeCharacterMap.Add("TELUGU VOWEL SIGN VOCALIC LL", 3171); - _unicodeCharacterMap.Add("TELUGU DIGIT ZERO", 3174); - _unicodeCharacterMap.Add("TELUGU DIGIT ONE", 3175); - _unicodeCharacterMap.Add("TELUGU DIGIT TWO", 3176); - _unicodeCharacterMap.Add("TELUGU DIGIT THREE", 3177); - _unicodeCharacterMap.Add("TELUGU DIGIT FOUR", 3178); - _unicodeCharacterMap.Add("TELUGU DIGIT FIVE", 3179); - _unicodeCharacterMap.Add("TELUGU DIGIT SIX", 3180); - _unicodeCharacterMap.Add("TELUGU DIGIT SEVEN", 3181); - _unicodeCharacterMap.Add("TELUGU DIGIT EIGHT", 3182); - _unicodeCharacterMap.Add("TELUGU DIGIT NINE", 3183); - _unicodeCharacterMap.Add("TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR", 3192); - _unicodeCharacterMap.Add("TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR", 3193); - _unicodeCharacterMap.Add("TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR", 3194); - _unicodeCharacterMap.Add("TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR", 3195); - _unicodeCharacterMap.Add("TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR", 3196); - _unicodeCharacterMap.Add("TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR", 3197); - _unicodeCharacterMap.Add("TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR", 3198); - _unicodeCharacterMap.Add("TELUGU SIGN TUUMU", 3199); - _unicodeCharacterMap.Add("KANNADA SIGN SPACING CANDRABINDU", 3200); - _unicodeCharacterMap.Add("KANNADA SIGN CANDRABINDU", 3201); - _unicodeCharacterMap.Add("KANNADA SIGN ANUSVARA", 3202); - _unicodeCharacterMap.Add("KANNADA SIGN VISARGA", 3203); - _unicodeCharacterMap.Add("KANNADA LETTER A", 3205); - _unicodeCharacterMap.Add("KANNADA LETTER AA", 3206); - _unicodeCharacterMap.Add("KANNADA LETTER I", 3207); - _unicodeCharacterMap.Add("KANNADA LETTER II", 3208); - _unicodeCharacterMap.Add("KANNADA LETTER U", 3209); - _unicodeCharacterMap.Add("KANNADA LETTER UU", 3210); - _unicodeCharacterMap.Add("KANNADA LETTER VOCALIC R", 3211); - _unicodeCharacterMap.Add("KANNADA LETTER VOCALIC L", 3212); - _unicodeCharacterMap.Add("KANNADA LETTER E", 3214); - _unicodeCharacterMap.Add("KANNADA LETTER EE", 3215); - _unicodeCharacterMap.Add("KANNADA LETTER AI", 3216); - _unicodeCharacterMap.Add("KANNADA LETTER O", 3218); - _unicodeCharacterMap.Add("KANNADA LETTER OO", 3219); - _unicodeCharacterMap.Add("KANNADA LETTER AU", 3220); - _unicodeCharacterMap.Add("KANNADA LETTER KA", 3221); - _unicodeCharacterMap.Add("KANNADA LETTER KHA", 3222); - _unicodeCharacterMap.Add("KANNADA LETTER GA", 3223); - _unicodeCharacterMap.Add("KANNADA LETTER GHA", 3224); - _unicodeCharacterMap.Add("KANNADA LETTER NGA", 3225); - _unicodeCharacterMap.Add("KANNADA LETTER CA", 3226); - _unicodeCharacterMap.Add("KANNADA LETTER CHA", 3227); - _unicodeCharacterMap.Add("KANNADA LETTER JA", 3228); - _unicodeCharacterMap.Add("KANNADA LETTER JHA", 3229); - _unicodeCharacterMap.Add("KANNADA LETTER NYA", 3230); - _unicodeCharacterMap.Add("KANNADA LETTER TTA", 3231); - _unicodeCharacterMap.Add("KANNADA LETTER TTHA", 3232); - _unicodeCharacterMap.Add("KANNADA LETTER DDA", 3233); - _unicodeCharacterMap.Add("KANNADA LETTER DDHA", 3234); - _unicodeCharacterMap.Add("KANNADA LETTER NNA", 3235); - _unicodeCharacterMap.Add("KANNADA LETTER TA", 3236); - _unicodeCharacterMap.Add("KANNADA LETTER THA", 3237); - _unicodeCharacterMap.Add("KANNADA LETTER DA", 3238); - _unicodeCharacterMap.Add("KANNADA LETTER DHA", 3239); - _unicodeCharacterMap.Add("KANNADA LETTER NA", 3240); - _unicodeCharacterMap.Add("KANNADA LETTER PA", 3242); - _unicodeCharacterMap.Add("KANNADA LETTER PHA", 3243); - _unicodeCharacterMap.Add("KANNADA LETTER BA", 3244); - _unicodeCharacterMap.Add("KANNADA LETTER BHA", 3245); - _unicodeCharacterMap.Add("KANNADA LETTER MA", 3246); - _unicodeCharacterMap.Add("KANNADA LETTER YA", 3247); - _unicodeCharacterMap.Add("KANNADA LETTER RA", 3248); - _unicodeCharacterMap.Add("KANNADA LETTER RRA", 3249); - _unicodeCharacterMap.Add("KANNADA LETTER LA", 3250); - _unicodeCharacterMap.Add("KANNADA LETTER LLA", 3251); - _unicodeCharacterMap.Add("KANNADA LETTER VA", 3253); - _unicodeCharacterMap.Add("KANNADA LETTER SHA", 3254); - _unicodeCharacterMap.Add("KANNADA LETTER SSA", 3255); - _unicodeCharacterMap.Add("KANNADA LETTER SA", 3256); - _unicodeCharacterMap.Add("KANNADA LETTER HA", 3257); - _unicodeCharacterMap.Add("KANNADA SIGN NUKTA", 3260); - _unicodeCharacterMap.Add("KANNADA SIGN AVAGRAHA", 3261); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN AA", 3262); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN I", 3263); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN II", 3264); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN U", 3265); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN UU", 3266); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN VOCALIC R", 3267); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN VOCALIC RR", 3268); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN E", 3270); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN EE", 3271); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN AI", 3272); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN O", 3274); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN OO", 3275); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN AU", 3276); - _unicodeCharacterMap.Add("KANNADA SIGN VIRAMA", 3277); - _unicodeCharacterMap.Add("KANNADA LENGTH MARK", 3285); - _unicodeCharacterMap.Add("KANNADA AI LENGTH MARK", 3286); - _unicodeCharacterMap.Add("KANNADA LETTER FA", 3294); - _unicodeCharacterMap.Add("KANNADA LETTER VOCALIC RR", 3296); - _unicodeCharacterMap.Add("KANNADA LETTER VOCALIC LL", 3297); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN VOCALIC L", 3298); - _unicodeCharacterMap.Add("KANNADA VOWEL SIGN VOCALIC LL", 3299); - _unicodeCharacterMap.Add("KANNADA DIGIT ZERO", 3302); - _unicodeCharacterMap.Add("KANNADA DIGIT ONE", 3303); - _unicodeCharacterMap.Add("KANNADA DIGIT TWO", 3304); - _unicodeCharacterMap.Add("KANNADA DIGIT THREE", 3305); - _unicodeCharacterMap.Add("KANNADA DIGIT FOUR", 3306); - _unicodeCharacterMap.Add("KANNADA DIGIT FIVE", 3307); - _unicodeCharacterMap.Add("KANNADA DIGIT SIX", 3308); - _unicodeCharacterMap.Add("KANNADA DIGIT SEVEN", 3309); - _unicodeCharacterMap.Add("KANNADA DIGIT EIGHT", 3310); - _unicodeCharacterMap.Add("KANNADA DIGIT NINE", 3311); - _unicodeCharacterMap.Add("KANNADA SIGN JIHVAMULIYA", 3313); - _unicodeCharacterMap.Add("KANNADA SIGN UPADHMANIYA", 3314); - _unicodeCharacterMap.Add("MALAYALAM SIGN CANDRABINDU", 3329); - _unicodeCharacterMap.Add("MALAYALAM SIGN ANUSVARA", 3330); - _unicodeCharacterMap.Add("MALAYALAM SIGN VISARGA", 3331); - _unicodeCharacterMap.Add("MALAYALAM LETTER A", 3333); - _unicodeCharacterMap.Add("MALAYALAM LETTER AA", 3334); - _unicodeCharacterMap.Add("MALAYALAM LETTER I", 3335); - _unicodeCharacterMap.Add("MALAYALAM LETTER II", 3336); - _unicodeCharacterMap.Add("MALAYALAM LETTER U", 3337); - _unicodeCharacterMap.Add("MALAYALAM LETTER UU", 3338); - _unicodeCharacterMap.Add("MALAYALAM LETTER VOCALIC R", 3339); - _unicodeCharacterMap.Add("MALAYALAM LETTER VOCALIC L", 3340); - _unicodeCharacterMap.Add("MALAYALAM LETTER E", 3342); - _unicodeCharacterMap.Add("MALAYALAM LETTER EE", 3343); - _unicodeCharacterMap.Add("MALAYALAM LETTER AI", 3344); - _unicodeCharacterMap.Add("MALAYALAM LETTER O", 3346); - _unicodeCharacterMap.Add("MALAYALAM LETTER OO", 3347); - _unicodeCharacterMap.Add("MALAYALAM LETTER AU", 3348); - _unicodeCharacterMap.Add("MALAYALAM LETTER KA", 3349); - _unicodeCharacterMap.Add("MALAYALAM LETTER KHA", 3350); - _unicodeCharacterMap.Add("MALAYALAM LETTER GA", 3351); - _unicodeCharacterMap.Add("MALAYALAM LETTER GHA", 3352); - _unicodeCharacterMap.Add("MALAYALAM LETTER NGA", 3353); - _unicodeCharacterMap.Add("MALAYALAM LETTER CA", 3354); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHA", 3355); - _unicodeCharacterMap.Add("MALAYALAM LETTER JA", 3356); - _unicodeCharacterMap.Add("MALAYALAM LETTER JHA", 3357); - _unicodeCharacterMap.Add("MALAYALAM LETTER NYA", 3358); - _unicodeCharacterMap.Add("MALAYALAM LETTER TTA", 3359); - _unicodeCharacterMap.Add("MALAYALAM LETTER TTHA", 3360); - _unicodeCharacterMap.Add("MALAYALAM LETTER DDA", 3361); - _unicodeCharacterMap.Add("MALAYALAM LETTER DDHA", 3362); - _unicodeCharacterMap.Add("MALAYALAM LETTER NNA", 3363); - _unicodeCharacterMap.Add("MALAYALAM LETTER TA", 3364); - _unicodeCharacterMap.Add("MALAYALAM LETTER THA", 3365); - _unicodeCharacterMap.Add("MALAYALAM LETTER DA", 3366); - _unicodeCharacterMap.Add("MALAYALAM LETTER DHA", 3367); - _unicodeCharacterMap.Add("MALAYALAM LETTER NA", 3368); - _unicodeCharacterMap.Add("MALAYALAM LETTER NNNA", 3369); - _unicodeCharacterMap.Add("MALAYALAM LETTER PA", 3370); - _unicodeCharacterMap.Add("MALAYALAM LETTER PHA", 3371); - _unicodeCharacterMap.Add("MALAYALAM LETTER BA", 3372); - _unicodeCharacterMap.Add("MALAYALAM LETTER BHA", 3373); - _unicodeCharacterMap.Add("MALAYALAM LETTER MA", 3374); - _unicodeCharacterMap.Add("MALAYALAM LETTER YA", 3375); - _unicodeCharacterMap.Add("MALAYALAM LETTER RA", 3376); - _unicodeCharacterMap.Add("MALAYALAM LETTER RRA", 3377); - _unicodeCharacterMap.Add("MALAYALAM LETTER LA", 3378); - _unicodeCharacterMap.Add("MALAYALAM LETTER LLA", 3379); - _unicodeCharacterMap.Add("MALAYALAM LETTER LLLA", 3380); - _unicodeCharacterMap.Add("MALAYALAM LETTER VA", 3381); - _unicodeCharacterMap.Add("MALAYALAM LETTER SHA", 3382); - _unicodeCharacterMap.Add("MALAYALAM LETTER SSA", 3383); - _unicodeCharacterMap.Add("MALAYALAM LETTER SA", 3384); - _unicodeCharacterMap.Add("MALAYALAM LETTER HA", 3385); - _unicodeCharacterMap.Add("MALAYALAM LETTER TTTA", 3386); - _unicodeCharacterMap.Add("MALAYALAM SIGN AVAGRAHA", 3389); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN AA", 3390); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN I", 3391); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN II", 3392); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN U", 3393); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN UU", 3394); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN VOCALIC R", 3395); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN VOCALIC RR", 3396); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN E", 3398); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN EE", 3399); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN AI", 3400); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN O", 3402); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN OO", 3403); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN AU", 3404); - _unicodeCharacterMap.Add("MALAYALAM SIGN VIRAMA", 3405); - _unicodeCharacterMap.Add("MALAYALAM LETTER DOT REPH", 3406); - _unicodeCharacterMap.Add("MALAYALAM SIGN PARA", 3407); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU M", 3412); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU Y", 3413); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU LLL", 3414); - _unicodeCharacterMap.Add("MALAYALAM AU LENGTH MARK", 3415); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE ONE HUNDRED AND SIXTIETH", 3416); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE FORTIETH", 3417); - _unicodeCharacterMap.Add("MALAYALAM FRACTION THREE EIGHTIETHS", 3418); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE TWENTIETH", 3419); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE TENTH", 3420); - _unicodeCharacterMap.Add("MALAYALAM FRACTION THREE TWENTIETHS", 3421); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE FIFTH", 3422); - _unicodeCharacterMap.Add("MALAYALAM LETTER ARCHAIC II", 3423); - _unicodeCharacterMap.Add("MALAYALAM LETTER VOCALIC RR", 3424); - _unicodeCharacterMap.Add("MALAYALAM LETTER VOCALIC LL", 3425); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN VOCALIC L", 3426); - _unicodeCharacterMap.Add("MALAYALAM VOWEL SIGN VOCALIC LL", 3427); - _unicodeCharacterMap.Add("MALAYALAM DIGIT ZERO", 3430); - _unicodeCharacterMap.Add("MALAYALAM DIGIT ONE", 3431); - _unicodeCharacterMap.Add("MALAYALAM DIGIT TWO", 3432); - _unicodeCharacterMap.Add("MALAYALAM DIGIT THREE", 3433); - _unicodeCharacterMap.Add("MALAYALAM DIGIT FOUR", 3434); - _unicodeCharacterMap.Add("MALAYALAM DIGIT FIVE", 3435); - _unicodeCharacterMap.Add("MALAYALAM DIGIT SIX", 3436); - _unicodeCharacterMap.Add("MALAYALAM DIGIT SEVEN", 3437); - _unicodeCharacterMap.Add("MALAYALAM DIGIT EIGHT", 3438); - _unicodeCharacterMap.Add("MALAYALAM DIGIT NINE", 3439); - _unicodeCharacterMap.Add("MALAYALAM NUMBER TEN", 3440); - _unicodeCharacterMap.Add("MALAYALAM NUMBER ONE HUNDRED", 3441); - _unicodeCharacterMap.Add("MALAYALAM NUMBER ONE THOUSAND", 3442); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE QUARTER", 3443); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE HALF", 3444); - _unicodeCharacterMap.Add("MALAYALAM FRACTION THREE QUARTERS", 3445); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE SIXTEENTH", 3446); - _unicodeCharacterMap.Add("MALAYALAM FRACTION ONE EIGHTH", 3447); - _unicodeCharacterMap.Add("MALAYALAM FRACTION THREE SIXTEENTHS", 3448); - _unicodeCharacterMap.Add("MALAYALAM DATE MARK", 3449); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU NN", 3450); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU N", 3451); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU RR", 3452); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU L", 3453); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU LL", 3454); - _unicodeCharacterMap.Add("MALAYALAM LETTER CHILLU K", 3455); - _unicodeCharacterMap.Add("SINHALA SIGN ANUSVARAYA", 3458); - _unicodeCharacterMap.Add("SINHALA SIGN VISARGAYA", 3459); - _unicodeCharacterMap.Add("SINHALA LETTER AYANNA", 3461); - _unicodeCharacterMap.Add("SINHALA LETTER AAYANNA", 3462); - _unicodeCharacterMap.Add("SINHALA LETTER AEYANNA", 3463); - _unicodeCharacterMap.Add("SINHALA LETTER AEEYANNA", 3464); - _unicodeCharacterMap.Add("SINHALA LETTER IYANNA", 3465); - _unicodeCharacterMap.Add("SINHALA LETTER IIYANNA", 3466); - _unicodeCharacterMap.Add("SINHALA LETTER UYANNA", 3467); - _unicodeCharacterMap.Add("SINHALA LETTER UUYANNA", 3468); - _unicodeCharacterMap.Add("SINHALA LETTER IRUYANNA", 3469); - _unicodeCharacterMap.Add("SINHALA LETTER IRUUYANNA", 3470); - _unicodeCharacterMap.Add("SINHALA LETTER ILUYANNA", 3471); - _unicodeCharacterMap.Add("SINHALA LETTER ILUUYANNA", 3472); - _unicodeCharacterMap.Add("SINHALA LETTER EYANNA", 3473); - _unicodeCharacterMap.Add("SINHALA LETTER EEYANNA", 3474); - _unicodeCharacterMap.Add("SINHALA LETTER AIYANNA", 3475); - _unicodeCharacterMap.Add("SINHALA LETTER OYANNA", 3476); - _unicodeCharacterMap.Add("SINHALA LETTER OOYANNA", 3477); - _unicodeCharacterMap.Add("SINHALA LETTER AUYANNA", 3478); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA KAYANNA", 3482); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA KAYANNA", 3483); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA GAYANNA", 3484); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA GAYANNA", 3485); - _unicodeCharacterMap.Add("SINHALA LETTER KANTAJA NAASIKYAYA", 3486); - _unicodeCharacterMap.Add("SINHALA LETTER SANYAKA GAYANNA", 3487); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA CAYANNA", 3488); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA CAYANNA", 3489); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA JAYANNA", 3490); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA JAYANNA", 3491); - _unicodeCharacterMap.Add("SINHALA LETTER TAALUJA NAASIKYAYA", 3492); - _unicodeCharacterMap.Add("SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA", 3493); - _unicodeCharacterMap.Add("SINHALA LETTER SANYAKA JAYANNA", 3494); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA TTAYANNA", 3495); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA TTAYANNA", 3496); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA DDAYANNA", 3497); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA DDAYANNA", 3498); - _unicodeCharacterMap.Add("SINHALA LETTER MUURDHAJA NAYANNA", 3499); - _unicodeCharacterMap.Add("SINHALA LETTER SANYAKA DDAYANNA", 3500); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA TAYANNA", 3501); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA TAYANNA", 3502); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA DAYANNA", 3503); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA DAYANNA", 3504); - _unicodeCharacterMap.Add("SINHALA LETTER DANTAJA NAYANNA", 3505); - _unicodeCharacterMap.Add("SINHALA LETTER SANYAKA DAYANNA", 3507); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA PAYANNA", 3508); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA PAYANNA", 3509); - _unicodeCharacterMap.Add("SINHALA LETTER ALPAPRAANA BAYANNA", 3510); - _unicodeCharacterMap.Add("SINHALA LETTER MAHAAPRAANA BAYANNA", 3511); - _unicodeCharacterMap.Add("SINHALA LETTER MAYANNA", 3512); - _unicodeCharacterMap.Add("SINHALA LETTER AMBA BAYANNA", 3513); - _unicodeCharacterMap.Add("SINHALA LETTER YAYANNA", 3514); - _unicodeCharacterMap.Add("SINHALA LETTER RAYANNA", 3515); - _unicodeCharacterMap.Add("SINHALA LETTER DANTAJA LAYANNA", 3517); - _unicodeCharacterMap.Add("SINHALA LETTER VAYANNA", 3520); - _unicodeCharacterMap.Add("SINHALA LETTER TAALUJA SAYANNA", 3521); - _unicodeCharacterMap.Add("SINHALA LETTER MUURDHAJA SAYANNA", 3522); - _unicodeCharacterMap.Add("SINHALA LETTER DANTAJA SAYANNA", 3523); - _unicodeCharacterMap.Add("SINHALA LETTER HAYANNA", 3524); - _unicodeCharacterMap.Add("SINHALA LETTER MUURDHAJA LAYANNA", 3525); - _unicodeCharacterMap.Add("SINHALA LETTER FAYANNA", 3526); - _unicodeCharacterMap.Add("SINHALA SIGN AL LAKUNA", 3530); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN AELA PILLA", 3535); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KETTI AEDA PILLA", 3536); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN DIGA AEDA PILLA", 3537); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KETTI IS PILLA", 3538); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN DIGA IS PILLA", 3539); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KETTI PAA PILLA", 3540); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN DIGA PAA PILLA", 3542); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN GAETTA PILLA", 3544); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KOMBUVA", 3545); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN DIGA KOMBUVA", 3546); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KOMBU DEKA", 3547); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KOMBUVA HAA AELA PILLA", 3548); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA PILLA", 3549); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA", 3550); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN GAYANUKITTA", 3551); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT ZERO", 3558); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT ONE", 3559); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT TWO", 3560); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT THREE", 3561); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT FOUR", 3562); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT FIVE", 3563); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT SIX", 3564); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT SEVEN", 3565); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT EIGHT", 3566); - _unicodeCharacterMap.Add("SINHALA LITH DIGIT NINE", 3567); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN DIGA GAETTA PILLA", 3570); - _unicodeCharacterMap.Add("SINHALA VOWEL SIGN DIGA GAYANUKITTA", 3571); - _unicodeCharacterMap.Add("SINHALA PUNCTUATION KUNDDALIYA", 3572); - _unicodeCharacterMap.Add("THAI CHARACTER KO KAI", 3585); - _unicodeCharacterMap.Add("THAI CHARACTER KHO KHAI", 3586); - _unicodeCharacterMap.Add("THAI CHARACTER KHO KHUAT", 3587); - _unicodeCharacterMap.Add("THAI CHARACTER KHO KHWAI", 3588); - _unicodeCharacterMap.Add("THAI CHARACTER KHO KHON", 3589); - _unicodeCharacterMap.Add("THAI CHARACTER KHO RAKHANG", 3590); - _unicodeCharacterMap.Add("THAI CHARACTER NGO NGU", 3591); - _unicodeCharacterMap.Add("THAI CHARACTER CHO CHAN", 3592); - _unicodeCharacterMap.Add("THAI CHARACTER CHO CHING", 3593); - _unicodeCharacterMap.Add("THAI CHARACTER CHO CHANG", 3594); - _unicodeCharacterMap.Add("THAI CHARACTER SO SO", 3595); - _unicodeCharacterMap.Add("THAI CHARACTER CHO CHOE", 3596); - _unicodeCharacterMap.Add("THAI CHARACTER YO YING", 3597); - _unicodeCharacterMap.Add("THAI CHARACTER DO CHADA", 3598); - _unicodeCharacterMap.Add("THAI CHARACTER TO PATAK", 3599); - _unicodeCharacterMap.Add("THAI CHARACTER THO THAN", 3600); - _unicodeCharacterMap.Add("THAI CHARACTER THO NANGMONTHO", 3601); - _unicodeCharacterMap.Add("THAI CHARACTER THO PHUTHAO", 3602); - _unicodeCharacterMap.Add("THAI CHARACTER NO NEN", 3603); - _unicodeCharacterMap.Add("THAI CHARACTER DO DEK", 3604); - _unicodeCharacterMap.Add("THAI CHARACTER TO TAO", 3605); - _unicodeCharacterMap.Add("THAI CHARACTER THO THUNG", 3606); - _unicodeCharacterMap.Add("THAI CHARACTER THO THAHAN", 3607); - _unicodeCharacterMap.Add("THAI CHARACTER THO THONG", 3608); - _unicodeCharacterMap.Add("THAI CHARACTER NO NU", 3609); - _unicodeCharacterMap.Add("THAI CHARACTER BO BAIMAI", 3610); - _unicodeCharacterMap.Add("THAI CHARACTER PO PLA", 3611); - _unicodeCharacterMap.Add("THAI CHARACTER PHO PHUNG", 3612); - _unicodeCharacterMap.Add("THAI CHARACTER FO FA", 3613); - _unicodeCharacterMap.Add("THAI CHARACTER PHO PHAN", 3614); - _unicodeCharacterMap.Add("THAI CHARACTER FO FAN", 3615); - _unicodeCharacterMap.Add("THAI CHARACTER PHO SAMPHAO", 3616); - _unicodeCharacterMap.Add("THAI CHARACTER MO MA", 3617); - _unicodeCharacterMap.Add("THAI CHARACTER YO YAK", 3618); - _unicodeCharacterMap.Add("THAI CHARACTER RO RUA", 3619); - _unicodeCharacterMap.Add("THAI CHARACTER RU", 3620); - _unicodeCharacterMap.Add("THAI CHARACTER LO LING", 3621); - _unicodeCharacterMap.Add("THAI CHARACTER LU", 3622); - _unicodeCharacterMap.Add("THAI CHARACTER WO WAEN", 3623); - _unicodeCharacterMap.Add("THAI CHARACTER SO SALA", 3624); - _unicodeCharacterMap.Add("THAI CHARACTER SO RUSI", 3625); - _unicodeCharacterMap.Add("THAI CHARACTER SO SUA", 3626); - _unicodeCharacterMap.Add("THAI CHARACTER HO HIP", 3627); - _unicodeCharacterMap.Add("THAI CHARACTER LO CHULA", 3628); - _unicodeCharacterMap.Add("THAI CHARACTER O ANG", 3629); - _unicodeCharacterMap.Add("THAI CHARACTER HO NOKHUK", 3630); - _unicodeCharacterMap.Add("THAI CHARACTER PAIYANNOI", 3631); - _unicodeCharacterMap.Add("THAI CHARACTER SARA A", 3632); - _unicodeCharacterMap.Add("THAI CHARACTER MAI HAN AKAT", 3633); - _unicodeCharacterMap.Add("THAI CHARACTER SARA AA", 3634); - _unicodeCharacterMap.Add("THAI CHARACTER SARA AM", 3635); - _unicodeCharacterMap.Add("THAI CHARACTER SARA I", 3636); - _unicodeCharacterMap.Add("THAI CHARACTER SARA II", 3637); - _unicodeCharacterMap.Add("THAI CHARACTER SARA UE", 3638); - _unicodeCharacterMap.Add("THAI CHARACTER SARA UEE", 3639); - _unicodeCharacterMap.Add("THAI CHARACTER SARA U", 3640); - _unicodeCharacterMap.Add("THAI CHARACTER SARA UU", 3641); - _unicodeCharacterMap.Add("THAI CHARACTER PHINTHU", 3642); - _unicodeCharacterMap.Add("THAI CURRENCY SYMBOL BAHT", 3647); - _unicodeCharacterMap.Add("THAI CHARACTER SARA E", 3648); - _unicodeCharacterMap.Add("THAI CHARACTER SARA AE", 3649); - _unicodeCharacterMap.Add("THAI CHARACTER SARA O", 3650); - _unicodeCharacterMap.Add("THAI CHARACTER SARA AI MAIMUAN", 3651); - _unicodeCharacterMap.Add("THAI CHARACTER SARA AI MAIMALAI", 3652); - _unicodeCharacterMap.Add("THAI CHARACTER LAKKHANGYAO", 3653); - _unicodeCharacterMap.Add("THAI CHARACTER MAIYAMOK", 3654); - _unicodeCharacterMap.Add("THAI CHARACTER MAITAIKHU", 3655); - _unicodeCharacterMap.Add("THAI CHARACTER MAI EK", 3656); - _unicodeCharacterMap.Add("THAI CHARACTER MAI THO", 3657); - _unicodeCharacterMap.Add("THAI CHARACTER MAI TRI", 3658); - _unicodeCharacterMap.Add("THAI CHARACTER MAI CHATTAWA", 3659); - _unicodeCharacterMap.Add("THAI CHARACTER THANTHAKHAT", 3660); - _unicodeCharacterMap.Add("THAI CHARACTER NIKHAHIT", 3661); - _unicodeCharacterMap.Add("THAI CHARACTER YAMAKKAN", 3662); - _unicodeCharacterMap.Add("THAI CHARACTER FONGMAN", 3663); - _unicodeCharacterMap.Add("THAI DIGIT ZERO", 3664); - _unicodeCharacterMap.Add("THAI DIGIT ONE", 3665); - _unicodeCharacterMap.Add("THAI DIGIT TWO", 3666); - _unicodeCharacterMap.Add("THAI DIGIT THREE", 3667); - _unicodeCharacterMap.Add("THAI DIGIT FOUR", 3668); - _unicodeCharacterMap.Add("THAI DIGIT FIVE", 3669); - _unicodeCharacterMap.Add("THAI DIGIT SIX", 3670); - _unicodeCharacterMap.Add("THAI DIGIT SEVEN", 3671); - _unicodeCharacterMap.Add("THAI DIGIT EIGHT", 3672); - _unicodeCharacterMap.Add("THAI DIGIT NINE", 3673); - _unicodeCharacterMap.Add("THAI CHARACTER ANGKHANKHU", 3674); - _unicodeCharacterMap.Add("THAI CHARACTER KHOMUT", 3675); - _unicodeCharacterMap.Add("LAO LETTER KO", 3713); - _unicodeCharacterMap.Add("LAO LETTER KHO SUNG", 3714); - _unicodeCharacterMap.Add("LAO LETTER KHO TAM", 3716); - _unicodeCharacterMap.Add("LAO LETTER NGO", 3719); - _unicodeCharacterMap.Add("LAO LETTER CO", 3720); - _unicodeCharacterMap.Add("LAO LETTER SO TAM", 3722); - _unicodeCharacterMap.Add("LAO LETTER NYO", 3725); - _unicodeCharacterMap.Add("LAO LETTER DO", 3732); - _unicodeCharacterMap.Add("LAO LETTER TO", 3733); - _unicodeCharacterMap.Add("LAO LETTER THO SUNG", 3734); - _unicodeCharacterMap.Add("LAO LETTER THO TAM", 3735); - _unicodeCharacterMap.Add("LAO LETTER NO", 3737); - _unicodeCharacterMap.Add("LAO LETTER BO", 3738); - _unicodeCharacterMap.Add("LAO LETTER PO", 3739); - _unicodeCharacterMap.Add("LAO LETTER PHO SUNG", 3740); - _unicodeCharacterMap.Add("LAO LETTER FO TAM", 3741); - _unicodeCharacterMap.Add("LAO LETTER PHO TAM", 3742); - _unicodeCharacterMap.Add("LAO LETTER FO SUNG", 3743); - _unicodeCharacterMap.Add("LAO LETTER MO", 3745); - _unicodeCharacterMap.Add("LAO LETTER YO", 3746); - _unicodeCharacterMap.Add("LAO LETTER LO LING", 3747); - _unicodeCharacterMap.Add("LAO LETTER LO LOOT", 3749); - _unicodeCharacterMap.Add("LAO LETTER WO", 3751); - _unicodeCharacterMap.Add("LAO LETTER SO SUNG", 3754); - _unicodeCharacterMap.Add("LAO LETTER HO SUNG", 3755); - _unicodeCharacterMap.Add("LAO LETTER O", 3757); - _unicodeCharacterMap.Add("LAO LETTER HO TAM", 3758); - _unicodeCharacterMap.Add("LAO ELLIPSIS", 3759); - _unicodeCharacterMap.Add("LAO VOWEL SIGN A", 3760); - _unicodeCharacterMap.Add("LAO VOWEL SIGN MAI KAN", 3761); - _unicodeCharacterMap.Add("LAO VOWEL SIGN AA", 3762); - _unicodeCharacterMap.Add("LAO VOWEL SIGN AM", 3763); - _unicodeCharacterMap.Add("LAO VOWEL SIGN I", 3764); - _unicodeCharacterMap.Add("LAO VOWEL SIGN II", 3765); - _unicodeCharacterMap.Add("LAO VOWEL SIGN Y", 3766); - _unicodeCharacterMap.Add("LAO VOWEL SIGN YY", 3767); - _unicodeCharacterMap.Add("LAO VOWEL SIGN U", 3768); - _unicodeCharacterMap.Add("LAO VOWEL SIGN UU", 3769); - _unicodeCharacterMap.Add("LAO VOWEL SIGN MAI KON", 3771); - _unicodeCharacterMap.Add("LAO SEMIVOWEL SIGN LO", 3772); - _unicodeCharacterMap.Add("LAO SEMIVOWEL SIGN NYO", 3773); - _unicodeCharacterMap.Add("LAO VOWEL SIGN E", 3776); - _unicodeCharacterMap.Add("LAO VOWEL SIGN EI", 3777); - _unicodeCharacterMap.Add("LAO VOWEL SIGN O", 3778); - _unicodeCharacterMap.Add("LAO VOWEL SIGN AY", 3779); - _unicodeCharacterMap.Add("LAO VOWEL SIGN AI", 3780); - _unicodeCharacterMap.Add("LAO KO LA", 3782); - _unicodeCharacterMap.Add("LAO TONE MAI EK", 3784); - _unicodeCharacterMap.Add("LAO TONE MAI THO", 3785); - _unicodeCharacterMap.Add("LAO TONE MAI TI", 3786); - _unicodeCharacterMap.Add("LAO TONE MAI CATAWA", 3787); - _unicodeCharacterMap.Add("LAO CANCELLATION MARK", 3788); - _unicodeCharacterMap.Add("LAO NIGGAHITA", 3789); - _unicodeCharacterMap.Add("LAO DIGIT ZERO", 3792); - _unicodeCharacterMap.Add("LAO DIGIT ONE", 3793); - _unicodeCharacterMap.Add("LAO DIGIT TWO", 3794); - _unicodeCharacterMap.Add("LAO DIGIT THREE", 3795); - _unicodeCharacterMap.Add("LAO DIGIT FOUR", 3796); - _unicodeCharacterMap.Add("LAO DIGIT FIVE", 3797); - _unicodeCharacterMap.Add("LAO DIGIT SIX", 3798); - _unicodeCharacterMap.Add("LAO DIGIT SEVEN", 3799); - _unicodeCharacterMap.Add("LAO DIGIT EIGHT", 3800); - _unicodeCharacterMap.Add("LAO DIGIT NINE", 3801); - _unicodeCharacterMap.Add("LAO HO NO", 3804); - _unicodeCharacterMap.Add("LAO HO MO", 3805); - _unicodeCharacterMap.Add("LAO LETTER KHMU GO", 3806); - _unicodeCharacterMap.Add("LAO LETTER KHMU NYO", 3807); - _unicodeCharacterMap.Add("TIBETAN SYLLABLE OM", 3840); - _unicodeCharacterMap.Add("TIBETAN MARK GTER YIG MGO TRUNCATED A", 3841); - _unicodeCharacterMap.Add("TIBETAN MARK GTER YIG MGO UM RNAM BCAD MA", 3842); - _unicodeCharacterMap.Add("TIBETAN MARK GTER YIG MGO UM GTER TSHEG MA", 3843); - _unicodeCharacterMap.Add("TIBETAN MARK INITIAL YIG MGO MDUN MA", 3844); - _unicodeCharacterMap.Add("TIBETAN MARK CLOSING YIG MGO SGAB MA", 3845); - _unicodeCharacterMap.Add("TIBETAN MARK CARET YIG MGO PHUR SHAD MA", 3846); - _unicodeCharacterMap.Add("TIBETAN MARK YIG MGO TSHEG SHAD MA", 3847); - _unicodeCharacterMap.Add("TIBETAN MARK SBRUL SHAD", 3848); - _unicodeCharacterMap.Add("TIBETAN MARK BSKUR YIG MGO", 3849); - _unicodeCharacterMap.Add("TIBETAN MARK BKA SHOG YIG MGO", 3850); - _unicodeCharacterMap.Add("TIBETAN MARK INTERSYLLABIC TSHEG", 3851); - _unicodeCharacterMap.Add("TIBETAN MARK DELIMITER TSHEG BSTAR", 3852); - _unicodeCharacterMap.Add("TIBETAN MARK SHAD", 3853); - _unicodeCharacterMap.Add("TIBETAN MARK NYIS SHAD", 3854); - _unicodeCharacterMap.Add("TIBETAN MARK TSHEG SHAD", 3855); - _unicodeCharacterMap.Add("TIBETAN MARK NYIS TSHEG SHAD", 3856); - _unicodeCharacterMap.Add("TIBETAN MARK RIN CHEN SPUNGS SHAD", 3857); - _unicodeCharacterMap.Add("TIBETAN MARK RGYA GRAM SHAD", 3858); - _unicodeCharacterMap.Add("TIBETAN MARK CARET DZUD RTAGS ME LONG CAN", 3859); - _unicodeCharacterMap.Add("TIBETAN MARK GTER TSHEG", 3860); - _unicodeCharacterMap.Add("TIBETAN LOGOTYPE SIGN CHAD RTAGS", 3861); - _unicodeCharacterMap.Add("TIBETAN LOGOTYPE SIGN LHAG RTAGS", 3862); - _unicodeCharacterMap.Add("TIBETAN ASTROLOGICAL SIGN SGRA GCAN CHAR RTAGS", 3863); - _unicodeCharacterMap.Add("TIBETAN ASTROLOGICAL SIGN KHYUD PA", 3864); - _unicodeCharacterMap.Add("TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS", 3865); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL DKAR GCIG", 3866); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL DKAR GNYIS", 3867); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL DKAR GSUM", 3868); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL NAG GCIG", 3869); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL NAG GNYIS", 3870); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL DKAR RDEL NAG", 3871); - _unicodeCharacterMap.Add("TIBETAN DIGIT ZERO", 3872); - _unicodeCharacterMap.Add("TIBETAN DIGIT ONE", 3873); - _unicodeCharacterMap.Add("TIBETAN DIGIT TWO", 3874); - _unicodeCharacterMap.Add("TIBETAN DIGIT THREE", 3875); - _unicodeCharacterMap.Add("TIBETAN DIGIT FOUR", 3876); - _unicodeCharacterMap.Add("TIBETAN DIGIT FIVE", 3877); - _unicodeCharacterMap.Add("TIBETAN DIGIT SIX", 3878); - _unicodeCharacterMap.Add("TIBETAN DIGIT SEVEN", 3879); - _unicodeCharacterMap.Add("TIBETAN DIGIT EIGHT", 3880); - _unicodeCharacterMap.Add("TIBETAN DIGIT NINE", 3881); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF ONE", 3882); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF TWO", 3883); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF THREE", 3884); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF FOUR", 3885); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF FIVE", 3886); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF SIX", 3887); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF SEVEN", 3888); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF EIGHT", 3889); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF NINE", 3890); - _unicodeCharacterMap.Add("TIBETAN DIGIT HALF ZERO", 3891); - _unicodeCharacterMap.Add("TIBETAN MARK BSDUS RTAGS", 3892); - _unicodeCharacterMap.Add("TIBETAN MARK NGAS BZUNG NYI ZLA", 3893); - _unicodeCharacterMap.Add("TIBETAN MARK CARET DZUD RTAGS BZHI MIG CAN", 3894); - _unicodeCharacterMap.Add("TIBETAN MARK NGAS BZUNG SGOR RTAGS", 3895); - _unicodeCharacterMap.Add("TIBETAN MARK CHE MGO", 3896); - _unicodeCharacterMap.Add("TIBETAN MARK TSA PHRU", 3897); - _unicodeCharacterMap.Add("TIBETAN MARK GUG RTAGS GYON", 3898); - _unicodeCharacterMap.Add("TIBETAN MARK GUG RTAGS GYAS", 3899); - _unicodeCharacterMap.Add("TIBETAN MARK ANG KHANG GYON", 3900); - _unicodeCharacterMap.Add("TIBETAN MARK ANG KHANG GYAS", 3901); - _unicodeCharacterMap.Add("TIBETAN SIGN YAR TSHES", 3902); - _unicodeCharacterMap.Add("TIBETAN SIGN MAR TSHES", 3903); - _unicodeCharacterMap.Add("TIBETAN LETTER KA", 3904); - _unicodeCharacterMap.Add("TIBETAN LETTER KHA", 3905); - _unicodeCharacterMap.Add("TIBETAN LETTER GA", 3906); - _unicodeCharacterMap.Add("TIBETAN LETTER GHA", 3907); - _unicodeCharacterMap.Add("TIBETAN LETTER NGA", 3908); - _unicodeCharacterMap.Add("TIBETAN LETTER CA", 3909); - _unicodeCharacterMap.Add("TIBETAN LETTER CHA", 3910); - _unicodeCharacterMap.Add("TIBETAN LETTER JA", 3911); - _unicodeCharacterMap.Add("TIBETAN LETTER NYA", 3913); - _unicodeCharacterMap.Add("TIBETAN LETTER TTA", 3914); - _unicodeCharacterMap.Add("TIBETAN LETTER TTHA", 3915); - _unicodeCharacterMap.Add("TIBETAN LETTER DDA", 3916); - _unicodeCharacterMap.Add("TIBETAN LETTER DDHA", 3917); - _unicodeCharacterMap.Add("TIBETAN LETTER NNA", 3918); - _unicodeCharacterMap.Add("TIBETAN LETTER TA", 3919); - _unicodeCharacterMap.Add("TIBETAN LETTER THA", 3920); - _unicodeCharacterMap.Add("TIBETAN LETTER DA", 3921); - _unicodeCharacterMap.Add("TIBETAN LETTER DHA", 3922); - _unicodeCharacterMap.Add("TIBETAN LETTER NA", 3923); - _unicodeCharacterMap.Add("TIBETAN LETTER PA", 3924); - _unicodeCharacterMap.Add("TIBETAN LETTER PHA", 3925); - _unicodeCharacterMap.Add("TIBETAN LETTER BA", 3926); - _unicodeCharacterMap.Add("TIBETAN LETTER BHA", 3927); - _unicodeCharacterMap.Add("TIBETAN LETTER MA", 3928); - _unicodeCharacterMap.Add("TIBETAN LETTER TSA", 3929); - _unicodeCharacterMap.Add("TIBETAN LETTER TSHA", 3930); - _unicodeCharacterMap.Add("TIBETAN LETTER DZA", 3931); - _unicodeCharacterMap.Add("TIBETAN LETTER DZHA", 3932); - _unicodeCharacterMap.Add("TIBETAN LETTER WA", 3933); - _unicodeCharacterMap.Add("TIBETAN LETTER ZHA", 3934); - _unicodeCharacterMap.Add("TIBETAN LETTER ZA", 3935); - _unicodeCharacterMap.Add("TIBETAN LETTER A", 3936); - _unicodeCharacterMap.Add("TIBETAN LETTER YA", 3937); - _unicodeCharacterMap.Add("TIBETAN LETTER RA", 3938); - _unicodeCharacterMap.Add("TIBETAN LETTER LA", 3939); - _unicodeCharacterMap.Add("TIBETAN LETTER SHA", 3940); - _unicodeCharacterMap.Add("TIBETAN LETTER SSA", 3941); - _unicodeCharacterMap.Add("TIBETAN LETTER SA", 3942); - _unicodeCharacterMap.Add("TIBETAN LETTER HA", 3943); - _unicodeCharacterMap.Add("TIBETAN LETTER A", 3944); - _unicodeCharacterMap.Add("TIBETAN LETTER KSSA", 3945); - _unicodeCharacterMap.Add("TIBETAN LETTER FIXED FORM RA", 3946); - _unicodeCharacterMap.Add("TIBETAN LETTER KKA", 3947); - _unicodeCharacterMap.Add("TIBETAN LETTER RRA", 3948); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN AA", 3953); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN I", 3954); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN II", 3955); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN U", 3956); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN UU", 3957); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN VOCALIC R", 3958); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN VOCALIC RR", 3959); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN VOCALIC L", 3960); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN VOCALIC LL", 3961); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN E", 3962); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN EE", 3963); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN O", 3964); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN OO", 3965); - _unicodeCharacterMap.Add("TIBETAN SIGN RJES SU NGA RO", 3966); - _unicodeCharacterMap.Add("TIBETAN SIGN RNAM BCAD", 3967); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN REVERSED I", 3968); - _unicodeCharacterMap.Add("TIBETAN VOWEL SIGN REVERSED II", 3969); - _unicodeCharacterMap.Add("TIBETAN SIGN NYI ZLA NAA DA", 3970); - _unicodeCharacterMap.Add("TIBETAN SIGN SNA LDAN", 3971); - _unicodeCharacterMap.Add("TIBETAN MARK HALANTA", 3972); - _unicodeCharacterMap.Add("TIBETAN MARK PALUTA", 3973); - _unicodeCharacterMap.Add("TIBETAN SIGN LCI RTAGS", 3974); - _unicodeCharacterMap.Add("TIBETAN SIGN YANG RTAGS", 3975); - _unicodeCharacterMap.Add("TIBETAN SIGN LCE TSA CAN", 3976); - _unicodeCharacterMap.Add("TIBETAN SIGN MCHU CAN", 3977); - _unicodeCharacterMap.Add("TIBETAN SIGN GRU CAN RGYINGS", 3978); - _unicodeCharacterMap.Add("TIBETAN SIGN GRU MED RGYINGS", 3979); - _unicodeCharacterMap.Add("TIBETAN SIGN INVERTED MCHU CAN", 3980); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED SIGN LCE TSA CAN", 3981); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED SIGN MCHU CAN", 3982); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED SIGN INVERTED MCHU CAN", 3983); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER KA", 3984); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER KHA", 3985); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER GA", 3986); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER GHA", 3987); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER NGA", 3988); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER CA", 3989); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER CHA", 3990); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER JA", 3991); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER NYA", 3993); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER TTA", 3994); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER TTHA", 3995); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER DDA", 3996); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER DDHA", 3997); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER NNA", 3998); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER TA", 3999); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER THA", 4000); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER DA", 4001); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER DHA", 4002); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER NA", 4003); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER PA", 4004); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER PHA", 4005); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER BA", 4006); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER BHA", 4007); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER MA", 4008); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER TSA", 4009); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER TSHA", 4010); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER DZA", 4011); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER DZHA", 4012); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER WA", 4013); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER ZHA", 4014); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER ZA", 4015); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER A", 4016); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER YA", 4017); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER RA", 4018); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER LA", 4019); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER SHA", 4020); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER SSA", 4021); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER SA", 4022); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER HA", 4023); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER A", 4024); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER KSSA", 4025); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER FIXED FORM WA", 4026); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER FIXED FORM YA", 4027); - _unicodeCharacterMap.Add("TIBETAN SUBJOINED LETTER FIXED FORM RA", 4028); - _unicodeCharacterMap.Add("TIBETAN KU RU KHA", 4030); - _unicodeCharacterMap.Add("TIBETAN KU RU KHA BZHI MIG CAN", 4031); - _unicodeCharacterMap.Add("TIBETAN CANTILLATION SIGN HEAVY BEAT", 4032); - _unicodeCharacterMap.Add("TIBETAN CANTILLATION SIGN LIGHT BEAT", 4033); - _unicodeCharacterMap.Add("TIBETAN CANTILLATION SIGN CANG TE U", 4034); - _unicodeCharacterMap.Add("TIBETAN CANTILLATION SIGN SBUB CHAL", 4035); - _unicodeCharacterMap.Add("TIBETAN SYMBOL DRIL BU", 4036); - _unicodeCharacterMap.Add("TIBETAN SYMBOL RDO RJE", 4037); - _unicodeCharacterMap.Add("TIBETAN SYMBOL PADMA GDAN", 4038); - _unicodeCharacterMap.Add("TIBETAN SYMBOL RDO RJE RGYA GRAM", 4039); - _unicodeCharacterMap.Add("TIBETAN SYMBOL PHUR PA", 4040); - _unicodeCharacterMap.Add("TIBETAN SYMBOL NOR BU", 4041); - _unicodeCharacterMap.Add("TIBETAN SYMBOL NOR BU NYIS KHYIL", 4042); - _unicodeCharacterMap.Add("TIBETAN SYMBOL NOR BU GSUM KHYIL", 4043); - _unicodeCharacterMap.Add("TIBETAN SYMBOL NOR BU BZHI KHYIL", 4044); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL NAG RDEL DKAR", 4046); - _unicodeCharacterMap.Add("TIBETAN SIGN RDEL NAG GSUM", 4047); - _unicodeCharacterMap.Add("TIBETAN MARK BSKA SHOG GI MGO RGYAN", 4048); - _unicodeCharacterMap.Add("TIBETAN MARK MNYAM YIG GI MGO RGYAN", 4049); - _unicodeCharacterMap.Add("TIBETAN MARK NYIS TSHEG", 4050); - _unicodeCharacterMap.Add("TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA", 4051); - _unicodeCharacterMap.Add("TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA", 4052); - _unicodeCharacterMap.Add("RIGHT FACING SVASTI SIGN", 4053); - _unicodeCharacterMap.Add("LEFT FACING SVASTI SIGN", 4054); - _unicodeCharacterMap.Add("RIGHT FACING SVASTI SIGN WITH DOTS", 4055); - _unicodeCharacterMap.Add("LEFT FACING SVASTI SIGN WITH DOTS", 4056); - _unicodeCharacterMap.Add("TIBETAN MARK LEADING MCHAN RTAGS", 4057); - _unicodeCharacterMap.Add("TIBETAN MARK TRAILING MCHAN RTAGS", 4058); - _unicodeCharacterMap.Add("MYANMAR LETTER KA", 4096); - _unicodeCharacterMap.Add("MYANMAR LETTER KHA", 4097); - _unicodeCharacterMap.Add("MYANMAR LETTER GA", 4098); - _unicodeCharacterMap.Add("MYANMAR LETTER GHA", 4099); - _unicodeCharacterMap.Add("MYANMAR LETTER NGA", 4100); - _unicodeCharacterMap.Add("MYANMAR LETTER CA", 4101); - _unicodeCharacterMap.Add("MYANMAR LETTER CHA", 4102); - _unicodeCharacterMap.Add("MYANMAR LETTER JA", 4103); - _unicodeCharacterMap.Add("MYANMAR LETTER JHA", 4104); - _unicodeCharacterMap.Add("MYANMAR LETTER NYA", 4105); - _unicodeCharacterMap.Add("MYANMAR LETTER NNYA", 4106); - _unicodeCharacterMap.Add("MYANMAR LETTER TTA", 4107); - _unicodeCharacterMap.Add("MYANMAR LETTER TTHA", 4108); - _unicodeCharacterMap.Add("MYANMAR LETTER DDA", 4109); - _unicodeCharacterMap.Add("MYANMAR LETTER DDHA", 4110); - _unicodeCharacterMap.Add("MYANMAR LETTER NNA", 4111); - _unicodeCharacterMap.Add("MYANMAR LETTER TA", 4112); - _unicodeCharacterMap.Add("MYANMAR LETTER THA", 4113); - _unicodeCharacterMap.Add("MYANMAR LETTER DA", 4114); - _unicodeCharacterMap.Add("MYANMAR LETTER DHA", 4115); - _unicodeCharacterMap.Add("MYANMAR LETTER NA", 4116); - _unicodeCharacterMap.Add("MYANMAR LETTER PA", 4117); - _unicodeCharacterMap.Add("MYANMAR LETTER PHA", 4118); - _unicodeCharacterMap.Add("MYANMAR LETTER BA", 4119); - _unicodeCharacterMap.Add("MYANMAR LETTER BHA", 4120); - _unicodeCharacterMap.Add("MYANMAR LETTER MA", 4121); - _unicodeCharacterMap.Add("MYANMAR LETTER YA", 4122); - _unicodeCharacterMap.Add("MYANMAR LETTER RA", 4123); - _unicodeCharacterMap.Add("MYANMAR LETTER LA", 4124); - _unicodeCharacterMap.Add("MYANMAR LETTER WA", 4125); - _unicodeCharacterMap.Add("MYANMAR LETTER SA", 4126); - _unicodeCharacterMap.Add("MYANMAR LETTER HA", 4127); - _unicodeCharacterMap.Add("MYANMAR LETTER LLA", 4128); - _unicodeCharacterMap.Add("MYANMAR LETTER A", 4129); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN A", 4130); - _unicodeCharacterMap.Add("MYANMAR LETTER I", 4131); - _unicodeCharacterMap.Add("MYANMAR LETTER II", 4132); - _unicodeCharacterMap.Add("MYANMAR LETTER U", 4133); - _unicodeCharacterMap.Add("MYANMAR LETTER UU", 4134); - _unicodeCharacterMap.Add("MYANMAR LETTER E", 4135); - _unicodeCharacterMap.Add("MYANMAR LETTER MON E", 4136); - _unicodeCharacterMap.Add("MYANMAR LETTER O", 4137); - _unicodeCharacterMap.Add("MYANMAR LETTER AU", 4138); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN TALL AA", 4139); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN AA", 4140); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN I", 4141); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN II", 4142); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN U", 4143); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN UU", 4144); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN E", 4145); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN AI", 4146); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN MON II", 4147); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN MON O", 4148); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN E ABOVE", 4149); - _unicodeCharacterMap.Add("MYANMAR SIGN ANUSVARA", 4150); - _unicodeCharacterMap.Add("MYANMAR SIGN DOT BELOW", 4151); - _unicodeCharacterMap.Add("MYANMAR SIGN VISARGA", 4152); - _unicodeCharacterMap.Add("MYANMAR SIGN VIRAMA", 4153); - _unicodeCharacterMap.Add("MYANMAR SIGN ASAT", 4154); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN MEDIAL YA", 4155); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN MEDIAL RA", 4156); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN MEDIAL WA", 4157); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN MEDIAL HA", 4158); - _unicodeCharacterMap.Add("MYANMAR LETTER GREAT SA", 4159); - _unicodeCharacterMap.Add("MYANMAR DIGIT ZERO", 4160); - _unicodeCharacterMap.Add("MYANMAR DIGIT ONE", 4161); - _unicodeCharacterMap.Add("MYANMAR DIGIT TWO", 4162); - _unicodeCharacterMap.Add("MYANMAR DIGIT THREE", 4163); - _unicodeCharacterMap.Add("MYANMAR DIGIT FOUR", 4164); - _unicodeCharacterMap.Add("MYANMAR DIGIT FIVE", 4165); - _unicodeCharacterMap.Add("MYANMAR DIGIT SIX", 4166); - _unicodeCharacterMap.Add("MYANMAR DIGIT SEVEN", 4167); - _unicodeCharacterMap.Add("MYANMAR DIGIT EIGHT", 4168); - _unicodeCharacterMap.Add("MYANMAR DIGIT NINE", 4169); - _unicodeCharacterMap.Add("MYANMAR SIGN LITTLE SECTION", 4170); - _unicodeCharacterMap.Add("MYANMAR SIGN SECTION", 4171); - _unicodeCharacterMap.Add("MYANMAR SYMBOL LOCATIVE", 4172); - _unicodeCharacterMap.Add("MYANMAR SYMBOL COMPLETED", 4173); - _unicodeCharacterMap.Add("MYANMAR SYMBOL AFOREMENTIONED", 4174); - _unicodeCharacterMap.Add("MYANMAR SYMBOL GENITIVE", 4175); - _unicodeCharacterMap.Add("MYANMAR LETTER SHA", 4176); - _unicodeCharacterMap.Add("MYANMAR LETTER SSA", 4177); - _unicodeCharacterMap.Add("MYANMAR LETTER VOCALIC R", 4178); - _unicodeCharacterMap.Add("MYANMAR LETTER VOCALIC RR", 4179); - _unicodeCharacterMap.Add("MYANMAR LETTER VOCALIC L", 4180); - _unicodeCharacterMap.Add("MYANMAR LETTER VOCALIC LL", 4181); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN VOCALIC R", 4182); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN VOCALIC RR", 4183); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN VOCALIC L", 4184); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN VOCALIC LL", 4185); - _unicodeCharacterMap.Add("MYANMAR LETTER MON NGA", 4186); - _unicodeCharacterMap.Add("MYANMAR LETTER MON JHA", 4187); - _unicodeCharacterMap.Add("MYANMAR LETTER MON BBA", 4188); - _unicodeCharacterMap.Add("MYANMAR LETTER MON BBE", 4189); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN MON MEDIAL NA", 4190); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN MON MEDIAL MA", 4191); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN MON MEDIAL LA", 4192); - _unicodeCharacterMap.Add("MYANMAR LETTER SGAW KAREN SHA", 4193); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN SGAW KAREN EU", 4194); - _unicodeCharacterMap.Add("MYANMAR TONE MARK SGAW KAREN HATHI", 4195); - _unicodeCharacterMap.Add("MYANMAR TONE MARK SGAW KAREN KE PHO", 4196); - _unicodeCharacterMap.Add("MYANMAR LETTER WESTERN PWO KAREN THA", 4197); - _unicodeCharacterMap.Add("MYANMAR LETTER WESTERN PWO KAREN PWA", 4198); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN WESTERN PWO KAREN EU", 4199); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN WESTERN PWO KAREN UE", 4200); - _unicodeCharacterMap.Add("MYANMAR SIGN WESTERN PWO KAREN TONE 1", 4201); - _unicodeCharacterMap.Add("MYANMAR SIGN WESTERN PWO KAREN TONE 2", 4202); - _unicodeCharacterMap.Add("MYANMAR SIGN WESTERN PWO KAREN TONE 3", 4203); - _unicodeCharacterMap.Add("MYANMAR SIGN WESTERN PWO KAREN TONE 4", 4204); - _unicodeCharacterMap.Add("MYANMAR SIGN WESTERN PWO KAREN TONE 5", 4205); - _unicodeCharacterMap.Add("MYANMAR LETTER EASTERN PWO KAREN NNA", 4206); - _unicodeCharacterMap.Add("MYANMAR LETTER EASTERN PWO KAREN YWA", 4207); - _unicodeCharacterMap.Add("MYANMAR LETTER EASTERN PWO KAREN GHWA", 4208); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN GEBA KAREN I", 4209); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN KAYAH OE", 4210); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN KAYAH U", 4211); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN KAYAH EE", 4212); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN KA", 4213); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN KHA", 4214); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN GA", 4215); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN CA", 4216); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN ZA", 4217); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN NYA", 4218); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN DA", 4219); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN NA", 4220); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN PHA", 4221); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN FA", 4222); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN BA", 4223); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN THA", 4224); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN HA", 4225); - _unicodeCharacterMap.Add("MYANMAR CONSONANT SIGN SHAN MEDIAL WA", 4226); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN SHAN AA", 4227); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN SHAN E", 4228); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN SHAN E ABOVE", 4229); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN SHAN FINAL Y", 4230); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN TONE 2", 4231); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN TONE 3", 4232); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN TONE 5", 4233); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN TONE 6", 4234); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN COUNCIL TONE 2", 4235); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN COUNCIL TONE 3", 4236); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE", 4237); - _unicodeCharacterMap.Add("MYANMAR LETTER RUMAI PALAUNG FA", 4238); - _unicodeCharacterMap.Add("MYANMAR SIGN RUMAI PALAUNG TONE 5", 4239); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT ZERO", 4240); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT ONE", 4241); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT TWO", 4242); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT THREE", 4243); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT FOUR", 4244); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT FIVE", 4245); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT SIX", 4246); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT SEVEN", 4247); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT EIGHT", 4248); - _unicodeCharacterMap.Add("MYANMAR SHAN DIGIT NINE", 4249); - _unicodeCharacterMap.Add("MYANMAR SIGN KHAMTI TONE 1", 4250); - _unicodeCharacterMap.Add("MYANMAR SIGN KHAMTI TONE 3", 4251); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN AITON A", 4252); - _unicodeCharacterMap.Add("MYANMAR VOWEL SIGN AITON AI", 4253); - _unicodeCharacterMap.Add("MYANMAR SYMBOL SHAN ONE", 4254); - _unicodeCharacterMap.Add("MYANMAR SYMBOL SHAN EXCLAMATION", 4255); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER AN", 4256); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER BAN", 4257); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER GAN", 4258); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER DON", 4259); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER EN", 4260); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER VIN", 4261); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER ZEN", 4262); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER TAN", 4263); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER IN", 4264); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER KAN", 4265); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER LAS", 4266); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER MAN", 4267); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER NAR", 4268); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER ON", 4269); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER PAR", 4270); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER ZHAR", 4271); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER RAE", 4272); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER SAN", 4273); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER TAR", 4274); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER UN", 4275); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER PHAR", 4276); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER KHAR", 4277); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER GHAN", 4278); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER QAR", 4279); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER SHIN", 4280); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER CHIN", 4281); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER CAN", 4282); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER JIL", 4283); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER CIL", 4284); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER CHAR", 4285); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER XAN", 4286); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER JHAN", 4287); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER HAE", 4288); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER HE", 4289); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER HIE", 4290); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER WE", 4291); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER HAR", 4292); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER HOE", 4293); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER YN", 4295); - _unicodeCharacterMap.Add("GEORGIAN CAPITAL LETTER AEN", 4301); - _unicodeCharacterMap.Add("GEORGIAN LETTER AN", 4304); - _unicodeCharacterMap.Add("GEORGIAN LETTER BAN", 4305); - _unicodeCharacterMap.Add("GEORGIAN LETTER GAN", 4306); - _unicodeCharacterMap.Add("GEORGIAN LETTER DON", 4307); - _unicodeCharacterMap.Add("GEORGIAN LETTER EN", 4308); - _unicodeCharacterMap.Add("GEORGIAN LETTER VIN", 4309); - _unicodeCharacterMap.Add("GEORGIAN LETTER ZEN", 4310); - _unicodeCharacterMap.Add("GEORGIAN LETTER TAN", 4311); - _unicodeCharacterMap.Add("GEORGIAN LETTER IN", 4312); - _unicodeCharacterMap.Add("GEORGIAN LETTER KAN", 4313); - _unicodeCharacterMap.Add("GEORGIAN LETTER LAS", 4314); - _unicodeCharacterMap.Add("GEORGIAN LETTER MAN", 4315); - _unicodeCharacterMap.Add("GEORGIAN LETTER NAR", 4316); - _unicodeCharacterMap.Add("GEORGIAN LETTER ON", 4317); - _unicodeCharacterMap.Add("GEORGIAN LETTER PAR", 4318); - _unicodeCharacterMap.Add("GEORGIAN LETTER ZHAR", 4319); - _unicodeCharacterMap.Add("GEORGIAN LETTER RAE", 4320); - _unicodeCharacterMap.Add("GEORGIAN LETTER SAN", 4321); - _unicodeCharacterMap.Add("GEORGIAN LETTER TAR", 4322); - _unicodeCharacterMap.Add("GEORGIAN LETTER UN", 4323); - _unicodeCharacterMap.Add("GEORGIAN LETTER PHAR", 4324); - _unicodeCharacterMap.Add("GEORGIAN LETTER KHAR", 4325); - _unicodeCharacterMap.Add("GEORGIAN LETTER GHAN", 4326); - _unicodeCharacterMap.Add("GEORGIAN LETTER QAR", 4327); - _unicodeCharacterMap.Add("GEORGIAN LETTER SHIN", 4328); - _unicodeCharacterMap.Add("GEORGIAN LETTER CHIN", 4329); - _unicodeCharacterMap.Add("GEORGIAN LETTER CAN", 4330); - _unicodeCharacterMap.Add("GEORGIAN LETTER JIL", 4331); - _unicodeCharacterMap.Add("GEORGIAN LETTER CIL", 4332); - _unicodeCharacterMap.Add("GEORGIAN LETTER CHAR", 4333); - _unicodeCharacterMap.Add("GEORGIAN LETTER XAN", 4334); - _unicodeCharacterMap.Add("GEORGIAN LETTER JHAN", 4335); - _unicodeCharacterMap.Add("GEORGIAN LETTER HAE", 4336); - _unicodeCharacterMap.Add("GEORGIAN LETTER HE", 4337); - _unicodeCharacterMap.Add("GEORGIAN LETTER HIE", 4338); - _unicodeCharacterMap.Add("GEORGIAN LETTER WE", 4339); - _unicodeCharacterMap.Add("GEORGIAN LETTER HAR", 4340); - _unicodeCharacterMap.Add("GEORGIAN LETTER HOE", 4341); - _unicodeCharacterMap.Add("GEORGIAN LETTER FI", 4342); - _unicodeCharacterMap.Add("GEORGIAN LETTER YN", 4343); - _unicodeCharacterMap.Add("GEORGIAN LETTER ELIFI", 4344); - _unicodeCharacterMap.Add("GEORGIAN LETTER TURNED GAN", 4345); - _unicodeCharacterMap.Add("GEORGIAN LETTER AIN", 4346); - _unicodeCharacterMap.Add("GEORGIAN PARAGRAPH SEPARATOR", 4347); - _unicodeCharacterMap.Add("MODIFIER LETTER GEORGIAN NAR", 4348); - _unicodeCharacterMap.Add("GEORGIAN LETTER AEN", 4349); - _unicodeCharacterMap.Add("GEORGIAN LETTER HARD SIGN", 4350); - _unicodeCharacterMap.Add("GEORGIAN LETTER LABIAL SIGN", 4351); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KIYEOK", 4352); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGKIYEOK", 4353); - _unicodeCharacterMap.Add("HANGUL CHOSEONG NIEUN", 4354); - _unicodeCharacterMap.Add("HANGUL CHOSEONG TIKEUT", 4355); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGTIKEUT", 4356); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL", 4357); - _unicodeCharacterMap.Add("HANGUL CHOSEONG MIEUM", 4358); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP", 4359); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGPIEUP", 4360); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS", 4361); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGSIOS", 4362); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG", 4363); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CIEUC", 4364); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGCIEUC", 4365); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHIEUCH", 4366); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KHIEUKH", 4367); - _unicodeCharacterMap.Add("HANGUL CHOSEONG THIEUTH", 4368); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PHIEUPH", 4369); - _unicodeCharacterMap.Add("HANGUL CHOSEONG HIEUH", 4370); - _unicodeCharacterMap.Add("HANGUL CHOSEONG NIEUN KIYEOK", 4371); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGNIEUN", 4372); - _unicodeCharacterMap.Add("HANGUL CHOSEONG NIEUN TIKEUT", 4373); - _unicodeCharacterMap.Add("HANGUL CHOSEONG NIEUN PIEUP", 4374); - _unicodeCharacterMap.Add("HANGUL CHOSEONG TIKEUT KIYEOK", 4375); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL NIEUN", 4376); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGRIEUL", 4377); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL HIEUH", 4378); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KAPYEOUNRIEUL", 4379); - _unicodeCharacterMap.Add("HANGUL CHOSEONG MIEUM PIEUP", 4380); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KAPYEOUNMIEUM", 4381); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP KIYEOK", 4382); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP NIEUN", 4383); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP TIKEUT", 4384); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP SIOS", 4385); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP SIOS KIYEOK", 4386); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP SIOS TIKEUT", 4387); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP SIOS PIEUP", 4388); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP SSANGSIOS", 4389); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP SIOS CIEUC", 4390); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP CIEUC", 4391); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP CHIEUCH", 4392); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP THIEUTH", 4393); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP PHIEUPH", 4394); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KAPYEOUNPIEUP", 4395); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KAPYEOUNSSANGPIEUP", 4396); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS KIYEOK", 4397); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS NIEUN", 4398); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS TIKEUT", 4399); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS RIEUL", 4400); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS MIEUM", 4401); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS PIEUP", 4402); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS PIEUP KIYEOK", 4403); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS SSANGSIOS", 4404); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS IEUNG", 4405); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS CIEUC", 4406); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS CHIEUCH", 4407); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS KHIEUKH", 4408); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS THIEUTH", 4409); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS PHIEUPH", 4410); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SIOS HIEUH", 4411); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHITUEUMSIOS", 4412); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHITUEUMSSANGSIOS", 4413); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CEONGCHIEUMSIOS", 4414); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS", 4415); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PANSIOS", 4416); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG KIYEOK", 4417); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG TIKEUT", 4418); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG MIEUM", 4419); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG PIEUP", 4420); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG SIOS", 4421); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG PANSIOS", 4422); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGIEUNG", 4423); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG CIEUC", 4424); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG CHIEUCH", 4425); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG THIEUTH", 4426); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG PHIEUPH", 4427); - _unicodeCharacterMap.Add("HANGUL CHOSEONG YESIEUNG", 4428); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CIEUC IEUNG", 4429); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHITUEUMCIEUC", 4430); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHITUEUMSSANGCIEUC", 4431); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CEONGCHIEUMCIEUC", 4432); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC", 4433); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHIEUCH KHIEUKH", 4434); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHIEUCH HIEUH", 4435); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CHITUEUMCHIEUCH", 4436); - _unicodeCharacterMap.Add("HANGUL CHOSEONG CEONGCHIEUMCHIEUCH", 4437); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PHIEUPH PIEUP", 4438); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KAPYEOUNPHIEUPH", 4439); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGHIEUH", 4440); - _unicodeCharacterMap.Add("HANGUL CHOSEONG YEORINHIEUH", 4441); - _unicodeCharacterMap.Add("HANGUL CHOSEONG KIYEOK TIKEUT", 4442); - _unicodeCharacterMap.Add("HANGUL CHOSEONG NIEUN SIOS", 4443); - _unicodeCharacterMap.Add("HANGUL CHOSEONG NIEUN CIEUC", 4444); - _unicodeCharacterMap.Add("HANGUL CHOSEONG NIEUN HIEUH", 4445); - _unicodeCharacterMap.Add("HANGUL CHOSEONG TIKEUT RIEUL", 4446); - _unicodeCharacterMap.Add("HANGUL CHOSEONG FILLER", 4447); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG FILLER", 4448); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG A", 4449); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG AE", 4450); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YA", 4451); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YAE", 4452); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EO", 4453); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG E", 4454); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YEO", 4455); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YE", 4456); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O", 4457); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG WA", 4458); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG WAE", 4459); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG OE", 4460); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO", 4461); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U", 4462); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG WEO", 4463); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG WE", 4464); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG WI", 4465); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU", 4466); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EU", 4467); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YI", 4468); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I", 4469); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG A O", 4470); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG A U", 4471); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YA O", 4472); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YA YO", 4473); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EO O", 4474); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EO U", 4475); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EO EU", 4476); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YEO O", 4477); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YEO U", 4478); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O EO", 4479); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O E", 4480); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O YE", 4481); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O O", 4482); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O U", 4483); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO YA", 4484); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO YAE", 4485); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO YEO", 4486); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO O", 4487); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO I", 4488); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U A", 4489); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U AE", 4490); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U EO EU", 4491); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U YE", 4492); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U U", 4493); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU A", 4494); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU EO", 4495); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU E", 4496); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU YEO", 4497); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU YE", 4498); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU U", 4499); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU I", 4500); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EU U", 4501); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EU EU", 4502); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YI U", 4503); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I A", 4504); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I YA", 4505); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I O", 4506); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I U", 4507); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I EU", 4508); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I ARAEA", 4509); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG ARAEA", 4510); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG ARAEA EO", 4511); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG ARAEA U", 4512); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG ARAEA I", 4513); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG SSANGARAEA", 4514); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG A EU", 4515); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YA U", 4516); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YEO YA", 4517); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O YA", 4518); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O YAE", 4519); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK", 4520); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGKIYEOK", 4521); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK SIOS", 4522); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN", 4523); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN CIEUC", 4524); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN HIEUH", 4525); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT", 4526); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL", 4527); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL KIYEOK", 4528); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL MIEUM", 4529); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL PIEUP", 4530); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL SIOS", 4531); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL THIEUTH", 4532); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL PHIEUPH", 4533); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL HIEUH", 4534); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM", 4535); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP", 4536); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP SIOS", 4537); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS", 4538); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGSIOS", 4539); - _unicodeCharacterMap.Add("HANGUL JONGSEONG IEUNG", 4540); - _unicodeCharacterMap.Add("HANGUL JONGSEONG CIEUC", 4541); - _unicodeCharacterMap.Add("HANGUL JONGSEONG CHIEUCH", 4542); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KHIEUKH", 4543); - _unicodeCharacterMap.Add("HANGUL JONGSEONG THIEUTH", 4544); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PHIEUPH", 4545); - _unicodeCharacterMap.Add("HANGUL JONGSEONG HIEUH", 4546); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK RIEUL", 4547); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK SIOS KIYEOK", 4548); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN KIYEOK", 4549); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN TIKEUT", 4550); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN SIOS", 4551); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN PANSIOS", 4552); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN THIEUTH", 4553); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT KIYEOK", 4554); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT RIEUL", 4555); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL KIYEOK SIOS", 4556); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL NIEUN", 4557); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL TIKEUT", 4558); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL TIKEUT HIEUH", 4559); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGRIEUL", 4560); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL MIEUM KIYEOK", 4561); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL MIEUM SIOS", 4562); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL PIEUP SIOS", 4563); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL PIEUP HIEUH", 4564); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL KAPYEOUNPIEUP", 4565); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL SSANGSIOS", 4566); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL PANSIOS", 4567); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL KHIEUKH", 4568); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL YEORINHIEUH", 4569); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM KIYEOK", 4570); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM RIEUL", 4571); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM PIEUP", 4572); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM SIOS", 4573); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM SSANGSIOS", 4574); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM PANSIOS", 4575); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM CHIEUCH", 4576); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM HIEUH", 4577); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KAPYEOUNMIEUM", 4578); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP RIEUL", 4579); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP PHIEUPH", 4580); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP HIEUH", 4581); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KAPYEOUNPIEUP", 4582); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS KIYEOK", 4583); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS TIKEUT", 4584); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS RIEUL", 4585); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS PIEUP", 4586); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PANSIOS", 4587); - _unicodeCharacterMap.Add("HANGUL JONGSEONG IEUNG KIYEOK", 4588); - _unicodeCharacterMap.Add("HANGUL JONGSEONG IEUNG SSANGKIYEOK", 4589); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGIEUNG", 4590); - _unicodeCharacterMap.Add("HANGUL JONGSEONG IEUNG KHIEUKH", 4591); - _unicodeCharacterMap.Add("HANGUL JONGSEONG YESIEUNG", 4592); - _unicodeCharacterMap.Add("HANGUL JONGSEONG YESIEUNG SIOS", 4593); - _unicodeCharacterMap.Add("HANGUL JONGSEONG YESIEUNG PANSIOS", 4594); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PHIEUPH PIEUP", 4595); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KAPYEOUNPHIEUPH", 4596); - _unicodeCharacterMap.Add("HANGUL JONGSEONG HIEUH NIEUN", 4597); - _unicodeCharacterMap.Add("HANGUL JONGSEONG HIEUH RIEUL", 4598); - _unicodeCharacterMap.Add("HANGUL JONGSEONG HIEUH MIEUM", 4599); - _unicodeCharacterMap.Add("HANGUL JONGSEONG HIEUH PIEUP", 4600); - _unicodeCharacterMap.Add("HANGUL JONGSEONG YEORINHIEUH", 4601); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK NIEUN", 4602); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK PIEUP", 4603); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK CHIEUCH", 4604); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK KHIEUKH", 4605); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KIYEOK HIEUH", 4606); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGNIEUN", 4607); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HA", 4608); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HU", 4609); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HI", 4610); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HAA", 4611); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HEE", 4612); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HE", 4613); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HO", 4614); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HOA", 4615); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LA", 4616); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LU", 4617); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LI", 4618); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LAA", 4619); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LEE", 4620); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LE", 4621); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LO", 4622); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LWA", 4623); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHA", 4624); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHU", 4625); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHI", 4626); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHAA", 4627); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHEE", 4628); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHE", 4629); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHO", 4630); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE HHWA", 4631); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MA", 4632); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MU", 4633); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MI", 4634); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MAA", 4635); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MEE", 4636); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ME", 4637); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MO", 4638); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MWA", 4639); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZA", 4640); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZU", 4641); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZI", 4642); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZAA", 4643); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZEE", 4644); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZE", 4645); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZO", 4646); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SZWA", 4647); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RA", 4648); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RU", 4649); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RI", 4650); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RAA", 4651); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE REE", 4652); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RE", 4653); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RO", 4654); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RWA", 4655); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SA", 4656); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SU", 4657); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SI", 4658); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SAA", 4659); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SEE", 4660); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SE", 4661); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SO", 4662); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SWA", 4663); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHA", 4664); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHU", 4665); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHI", 4666); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHAA", 4667); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHEE", 4668); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHE", 4669); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHO", 4670); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHWA", 4671); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QA", 4672); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QU", 4673); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QI", 4674); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QAA", 4675); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QEE", 4676); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QE", 4677); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QO", 4678); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QOA", 4679); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QWA", 4680); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QWI", 4682); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QWAA", 4683); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QWEE", 4684); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QWE", 4685); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHA", 4688); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHU", 4689); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHI", 4690); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHAA", 4691); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHEE", 4692); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHE", 4693); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHO", 4694); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHWA", 4696); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHWI", 4698); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHWAA", 4699); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHWEE", 4700); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QHWE", 4701); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BA", 4704); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BU", 4705); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BI", 4706); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BAA", 4707); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BEE", 4708); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BE", 4709); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BO", 4710); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BWA", 4711); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VA", 4712); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VU", 4713); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VI", 4714); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VAA", 4715); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VEE", 4716); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VE", 4717); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VO", 4718); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE VWA", 4719); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TA", 4720); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TU", 4721); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TI", 4722); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TAA", 4723); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TEE", 4724); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TE", 4725); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TO", 4726); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TWA", 4727); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CA", 4728); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CU", 4729); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CI", 4730); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CAA", 4731); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CEE", 4732); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CE", 4733); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CO", 4734); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CWA", 4735); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XA", 4736); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XU", 4737); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XI", 4738); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XAA", 4739); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XEE", 4740); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XE", 4741); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XO", 4742); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XOA", 4743); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XWA", 4744); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XWI", 4746); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XWAA", 4747); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XWEE", 4748); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XWE", 4749); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NA", 4752); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NU", 4753); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NI", 4754); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NAA", 4755); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NEE", 4756); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NE", 4757); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NO", 4758); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NWA", 4759); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYA", 4760); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYU", 4761); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYI", 4762); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYAA", 4763); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYEE", 4764); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYE", 4765); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYO", 4766); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYWA", 4767); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL A", 4768); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL U", 4769); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL I", 4770); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL AA", 4771); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL EE", 4772); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL E", 4773); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL O", 4774); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL WA", 4775); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KA", 4776); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KU", 4777); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KI", 4778); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KAA", 4779); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KEE", 4780); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KE", 4781); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KO", 4782); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KOA", 4783); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KWA", 4784); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KWI", 4786); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KWAA", 4787); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KWEE", 4788); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KWE", 4789); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXA", 4792); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXU", 4793); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXI", 4794); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXAA", 4795); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXEE", 4796); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXE", 4797); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXO", 4798); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXWA", 4800); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXWI", 4802); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXWAA", 4803); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXWEE", 4804); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KXWE", 4805); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WA", 4808); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WU", 4809); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WI", 4810); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WAA", 4811); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WEE", 4812); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WE", 4813); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WO", 4814); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE WOA", 4815); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHARYNGEAL A", 4816); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHARYNGEAL U", 4817); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHARYNGEAL I", 4818); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHARYNGEAL AA", 4819); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHARYNGEAL EE", 4820); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHARYNGEAL E", 4821); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHARYNGEAL O", 4822); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZA", 4824); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZU", 4825); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZI", 4826); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZAA", 4827); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZEE", 4828); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZE", 4829); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZO", 4830); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZWA", 4831); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHA", 4832); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHU", 4833); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHI", 4834); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHAA", 4835); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHEE", 4836); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHE", 4837); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHO", 4838); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZHWA", 4839); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YA", 4840); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YU", 4841); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YI", 4842); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YAA", 4843); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YEE", 4844); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YE", 4845); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YO", 4846); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE YOA", 4847); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DA", 4848); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DU", 4849); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DI", 4850); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DAA", 4851); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DEE", 4852); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DE", 4853); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DO", 4854); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DWA", 4855); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDA", 4856); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDU", 4857); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDI", 4858); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDAA", 4859); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDEE", 4860); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDE", 4861); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDO", 4862); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDWA", 4863); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JA", 4864); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JU", 4865); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JI", 4866); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JAA", 4867); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JEE", 4868); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JE", 4869); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JO", 4870); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JWA", 4871); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GA", 4872); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GU", 4873); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GI", 4874); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GAA", 4875); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GEE", 4876); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GE", 4877); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GO", 4878); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GOA", 4879); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GWA", 4880); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GWI", 4882); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GWAA", 4883); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GWEE", 4884); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GWE", 4885); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGA", 4888); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGU", 4889); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGI", 4890); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGAA", 4891); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGEE", 4892); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGE", 4893); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGO", 4894); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGWAA", 4895); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THA", 4896); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THU", 4897); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THI", 4898); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THAA", 4899); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THEE", 4900); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THE", 4901); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THO", 4902); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THWA", 4903); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHA", 4904); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHU", 4905); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHI", 4906); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHAA", 4907); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHEE", 4908); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHE", 4909); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHO", 4910); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHWA", 4911); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHA", 4912); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHU", 4913); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHI", 4914); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHAA", 4915); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHEE", 4916); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHE", 4917); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHO", 4918); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHWA", 4919); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSA", 4920); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSU", 4921); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSI", 4922); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSAA", 4923); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSEE", 4924); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSE", 4925); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSO", 4926); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TSWA", 4927); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZA", 4928); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZU", 4929); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZI", 4930); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZAA", 4931); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZEE", 4932); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZE", 4933); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZO", 4934); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TZOA", 4935); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FA", 4936); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FU", 4937); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FI", 4938); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FAA", 4939); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FEE", 4940); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FE", 4941); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FO", 4942); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FWA", 4943); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PA", 4944); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PU", 4945); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PI", 4946); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PAA", 4947); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PEE", 4948); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PE", 4949); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PO", 4950); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PWA", 4951); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE RYA", 4952); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MYA", 4953); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FYA", 4954); - _unicodeCharacterMap.Add("ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK", 4957); - _unicodeCharacterMap.Add("ETHIOPIC COMBINING VOWEL LENGTH MARK", 4958); - _unicodeCharacterMap.Add("ETHIOPIC COMBINING GEMINATION MARK", 4959); - _unicodeCharacterMap.Add("ETHIOPIC SECTION MARK", 4960); - _unicodeCharacterMap.Add("ETHIOPIC WORDSPACE", 4961); - _unicodeCharacterMap.Add("ETHIOPIC FULL STOP", 4962); - _unicodeCharacterMap.Add("ETHIOPIC COMMA", 4963); - _unicodeCharacterMap.Add("ETHIOPIC SEMICOLON", 4964); - _unicodeCharacterMap.Add("ETHIOPIC COLON", 4965); - _unicodeCharacterMap.Add("ETHIOPIC PREFACE COLON", 4966); - _unicodeCharacterMap.Add("ETHIOPIC QUESTION MARK", 4967); - _unicodeCharacterMap.Add("ETHIOPIC PARAGRAPH SEPARATOR", 4968); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT ONE", 4969); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT TWO", 4970); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT THREE", 4971); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT FOUR", 4972); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT FIVE", 4973); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT SIX", 4974); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT SEVEN", 4975); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT EIGHT", 4976); - _unicodeCharacterMap.Add("ETHIOPIC DIGIT NINE", 4977); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER TEN", 4978); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER TWENTY", 4979); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER THIRTY", 4980); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER FORTY", 4981); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER FIFTY", 4982); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER SIXTY", 4983); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER SEVENTY", 4984); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER EIGHTY", 4985); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER NINETY", 4986); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER HUNDRED", 4987); - _unicodeCharacterMap.Add("ETHIOPIC NUMBER TEN THOUSAND", 4988); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SEBATBEIT MWA", 4992); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MWI", 4993); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MWEE", 4994); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MWE", 4995); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SEBATBEIT BWA", 4996); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BWI", 4997); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BWEE", 4998); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BWE", 4999); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SEBATBEIT FWA", 5000); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FWI", 5001); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FWEE", 5002); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE FWE", 5003); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SEBATBEIT PWA", 5004); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PWI", 5005); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PWEE", 5006); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PWE", 5007); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK YIZET", 5008); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK DERET", 5009); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK RIKRIK", 5010); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK SHORT RIKRIK", 5011); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK DIFAT", 5012); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK KENAT", 5013); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK CHIRET", 5014); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK HIDET", 5015); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK DERET HIDET", 5016); - _unicodeCharacterMap.Add("ETHIOPIC TONAL MARK KURT", 5017); - _unicodeCharacterMap.Add("CHEROKEE LETTER A", 5024); - _unicodeCharacterMap.Add("CHEROKEE LETTER E", 5025); - _unicodeCharacterMap.Add("CHEROKEE LETTER I", 5026); - _unicodeCharacterMap.Add("CHEROKEE LETTER O", 5027); - _unicodeCharacterMap.Add("CHEROKEE LETTER U", 5028); - _unicodeCharacterMap.Add("CHEROKEE LETTER V", 5029); - _unicodeCharacterMap.Add("CHEROKEE LETTER GA", 5030); - _unicodeCharacterMap.Add("CHEROKEE LETTER KA", 5031); - _unicodeCharacterMap.Add("CHEROKEE LETTER GE", 5032); - _unicodeCharacterMap.Add("CHEROKEE LETTER GI", 5033); - _unicodeCharacterMap.Add("CHEROKEE LETTER GO", 5034); - _unicodeCharacterMap.Add("CHEROKEE LETTER GU", 5035); - _unicodeCharacterMap.Add("CHEROKEE LETTER GV", 5036); - _unicodeCharacterMap.Add("CHEROKEE LETTER HA", 5037); - _unicodeCharacterMap.Add("CHEROKEE LETTER HE", 5038); - _unicodeCharacterMap.Add("CHEROKEE LETTER HI", 5039); - _unicodeCharacterMap.Add("CHEROKEE LETTER HO", 5040); - _unicodeCharacterMap.Add("CHEROKEE LETTER HU", 5041); - _unicodeCharacterMap.Add("CHEROKEE LETTER HV", 5042); - _unicodeCharacterMap.Add("CHEROKEE LETTER LA", 5043); - _unicodeCharacterMap.Add("CHEROKEE LETTER LE", 5044); - _unicodeCharacterMap.Add("CHEROKEE LETTER LI", 5045); - _unicodeCharacterMap.Add("CHEROKEE LETTER LO", 5046); - _unicodeCharacterMap.Add("CHEROKEE LETTER LU", 5047); - _unicodeCharacterMap.Add("CHEROKEE LETTER LV", 5048); - _unicodeCharacterMap.Add("CHEROKEE LETTER MA", 5049); - _unicodeCharacterMap.Add("CHEROKEE LETTER ME", 5050); - _unicodeCharacterMap.Add("CHEROKEE LETTER MI", 5051); - _unicodeCharacterMap.Add("CHEROKEE LETTER MO", 5052); - _unicodeCharacterMap.Add("CHEROKEE LETTER MU", 5053); - _unicodeCharacterMap.Add("CHEROKEE LETTER NA", 5054); - _unicodeCharacterMap.Add("CHEROKEE LETTER HNA", 5055); - _unicodeCharacterMap.Add("CHEROKEE LETTER NAH", 5056); - _unicodeCharacterMap.Add("CHEROKEE LETTER NE", 5057); - _unicodeCharacterMap.Add("CHEROKEE LETTER NI", 5058); - _unicodeCharacterMap.Add("CHEROKEE LETTER NO", 5059); - _unicodeCharacterMap.Add("CHEROKEE LETTER NU", 5060); - _unicodeCharacterMap.Add("CHEROKEE LETTER NV", 5061); - _unicodeCharacterMap.Add("CHEROKEE LETTER QUA", 5062); - _unicodeCharacterMap.Add("CHEROKEE LETTER QUE", 5063); - _unicodeCharacterMap.Add("CHEROKEE LETTER QUI", 5064); - _unicodeCharacterMap.Add("CHEROKEE LETTER QUO", 5065); - _unicodeCharacterMap.Add("CHEROKEE LETTER QUU", 5066); - _unicodeCharacterMap.Add("CHEROKEE LETTER QUV", 5067); - _unicodeCharacterMap.Add("CHEROKEE LETTER SA", 5068); - _unicodeCharacterMap.Add("CHEROKEE LETTER S", 5069); - _unicodeCharacterMap.Add("CHEROKEE LETTER SE", 5070); - _unicodeCharacterMap.Add("CHEROKEE LETTER SI", 5071); - _unicodeCharacterMap.Add("CHEROKEE LETTER SO", 5072); - _unicodeCharacterMap.Add("CHEROKEE LETTER SU", 5073); - _unicodeCharacterMap.Add("CHEROKEE LETTER SV", 5074); - _unicodeCharacterMap.Add("CHEROKEE LETTER DA", 5075); - _unicodeCharacterMap.Add("CHEROKEE LETTER TA", 5076); - _unicodeCharacterMap.Add("CHEROKEE LETTER DE", 5077); - _unicodeCharacterMap.Add("CHEROKEE LETTER TE", 5078); - _unicodeCharacterMap.Add("CHEROKEE LETTER DI", 5079); - _unicodeCharacterMap.Add("CHEROKEE LETTER TI", 5080); - _unicodeCharacterMap.Add("CHEROKEE LETTER DO", 5081); - _unicodeCharacterMap.Add("CHEROKEE LETTER DU", 5082); - _unicodeCharacterMap.Add("CHEROKEE LETTER DV", 5083); - _unicodeCharacterMap.Add("CHEROKEE LETTER DLA", 5084); - _unicodeCharacterMap.Add("CHEROKEE LETTER TLA", 5085); - _unicodeCharacterMap.Add("CHEROKEE LETTER TLE", 5086); - _unicodeCharacterMap.Add("CHEROKEE LETTER TLI", 5087); - _unicodeCharacterMap.Add("CHEROKEE LETTER TLO", 5088); - _unicodeCharacterMap.Add("CHEROKEE LETTER TLU", 5089); - _unicodeCharacterMap.Add("CHEROKEE LETTER TLV", 5090); - _unicodeCharacterMap.Add("CHEROKEE LETTER TSA", 5091); - _unicodeCharacterMap.Add("CHEROKEE LETTER TSE", 5092); - _unicodeCharacterMap.Add("CHEROKEE LETTER TSI", 5093); - _unicodeCharacterMap.Add("CHEROKEE LETTER TSO", 5094); - _unicodeCharacterMap.Add("CHEROKEE LETTER TSU", 5095); - _unicodeCharacterMap.Add("CHEROKEE LETTER TSV", 5096); - _unicodeCharacterMap.Add("CHEROKEE LETTER WA", 5097); - _unicodeCharacterMap.Add("CHEROKEE LETTER WE", 5098); - _unicodeCharacterMap.Add("CHEROKEE LETTER WI", 5099); - _unicodeCharacterMap.Add("CHEROKEE LETTER WO", 5100); - _unicodeCharacterMap.Add("CHEROKEE LETTER WU", 5101); - _unicodeCharacterMap.Add("CHEROKEE LETTER WV", 5102); - _unicodeCharacterMap.Add("CHEROKEE LETTER YA", 5103); - _unicodeCharacterMap.Add("CHEROKEE LETTER YE", 5104); - _unicodeCharacterMap.Add("CHEROKEE LETTER YI", 5105); - _unicodeCharacterMap.Add("CHEROKEE LETTER YO", 5106); - _unicodeCharacterMap.Add("CHEROKEE LETTER YU", 5107); - _unicodeCharacterMap.Add("CHEROKEE LETTER YV", 5108); - _unicodeCharacterMap.Add("CHEROKEE LETTER MV", 5109); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER YE", 5112); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER YI", 5113); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER YO", 5114); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER YU", 5115); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER YV", 5116); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER MV", 5117); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS HYPHEN", 5120); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS E", 5121); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS AAI", 5122); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS I", 5123); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS II", 5124); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS O", 5125); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OO", 5126); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE OO", 5127); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER EE", 5128); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER I", 5129); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS A", 5130); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS AA", 5131); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WE", 5132); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE WE", 5133); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WI", 5134); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE WI", 5135); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WII", 5136); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE WII", 5137); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WO", 5138); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE WO", 5139); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOO", 5140); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE WOO", 5141); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI WOO", 5142); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WA", 5143); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE WA", 5144); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WAA", 5145); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE WAA", 5146); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI WAA", 5147); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS AI", 5148); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE W", 5149); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS GLOTTAL STOP", 5150); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL ACUTE", 5151); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL GRAVE", 5152); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL BOTTOM HALF RING", 5153); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL TOP HALF RING", 5154); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL RIGHT HALF RING", 5155); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL RING", 5156); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL DOUBLE ACUTE", 5157); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES", 5158); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL MIDDLE DOT", 5159); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE", 5160); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL PLUS", 5161); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL DOWN TACK", 5162); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS EN", 5163); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS IN", 5164); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS ON", 5165); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS AN", 5166); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PE", 5167); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PAAI", 5168); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PI", 5169); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PII", 5170); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PO", 5171); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS POO", 5172); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE POO", 5173); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HEE", 5174); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HI", 5175); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PA", 5176); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PAA", 5177); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWE", 5178); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE PWE", 5179); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWI", 5180); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE PWI", 5181); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWII", 5182); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE PWII", 5183); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWO", 5184); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE PWO", 5185); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWOO", 5186); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE PWOO", 5187); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWA", 5188); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE PWA", 5189); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWAA", 5190); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE PWAA", 5191); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE PWAA", 5192); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS P", 5193); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE P", 5194); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER H", 5195); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TE", 5196); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TAAI", 5197); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TI", 5198); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TII", 5199); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TO", 5200); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TOO", 5201); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE TOO", 5202); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DEE", 5203); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DI", 5204); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TA", 5205); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TAA", 5206); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TWE", 5207); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE TWE", 5208); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TWI", 5209); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE TWI", 5210); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TWII", 5211); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE TWII", 5212); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TWO", 5213); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE TWO", 5214); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TWOO", 5215); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE TWOO", 5216); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TWA", 5217); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE TWA", 5218); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TWAA", 5219); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE TWAA", 5220); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI TWAA", 5221); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS T", 5222); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTE", 5223); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTI", 5224); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTO", 5225); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTA", 5226); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KE", 5227); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KAAI", 5228); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KI", 5229); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KII", 5230); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KO", 5231); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KOO", 5232); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE KOO", 5233); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KA", 5234); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KAA", 5235); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWE", 5236); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE KWE", 5237); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWI", 5238); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE KWI", 5239); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWII", 5240); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE KWII", 5241); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWO", 5242); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE KWO", 5243); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWOO", 5244); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE KWOO", 5245); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWA", 5246); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE KWA", 5247); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWAA", 5248); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE KWAA", 5249); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI KWAA", 5250); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS K", 5251); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KW", 5252); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SOUTH SLAVEY KEH", 5253); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SOUTH SLAVEY KIH", 5254); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SOUTH SLAVEY KOH", 5255); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SOUTH SLAVEY KAH", 5256); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CE", 5257); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CAAI", 5258); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CI", 5259); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CII", 5260); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CO", 5261); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS COO", 5262); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE COO", 5263); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CA", 5264); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CAA", 5265); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CWE", 5266); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE CWE", 5267); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CWI", 5268); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE CWI", 5269); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CWII", 5270); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE CWII", 5271); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CWO", 5272); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE CWO", 5273); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CWOO", 5274); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE CWOO", 5275); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CWA", 5276); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE CWA", 5277); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CWAA", 5278); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE CWAA", 5279); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI CWAA", 5280); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS C", 5281); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI TH", 5282); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS ME", 5283); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MAAI", 5284); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MI", 5285); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MII", 5286); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MO", 5287); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MOO", 5288); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE MOO", 5289); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MA", 5290); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MAA", 5291); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MWE", 5292); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE MWE", 5293); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MWI", 5294); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE MWI", 5295); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MWII", 5296); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE MWII", 5297); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MWO", 5298); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE MWO", 5299); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MWOO", 5300); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE MWOO", 5301); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MWA", 5302); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE MWA", 5303); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MWAA", 5304); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE MWAA", 5305); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI MWAA", 5306); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS M", 5307); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE M", 5308); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MH", 5309); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS ATHAPASCAN M", 5310); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI M", 5311); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NE", 5312); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NAAI", 5313); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NI", 5314); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NII", 5315); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NO", 5316); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NOO", 5317); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE NOO", 5318); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NA", 5319); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NAA", 5320); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NWE", 5321); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE NWE", 5322); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NWA", 5323); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE NWA", 5324); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NWAA", 5325); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE NWAA", 5326); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI NWAA", 5327); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS N", 5328); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER NG", 5329); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NH", 5330); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LE", 5331); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LAAI", 5332); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LI", 5333); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LII", 5334); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LO", 5335); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LOO", 5336); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE LOO", 5337); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LA", 5338); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LAA", 5339); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LWE", 5340); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LWE", 5341); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LWI", 5342); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LWI", 5343); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LWII", 5344); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LWII", 5345); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LWO", 5346); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LWO", 5347); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LWOO", 5348); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LWOO", 5349); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LWA", 5350); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LWA", 5351); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LWAA", 5352); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LWAA", 5353); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS L", 5354); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE L", 5355); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MEDIAL L", 5356); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SE", 5357); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAAI", 5358); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SI", 5359); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SII", 5360); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SO", 5361); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SOO", 5362); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE SOO", 5363); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SA", 5364); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAA", 5365); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SWE", 5366); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SWE", 5367); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SWI", 5368); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SWI", 5369); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SWII", 5370); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SWII", 5371); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SWO", 5372); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SWO", 5373); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SWOO", 5374); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SWOO", 5375); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SWA", 5376); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SWA", 5377); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SWAA", 5378); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SWAA", 5379); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI SWAA", 5380); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS S", 5381); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS ATHAPASCAN S", 5382); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SW", 5383); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT S", 5384); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MOOSE CREE SK", 5385); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI SKW", 5386); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI S W", 5387); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI SPWA", 5388); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI STWA", 5389); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI SKWA", 5390); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI SCWA", 5391); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHE", 5392); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHI", 5393); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHII", 5394); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHO", 5395); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHOO", 5396); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHA", 5397); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHAA", 5398); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWE", 5399); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SHWE", 5400); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWI", 5401); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SHWI", 5402); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWII", 5403); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SHWII", 5404); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWO", 5405); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SHWO", 5406); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWOO", 5407); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SHWOO", 5408); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWA", 5409); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SHWA", 5410); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWAA", 5411); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE SHWAA", 5412); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SH", 5413); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YE", 5414); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YAAI", 5415); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YI", 5416); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YII", 5417); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YO", 5418); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YOO", 5419); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y CREE YOO", 5420); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YA", 5421); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YAA", 5422); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YWE", 5423); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE YWE", 5424); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YWI", 5425); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE YWI", 5426); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YWII", 5427); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE YWII", 5428); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YWO", 5429); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE YWO", 5430); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YWOO", 5431); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE YWOO", 5432); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YWA", 5433); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE YWA", 5434); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YWAA", 5435); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE YWAA", 5436); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NASKAPI YWAA", 5437); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Y", 5438); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BIBLE CREE Y", 5439); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE Y", 5440); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI YI", 5441); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RE", 5442); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS R CREE RE", 5443); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LE", 5444); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RAAI", 5445); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RI", 5446); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RII", 5447); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RO", 5448); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS ROO", 5449); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LO", 5450); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RA", 5451); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RAA", 5452); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LA", 5453); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RWAA", 5454); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE RWAA", 5455); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS R", 5456); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE R", 5457); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MEDIAL R", 5458); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FE", 5459); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FAAI", 5460); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FI", 5461); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FII", 5462); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FO", 5463); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FOO", 5464); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FA", 5465); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FAA", 5466); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FWAA", 5467); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE FWAA", 5468); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS F", 5469); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THE", 5470); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS N CREE THE", 5471); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THI", 5472); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS N CREE THI", 5473); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THII", 5474); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS N CREE THII", 5475); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THO", 5476); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THOO", 5477); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THA", 5478); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THAA", 5479); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THWAA", 5480); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE THWAA", 5481); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH", 5482); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTHE", 5483); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTHI", 5484); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTHO", 5485); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTHA", 5486); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTH", 5487); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TYE", 5488); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TYI", 5489); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TYO", 5490); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TYA", 5491); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK HE", 5492); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK HI", 5493); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK HII", 5494); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK HO", 5495); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK HOO", 5496); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK HA", 5497); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK HAA", 5498); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVIK H", 5499); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NUNAVUT H", 5500); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS HK", 5501); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QAAI", 5502); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QI", 5503); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QII", 5504); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QO", 5505); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QOO", 5506); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QA", 5507); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QAA", 5508); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS Q", 5509); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TLHE", 5510); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TLHI", 5511); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TLHO", 5512); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TLHA", 5513); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE RE", 5514); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE RI", 5515); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE RO", 5516); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE RA", 5517); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGAAI", 5518); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGI", 5519); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGII", 5520); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGO", 5521); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGOO", 5522); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGA", 5523); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGAA", 5524); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NG", 5525); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NNG", 5526); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI SHE", 5527); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI SHI", 5528); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI SHO", 5529); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI SHA", 5530); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THE", 5531); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THI", 5532); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THO", 5533); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THA", 5534); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE TH", 5535); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LHI", 5536); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LHII", 5537); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LHO", 5538); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LHOO", 5539); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LHA", 5540); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LHAA", 5541); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LH", 5542); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE THE", 5543); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE THI", 5544); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE THII", 5545); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE THO", 5546); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE THOO", 5547); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE THA", 5548); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE THAA", 5549); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TH CREE TH", 5550); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS AIVILIK B", 5551); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT E", 5552); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT I", 5553); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT O", 5554); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT A", 5555); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT WE", 5556); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT WI", 5557); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT WO", 5558); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT WA", 5559); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT NE", 5560); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT NI", 5561); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT NO", 5562); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT NA", 5563); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT KE", 5564); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT KI", 5565); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT KO", 5566); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT KA", 5567); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI HE", 5568); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI HI", 5569); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI HO", 5570); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI HA", 5571); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GHU", 5572); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GHO", 5573); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GHE", 5574); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GHEE", 5575); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GHI", 5576); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GHA", 5577); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER RU", 5578); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER RO", 5579); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER RE", 5580); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER REE", 5581); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER RI", 5582); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER RA", 5583); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER WU", 5584); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER WO", 5585); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER WE", 5586); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER WEE", 5587); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER WI", 5588); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER WA", 5589); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HWU", 5590); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HWO", 5591); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HWE", 5592); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HWEE", 5593); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HWI", 5594); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER HWA", 5595); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER THU", 5596); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER THO", 5597); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER THE", 5598); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER THEE", 5599); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER THI", 5600); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER THA", 5601); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTU", 5602); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTO", 5603); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTE", 5604); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTEE", 5605); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTI", 5606); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTA", 5607); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER PU", 5608); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER PO", 5609); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER PE", 5610); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER PEE", 5611); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER PI", 5612); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER PA", 5613); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER P", 5614); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GU", 5615); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GO", 5616); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GE", 5617); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GEE", 5618); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GI", 5619); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GA", 5620); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KHU", 5621); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KHO", 5622); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KHE", 5623); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KHEE", 5624); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KHI", 5625); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KHA", 5626); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KKU", 5627); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KKO", 5628); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KKE", 5629); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KKEE", 5630); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KKI", 5631); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KKA", 5632); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER KK", 5633); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER NU", 5634); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER NO", 5635); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER NE", 5636); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER NEE", 5637); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER NI", 5638); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER NA", 5639); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER MU", 5640); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER MO", 5641); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER ME", 5642); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER MEE", 5643); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER MI", 5644); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER MA", 5645); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER YU", 5646); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER YO", 5647); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER YE", 5648); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER YEE", 5649); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER YI", 5650); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER YA", 5651); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JU", 5652); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI JU", 5653); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JO", 5654); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JE", 5655); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JEE", 5656); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JI", 5657); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI JI", 5658); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JA", 5659); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JJU", 5660); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JJO", 5661); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JJE", 5662); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JJEE", 5663); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JJI", 5664); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JJA", 5665); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LU", 5666); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LO", 5667); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LE", 5668); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LEE", 5669); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LI", 5670); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LA", 5671); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DLU", 5672); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DLO", 5673); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DLE", 5674); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DLEE", 5675); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DLI", 5676); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DLA", 5677); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LHU", 5678); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LHO", 5679); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LHE", 5680); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LHEE", 5681); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LHI", 5682); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER LHA", 5683); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLHU", 5684); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLHO", 5685); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLHE", 5686); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLHEE", 5687); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLHI", 5688); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLHA", 5689); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLU", 5690); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLO", 5691); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLE", 5692); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLEE", 5693); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLI", 5694); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TLA", 5695); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER ZU", 5696); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER ZO", 5697); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER ZE", 5698); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER ZEE", 5699); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER ZI", 5700); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER ZA", 5701); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER Z", 5702); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER INITIAL Z", 5703); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DZU", 5704); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DZO", 5705); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DZE", 5706); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DZEE", 5707); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DZI", 5708); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DZA", 5709); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SU", 5710); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SO", 5711); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SE", 5712); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SEE", 5713); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SI", 5714); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SA", 5715); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SHU", 5716); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SHO", 5717); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SHE", 5718); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SHEE", 5719); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SHI", 5720); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SHA", 5721); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER SH", 5722); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TSU", 5723); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TSO", 5724); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TSE", 5725); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TSEE", 5726); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TSI", 5727); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TSA", 5728); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER CHU", 5729); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER CHO", 5730); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER CHE", 5731); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER CHEE", 5732); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER CHI", 5733); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER CHA", 5734); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTSU", 5735); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTSO", 5736); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTSE", 5737); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTSEE", 5738); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTSI", 5739); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER TTSA", 5740); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CHI SIGN", 5741); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FULL STOP", 5742); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS QAI", 5743); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NGAI", 5744); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NNGI", 5745); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NNGII", 5746); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NNGO", 5747); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NNGOO", 5748); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NNGA", 5749); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NNGAA", 5750); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THWEE", 5751); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THWI", 5752); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THWII", 5753); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THWO", 5754); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THWOO", 5755); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THWA", 5756); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE THWAA", 5757); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WOODS CREE FINAL TH", 5758); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BLACKFOOT W", 5759); - _unicodeCharacterMap.Add("OGHAM SPACE MARK", 5760); - _unicodeCharacterMap.Add("OGHAM LETTER BEITH", 5761); - _unicodeCharacterMap.Add("OGHAM LETTER LUIS", 5762); - _unicodeCharacterMap.Add("OGHAM LETTER FEARN", 5763); - _unicodeCharacterMap.Add("OGHAM LETTER SAIL", 5764); - _unicodeCharacterMap.Add("OGHAM LETTER NION", 5765); - _unicodeCharacterMap.Add("OGHAM LETTER UATH", 5766); - _unicodeCharacterMap.Add("OGHAM LETTER DAIR", 5767); - _unicodeCharacterMap.Add("OGHAM LETTER TINNE", 5768); - _unicodeCharacterMap.Add("OGHAM LETTER COLL", 5769); - _unicodeCharacterMap.Add("OGHAM LETTER CEIRT", 5770); - _unicodeCharacterMap.Add("OGHAM LETTER MUIN", 5771); - _unicodeCharacterMap.Add("OGHAM LETTER GORT", 5772); - _unicodeCharacterMap.Add("OGHAM LETTER NGEADAL", 5773); - _unicodeCharacterMap.Add("OGHAM LETTER STRAIF", 5774); - _unicodeCharacterMap.Add("OGHAM LETTER RUIS", 5775); - _unicodeCharacterMap.Add("OGHAM LETTER AILM", 5776); - _unicodeCharacterMap.Add("OGHAM LETTER ONN", 5777); - _unicodeCharacterMap.Add("OGHAM LETTER UR", 5778); - _unicodeCharacterMap.Add("OGHAM LETTER EADHADH", 5779); - _unicodeCharacterMap.Add("OGHAM LETTER IODHADH", 5780); - _unicodeCharacterMap.Add("OGHAM LETTER EABHADH", 5781); - _unicodeCharacterMap.Add("OGHAM LETTER OR", 5782); - _unicodeCharacterMap.Add("OGHAM LETTER UILLEANN", 5783); - _unicodeCharacterMap.Add("OGHAM LETTER IFIN", 5784); - _unicodeCharacterMap.Add("OGHAM LETTER EAMHANCHOLL", 5785); - _unicodeCharacterMap.Add("OGHAM LETTER PEITH", 5786); - _unicodeCharacterMap.Add("OGHAM FEATHER MARK", 5787); - _unicodeCharacterMap.Add("OGHAM REVERSED FEATHER MARK", 5788); - _unicodeCharacterMap.Add("RUNIC LETTER FEHU FEOH FE F", 5792); - _unicodeCharacterMap.Add("RUNIC LETTER V", 5793); - _unicodeCharacterMap.Add("RUNIC LETTER URUZ UR U", 5794); - _unicodeCharacterMap.Add("RUNIC LETTER YR", 5795); - _unicodeCharacterMap.Add("RUNIC LETTER Y", 5796); - _unicodeCharacterMap.Add("RUNIC LETTER W", 5797); - _unicodeCharacterMap.Add("RUNIC LETTER THURISAZ THURS THORN", 5798); - _unicodeCharacterMap.Add("RUNIC LETTER ETH", 5799); - _unicodeCharacterMap.Add("RUNIC LETTER ANSUZ A", 5800); - _unicodeCharacterMap.Add("RUNIC LETTER OS O", 5801); - _unicodeCharacterMap.Add("RUNIC LETTER AC A", 5802); - _unicodeCharacterMap.Add("RUNIC LETTER AESC", 5803); - _unicodeCharacterMap.Add("RUNIC LETTER LONG BRANCH OSS O", 5804); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG OSS O", 5805); - _unicodeCharacterMap.Add("RUNIC LETTER O", 5806); - _unicodeCharacterMap.Add("RUNIC LETTER OE", 5807); - _unicodeCharacterMap.Add("RUNIC LETTER ON", 5808); - _unicodeCharacterMap.Add("RUNIC LETTER RAIDO RAD REID R", 5809); - _unicodeCharacterMap.Add("RUNIC LETTER KAUNA", 5810); - _unicodeCharacterMap.Add("RUNIC LETTER CEN", 5811); - _unicodeCharacterMap.Add("RUNIC LETTER KAUN K", 5812); - _unicodeCharacterMap.Add("RUNIC LETTER G", 5813); - _unicodeCharacterMap.Add("RUNIC LETTER ENG", 5814); - _unicodeCharacterMap.Add("RUNIC LETTER GEBO GYFU G", 5815); - _unicodeCharacterMap.Add("RUNIC LETTER GAR", 5816); - _unicodeCharacterMap.Add("RUNIC LETTER WUNJO WYNN W", 5817); - _unicodeCharacterMap.Add("RUNIC LETTER HAGLAZ H", 5818); - _unicodeCharacterMap.Add("RUNIC LETTER HAEGL H", 5819); - _unicodeCharacterMap.Add("RUNIC LETTER LONG BRANCH HAGALL H", 5820); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG HAGALL H", 5821); - _unicodeCharacterMap.Add("RUNIC LETTER NAUDIZ NYD NAUD N", 5822); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG NAUD N", 5823); - _unicodeCharacterMap.Add("RUNIC LETTER DOTTED N", 5824); - _unicodeCharacterMap.Add("RUNIC LETTER ISAZ IS ISS I", 5825); - _unicodeCharacterMap.Add("RUNIC LETTER E", 5826); - _unicodeCharacterMap.Add("RUNIC LETTER JERAN J", 5827); - _unicodeCharacterMap.Add("RUNIC LETTER GER", 5828); - _unicodeCharacterMap.Add("RUNIC LETTER LONG BRANCH AR AE", 5829); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG AR A", 5830); - _unicodeCharacterMap.Add("RUNIC LETTER IWAZ EOH", 5831); - _unicodeCharacterMap.Add("RUNIC LETTER PERTHO PEORTH P", 5832); - _unicodeCharacterMap.Add("RUNIC LETTER ALGIZ EOLHX", 5833); - _unicodeCharacterMap.Add("RUNIC LETTER SOWILO S", 5834); - _unicodeCharacterMap.Add("RUNIC LETTER SIGEL LONG BRANCH SOL S", 5835); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG SOL S", 5836); - _unicodeCharacterMap.Add("RUNIC LETTER C", 5837); - _unicodeCharacterMap.Add("RUNIC LETTER Z", 5838); - _unicodeCharacterMap.Add("RUNIC LETTER TIWAZ TIR TYR T", 5839); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG TYR T", 5840); - _unicodeCharacterMap.Add("RUNIC LETTER D", 5841); - _unicodeCharacterMap.Add("RUNIC LETTER BERKANAN BEORC BJARKAN B", 5842); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG BJARKAN B", 5843); - _unicodeCharacterMap.Add("RUNIC LETTER DOTTED P", 5844); - _unicodeCharacterMap.Add("RUNIC LETTER OPEN P", 5845); - _unicodeCharacterMap.Add("RUNIC LETTER EHWAZ EH E", 5846); - _unicodeCharacterMap.Add("RUNIC LETTER MANNAZ MAN M", 5847); - _unicodeCharacterMap.Add("RUNIC LETTER LONG BRANCH MADR M", 5848); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG MADR M", 5849); - _unicodeCharacterMap.Add("RUNIC LETTER LAUKAZ LAGU LOGR L", 5850); - _unicodeCharacterMap.Add("RUNIC LETTER DOTTED L", 5851); - _unicodeCharacterMap.Add("RUNIC LETTER INGWAZ", 5852); - _unicodeCharacterMap.Add("RUNIC LETTER ING", 5853); - _unicodeCharacterMap.Add("RUNIC LETTER DAGAZ DAEG D", 5854); - _unicodeCharacterMap.Add("RUNIC LETTER OTHALAN ETHEL O", 5855); - _unicodeCharacterMap.Add("RUNIC LETTER EAR", 5856); - _unicodeCharacterMap.Add("RUNIC LETTER IOR", 5857); - _unicodeCharacterMap.Add("RUNIC LETTER CWEORTH", 5858); - _unicodeCharacterMap.Add("RUNIC LETTER CALC", 5859); - _unicodeCharacterMap.Add("RUNIC LETTER CEALC", 5860); - _unicodeCharacterMap.Add("RUNIC LETTER STAN", 5861); - _unicodeCharacterMap.Add("RUNIC LETTER LONG BRANCH YR", 5862); - _unicodeCharacterMap.Add("RUNIC LETTER SHORT TWIG YR", 5863); - _unicodeCharacterMap.Add("RUNIC LETTER ICELANDIC YR", 5864); - _unicodeCharacterMap.Add("RUNIC LETTER Q", 5865); - _unicodeCharacterMap.Add("RUNIC LETTER X", 5866); - _unicodeCharacterMap.Add("RUNIC SINGLE PUNCTUATION", 5867); - _unicodeCharacterMap.Add("RUNIC MULTIPLE PUNCTUATION", 5868); - _unicodeCharacterMap.Add("RUNIC CROSS PUNCTUATION", 5869); - _unicodeCharacterMap.Add("RUNIC ARLAUG SYMBOL", 5870); - _unicodeCharacterMap.Add("RUNIC TVIMADUR SYMBOL", 5871); - _unicodeCharacterMap.Add("RUNIC BELGTHOR SYMBOL", 5872); - _unicodeCharacterMap.Add("RUNIC LETTER K", 5873); - _unicodeCharacterMap.Add("RUNIC LETTER SH", 5874); - _unicodeCharacterMap.Add("RUNIC LETTER OO", 5875); - _unicodeCharacterMap.Add("RUNIC LETTER FRANKS CASKET OS", 5876); - _unicodeCharacterMap.Add("RUNIC LETTER FRANKS CASKET IS", 5877); - _unicodeCharacterMap.Add("RUNIC LETTER FRANKS CASKET EH", 5878); - _unicodeCharacterMap.Add("RUNIC LETTER FRANKS CASKET AC", 5879); - _unicodeCharacterMap.Add("RUNIC LETTER FRANKS CASKET AESC", 5880); - _unicodeCharacterMap.Add("TAGALOG LETTER A", 5888); - _unicodeCharacterMap.Add("TAGALOG LETTER I", 5889); - _unicodeCharacterMap.Add("TAGALOG LETTER U", 5890); - _unicodeCharacterMap.Add("TAGALOG LETTER KA", 5891); - _unicodeCharacterMap.Add("TAGALOG LETTER GA", 5892); - _unicodeCharacterMap.Add("TAGALOG LETTER NGA", 5893); - _unicodeCharacterMap.Add("TAGALOG LETTER TA", 5894); - _unicodeCharacterMap.Add("TAGALOG LETTER DA", 5895); - _unicodeCharacterMap.Add("TAGALOG LETTER NA", 5896); - _unicodeCharacterMap.Add("TAGALOG LETTER PA", 5897); - _unicodeCharacterMap.Add("TAGALOG LETTER BA", 5898); - _unicodeCharacterMap.Add("TAGALOG LETTER MA", 5899); - _unicodeCharacterMap.Add("TAGALOG LETTER YA", 5900); - _unicodeCharacterMap.Add("TAGALOG LETTER LA", 5902); - _unicodeCharacterMap.Add("TAGALOG LETTER WA", 5903); - _unicodeCharacterMap.Add("TAGALOG LETTER SA", 5904); - _unicodeCharacterMap.Add("TAGALOG LETTER HA", 5905); - _unicodeCharacterMap.Add("TAGALOG VOWEL SIGN I", 5906); - _unicodeCharacterMap.Add("TAGALOG VOWEL SIGN U", 5907); - _unicodeCharacterMap.Add("TAGALOG SIGN VIRAMA", 5908); - _unicodeCharacterMap.Add("HANUNOO LETTER A", 5920); - _unicodeCharacterMap.Add("HANUNOO LETTER I", 5921); - _unicodeCharacterMap.Add("HANUNOO LETTER U", 5922); - _unicodeCharacterMap.Add("HANUNOO LETTER KA", 5923); - _unicodeCharacterMap.Add("HANUNOO LETTER GA", 5924); - _unicodeCharacterMap.Add("HANUNOO LETTER NGA", 5925); - _unicodeCharacterMap.Add("HANUNOO LETTER TA", 5926); - _unicodeCharacterMap.Add("HANUNOO LETTER DA", 5927); - _unicodeCharacterMap.Add("HANUNOO LETTER NA", 5928); - _unicodeCharacterMap.Add("HANUNOO LETTER PA", 5929); - _unicodeCharacterMap.Add("HANUNOO LETTER BA", 5930); - _unicodeCharacterMap.Add("HANUNOO LETTER MA", 5931); - _unicodeCharacterMap.Add("HANUNOO LETTER YA", 5932); - _unicodeCharacterMap.Add("HANUNOO LETTER RA", 5933); - _unicodeCharacterMap.Add("HANUNOO LETTER LA", 5934); - _unicodeCharacterMap.Add("HANUNOO LETTER WA", 5935); - _unicodeCharacterMap.Add("HANUNOO LETTER SA", 5936); - _unicodeCharacterMap.Add("HANUNOO LETTER HA", 5937); - _unicodeCharacterMap.Add("HANUNOO VOWEL SIGN I", 5938); - _unicodeCharacterMap.Add("HANUNOO VOWEL SIGN U", 5939); - _unicodeCharacterMap.Add("HANUNOO SIGN PAMUDPOD", 5940); - _unicodeCharacterMap.Add("PHILIPPINE SINGLE PUNCTUATION", 5941); - _unicodeCharacterMap.Add("PHILIPPINE DOUBLE PUNCTUATION", 5942); - _unicodeCharacterMap.Add("BUHID LETTER A", 5952); - _unicodeCharacterMap.Add("BUHID LETTER I", 5953); - _unicodeCharacterMap.Add("BUHID LETTER U", 5954); - _unicodeCharacterMap.Add("BUHID LETTER KA", 5955); - _unicodeCharacterMap.Add("BUHID LETTER GA", 5956); - _unicodeCharacterMap.Add("BUHID LETTER NGA", 5957); - _unicodeCharacterMap.Add("BUHID LETTER TA", 5958); - _unicodeCharacterMap.Add("BUHID LETTER DA", 5959); - _unicodeCharacterMap.Add("BUHID LETTER NA", 5960); - _unicodeCharacterMap.Add("BUHID LETTER PA", 5961); - _unicodeCharacterMap.Add("BUHID LETTER BA", 5962); - _unicodeCharacterMap.Add("BUHID LETTER MA", 5963); - _unicodeCharacterMap.Add("BUHID LETTER YA", 5964); - _unicodeCharacterMap.Add("BUHID LETTER RA", 5965); - _unicodeCharacterMap.Add("BUHID LETTER LA", 5966); - _unicodeCharacterMap.Add("BUHID LETTER WA", 5967); - _unicodeCharacterMap.Add("BUHID LETTER SA", 5968); - _unicodeCharacterMap.Add("BUHID LETTER HA", 5969); - _unicodeCharacterMap.Add("BUHID VOWEL SIGN I", 5970); - _unicodeCharacterMap.Add("BUHID VOWEL SIGN U", 5971); - _unicodeCharacterMap.Add("TAGBANWA LETTER A", 5984); - _unicodeCharacterMap.Add("TAGBANWA LETTER I", 5985); - _unicodeCharacterMap.Add("TAGBANWA LETTER U", 5986); - _unicodeCharacterMap.Add("TAGBANWA LETTER KA", 5987); - _unicodeCharacterMap.Add("TAGBANWA LETTER GA", 5988); - _unicodeCharacterMap.Add("TAGBANWA LETTER NGA", 5989); - _unicodeCharacterMap.Add("TAGBANWA LETTER TA", 5990); - _unicodeCharacterMap.Add("TAGBANWA LETTER DA", 5991); - _unicodeCharacterMap.Add("TAGBANWA LETTER NA", 5992); - _unicodeCharacterMap.Add("TAGBANWA LETTER PA", 5993); - _unicodeCharacterMap.Add("TAGBANWA LETTER BA", 5994); - _unicodeCharacterMap.Add("TAGBANWA LETTER MA", 5995); - _unicodeCharacterMap.Add("TAGBANWA LETTER YA", 5996); - _unicodeCharacterMap.Add("TAGBANWA LETTER LA", 5998); - _unicodeCharacterMap.Add("TAGBANWA LETTER WA", 5999); - _unicodeCharacterMap.Add("TAGBANWA LETTER SA", 6000); - _unicodeCharacterMap.Add("TAGBANWA VOWEL SIGN I", 6002); - _unicodeCharacterMap.Add("TAGBANWA VOWEL SIGN U", 6003); - _unicodeCharacterMap.Add("KHMER LETTER KA", 6016); - _unicodeCharacterMap.Add("KHMER LETTER KHA", 6017); - _unicodeCharacterMap.Add("KHMER LETTER KO", 6018); - _unicodeCharacterMap.Add("KHMER LETTER KHO", 6019); - _unicodeCharacterMap.Add("KHMER LETTER NGO", 6020); - _unicodeCharacterMap.Add("KHMER LETTER CA", 6021); - _unicodeCharacterMap.Add("KHMER LETTER CHA", 6022); - _unicodeCharacterMap.Add("KHMER LETTER CO", 6023); - _unicodeCharacterMap.Add("KHMER LETTER CHO", 6024); - _unicodeCharacterMap.Add("KHMER LETTER NYO", 6025); - _unicodeCharacterMap.Add("KHMER LETTER DA", 6026); - _unicodeCharacterMap.Add("KHMER LETTER TTHA", 6027); - _unicodeCharacterMap.Add("KHMER LETTER DO", 6028); - _unicodeCharacterMap.Add("KHMER LETTER TTHO", 6029); - _unicodeCharacterMap.Add("KHMER LETTER NNO", 6030); - _unicodeCharacterMap.Add("KHMER LETTER TA", 6031); - _unicodeCharacterMap.Add("KHMER LETTER THA", 6032); - _unicodeCharacterMap.Add("KHMER LETTER TO", 6033); - _unicodeCharacterMap.Add("KHMER LETTER THO", 6034); - _unicodeCharacterMap.Add("KHMER LETTER NO", 6035); - _unicodeCharacterMap.Add("KHMER LETTER BA", 6036); - _unicodeCharacterMap.Add("KHMER LETTER PHA", 6037); - _unicodeCharacterMap.Add("KHMER LETTER PO", 6038); - _unicodeCharacterMap.Add("KHMER LETTER PHO", 6039); - _unicodeCharacterMap.Add("KHMER LETTER MO", 6040); - _unicodeCharacterMap.Add("KHMER LETTER YO", 6041); - _unicodeCharacterMap.Add("KHMER LETTER RO", 6042); - _unicodeCharacterMap.Add("KHMER LETTER LO", 6043); - _unicodeCharacterMap.Add("KHMER LETTER VO", 6044); - _unicodeCharacterMap.Add("KHMER LETTER SHA", 6045); - _unicodeCharacterMap.Add("KHMER LETTER SSO", 6046); - _unicodeCharacterMap.Add("KHMER LETTER SA", 6047); - _unicodeCharacterMap.Add("KHMER LETTER HA", 6048); - _unicodeCharacterMap.Add("KHMER LETTER LA", 6049); - _unicodeCharacterMap.Add("KHMER LETTER QA", 6050); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QAQ", 6051); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QAA", 6052); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QI", 6053); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QII", 6054); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QU", 6055); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QUK", 6056); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QUU", 6057); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QUUV", 6058); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL RY", 6059); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL RYY", 6060); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL LY", 6061); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL LYY", 6062); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QE", 6063); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QAI", 6064); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QOO TYPE ONE", 6065); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QOO TYPE TWO", 6066); - _unicodeCharacterMap.Add("KHMER INDEPENDENT VOWEL QAU", 6067); - _unicodeCharacterMap.Add("KHMER VOWEL INHERENT AQ", 6068); - _unicodeCharacterMap.Add("KHMER VOWEL INHERENT AA", 6069); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN AA", 6070); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN I", 6071); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN II", 6072); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN Y", 6073); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN YY", 6074); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN U", 6075); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN UU", 6076); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN UA", 6077); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN OE", 6078); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN YA", 6079); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN IE", 6080); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN E", 6081); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN AE", 6082); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN AI", 6083); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN OO", 6084); - _unicodeCharacterMap.Add("KHMER VOWEL SIGN AU", 6085); - _unicodeCharacterMap.Add("KHMER SIGN NIKAHIT", 6086); - _unicodeCharacterMap.Add("KHMER SIGN REAHMUK", 6087); - _unicodeCharacterMap.Add("KHMER SIGN YUUKALEAPINTU", 6088); - _unicodeCharacterMap.Add("KHMER SIGN MUUSIKATOAN", 6089); - _unicodeCharacterMap.Add("KHMER SIGN TRIISAP", 6090); - _unicodeCharacterMap.Add("KHMER SIGN BANTOC", 6091); - _unicodeCharacterMap.Add("KHMER SIGN ROBAT", 6092); - _unicodeCharacterMap.Add("KHMER SIGN TOANDAKHIAT", 6093); - _unicodeCharacterMap.Add("KHMER SIGN KAKABAT", 6094); - _unicodeCharacterMap.Add("KHMER SIGN AHSDA", 6095); - _unicodeCharacterMap.Add("KHMER SIGN SAMYOK SANNYA", 6096); - _unicodeCharacterMap.Add("KHMER SIGN VIRIAM", 6097); - _unicodeCharacterMap.Add("KHMER SIGN COENG", 6098); - _unicodeCharacterMap.Add("KHMER SIGN BATHAMASAT", 6099); - _unicodeCharacterMap.Add("KHMER SIGN KHAN", 6100); - _unicodeCharacterMap.Add("KHMER SIGN BARIYOOSAN", 6101); - _unicodeCharacterMap.Add("KHMER SIGN CAMNUC PII KUUH", 6102); - _unicodeCharacterMap.Add("KHMER SIGN LEK TOO", 6103); - _unicodeCharacterMap.Add("KHMER SIGN BEYYAL", 6104); - _unicodeCharacterMap.Add("KHMER SIGN PHNAEK MUAN", 6105); - _unicodeCharacterMap.Add("KHMER SIGN KOOMUUT", 6106); - _unicodeCharacterMap.Add("KHMER CURRENCY SYMBOL RIEL", 6107); - _unicodeCharacterMap.Add("KHMER SIGN AVAKRAHASANYA", 6108); - _unicodeCharacterMap.Add("KHMER SIGN ATTHACAN", 6109); - _unicodeCharacterMap.Add("KHMER DIGIT ZERO", 6112); - _unicodeCharacterMap.Add("KHMER DIGIT ONE", 6113); - _unicodeCharacterMap.Add("KHMER DIGIT TWO", 6114); - _unicodeCharacterMap.Add("KHMER DIGIT THREE", 6115); - _unicodeCharacterMap.Add("KHMER DIGIT FOUR", 6116); - _unicodeCharacterMap.Add("KHMER DIGIT FIVE", 6117); - _unicodeCharacterMap.Add("KHMER DIGIT SIX", 6118); - _unicodeCharacterMap.Add("KHMER DIGIT SEVEN", 6119); - _unicodeCharacterMap.Add("KHMER DIGIT EIGHT", 6120); - _unicodeCharacterMap.Add("KHMER DIGIT NINE", 6121); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK SON", 6128); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK MUOY", 6129); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK PII", 6130); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK BEI", 6131); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK BUON", 6132); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK PRAM", 6133); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK PRAM MUOY", 6134); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK PRAM PII", 6135); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK PRAM BEI", 6136); - _unicodeCharacterMap.Add("KHMER SYMBOL LEK ATTAK PRAM BUON", 6137); - _unicodeCharacterMap.Add("MONGOLIAN BIRGA", 6144); - _unicodeCharacterMap.Add("MONGOLIAN ELLIPSIS", 6145); - _unicodeCharacterMap.Add("MONGOLIAN COMMA", 6146); - _unicodeCharacterMap.Add("MONGOLIAN FULL STOP", 6147); - _unicodeCharacterMap.Add("MONGOLIAN COLON", 6148); - _unicodeCharacterMap.Add("MONGOLIAN FOUR DOTS", 6149); - _unicodeCharacterMap.Add("MONGOLIAN TODO SOFT HYPHEN", 6150); - _unicodeCharacterMap.Add("MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER", 6151); - _unicodeCharacterMap.Add("MONGOLIAN MANCHU COMMA", 6152); - _unicodeCharacterMap.Add("MONGOLIAN MANCHU FULL STOP", 6153); - _unicodeCharacterMap.Add("MONGOLIAN NIRUGU", 6154); - _unicodeCharacterMap.Add("MONGOLIAN FREE VARIATION SELECTOR ONE", 6155); - _unicodeCharacterMap.Add("MONGOLIAN FREE VARIATION SELECTOR TWO", 6156); - _unicodeCharacterMap.Add("MONGOLIAN FREE VARIATION SELECTOR THREE", 6157); - _unicodeCharacterMap.Add("MONGOLIAN VOWEL SEPARATOR", 6158); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT ZERO", 6160); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT ONE", 6161); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT TWO", 6162); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT THREE", 6163); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT FOUR", 6164); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT FIVE", 6165); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT SIX", 6166); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT SEVEN", 6167); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT EIGHT", 6168); - _unicodeCharacterMap.Add("MONGOLIAN DIGIT NINE", 6169); - _unicodeCharacterMap.Add("MONGOLIAN LETTER A", 6176); - _unicodeCharacterMap.Add("MONGOLIAN LETTER E", 6177); - _unicodeCharacterMap.Add("MONGOLIAN LETTER I", 6178); - _unicodeCharacterMap.Add("MONGOLIAN LETTER O", 6179); - _unicodeCharacterMap.Add("MONGOLIAN LETTER U", 6180); - _unicodeCharacterMap.Add("MONGOLIAN LETTER OE", 6181); - _unicodeCharacterMap.Add("MONGOLIAN LETTER UE", 6182); - _unicodeCharacterMap.Add("MONGOLIAN LETTER EE", 6183); - _unicodeCharacterMap.Add("MONGOLIAN LETTER NA", 6184); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ANG", 6185); - _unicodeCharacterMap.Add("MONGOLIAN LETTER BA", 6186); - _unicodeCharacterMap.Add("MONGOLIAN LETTER PA", 6187); - _unicodeCharacterMap.Add("MONGOLIAN LETTER QA", 6188); - _unicodeCharacterMap.Add("MONGOLIAN LETTER GA", 6189); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MA", 6190); - _unicodeCharacterMap.Add("MONGOLIAN LETTER LA", 6191); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SA", 6192); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SHA", 6193); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TA", 6194); - _unicodeCharacterMap.Add("MONGOLIAN LETTER DA", 6195); - _unicodeCharacterMap.Add("MONGOLIAN LETTER CHA", 6196); - _unicodeCharacterMap.Add("MONGOLIAN LETTER JA", 6197); - _unicodeCharacterMap.Add("MONGOLIAN LETTER YA", 6198); - _unicodeCharacterMap.Add("MONGOLIAN LETTER RA", 6199); - _unicodeCharacterMap.Add("MONGOLIAN LETTER WA", 6200); - _unicodeCharacterMap.Add("MONGOLIAN LETTER FA", 6201); - _unicodeCharacterMap.Add("MONGOLIAN LETTER KA", 6202); - _unicodeCharacterMap.Add("MONGOLIAN LETTER KHA", 6203); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TSA", 6204); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ZA", 6205); - _unicodeCharacterMap.Add("MONGOLIAN LETTER HAA", 6206); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ZRA", 6207); - _unicodeCharacterMap.Add("MONGOLIAN LETTER LHA", 6208); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ZHI", 6209); - _unicodeCharacterMap.Add("MONGOLIAN LETTER CHI", 6210); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO LONG VOWEL SIGN", 6211); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO E", 6212); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO I", 6213); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO O", 6214); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO U", 6215); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO OE", 6216); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO UE", 6217); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO ANG", 6218); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO BA", 6219); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO PA", 6220); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO QA", 6221); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO GA", 6222); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO MA", 6223); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO TA", 6224); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO DA", 6225); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO CHA", 6226); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO JA", 6227); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO TSA", 6228); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO YA", 6229); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO WA", 6230); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO KA", 6231); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO GAA", 6232); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO HAA", 6233); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO JIA", 6234); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO NIA", 6235); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO DZA", 6236); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE E", 6237); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE I", 6238); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE IY", 6239); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE UE", 6240); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE U", 6241); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE ANG", 6242); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE KA", 6243); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE GA", 6244); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE HA", 6245); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE PA", 6246); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE SHA", 6247); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE TA", 6248); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE DA", 6249); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE JA", 6250); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE FA", 6251); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE GAA", 6252); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE HAA", 6253); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE TSA", 6254); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE ZA", 6255); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE RAA", 6256); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE CHA", 6257); - _unicodeCharacterMap.Add("MONGOLIAN LETTER SIBE ZHA", 6258); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU I", 6259); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU KA", 6260); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU RA", 6261); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU FA", 6262); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ZHA", 6263); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI ANUSVARA ONE", 6272); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI VISARGA ONE", 6273); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI DAMARU", 6274); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI UBADAMA", 6275); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI INVERTED UBADAMA", 6276); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI BALUDA", 6277); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI THREE BALUDA", 6278); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI A", 6279); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI I", 6280); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI KA", 6281); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI NGA", 6282); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI CA", 6283); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI TTA", 6284); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI TTHA", 6285); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI DDA", 6286); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI NNA", 6287); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI TA", 6288); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI DA", 6289); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI PA", 6290); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI PHA", 6291); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI SSA", 6292); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI ZHA", 6293); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI ZA", 6294); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI AH", 6295); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO ALI GALI TA", 6296); - _unicodeCharacterMap.Add("MONGOLIAN LETTER TODO ALI GALI ZHA", 6297); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI GHA", 6298); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI NGA", 6299); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI CA", 6300); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI JHA", 6301); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI TTA", 6302); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI DDHA", 6303); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI TA", 6304); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI DHA", 6305); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI SSA", 6306); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI CYA", 6307); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI ZHA", 6308); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI ZA", 6309); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI HALF U", 6310); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI HALF YA", 6311); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI BHA", 6312); - _unicodeCharacterMap.Add("MONGOLIAN LETTER ALI GALI DAGALGA", 6313); - _unicodeCharacterMap.Add("MONGOLIAN LETTER MANCHU ALI GALI LHA", 6314); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OY", 6320); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS AY", 6321); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS AAY", 6322); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WAY", 6323); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS POY", 6324); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PAY", 6325); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS PWOY", 6326); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TAY", 6327); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KAY", 6328); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS KWAY", 6329); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS MAY", 6330); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NOY", 6331); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NAY", 6332); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS LAY", 6333); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SOY", 6334); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAY", 6335); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHOY", 6336); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHAY", 6337); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SHWOY", 6338); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YOY", 6339); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS YAY", 6340); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RAY", 6341); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NWI", 6342); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY NWI", 6343); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NWII", 6344); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY NWII", 6345); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NWO", 6346); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY NWO", 6347); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS NWOO", 6348); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY NWOO", 6349); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RWEE", 6350); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RWI", 6351); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RWII", 6352); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RWO", 6353); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RWOO", 6354); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS RWA", 6355); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY P", 6356); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY T", 6357); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY K", 6358); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY C", 6359); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY M", 6360); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY N", 6361); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY S", 6362); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS OJIBWAY SH", 6363); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS EASTERN W", 6364); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WESTERN W", 6365); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL SMALL RING", 6366); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS FINAL RAISED DOT", 6367); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS R CREE RWE", 6368); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LOO", 6369); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS WEST CREE LAA", 6370); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THWE", 6371); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS THWA", 6372); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTHWE", 6373); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTHOO", 6374); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TTHAA", 6375); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TLHWE", 6376); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS TLHOO", 6377); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI SHWE", 6378); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI SHOO", 6379); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI HOO", 6380); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GWU", 6381); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DENE GEE", 6382); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GAA", 6383); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER GWA", 6384); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS SAYISI JUU", 6385); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER JWA", 6386); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BEAVER DENE L", 6387); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS BEAVER DENE R", 6388); - _unicodeCharacterMap.Add("CANADIAN SYLLABICS CARRIER DENTAL S", 6389); - _unicodeCharacterMap.Add("LIMBU VOWEL CARRIER LETTER", 6400); - _unicodeCharacterMap.Add("LIMBU LETTER KA", 6401); - _unicodeCharacterMap.Add("LIMBU LETTER KHA", 6402); - _unicodeCharacterMap.Add("LIMBU LETTER GA", 6403); - _unicodeCharacterMap.Add("LIMBU LETTER GHA", 6404); - _unicodeCharacterMap.Add("LIMBU LETTER NGA", 6405); - _unicodeCharacterMap.Add("LIMBU LETTER CA", 6406); - _unicodeCharacterMap.Add("LIMBU LETTER CHA", 6407); - _unicodeCharacterMap.Add("LIMBU LETTER JA", 6408); - _unicodeCharacterMap.Add("LIMBU LETTER JHA", 6409); - _unicodeCharacterMap.Add("LIMBU LETTER YAN", 6410); - _unicodeCharacterMap.Add("LIMBU LETTER TA", 6411); - _unicodeCharacterMap.Add("LIMBU LETTER THA", 6412); - _unicodeCharacterMap.Add("LIMBU LETTER DA", 6413); - _unicodeCharacterMap.Add("LIMBU LETTER DHA", 6414); - _unicodeCharacterMap.Add("LIMBU LETTER NA", 6415); - _unicodeCharacterMap.Add("LIMBU LETTER PA", 6416); - _unicodeCharacterMap.Add("LIMBU LETTER PHA", 6417); - _unicodeCharacterMap.Add("LIMBU LETTER BA", 6418); - _unicodeCharacterMap.Add("LIMBU LETTER BHA", 6419); - _unicodeCharacterMap.Add("LIMBU LETTER MA", 6420); - _unicodeCharacterMap.Add("LIMBU LETTER YA", 6421); - _unicodeCharacterMap.Add("LIMBU LETTER RA", 6422); - _unicodeCharacterMap.Add("LIMBU LETTER LA", 6423); - _unicodeCharacterMap.Add("LIMBU LETTER WA", 6424); - _unicodeCharacterMap.Add("LIMBU LETTER SHA", 6425); - _unicodeCharacterMap.Add("LIMBU LETTER SSA", 6426); - _unicodeCharacterMap.Add("LIMBU LETTER SA", 6427); - _unicodeCharacterMap.Add("LIMBU LETTER HA", 6428); - _unicodeCharacterMap.Add("LIMBU LETTER GYAN", 6429); - _unicodeCharacterMap.Add("LIMBU LETTER TRA", 6430); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN A", 6432); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN I", 6433); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN U", 6434); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN EE", 6435); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN AI", 6436); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN OO", 6437); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN AU", 6438); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN E", 6439); - _unicodeCharacterMap.Add("LIMBU VOWEL SIGN O", 6440); - _unicodeCharacterMap.Add("LIMBU SUBJOINED LETTER YA", 6441); - _unicodeCharacterMap.Add("LIMBU SUBJOINED LETTER RA", 6442); - _unicodeCharacterMap.Add("LIMBU SUBJOINED LETTER WA", 6443); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER KA", 6448); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER NGA", 6449); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER ANUSVARA", 6450); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER TA", 6451); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER NA", 6452); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER PA", 6453); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER MA", 6454); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER RA", 6455); - _unicodeCharacterMap.Add("LIMBU SMALL LETTER LA", 6456); - _unicodeCharacterMap.Add("LIMBU SIGN MUKPHRENG", 6457); - _unicodeCharacterMap.Add("LIMBU SIGN KEMPHRENG", 6458); - _unicodeCharacterMap.Add("LIMBU SIGN SA I", 6459); - _unicodeCharacterMap.Add("LIMBU SIGN LOO", 6464); - _unicodeCharacterMap.Add("LIMBU EXCLAMATION MARK", 6468); - _unicodeCharacterMap.Add("LIMBU QUESTION MARK", 6469); - _unicodeCharacterMap.Add("LIMBU DIGIT ZERO", 6470); - _unicodeCharacterMap.Add("LIMBU DIGIT ONE", 6471); - _unicodeCharacterMap.Add("LIMBU DIGIT TWO", 6472); - _unicodeCharacterMap.Add("LIMBU DIGIT THREE", 6473); - _unicodeCharacterMap.Add("LIMBU DIGIT FOUR", 6474); - _unicodeCharacterMap.Add("LIMBU DIGIT FIVE", 6475); - _unicodeCharacterMap.Add("LIMBU DIGIT SIX", 6476); - _unicodeCharacterMap.Add("LIMBU DIGIT SEVEN", 6477); - _unicodeCharacterMap.Add("LIMBU DIGIT EIGHT", 6478); - _unicodeCharacterMap.Add("LIMBU DIGIT NINE", 6479); - _unicodeCharacterMap.Add("TAI LE LETTER KA", 6480); - _unicodeCharacterMap.Add("TAI LE LETTER XA", 6481); - _unicodeCharacterMap.Add("TAI LE LETTER NGA", 6482); - _unicodeCharacterMap.Add("TAI LE LETTER TSA", 6483); - _unicodeCharacterMap.Add("TAI LE LETTER SA", 6484); - _unicodeCharacterMap.Add("TAI LE LETTER YA", 6485); - _unicodeCharacterMap.Add("TAI LE LETTER TA", 6486); - _unicodeCharacterMap.Add("TAI LE LETTER THA", 6487); - _unicodeCharacterMap.Add("TAI LE LETTER LA", 6488); - _unicodeCharacterMap.Add("TAI LE LETTER PA", 6489); - _unicodeCharacterMap.Add("TAI LE LETTER PHA", 6490); - _unicodeCharacterMap.Add("TAI LE LETTER MA", 6491); - _unicodeCharacterMap.Add("TAI LE LETTER FA", 6492); - _unicodeCharacterMap.Add("TAI LE LETTER VA", 6493); - _unicodeCharacterMap.Add("TAI LE LETTER HA", 6494); - _unicodeCharacterMap.Add("TAI LE LETTER QA", 6495); - _unicodeCharacterMap.Add("TAI LE LETTER KHA", 6496); - _unicodeCharacterMap.Add("TAI LE LETTER TSHA", 6497); - _unicodeCharacterMap.Add("TAI LE LETTER NA", 6498); - _unicodeCharacterMap.Add("TAI LE LETTER A", 6499); - _unicodeCharacterMap.Add("TAI LE LETTER I", 6500); - _unicodeCharacterMap.Add("TAI LE LETTER EE", 6501); - _unicodeCharacterMap.Add("TAI LE LETTER EH", 6502); - _unicodeCharacterMap.Add("TAI LE LETTER U", 6503); - _unicodeCharacterMap.Add("TAI LE LETTER OO", 6504); - _unicodeCharacterMap.Add("TAI LE LETTER O", 6505); - _unicodeCharacterMap.Add("TAI LE LETTER UE", 6506); - _unicodeCharacterMap.Add("TAI LE LETTER E", 6507); - _unicodeCharacterMap.Add("TAI LE LETTER AUE", 6508); - _unicodeCharacterMap.Add("TAI LE LETTER AI", 6509); - _unicodeCharacterMap.Add("TAI LE LETTER TONE 2", 6512); - _unicodeCharacterMap.Add("TAI LE LETTER TONE 3", 6513); - _unicodeCharacterMap.Add("TAI LE LETTER TONE 4", 6514); - _unicodeCharacterMap.Add("TAI LE LETTER TONE 5", 6515); - _unicodeCharacterMap.Add("TAI LE LETTER TONE 6", 6516); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH QA", 6528); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW QA", 6529); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH KA", 6530); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH XA", 6531); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH NGA", 6532); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW KA", 6533); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW XA", 6534); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW NGA", 6535); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH TSA", 6536); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH SA", 6537); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH YA", 6538); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW TSA", 6539); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW SA", 6540); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW YA", 6541); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH TA", 6542); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH THA", 6543); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH NA", 6544); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW TA", 6545); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW THA", 6546); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW NA", 6547); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH PA", 6548); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH PHA", 6549); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH MA", 6550); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW PA", 6551); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW PHA", 6552); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW MA", 6553); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH FA", 6554); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH VA", 6555); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH LA", 6556); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW FA", 6557); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW VA", 6558); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW LA", 6559); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH HA", 6560); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH DA", 6561); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH BA", 6562); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW HA", 6563); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW DA", 6564); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW BA", 6565); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH KVA", 6566); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH XVA", 6567); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW KVA", 6568); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW XVA", 6569); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER HIGH SUA", 6570); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER LOW SUA", 6571); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN VOWEL SHORTENER", 6576); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN AA", 6577); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN II", 6578); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN U", 6579); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN UU", 6580); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN E", 6581); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN AE", 6582); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN O", 6583); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN OA", 6584); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN UE", 6585); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN AY", 6586); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN AAY", 6587); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN UY", 6588); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN OY", 6589); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN OAY", 6590); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN UEY", 6591); - _unicodeCharacterMap.Add("NEW TAI LUE VOWEL SIGN IY", 6592); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER FINAL V", 6593); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER FINAL NG", 6594); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER FINAL N", 6595); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER FINAL M", 6596); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER FINAL K", 6597); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER FINAL D", 6598); - _unicodeCharacterMap.Add("NEW TAI LUE LETTER FINAL B", 6599); - _unicodeCharacterMap.Add("NEW TAI LUE TONE MARK 1", 6600); - _unicodeCharacterMap.Add("NEW TAI LUE TONE MARK 2", 6601); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT ZERO", 6608); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT ONE", 6609); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT TWO", 6610); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT THREE", 6611); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT FOUR", 6612); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT FIVE", 6613); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT SIX", 6614); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT SEVEN", 6615); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT EIGHT", 6616); - _unicodeCharacterMap.Add("NEW TAI LUE DIGIT NINE", 6617); - _unicodeCharacterMap.Add("NEW TAI LUE THAM DIGIT ONE", 6618); - _unicodeCharacterMap.Add("NEW TAI LUE SIGN LAE", 6622); - _unicodeCharacterMap.Add("NEW TAI LUE SIGN LAEV", 6623); - _unicodeCharacterMap.Add("KHMER SYMBOL PATHAMASAT", 6624); - _unicodeCharacterMap.Add("KHMER SYMBOL MUOY KOET", 6625); - _unicodeCharacterMap.Add("KHMER SYMBOL PII KOET", 6626); - _unicodeCharacterMap.Add("KHMER SYMBOL BEI KOET", 6627); - _unicodeCharacterMap.Add("KHMER SYMBOL BUON KOET", 6628); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM KOET", 6629); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM MUOY KOET", 6630); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM PII KOET", 6631); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM BEI KOET", 6632); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM BUON KOET", 6633); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP KOET", 6634); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP MUOY KOET", 6635); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP PII KOET", 6636); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP BEI KOET", 6637); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP BUON KOET", 6638); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP PRAM KOET", 6639); - _unicodeCharacterMap.Add("KHMER SYMBOL TUTEYASAT", 6640); - _unicodeCharacterMap.Add("KHMER SYMBOL MUOY ROC", 6641); - _unicodeCharacterMap.Add("KHMER SYMBOL PII ROC", 6642); - _unicodeCharacterMap.Add("KHMER SYMBOL BEI ROC", 6643); - _unicodeCharacterMap.Add("KHMER SYMBOL BUON ROC", 6644); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM ROC", 6645); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM MUOY ROC", 6646); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM PII ROC", 6647); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM BEI ROC", 6648); - _unicodeCharacterMap.Add("KHMER SYMBOL PRAM BUON ROC", 6649); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP ROC", 6650); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP MUOY ROC", 6651); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP PII ROC", 6652); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP BEI ROC", 6653); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP BUON ROC", 6654); - _unicodeCharacterMap.Add("KHMER SYMBOL DAP PRAM ROC", 6655); - _unicodeCharacterMap.Add("BUGINESE LETTER KA", 6656); - _unicodeCharacterMap.Add("BUGINESE LETTER GA", 6657); - _unicodeCharacterMap.Add("BUGINESE LETTER NGA", 6658); - _unicodeCharacterMap.Add("BUGINESE LETTER NGKA", 6659); - _unicodeCharacterMap.Add("BUGINESE LETTER PA", 6660); - _unicodeCharacterMap.Add("BUGINESE LETTER BA", 6661); - _unicodeCharacterMap.Add("BUGINESE LETTER MA", 6662); - _unicodeCharacterMap.Add("BUGINESE LETTER MPA", 6663); - _unicodeCharacterMap.Add("BUGINESE LETTER TA", 6664); - _unicodeCharacterMap.Add("BUGINESE LETTER DA", 6665); - _unicodeCharacterMap.Add("BUGINESE LETTER NA", 6666); - _unicodeCharacterMap.Add("BUGINESE LETTER NRA", 6667); - _unicodeCharacterMap.Add("BUGINESE LETTER CA", 6668); - _unicodeCharacterMap.Add("BUGINESE LETTER JA", 6669); - _unicodeCharacterMap.Add("BUGINESE LETTER NYA", 6670); - _unicodeCharacterMap.Add("BUGINESE LETTER NYCA", 6671); - _unicodeCharacterMap.Add("BUGINESE LETTER YA", 6672); - _unicodeCharacterMap.Add("BUGINESE LETTER RA", 6673); - _unicodeCharacterMap.Add("BUGINESE LETTER LA", 6674); - _unicodeCharacterMap.Add("BUGINESE LETTER VA", 6675); - _unicodeCharacterMap.Add("BUGINESE LETTER SA", 6676); - _unicodeCharacterMap.Add("BUGINESE LETTER A", 6677); - _unicodeCharacterMap.Add("BUGINESE LETTER HA", 6678); - _unicodeCharacterMap.Add("BUGINESE VOWEL SIGN I", 6679); - _unicodeCharacterMap.Add("BUGINESE VOWEL SIGN U", 6680); - _unicodeCharacterMap.Add("BUGINESE VOWEL SIGN E", 6681); - _unicodeCharacterMap.Add("BUGINESE VOWEL SIGN O", 6682); - _unicodeCharacterMap.Add("BUGINESE VOWEL SIGN AE", 6683); - _unicodeCharacterMap.Add("BUGINESE PALLAWA", 6686); - _unicodeCharacterMap.Add("BUGINESE END OF SECTION", 6687); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH KA", 6688); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH KHA", 6689); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH KXA", 6690); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW KA", 6691); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW KXA", 6692); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW KHA", 6693); - _unicodeCharacterMap.Add("TAI THAM LETTER NGA", 6694); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH CA", 6695); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH CHA", 6696); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW CA", 6697); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW SA", 6698); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW CHA", 6699); - _unicodeCharacterMap.Add("TAI THAM LETTER NYA", 6700); - _unicodeCharacterMap.Add("TAI THAM LETTER RATA", 6701); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH RATHA", 6702); - _unicodeCharacterMap.Add("TAI THAM LETTER DA", 6703); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW RATHA", 6704); - _unicodeCharacterMap.Add("TAI THAM LETTER RANA", 6705); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH TA", 6706); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH THA", 6707); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW TA", 6708); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW THA", 6709); - _unicodeCharacterMap.Add("TAI THAM LETTER NA", 6710); - _unicodeCharacterMap.Add("TAI THAM LETTER BA", 6711); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH PA", 6712); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH PHA", 6713); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH FA", 6714); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW PA", 6715); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW FA", 6716); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW PHA", 6717); - _unicodeCharacterMap.Add("TAI THAM LETTER MA", 6718); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW YA", 6719); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH YA", 6720); - _unicodeCharacterMap.Add("TAI THAM LETTER RA", 6721); - _unicodeCharacterMap.Add("TAI THAM LETTER RUE", 6722); - _unicodeCharacterMap.Add("TAI THAM LETTER LA", 6723); - _unicodeCharacterMap.Add("TAI THAM LETTER LUE", 6724); - _unicodeCharacterMap.Add("TAI THAM LETTER WA", 6725); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH SHA", 6726); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH SSA", 6727); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH SA", 6728); - _unicodeCharacterMap.Add("TAI THAM LETTER HIGH HA", 6729); - _unicodeCharacterMap.Add("TAI THAM LETTER LLA", 6730); - _unicodeCharacterMap.Add("TAI THAM LETTER A", 6731); - _unicodeCharacterMap.Add("TAI THAM LETTER LOW HA", 6732); - _unicodeCharacterMap.Add("TAI THAM LETTER I", 6733); - _unicodeCharacterMap.Add("TAI THAM LETTER II", 6734); - _unicodeCharacterMap.Add("TAI THAM LETTER U", 6735); - _unicodeCharacterMap.Add("TAI THAM LETTER UU", 6736); - _unicodeCharacterMap.Add("TAI THAM LETTER EE", 6737); - _unicodeCharacterMap.Add("TAI THAM LETTER OO", 6738); - _unicodeCharacterMap.Add("TAI THAM LETTER LAE", 6739); - _unicodeCharacterMap.Add("TAI THAM LETTER GREAT SA", 6740); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN MEDIAL RA", 6741); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN MEDIAL LA", 6742); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN LA TANG LAI", 6743); - _unicodeCharacterMap.Add("TAI THAM SIGN MAI KANG LAI", 6744); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN FINAL NGA", 6745); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN LOW PA", 6746); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA", 6747); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN MA", 6748); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN BA", 6749); - _unicodeCharacterMap.Add("TAI THAM CONSONANT SIGN SA", 6750); - _unicodeCharacterMap.Add("TAI THAM SIGN SAKOT", 6752); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN A", 6753); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN MAI SAT", 6754); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN AA", 6755); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN TALL AA", 6756); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN I", 6757); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN II", 6758); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN UE", 6759); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN UUE", 6760); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN U", 6761); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN UU", 6762); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN O", 6763); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN OA BELOW", 6764); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN OY", 6765); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN E", 6766); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN AE", 6767); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN OO", 6768); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN AI", 6769); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN THAM AI", 6770); - _unicodeCharacterMap.Add("TAI THAM VOWEL SIGN OA ABOVE", 6771); - _unicodeCharacterMap.Add("TAI THAM SIGN MAI KANG", 6772); - _unicodeCharacterMap.Add("TAI THAM SIGN TONE 1", 6773); - _unicodeCharacterMap.Add("TAI THAM SIGN TONE 2", 6774); - _unicodeCharacterMap.Add("TAI THAM SIGN KHUEN TONE 3", 6775); - _unicodeCharacterMap.Add("TAI THAM SIGN KHUEN TONE 4", 6776); - _unicodeCharacterMap.Add("TAI THAM SIGN KHUEN TONE 5", 6777); - _unicodeCharacterMap.Add("TAI THAM SIGN RA HAAM", 6778); - _unicodeCharacterMap.Add("TAI THAM SIGN MAI SAM", 6779); - _unicodeCharacterMap.Add("TAI THAM SIGN KHUEN LUE KARAN", 6780); - _unicodeCharacterMap.Add("TAI THAM COMBINING CRYPTOGRAMMIC DOT", 6783); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT ZERO", 6784); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT ONE", 6785); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT TWO", 6786); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT THREE", 6787); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT FOUR", 6788); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT FIVE", 6789); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT SIX", 6790); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT SEVEN", 6791); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT EIGHT", 6792); - _unicodeCharacterMap.Add("TAI THAM HORA DIGIT NINE", 6793); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT ZERO", 6800); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT ONE", 6801); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT TWO", 6802); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT THREE", 6803); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT FOUR", 6804); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT FIVE", 6805); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT SIX", 6806); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT SEVEN", 6807); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT EIGHT", 6808); - _unicodeCharacterMap.Add("TAI THAM THAM DIGIT NINE", 6809); - _unicodeCharacterMap.Add("TAI THAM SIGN WIANG", 6816); - _unicodeCharacterMap.Add("TAI THAM SIGN WIANGWAAK", 6817); - _unicodeCharacterMap.Add("TAI THAM SIGN SAWAN", 6818); - _unicodeCharacterMap.Add("TAI THAM SIGN KEOW", 6819); - _unicodeCharacterMap.Add("TAI THAM SIGN HOY", 6820); - _unicodeCharacterMap.Add("TAI THAM SIGN DOKMAI", 6821); - _unicodeCharacterMap.Add("TAI THAM SIGN REVERSED ROTATED RANA", 6822); - _unicodeCharacterMap.Add("TAI THAM SIGN MAI YAMOK", 6823); - _unicodeCharacterMap.Add("TAI THAM SIGN KAAN", 6824); - _unicodeCharacterMap.Add("TAI THAM SIGN KAANKUU", 6825); - _unicodeCharacterMap.Add("TAI THAM SIGN SATKAAN", 6826); - _unicodeCharacterMap.Add("TAI THAM SIGN SATKAANKUU", 6827); - _unicodeCharacterMap.Add("TAI THAM SIGN HANG", 6828); - _unicodeCharacterMap.Add("TAI THAM SIGN CAANG", 6829); - _unicodeCharacterMap.Add("COMBINING DOUBLED CIRCUMFLEX ACCENT", 6832); - _unicodeCharacterMap.Add("COMBINING DIAERESIS RING", 6833); - _unicodeCharacterMap.Add("COMBINING INFINITY", 6834); - _unicodeCharacterMap.Add("COMBINING DOWNWARDS ARROW", 6835); - _unicodeCharacterMap.Add("COMBINING TRIPLE DOT", 6836); - _unicodeCharacterMap.Add("COMBINING X X BELOW", 6837); - _unicodeCharacterMap.Add("COMBINING WIGGLY LINE BELOW", 6838); - _unicodeCharacterMap.Add("COMBINING OPEN MARK BELOW", 6839); - _unicodeCharacterMap.Add("COMBINING DOUBLE OPEN MARK BELOW", 6840); - _unicodeCharacterMap.Add("COMBINING LIGHT CENTRALIZATION STROKE BELOW", 6841); - _unicodeCharacterMap.Add("COMBINING STRONG CENTRALIZATION STROKE BELOW", 6842); - _unicodeCharacterMap.Add("COMBINING PARENTHESES ABOVE", 6843); - _unicodeCharacterMap.Add("COMBINING DOUBLE PARENTHESES ABOVE", 6844); - _unicodeCharacterMap.Add("COMBINING PARENTHESES BELOW", 6845); - _unicodeCharacterMap.Add("COMBINING PARENTHESES OVERLAY", 6846); - _unicodeCharacterMap.Add("BALINESE SIGN ULU RICEM", 6912); - _unicodeCharacterMap.Add("BALINESE SIGN ULU CANDRA", 6913); - _unicodeCharacterMap.Add("BALINESE SIGN CECEK", 6914); - _unicodeCharacterMap.Add("BALINESE SIGN SURANG", 6915); - _unicodeCharacterMap.Add("BALINESE SIGN BISAH", 6916); - _unicodeCharacterMap.Add("BALINESE LETTER AKARA", 6917); - _unicodeCharacterMap.Add("BALINESE LETTER AKARA TEDUNG", 6918); - _unicodeCharacterMap.Add("BALINESE LETTER IKARA", 6919); - _unicodeCharacterMap.Add("BALINESE LETTER IKARA TEDUNG", 6920); - _unicodeCharacterMap.Add("BALINESE LETTER UKARA", 6921); - _unicodeCharacterMap.Add("BALINESE LETTER UKARA TEDUNG", 6922); - _unicodeCharacterMap.Add("BALINESE LETTER RA REPA", 6923); - _unicodeCharacterMap.Add("BALINESE LETTER RA REPA TEDUNG", 6924); - _unicodeCharacterMap.Add("BALINESE LETTER LA LENGA", 6925); - _unicodeCharacterMap.Add("BALINESE LETTER LA LENGA TEDUNG", 6926); - _unicodeCharacterMap.Add("BALINESE LETTER EKARA", 6927); - _unicodeCharacterMap.Add("BALINESE LETTER AIKARA", 6928); - _unicodeCharacterMap.Add("BALINESE LETTER OKARA", 6929); - _unicodeCharacterMap.Add("BALINESE LETTER OKARA TEDUNG", 6930); - _unicodeCharacterMap.Add("BALINESE LETTER KA", 6931); - _unicodeCharacterMap.Add("BALINESE LETTER KA MAHAPRANA", 6932); - _unicodeCharacterMap.Add("BALINESE LETTER GA", 6933); - _unicodeCharacterMap.Add("BALINESE LETTER GA GORA", 6934); - _unicodeCharacterMap.Add("BALINESE LETTER NGA", 6935); - _unicodeCharacterMap.Add("BALINESE LETTER CA", 6936); - _unicodeCharacterMap.Add("BALINESE LETTER CA LACA", 6937); - _unicodeCharacterMap.Add("BALINESE LETTER JA", 6938); - _unicodeCharacterMap.Add("BALINESE LETTER JA JERA", 6939); - _unicodeCharacterMap.Add("BALINESE LETTER NYA", 6940); - _unicodeCharacterMap.Add("BALINESE LETTER TA LATIK", 6941); - _unicodeCharacterMap.Add("BALINESE LETTER TA MURDA MAHAPRANA", 6942); - _unicodeCharacterMap.Add("BALINESE LETTER DA MURDA ALPAPRANA", 6943); - _unicodeCharacterMap.Add("BALINESE LETTER DA MURDA MAHAPRANA", 6944); - _unicodeCharacterMap.Add("BALINESE LETTER NA RAMBAT", 6945); - _unicodeCharacterMap.Add("BALINESE LETTER TA", 6946); - _unicodeCharacterMap.Add("BALINESE LETTER TA TAWA", 6947); - _unicodeCharacterMap.Add("BALINESE LETTER DA", 6948); - _unicodeCharacterMap.Add("BALINESE LETTER DA MADU", 6949); - _unicodeCharacterMap.Add("BALINESE LETTER NA", 6950); - _unicodeCharacterMap.Add("BALINESE LETTER PA", 6951); - _unicodeCharacterMap.Add("BALINESE LETTER PA KAPAL", 6952); - _unicodeCharacterMap.Add("BALINESE LETTER BA", 6953); - _unicodeCharacterMap.Add("BALINESE LETTER BA KEMBANG", 6954); - _unicodeCharacterMap.Add("BALINESE LETTER MA", 6955); - _unicodeCharacterMap.Add("BALINESE LETTER YA", 6956); - _unicodeCharacterMap.Add("BALINESE LETTER RA", 6957); - _unicodeCharacterMap.Add("BALINESE LETTER LA", 6958); - _unicodeCharacterMap.Add("BALINESE LETTER WA", 6959); - _unicodeCharacterMap.Add("BALINESE LETTER SA SAGA", 6960); - _unicodeCharacterMap.Add("BALINESE LETTER SA SAPA", 6961); - _unicodeCharacterMap.Add("BALINESE LETTER SA", 6962); - _unicodeCharacterMap.Add("BALINESE LETTER HA", 6963); - _unicodeCharacterMap.Add("BALINESE SIGN REREKAN", 6964); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN TEDUNG", 6965); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN ULU", 6966); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN ULU SARI", 6967); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN SUKU", 6968); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN SUKU ILUT", 6969); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN RA REPA", 6970); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN RA REPA TEDUNG", 6971); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN LA LENGA", 6972); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN LA LENGA TEDUNG", 6973); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN TALING", 6974); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN TALING REPA", 6975); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN TALING TEDUNG", 6976); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN TALING REPA TEDUNG", 6977); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN PEPET", 6978); - _unicodeCharacterMap.Add("BALINESE VOWEL SIGN PEPET TEDUNG", 6979); - _unicodeCharacterMap.Add("BALINESE ADEG ADEG", 6980); - _unicodeCharacterMap.Add("BALINESE LETTER KAF SASAK", 6981); - _unicodeCharacterMap.Add("BALINESE LETTER KHOT SASAK", 6982); - _unicodeCharacterMap.Add("BALINESE LETTER TZIR SASAK", 6983); - _unicodeCharacterMap.Add("BALINESE LETTER EF SASAK", 6984); - _unicodeCharacterMap.Add("BALINESE LETTER VE SASAK", 6985); - _unicodeCharacterMap.Add("BALINESE LETTER ZAL SASAK", 6986); - _unicodeCharacterMap.Add("BALINESE LETTER ASYURA SASAK", 6987); - _unicodeCharacterMap.Add("BALINESE DIGIT ZERO", 6992); - _unicodeCharacterMap.Add("BALINESE DIGIT ONE", 6993); - _unicodeCharacterMap.Add("BALINESE DIGIT TWO", 6994); - _unicodeCharacterMap.Add("BALINESE DIGIT THREE", 6995); - _unicodeCharacterMap.Add("BALINESE DIGIT FOUR", 6996); - _unicodeCharacterMap.Add("BALINESE DIGIT FIVE", 6997); - _unicodeCharacterMap.Add("BALINESE DIGIT SIX", 6998); - _unicodeCharacterMap.Add("BALINESE DIGIT SEVEN", 6999); - _unicodeCharacterMap.Add("BALINESE DIGIT EIGHT", 7000); - _unicodeCharacterMap.Add("BALINESE DIGIT NINE", 7001); - _unicodeCharacterMap.Add("BALINESE PANTI", 7002); - _unicodeCharacterMap.Add("BALINESE PAMADA", 7003); - _unicodeCharacterMap.Add("BALINESE WINDU", 7004); - _unicodeCharacterMap.Add("BALINESE CARIK PAMUNGKAH", 7005); - _unicodeCharacterMap.Add("BALINESE CARIK SIKI", 7006); - _unicodeCharacterMap.Add("BALINESE CARIK PAREREN", 7007); - _unicodeCharacterMap.Add("BALINESE PAMENENG", 7008); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DONG", 7009); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DENG", 7010); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DUNG", 7011); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DANG", 7012); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DANG SURANG", 7013); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DING", 7014); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DAENG", 7015); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DEUNG", 7016); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DAING", 7017); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL DANG GEDE", 7018); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING TEGEH", 7019); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING ENDEP", 7020); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING KEMPUL", 7021); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING KEMPLI", 7022); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING JEGOGAN", 7023); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN", 7024); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN", 7025); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING BENDE", 7026); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL COMBINING GONG", 7027); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL RIGHT HAND OPEN DUG", 7028); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL RIGHT HAND OPEN DAG", 7029); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL RIGHT HAND CLOSED TUK", 7030); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL RIGHT HAND CLOSED TAK", 7031); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL LEFT HAND OPEN PANG", 7032); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL LEFT HAND OPEN PUNG", 7033); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL LEFT HAND CLOSED PLAK", 7034); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL LEFT HAND CLOSED PLUK", 7035); - _unicodeCharacterMap.Add("BALINESE MUSICAL SYMBOL LEFT HAND OPEN PING", 7036); - _unicodeCharacterMap.Add("SUNDANESE SIGN PANYECEK", 7040); - _unicodeCharacterMap.Add("SUNDANESE SIGN PANGLAYAR", 7041); - _unicodeCharacterMap.Add("SUNDANESE SIGN PANGWISAD", 7042); - _unicodeCharacterMap.Add("SUNDANESE LETTER A", 7043); - _unicodeCharacterMap.Add("SUNDANESE LETTER I", 7044); - _unicodeCharacterMap.Add("SUNDANESE LETTER U", 7045); - _unicodeCharacterMap.Add("SUNDANESE LETTER AE", 7046); - _unicodeCharacterMap.Add("SUNDANESE LETTER O", 7047); - _unicodeCharacterMap.Add("SUNDANESE LETTER E", 7048); - _unicodeCharacterMap.Add("SUNDANESE LETTER EU", 7049); - _unicodeCharacterMap.Add("SUNDANESE LETTER KA", 7050); - _unicodeCharacterMap.Add("SUNDANESE LETTER QA", 7051); - _unicodeCharacterMap.Add("SUNDANESE LETTER GA", 7052); - _unicodeCharacterMap.Add("SUNDANESE LETTER NGA", 7053); - _unicodeCharacterMap.Add("SUNDANESE LETTER CA", 7054); - _unicodeCharacterMap.Add("SUNDANESE LETTER JA", 7055); - _unicodeCharacterMap.Add("SUNDANESE LETTER ZA", 7056); - _unicodeCharacterMap.Add("SUNDANESE LETTER NYA", 7057); - _unicodeCharacterMap.Add("SUNDANESE LETTER TA", 7058); - _unicodeCharacterMap.Add("SUNDANESE LETTER DA", 7059); - _unicodeCharacterMap.Add("SUNDANESE LETTER NA", 7060); - _unicodeCharacterMap.Add("SUNDANESE LETTER PA", 7061); - _unicodeCharacterMap.Add("SUNDANESE LETTER FA", 7062); - _unicodeCharacterMap.Add("SUNDANESE LETTER VA", 7063); - _unicodeCharacterMap.Add("SUNDANESE LETTER BA", 7064); - _unicodeCharacterMap.Add("SUNDANESE LETTER MA", 7065); - _unicodeCharacterMap.Add("SUNDANESE LETTER YA", 7066); - _unicodeCharacterMap.Add("SUNDANESE LETTER RA", 7067); - _unicodeCharacterMap.Add("SUNDANESE LETTER LA", 7068); - _unicodeCharacterMap.Add("SUNDANESE LETTER WA", 7069); - _unicodeCharacterMap.Add("SUNDANESE LETTER SA", 7070); - _unicodeCharacterMap.Add("SUNDANESE LETTER XA", 7071); - _unicodeCharacterMap.Add("SUNDANESE LETTER HA", 7072); - _unicodeCharacterMap.Add("SUNDANESE CONSONANT SIGN PAMINGKAL", 7073); - _unicodeCharacterMap.Add("SUNDANESE CONSONANT SIGN PANYAKRA", 7074); - _unicodeCharacterMap.Add("SUNDANESE CONSONANT SIGN PANYIKU", 7075); - _unicodeCharacterMap.Add("SUNDANESE VOWEL SIGN PANGHULU", 7076); - _unicodeCharacterMap.Add("SUNDANESE VOWEL SIGN PANYUKU", 7077); - _unicodeCharacterMap.Add("SUNDANESE VOWEL SIGN PANAELAENG", 7078); - _unicodeCharacterMap.Add("SUNDANESE VOWEL SIGN PANOLONG", 7079); - _unicodeCharacterMap.Add("SUNDANESE VOWEL SIGN PAMEPET", 7080); - _unicodeCharacterMap.Add("SUNDANESE VOWEL SIGN PANEULEUNG", 7081); - _unicodeCharacterMap.Add("SUNDANESE SIGN PAMAAEH", 7082); - _unicodeCharacterMap.Add("SUNDANESE SIGN VIRAMA", 7083); - _unicodeCharacterMap.Add("SUNDANESE CONSONANT SIGN PASANGAN MA", 7084); - _unicodeCharacterMap.Add("SUNDANESE CONSONANT SIGN PASANGAN WA", 7085); - _unicodeCharacterMap.Add("SUNDANESE LETTER KHA", 7086); - _unicodeCharacterMap.Add("SUNDANESE LETTER SYA", 7087); - _unicodeCharacterMap.Add("SUNDANESE DIGIT ZERO", 7088); - _unicodeCharacterMap.Add("SUNDANESE DIGIT ONE", 7089); - _unicodeCharacterMap.Add("SUNDANESE DIGIT TWO", 7090); - _unicodeCharacterMap.Add("SUNDANESE DIGIT THREE", 7091); - _unicodeCharacterMap.Add("SUNDANESE DIGIT FOUR", 7092); - _unicodeCharacterMap.Add("SUNDANESE DIGIT FIVE", 7093); - _unicodeCharacterMap.Add("SUNDANESE DIGIT SIX", 7094); - _unicodeCharacterMap.Add("SUNDANESE DIGIT SEVEN", 7095); - _unicodeCharacterMap.Add("SUNDANESE DIGIT EIGHT", 7096); - _unicodeCharacterMap.Add("SUNDANESE DIGIT NINE", 7097); - _unicodeCharacterMap.Add("SUNDANESE AVAGRAHA", 7098); - _unicodeCharacterMap.Add("SUNDANESE LETTER REU", 7099); - _unicodeCharacterMap.Add("SUNDANESE LETTER LEU", 7100); - _unicodeCharacterMap.Add("SUNDANESE LETTER BHA", 7101); - _unicodeCharacterMap.Add("SUNDANESE LETTER FINAL K", 7102); - _unicodeCharacterMap.Add("SUNDANESE LETTER FINAL M", 7103); - _unicodeCharacterMap.Add("BATAK LETTER A", 7104); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN A", 7105); - _unicodeCharacterMap.Add("BATAK LETTER HA", 7106); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN HA", 7107); - _unicodeCharacterMap.Add("BATAK LETTER MANDAILING HA", 7108); - _unicodeCharacterMap.Add("BATAK LETTER BA", 7109); - _unicodeCharacterMap.Add("BATAK LETTER KARO BA", 7110); - _unicodeCharacterMap.Add("BATAK LETTER PA", 7111); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN PA", 7112); - _unicodeCharacterMap.Add("BATAK LETTER NA", 7113); - _unicodeCharacterMap.Add("BATAK LETTER MANDAILING NA", 7114); - _unicodeCharacterMap.Add("BATAK LETTER WA", 7115); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN WA", 7116); - _unicodeCharacterMap.Add("BATAK LETTER PAKPAK WA", 7117); - _unicodeCharacterMap.Add("BATAK LETTER GA", 7118); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN GA", 7119); - _unicodeCharacterMap.Add("BATAK LETTER JA", 7120); - _unicodeCharacterMap.Add("BATAK LETTER DA", 7121); - _unicodeCharacterMap.Add("BATAK LETTER RA", 7122); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN RA", 7123); - _unicodeCharacterMap.Add("BATAK LETTER MA", 7124); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN MA", 7125); - _unicodeCharacterMap.Add("BATAK LETTER SOUTHERN TA", 7126); - _unicodeCharacterMap.Add("BATAK LETTER NORTHERN TA", 7127); - _unicodeCharacterMap.Add("BATAK LETTER SA", 7128); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN SA", 7129); - _unicodeCharacterMap.Add("BATAK LETTER MANDAILING SA", 7130); - _unicodeCharacterMap.Add("BATAK LETTER YA", 7131); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN YA", 7132); - _unicodeCharacterMap.Add("BATAK LETTER NGA", 7133); - _unicodeCharacterMap.Add("BATAK LETTER LA", 7134); - _unicodeCharacterMap.Add("BATAK LETTER SIMALUNGUN LA", 7135); - _unicodeCharacterMap.Add("BATAK LETTER NYA", 7136); - _unicodeCharacterMap.Add("BATAK LETTER CA", 7137); - _unicodeCharacterMap.Add("BATAK LETTER NDA", 7138); - _unicodeCharacterMap.Add("BATAK LETTER MBA", 7139); - _unicodeCharacterMap.Add("BATAK LETTER I", 7140); - _unicodeCharacterMap.Add("BATAK LETTER U", 7141); - _unicodeCharacterMap.Add("BATAK SIGN TOMPI", 7142); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN E", 7143); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN PAKPAK E", 7144); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN EE", 7145); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN I", 7146); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN KARO I", 7147); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN O", 7148); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN KARO O", 7149); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN U", 7150); - _unicodeCharacterMap.Add("BATAK VOWEL SIGN U FOR SIMALUNGUN SA", 7151); - _unicodeCharacterMap.Add("BATAK CONSONANT SIGN NG", 7152); - _unicodeCharacterMap.Add("BATAK CONSONANT SIGN H", 7153); - _unicodeCharacterMap.Add("BATAK PANGOLAT", 7154); - _unicodeCharacterMap.Add("BATAK PANONGONAN", 7155); - _unicodeCharacterMap.Add("BATAK SYMBOL BINDU NA METEK", 7164); - _unicodeCharacterMap.Add("BATAK SYMBOL BINDU PINARBORAS", 7165); - _unicodeCharacterMap.Add("BATAK SYMBOL BINDU JUDUL", 7166); - _unicodeCharacterMap.Add("BATAK SYMBOL BINDU PANGOLAT", 7167); - _unicodeCharacterMap.Add("LEPCHA LETTER KA", 7168); - _unicodeCharacterMap.Add("LEPCHA LETTER KLA", 7169); - _unicodeCharacterMap.Add("LEPCHA LETTER KHA", 7170); - _unicodeCharacterMap.Add("LEPCHA LETTER GA", 7171); - _unicodeCharacterMap.Add("LEPCHA LETTER GLA", 7172); - _unicodeCharacterMap.Add("LEPCHA LETTER NGA", 7173); - _unicodeCharacterMap.Add("LEPCHA LETTER CA", 7174); - _unicodeCharacterMap.Add("LEPCHA LETTER CHA", 7175); - _unicodeCharacterMap.Add("LEPCHA LETTER JA", 7176); - _unicodeCharacterMap.Add("LEPCHA LETTER NYA", 7177); - _unicodeCharacterMap.Add("LEPCHA LETTER TA", 7178); - _unicodeCharacterMap.Add("LEPCHA LETTER THA", 7179); - _unicodeCharacterMap.Add("LEPCHA LETTER DA", 7180); - _unicodeCharacterMap.Add("LEPCHA LETTER NA", 7181); - _unicodeCharacterMap.Add("LEPCHA LETTER PA", 7182); - _unicodeCharacterMap.Add("LEPCHA LETTER PLA", 7183); - _unicodeCharacterMap.Add("LEPCHA LETTER PHA", 7184); - _unicodeCharacterMap.Add("LEPCHA LETTER FA", 7185); - _unicodeCharacterMap.Add("LEPCHA LETTER FLA", 7186); - _unicodeCharacterMap.Add("LEPCHA LETTER BA", 7187); - _unicodeCharacterMap.Add("LEPCHA LETTER BLA", 7188); - _unicodeCharacterMap.Add("LEPCHA LETTER MA", 7189); - _unicodeCharacterMap.Add("LEPCHA LETTER MLA", 7190); - _unicodeCharacterMap.Add("LEPCHA LETTER TSA", 7191); - _unicodeCharacterMap.Add("LEPCHA LETTER TSHA", 7192); - _unicodeCharacterMap.Add("LEPCHA LETTER DZA", 7193); - _unicodeCharacterMap.Add("LEPCHA LETTER YA", 7194); - _unicodeCharacterMap.Add("LEPCHA LETTER RA", 7195); - _unicodeCharacterMap.Add("LEPCHA LETTER LA", 7196); - _unicodeCharacterMap.Add("LEPCHA LETTER HA", 7197); - _unicodeCharacterMap.Add("LEPCHA LETTER HLA", 7198); - _unicodeCharacterMap.Add("LEPCHA LETTER VA", 7199); - _unicodeCharacterMap.Add("LEPCHA LETTER SA", 7200); - _unicodeCharacterMap.Add("LEPCHA LETTER SHA", 7201); - _unicodeCharacterMap.Add("LEPCHA LETTER WA", 7202); - _unicodeCharacterMap.Add("LEPCHA LETTER A", 7203); - _unicodeCharacterMap.Add("LEPCHA SUBJOINED LETTER YA", 7204); - _unicodeCharacterMap.Add("LEPCHA SUBJOINED LETTER RA", 7205); - _unicodeCharacterMap.Add("LEPCHA VOWEL SIGN AA", 7206); - _unicodeCharacterMap.Add("LEPCHA VOWEL SIGN I", 7207); - _unicodeCharacterMap.Add("LEPCHA VOWEL SIGN O", 7208); - _unicodeCharacterMap.Add("LEPCHA VOWEL SIGN OO", 7209); - _unicodeCharacterMap.Add("LEPCHA VOWEL SIGN U", 7210); - _unicodeCharacterMap.Add("LEPCHA VOWEL SIGN UU", 7211); - _unicodeCharacterMap.Add("LEPCHA VOWEL SIGN E", 7212); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN K", 7213); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN M", 7214); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN L", 7215); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN N", 7216); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN P", 7217); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN R", 7218); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN T", 7219); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN NYIN DO", 7220); - _unicodeCharacterMap.Add("LEPCHA CONSONANT SIGN KANG", 7221); - _unicodeCharacterMap.Add("LEPCHA SIGN RAN", 7222); - _unicodeCharacterMap.Add("LEPCHA SIGN NUKTA", 7223); - _unicodeCharacterMap.Add("LEPCHA PUNCTUATION TA ROL", 7227); - _unicodeCharacterMap.Add("LEPCHA PUNCTUATION NYET THYOOM TA ROL", 7228); - _unicodeCharacterMap.Add("LEPCHA PUNCTUATION CER WA", 7229); - _unicodeCharacterMap.Add("LEPCHA PUNCTUATION TSHOOK CER WA", 7230); - _unicodeCharacterMap.Add("LEPCHA PUNCTUATION TSHOOK", 7231); - _unicodeCharacterMap.Add("LEPCHA DIGIT ZERO", 7232); - _unicodeCharacterMap.Add("LEPCHA DIGIT ONE", 7233); - _unicodeCharacterMap.Add("LEPCHA DIGIT TWO", 7234); - _unicodeCharacterMap.Add("LEPCHA DIGIT THREE", 7235); - _unicodeCharacterMap.Add("LEPCHA DIGIT FOUR", 7236); - _unicodeCharacterMap.Add("LEPCHA DIGIT FIVE", 7237); - _unicodeCharacterMap.Add("LEPCHA DIGIT SIX", 7238); - _unicodeCharacterMap.Add("LEPCHA DIGIT SEVEN", 7239); - _unicodeCharacterMap.Add("LEPCHA DIGIT EIGHT", 7240); - _unicodeCharacterMap.Add("LEPCHA DIGIT NINE", 7241); - _unicodeCharacterMap.Add("LEPCHA LETTER TTA", 7245); - _unicodeCharacterMap.Add("LEPCHA LETTER TTHA", 7246); - _unicodeCharacterMap.Add("LEPCHA LETTER DDA", 7247); - _unicodeCharacterMap.Add("OL CHIKI DIGIT ZERO", 7248); - _unicodeCharacterMap.Add("OL CHIKI DIGIT ONE", 7249); - _unicodeCharacterMap.Add("OL CHIKI DIGIT TWO", 7250); - _unicodeCharacterMap.Add("OL CHIKI DIGIT THREE", 7251); - _unicodeCharacterMap.Add("OL CHIKI DIGIT FOUR", 7252); - _unicodeCharacterMap.Add("OL CHIKI DIGIT FIVE", 7253); - _unicodeCharacterMap.Add("OL CHIKI DIGIT SIX", 7254); - _unicodeCharacterMap.Add("OL CHIKI DIGIT SEVEN", 7255); - _unicodeCharacterMap.Add("OL CHIKI DIGIT EIGHT", 7256); - _unicodeCharacterMap.Add("OL CHIKI DIGIT NINE", 7257); - _unicodeCharacterMap.Add("OL CHIKI LETTER LA", 7258); - _unicodeCharacterMap.Add("OL CHIKI LETTER AT", 7259); - _unicodeCharacterMap.Add("OL CHIKI LETTER AG", 7260); - _unicodeCharacterMap.Add("OL CHIKI LETTER ANG", 7261); - _unicodeCharacterMap.Add("OL CHIKI LETTER AL", 7262); - _unicodeCharacterMap.Add("OL CHIKI LETTER LAA", 7263); - _unicodeCharacterMap.Add("OL CHIKI LETTER AAK", 7264); - _unicodeCharacterMap.Add("OL CHIKI LETTER AAJ", 7265); - _unicodeCharacterMap.Add("OL CHIKI LETTER AAM", 7266); - _unicodeCharacterMap.Add("OL CHIKI LETTER AAW", 7267); - _unicodeCharacterMap.Add("OL CHIKI LETTER LI", 7268); - _unicodeCharacterMap.Add("OL CHIKI LETTER IS", 7269); - _unicodeCharacterMap.Add("OL CHIKI LETTER IH", 7270); - _unicodeCharacterMap.Add("OL CHIKI LETTER INY", 7271); - _unicodeCharacterMap.Add("OL CHIKI LETTER IR", 7272); - _unicodeCharacterMap.Add("OL CHIKI LETTER LU", 7273); - _unicodeCharacterMap.Add("OL CHIKI LETTER UC", 7274); - _unicodeCharacterMap.Add("OL CHIKI LETTER UD", 7275); - _unicodeCharacterMap.Add("OL CHIKI LETTER UNN", 7276); - _unicodeCharacterMap.Add("OL CHIKI LETTER UY", 7277); - _unicodeCharacterMap.Add("OL CHIKI LETTER LE", 7278); - _unicodeCharacterMap.Add("OL CHIKI LETTER EP", 7279); - _unicodeCharacterMap.Add("OL CHIKI LETTER EDD", 7280); - _unicodeCharacterMap.Add("OL CHIKI LETTER EN", 7281); - _unicodeCharacterMap.Add("OL CHIKI LETTER ERR", 7282); - _unicodeCharacterMap.Add("OL CHIKI LETTER LO", 7283); - _unicodeCharacterMap.Add("OL CHIKI LETTER OTT", 7284); - _unicodeCharacterMap.Add("OL CHIKI LETTER OB", 7285); - _unicodeCharacterMap.Add("OL CHIKI LETTER OV", 7286); - _unicodeCharacterMap.Add("OL CHIKI LETTER OH", 7287); - _unicodeCharacterMap.Add("OL CHIKI MU TTUDDAG", 7288); - _unicodeCharacterMap.Add("OL CHIKI GAAHLAA TTUDDAAG", 7289); - _unicodeCharacterMap.Add("OL CHIKI MU GAAHLAA TTUDDAAG", 7290); - _unicodeCharacterMap.Add("OL CHIKI RELAA", 7291); - _unicodeCharacterMap.Add("OL CHIKI PHAARKAA", 7292); - _unicodeCharacterMap.Add("OL CHIKI AHAD", 7293); - _unicodeCharacterMap.Add("OL CHIKI PUNCTUATION MUCAAD", 7294); - _unicodeCharacterMap.Add("OL CHIKI PUNCTUATION DOUBLE MUCAAD", 7295); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ROUNDED VE", 7296); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER LONG LEGGED DE", 7297); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER NARROW O", 7298); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER WIDE ES", 7299); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TALL TE", 7300); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER THREE LEGGED TE", 7301); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TALL HARD SIGN", 7302); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TALL YAT", 7303); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER UNBLENDED UK", 7304); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU SURYA", 7360); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU PANGLONG", 7361); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU PURNAMA", 7362); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU CAKRA", 7363); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU LEU SATANGA", 7364); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU KA SATANGA", 7365); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU DA SATANGA", 7366); - _unicodeCharacterMap.Add("SUNDANESE PUNCTUATION BINDU BA SATANGA", 7367); - _unicodeCharacterMap.Add("VEDIC TONE KARSHANA", 7376); - _unicodeCharacterMap.Add("VEDIC TONE SHARA", 7377); - _unicodeCharacterMap.Add("VEDIC TONE PRENKHA", 7378); - _unicodeCharacterMap.Add("VEDIC SIGN NIHSHVASA", 7379); - _unicodeCharacterMap.Add("VEDIC SIGN YAJURVEDIC MIDLINE SVARITA", 7380); - _unicodeCharacterMap.Add("VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA", 7381); - _unicodeCharacterMap.Add("VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA", 7382); - _unicodeCharacterMap.Add("VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA", 7383); - _unicodeCharacterMap.Add("VEDIC TONE CANDRA BELOW", 7384); - _unicodeCharacterMap.Add("VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER", 7385); - _unicodeCharacterMap.Add("VEDIC TONE DOUBLE SVARITA", 7386); - _unicodeCharacterMap.Add("VEDIC TONE TRIPLE SVARITA", 7387); - _unicodeCharacterMap.Add("VEDIC TONE KATHAKA ANUDATTA", 7388); - _unicodeCharacterMap.Add("VEDIC TONE DOT BELOW", 7389); - _unicodeCharacterMap.Add("VEDIC TONE TWO DOTS BELOW", 7390); - _unicodeCharacterMap.Add("VEDIC TONE THREE DOTS BELOW", 7391); - _unicodeCharacterMap.Add("VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA", 7392); - _unicodeCharacterMap.Add("VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA", 7393); - _unicodeCharacterMap.Add("VEDIC SIGN VISARGA SVARITA", 7394); - _unicodeCharacterMap.Add("VEDIC SIGN VISARGA UDATTA", 7395); - _unicodeCharacterMap.Add("VEDIC SIGN REVERSED VISARGA UDATTA", 7396); - _unicodeCharacterMap.Add("VEDIC SIGN VISARGA ANUDATTA", 7397); - _unicodeCharacterMap.Add("VEDIC SIGN REVERSED VISARGA ANUDATTA", 7398); - _unicodeCharacterMap.Add("VEDIC SIGN VISARGA UDATTA WITH TAIL", 7399); - _unicodeCharacterMap.Add("VEDIC SIGN VISARGA ANUDATTA WITH TAIL", 7400); - _unicodeCharacterMap.Add("VEDIC SIGN ANUSVARA ANTARGOMUKHA", 7401); - _unicodeCharacterMap.Add("VEDIC SIGN ANUSVARA BAHIRGOMUKHA", 7402); - _unicodeCharacterMap.Add("VEDIC SIGN ANUSVARA VAMAGOMUKHA", 7403); - _unicodeCharacterMap.Add("VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL", 7404); - _unicodeCharacterMap.Add("VEDIC SIGN TIRYAK", 7405); - _unicodeCharacterMap.Add("VEDIC SIGN HEXIFORM LONG ANUSVARA", 7406); - _unicodeCharacterMap.Add("VEDIC SIGN LONG ANUSVARA", 7407); - _unicodeCharacterMap.Add("VEDIC SIGN RTHANG LONG ANUSVARA", 7408); - _unicodeCharacterMap.Add("VEDIC SIGN ANUSVARA UBHAYATO MUKHA", 7409); - _unicodeCharacterMap.Add("VEDIC SIGN ARDHAVISARGA", 7410); - _unicodeCharacterMap.Add("VEDIC SIGN ROTATED ARDHAVISARGA", 7411); - _unicodeCharacterMap.Add("VEDIC TONE CANDRA ABOVE", 7412); - _unicodeCharacterMap.Add("VEDIC SIGN JIHVAMULIYA", 7413); - _unicodeCharacterMap.Add("VEDIC SIGN UPADHMANIYA", 7414); - _unicodeCharacterMap.Add("VEDIC TONE RING ABOVE", 7416); - _unicodeCharacterMap.Add("VEDIC TONE DOUBLE RING ABOVE", 7417); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL A", 7424); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL AE", 7425); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED AE", 7426); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL BARRED B", 7427); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL C", 7428); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL D", 7429); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL ETH", 7430); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL E", 7431); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED OPEN E", 7432); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED I", 7433); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL J", 7434); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL K", 7435); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL L WITH STROKE", 7436); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL M", 7437); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL REVERSED N", 7438); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL O", 7439); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL OPEN O", 7440); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SIDEWAYS O", 7441); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SIDEWAYS OPEN O", 7442); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SIDEWAYS O WITH STROKE", 7443); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED OE", 7444); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL OU", 7445); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TOP HALF O", 7446); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BOTTOM HALF O", 7447); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL P", 7448); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL REVERSED R", 7449); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL TURNED R", 7450); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL T", 7451); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL U", 7452); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SIDEWAYS U", 7453); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SIDEWAYS DIAERESIZED U", 7454); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SIDEWAYS TURNED M", 7455); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL V", 7456); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL W", 7457); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL Z", 7458); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL EZH", 7459); - _unicodeCharacterMap.Add("LATIN LETTER VOICED LARYNGEAL SPIRANT", 7460); - _unicodeCharacterMap.Add("LATIN LETTER AIN", 7461); - _unicodeCharacterMap.Add("GREEK LETTER SMALL CAPITAL GAMMA", 7462); - _unicodeCharacterMap.Add("GREEK LETTER SMALL CAPITAL LAMDA", 7463); - _unicodeCharacterMap.Add("GREEK LETTER SMALL CAPITAL PI", 7464); - _unicodeCharacterMap.Add("GREEK LETTER SMALL CAPITAL RHO", 7465); - _unicodeCharacterMap.Add("GREEK LETTER SMALL CAPITAL PSI", 7466); - _unicodeCharacterMap.Add("CYRILLIC LETTER SMALL CAPITAL EL", 7467); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL A", 7468); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL AE", 7469); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL B", 7470); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL BARRED B", 7471); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL D", 7472); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL E", 7473); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL REVERSED E", 7474); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL G", 7475); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL H", 7476); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL I", 7477); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL J", 7478); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL K", 7479); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL L", 7480); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL M", 7481); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL N", 7482); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL REVERSED N", 7483); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL O", 7484); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL OU", 7485); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL P", 7486); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL R", 7487); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL T", 7488); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL U", 7489); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL W", 7490); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL A", 7491); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED A", 7492); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL ALPHA", 7493); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED AE", 7494); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL B", 7495); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL D", 7496); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL E", 7497); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL SCHWA", 7498); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL OPEN E", 7499); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED OPEN E", 7500); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL G", 7501); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED I", 7502); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL K", 7503); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL M", 7504); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL ENG", 7505); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL O", 7506); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL OPEN O", 7507); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TOP HALF O", 7508); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL BOTTOM HALF O", 7509); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL P", 7510); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL T", 7511); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL U", 7512); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL SIDEWAYS U", 7513); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED M", 7514); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL V", 7515); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL AIN", 7516); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL BETA", 7517); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL GREEK GAMMA", 7518); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL DELTA", 7519); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL GREEK PHI", 7520); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL CHI", 7521); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER I", 7522); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER R", 7523); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER U", 7524); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER V", 7525); - _unicodeCharacterMap.Add("GREEK SUBSCRIPT SMALL LETTER BETA", 7526); - _unicodeCharacterMap.Add("GREEK SUBSCRIPT SMALL LETTER GAMMA", 7527); - _unicodeCharacterMap.Add("GREEK SUBSCRIPT SMALL LETTER RHO", 7528); - _unicodeCharacterMap.Add("GREEK SUBSCRIPT SMALL LETTER PHI", 7529); - _unicodeCharacterMap.Add("GREEK SUBSCRIPT SMALL LETTER CHI", 7530); - _unicodeCharacterMap.Add("LATIN SMALL LETTER UE", 7531); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH MIDDLE TILDE", 7532); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH MIDDLE TILDE", 7533); - _unicodeCharacterMap.Add("LATIN SMALL LETTER F WITH MIDDLE TILDE", 7534); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M WITH MIDDLE TILDE", 7535); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH MIDDLE TILDE", 7536); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH MIDDLE TILDE", 7537); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH MIDDLE TILDE", 7538); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE", 7539); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH MIDDLE TILDE", 7540); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH MIDDLE TILDE", 7541); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH MIDDLE TILDE", 7542); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED G", 7543); - _unicodeCharacterMap.Add("MODIFIER LETTER CYRILLIC EN", 7544); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INSULAR G", 7545); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TH WITH STRIKETHROUGH", 7546); - _unicodeCharacterMap.Add("LATIN SMALL CAPITAL LETTER I WITH STROKE", 7547); - _unicodeCharacterMap.Add("LATIN SMALL LETTER IOTA WITH STROKE", 7548); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH STROKE", 7549); - _unicodeCharacterMap.Add("LATIN SMALL CAPITAL LETTER U WITH STROKE", 7550); - _unicodeCharacterMap.Add("LATIN SMALL LETTER UPSILON WITH STROKE", 7551); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH PALATAL HOOK", 7552); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH PALATAL HOOK", 7553); - _unicodeCharacterMap.Add("LATIN SMALL LETTER F WITH PALATAL HOOK", 7554); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH PALATAL HOOK", 7555); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH PALATAL HOOK", 7556); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH PALATAL HOOK", 7557); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M WITH PALATAL HOOK", 7558); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH PALATAL HOOK", 7559); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH PALATAL HOOK", 7560); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH PALATAL HOOK", 7561); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH PALATAL HOOK", 7562); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ESH WITH PALATAL HOOK", 7563); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V WITH PALATAL HOOK", 7564); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X WITH PALATAL HOOK", 7565); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH PALATAL HOOK", 7566); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH RETROFLEX HOOK", 7567); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK", 7568); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH HOOK AND TAIL", 7569); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH RETROFLEX HOOK", 7570); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK", 7571); - _unicodeCharacterMap.Add("LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK", 7572); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK", 7573); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH RETROFLEX HOOK", 7574); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK", 7575); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ESH WITH RETROFLEX HOOK", 7576); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH RETROFLEX HOOK", 7577); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EZH WITH RETROFLEX HOOK", 7578); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED ALPHA", 7579); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL C", 7580); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL C WITH CURL", 7581); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL ETH", 7582); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL REVERSED OPEN E", 7583); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL F", 7584); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL DOTLESS J WITH STROKE", 7585); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL SCRIPT G", 7586); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED H", 7587); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL I WITH STROKE", 7588); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL IOTA", 7589); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL CAPITAL I", 7590); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL CAPITAL I WITH STROKE", 7591); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL J WITH CROSSED TAIL", 7592); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL L WITH RETROFLEX HOOK", 7593); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL L WITH PALATAL HOOK", 7594); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL CAPITAL L", 7595); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL M WITH HOOK", 7596); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED M WITH LONG LEG", 7597); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL N WITH LEFT HOOK", 7598); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL N WITH RETROFLEX HOOK", 7599); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL CAPITAL N", 7600); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL BARRED O", 7601); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL PHI", 7602); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL S WITH HOOK", 7603); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL ESH", 7604); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL T WITH PALATAL HOOK", 7605); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL U BAR", 7606); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL UPSILON", 7607); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL CAPITAL U", 7608); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL V WITH HOOK", 7609); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL TURNED V", 7610); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL Z", 7611); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK", 7612); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL Z WITH CURL", 7613); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL EZH", 7614); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL THETA", 7615); - _unicodeCharacterMap.Add("COMBINING DOTTED GRAVE ACCENT", 7616); - _unicodeCharacterMap.Add("COMBINING DOTTED ACUTE ACCENT", 7617); - _unicodeCharacterMap.Add("COMBINING SNAKE BELOW", 7618); - _unicodeCharacterMap.Add("COMBINING SUSPENSION MARK", 7619); - _unicodeCharacterMap.Add("COMBINING MACRON ACUTE", 7620); - _unicodeCharacterMap.Add("COMBINING GRAVE MACRON", 7621); - _unicodeCharacterMap.Add("COMBINING MACRON GRAVE", 7622); - _unicodeCharacterMap.Add("COMBINING ACUTE MACRON", 7623); - _unicodeCharacterMap.Add("COMBINING GRAVE ACUTE GRAVE", 7624); - _unicodeCharacterMap.Add("COMBINING ACUTE GRAVE ACUTE", 7625); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER R BELOW", 7626); - _unicodeCharacterMap.Add("COMBINING BREVE MACRON", 7627); - _unicodeCharacterMap.Add("COMBINING MACRON BREVE", 7628); - _unicodeCharacterMap.Add("COMBINING DOUBLE CIRCUMFLEX ABOVE", 7629); - _unicodeCharacterMap.Add("COMBINING OGONEK ABOVE", 7630); - _unicodeCharacterMap.Add("COMBINING ZIGZAG BELOW", 7631); - _unicodeCharacterMap.Add("COMBINING IS BELOW", 7632); - _unicodeCharacterMap.Add("COMBINING UR ABOVE", 7633); - _unicodeCharacterMap.Add("COMBINING US ABOVE", 7634); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE", 7635); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER AE", 7636); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER AO", 7637); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER AV", 7638); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER C CEDILLA", 7639); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER INSULAR D", 7640); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER ETH", 7641); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER G", 7642); - _unicodeCharacterMap.Add("COMBINING LATIN LETTER SMALL CAPITAL G", 7643); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER K", 7644); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER L", 7645); - _unicodeCharacterMap.Add("COMBINING LATIN LETTER SMALL CAPITAL L", 7646); - _unicodeCharacterMap.Add("COMBINING LATIN LETTER SMALL CAPITAL M", 7647); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER N", 7648); - _unicodeCharacterMap.Add("COMBINING LATIN LETTER SMALL CAPITAL N", 7649); - _unicodeCharacterMap.Add("COMBINING LATIN LETTER SMALL CAPITAL R", 7650); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER R ROTUNDA", 7651); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER S", 7652); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER LONG S", 7653); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER Z", 7654); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER ALPHA", 7655); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER B", 7656); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER BETA", 7657); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER SCHWA", 7658); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER F", 7659); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE", 7660); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE", 7661); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER P", 7662); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER ESH", 7663); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE", 7664); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER W", 7665); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER A WITH DIAERESIS", 7666); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER O WITH DIAERESIS", 7667); - _unicodeCharacterMap.Add("COMBINING LATIN SMALL LETTER U WITH DIAERESIS", 7668); - _unicodeCharacterMap.Add("COMBINING UP TACK ABOVE", 7669); - _unicodeCharacterMap.Add("COMBINING DELETION MARK", 7675); - _unicodeCharacterMap.Add("COMBINING DOUBLE INVERTED BREVE BELOW", 7676); - _unicodeCharacterMap.Add("COMBINING ALMOST EQUAL TO BELOW", 7677); - _unicodeCharacterMap.Add("COMBINING LEFT ARROWHEAD ABOVE", 7678); - _unicodeCharacterMap.Add("COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW", 7679); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH RING BELOW", 7680); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH RING BELOW", 7681); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B WITH DOT ABOVE", 7682); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH DOT ABOVE", 7683); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B WITH DOT BELOW", 7684); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH DOT BELOW", 7685); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B WITH LINE BELOW", 7686); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH LINE BELOW", 7687); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE", 7688); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH CEDILLA AND ACUTE", 7689); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH DOT ABOVE", 7690); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH DOT ABOVE", 7691); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH DOT BELOW", 7692); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH DOT BELOW", 7693); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH LINE BELOW", 7694); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH LINE BELOW", 7695); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH CEDILLA", 7696); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH CEDILLA", 7697); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW", 7698); - _unicodeCharacterMap.Add("LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW", 7699); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH MACRON AND GRAVE", 7700); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH MACRON AND GRAVE", 7701); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH MACRON AND ACUTE", 7702); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH MACRON AND ACUTE", 7703); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW", 7704); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW", 7705); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH TILDE BELOW", 7706); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH TILDE BELOW", 7707); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE", 7708); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CEDILLA AND BREVE", 7709); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER F WITH DOT ABOVE", 7710); - _unicodeCharacterMap.Add("LATIN SMALL LETTER F WITH DOT ABOVE", 7711); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH MACRON", 7712); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH MACRON", 7713); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH DOT ABOVE", 7714); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH DOT ABOVE", 7715); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH DOT BELOW", 7716); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH DOT BELOW", 7717); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH DIAERESIS", 7718); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH DIAERESIS", 7719); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH CEDILLA", 7720); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH CEDILLA", 7721); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH BREVE BELOW", 7722); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH BREVE BELOW", 7723); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH TILDE BELOW", 7724); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH TILDE BELOW", 7725); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE", 7726); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE", 7727); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH ACUTE", 7728); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH ACUTE", 7729); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH DOT BELOW", 7730); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH DOT BELOW", 7731); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH LINE BELOW", 7732); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH LINE BELOW", 7733); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH DOT BELOW", 7734); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH DOT BELOW", 7735); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON", 7736); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH DOT BELOW AND MACRON", 7737); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH LINE BELOW", 7738); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH LINE BELOW", 7739); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW", 7740); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW", 7741); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER M WITH ACUTE", 7742); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M WITH ACUTE", 7743); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER M WITH DOT ABOVE", 7744); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M WITH DOT ABOVE", 7745); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER M WITH DOT BELOW", 7746); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M WITH DOT BELOW", 7747); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH DOT ABOVE", 7748); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH DOT ABOVE", 7749); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH DOT BELOW", 7750); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH DOT BELOW", 7751); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH LINE BELOW", 7752); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH LINE BELOW", 7753); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW", 7754); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW", 7755); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH TILDE AND ACUTE", 7756); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH TILDE AND ACUTE", 7757); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS", 7758); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH TILDE AND DIAERESIS", 7759); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH MACRON AND GRAVE", 7760); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH MACRON AND GRAVE", 7761); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH MACRON AND ACUTE", 7762); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH MACRON AND ACUTE", 7763); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P WITH ACUTE", 7764); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH ACUTE", 7765); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P WITH DOT ABOVE", 7766); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH DOT ABOVE", 7767); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH DOT ABOVE", 7768); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH DOT ABOVE", 7769); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH DOT BELOW", 7770); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH DOT BELOW", 7771); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON", 7772); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH DOT BELOW AND MACRON", 7773); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH LINE BELOW", 7774); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH LINE BELOW", 7775); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH DOT ABOVE", 7776); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH DOT ABOVE", 7777); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH DOT BELOW", 7778); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH DOT BELOW", 7779); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE", 7780); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE", 7781); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE", 7782); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH CARON AND DOT ABOVE", 7783); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE", 7784); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE", 7785); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH DOT ABOVE", 7786); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH DOT ABOVE", 7787); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH DOT BELOW", 7788); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH DOT BELOW", 7789); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH LINE BELOW", 7790); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH LINE BELOW", 7791); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW", 7792); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW", 7793); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DIAERESIS BELOW", 7794); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DIAERESIS BELOW", 7795); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH TILDE BELOW", 7796); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH TILDE BELOW", 7797); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW", 7798); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW", 7799); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH TILDE AND ACUTE", 7800); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH TILDE AND ACUTE", 7801); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS", 7802); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH MACRON AND DIAERESIS", 7803); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER V WITH TILDE", 7804); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V WITH TILDE", 7805); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER V WITH DOT BELOW", 7806); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V WITH DOT BELOW", 7807); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W WITH GRAVE", 7808); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH GRAVE", 7809); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W WITH ACUTE", 7810); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH ACUTE", 7811); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W WITH DIAERESIS", 7812); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH DIAERESIS", 7813); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W WITH DOT ABOVE", 7814); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH DOT ABOVE", 7815); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W WITH DOT BELOW", 7816); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH DOT BELOW", 7817); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER X WITH DOT ABOVE", 7818); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X WITH DOT ABOVE", 7819); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER X WITH DIAERESIS", 7820); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X WITH DIAERESIS", 7821); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH DOT ABOVE", 7822); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH DOT ABOVE", 7823); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH CIRCUMFLEX", 7824); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH CIRCUMFLEX", 7825); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH DOT BELOW", 7826); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH DOT BELOW", 7827); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH LINE BELOW", 7828); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH LINE BELOW", 7829); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH LINE BELOW", 7830); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH DIAERESIS", 7831); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH RING ABOVE", 7832); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH RING ABOVE", 7833); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH RIGHT HALF RING", 7834); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LONG S WITH DOT ABOVE", 7835); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE", 7836); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LONG S WITH HIGH STROKE", 7837); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER SHARP S", 7838); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DELTA", 7839); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH DOT BELOW", 7840); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH DOT BELOW", 7841); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH HOOK ABOVE", 7842); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH HOOK ABOVE", 7843); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE", 7844); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE", 7845); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE", 7846); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE", 7847); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE", 7848); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE", 7849); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE", 7850); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE", 7851); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW", 7852); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW", 7853); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH BREVE AND ACUTE", 7854); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH BREVE AND ACUTE", 7855); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH BREVE AND GRAVE", 7856); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH BREVE AND GRAVE", 7857); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE", 7858); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE", 7859); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH BREVE AND TILDE", 7860); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH BREVE AND TILDE", 7861); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW", 7862); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH BREVE AND DOT BELOW", 7863); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH DOT BELOW", 7864); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH DOT BELOW", 7865); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH HOOK ABOVE", 7866); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH HOOK ABOVE", 7867); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH TILDE", 7868); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH TILDE", 7869); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE", 7870); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE", 7871); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE", 7872); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE", 7873); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE", 7874); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE", 7875); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE", 7876); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE", 7877); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW", 7878); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW", 7879); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH HOOK ABOVE", 7880); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH HOOK ABOVE", 7881); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER I WITH DOT BELOW", 7882); - _unicodeCharacterMap.Add("LATIN SMALL LETTER I WITH DOT BELOW", 7883); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH DOT BELOW", 7884); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH DOT BELOW", 7885); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH HOOK ABOVE", 7886); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH HOOK ABOVE", 7887); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE", 7888); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE", 7889); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE", 7890); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE", 7891); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE", 7892); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE", 7893); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE", 7894); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE", 7895); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW", 7896); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW", 7897); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH HORN AND ACUTE", 7898); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH HORN AND ACUTE", 7899); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH HORN AND GRAVE", 7900); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH HORN AND GRAVE", 7901); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE", 7902); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE", 7903); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH HORN AND TILDE", 7904); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH HORN AND TILDE", 7905); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW", 7906); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH HORN AND DOT BELOW", 7907); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH DOT BELOW", 7908); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH DOT BELOW", 7909); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH HOOK ABOVE", 7910); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH HOOK ABOVE", 7911); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH HORN AND ACUTE", 7912); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH HORN AND ACUTE", 7913); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH HORN AND GRAVE", 7914); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH HORN AND GRAVE", 7915); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE", 7916); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE", 7917); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH HORN AND TILDE", 7918); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH HORN AND TILDE", 7919); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW", 7920); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH HORN AND DOT BELOW", 7921); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH GRAVE", 7922); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH GRAVE", 7923); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH DOT BELOW", 7924); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH DOT BELOW", 7925); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH HOOK ABOVE", 7926); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH HOOK ABOVE", 7927); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH TILDE", 7928); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH TILDE", 7929); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER MIDDLE WELSH LL", 7930); - _unicodeCharacterMap.Add("LATIN SMALL LETTER MIDDLE WELSH LL", 7931); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER MIDDLE WELSH V", 7932); - _unicodeCharacterMap.Add("LATIN SMALL LETTER MIDDLE WELSH V", 7933); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Y WITH LOOP", 7934); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH LOOP", 7935); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI", 7936); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA", 7937); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA", 7938); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA", 7939); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA", 7940); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA", 7941); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI", 7942); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI", 7943); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI", 7944); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA", 7945); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA", 7946); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA", 7947); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA", 7948); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA", 7949); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI", 7950); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI", 7951); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH PSILI", 7952); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH DASIA", 7953); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA", 7954); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA", 7955); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA", 7956); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA", 7957); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH PSILI", 7960); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH DASIA", 7961); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA", 7962); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA", 7963); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA", 7964); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA", 7965); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI", 7968); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA", 7969); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI AND VARIA", 7970); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA AND VARIA", 7971); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI AND OXIA", 7972); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA AND OXIA", 7973); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI", 7974); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI", 7975); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI", 7976); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA", 7977); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA", 7978); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA", 7979); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA", 7980); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA", 7981); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI", 7982); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI", 7983); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH PSILI", 7984); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DASIA", 7985); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH PSILI AND VARIA", 7986); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DASIA AND VARIA", 7987); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH PSILI AND OXIA", 7988); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DASIA AND OXIA", 7989); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI", 7990); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI", 7991); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH PSILI", 7992); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH DASIA", 7993); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA", 7994); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA", 7995); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA", 7996); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA", 7997); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI", 7998); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI", 7999); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH PSILI", 8000); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH DASIA", 8001); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA", 8002); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA", 8003); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA", 8004); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA", 8005); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH PSILI", 8008); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH DASIA", 8009); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA", 8010); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA", 8011); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA", 8012); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA", 8013); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH PSILI", 8016); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DASIA", 8017); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA", 8018); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA", 8019); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA", 8020); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA", 8021); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI", 8022); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI", 8023); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH DASIA", 8025); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA", 8027); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA", 8029); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI", 8031); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI", 8032); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA", 8033); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA", 8034); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA", 8035); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA", 8036); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA", 8037); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI", 8038); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI", 8039); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI", 8040); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA", 8041); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA", 8042); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA", 8043); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA", 8044); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA", 8045); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI", 8046); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI", 8047); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH VARIA", 8048); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH OXIA", 8049); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH VARIA", 8050); - _unicodeCharacterMap.Add("GREEK SMALL LETTER EPSILON WITH OXIA", 8051); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH VARIA", 8052); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH OXIA", 8053); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH VARIA", 8054); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH OXIA", 8055); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH VARIA", 8056); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMICRON WITH OXIA", 8057); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH VARIA", 8058); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH OXIA", 8059); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH VARIA", 8060); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH OXIA", 8061); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI", 8064); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI", 8065); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI", 8066); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI", 8067); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI", 8068); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI", 8069); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", 8070); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", 8071); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI", 8072); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI", 8073); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI", 8074); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI", 8075); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI", 8076); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI", 8077); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI", 8078); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI", 8079); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI", 8080); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI", 8081); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI", 8082); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI", 8083); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI", 8084); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI", 8085); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", 8086); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", 8087); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI", 8088); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI", 8089); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI", 8090); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI", 8091); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI", 8092); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI", 8093); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI", 8094); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI", 8095); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI", 8096); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI", 8097); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI", 8098); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI", 8099); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI", 8100); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI", 8101); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", 8102); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", 8103); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI", 8104); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI", 8105); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI", 8106); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI", 8107); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI", 8108); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI", 8109); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI", 8110); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI", 8111); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH VRACHY", 8112); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH MACRON", 8113); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI", 8114); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI", 8115); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI", 8116); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PERISPOMENI", 8118); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI", 8119); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH VRACHY", 8120); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH MACRON", 8121); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH VARIA", 8122); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH OXIA", 8123); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI", 8124); - _unicodeCharacterMap.Add("GREEK KORONIS", 8125); - _unicodeCharacterMap.Add("GREEK PROSGEGRAMMENI", 8126); - _unicodeCharacterMap.Add("GREEK PSILI", 8127); - _unicodeCharacterMap.Add("GREEK PERISPOMENI", 8128); - _unicodeCharacterMap.Add("GREEK DIALYTIKA AND PERISPOMENI", 8129); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI", 8130); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI", 8131); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI", 8132); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PERISPOMENI", 8134); - _unicodeCharacterMap.Add("GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI", 8135); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH VARIA", 8136); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER EPSILON WITH OXIA", 8137); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH VARIA", 8138); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH OXIA", 8139); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI", 8140); - _unicodeCharacterMap.Add("GREEK PSILI AND VARIA", 8141); - _unicodeCharacterMap.Add("GREEK PSILI AND OXIA", 8142); - _unicodeCharacterMap.Add("GREEK PSILI AND PERISPOMENI", 8143); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH VRACHY", 8144); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH MACRON", 8145); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA", 8146); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA", 8147); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH PERISPOMENI", 8150); - _unicodeCharacterMap.Add("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI", 8151); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH VRACHY", 8152); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH MACRON", 8153); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH VARIA", 8154); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER IOTA WITH OXIA", 8155); - _unicodeCharacterMap.Add("GREEK DASIA AND VARIA", 8157); - _unicodeCharacterMap.Add("GREEK DASIA AND OXIA", 8158); - _unicodeCharacterMap.Add("GREEK DASIA AND PERISPOMENI", 8159); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH VRACHY", 8160); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH MACRON", 8161); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA", 8162); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA", 8163); - _unicodeCharacterMap.Add("GREEK SMALL LETTER RHO WITH PSILI", 8164); - _unicodeCharacterMap.Add("GREEK SMALL LETTER RHO WITH DASIA", 8165); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH PERISPOMENI", 8166); - _unicodeCharacterMap.Add("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI", 8167); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH VRACHY", 8168); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH MACRON", 8169); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH VARIA", 8170); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER UPSILON WITH OXIA", 8171); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER RHO WITH DASIA", 8172); - _unicodeCharacterMap.Add("GREEK DIALYTIKA AND VARIA", 8173); - _unicodeCharacterMap.Add("GREEK DIALYTIKA AND OXIA", 8174); - _unicodeCharacterMap.Add("GREEK VARIA", 8175); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI", 8178); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI", 8179); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI", 8180); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PERISPOMENI", 8182); - _unicodeCharacterMap.Add("GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI", 8183); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH VARIA", 8184); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMICRON WITH OXIA", 8185); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH VARIA", 8186); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH OXIA", 8187); - _unicodeCharacterMap.Add("GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI", 8188); - _unicodeCharacterMap.Add("GREEK OXIA", 8189); - _unicodeCharacterMap.Add("GREEK DASIA", 8190); - _unicodeCharacterMap.Add("EN QUAD", 8192); - _unicodeCharacterMap.Add("EM QUAD", 8193); - _unicodeCharacterMap.Add("EN SPACE", 8194); - _unicodeCharacterMap.Add("EM SPACE", 8195); - _unicodeCharacterMap.Add("THREE PER EM SPACE", 8196); - _unicodeCharacterMap.Add("FOUR PER EM SPACE", 8197); - _unicodeCharacterMap.Add("SIX PER EM SPACE", 8198); - _unicodeCharacterMap.Add("FIGURE SPACE", 8199); - _unicodeCharacterMap.Add("PUNCTUATION SPACE", 8200); - _unicodeCharacterMap.Add("THIN SPACE", 8201); - _unicodeCharacterMap.Add("HAIR SPACE", 8202); - _unicodeCharacterMap.Add("ZERO WIDTH SPACE", 8203); - _unicodeCharacterMap.Add("ZERO WIDTH NON JOINER", 8204); - _unicodeCharacterMap.Add("ZERO WIDTH JOINER", 8205); - _unicodeCharacterMap.Add("LEFT TO RIGHT MARK", 8206); - _unicodeCharacterMap.Add("RIGHT TO LEFT MARK", 8207); - _unicodeCharacterMap.Add("HYPHEN", 8208); - _unicodeCharacterMap.Add("NON BREAKING HYPHEN", 8209); - _unicodeCharacterMap.Add("FIGURE DASH", 8210); - _unicodeCharacterMap.Add("EN DASH", 8211); - _unicodeCharacterMap.Add("EM DASH", 8212); - _unicodeCharacterMap.Add("HORIZONTAL BAR", 8213); - _unicodeCharacterMap.Add("DOUBLE VERTICAL LINE", 8214); - _unicodeCharacterMap.Add("DOUBLE LOW LINE", 8215); - _unicodeCharacterMap.Add("LEFT SINGLE QUOTATION MARK", 8216); - _unicodeCharacterMap.Add("RIGHT SINGLE QUOTATION MARK", 8217); - _unicodeCharacterMap.Add("SINGLE LOW 9 QUOTATION MARK", 8218); - _unicodeCharacterMap.Add("SINGLE HIGH REVERSED 9 QUOTATION MARK", 8219); - _unicodeCharacterMap.Add("LEFT DOUBLE QUOTATION MARK", 8220); - _unicodeCharacterMap.Add("RIGHT DOUBLE QUOTATION MARK", 8221); - _unicodeCharacterMap.Add("DOUBLE LOW 9 QUOTATION MARK", 8222); - _unicodeCharacterMap.Add("DOUBLE HIGH REVERSED 9 QUOTATION MARK", 8223); - _unicodeCharacterMap.Add("DAGGER", 8224); - _unicodeCharacterMap.Add("DOUBLE DAGGER", 8225); - _unicodeCharacterMap.Add("BULLET", 8226); - _unicodeCharacterMap.Add("TRIANGULAR BULLET", 8227); - _unicodeCharacterMap.Add("ONE DOT LEADER", 8228); - _unicodeCharacterMap.Add("TWO DOT LEADER", 8229); - _unicodeCharacterMap.Add("HORIZONTAL ELLIPSIS", 8230); - _unicodeCharacterMap.Add("HYPHENATION POINT", 8231); - _unicodeCharacterMap.Add("LINE SEPARATOR", 8232); - _unicodeCharacterMap.Add("PARAGRAPH SEPARATOR", 8233); - _unicodeCharacterMap.Add("LEFT TO RIGHT EMBEDDING", 8234); - _unicodeCharacterMap.Add("RIGHT TO LEFT EMBEDDING", 8235); - _unicodeCharacterMap.Add("POP DIRECTIONAL FORMATTING", 8236); - _unicodeCharacterMap.Add("LEFT TO RIGHT OVERRIDE", 8237); - _unicodeCharacterMap.Add("RIGHT TO LEFT OVERRIDE", 8238); - _unicodeCharacterMap.Add("NARROW NO BREAK SPACE", 8239); - _unicodeCharacterMap.Add("PER MILLE SIGN", 8240); - _unicodeCharacterMap.Add("PER TEN THOUSAND SIGN", 8241); - _unicodeCharacterMap.Add("PRIME", 8242); - _unicodeCharacterMap.Add("DOUBLE PRIME", 8243); - _unicodeCharacterMap.Add("TRIPLE PRIME", 8244); - _unicodeCharacterMap.Add("REVERSED PRIME", 8245); - _unicodeCharacterMap.Add("REVERSED DOUBLE PRIME", 8246); - _unicodeCharacterMap.Add("REVERSED TRIPLE PRIME", 8247); - _unicodeCharacterMap.Add("CARET", 8248); - _unicodeCharacterMap.Add("SINGLE LEFT POINTING ANGLE QUOTATION MARK", 8249); - _unicodeCharacterMap.Add("SINGLE RIGHT POINTING ANGLE QUOTATION MARK", 8250); - _unicodeCharacterMap.Add("REFERENCE MARK", 8251); - _unicodeCharacterMap.Add("DOUBLE EXCLAMATION MARK", 8252); - _unicodeCharacterMap.Add("INTERROBANG", 8253); - _unicodeCharacterMap.Add("OVERLINE", 8254); - _unicodeCharacterMap.Add("UNDERTIE", 8255); - _unicodeCharacterMap.Add("CHARACTER TIE", 8256); - _unicodeCharacterMap.Add("CARET INSERTION POINT", 8257); - _unicodeCharacterMap.Add("ASTERISM", 8258); - _unicodeCharacterMap.Add("HYPHEN BULLET", 8259); - _unicodeCharacterMap.Add("FRACTION SLASH", 8260); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET WITH QUILL", 8261); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET WITH QUILL", 8262); - _unicodeCharacterMap.Add("DOUBLE QUESTION MARK", 8263); - _unicodeCharacterMap.Add("QUESTION EXCLAMATION MARK", 8264); - _unicodeCharacterMap.Add("EXCLAMATION QUESTION MARK", 8265); - _unicodeCharacterMap.Add("TIRONIAN SIGN ET", 8266); - _unicodeCharacterMap.Add("REVERSED PILCROW SIGN", 8267); - _unicodeCharacterMap.Add("BLACK LEFTWARDS BULLET", 8268); - _unicodeCharacterMap.Add("BLACK RIGHTWARDS BULLET", 8269); - _unicodeCharacterMap.Add("LOW ASTERISK", 8270); - _unicodeCharacterMap.Add("REVERSED SEMICOLON", 8271); - _unicodeCharacterMap.Add("CLOSE UP", 8272); - _unicodeCharacterMap.Add("TWO ASTERISKS ALIGNED VERTICALLY", 8273); - _unicodeCharacterMap.Add("COMMERCIAL MINUS SIGN", 8274); - _unicodeCharacterMap.Add("SWUNG DASH", 8275); - _unicodeCharacterMap.Add("INVERTED UNDERTIE", 8276); - _unicodeCharacterMap.Add("FLOWER PUNCTUATION MARK", 8277); - _unicodeCharacterMap.Add("THREE DOT PUNCTUATION", 8278); - _unicodeCharacterMap.Add("QUADRUPLE PRIME", 8279); - _unicodeCharacterMap.Add("FOUR DOT PUNCTUATION", 8280); - _unicodeCharacterMap.Add("FIVE DOT PUNCTUATION", 8281); - _unicodeCharacterMap.Add("TWO DOT PUNCTUATION", 8282); - _unicodeCharacterMap.Add("FOUR DOT MARK", 8283); - _unicodeCharacterMap.Add("DOTTED CROSS", 8284); - _unicodeCharacterMap.Add("TRICOLON", 8285); - _unicodeCharacterMap.Add("VERTICAL FOUR DOTS", 8286); - _unicodeCharacterMap.Add("MEDIUM MATHEMATICAL SPACE", 8287); - _unicodeCharacterMap.Add("WORD JOINER", 8288); - _unicodeCharacterMap.Add("FUNCTION APPLICATION", 8289); - _unicodeCharacterMap.Add("INVISIBLE TIMES", 8290); - _unicodeCharacterMap.Add("INVISIBLE SEPARATOR", 8291); - _unicodeCharacterMap.Add("INVISIBLE PLUS", 8292); - _unicodeCharacterMap.Add("LEFT TO RIGHT ISOLATE", 8294); - _unicodeCharacterMap.Add("RIGHT TO LEFT ISOLATE", 8295); - _unicodeCharacterMap.Add("FIRST STRONG ISOLATE", 8296); - _unicodeCharacterMap.Add("POP DIRECTIONAL ISOLATE", 8297); - _unicodeCharacterMap.Add("INHIBIT SYMMETRIC SWAPPING", 8298); - _unicodeCharacterMap.Add("ACTIVATE SYMMETRIC SWAPPING", 8299); - _unicodeCharacterMap.Add("INHIBIT ARABIC FORM SHAPING", 8300); - _unicodeCharacterMap.Add("ACTIVATE ARABIC FORM SHAPING", 8301); - _unicodeCharacterMap.Add("NATIONAL DIGIT SHAPES", 8302); - _unicodeCharacterMap.Add("NOMINAL DIGIT SHAPES", 8303); - _unicodeCharacterMap.Add("SUPERSCRIPT ZERO", 8304); - _unicodeCharacterMap.Add("SUPERSCRIPT LATIN SMALL LETTER I", 8305); - _unicodeCharacterMap.Add("SUPERSCRIPT FOUR", 8308); - _unicodeCharacterMap.Add("SUPERSCRIPT FIVE", 8309); - _unicodeCharacterMap.Add("SUPERSCRIPT SIX", 8310); - _unicodeCharacterMap.Add("SUPERSCRIPT SEVEN", 8311); - _unicodeCharacterMap.Add("SUPERSCRIPT EIGHT", 8312); - _unicodeCharacterMap.Add("SUPERSCRIPT NINE", 8313); - _unicodeCharacterMap.Add("SUPERSCRIPT PLUS SIGN", 8314); - _unicodeCharacterMap.Add("SUPERSCRIPT MINUS", 8315); - _unicodeCharacterMap.Add("SUPERSCRIPT EQUALS SIGN", 8316); - _unicodeCharacterMap.Add("SUPERSCRIPT LEFT PARENTHESIS", 8317); - _unicodeCharacterMap.Add("SUPERSCRIPT RIGHT PARENTHESIS", 8318); - _unicodeCharacterMap.Add("SUPERSCRIPT LATIN SMALL LETTER N", 8319); - _unicodeCharacterMap.Add("SUBSCRIPT ZERO", 8320); - _unicodeCharacterMap.Add("SUBSCRIPT ONE", 8321); - _unicodeCharacterMap.Add("SUBSCRIPT TWO", 8322); - _unicodeCharacterMap.Add("SUBSCRIPT THREE", 8323); - _unicodeCharacterMap.Add("SUBSCRIPT FOUR", 8324); - _unicodeCharacterMap.Add("SUBSCRIPT FIVE", 8325); - _unicodeCharacterMap.Add("SUBSCRIPT SIX", 8326); - _unicodeCharacterMap.Add("SUBSCRIPT SEVEN", 8327); - _unicodeCharacterMap.Add("SUBSCRIPT EIGHT", 8328); - _unicodeCharacterMap.Add("SUBSCRIPT NINE", 8329); - _unicodeCharacterMap.Add("SUBSCRIPT PLUS SIGN", 8330); - _unicodeCharacterMap.Add("SUBSCRIPT MINUS", 8331); - _unicodeCharacterMap.Add("SUBSCRIPT EQUALS SIGN", 8332); - _unicodeCharacterMap.Add("SUBSCRIPT LEFT PARENTHESIS", 8333); - _unicodeCharacterMap.Add("SUBSCRIPT RIGHT PARENTHESIS", 8334); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER A", 8336); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER E", 8337); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER O", 8338); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER X", 8339); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER SCHWA", 8340); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER H", 8341); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER K", 8342); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER L", 8343); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER M", 8344); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER N", 8345); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER P", 8346); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER S", 8347); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER T", 8348); - _unicodeCharacterMap.Add("EURO CURRENCY SIGN", 8352); - _unicodeCharacterMap.Add("COLON SIGN", 8353); - _unicodeCharacterMap.Add("CRUZEIRO SIGN", 8354); - _unicodeCharacterMap.Add("FRENCH FRANC SIGN", 8355); - _unicodeCharacterMap.Add("LIRA SIGN", 8356); - _unicodeCharacterMap.Add("MILL SIGN", 8357); - _unicodeCharacterMap.Add("NAIRA SIGN", 8358); - _unicodeCharacterMap.Add("PESETA SIGN", 8359); - _unicodeCharacterMap.Add("RUPEE SIGN", 8360); - _unicodeCharacterMap.Add("WON SIGN", 8361); - _unicodeCharacterMap.Add("NEW SHEQEL SIGN", 8362); - _unicodeCharacterMap.Add("DONG SIGN", 8363); - _unicodeCharacterMap.Add("EURO SIGN", 8364); - _unicodeCharacterMap.Add("KIP SIGN", 8365); - _unicodeCharacterMap.Add("TUGRIK SIGN", 8366); - _unicodeCharacterMap.Add("DRACHMA SIGN", 8367); - _unicodeCharacterMap.Add("GERMAN PENNY SIGN", 8368); - _unicodeCharacterMap.Add("PESO SIGN", 8369); - _unicodeCharacterMap.Add("GUARANI SIGN", 8370); - _unicodeCharacterMap.Add("AUSTRAL SIGN", 8371); - _unicodeCharacterMap.Add("HRYVNIA SIGN", 8372); - _unicodeCharacterMap.Add("CEDI SIGN", 8373); - _unicodeCharacterMap.Add("LIVRE TOURNOIS SIGN", 8374); - _unicodeCharacterMap.Add("SPESMILO SIGN", 8375); - _unicodeCharacterMap.Add("TENGE SIGN", 8376); - _unicodeCharacterMap.Add("INDIAN RUPEE SIGN", 8377); - _unicodeCharacterMap.Add("TURKISH LIRA SIGN", 8378); - _unicodeCharacterMap.Add("NORDIC MARK SIGN", 8379); - _unicodeCharacterMap.Add("MANAT SIGN", 8380); - _unicodeCharacterMap.Add("RUBLE SIGN", 8381); - _unicodeCharacterMap.Add("LARI SIGN", 8382); - _unicodeCharacterMap.Add("COMBINING LEFT HARPOON ABOVE", 8400); - _unicodeCharacterMap.Add("COMBINING RIGHT HARPOON ABOVE", 8401); - _unicodeCharacterMap.Add("COMBINING LONG VERTICAL LINE OVERLAY", 8402); - _unicodeCharacterMap.Add("COMBINING SHORT VERTICAL LINE OVERLAY", 8403); - _unicodeCharacterMap.Add("COMBINING ANTICLOCKWISE ARROW ABOVE", 8404); - _unicodeCharacterMap.Add("COMBINING CLOCKWISE ARROW ABOVE", 8405); - _unicodeCharacterMap.Add("COMBINING LEFT ARROW ABOVE", 8406); - _unicodeCharacterMap.Add("COMBINING RIGHT ARROW ABOVE", 8407); - _unicodeCharacterMap.Add("COMBINING RING OVERLAY", 8408); - _unicodeCharacterMap.Add("COMBINING CLOCKWISE RING OVERLAY", 8409); - _unicodeCharacterMap.Add("COMBINING ANTICLOCKWISE RING OVERLAY", 8410); - _unicodeCharacterMap.Add("COMBINING THREE DOTS ABOVE", 8411); - _unicodeCharacterMap.Add("COMBINING FOUR DOTS ABOVE", 8412); - _unicodeCharacterMap.Add("COMBINING ENCLOSING CIRCLE", 8413); - _unicodeCharacterMap.Add("COMBINING ENCLOSING SQUARE", 8414); - _unicodeCharacterMap.Add("COMBINING ENCLOSING DIAMOND", 8415); - _unicodeCharacterMap.Add("COMBINING ENCLOSING CIRCLE BACKSLASH", 8416); - _unicodeCharacterMap.Add("COMBINING LEFT RIGHT ARROW ABOVE", 8417); - _unicodeCharacterMap.Add("COMBINING ENCLOSING SCREEN", 8418); - _unicodeCharacterMap.Add("COMBINING ENCLOSING KEYCAP", 8419); - _unicodeCharacterMap.Add("COMBINING ENCLOSING UPWARD POINTING TRIANGLE", 8420); - _unicodeCharacterMap.Add("COMBINING REVERSE SOLIDUS OVERLAY", 8421); - _unicodeCharacterMap.Add("COMBINING DOUBLE VERTICAL STROKE OVERLAY", 8422); - _unicodeCharacterMap.Add("COMBINING ANNUITY SYMBOL", 8423); - _unicodeCharacterMap.Add("COMBINING TRIPLE UNDERDOT", 8424); - _unicodeCharacterMap.Add("COMBINING WIDE BRIDGE ABOVE", 8425); - _unicodeCharacterMap.Add("COMBINING LEFTWARDS ARROW OVERLAY", 8426); - _unicodeCharacterMap.Add("COMBINING LONG DOUBLE SOLIDUS OVERLAY", 8427); - _unicodeCharacterMap.Add("COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS", 8428); - _unicodeCharacterMap.Add("COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS", 8429); - _unicodeCharacterMap.Add("COMBINING LEFT ARROW BELOW", 8430); - _unicodeCharacterMap.Add("COMBINING RIGHT ARROW BELOW", 8431); - _unicodeCharacterMap.Add("COMBINING ASTERISK ABOVE", 8432); - _unicodeCharacterMap.Add("ACCOUNT OF", 8448); - _unicodeCharacterMap.Add("ADDRESSED TO THE SUBJECT", 8449); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL C", 8450); - _unicodeCharacterMap.Add("DEGREE CELSIUS", 8451); - _unicodeCharacterMap.Add("CENTRE LINE SYMBOL", 8452); - _unicodeCharacterMap.Add("CARE OF", 8453); - _unicodeCharacterMap.Add("CADA UNA", 8454); - _unicodeCharacterMap.Add("EULER CONSTANT", 8455); - _unicodeCharacterMap.Add("SCRUPLE", 8456); - _unicodeCharacterMap.Add("DEGREE FAHRENHEIT", 8457); - _unicodeCharacterMap.Add("SCRIPT SMALL G", 8458); - _unicodeCharacterMap.Add("SCRIPT CAPITAL H", 8459); - _unicodeCharacterMap.Add("BLACK LETTER CAPITAL H", 8460); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL H", 8461); - _unicodeCharacterMap.Add("PLANCK CONSTANT", 8462); - _unicodeCharacterMap.Add("PLANCK CONSTANT OVER TWO PI", 8463); - _unicodeCharacterMap.Add("SCRIPT CAPITAL I", 8464); - _unicodeCharacterMap.Add("BLACK LETTER CAPITAL I", 8465); - _unicodeCharacterMap.Add("SCRIPT CAPITAL L", 8466); - _unicodeCharacterMap.Add("SCRIPT SMALL L", 8467); - _unicodeCharacterMap.Add("L B BAR SYMBOL", 8468); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL N", 8469); - _unicodeCharacterMap.Add("NUMERO SIGN", 8470); - _unicodeCharacterMap.Add("SOUND RECORDING COPYRIGHT", 8471); - _unicodeCharacterMap.Add("SCRIPT CAPITAL P", 8472); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL P", 8473); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL Q", 8474); - _unicodeCharacterMap.Add("SCRIPT CAPITAL R", 8475); - _unicodeCharacterMap.Add("BLACK LETTER CAPITAL R", 8476); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL R", 8477); - _unicodeCharacterMap.Add("PRESCRIPTION TAKE", 8478); - _unicodeCharacterMap.Add("RESPONSE", 8479); - _unicodeCharacterMap.Add("SERVICE MARK", 8480); - _unicodeCharacterMap.Add("TELEPHONE SIGN", 8481); - _unicodeCharacterMap.Add("TRADE MARK SIGN", 8482); - _unicodeCharacterMap.Add("VERSICLE", 8483); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL Z", 8484); - _unicodeCharacterMap.Add("OUNCE SIGN", 8485); - _unicodeCharacterMap.Add("OHM SIGN", 8486); - _unicodeCharacterMap.Add("INVERTED OHM SIGN", 8487); - _unicodeCharacterMap.Add("BLACK LETTER CAPITAL Z", 8488); - _unicodeCharacterMap.Add("TURNED GREEK SMALL LETTER IOTA", 8489); - _unicodeCharacterMap.Add("KELVIN SIGN", 8490); - _unicodeCharacterMap.Add("ANGSTROM SIGN", 8491); - _unicodeCharacterMap.Add("SCRIPT CAPITAL B", 8492); - _unicodeCharacterMap.Add("BLACK LETTER CAPITAL C", 8493); - _unicodeCharacterMap.Add("ESTIMATED SYMBOL", 8494); - _unicodeCharacterMap.Add("SCRIPT SMALL E", 8495); - _unicodeCharacterMap.Add("SCRIPT CAPITAL E", 8496); - _unicodeCharacterMap.Add("SCRIPT CAPITAL F", 8497); - _unicodeCharacterMap.Add("TURNED CAPITAL F", 8498); - _unicodeCharacterMap.Add("SCRIPT CAPITAL M", 8499); - _unicodeCharacterMap.Add("SCRIPT SMALL O", 8500); - _unicodeCharacterMap.Add("ALEF SYMBOL", 8501); - _unicodeCharacterMap.Add("BET SYMBOL", 8502); - _unicodeCharacterMap.Add("GIMEL SYMBOL", 8503); - _unicodeCharacterMap.Add("DALET SYMBOL", 8504); - _unicodeCharacterMap.Add("INFORMATION SOURCE", 8505); - _unicodeCharacterMap.Add("ROTATED CAPITAL Q", 8506); - _unicodeCharacterMap.Add("FACSIMILE SIGN", 8507); - _unicodeCharacterMap.Add("DOUBLE STRUCK SMALL PI", 8508); - _unicodeCharacterMap.Add("DOUBLE STRUCK SMALL GAMMA", 8509); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL GAMMA", 8510); - _unicodeCharacterMap.Add("DOUBLE STRUCK CAPITAL PI", 8511); - _unicodeCharacterMap.Add("DOUBLE STRUCK N ARY SUMMATION", 8512); - _unicodeCharacterMap.Add("TURNED SANS SERIF CAPITAL G", 8513); - _unicodeCharacterMap.Add("TURNED SANS SERIF CAPITAL L", 8514); - _unicodeCharacterMap.Add("REVERSED SANS SERIF CAPITAL L", 8515); - _unicodeCharacterMap.Add("TURNED SANS SERIF CAPITAL Y", 8516); - _unicodeCharacterMap.Add("DOUBLE STRUCK ITALIC CAPITAL D", 8517); - _unicodeCharacterMap.Add("DOUBLE STRUCK ITALIC SMALL D", 8518); - _unicodeCharacterMap.Add("DOUBLE STRUCK ITALIC SMALL E", 8519); - _unicodeCharacterMap.Add("DOUBLE STRUCK ITALIC SMALL I", 8520); - _unicodeCharacterMap.Add("DOUBLE STRUCK ITALIC SMALL J", 8521); - _unicodeCharacterMap.Add("PROPERTY LINE", 8522); - _unicodeCharacterMap.Add("TURNED AMPERSAND", 8523); - _unicodeCharacterMap.Add("PER SIGN", 8524); - _unicodeCharacterMap.Add("AKTIESELSKAB", 8525); - _unicodeCharacterMap.Add("TURNED SMALL F", 8526); - _unicodeCharacterMap.Add("SYMBOL FOR SAMARITAN SOURCE", 8527); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE SEVENTH", 8528); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE NINTH", 8529); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE TENTH", 8530); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE THIRD", 8531); - _unicodeCharacterMap.Add("VULGAR FRACTION TWO THIRDS", 8532); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE FIFTH", 8533); - _unicodeCharacterMap.Add("VULGAR FRACTION TWO FIFTHS", 8534); - _unicodeCharacterMap.Add("VULGAR FRACTION THREE FIFTHS", 8535); - _unicodeCharacterMap.Add("VULGAR FRACTION FOUR FIFTHS", 8536); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE SIXTH", 8537); - _unicodeCharacterMap.Add("VULGAR FRACTION FIVE SIXTHS", 8538); - _unicodeCharacterMap.Add("VULGAR FRACTION ONE EIGHTH", 8539); - _unicodeCharacterMap.Add("VULGAR FRACTION THREE EIGHTHS", 8540); - _unicodeCharacterMap.Add("VULGAR FRACTION FIVE EIGHTHS", 8541); - _unicodeCharacterMap.Add("VULGAR FRACTION SEVEN EIGHTHS", 8542); - _unicodeCharacterMap.Add("FRACTION NUMERATOR ONE", 8543); - _unicodeCharacterMap.Add("ROMAN NUMERAL ONE", 8544); - _unicodeCharacterMap.Add("ROMAN NUMERAL TWO", 8545); - _unicodeCharacterMap.Add("ROMAN NUMERAL THREE", 8546); - _unicodeCharacterMap.Add("ROMAN NUMERAL FOUR", 8547); - _unicodeCharacterMap.Add("ROMAN NUMERAL FIVE", 8548); - _unicodeCharacterMap.Add("ROMAN NUMERAL SIX", 8549); - _unicodeCharacterMap.Add("ROMAN NUMERAL SEVEN", 8550); - _unicodeCharacterMap.Add("ROMAN NUMERAL EIGHT", 8551); - _unicodeCharacterMap.Add("ROMAN NUMERAL NINE", 8552); - _unicodeCharacterMap.Add("ROMAN NUMERAL TEN", 8553); - _unicodeCharacterMap.Add("ROMAN NUMERAL ELEVEN", 8554); - _unicodeCharacterMap.Add("ROMAN NUMERAL TWELVE", 8555); - _unicodeCharacterMap.Add("ROMAN NUMERAL FIFTY", 8556); - _unicodeCharacterMap.Add("ROMAN NUMERAL ONE HUNDRED", 8557); - _unicodeCharacterMap.Add("ROMAN NUMERAL FIVE HUNDRED", 8558); - _unicodeCharacterMap.Add("ROMAN NUMERAL ONE THOUSAND", 8559); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL ONE", 8560); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL TWO", 8561); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL THREE", 8562); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL FOUR", 8563); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL FIVE", 8564); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL SIX", 8565); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL SEVEN", 8566); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL EIGHT", 8567); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL NINE", 8568); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL TEN", 8569); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL ELEVEN", 8570); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL TWELVE", 8571); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL FIFTY", 8572); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL ONE HUNDRED", 8573); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL FIVE HUNDRED", 8574); - _unicodeCharacterMap.Add("SMALL ROMAN NUMERAL ONE THOUSAND", 8575); - _unicodeCharacterMap.Add("ROMAN NUMERAL ONE THOUSAND C D", 8576); - _unicodeCharacterMap.Add("ROMAN NUMERAL FIVE THOUSAND", 8577); - _unicodeCharacterMap.Add("ROMAN NUMERAL TEN THOUSAND", 8578); - _unicodeCharacterMap.Add("ROMAN NUMERAL REVERSED ONE HUNDRED", 8579); - _unicodeCharacterMap.Add("LATIN SMALL LETTER REVERSED C", 8580); - _unicodeCharacterMap.Add("ROMAN NUMERAL SIX LATE FORM", 8581); - _unicodeCharacterMap.Add("ROMAN NUMERAL FIFTY EARLY FORM", 8582); - _unicodeCharacterMap.Add("ROMAN NUMERAL FIFTY THOUSAND", 8583); - _unicodeCharacterMap.Add("ROMAN NUMERAL ONE HUNDRED THOUSAND", 8584); - _unicodeCharacterMap.Add("VULGAR FRACTION ZERO THIRDS", 8585); - _unicodeCharacterMap.Add("TURNED DIGIT TWO", 8586); - _unicodeCharacterMap.Add("TURNED DIGIT THREE", 8587); - _unicodeCharacterMap.Add("LEFTWARDS ARROW", 8592); - _unicodeCharacterMap.Add("UPWARDS ARROW", 8593); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW", 8594); - _unicodeCharacterMap.Add("DOWNWARDS ARROW", 8595); - _unicodeCharacterMap.Add("LEFT RIGHT ARROW", 8596); - _unicodeCharacterMap.Add("UP DOWN ARROW", 8597); - _unicodeCharacterMap.Add("NORTH WEST ARROW", 8598); - _unicodeCharacterMap.Add("NORTH EAST ARROW", 8599); - _unicodeCharacterMap.Add("SOUTH EAST ARROW", 8600); - _unicodeCharacterMap.Add("SOUTH WEST ARROW", 8601); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH STROKE", 8602); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH STROKE", 8603); - _unicodeCharacterMap.Add("LEFTWARDS WAVE ARROW", 8604); - _unicodeCharacterMap.Add("RIGHTWARDS WAVE ARROW", 8605); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW", 8606); - _unicodeCharacterMap.Add("UPWARDS TWO HEADED ARROW", 8607); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW", 8608); - _unicodeCharacterMap.Add("DOWNWARDS TWO HEADED ARROW", 8609); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH TAIL", 8610); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH TAIL", 8611); - _unicodeCharacterMap.Add("LEFTWARDS ARROW FROM BAR", 8612); - _unicodeCharacterMap.Add("UPWARDS ARROW FROM BAR", 8613); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW FROM BAR", 8614); - _unicodeCharacterMap.Add("DOWNWARDS ARROW FROM BAR", 8615); - _unicodeCharacterMap.Add("UP DOWN ARROW WITH BASE", 8616); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH HOOK", 8617); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH HOOK", 8618); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH LOOP", 8619); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH LOOP", 8620); - _unicodeCharacterMap.Add("LEFT RIGHT WAVE ARROW", 8621); - _unicodeCharacterMap.Add("LEFT RIGHT ARROW WITH STROKE", 8622); - _unicodeCharacterMap.Add("DOWNWARDS ZIGZAG ARROW", 8623); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH TIP LEFTWARDS", 8624); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH TIP RIGHTWARDS", 8625); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH TIP LEFTWARDS", 8626); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH TIP RIGHTWARDS", 8627); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH CORNER DOWNWARDS", 8628); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH CORNER LEFTWARDS", 8629); - _unicodeCharacterMap.Add("ANTICLOCKWISE TOP SEMICIRCLE ARROW", 8630); - _unicodeCharacterMap.Add("CLOCKWISE TOP SEMICIRCLE ARROW", 8631); - _unicodeCharacterMap.Add("NORTH WEST ARROW TO LONG BAR", 8632); - _unicodeCharacterMap.Add("LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR", 8633); - _unicodeCharacterMap.Add("ANTICLOCKWISE OPEN CIRCLE ARROW", 8634); - _unicodeCharacterMap.Add("CLOCKWISE OPEN CIRCLE ARROW", 8635); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB UPWARDS", 8636); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB DOWNWARDS", 8637); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB RIGHTWARDS", 8638); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB LEFTWARDS", 8639); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB UPWARDS", 8640); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB DOWNWARDS", 8641); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB RIGHTWARDS", 8642); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB LEFTWARDS", 8643); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW OVER LEFTWARDS ARROW", 8644); - _unicodeCharacterMap.Add("UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW", 8645); - _unicodeCharacterMap.Add("LEFTWARDS ARROW OVER RIGHTWARDS ARROW", 8646); - _unicodeCharacterMap.Add("LEFTWARDS PAIRED ARROWS", 8647); - _unicodeCharacterMap.Add("UPWARDS PAIRED ARROWS", 8648); - _unicodeCharacterMap.Add("RIGHTWARDS PAIRED ARROWS", 8649); - _unicodeCharacterMap.Add("DOWNWARDS PAIRED ARROWS", 8650); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON", 8651); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON", 8652); - _unicodeCharacterMap.Add("LEFTWARDS DOUBLE ARROW WITH STROKE", 8653); - _unicodeCharacterMap.Add("LEFT RIGHT DOUBLE ARROW WITH STROKE", 8654); - _unicodeCharacterMap.Add("RIGHTWARDS DOUBLE ARROW WITH STROKE", 8655); - _unicodeCharacterMap.Add("LEFTWARDS DOUBLE ARROW", 8656); - _unicodeCharacterMap.Add("UPWARDS DOUBLE ARROW", 8657); - _unicodeCharacterMap.Add("RIGHTWARDS DOUBLE ARROW", 8658); - _unicodeCharacterMap.Add("DOWNWARDS DOUBLE ARROW", 8659); - _unicodeCharacterMap.Add("LEFT RIGHT DOUBLE ARROW", 8660); - _unicodeCharacterMap.Add("UP DOWN DOUBLE ARROW", 8661); - _unicodeCharacterMap.Add("NORTH WEST DOUBLE ARROW", 8662); - _unicodeCharacterMap.Add("NORTH EAST DOUBLE ARROW", 8663); - _unicodeCharacterMap.Add("SOUTH EAST DOUBLE ARROW", 8664); - _unicodeCharacterMap.Add("SOUTH WEST DOUBLE ARROW", 8665); - _unicodeCharacterMap.Add("LEFTWARDS TRIPLE ARROW", 8666); - _unicodeCharacterMap.Add("RIGHTWARDS TRIPLE ARROW", 8667); - _unicodeCharacterMap.Add("LEFTWARDS SQUIGGLE ARROW", 8668); - _unicodeCharacterMap.Add("RIGHTWARDS SQUIGGLE ARROW", 8669); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH DOUBLE STROKE", 8670); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH DOUBLE STROKE", 8671); - _unicodeCharacterMap.Add("LEFTWARDS DASHED ARROW", 8672); - _unicodeCharacterMap.Add("UPWARDS DASHED ARROW", 8673); - _unicodeCharacterMap.Add("RIGHTWARDS DASHED ARROW", 8674); - _unicodeCharacterMap.Add("DOWNWARDS DASHED ARROW", 8675); - _unicodeCharacterMap.Add("LEFTWARDS ARROW TO BAR", 8676); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW TO BAR", 8677); - _unicodeCharacterMap.Add("LEFTWARDS WHITE ARROW", 8678); - _unicodeCharacterMap.Add("UPWARDS WHITE ARROW", 8679); - _unicodeCharacterMap.Add("RIGHTWARDS WHITE ARROW", 8680); - _unicodeCharacterMap.Add("DOWNWARDS WHITE ARROW", 8681); - _unicodeCharacterMap.Add("UPWARDS WHITE ARROW FROM BAR", 8682); - _unicodeCharacterMap.Add("UPWARDS WHITE ARROW ON PEDESTAL", 8683); - _unicodeCharacterMap.Add("UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR", 8684); - _unicodeCharacterMap.Add("UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR", 8685); - _unicodeCharacterMap.Add("UPWARDS WHITE DOUBLE ARROW", 8686); - _unicodeCharacterMap.Add("UPWARDS WHITE DOUBLE ARROW ON PEDESTAL", 8687); - _unicodeCharacterMap.Add("RIGHTWARDS WHITE ARROW FROM WALL", 8688); - _unicodeCharacterMap.Add("NORTH WEST ARROW TO CORNER", 8689); - _unicodeCharacterMap.Add("SOUTH EAST ARROW TO CORNER", 8690); - _unicodeCharacterMap.Add("UP DOWN WHITE ARROW", 8691); - _unicodeCharacterMap.Add("RIGHT ARROW WITH SMALL CIRCLE", 8692); - _unicodeCharacterMap.Add("DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW", 8693); - _unicodeCharacterMap.Add("THREE RIGHTWARDS ARROWS", 8694); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH VERTICAL STROKE", 8695); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH VERTICAL STROKE", 8696); - _unicodeCharacterMap.Add("LEFT RIGHT ARROW WITH VERTICAL STROKE", 8697); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE", 8698); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE", 8699); - _unicodeCharacterMap.Add("LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE", 8700); - _unicodeCharacterMap.Add("LEFTWARDS OPEN HEADED ARROW", 8701); - _unicodeCharacterMap.Add("RIGHTWARDS OPEN HEADED ARROW", 8702); - _unicodeCharacterMap.Add("LEFT RIGHT OPEN HEADED ARROW", 8703); - _unicodeCharacterMap.Add("FOR ALL", 8704); - _unicodeCharacterMap.Add("COMPLEMENT", 8705); - _unicodeCharacterMap.Add("PARTIAL DIFFERENTIAL", 8706); - _unicodeCharacterMap.Add("THERE EXISTS", 8707); - _unicodeCharacterMap.Add("THERE DOES NOT EXIST", 8708); - _unicodeCharacterMap.Add("EMPTY SET", 8709); - _unicodeCharacterMap.Add("INCREMENT", 8710); - _unicodeCharacterMap.Add("NABLA", 8711); - _unicodeCharacterMap.Add("ELEMENT OF", 8712); - _unicodeCharacterMap.Add("NOT AN ELEMENT OF", 8713); - _unicodeCharacterMap.Add("SMALL ELEMENT OF", 8714); - _unicodeCharacterMap.Add("CONTAINS AS MEMBER", 8715); - _unicodeCharacterMap.Add("DOES NOT CONTAIN AS MEMBER", 8716); - _unicodeCharacterMap.Add("SMALL CONTAINS AS MEMBER", 8717); - _unicodeCharacterMap.Add("END OF PROOF", 8718); - _unicodeCharacterMap.Add("N ARY PRODUCT", 8719); - _unicodeCharacterMap.Add("N ARY COPRODUCT", 8720); - _unicodeCharacterMap.Add("N ARY SUMMATION", 8721); - _unicodeCharacterMap.Add("MINUS SIGN", 8722); - _unicodeCharacterMap.Add("MINUS OR PLUS SIGN", 8723); - _unicodeCharacterMap.Add("DOT PLUS", 8724); - _unicodeCharacterMap.Add("DIVISION SLASH", 8725); - _unicodeCharacterMap.Add("SET MINUS", 8726); - _unicodeCharacterMap.Add("ASTERISK OPERATOR", 8727); - _unicodeCharacterMap.Add("RING OPERATOR", 8728); - _unicodeCharacterMap.Add("BULLET OPERATOR", 8729); - _unicodeCharacterMap.Add("SQUARE ROOT", 8730); - _unicodeCharacterMap.Add("CUBE ROOT", 8731); - _unicodeCharacterMap.Add("FOURTH ROOT", 8732); - _unicodeCharacterMap.Add("PROPORTIONAL TO", 8733); - _unicodeCharacterMap.Add("INFINITY", 8734); - _unicodeCharacterMap.Add("RIGHT ANGLE", 8735); - _unicodeCharacterMap.Add("ANGLE", 8736); - _unicodeCharacterMap.Add("MEASURED ANGLE", 8737); - _unicodeCharacterMap.Add("SPHERICAL ANGLE", 8738); - _unicodeCharacterMap.Add("DIVIDES", 8739); - _unicodeCharacterMap.Add("DOES NOT DIVIDE", 8740); - _unicodeCharacterMap.Add("PARALLEL TO", 8741); - _unicodeCharacterMap.Add("NOT PARALLEL TO", 8742); - _unicodeCharacterMap.Add("LOGICAL AND", 8743); - _unicodeCharacterMap.Add("LOGICAL OR", 8744); - _unicodeCharacterMap.Add("INTERSECTION", 8745); - _unicodeCharacterMap.Add("UNION", 8746); - _unicodeCharacterMap.Add("INTEGRAL", 8747); - _unicodeCharacterMap.Add("DOUBLE INTEGRAL", 8748); - _unicodeCharacterMap.Add("TRIPLE INTEGRAL", 8749); - _unicodeCharacterMap.Add("CONTOUR INTEGRAL", 8750); - _unicodeCharacterMap.Add("SURFACE INTEGRAL", 8751); - _unicodeCharacterMap.Add("VOLUME INTEGRAL", 8752); - _unicodeCharacterMap.Add("CLOCKWISE INTEGRAL", 8753); - _unicodeCharacterMap.Add("CLOCKWISE CONTOUR INTEGRAL", 8754); - _unicodeCharacterMap.Add("ANTICLOCKWISE CONTOUR INTEGRAL", 8755); - _unicodeCharacterMap.Add("THEREFORE", 8756); - _unicodeCharacterMap.Add("BECAUSE", 8757); - _unicodeCharacterMap.Add("RATIO", 8758); - _unicodeCharacterMap.Add("PROPORTION", 8759); - _unicodeCharacterMap.Add("DOT MINUS", 8760); - _unicodeCharacterMap.Add("EXCESS", 8761); - _unicodeCharacterMap.Add("GEOMETRIC PROPORTION", 8762); - _unicodeCharacterMap.Add("HOMOTHETIC", 8763); - _unicodeCharacterMap.Add("TILDE OPERATOR", 8764); - _unicodeCharacterMap.Add("REVERSED TILDE", 8765); - _unicodeCharacterMap.Add("INVERTED LAZY S", 8766); - _unicodeCharacterMap.Add("SINE WAVE", 8767); - _unicodeCharacterMap.Add("WREATH PRODUCT", 8768); - _unicodeCharacterMap.Add("NOT TILDE", 8769); - _unicodeCharacterMap.Add("MINUS TILDE", 8770); - _unicodeCharacterMap.Add("ASYMPTOTICALLY EQUAL TO", 8771); - _unicodeCharacterMap.Add("NOT ASYMPTOTICALLY EQUAL TO", 8772); - _unicodeCharacterMap.Add("APPROXIMATELY EQUAL TO", 8773); - _unicodeCharacterMap.Add("APPROXIMATELY BUT NOT ACTUALLY EQUAL TO", 8774); - _unicodeCharacterMap.Add("NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO", 8775); - _unicodeCharacterMap.Add("ALMOST EQUAL TO", 8776); - _unicodeCharacterMap.Add("NOT ALMOST EQUAL TO", 8777); - _unicodeCharacterMap.Add("ALMOST EQUAL OR EQUAL TO", 8778); - _unicodeCharacterMap.Add("TRIPLE TILDE", 8779); - _unicodeCharacterMap.Add("ALL EQUAL TO", 8780); - _unicodeCharacterMap.Add("EQUIVALENT TO", 8781); - _unicodeCharacterMap.Add("GEOMETRICALLY EQUIVALENT TO", 8782); - _unicodeCharacterMap.Add("DIFFERENCE BETWEEN", 8783); - _unicodeCharacterMap.Add("APPROACHES THE LIMIT", 8784); - _unicodeCharacterMap.Add("GEOMETRICALLY EQUAL TO", 8785); - _unicodeCharacterMap.Add("APPROXIMATELY EQUAL TO OR THE IMAGE OF", 8786); - _unicodeCharacterMap.Add("IMAGE OF OR APPROXIMATELY EQUAL TO", 8787); - _unicodeCharacterMap.Add("COLON EQUALS", 8788); - _unicodeCharacterMap.Add("EQUALS COLON", 8789); - _unicodeCharacterMap.Add("RING IN EQUAL TO", 8790); - _unicodeCharacterMap.Add("RING EQUAL TO", 8791); - _unicodeCharacterMap.Add("CORRESPONDS TO", 8792); - _unicodeCharacterMap.Add("ESTIMATES", 8793); - _unicodeCharacterMap.Add("EQUIANGULAR TO", 8794); - _unicodeCharacterMap.Add("STAR EQUALS", 8795); - _unicodeCharacterMap.Add("DELTA EQUAL TO", 8796); - _unicodeCharacterMap.Add("EQUAL TO BY DEFINITION", 8797); - _unicodeCharacterMap.Add("MEASURED BY", 8798); - _unicodeCharacterMap.Add("QUESTIONED EQUAL TO", 8799); - _unicodeCharacterMap.Add("NOT EQUAL TO", 8800); - _unicodeCharacterMap.Add("IDENTICAL TO", 8801); - _unicodeCharacterMap.Add("NOT IDENTICAL TO", 8802); - _unicodeCharacterMap.Add("STRICTLY EQUIVALENT TO", 8803); - _unicodeCharacterMap.Add("LESS THAN OR EQUAL TO", 8804); - _unicodeCharacterMap.Add("GREATER THAN OR EQUAL TO", 8805); - _unicodeCharacterMap.Add("LESS THAN OVER EQUAL TO", 8806); - _unicodeCharacterMap.Add("GREATER THAN OVER EQUAL TO", 8807); - _unicodeCharacterMap.Add("LESS THAN BUT NOT EQUAL TO", 8808); - _unicodeCharacterMap.Add("GREATER THAN BUT NOT EQUAL TO", 8809); - _unicodeCharacterMap.Add("MUCH LESS THAN", 8810); - _unicodeCharacterMap.Add("MUCH GREATER THAN", 8811); - _unicodeCharacterMap.Add("BETWEEN", 8812); - _unicodeCharacterMap.Add("NOT EQUIVALENT TO", 8813); - _unicodeCharacterMap.Add("NOT LESS THAN", 8814); - _unicodeCharacterMap.Add("NOT GREATER THAN", 8815); - _unicodeCharacterMap.Add("NEITHER LESS THAN NOR EQUAL TO", 8816); - _unicodeCharacterMap.Add("NEITHER GREATER THAN NOR EQUAL TO", 8817); - _unicodeCharacterMap.Add("LESS THAN OR EQUIVALENT TO", 8818); - _unicodeCharacterMap.Add("GREATER THAN OR EQUIVALENT TO", 8819); - _unicodeCharacterMap.Add("NEITHER LESS THAN NOR EQUIVALENT TO", 8820); - _unicodeCharacterMap.Add("NEITHER GREATER THAN NOR EQUIVALENT TO", 8821); - _unicodeCharacterMap.Add("LESS THAN OR GREATER THAN", 8822); - _unicodeCharacterMap.Add("GREATER THAN OR LESS THAN", 8823); - _unicodeCharacterMap.Add("NEITHER LESS THAN NOR GREATER THAN", 8824); - _unicodeCharacterMap.Add("NEITHER GREATER THAN NOR LESS THAN", 8825); - _unicodeCharacterMap.Add("PRECEDES", 8826); - _unicodeCharacterMap.Add("SUCCEEDS", 8827); - _unicodeCharacterMap.Add("PRECEDES OR EQUAL TO", 8828); - _unicodeCharacterMap.Add("SUCCEEDS OR EQUAL TO", 8829); - _unicodeCharacterMap.Add("PRECEDES OR EQUIVALENT TO", 8830); - _unicodeCharacterMap.Add("SUCCEEDS OR EQUIVALENT TO", 8831); - _unicodeCharacterMap.Add("DOES NOT PRECEDE", 8832); - _unicodeCharacterMap.Add("DOES NOT SUCCEED", 8833); - _unicodeCharacterMap.Add("SUBSET OF", 8834); - _unicodeCharacterMap.Add("SUPERSET OF", 8835); - _unicodeCharacterMap.Add("NOT A SUBSET OF", 8836); - _unicodeCharacterMap.Add("NOT A SUPERSET OF", 8837); - _unicodeCharacterMap.Add("SUBSET OF OR EQUAL TO", 8838); - _unicodeCharacterMap.Add("SUPERSET OF OR EQUAL TO", 8839); - _unicodeCharacterMap.Add("NEITHER A SUBSET OF NOR EQUAL TO", 8840); - _unicodeCharacterMap.Add("NEITHER A SUPERSET OF NOR EQUAL TO", 8841); - _unicodeCharacterMap.Add("SUBSET OF WITH NOT EQUAL TO", 8842); - _unicodeCharacterMap.Add("SUPERSET OF WITH NOT EQUAL TO", 8843); - _unicodeCharacterMap.Add("MULTISET", 8844); - _unicodeCharacterMap.Add("MULTISET MULTIPLICATION", 8845); - _unicodeCharacterMap.Add("MULTISET UNION", 8846); - _unicodeCharacterMap.Add("SQUARE IMAGE OF", 8847); - _unicodeCharacterMap.Add("SQUARE ORIGINAL OF", 8848); - _unicodeCharacterMap.Add("SQUARE IMAGE OF OR EQUAL TO", 8849); - _unicodeCharacterMap.Add("SQUARE ORIGINAL OF OR EQUAL TO", 8850); - _unicodeCharacterMap.Add("SQUARE CAP", 8851); - _unicodeCharacterMap.Add("SQUARE CUP", 8852); - _unicodeCharacterMap.Add("CIRCLED PLUS", 8853); - _unicodeCharacterMap.Add("CIRCLED MINUS", 8854); - _unicodeCharacterMap.Add("CIRCLED TIMES", 8855); - _unicodeCharacterMap.Add("CIRCLED DIVISION SLASH", 8856); - _unicodeCharacterMap.Add("CIRCLED DOT OPERATOR", 8857); - _unicodeCharacterMap.Add("CIRCLED RING OPERATOR", 8858); - _unicodeCharacterMap.Add("CIRCLED ASTERISK OPERATOR", 8859); - _unicodeCharacterMap.Add("CIRCLED EQUALS", 8860); - _unicodeCharacterMap.Add("CIRCLED DASH", 8861); - _unicodeCharacterMap.Add("SQUARED PLUS", 8862); - _unicodeCharacterMap.Add("SQUARED MINUS", 8863); - _unicodeCharacterMap.Add("SQUARED TIMES", 8864); - _unicodeCharacterMap.Add("SQUARED DOT OPERATOR", 8865); - _unicodeCharacterMap.Add("RIGHT TACK", 8866); - _unicodeCharacterMap.Add("LEFT TACK", 8867); - _unicodeCharacterMap.Add("DOWN TACK", 8868); - _unicodeCharacterMap.Add("UP TACK", 8869); - _unicodeCharacterMap.Add("ASSERTION", 8870); - _unicodeCharacterMap.Add("MODELS", 8871); - _unicodeCharacterMap.Add("TRUE", 8872); - _unicodeCharacterMap.Add("FORCES", 8873); - _unicodeCharacterMap.Add("TRIPLE VERTICAL BAR RIGHT TURNSTILE", 8874); - _unicodeCharacterMap.Add("DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE", 8875); - _unicodeCharacterMap.Add("DOES NOT PROVE", 8876); - _unicodeCharacterMap.Add("NOT TRUE", 8877); - _unicodeCharacterMap.Add("DOES NOT FORCE", 8878); - _unicodeCharacterMap.Add("NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE", 8879); - _unicodeCharacterMap.Add("PRECEDES UNDER RELATION", 8880); - _unicodeCharacterMap.Add("SUCCEEDS UNDER RELATION", 8881); - _unicodeCharacterMap.Add("NORMAL SUBGROUP OF", 8882); - _unicodeCharacterMap.Add("CONTAINS AS NORMAL SUBGROUP", 8883); - _unicodeCharacterMap.Add("NORMAL SUBGROUP OF OR EQUAL TO", 8884); - _unicodeCharacterMap.Add("CONTAINS AS NORMAL SUBGROUP OR EQUAL TO", 8885); - _unicodeCharacterMap.Add("ORIGINAL OF", 8886); - _unicodeCharacterMap.Add("IMAGE OF", 8887); - _unicodeCharacterMap.Add("MULTIMAP", 8888); - _unicodeCharacterMap.Add("HERMITIAN CONJUGATE MATRIX", 8889); - _unicodeCharacterMap.Add("INTERCALATE", 8890); - _unicodeCharacterMap.Add("XOR", 8891); - _unicodeCharacterMap.Add("NAND", 8892); - _unicodeCharacterMap.Add("NOR", 8893); - _unicodeCharacterMap.Add("RIGHT ANGLE WITH ARC", 8894); - _unicodeCharacterMap.Add("RIGHT TRIANGLE", 8895); - _unicodeCharacterMap.Add("N ARY LOGICAL AND", 8896); - _unicodeCharacterMap.Add("N ARY LOGICAL OR", 8897); - _unicodeCharacterMap.Add("N ARY INTERSECTION", 8898); - _unicodeCharacterMap.Add("N ARY UNION", 8899); - _unicodeCharacterMap.Add("DIAMOND OPERATOR", 8900); - _unicodeCharacterMap.Add("DOT OPERATOR", 8901); - _unicodeCharacterMap.Add("STAR OPERATOR", 8902); - _unicodeCharacterMap.Add("DIVISION TIMES", 8903); - _unicodeCharacterMap.Add("BOWTIE", 8904); - _unicodeCharacterMap.Add("LEFT NORMAL FACTOR SEMIDIRECT PRODUCT", 8905); - _unicodeCharacterMap.Add("RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT", 8906); - _unicodeCharacterMap.Add("LEFT SEMIDIRECT PRODUCT", 8907); - _unicodeCharacterMap.Add("RIGHT SEMIDIRECT PRODUCT", 8908); - _unicodeCharacterMap.Add("REVERSED TILDE EQUALS", 8909); - _unicodeCharacterMap.Add("CURLY LOGICAL OR", 8910); - _unicodeCharacterMap.Add("CURLY LOGICAL AND", 8911); - _unicodeCharacterMap.Add("DOUBLE SUBSET", 8912); - _unicodeCharacterMap.Add("DOUBLE SUPERSET", 8913); - _unicodeCharacterMap.Add("DOUBLE INTERSECTION", 8914); - _unicodeCharacterMap.Add("DOUBLE UNION", 8915); - _unicodeCharacterMap.Add("PITCHFORK", 8916); - _unicodeCharacterMap.Add("EQUAL AND PARALLEL TO", 8917); - _unicodeCharacterMap.Add("LESS THAN WITH DOT", 8918); - _unicodeCharacterMap.Add("GREATER THAN WITH DOT", 8919); - _unicodeCharacterMap.Add("VERY MUCH LESS THAN", 8920); - _unicodeCharacterMap.Add("VERY MUCH GREATER THAN", 8921); - _unicodeCharacterMap.Add("LESS THAN EQUAL TO OR GREATER THAN", 8922); - _unicodeCharacterMap.Add("GREATER THAN EQUAL TO OR LESS THAN", 8923); - _unicodeCharacterMap.Add("EQUAL TO OR LESS THAN", 8924); - _unicodeCharacterMap.Add("EQUAL TO OR GREATER THAN", 8925); - _unicodeCharacterMap.Add("EQUAL TO OR PRECEDES", 8926); - _unicodeCharacterMap.Add("EQUAL TO OR SUCCEEDS", 8927); - _unicodeCharacterMap.Add("DOES NOT PRECEDE OR EQUAL", 8928); - _unicodeCharacterMap.Add("DOES NOT SUCCEED OR EQUAL", 8929); - _unicodeCharacterMap.Add("NOT SQUARE IMAGE OF OR EQUAL TO", 8930); - _unicodeCharacterMap.Add("NOT SQUARE ORIGINAL OF OR EQUAL TO", 8931); - _unicodeCharacterMap.Add("SQUARE IMAGE OF OR NOT EQUAL TO", 8932); - _unicodeCharacterMap.Add("SQUARE ORIGINAL OF OR NOT EQUAL TO", 8933); - _unicodeCharacterMap.Add("LESS THAN BUT NOT EQUIVALENT TO", 8934); - _unicodeCharacterMap.Add("GREATER THAN BUT NOT EQUIVALENT TO", 8935); - _unicodeCharacterMap.Add("PRECEDES BUT NOT EQUIVALENT TO", 8936); - _unicodeCharacterMap.Add("SUCCEEDS BUT NOT EQUIVALENT TO", 8937); - _unicodeCharacterMap.Add("NOT NORMAL SUBGROUP OF", 8938); - _unicodeCharacterMap.Add("DOES NOT CONTAIN AS NORMAL SUBGROUP", 8939); - _unicodeCharacterMap.Add("NOT NORMAL SUBGROUP OF OR EQUAL TO", 8940); - _unicodeCharacterMap.Add("DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL", 8941); - _unicodeCharacterMap.Add("VERTICAL ELLIPSIS", 8942); - _unicodeCharacterMap.Add("MIDLINE HORIZONTAL ELLIPSIS", 8943); - _unicodeCharacterMap.Add("UP RIGHT DIAGONAL ELLIPSIS", 8944); - _unicodeCharacterMap.Add("DOWN RIGHT DIAGONAL ELLIPSIS", 8945); - _unicodeCharacterMap.Add("ELEMENT OF WITH LONG HORIZONTAL STROKE", 8946); - _unicodeCharacterMap.Add("ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 8947); - _unicodeCharacterMap.Add("SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 8948); - _unicodeCharacterMap.Add("ELEMENT OF WITH DOT ABOVE", 8949); - _unicodeCharacterMap.Add("ELEMENT OF WITH OVERBAR", 8950); - _unicodeCharacterMap.Add("SMALL ELEMENT OF WITH OVERBAR", 8951); - _unicodeCharacterMap.Add("ELEMENT OF WITH UNDERBAR", 8952); - _unicodeCharacterMap.Add("ELEMENT OF WITH TWO HORIZONTAL STROKES", 8953); - _unicodeCharacterMap.Add("CONTAINS WITH LONG HORIZONTAL STROKE", 8954); - _unicodeCharacterMap.Add("CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 8955); - _unicodeCharacterMap.Add("SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 8956); - _unicodeCharacterMap.Add("CONTAINS WITH OVERBAR", 8957); - _unicodeCharacterMap.Add("SMALL CONTAINS WITH OVERBAR", 8958); - _unicodeCharacterMap.Add("Z NOTATION BAG MEMBERSHIP", 8959); - _unicodeCharacterMap.Add("DIAMETER SIGN", 8960); - _unicodeCharacterMap.Add("ELECTRIC ARROW", 8961); - _unicodeCharacterMap.Add("HOUSE", 8962); - _unicodeCharacterMap.Add("UP ARROWHEAD", 8963); - _unicodeCharacterMap.Add("DOWN ARROWHEAD", 8964); - _unicodeCharacterMap.Add("PROJECTIVE", 8965); - _unicodeCharacterMap.Add("PERSPECTIVE", 8966); - _unicodeCharacterMap.Add("WAVY LINE", 8967); - _unicodeCharacterMap.Add("LEFT CEILING", 8968); - _unicodeCharacterMap.Add("RIGHT CEILING", 8969); - _unicodeCharacterMap.Add("LEFT FLOOR", 8970); - _unicodeCharacterMap.Add("RIGHT FLOOR", 8971); - _unicodeCharacterMap.Add("BOTTOM RIGHT CROP", 8972); - _unicodeCharacterMap.Add("BOTTOM LEFT CROP", 8973); - _unicodeCharacterMap.Add("TOP RIGHT CROP", 8974); - _unicodeCharacterMap.Add("TOP LEFT CROP", 8975); - _unicodeCharacterMap.Add("REVERSED NOT SIGN", 8976); - _unicodeCharacterMap.Add("SQUARE LOZENGE", 8977); - _unicodeCharacterMap.Add("ARC", 8978); - _unicodeCharacterMap.Add("SEGMENT", 8979); - _unicodeCharacterMap.Add("SECTOR", 8980); - _unicodeCharacterMap.Add("TELEPHONE RECORDER", 8981); - _unicodeCharacterMap.Add("POSITION INDICATOR", 8982); - _unicodeCharacterMap.Add("VIEWDATA SQUARE", 8983); - _unicodeCharacterMap.Add("PLACE OF INTEREST SIGN", 8984); - _unicodeCharacterMap.Add("TURNED NOT SIGN", 8985); - _unicodeCharacterMap.Add("WATCH", 8986); - _unicodeCharacterMap.Add("HOURGLASS", 8987); - _unicodeCharacterMap.Add("TOP LEFT CORNER", 8988); - _unicodeCharacterMap.Add("TOP RIGHT CORNER", 8989); - _unicodeCharacterMap.Add("BOTTOM LEFT CORNER", 8990); - _unicodeCharacterMap.Add("BOTTOM RIGHT CORNER", 8991); - _unicodeCharacterMap.Add("TOP HALF INTEGRAL", 8992); - _unicodeCharacterMap.Add("BOTTOM HALF INTEGRAL", 8993); - _unicodeCharacterMap.Add("FROWN", 8994); - _unicodeCharacterMap.Add("SMILE", 8995); - _unicodeCharacterMap.Add("UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS", 8996); - _unicodeCharacterMap.Add("OPTION KEY", 8997); - _unicodeCharacterMap.Add("ERASE TO THE RIGHT", 8998); - _unicodeCharacterMap.Add("X IN A RECTANGLE BOX", 8999); - _unicodeCharacterMap.Add("KEYBOARD", 9000); - _unicodeCharacterMap.Add("LEFT POINTING ANGLE BRACKET", 9001); - _unicodeCharacterMap.Add("RIGHT POINTING ANGLE BRACKET", 9002); - _unicodeCharacterMap.Add("ERASE TO THE LEFT", 9003); - _unicodeCharacterMap.Add("BENZENE RING", 9004); - _unicodeCharacterMap.Add("CYLINDRICITY", 9005); - _unicodeCharacterMap.Add("ALL AROUND PROFILE", 9006); - _unicodeCharacterMap.Add("SYMMETRY", 9007); - _unicodeCharacterMap.Add("TOTAL RUNOUT", 9008); - _unicodeCharacterMap.Add("DIMENSION ORIGIN", 9009); - _unicodeCharacterMap.Add("CONICAL TAPER", 9010); - _unicodeCharacterMap.Add("SLOPE", 9011); - _unicodeCharacterMap.Add("COUNTERBORE", 9012); - _unicodeCharacterMap.Add("COUNTERSINK", 9013); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL I BEAM", 9014); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL SQUISH QUAD", 9015); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD EQUAL", 9016); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD DIVIDE", 9017); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD DIAMOND", 9018); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD JOT", 9019); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD CIRCLE", 9020); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL CIRCLE STILE", 9021); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL CIRCLE JOT", 9022); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL SLASH BAR", 9023); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL BACKSLASH BAR", 9024); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD SLASH", 9025); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD BACKSLASH", 9026); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD LESS THAN", 9027); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD GREATER THAN", 9028); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL LEFTWARDS VANE", 9029); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL RIGHTWARDS VANE", 9030); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW", 9031); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW", 9032); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH", 9033); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR", 9034); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DELTA STILE", 9035); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD DOWN CARET", 9036); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD DELTA", 9037); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DOWN TACK JOT", 9038); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL UPWARDS VANE", 9039); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW", 9040); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL UP TACK OVERBAR", 9041); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DEL STILE", 9042); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD UP CARET", 9043); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD DEL", 9044); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL UP TACK JOT", 9045); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DOWNWARDS VANE", 9046); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW", 9047); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUOTE UNDERBAR", 9048); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DELTA UNDERBAR", 9049); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR", 9050); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL JOT UNDERBAR", 9051); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR", 9052); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL UP SHOE JOT", 9053); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUOTE QUAD", 9054); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL CIRCLE STAR", 9055); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD COLON", 9056); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL UP TACK DIAERESIS", 9057); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DEL DIAERESIS", 9058); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL STAR DIAERESIS", 9059); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL JOT DIAERESIS", 9060); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS", 9061); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DOWN SHOE STILE", 9062); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL LEFT SHOE STILE", 9063); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL TILDE DIAERESIS", 9064); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL GREATER THAN DIAERESIS", 9065); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL COMMA BAR", 9066); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DEL TILDE", 9067); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL ZILDE", 9068); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL STILE TILDE", 9069); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR", 9070); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD NOT EQUAL", 9071); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD QUESTION", 9072); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL DOWN CARET TILDE", 9073); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL UP CARET TILDE", 9074); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL IOTA", 9075); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL RHO", 9076); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL OMEGA", 9077); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL ALPHA UNDERBAR", 9078); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL EPSILON UNDERBAR", 9079); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL IOTA UNDERBAR", 9080); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL OMEGA UNDERBAR", 9081); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL ALPHA", 9082); - _unicodeCharacterMap.Add("NOT CHECK MARK", 9083); - _unicodeCharacterMap.Add("RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW", 9084); - _unicodeCharacterMap.Add("SHOULDERED OPEN BOX", 9085); - _unicodeCharacterMap.Add("BELL SYMBOL", 9086); - _unicodeCharacterMap.Add("VERTICAL LINE WITH MIDDLE DOT", 9087); - _unicodeCharacterMap.Add("INSERTION SYMBOL", 9088); - _unicodeCharacterMap.Add("CONTINUOUS UNDERLINE SYMBOL", 9089); - _unicodeCharacterMap.Add("DISCONTINUOUS UNDERLINE SYMBOL", 9090); - _unicodeCharacterMap.Add("EMPHASIS SYMBOL", 9091); - _unicodeCharacterMap.Add("COMPOSITION SYMBOL", 9092); - _unicodeCharacterMap.Add("WHITE SQUARE WITH CENTRE VERTICAL LINE", 9093); - _unicodeCharacterMap.Add("ENTER SYMBOL", 9094); - _unicodeCharacterMap.Add("ALTERNATIVE KEY SYMBOL", 9095); - _unicodeCharacterMap.Add("HELM SYMBOL", 9096); - _unicodeCharacterMap.Add("CIRCLED HORIZONTAL BAR WITH NOTCH", 9097); - _unicodeCharacterMap.Add("CIRCLED TRIANGLE DOWN", 9098); - _unicodeCharacterMap.Add("BROKEN CIRCLE WITH NORTHWEST ARROW", 9099); - _unicodeCharacterMap.Add("UNDO SYMBOL", 9100); - _unicodeCharacterMap.Add("MONOSTABLE SYMBOL", 9101); - _unicodeCharacterMap.Add("HYSTERESIS SYMBOL", 9102); - _unicodeCharacterMap.Add("OPEN CIRCUIT OUTPUT H TYPE SYMBOL", 9103); - _unicodeCharacterMap.Add("OPEN CIRCUIT OUTPUT L TYPE SYMBOL", 9104); - _unicodeCharacterMap.Add("PASSIVE PULL DOWN OUTPUT SYMBOL", 9105); - _unicodeCharacterMap.Add("PASSIVE PULL UP OUTPUT SYMBOL", 9106); - _unicodeCharacterMap.Add("DIRECT CURRENT SYMBOL FORM TWO", 9107); - _unicodeCharacterMap.Add("SOFTWARE FUNCTION SYMBOL", 9108); - _unicodeCharacterMap.Add("APL FUNCTIONAL SYMBOL QUAD", 9109); - _unicodeCharacterMap.Add("DECIMAL SEPARATOR KEY SYMBOL", 9110); - _unicodeCharacterMap.Add("PREVIOUS PAGE", 9111); - _unicodeCharacterMap.Add("NEXT PAGE", 9112); - _unicodeCharacterMap.Add("PRINT SCREEN SYMBOL", 9113); - _unicodeCharacterMap.Add("CLEAR SCREEN SYMBOL", 9114); - _unicodeCharacterMap.Add("LEFT PARENTHESIS UPPER HOOK", 9115); - _unicodeCharacterMap.Add("LEFT PARENTHESIS EXTENSION", 9116); - _unicodeCharacterMap.Add("LEFT PARENTHESIS LOWER HOOK", 9117); - _unicodeCharacterMap.Add("RIGHT PARENTHESIS UPPER HOOK", 9118); - _unicodeCharacterMap.Add("RIGHT PARENTHESIS EXTENSION", 9119); - _unicodeCharacterMap.Add("RIGHT PARENTHESIS LOWER HOOK", 9120); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET UPPER CORNER", 9121); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET EXTENSION", 9122); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET LOWER CORNER", 9123); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET UPPER CORNER", 9124); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET EXTENSION", 9125); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET LOWER CORNER", 9126); - _unicodeCharacterMap.Add("LEFT CURLY BRACKET UPPER HOOK", 9127); - _unicodeCharacterMap.Add("LEFT CURLY BRACKET MIDDLE PIECE", 9128); - _unicodeCharacterMap.Add("LEFT CURLY BRACKET LOWER HOOK", 9129); - _unicodeCharacterMap.Add("CURLY BRACKET EXTENSION", 9130); - _unicodeCharacterMap.Add("RIGHT CURLY BRACKET UPPER HOOK", 9131); - _unicodeCharacterMap.Add("RIGHT CURLY BRACKET MIDDLE PIECE", 9132); - _unicodeCharacterMap.Add("RIGHT CURLY BRACKET LOWER HOOK", 9133); - _unicodeCharacterMap.Add("INTEGRAL EXTENSION", 9134); - _unicodeCharacterMap.Add("HORIZONTAL LINE EXTENSION", 9135); - _unicodeCharacterMap.Add("UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION", 9136); - _unicodeCharacterMap.Add("UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION", 9137); - _unicodeCharacterMap.Add("SUMMATION TOP", 9138); - _unicodeCharacterMap.Add("SUMMATION BOTTOM", 9139); - _unicodeCharacterMap.Add("TOP SQUARE BRACKET", 9140); - _unicodeCharacterMap.Add("BOTTOM SQUARE BRACKET", 9141); - _unicodeCharacterMap.Add("BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET", 9142); - _unicodeCharacterMap.Add("RADICAL SYMBOL BOTTOM", 9143); - _unicodeCharacterMap.Add("LEFT VERTICAL BOX LINE", 9144); - _unicodeCharacterMap.Add("RIGHT VERTICAL BOX LINE", 9145); - _unicodeCharacterMap.Add("HORIZONTAL SCAN LINE 1", 9146); - _unicodeCharacterMap.Add("HORIZONTAL SCAN LINE 3", 9147); - _unicodeCharacterMap.Add("HORIZONTAL SCAN LINE 7", 9148); - _unicodeCharacterMap.Add("HORIZONTAL SCAN LINE 9", 9149); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT", 9150); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT", 9151); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE", 9152); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE", 9153); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE", 9154); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE", 9155); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE", 9156); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE", 9157); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE", 9158); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE", 9159); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE", 9160); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL", 9161); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL", 9162); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT", 9163); - _unicodeCharacterMap.Add("DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT", 9164); - _unicodeCharacterMap.Add("SQUARE FOOT", 9165); - _unicodeCharacterMap.Add("RETURN SYMBOL", 9166); - _unicodeCharacterMap.Add("EJECT SYMBOL", 9167); - _unicodeCharacterMap.Add("VERTICAL LINE EXTENSION", 9168); - _unicodeCharacterMap.Add("METRICAL BREVE", 9169); - _unicodeCharacterMap.Add("METRICAL LONG OVER SHORT", 9170); - _unicodeCharacterMap.Add("METRICAL SHORT OVER LONG", 9171); - _unicodeCharacterMap.Add("METRICAL LONG OVER TWO SHORTS", 9172); - _unicodeCharacterMap.Add("METRICAL TWO SHORTS OVER LONG", 9173); - _unicodeCharacterMap.Add("METRICAL TWO SHORTS JOINED", 9174); - _unicodeCharacterMap.Add("METRICAL TRISEME", 9175); - _unicodeCharacterMap.Add("METRICAL TETRASEME", 9176); - _unicodeCharacterMap.Add("METRICAL PENTASEME", 9177); - _unicodeCharacterMap.Add("EARTH GROUND", 9178); - _unicodeCharacterMap.Add("FUSE", 9179); - _unicodeCharacterMap.Add("TOP PARENTHESIS", 9180); - _unicodeCharacterMap.Add("BOTTOM PARENTHESIS", 9181); - _unicodeCharacterMap.Add("TOP CURLY BRACKET", 9182); - _unicodeCharacterMap.Add("BOTTOM CURLY BRACKET", 9183); - _unicodeCharacterMap.Add("TOP TORTOISE SHELL BRACKET", 9184); - _unicodeCharacterMap.Add("BOTTOM TORTOISE SHELL BRACKET", 9185); - _unicodeCharacterMap.Add("WHITE TRAPEZIUM", 9186); - _unicodeCharacterMap.Add("BENZENE RING WITH CIRCLE", 9187); - _unicodeCharacterMap.Add("STRAIGHTNESS", 9188); - _unicodeCharacterMap.Add("FLATNESS", 9189); - _unicodeCharacterMap.Add("AC CURRENT", 9190); - _unicodeCharacterMap.Add("ELECTRICAL INTERSECTION", 9191); - _unicodeCharacterMap.Add("DECIMAL EXPONENT SYMBOL", 9192); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING DOUBLE TRIANGLE", 9193); - _unicodeCharacterMap.Add("BLACK LEFT POINTING DOUBLE TRIANGLE", 9194); - _unicodeCharacterMap.Add("BLACK UP POINTING DOUBLE TRIANGLE", 9195); - _unicodeCharacterMap.Add("BLACK DOWN POINTING DOUBLE TRIANGLE", 9196); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING DOUBLE TRIANGLE WITH VERTICAL BAR", 9197); - _unicodeCharacterMap.Add("BLACK LEFT POINTING DOUBLE TRIANGLE WITH VERTICAL BAR", 9198); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING TRIANGLE WITH DOUBLE VERTICAL BAR", 9199); - _unicodeCharacterMap.Add("ALARM CLOCK", 9200); - _unicodeCharacterMap.Add("STOPWATCH", 9201); - _unicodeCharacterMap.Add("TIMER CLOCK", 9202); - _unicodeCharacterMap.Add("HOURGLASS WITH FLOWING SAND", 9203); - _unicodeCharacterMap.Add("BLACK MEDIUM LEFT POINTING TRIANGLE", 9204); - _unicodeCharacterMap.Add("BLACK MEDIUM RIGHT POINTING TRIANGLE", 9205); - _unicodeCharacterMap.Add("BLACK MEDIUM UP POINTING TRIANGLE", 9206); - _unicodeCharacterMap.Add("BLACK MEDIUM DOWN POINTING TRIANGLE", 9207); - _unicodeCharacterMap.Add("DOUBLE VERTICAL BAR", 9208); - _unicodeCharacterMap.Add("BLACK SQUARE FOR STOP", 9209); - _unicodeCharacterMap.Add("BLACK CIRCLE FOR RECORD", 9210); - _unicodeCharacterMap.Add("POWER SYMBOL", 9211); - _unicodeCharacterMap.Add("POWER ON OFF SYMBOL", 9212); - _unicodeCharacterMap.Add("POWER ON SYMBOL", 9213); - _unicodeCharacterMap.Add("POWER SLEEP SYMBOL", 9214); - _unicodeCharacterMap.Add("SYMBOL FOR NULL", 9216); - _unicodeCharacterMap.Add("SYMBOL FOR START OF HEADING", 9217); - _unicodeCharacterMap.Add("SYMBOL FOR START OF TEXT", 9218); - _unicodeCharacterMap.Add("SYMBOL FOR END OF TEXT", 9219); - _unicodeCharacterMap.Add("SYMBOL FOR END OF TRANSMISSION", 9220); - _unicodeCharacterMap.Add("SYMBOL FOR ENQUIRY", 9221); - _unicodeCharacterMap.Add("SYMBOL FOR ACKNOWLEDGE", 9222); - _unicodeCharacterMap.Add("SYMBOL FOR BELL", 9223); - _unicodeCharacterMap.Add("SYMBOL FOR BACKSPACE", 9224); - _unicodeCharacterMap.Add("SYMBOL FOR HORIZONTAL TABULATION", 9225); - _unicodeCharacterMap.Add("SYMBOL FOR LINE FEED", 9226); - _unicodeCharacterMap.Add("SYMBOL FOR VERTICAL TABULATION", 9227); - _unicodeCharacterMap.Add("SYMBOL FOR FORM FEED", 9228); - _unicodeCharacterMap.Add("SYMBOL FOR CARRIAGE RETURN", 9229); - _unicodeCharacterMap.Add("SYMBOL FOR SHIFT OUT", 9230); - _unicodeCharacterMap.Add("SYMBOL FOR SHIFT IN", 9231); - _unicodeCharacterMap.Add("SYMBOL FOR DATA LINK ESCAPE", 9232); - _unicodeCharacterMap.Add("SYMBOL FOR DEVICE CONTROL ONE", 9233); - _unicodeCharacterMap.Add("SYMBOL FOR DEVICE CONTROL TWO", 9234); - _unicodeCharacterMap.Add("SYMBOL FOR DEVICE CONTROL THREE", 9235); - _unicodeCharacterMap.Add("SYMBOL FOR DEVICE CONTROL FOUR", 9236); - _unicodeCharacterMap.Add("SYMBOL FOR NEGATIVE ACKNOWLEDGE", 9237); - _unicodeCharacterMap.Add("SYMBOL FOR SYNCHRONOUS IDLE", 9238); - _unicodeCharacterMap.Add("SYMBOL FOR END OF TRANSMISSION BLOCK", 9239); - _unicodeCharacterMap.Add("SYMBOL FOR CANCEL", 9240); - _unicodeCharacterMap.Add("SYMBOL FOR END OF MEDIUM", 9241); - _unicodeCharacterMap.Add("SYMBOL FOR SUBSTITUTE", 9242); - _unicodeCharacterMap.Add("SYMBOL FOR ESCAPE", 9243); - _unicodeCharacterMap.Add("SYMBOL FOR FILE SEPARATOR", 9244); - _unicodeCharacterMap.Add("SYMBOL FOR GROUP SEPARATOR", 9245); - _unicodeCharacterMap.Add("SYMBOL FOR RECORD SEPARATOR", 9246); - _unicodeCharacterMap.Add("SYMBOL FOR UNIT SEPARATOR", 9247); - _unicodeCharacterMap.Add("SYMBOL FOR SPACE", 9248); - _unicodeCharacterMap.Add("SYMBOL FOR DELETE", 9249); - _unicodeCharacterMap.Add("BLANK SYMBOL", 9250); - _unicodeCharacterMap.Add("OPEN BOX", 9251); - _unicodeCharacterMap.Add("SYMBOL FOR NEWLINE", 9252); - _unicodeCharacterMap.Add("SYMBOL FOR DELETE FORM TWO", 9253); - _unicodeCharacterMap.Add("SYMBOL FOR SUBSTITUTE FORM TWO", 9254); - _unicodeCharacterMap.Add("OCR HOOK", 9280); - _unicodeCharacterMap.Add("OCR CHAIR", 9281); - _unicodeCharacterMap.Add("OCR FORK", 9282); - _unicodeCharacterMap.Add("OCR INVERTED FORK", 9283); - _unicodeCharacterMap.Add("OCR BELT BUCKLE", 9284); - _unicodeCharacterMap.Add("OCR BOW TIE", 9285); - _unicodeCharacterMap.Add("OCR BRANCH BANK IDENTIFICATION", 9286); - _unicodeCharacterMap.Add("OCR AMOUNT OF CHECK", 9287); - _unicodeCharacterMap.Add("OCR DASH", 9288); - _unicodeCharacterMap.Add("OCR CUSTOMER ACCOUNT NUMBER", 9289); - _unicodeCharacterMap.Add("OCR DOUBLE BACKSLASH", 9290); - _unicodeCharacterMap.Add("CIRCLED DIGIT ONE", 9312); - _unicodeCharacterMap.Add("CIRCLED DIGIT TWO", 9313); - _unicodeCharacterMap.Add("CIRCLED DIGIT THREE", 9314); - _unicodeCharacterMap.Add("CIRCLED DIGIT FOUR", 9315); - _unicodeCharacterMap.Add("CIRCLED DIGIT FIVE", 9316); - _unicodeCharacterMap.Add("CIRCLED DIGIT SIX", 9317); - _unicodeCharacterMap.Add("CIRCLED DIGIT SEVEN", 9318); - _unicodeCharacterMap.Add("CIRCLED DIGIT EIGHT", 9319); - _unicodeCharacterMap.Add("CIRCLED DIGIT NINE", 9320); - _unicodeCharacterMap.Add("CIRCLED NUMBER TEN", 9321); - _unicodeCharacterMap.Add("CIRCLED NUMBER ELEVEN", 9322); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWELVE", 9323); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTEEN", 9324); - _unicodeCharacterMap.Add("CIRCLED NUMBER FOURTEEN", 9325); - _unicodeCharacterMap.Add("CIRCLED NUMBER FIFTEEN", 9326); - _unicodeCharacterMap.Add("CIRCLED NUMBER SIXTEEN", 9327); - _unicodeCharacterMap.Add("CIRCLED NUMBER SEVENTEEN", 9328); - _unicodeCharacterMap.Add("CIRCLED NUMBER EIGHTEEN", 9329); - _unicodeCharacterMap.Add("CIRCLED NUMBER NINETEEN", 9330); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY", 9331); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT ONE", 9332); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT TWO", 9333); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT THREE", 9334); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT FOUR", 9335); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT FIVE", 9336); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT SIX", 9337); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT SEVEN", 9338); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT EIGHT", 9339); - _unicodeCharacterMap.Add("PARENTHESIZED DIGIT NINE", 9340); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER TEN", 9341); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER ELEVEN", 9342); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER TWELVE", 9343); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER THIRTEEN", 9344); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER FOURTEEN", 9345); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER FIFTEEN", 9346); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER SIXTEEN", 9347); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER SEVENTEEN", 9348); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER EIGHTEEN", 9349); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER NINETEEN", 9350); - _unicodeCharacterMap.Add("PARENTHESIZED NUMBER TWENTY", 9351); - _unicodeCharacterMap.Add("DIGIT ONE FULL STOP", 9352); - _unicodeCharacterMap.Add("DIGIT TWO FULL STOP", 9353); - _unicodeCharacterMap.Add("DIGIT THREE FULL STOP", 9354); - _unicodeCharacterMap.Add("DIGIT FOUR FULL STOP", 9355); - _unicodeCharacterMap.Add("DIGIT FIVE FULL STOP", 9356); - _unicodeCharacterMap.Add("DIGIT SIX FULL STOP", 9357); - _unicodeCharacterMap.Add("DIGIT SEVEN FULL STOP", 9358); - _unicodeCharacterMap.Add("DIGIT EIGHT FULL STOP", 9359); - _unicodeCharacterMap.Add("DIGIT NINE FULL STOP", 9360); - _unicodeCharacterMap.Add("NUMBER TEN FULL STOP", 9361); - _unicodeCharacterMap.Add("NUMBER ELEVEN FULL STOP", 9362); - _unicodeCharacterMap.Add("NUMBER TWELVE FULL STOP", 9363); - _unicodeCharacterMap.Add("NUMBER THIRTEEN FULL STOP", 9364); - _unicodeCharacterMap.Add("NUMBER FOURTEEN FULL STOP", 9365); - _unicodeCharacterMap.Add("NUMBER FIFTEEN FULL STOP", 9366); - _unicodeCharacterMap.Add("NUMBER SIXTEEN FULL STOP", 9367); - _unicodeCharacterMap.Add("NUMBER SEVENTEEN FULL STOP", 9368); - _unicodeCharacterMap.Add("NUMBER EIGHTEEN FULL STOP", 9369); - _unicodeCharacterMap.Add("NUMBER NINETEEN FULL STOP", 9370); - _unicodeCharacterMap.Add("NUMBER TWENTY FULL STOP", 9371); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER A", 9372); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER B", 9373); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER C", 9374); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER D", 9375); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER E", 9376); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER F", 9377); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER G", 9378); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER H", 9379); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER I", 9380); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER J", 9381); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER K", 9382); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER L", 9383); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER M", 9384); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER N", 9385); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER O", 9386); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER P", 9387); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER Q", 9388); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER R", 9389); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER S", 9390); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER T", 9391); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER U", 9392); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER V", 9393); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER W", 9394); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER X", 9395); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER Y", 9396); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN SMALL LETTER Z", 9397); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER A", 9398); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER B", 9399); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER C", 9400); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER D", 9401); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER E", 9402); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER F", 9403); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER G", 9404); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER H", 9405); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER I", 9406); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER J", 9407); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER K", 9408); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER L", 9409); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER M", 9410); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER N", 9411); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER O", 9412); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER P", 9413); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER Q", 9414); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER R", 9415); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER S", 9416); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER T", 9417); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER U", 9418); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER V", 9419); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER W", 9420); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER X", 9421); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER Y", 9422); - _unicodeCharacterMap.Add("CIRCLED LATIN CAPITAL LETTER Z", 9423); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER A", 9424); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER B", 9425); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER C", 9426); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER D", 9427); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER E", 9428); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER F", 9429); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER G", 9430); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER H", 9431); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER I", 9432); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER J", 9433); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER K", 9434); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER L", 9435); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER M", 9436); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER N", 9437); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER O", 9438); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER P", 9439); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER Q", 9440); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER R", 9441); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER S", 9442); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER T", 9443); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER U", 9444); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER V", 9445); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER W", 9446); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER X", 9447); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER Y", 9448); - _unicodeCharacterMap.Add("CIRCLED LATIN SMALL LETTER Z", 9449); - _unicodeCharacterMap.Add("CIRCLED DIGIT ZERO", 9450); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER ELEVEN", 9451); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER TWELVE", 9452); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER THIRTEEN", 9453); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER FOURTEEN", 9454); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER FIFTEEN", 9455); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER SIXTEEN", 9456); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER SEVENTEEN", 9457); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER EIGHTEEN", 9458); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER NINETEEN", 9459); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED NUMBER TWENTY", 9460); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT ONE", 9461); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT TWO", 9462); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT THREE", 9463); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT FOUR", 9464); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT FIVE", 9465); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT SIX", 9466); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT SEVEN", 9467); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT EIGHT", 9468); - _unicodeCharacterMap.Add("DOUBLE CIRCLED DIGIT NINE", 9469); - _unicodeCharacterMap.Add("DOUBLE CIRCLED NUMBER TEN", 9470); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED DIGIT ZERO", 9471); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT HORIZONTAL", 9472); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY HORIZONTAL", 9473); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT VERTICAL", 9474); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY VERTICAL", 9475); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL", 9476); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL", 9477); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL", 9478); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL", 9479); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL", 9480); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL", 9481); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL", 9482); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL", 9483); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DOWN AND RIGHT", 9484); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY", 9485); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT", 9486); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY DOWN AND RIGHT", 9487); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DOWN AND LEFT", 9488); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY", 9489); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT", 9490); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY DOWN AND LEFT", 9491); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT UP AND RIGHT", 9492); - _unicodeCharacterMap.Add("BOX DRAWINGS UP LIGHT AND RIGHT HEAVY", 9493); - _unicodeCharacterMap.Add("BOX DRAWINGS UP HEAVY AND RIGHT LIGHT", 9494); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY UP AND RIGHT", 9495); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT UP AND LEFT", 9496); - _unicodeCharacterMap.Add("BOX DRAWINGS UP LIGHT AND LEFT HEAVY", 9497); - _unicodeCharacterMap.Add("BOX DRAWINGS UP HEAVY AND LEFT LIGHT", 9498); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY UP AND LEFT", 9499); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT VERTICAL AND RIGHT", 9500); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY", 9501); - _unicodeCharacterMap.Add("BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT", 9502); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT", 9503); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT", 9504); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY", 9505); - _unicodeCharacterMap.Add("BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY", 9506); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY VERTICAL AND RIGHT", 9507); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT VERTICAL AND LEFT", 9508); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY", 9509); - _unicodeCharacterMap.Add("BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT", 9510); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT", 9511); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT", 9512); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY", 9513); - _unicodeCharacterMap.Add("BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY", 9514); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY VERTICAL AND LEFT", 9515); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DOWN AND HORIZONTAL", 9516); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT", 9517); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT", 9518); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY", 9519); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT", 9520); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY", 9521); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY", 9522); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY DOWN AND HORIZONTAL", 9523); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT UP AND HORIZONTAL", 9524); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT", 9525); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT", 9526); - _unicodeCharacterMap.Add("BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY", 9527); - _unicodeCharacterMap.Add("BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT", 9528); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY", 9529); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY", 9530); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY UP AND HORIZONTAL", 9531); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL", 9532); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT", 9533); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT", 9534); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY", 9535); - _unicodeCharacterMap.Add("BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT", 9536); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT", 9537); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT", 9538); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT", 9539); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT", 9540); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT", 9541); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT", 9542); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY", 9543); - _unicodeCharacterMap.Add("BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY", 9544); - _unicodeCharacterMap.Add("BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY", 9545); - _unicodeCharacterMap.Add("BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY", 9546); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL", 9547); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL", 9548); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL", 9549); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL", 9550); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL", 9551); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE HORIZONTAL", 9552); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE VERTICAL", 9553); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE", 9554); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE", 9555); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE DOWN AND RIGHT", 9556); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE", 9557); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE", 9558); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE DOWN AND LEFT", 9559); - _unicodeCharacterMap.Add("BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE", 9560); - _unicodeCharacterMap.Add("BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE", 9561); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE UP AND RIGHT", 9562); - _unicodeCharacterMap.Add("BOX DRAWINGS UP SINGLE AND LEFT DOUBLE", 9563); - _unicodeCharacterMap.Add("BOX DRAWINGS UP DOUBLE AND LEFT SINGLE", 9564); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE UP AND LEFT", 9565); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE", 9566); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE", 9567); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE VERTICAL AND RIGHT", 9568); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE", 9569); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE", 9570); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE VERTICAL AND LEFT", 9571); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE", 9572); - _unicodeCharacterMap.Add("BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE", 9573); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL", 9574); - _unicodeCharacterMap.Add("BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE", 9575); - _unicodeCharacterMap.Add("BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE", 9576); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE UP AND HORIZONTAL", 9577); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE", 9578); - _unicodeCharacterMap.Add("BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE", 9579); - _unicodeCharacterMap.Add("BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL", 9580); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT ARC DOWN AND RIGHT", 9581); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT ARC DOWN AND LEFT", 9582); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT ARC UP AND LEFT", 9583); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT ARC UP AND RIGHT", 9584); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT", 9585); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT", 9586); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DIAGONAL CROSS", 9587); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT LEFT", 9588); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT UP", 9589); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT RIGHT", 9590); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT DOWN", 9591); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY LEFT", 9592); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY UP", 9593); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY RIGHT", 9594); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY DOWN", 9595); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT", 9596); - _unicodeCharacterMap.Add("BOX DRAWINGS LIGHT UP AND HEAVY DOWN", 9597); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT", 9598); - _unicodeCharacterMap.Add("BOX DRAWINGS HEAVY UP AND LIGHT DOWN", 9599); - _unicodeCharacterMap.Add("UPPER HALF BLOCK", 9600); - _unicodeCharacterMap.Add("LOWER ONE EIGHTH BLOCK", 9601); - _unicodeCharacterMap.Add("LOWER ONE QUARTER BLOCK", 9602); - _unicodeCharacterMap.Add("LOWER THREE EIGHTHS BLOCK", 9603); - _unicodeCharacterMap.Add("LOWER HALF BLOCK", 9604); - _unicodeCharacterMap.Add("LOWER FIVE EIGHTHS BLOCK", 9605); - _unicodeCharacterMap.Add("LOWER THREE QUARTERS BLOCK", 9606); - _unicodeCharacterMap.Add("LOWER SEVEN EIGHTHS BLOCK", 9607); - _unicodeCharacterMap.Add("FULL BLOCK", 9608); - _unicodeCharacterMap.Add("LEFT SEVEN EIGHTHS BLOCK", 9609); - _unicodeCharacterMap.Add("LEFT THREE QUARTERS BLOCK", 9610); - _unicodeCharacterMap.Add("LEFT FIVE EIGHTHS BLOCK", 9611); - _unicodeCharacterMap.Add("LEFT HALF BLOCK", 9612); - _unicodeCharacterMap.Add("LEFT THREE EIGHTHS BLOCK", 9613); - _unicodeCharacterMap.Add("LEFT ONE QUARTER BLOCK", 9614); - _unicodeCharacterMap.Add("LEFT ONE EIGHTH BLOCK", 9615); - _unicodeCharacterMap.Add("RIGHT HALF BLOCK", 9616); - _unicodeCharacterMap.Add("LIGHT SHADE", 9617); - _unicodeCharacterMap.Add("MEDIUM SHADE", 9618); - _unicodeCharacterMap.Add("DARK SHADE", 9619); - _unicodeCharacterMap.Add("UPPER ONE EIGHTH BLOCK", 9620); - _unicodeCharacterMap.Add("RIGHT ONE EIGHTH BLOCK", 9621); - _unicodeCharacterMap.Add("QUADRANT LOWER LEFT", 9622); - _unicodeCharacterMap.Add("QUADRANT LOWER RIGHT", 9623); - _unicodeCharacterMap.Add("QUADRANT UPPER LEFT", 9624); - _unicodeCharacterMap.Add("QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT", 9625); - _unicodeCharacterMap.Add("QUADRANT UPPER LEFT AND LOWER RIGHT", 9626); - _unicodeCharacterMap.Add("QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT", 9627); - _unicodeCharacterMap.Add("QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT", 9628); - _unicodeCharacterMap.Add("QUADRANT UPPER RIGHT", 9629); - _unicodeCharacterMap.Add("QUADRANT UPPER RIGHT AND LOWER LEFT", 9630); - _unicodeCharacterMap.Add("QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT", 9631); - _unicodeCharacterMap.Add("BLACK SQUARE", 9632); - _unicodeCharacterMap.Add("WHITE SQUARE", 9633); - _unicodeCharacterMap.Add("WHITE SQUARE WITH ROUNDED CORNERS", 9634); - _unicodeCharacterMap.Add("WHITE SQUARE CONTAINING BLACK SMALL SQUARE", 9635); - _unicodeCharacterMap.Add("SQUARE WITH HORIZONTAL FILL", 9636); - _unicodeCharacterMap.Add("SQUARE WITH VERTICAL FILL", 9637); - _unicodeCharacterMap.Add("SQUARE WITH ORTHOGONAL CROSSHATCH FILL", 9638); - _unicodeCharacterMap.Add("SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL", 9639); - _unicodeCharacterMap.Add("SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL", 9640); - _unicodeCharacterMap.Add("SQUARE WITH DIAGONAL CROSSHATCH FILL", 9641); - _unicodeCharacterMap.Add("BLACK SMALL SQUARE", 9642); - _unicodeCharacterMap.Add("WHITE SMALL SQUARE", 9643); - _unicodeCharacterMap.Add("BLACK RECTANGLE", 9644); - _unicodeCharacterMap.Add("WHITE RECTANGLE", 9645); - _unicodeCharacterMap.Add("BLACK VERTICAL RECTANGLE", 9646); - _unicodeCharacterMap.Add("WHITE VERTICAL RECTANGLE", 9647); - _unicodeCharacterMap.Add("BLACK PARALLELOGRAM", 9648); - _unicodeCharacterMap.Add("WHITE PARALLELOGRAM", 9649); - _unicodeCharacterMap.Add("BLACK UP POINTING TRIANGLE", 9650); - _unicodeCharacterMap.Add("WHITE UP POINTING TRIANGLE", 9651); - _unicodeCharacterMap.Add("BLACK UP POINTING SMALL TRIANGLE", 9652); - _unicodeCharacterMap.Add("WHITE UP POINTING SMALL TRIANGLE", 9653); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING TRIANGLE", 9654); - _unicodeCharacterMap.Add("WHITE RIGHT POINTING TRIANGLE", 9655); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING SMALL TRIANGLE", 9656); - _unicodeCharacterMap.Add("WHITE RIGHT POINTING SMALL TRIANGLE", 9657); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING POINTER", 9658); - _unicodeCharacterMap.Add("WHITE RIGHT POINTING POINTER", 9659); - _unicodeCharacterMap.Add("BLACK DOWN POINTING TRIANGLE", 9660); - _unicodeCharacterMap.Add("WHITE DOWN POINTING TRIANGLE", 9661); - _unicodeCharacterMap.Add("BLACK DOWN POINTING SMALL TRIANGLE", 9662); - _unicodeCharacterMap.Add("WHITE DOWN POINTING SMALL TRIANGLE", 9663); - _unicodeCharacterMap.Add("BLACK LEFT POINTING TRIANGLE", 9664); - _unicodeCharacterMap.Add("WHITE LEFT POINTING TRIANGLE", 9665); - _unicodeCharacterMap.Add("BLACK LEFT POINTING SMALL TRIANGLE", 9666); - _unicodeCharacterMap.Add("WHITE LEFT POINTING SMALL TRIANGLE", 9667); - _unicodeCharacterMap.Add("BLACK LEFT POINTING POINTER", 9668); - _unicodeCharacterMap.Add("WHITE LEFT POINTING POINTER", 9669); - _unicodeCharacterMap.Add("BLACK DIAMOND", 9670); - _unicodeCharacterMap.Add("WHITE DIAMOND", 9671); - _unicodeCharacterMap.Add("WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND", 9672); - _unicodeCharacterMap.Add("FISHEYE", 9673); - _unicodeCharacterMap.Add("LOZENGE", 9674); - _unicodeCharacterMap.Add("WHITE CIRCLE", 9675); - _unicodeCharacterMap.Add("DOTTED CIRCLE", 9676); - _unicodeCharacterMap.Add("CIRCLE WITH VERTICAL FILL", 9677); - _unicodeCharacterMap.Add("BULLSEYE", 9678); - _unicodeCharacterMap.Add("BLACK CIRCLE", 9679); - _unicodeCharacterMap.Add("CIRCLE WITH LEFT HALF BLACK", 9680); - _unicodeCharacterMap.Add("CIRCLE WITH RIGHT HALF BLACK", 9681); - _unicodeCharacterMap.Add("CIRCLE WITH LOWER HALF BLACK", 9682); - _unicodeCharacterMap.Add("CIRCLE WITH UPPER HALF BLACK", 9683); - _unicodeCharacterMap.Add("CIRCLE WITH UPPER RIGHT QUADRANT BLACK", 9684); - _unicodeCharacterMap.Add("CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK", 9685); - _unicodeCharacterMap.Add("LEFT HALF BLACK CIRCLE", 9686); - _unicodeCharacterMap.Add("RIGHT HALF BLACK CIRCLE", 9687); - _unicodeCharacterMap.Add("INVERSE BULLET", 9688); - _unicodeCharacterMap.Add("INVERSE WHITE CIRCLE", 9689); - _unicodeCharacterMap.Add("UPPER HALF INVERSE WHITE CIRCLE", 9690); - _unicodeCharacterMap.Add("LOWER HALF INVERSE WHITE CIRCLE", 9691); - _unicodeCharacterMap.Add("UPPER LEFT QUADRANT CIRCULAR ARC", 9692); - _unicodeCharacterMap.Add("UPPER RIGHT QUADRANT CIRCULAR ARC", 9693); - _unicodeCharacterMap.Add("LOWER RIGHT QUADRANT CIRCULAR ARC", 9694); - _unicodeCharacterMap.Add("LOWER LEFT QUADRANT CIRCULAR ARC", 9695); - _unicodeCharacterMap.Add("UPPER HALF CIRCLE", 9696); - _unicodeCharacterMap.Add("LOWER HALF CIRCLE", 9697); - _unicodeCharacterMap.Add("BLACK LOWER RIGHT TRIANGLE", 9698); - _unicodeCharacterMap.Add("BLACK LOWER LEFT TRIANGLE", 9699); - _unicodeCharacterMap.Add("BLACK UPPER LEFT TRIANGLE", 9700); - _unicodeCharacterMap.Add("BLACK UPPER RIGHT TRIANGLE", 9701); - _unicodeCharacterMap.Add("WHITE BULLET", 9702); - _unicodeCharacterMap.Add("SQUARE WITH LEFT HALF BLACK", 9703); - _unicodeCharacterMap.Add("SQUARE WITH RIGHT HALF BLACK", 9704); - _unicodeCharacterMap.Add("SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK", 9705); - _unicodeCharacterMap.Add("SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK", 9706); - _unicodeCharacterMap.Add("WHITE SQUARE WITH VERTICAL BISECTING LINE", 9707); - _unicodeCharacterMap.Add("WHITE UP POINTING TRIANGLE WITH DOT", 9708); - _unicodeCharacterMap.Add("UP POINTING TRIANGLE WITH LEFT HALF BLACK", 9709); - _unicodeCharacterMap.Add("UP POINTING TRIANGLE WITH RIGHT HALF BLACK", 9710); - _unicodeCharacterMap.Add("LARGE CIRCLE", 9711); - _unicodeCharacterMap.Add("WHITE SQUARE WITH UPPER LEFT QUADRANT", 9712); - _unicodeCharacterMap.Add("WHITE SQUARE WITH LOWER LEFT QUADRANT", 9713); - _unicodeCharacterMap.Add("WHITE SQUARE WITH LOWER RIGHT QUADRANT", 9714); - _unicodeCharacterMap.Add("WHITE SQUARE WITH UPPER RIGHT QUADRANT", 9715); - _unicodeCharacterMap.Add("WHITE CIRCLE WITH UPPER LEFT QUADRANT", 9716); - _unicodeCharacterMap.Add("WHITE CIRCLE WITH LOWER LEFT QUADRANT", 9717); - _unicodeCharacterMap.Add("WHITE CIRCLE WITH LOWER RIGHT QUADRANT", 9718); - _unicodeCharacterMap.Add("WHITE CIRCLE WITH UPPER RIGHT QUADRANT", 9719); - _unicodeCharacterMap.Add("UPPER LEFT TRIANGLE", 9720); - _unicodeCharacterMap.Add("UPPER RIGHT TRIANGLE", 9721); - _unicodeCharacterMap.Add("LOWER LEFT TRIANGLE", 9722); - _unicodeCharacterMap.Add("WHITE MEDIUM SQUARE", 9723); - _unicodeCharacterMap.Add("BLACK MEDIUM SQUARE", 9724); - _unicodeCharacterMap.Add("WHITE MEDIUM SMALL SQUARE", 9725); - _unicodeCharacterMap.Add("BLACK MEDIUM SMALL SQUARE", 9726); - _unicodeCharacterMap.Add("LOWER RIGHT TRIANGLE", 9727); - _unicodeCharacterMap.Add("BLACK SUN WITH RAYS", 9728); - _unicodeCharacterMap.Add("CLOUD", 9729); - _unicodeCharacterMap.Add("UMBRELLA", 9730); - _unicodeCharacterMap.Add("SNOWMAN", 9731); - _unicodeCharacterMap.Add("COMET", 9732); - _unicodeCharacterMap.Add("BLACK STAR", 9733); - _unicodeCharacterMap.Add("WHITE STAR", 9734); - _unicodeCharacterMap.Add("LIGHTNING", 9735); - _unicodeCharacterMap.Add("THUNDERSTORM", 9736); - _unicodeCharacterMap.Add("SUN", 9737); - _unicodeCharacterMap.Add("ASCENDING NODE", 9738); - _unicodeCharacterMap.Add("DESCENDING NODE", 9739); - _unicodeCharacterMap.Add("CONJUNCTION", 9740); - _unicodeCharacterMap.Add("OPPOSITION", 9741); - _unicodeCharacterMap.Add("BLACK TELEPHONE", 9742); - _unicodeCharacterMap.Add("WHITE TELEPHONE", 9743); - _unicodeCharacterMap.Add("BALLOT BOX", 9744); - _unicodeCharacterMap.Add("BALLOT BOX WITH CHECK", 9745); - _unicodeCharacterMap.Add("BALLOT BOX WITH X", 9746); - _unicodeCharacterMap.Add("SALTIRE", 9747); - _unicodeCharacterMap.Add("UMBRELLA WITH RAIN DROPS", 9748); - _unicodeCharacterMap.Add("HOT BEVERAGE", 9749); - _unicodeCharacterMap.Add("WHITE SHOGI PIECE", 9750); - _unicodeCharacterMap.Add("BLACK SHOGI PIECE", 9751); - _unicodeCharacterMap.Add("SHAMROCK", 9752); - _unicodeCharacterMap.Add("REVERSED ROTATED FLORAL HEART BULLET", 9753); - _unicodeCharacterMap.Add("BLACK LEFT POINTING INDEX", 9754); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING INDEX", 9755); - _unicodeCharacterMap.Add("WHITE LEFT POINTING INDEX", 9756); - _unicodeCharacterMap.Add("WHITE UP POINTING INDEX", 9757); - _unicodeCharacterMap.Add("WHITE RIGHT POINTING INDEX", 9758); - _unicodeCharacterMap.Add("WHITE DOWN POINTING INDEX", 9759); - _unicodeCharacterMap.Add("SKULL AND CROSSBONES", 9760); - _unicodeCharacterMap.Add("CAUTION SIGN", 9761); - _unicodeCharacterMap.Add("RADIOACTIVE SIGN", 9762); - _unicodeCharacterMap.Add("BIOHAZARD SIGN", 9763); - _unicodeCharacterMap.Add("CADUCEUS", 9764); - _unicodeCharacterMap.Add("ANKH", 9765); - _unicodeCharacterMap.Add("ORTHODOX CROSS", 9766); - _unicodeCharacterMap.Add("CHI RHO", 9767); - _unicodeCharacterMap.Add("CROSS OF LORRAINE", 9768); - _unicodeCharacterMap.Add("CROSS OF JERUSALEM", 9769); - _unicodeCharacterMap.Add("STAR AND CRESCENT", 9770); - _unicodeCharacterMap.Add("FARSI SYMBOL", 9771); - _unicodeCharacterMap.Add("ADI SHAKTI", 9772); - _unicodeCharacterMap.Add("HAMMER AND SICKLE", 9773); - _unicodeCharacterMap.Add("PEACE SYMBOL", 9774); - _unicodeCharacterMap.Add("YIN YANG", 9775); - _unicodeCharacterMap.Add("TRIGRAM FOR HEAVEN", 9776); - _unicodeCharacterMap.Add("TRIGRAM FOR LAKE", 9777); - _unicodeCharacterMap.Add("TRIGRAM FOR FIRE", 9778); - _unicodeCharacterMap.Add("TRIGRAM FOR THUNDER", 9779); - _unicodeCharacterMap.Add("TRIGRAM FOR WIND", 9780); - _unicodeCharacterMap.Add("TRIGRAM FOR WATER", 9781); - _unicodeCharacterMap.Add("TRIGRAM FOR MOUNTAIN", 9782); - _unicodeCharacterMap.Add("TRIGRAM FOR EARTH", 9783); - _unicodeCharacterMap.Add("WHEEL OF DHARMA", 9784); - _unicodeCharacterMap.Add("WHITE FROWNING FACE", 9785); - _unicodeCharacterMap.Add("WHITE SMILING FACE", 9786); - _unicodeCharacterMap.Add("BLACK SMILING FACE", 9787); - _unicodeCharacterMap.Add("WHITE SUN WITH RAYS", 9788); - _unicodeCharacterMap.Add("FIRST QUARTER MOON", 9789); - _unicodeCharacterMap.Add("LAST QUARTER MOON", 9790); - _unicodeCharacterMap.Add("MERCURY", 9791); - _unicodeCharacterMap.Add("FEMALE SIGN", 9792); - _unicodeCharacterMap.Add("EARTH", 9793); - _unicodeCharacterMap.Add("MALE SIGN", 9794); - _unicodeCharacterMap.Add("JUPITER", 9795); - _unicodeCharacterMap.Add("SATURN", 9796); - _unicodeCharacterMap.Add("URANUS", 9797); - _unicodeCharacterMap.Add("NEPTUNE", 9798); - _unicodeCharacterMap.Add("PLUTO", 9799); - _unicodeCharacterMap.Add("ARIES", 9800); - _unicodeCharacterMap.Add("TAURUS", 9801); - _unicodeCharacterMap.Add("GEMINI", 9802); - _unicodeCharacterMap.Add("CANCER", 9803); - _unicodeCharacterMap.Add("LEO", 9804); - _unicodeCharacterMap.Add("VIRGO", 9805); - _unicodeCharacterMap.Add("LIBRA", 9806); - _unicodeCharacterMap.Add("SCORPIUS", 9807); - _unicodeCharacterMap.Add("SAGITTARIUS", 9808); - _unicodeCharacterMap.Add("CAPRICORN", 9809); - _unicodeCharacterMap.Add("AQUARIUS", 9810); - _unicodeCharacterMap.Add("PISCES", 9811); - _unicodeCharacterMap.Add("WHITE CHESS KING", 9812); - _unicodeCharacterMap.Add("WHITE CHESS QUEEN", 9813); - _unicodeCharacterMap.Add("WHITE CHESS ROOK", 9814); - _unicodeCharacterMap.Add("WHITE CHESS BISHOP", 9815); - _unicodeCharacterMap.Add("WHITE CHESS KNIGHT", 9816); - _unicodeCharacterMap.Add("WHITE CHESS PAWN", 9817); - _unicodeCharacterMap.Add("BLACK CHESS KING", 9818); - _unicodeCharacterMap.Add("BLACK CHESS QUEEN", 9819); - _unicodeCharacterMap.Add("BLACK CHESS ROOK", 9820); - _unicodeCharacterMap.Add("BLACK CHESS BISHOP", 9821); - _unicodeCharacterMap.Add("BLACK CHESS KNIGHT", 9822); - _unicodeCharacterMap.Add("BLACK CHESS PAWN", 9823); - _unicodeCharacterMap.Add("BLACK SPADE SUIT", 9824); - _unicodeCharacterMap.Add("WHITE HEART SUIT", 9825); - _unicodeCharacterMap.Add("WHITE DIAMOND SUIT", 9826); - _unicodeCharacterMap.Add("BLACK CLUB SUIT", 9827); - _unicodeCharacterMap.Add("WHITE SPADE SUIT", 9828); - _unicodeCharacterMap.Add("BLACK HEART SUIT", 9829); - _unicodeCharacterMap.Add("BLACK DIAMOND SUIT", 9830); - _unicodeCharacterMap.Add("WHITE CLUB SUIT", 9831); - _unicodeCharacterMap.Add("HOT SPRINGS", 9832); - _unicodeCharacterMap.Add("QUARTER NOTE", 9833); - _unicodeCharacterMap.Add("EIGHTH NOTE", 9834); - _unicodeCharacterMap.Add("BEAMED EIGHTH NOTES", 9835); - _unicodeCharacterMap.Add("BEAMED SIXTEENTH NOTES", 9836); - _unicodeCharacterMap.Add("MUSIC FLAT SIGN", 9837); - _unicodeCharacterMap.Add("MUSIC NATURAL SIGN", 9838); - _unicodeCharacterMap.Add("MUSIC SHARP SIGN", 9839); - _unicodeCharacterMap.Add("WEST SYRIAC CROSS", 9840); - _unicodeCharacterMap.Add("EAST SYRIAC CROSS", 9841); - _unicodeCharacterMap.Add("UNIVERSAL RECYCLING SYMBOL", 9842); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR TYPE 1 PLASTICS", 9843); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR TYPE 2 PLASTICS", 9844); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR TYPE 3 PLASTICS", 9845); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR TYPE 4 PLASTICS", 9846); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR TYPE 5 PLASTICS", 9847); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR TYPE 6 PLASTICS", 9848); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR TYPE 7 PLASTICS", 9849); - _unicodeCharacterMap.Add("RECYCLING SYMBOL FOR GENERIC MATERIALS", 9850); - _unicodeCharacterMap.Add("BLACK UNIVERSAL RECYCLING SYMBOL", 9851); - _unicodeCharacterMap.Add("RECYCLED PAPER SYMBOL", 9852); - _unicodeCharacterMap.Add("PARTIALLY RECYCLED PAPER SYMBOL", 9853); - _unicodeCharacterMap.Add("PERMANENT PAPER SIGN", 9854); - _unicodeCharacterMap.Add("WHEELCHAIR SYMBOL", 9855); - _unicodeCharacterMap.Add("DIE FACE 1", 9856); - _unicodeCharacterMap.Add("DIE FACE 2", 9857); - _unicodeCharacterMap.Add("DIE FACE 3", 9858); - _unicodeCharacterMap.Add("DIE FACE 4", 9859); - _unicodeCharacterMap.Add("DIE FACE 5", 9860); - _unicodeCharacterMap.Add("DIE FACE 6", 9861); - _unicodeCharacterMap.Add("WHITE CIRCLE WITH DOT RIGHT", 9862); - _unicodeCharacterMap.Add("WHITE CIRCLE WITH TWO DOTS", 9863); - _unicodeCharacterMap.Add("BLACK CIRCLE WITH WHITE DOT RIGHT", 9864); - _unicodeCharacterMap.Add("BLACK CIRCLE WITH TWO WHITE DOTS", 9865); - _unicodeCharacterMap.Add("MONOGRAM FOR YANG", 9866); - _unicodeCharacterMap.Add("MONOGRAM FOR YIN", 9867); - _unicodeCharacterMap.Add("DIGRAM FOR GREATER YANG", 9868); - _unicodeCharacterMap.Add("DIGRAM FOR LESSER YIN", 9869); - _unicodeCharacterMap.Add("DIGRAM FOR LESSER YANG", 9870); - _unicodeCharacterMap.Add("DIGRAM FOR GREATER YIN", 9871); - _unicodeCharacterMap.Add("WHITE FLAG", 9872); - _unicodeCharacterMap.Add("BLACK FLAG", 9873); - _unicodeCharacterMap.Add("HAMMER AND PICK", 9874); - _unicodeCharacterMap.Add("ANCHOR", 9875); - _unicodeCharacterMap.Add("CROSSED SWORDS", 9876); - _unicodeCharacterMap.Add("STAFF OF AESCULAPIUS", 9877); - _unicodeCharacterMap.Add("SCALES", 9878); - _unicodeCharacterMap.Add("ALEMBIC", 9879); - _unicodeCharacterMap.Add("FLOWER", 9880); - _unicodeCharacterMap.Add("GEAR", 9881); - _unicodeCharacterMap.Add("STAFF OF HERMES", 9882); - _unicodeCharacterMap.Add("ATOM SYMBOL", 9883); - _unicodeCharacterMap.Add("FLEUR DE LIS", 9884); - _unicodeCharacterMap.Add("OUTLINED WHITE STAR", 9885); - _unicodeCharacterMap.Add("THREE LINES CONVERGING RIGHT", 9886); - _unicodeCharacterMap.Add("THREE LINES CONVERGING LEFT", 9887); - _unicodeCharacterMap.Add("WARNING SIGN", 9888); - _unicodeCharacterMap.Add("HIGH VOLTAGE SIGN", 9889); - _unicodeCharacterMap.Add("DOUBLED FEMALE SIGN", 9890); - _unicodeCharacterMap.Add("DOUBLED MALE SIGN", 9891); - _unicodeCharacterMap.Add("INTERLOCKED FEMALE AND MALE SIGN", 9892); - _unicodeCharacterMap.Add("MALE AND FEMALE SIGN", 9893); - _unicodeCharacterMap.Add("MALE WITH STROKE SIGN", 9894); - _unicodeCharacterMap.Add("MALE WITH STROKE AND MALE AND FEMALE SIGN", 9895); - _unicodeCharacterMap.Add("VERTICAL MALE WITH STROKE SIGN", 9896); - _unicodeCharacterMap.Add("HORIZONTAL MALE WITH STROKE SIGN", 9897); - _unicodeCharacterMap.Add("MEDIUM WHITE CIRCLE", 9898); - _unicodeCharacterMap.Add("MEDIUM BLACK CIRCLE", 9899); - _unicodeCharacterMap.Add("MEDIUM SMALL WHITE CIRCLE", 9900); - _unicodeCharacterMap.Add("MARRIAGE SYMBOL", 9901); - _unicodeCharacterMap.Add("DIVORCE SYMBOL", 9902); - _unicodeCharacterMap.Add("UNMARRIED PARTNERSHIP SYMBOL", 9903); - _unicodeCharacterMap.Add("COFFIN", 9904); - _unicodeCharacterMap.Add("FUNERAL URN", 9905); - _unicodeCharacterMap.Add("NEUTER", 9906); - _unicodeCharacterMap.Add("CERES", 9907); - _unicodeCharacterMap.Add("PALLAS", 9908); - _unicodeCharacterMap.Add("JUNO", 9909); - _unicodeCharacterMap.Add("VESTA", 9910); - _unicodeCharacterMap.Add("CHIRON", 9911); - _unicodeCharacterMap.Add("BLACK MOON LILITH", 9912); - _unicodeCharacterMap.Add("SEXTILE", 9913); - _unicodeCharacterMap.Add("SEMISEXTILE", 9914); - _unicodeCharacterMap.Add("QUINCUNX", 9915); - _unicodeCharacterMap.Add("SESQUIQUADRATE", 9916); - _unicodeCharacterMap.Add("SOCCER BALL", 9917); - _unicodeCharacterMap.Add("BASEBALL", 9918); - _unicodeCharacterMap.Add("SQUARED KEY", 9919); - _unicodeCharacterMap.Add("WHITE DRAUGHTS MAN", 9920); - _unicodeCharacterMap.Add("WHITE DRAUGHTS KING", 9921); - _unicodeCharacterMap.Add("BLACK DRAUGHTS MAN", 9922); - _unicodeCharacterMap.Add("BLACK DRAUGHTS KING", 9923); - _unicodeCharacterMap.Add("SNOWMAN WITHOUT SNOW", 9924); - _unicodeCharacterMap.Add("SUN BEHIND CLOUD", 9925); - _unicodeCharacterMap.Add("RAIN", 9926); - _unicodeCharacterMap.Add("BLACK SNOWMAN", 9927); - _unicodeCharacterMap.Add("THUNDER CLOUD AND RAIN", 9928); - _unicodeCharacterMap.Add("TURNED WHITE SHOGI PIECE", 9929); - _unicodeCharacterMap.Add("TURNED BLACK SHOGI PIECE", 9930); - _unicodeCharacterMap.Add("WHITE DIAMOND IN SQUARE", 9931); - _unicodeCharacterMap.Add("CROSSING LANES", 9932); - _unicodeCharacterMap.Add("DISABLED CAR", 9933); - _unicodeCharacterMap.Add("OPHIUCHUS", 9934); - _unicodeCharacterMap.Add("PICK", 9935); - _unicodeCharacterMap.Add("CAR SLIDING", 9936); - _unicodeCharacterMap.Add("HELMET WITH WHITE CROSS", 9937); - _unicodeCharacterMap.Add("CIRCLED CROSSING LANES", 9938); - _unicodeCharacterMap.Add("CHAINS", 9939); - _unicodeCharacterMap.Add("NO ENTRY", 9940); - _unicodeCharacterMap.Add("ALTERNATE ONE WAY LEFT WAY TRAFFIC", 9941); - _unicodeCharacterMap.Add("BLACK TWO WAY LEFT WAY TRAFFIC", 9942); - _unicodeCharacterMap.Add("WHITE TWO WAY LEFT WAY TRAFFIC", 9943); - _unicodeCharacterMap.Add("BLACK LEFT LANE MERGE", 9944); - _unicodeCharacterMap.Add("WHITE LEFT LANE MERGE", 9945); - _unicodeCharacterMap.Add("DRIVE SLOW SIGN", 9946); - _unicodeCharacterMap.Add("HEAVY WHITE DOWN POINTING TRIANGLE", 9947); - _unicodeCharacterMap.Add("LEFT CLOSED ENTRY", 9948); - _unicodeCharacterMap.Add("SQUARED SALTIRE", 9949); - _unicodeCharacterMap.Add("FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE", 9950); - _unicodeCharacterMap.Add("BLACK TRUCK", 9951); - _unicodeCharacterMap.Add("RESTRICTED LEFT ENTRY 1", 9952); - _unicodeCharacterMap.Add("RESTRICTED LEFT ENTRY 2", 9953); - _unicodeCharacterMap.Add("ASTRONOMICAL SYMBOL FOR URANUS", 9954); - _unicodeCharacterMap.Add("HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE", 9955); - _unicodeCharacterMap.Add("PENTAGRAM", 9956); - _unicodeCharacterMap.Add("RIGHT HANDED INTERLACED PENTAGRAM", 9957); - _unicodeCharacterMap.Add("LEFT HANDED INTERLACED PENTAGRAM", 9958); - _unicodeCharacterMap.Add("INVERTED PENTAGRAM", 9959); - _unicodeCharacterMap.Add("BLACK CROSS ON SHIELD", 9960); - _unicodeCharacterMap.Add("SHINTO SHRINE", 9961); - _unicodeCharacterMap.Add("CHURCH", 9962); - _unicodeCharacterMap.Add("CASTLE", 9963); - _unicodeCharacterMap.Add("HISTORIC SITE", 9964); - _unicodeCharacterMap.Add("GEAR WITHOUT HUB", 9965); - _unicodeCharacterMap.Add("GEAR WITH HANDLES", 9966); - _unicodeCharacterMap.Add("MAP SYMBOL FOR LIGHTHOUSE", 9967); - _unicodeCharacterMap.Add("MOUNTAIN", 9968); - _unicodeCharacterMap.Add("UMBRELLA ON GROUND", 9969); - _unicodeCharacterMap.Add("FOUNTAIN", 9970); - _unicodeCharacterMap.Add("FLAG IN HOLE", 9971); - _unicodeCharacterMap.Add("FERRY", 9972); - _unicodeCharacterMap.Add("SAILBOAT", 9973); - _unicodeCharacterMap.Add("SQUARE FOUR CORNERS", 9974); - _unicodeCharacterMap.Add("SKIER", 9975); - _unicodeCharacterMap.Add("ICE SKATE", 9976); - _unicodeCharacterMap.Add("PERSON WITH BALL", 9977); - _unicodeCharacterMap.Add("TENT", 9978); - _unicodeCharacterMap.Add("JAPANESE BANK SYMBOL", 9979); - _unicodeCharacterMap.Add("HEADSTONE GRAVEYARD SYMBOL", 9980); - _unicodeCharacterMap.Add("FUEL PUMP", 9981); - _unicodeCharacterMap.Add("CUP ON BLACK SQUARE", 9982); - _unicodeCharacterMap.Add("WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE", 9983); - _unicodeCharacterMap.Add("BLACK SAFETY SCISSORS", 9984); - _unicodeCharacterMap.Add("UPPER BLADE SCISSORS", 9985); - _unicodeCharacterMap.Add("BLACK SCISSORS", 9986); - _unicodeCharacterMap.Add("LOWER BLADE SCISSORS", 9987); - _unicodeCharacterMap.Add("WHITE SCISSORS", 9988); - _unicodeCharacterMap.Add("WHITE HEAVY CHECK MARK", 9989); - _unicodeCharacterMap.Add("TELEPHONE LOCATION SIGN", 9990); - _unicodeCharacterMap.Add("TAPE DRIVE", 9991); - _unicodeCharacterMap.Add("AIRPLANE", 9992); - _unicodeCharacterMap.Add("ENVELOPE", 9993); - _unicodeCharacterMap.Add("RAISED FIST", 9994); - _unicodeCharacterMap.Add("RAISED HAND", 9995); - _unicodeCharacterMap.Add("VICTORY HAND", 9996); - _unicodeCharacterMap.Add("WRITING HAND", 9997); - _unicodeCharacterMap.Add("LOWER RIGHT PENCIL", 9998); - _unicodeCharacterMap.Add("PENCIL", 9999); - _unicodeCharacterMap.Add("UPPER RIGHT PENCIL", 10000); - _unicodeCharacterMap.Add("WHITE NIB", 10001); - _unicodeCharacterMap.Add("BLACK NIB", 10002); - _unicodeCharacterMap.Add("CHECK MARK", 10003); - _unicodeCharacterMap.Add("HEAVY CHECK MARK", 10004); - _unicodeCharacterMap.Add("MULTIPLICATION X", 10005); - _unicodeCharacterMap.Add("HEAVY MULTIPLICATION X", 10006); - _unicodeCharacterMap.Add("BALLOT X", 10007); - _unicodeCharacterMap.Add("HEAVY BALLOT X", 10008); - _unicodeCharacterMap.Add("OUTLINED GREEK CROSS", 10009); - _unicodeCharacterMap.Add("HEAVY GREEK CROSS", 10010); - _unicodeCharacterMap.Add("OPEN CENTRE CROSS", 10011); - _unicodeCharacterMap.Add("HEAVY OPEN CENTRE CROSS", 10012); - _unicodeCharacterMap.Add("LATIN CROSS", 10013); - _unicodeCharacterMap.Add("SHADOWED WHITE LATIN CROSS", 10014); - _unicodeCharacterMap.Add("OUTLINED LATIN CROSS", 10015); - _unicodeCharacterMap.Add("MALTESE CROSS", 10016); - _unicodeCharacterMap.Add("STAR OF DAVID", 10017); - _unicodeCharacterMap.Add("FOUR TEARDROP SPOKED ASTERISK", 10018); - _unicodeCharacterMap.Add("FOUR BALLOON SPOKED ASTERISK", 10019); - _unicodeCharacterMap.Add("HEAVY FOUR BALLOON SPOKED ASTERISK", 10020); - _unicodeCharacterMap.Add("FOUR CLUB SPOKED ASTERISK", 10021); - _unicodeCharacterMap.Add("BLACK FOUR POINTED STAR", 10022); - _unicodeCharacterMap.Add("WHITE FOUR POINTED STAR", 10023); - _unicodeCharacterMap.Add("SPARKLES", 10024); - _unicodeCharacterMap.Add("STRESS OUTLINED WHITE STAR", 10025); - _unicodeCharacterMap.Add("CIRCLED WHITE STAR", 10026); - _unicodeCharacterMap.Add("OPEN CENTRE BLACK STAR", 10027); - _unicodeCharacterMap.Add("BLACK CENTRE WHITE STAR", 10028); - _unicodeCharacterMap.Add("OUTLINED BLACK STAR", 10029); - _unicodeCharacterMap.Add("HEAVY OUTLINED BLACK STAR", 10030); - _unicodeCharacterMap.Add("PINWHEEL STAR", 10031); - _unicodeCharacterMap.Add("SHADOWED WHITE STAR", 10032); - _unicodeCharacterMap.Add("HEAVY ASTERISK", 10033); - _unicodeCharacterMap.Add("OPEN CENTRE ASTERISK", 10034); - _unicodeCharacterMap.Add("EIGHT SPOKED ASTERISK", 10035); - _unicodeCharacterMap.Add("EIGHT POINTED BLACK STAR", 10036); - _unicodeCharacterMap.Add("EIGHT POINTED PINWHEEL STAR", 10037); - _unicodeCharacterMap.Add("SIX POINTED BLACK STAR", 10038); - _unicodeCharacterMap.Add("EIGHT POINTED RECTILINEAR BLACK STAR", 10039); - _unicodeCharacterMap.Add("HEAVY EIGHT POINTED RECTILINEAR BLACK STAR", 10040); - _unicodeCharacterMap.Add("TWELVE POINTED BLACK STAR", 10041); - _unicodeCharacterMap.Add("SIXTEEN POINTED ASTERISK", 10042); - _unicodeCharacterMap.Add("TEARDROP SPOKED ASTERISK", 10043); - _unicodeCharacterMap.Add("OPEN CENTRE TEARDROP SPOKED ASTERISK", 10044); - _unicodeCharacterMap.Add("HEAVY TEARDROP SPOKED ASTERISK", 10045); - _unicodeCharacterMap.Add("SIX PETALLED BLACK AND WHITE FLORETTE", 10046); - _unicodeCharacterMap.Add("BLACK FLORETTE", 10047); - _unicodeCharacterMap.Add("WHITE FLORETTE", 10048); - _unicodeCharacterMap.Add("EIGHT PETALLED OUTLINED BLACK FLORETTE", 10049); - _unicodeCharacterMap.Add("CIRCLED OPEN CENTRE EIGHT POINTED STAR", 10050); - _unicodeCharacterMap.Add("HEAVY TEARDROP SPOKED PINWHEEL ASTERISK", 10051); - _unicodeCharacterMap.Add("SNOWFLAKE", 10052); - _unicodeCharacterMap.Add("TIGHT TRIFOLIATE SNOWFLAKE", 10053); - _unicodeCharacterMap.Add("HEAVY CHEVRON SNOWFLAKE", 10054); - _unicodeCharacterMap.Add("SPARKLE", 10055); - _unicodeCharacterMap.Add("HEAVY SPARKLE", 10056); - _unicodeCharacterMap.Add("BALLOON SPOKED ASTERISK", 10057); - _unicodeCharacterMap.Add("EIGHT TEARDROP SPOKED PROPELLER ASTERISK", 10058); - _unicodeCharacterMap.Add("HEAVY EIGHT TEARDROP SPOKED PROPELLER ASTERISK", 10059); - _unicodeCharacterMap.Add("CROSS MARK", 10060); - _unicodeCharacterMap.Add("SHADOWED WHITE CIRCLE", 10061); - _unicodeCharacterMap.Add("NEGATIVE SQUARED CROSS MARK", 10062); - _unicodeCharacterMap.Add("LOWER RIGHT DROP SHADOWED WHITE SQUARE", 10063); - _unicodeCharacterMap.Add("UPPER RIGHT DROP SHADOWED WHITE SQUARE", 10064); - _unicodeCharacterMap.Add("LOWER RIGHT SHADOWED WHITE SQUARE", 10065); - _unicodeCharacterMap.Add("UPPER RIGHT SHADOWED WHITE SQUARE", 10066); - _unicodeCharacterMap.Add("BLACK QUESTION MARK ORNAMENT", 10067); - _unicodeCharacterMap.Add("WHITE QUESTION MARK ORNAMENT", 10068); - _unicodeCharacterMap.Add("WHITE EXCLAMATION MARK ORNAMENT", 10069); - _unicodeCharacterMap.Add("BLACK DIAMOND MINUS WHITE X", 10070); - _unicodeCharacterMap.Add("HEAVY EXCLAMATION MARK SYMBOL", 10071); - _unicodeCharacterMap.Add("LIGHT VERTICAL BAR", 10072); - _unicodeCharacterMap.Add("MEDIUM VERTICAL BAR", 10073); - _unicodeCharacterMap.Add("HEAVY VERTICAL BAR", 10074); - _unicodeCharacterMap.Add("HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT", 10075); - _unicodeCharacterMap.Add("HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT", 10076); - _unicodeCharacterMap.Add("HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT", 10077); - _unicodeCharacterMap.Add("HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT", 10078); - _unicodeCharacterMap.Add("HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT", 10079); - _unicodeCharacterMap.Add("HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT", 10080); - _unicodeCharacterMap.Add("CURVED STEM PARAGRAPH SIGN ORNAMENT", 10081); - _unicodeCharacterMap.Add("HEAVY EXCLAMATION MARK ORNAMENT", 10082); - _unicodeCharacterMap.Add("HEAVY HEART EXCLAMATION MARK ORNAMENT", 10083); - _unicodeCharacterMap.Add("HEAVY BLACK HEART", 10084); - _unicodeCharacterMap.Add("ROTATED HEAVY BLACK HEART BULLET", 10085); - _unicodeCharacterMap.Add("FLORAL HEART", 10086); - _unicodeCharacterMap.Add("ROTATED FLORAL HEART BULLET", 10087); - _unicodeCharacterMap.Add("MEDIUM LEFT PARENTHESIS ORNAMENT", 10088); - _unicodeCharacterMap.Add("MEDIUM RIGHT PARENTHESIS ORNAMENT", 10089); - _unicodeCharacterMap.Add("MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT", 10090); - _unicodeCharacterMap.Add("MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT", 10091); - _unicodeCharacterMap.Add("MEDIUM LEFT POINTING ANGLE BRACKET ORNAMENT", 10092); - _unicodeCharacterMap.Add("MEDIUM RIGHT POINTING ANGLE BRACKET ORNAMENT", 10093); - _unicodeCharacterMap.Add("HEAVY LEFT POINTING ANGLE QUOTATION MARK ORNAMENT", 10094); - _unicodeCharacterMap.Add("HEAVY RIGHT POINTING ANGLE QUOTATION MARK ORNAMENT", 10095); - _unicodeCharacterMap.Add("HEAVY LEFT POINTING ANGLE BRACKET ORNAMENT", 10096); - _unicodeCharacterMap.Add("HEAVY RIGHT POINTING ANGLE BRACKET ORNAMENT", 10097); - _unicodeCharacterMap.Add("LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT", 10098); - _unicodeCharacterMap.Add("LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT", 10099); - _unicodeCharacterMap.Add("MEDIUM LEFT CURLY BRACKET ORNAMENT", 10100); - _unicodeCharacterMap.Add("MEDIUM RIGHT CURLY BRACKET ORNAMENT", 10101); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT ONE", 10102); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT TWO", 10103); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT THREE", 10104); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT FOUR", 10105); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT FIVE", 10106); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT SIX", 10107); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT SEVEN", 10108); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT EIGHT", 10109); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED DIGIT NINE", 10110); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED NUMBER TEN", 10111); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT ONE", 10112); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT TWO", 10113); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT THREE", 10114); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT FOUR", 10115); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT FIVE", 10116); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT SIX", 10117); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT SEVEN", 10118); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT EIGHT", 10119); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT NINE", 10120); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF NUMBER TEN", 10121); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT ONE", 10122); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT TWO", 10123); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT THREE", 10124); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT FOUR", 10125); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT FIVE", 10126); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT SIX", 10127); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT SEVEN", 10128); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT EIGHT", 10129); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT NINE", 10130); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF NUMBER TEN", 10131); - _unicodeCharacterMap.Add("HEAVY WIDE HEADED RIGHTWARDS ARROW", 10132); - _unicodeCharacterMap.Add("HEAVY PLUS SIGN", 10133); - _unicodeCharacterMap.Add("HEAVY MINUS SIGN", 10134); - _unicodeCharacterMap.Add("HEAVY DIVISION SIGN", 10135); - _unicodeCharacterMap.Add("HEAVY SOUTH EAST ARROW", 10136); - _unicodeCharacterMap.Add("HEAVY RIGHTWARDS ARROW", 10137); - _unicodeCharacterMap.Add("HEAVY NORTH EAST ARROW", 10138); - _unicodeCharacterMap.Add("DRAFTING POINT RIGHTWARDS ARROW", 10139); - _unicodeCharacterMap.Add("HEAVY ROUND TIPPED RIGHTWARDS ARROW", 10140); - _unicodeCharacterMap.Add("TRIANGLE HEADED RIGHTWARDS ARROW", 10141); - _unicodeCharacterMap.Add("HEAVY TRIANGLE HEADED RIGHTWARDS ARROW", 10142); - _unicodeCharacterMap.Add("DASHED TRIANGLE HEADED RIGHTWARDS ARROW", 10143); - _unicodeCharacterMap.Add("HEAVY DASHED TRIANGLE HEADED RIGHTWARDS ARROW", 10144); - _unicodeCharacterMap.Add("BLACK RIGHTWARDS ARROW", 10145); - _unicodeCharacterMap.Add("THREE D TOP LIGHTED RIGHTWARDS ARROWHEAD", 10146); - _unicodeCharacterMap.Add("THREE D BOTTOM LIGHTED RIGHTWARDS ARROWHEAD", 10147); - _unicodeCharacterMap.Add("BLACK RIGHTWARDS ARROWHEAD", 10148); - _unicodeCharacterMap.Add("HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW", 10149); - _unicodeCharacterMap.Add("HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW", 10150); - _unicodeCharacterMap.Add("SQUAT BLACK RIGHTWARDS ARROW", 10151); - _unicodeCharacterMap.Add("HEAVY CONCAVE POINTED BLACK RIGHTWARDS ARROW", 10152); - _unicodeCharacterMap.Add("RIGHT SHADED WHITE RIGHTWARDS ARROW", 10153); - _unicodeCharacterMap.Add("LEFT SHADED WHITE RIGHTWARDS ARROW", 10154); - _unicodeCharacterMap.Add("BACK TILTED SHADOWED WHITE RIGHTWARDS ARROW", 10155); - _unicodeCharacterMap.Add("FRONT TILTED SHADOWED WHITE RIGHTWARDS ARROW", 10156); - _unicodeCharacterMap.Add("HEAVY LOWER RIGHT SHADOWED WHITE RIGHTWARDS ARROW", 10157); - _unicodeCharacterMap.Add("HEAVY UPPER RIGHT SHADOWED WHITE RIGHTWARDS ARROW", 10158); - _unicodeCharacterMap.Add("NOTCHED LOWER RIGHT SHADOWED WHITE RIGHTWARDS ARROW", 10159); - _unicodeCharacterMap.Add("CURLY LOOP", 10160); - _unicodeCharacterMap.Add("NOTCHED UPPER RIGHT SHADOWED WHITE RIGHTWARDS ARROW", 10161); - _unicodeCharacterMap.Add("CIRCLED HEAVY WHITE RIGHTWARDS ARROW", 10162); - _unicodeCharacterMap.Add("WHITE FEATHERED RIGHTWARDS ARROW", 10163); - _unicodeCharacterMap.Add("BLACK FEATHERED SOUTH EAST ARROW", 10164); - _unicodeCharacterMap.Add("BLACK FEATHERED RIGHTWARDS ARROW", 10165); - _unicodeCharacterMap.Add("BLACK FEATHERED NORTH EAST ARROW", 10166); - _unicodeCharacterMap.Add("HEAVY BLACK FEATHERED SOUTH EAST ARROW", 10167); - _unicodeCharacterMap.Add("HEAVY BLACK FEATHERED RIGHTWARDS ARROW", 10168); - _unicodeCharacterMap.Add("HEAVY BLACK FEATHERED NORTH EAST ARROW", 10169); - _unicodeCharacterMap.Add("TEARDROP BARBED RIGHTWARDS ARROW", 10170); - _unicodeCharacterMap.Add("HEAVY TEARDROP SHANKED RIGHTWARDS ARROW", 10171); - _unicodeCharacterMap.Add("WEDGE TAILED RIGHTWARDS ARROW", 10172); - _unicodeCharacterMap.Add("HEAVY WEDGE TAILED RIGHTWARDS ARROW", 10173); - _unicodeCharacterMap.Add("OPEN OUTLINED RIGHTWARDS ARROW", 10174); - _unicodeCharacterMap.Add("DOUBLE CURLY LOOP", 10175); - _unicodeCharacterMap.Add("THREE DIMENSIONAL ANGLE", 10176); - _unicodeCharacterMap.Add("WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE", 10177); - _unicodeCharacterMap.Add("PERPENDICULAR", 10178); - _unicodeCharacterMap.Add("OPEN SUBSET", 10179); - _unicodeCharacterMap.Add("OPEN SUPERSET", 10180); - _unicodeCharacterMap.Add("LEFT S SHAPED BAG DELIMITER", 10181); - _unicodeCharacterMap.Add("RIGHT S SHAPED BAG DELIMITER", 10182); - _unicodeCharacterMap.Add("OR WITH DOT INSIDE", 10183); - _unicodeCharacterMap.Add("REVERSE SOLIDUS PRECEDING SUBSET", 10184); - _unicodeCharacterMap.Add("SUPERSET PRECEDING SOLIDUS", 10185); - _unicodeCharacterMap.Add("VERTICAL BAR WITH HORIZONTAL STROKE", 10186); - _unicodeCharacterMap.Add("MATHEMATICAL RISING DIAGONAL", 10187); - _unicodeCharacterMap.Add("LONG DIVISION", 10188); - _unicodeCharacterMap.Add("MATHEMATICAL FALLING DIAGONAL", 10189); - _unicodeCharacterMap.Add("SQUARED LOGICAL AND", 10190); - _unicodeCharacterMap.Add("SQUARED LOGICAL OR", 10191); - _unicodeCharacterMap.Add("WHITE DIAMOND WITH CENTRED DOT", 10192); - _unicodeCharacterMap.Add("AND WITH DOT", 10193); - _unicodeCharacterMap.Add("ELEMENT OF OPENING UPWARDS", 10194); - _unicodeCharacterMap.Add("LOWER RIGHT CORNER WITH DOT", 10195); - _unicodeCharacterMap.Add("UPPER LEFT CORNER WITH DOT", 10196); - _unicodeCharacterMap.Add("LEFT OUTER JOIN", 10197); - _unicodeCharacterMap.Add("RIGHT OUTER JOIN", 10198); - _unicodeCharacterMap.Add("FULL OUTER JOIN", 10199); - _unicodeCharacterMap.Add("LARGE UP TACK", 10200); - _unicodeCharacterMap.Add("LARGE DOWN TACK", 10201); - _unicodeCharacterMap.Add("LEFT AND RIGHT DOUBLE TURNSTILE", 10202); - _unicodeCharacterMap.Add("LEFT AND RIGHT TACK", 10203); - _unicodeCharacterMap.Add("LEFT MULTIMAP", 10204); - _unicodeCharacterMap.Add("LONG RIGHT TACK", 10205); - _unicodeCharacterMap.Add("LONG LEFT TACK", 10206); - _unicodeCharacterMap.Add("UP TACK WITH CIRCLE ABOVE", 10207); - _unicodeCharacterMap.Add("LOZENGE DIVIDED BY HORIZONTAL RULE", 10208); - _unicodeCharacterMap.Add("WHITE CONCAVE SIDED DIAMOND", 10209); - _unicodeCharacterMap.Add("WHITE CONCAVE SIDED DIAMOND WITH LEFTWARDS TICK", 10210); - _unicodeCharacterMap.Add("WHITE CONCAVE SIDED DIAMOND WITH RIGHTWARDS TICK", 10211); - _unicodeCharacterMap.Add("WHITE SQUARE WITH LEFTWARDS TICK", 10212); - _unicodeCharacterMap.Add("WHITE SQUARE WITH RIGHTWARDS TICK", 10213); - _unicodeCharacterMap.Add("MATHEMATICAL LEFT WHITE SQUARE BRACKET", 10214); - _unicodeCharacterMap.Add("MATHEMATICAL RIGHT WHITE SQUARE BRACKET", 10215); - _unicodeCharacterMap.Add("MATHEMATICAL LEFT ANGLE BRACKET", 10216); - _unicodeCharacterMap.Add("MATHEMATICAL RIGHT ANGLE BRACKET", 10217); - _unicodeCharacterMap.Add("MATHEMATICAL LEFT DOUBLE ANGLE BRACKET", 10218); - _unicodeCharacterMap.Add("MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET", 10219); - _unicodeCharacterMap.Add("MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET", 10220); - _unicodeCharacterMap.Add("MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET", 10221); - _unicodeCharacterMap.Add("MATHEMATICAL LEFT FLATTENED PARENTHESIS", 10222); - _unicodeCharacterMap.Add("MATHEMATICAL RIGHT FLATTENED PARENTHESIS", 10223); - _unicodeCharacterMap.Add("UPWARDS QUADRUPLE ARROW", 10224); - _unicodeCharacterMap.Add("DOWNWARDS QUADRUPLE ARROW", 10225); - _unicodeCharacterMap.Add("ANTICLOCKWISE GAPPED CIRCLE ARROW", 10226); - _unicodeCharacterMap.Add("CLOCKWISE GAPPED CIRCLE ARROW", 10227); - _unicodeCharacterMap.Add("RIGHT ARROW WITH CIRCLED PLUS", 10228); - _unicodeCharacterMap.Add("LONG LEFTWARDS ARROW", 10229); - _unicodeCharacterMap.Add("LONG RIGHTWARDS ARROW", 10230); - _unicodeCharacterMap.Add("LONG LEFT RIGHT ARROW", 10231); - _unicodeCharacterMap.Add("LONG LEFTWARDS DOUBLE ARROW", 10232); - _unicodeCharacterMap.Add("LONG RIGHTWARDS DOUBLE ARROW", 10233); - _unicodeCharacterMap.Add("LONG LEFT RIGHT DOUBLE ARROW", 10234); - _unicodeCharacterMap.Add("LONG LEFTWARDS ARROW FROM BAR", 10235); - _unicodeCharacterMap.Add("LONG RIGHTWARDS ARROW FROM BAR", 10236); - _unicodeCharacterMap.Add("LONG LEFTWARDS DOUBLE ARROW FROM BAR", 10237); - _unicodeCharacterMap.Add("LONG RIGHTWARDS DOUBLE ARROW FROM BAR", 10238); - _unicodeCharacterMap.Add("LONG RIGHTWARDS SQUIGGLE ARROW", 10239); - _unicodeCharacterMap.Add("BRAILLE PATTERN BLANK", 10240); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1", 10241); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2", 10242); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12", 10243); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3", 10244); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13", 10245); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23", 10246); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123", 10247); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 4", 10248); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 14", 10249); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 24", 10250); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 124", 10251); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 34", 10252); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 134", 10253); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 234", 10254); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1234", 10255); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 5", 10256); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 15", 10257); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 25", 10258); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 125", 10259); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 35", 10260); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 135", 10261); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 235", 10262); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1235", 10263); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 45", 10264); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 145", 10265); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 245", 10266); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1245", 10267); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 345", 10268); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1345", 10269); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2345", 10270); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12345", 10271); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 6", 10272); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 16", 10273); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 26", 10274); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 126", 10275); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 36", 10276); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 136", 10277); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 236", 10278); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1236", 10279); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 46", 10280); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 146", 10281); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 246", 10282); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1246", 10283); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 346", 10284); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1346", 10285); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2346", 10286); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12346", 10287); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 56", 10288); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 156", 10289); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 256", 10290); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1256", 10291); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 356", 10292); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1356", 10293); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2356", 10294); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12356", 10295); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 456", 10296); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1456", 10297); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2456", 10298); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12456", 10299); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3456", 10300); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13456", 10301); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23456", 10302); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123456", 10303); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 7", 10304); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 17", 10305); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 27", 10306); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 127", 10307); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 37", 10308); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 137", 10309); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 237", 10310); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1237", 10311); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 47", 10312); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 147", 10313); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 247", 10314); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1247", 10315); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 347", 10316); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1347", 10317); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2347", 10318); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12347", 10319); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 57", 10320); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 157", 10321); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 257", 10322); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1257", 10323); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 357", 10324); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1357", 10325); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2357", 10326); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12357", 10327); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 457", 10328); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1457", 10329); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2457", 10330); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12457", 10331); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3457", 10332); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13457", 10333); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23457", 10334); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123457", 10335); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 67", 10336); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 167", 10337); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 267", 10338); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1267", 10339); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 367", 10340); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1367", 10341); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2367", 10342); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12367", 10343); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 467", 10344); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1467", 10345); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2467", 10346); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12467", 10347); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3467", 10348); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13467", 10349); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23467", 10350); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123467", 10351); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 567", 10352); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1567", 10353); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2567", 10354); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12567", 10355); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3567", 10356); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13567", 10357); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23567", 10358); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123567", 10359); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 4567", 10360); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 14567", 10361); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 24567", 10362); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 124567", 10363); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 34567", 10364); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 134567", 10365); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 234567", 10366); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1234567", 10367); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 8", 10368); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 18", 10369); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 28", 10370); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 128", 10371); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 38", 10372); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 138", 10373); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 238", 10374); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1238", 10375); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 48", 10376); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 148", 10377); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 248", 10378); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1248", 10379); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 348", 10380); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1348", 10381); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2348", 10382); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12348", 10383); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 58", 10384); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 158", 10385); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 258", 10386); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1258", 10387); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 358", 10388); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1358", 10389); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2358", 10390); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12358", 10391); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 458", 10392); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1458", 10393); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2458", 10394); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12458", 10395); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3458", 10396); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13458", 10397); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23458", 10398); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123458", 10399); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 68", 10400); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 168", 10401); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 268", 10402); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1268", 10403); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 368", 10404); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1368", 10405); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2368", 10406); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12368", 10407); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 468", 10408); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1468", 10409); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2468", 10410); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12468", 10411); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3468", 10412); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13468", 10413); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23468", 10414); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123468", 10415); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 568", 10416); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1568", 10417); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2568", 10418); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12568", 10419); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3568", 10420); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13568", 10421); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23568", 10422); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123568", 10423); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 4568", 10424); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 14568", 10425); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 24568", 10426); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 124568", 10427); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 34568", 10428); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 134568", 10429); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 234568", 10430); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1234568", 10431); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 78", 10432); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 178", 10433); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 278", 10434); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1278", 10435); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 378", 10436); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1378", 10437); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2378", 10438); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12378", 10439); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 478", 10440); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1478", 10441); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2478", 10442); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12478", 10443); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3478", 10444); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13478", 10445); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23478", 10446); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123478", 10447); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 578", 10448); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1578", 10449); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2578", 10450); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12578", 10451); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3578", 10452); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13578", 10453); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23578", 10454); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123578", 10455); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 4578", 10456); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 14578", 10457); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 24578", 10458); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 124578", 10459); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 34578", 10460); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 134578", 10461); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 234578", 10462); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1234578", 10463); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 678", 10464); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1678", 10465); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2678", 10466); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12678", 10467); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 3678", 10468); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 13678", 10469); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 23678", 10470); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 123678", 10471); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 4678", 10472); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 14678", 10473); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 24678", 10474); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 124678", 10475); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 34678", 10476); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 134678", 10477); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 234678", 10478); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1234678", 10479); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 5678", 10480); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 15678", 10481); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 25678", 10482); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 125678", 10483); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 35678", 10484); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 135678", 10485); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 235678", 10486); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1235678", 10487); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 45678", 10488); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 145678", 10489); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 245678", 10490); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1245678", 10491); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 345678", 10492); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 1345678", 10493); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 2345678", 10494); - _unicodeCharacterMap.Add("BRAILLE PATTERN DOTS 12345678", 10495); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW WITH VERTICAL STROKE", 10496); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW WITH DOUBLE VERTICAL STROKE", 10497); - _unicodeCharacterMap.Add("LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE", 10498); - _unicodeCharacterMap.Add("RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE", 10499); - _unicodeCharacterMap.Add("LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE", 10500); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW FROM BAR", 10501); - _unicodeCharacterMap.Add("LEFTWARDS DOUBLE ARROW FROM BAR", 10502); - _unicodeCharacterMap.Add("RIGHTWARDS DOUBLE ARROW FROM BAR", 10503); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH HORIZONTAL STROKE", 10504); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH HORIZONTAL STROKE", 10505); - _unicodeCharacterMap.Add("UPWARDS TRIPLE ARROW", 10506); - _unicodeCharacterMap.Add("DOWNWARDS TRIPLE ARROW", 10507); - _unicodeCharacterMap.Add("LEFTWARDS DOUBLE DASH ARROW", 10508); - _unicodeCharacterMap.Add("RIGHTWARDS DOUBLE DASH ARROW", 10509); - _unicodeCharacterMap.Add("LEFTWARDS TRIPLE DASH ARROW", 10510); - _unicodeCharacterMap.Add("RIGHTWARDS TRIPLE DASH ARROW", 10511); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED TRIPLE DASH ARROW", 10512); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH DOTTED STEM", 10513); - _unicodeCharacterMap.Add("UPWARDS ARROW TO BAR", 10514); - _unicodeCharacterMap.Add("DOWNWARDS ARROW TO BAR", 10515); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE", 10516); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 10517); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW WITH TAIL", 10518); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW WITH TAIL WITH VERTICAL STROKE", 10519); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 10520); - _unicodeCharacterMap.Add("LEFTWARDS ARROW TAIL", 10521); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW TAIL", 10522); - _unicodeCharacterMap.Add("LEFTWARDS DOUBLE ARROW TAIL", 10523); - _unicodeCharacterMap.Add("RIGHTWARDS DOUBLE ARROW TAIL", 10524); - _unicodeCharacterMap.Add("LEFTWARDS ARROW TO BLACK DIAMOND", 10525); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW TO BLACK DIAMOND", 10526); - _unicodeCharacterMap.Add("LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND", 10527); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND", 10528); - _unicodeCharacterMap.Add("NORTH WEST AND SOUTH EAST ARROW", 10529); - _unicodeCharacterMap.Add("NORTH EAST AND SOUTH WEST ARROW", 10530); - _unicodeCharacterMap.Add("NORTH WEST ARROW WITH HOOK", 10531); - _unicodeCharacterMap.Add("NORTH EAST ARROW WITH HOOK", 10532); - _unicodeCharacterMap.Add("SOUTH EAST ARROW WITH HOOK", 10533); - _unicodeCharacterMap.Add("SOUTH WEST ARROW WITH HOOK", 10534); - _unicodeCharacterMap.Add("NORTH WEST ARROW AND NORTH EAST ARROW", 10535); - _unicodeCharacterMap.Add("NORTH EAST ARROW AND SOUTH EAST ARROW", 10536); - _unicodeCharacterMap.Add("SOUTH EAST ARROW AND SOUTH WEST ARROW", 10537); - _unicodeCharacterMap.Add("SOUTH WEST ARROW AND NORTH WEST ARROW", 10538); - _unicodeCharacterMap.Add("RISING DIAGONAL CROSSING FALLING DIAGONAL", 10539); - _unicodeCharacterMap.Add("FALLING DIAGONAL CROSSING RISING DIAGONAL", 10540); - _unicodeCharacterMap.Add("SOUTH EAST ARROW CROSSING NORTH EAST ARROW", 10541); - _unicodeCharacterMap.Add("NORTH EAST ARROW CROSSING SOUTH EAST ARROW", 10542); - _unicodeCharacterMap.Add("FALLING DIAGONAL CROSSING NORTH EAST ARROW", 10543); - _unicodeCharacterMap.Add("RISING DIAGONAL CROSSING SOUTH EAST ARROW", 10544); - _unicodeCharacterMap.Add("NORTH EAST ARROW CROSSING NORTH WEST ARROW", 10545); - _unicodeCharacterMap.Add("NORTH WEST ARROW CROSSING NORTH EAST ARROW", 10546); - _unicodeCharacterMap.Add("WAVE ARROW POINTING DIRECTLY RIGHT", 10547); - _unicodeCharacterMap.Add("ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS", 10548); - _unicodeCharacterMap.Add("ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS", 10549); - _unicodeCharacterMap.Add("ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS", 10550); - _unicodeCharacterMap.Add("ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS", 10551); - _unicodeCharacterMap.Add("RIGHT SIDE ARC CLOCKWISE ARROW", 10552); - _unicodeCharacterMap.Add("LEFT SIDE ARC ANTICLOCKWISE ARROW", 10553); - _unicodeCharacterMap.Add("TOP ARC ANTICLOCKWISE ARROW", 10554); - _unicodeCharacterMap.Add("BOTTOM ARC ANTICLOCKWISE ARROW", 10555); - _unicodeCharacterMap.Add("TOP ARC CLOCKWISE ARROW WITH MINUS", 10556); - _unicodeCharacterMap.Add("TOP ARC ANTICLOCKWISE ARROW WITH PLUS", 10557); - _unicodeCharacterMap.Add("LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW", 10558); - _unicodeCharacterMap.Add("LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW", 10559); - _unicodeCharacterMap.Add("ANTICLOCKWISE CLOSED CIRCLE ARROW", 10560); - _unicodeCharacterMap.Add("CLOCKWISE CLOSED CIRCLE ARROW", 10561); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW", 10562); - _unicodeCharacterMap.Add("LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW", 10563); - _unicodeCharacterMap.Add("SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW", 10564); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH PLUS BELOW", 10565); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH PLUS BELOW", 10566); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW THROUGH X", 10567); - _unicodeCharacterMap.Add("LEFT RIGHT ARROW THROUGH SMALL CIRCLE", 10568); - _unicodeCharacterMap.Add("UPWARDS TWO HEADED ARROW FROM SMALL CIRCLE", 10569); - _unicodeCharacterMap.Add("LEFT BARB UP RIGHT BARB DOWN HARPOON", 10570); - _unicodeCharacterMap.Add("LEFT BARB DOWN RIGHT BARB UP HARPOON", 10571); - _unicodeCharacterMap.Add("UP BARB RIGHT DOWN BARB LEFT HARPOON", 10572); - _unicodeCharacterMap.Add("UP BARB LEFT DOWN BARB RIGHT HARPOON", 10573); - _unicodeCharacterMap.Add("LEFT BARB UP RIGHT BARB UP HARPOON", 10574); - _unicodeCharacterMap.Add("UP BARB RIGHT DOWN BARB RIGHT HARPOON", 10575); - _unicodeCharacterMap.Add("LEFT BARB DOWN RIGHT BARB DOWN HARPOON", 10576); - _unicodeCharacterMap.Add("UP BARB LEFT DOWN BARB LEFT HARPOON", 10577); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB UP TO BAR", 10578); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB UP TO BAR", 10579); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB RIGHT TO BAR", 10580); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB RIGHT TO BAR", 10581); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB DOWN TO BAR", 10582); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB DOWN TO BAR", 10583); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB LEFT TO BAR", 10584); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB LEFT TO BAR", 10585); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB UP FROM BAR", 10586); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB UP FROM BAR", 10587); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB RIGHT FROM BAR", 10588); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR", 10589); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB DOWN FROM BAR", 10590); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR", 10591); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB LEFT FROM BAR", 10592); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB LEFT FROM BAR", 10593); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN", 10594); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT", 10595); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN", 10596); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT", 10597); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP", 10598); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN", 10599); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP", 10600); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN", 10601); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH", 10602); - _unicodeCharacterMap.Add("LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH", 10603); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH", 10604); - _unicodeCharacterMap.Add("RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH", 10605); - _unicodeCharacterMap.Add("UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT", 10606); - _unicodeCharacterMap.Add("DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT", 10607); - _unicodeCharacterMap.Add("RIGHT DOUBLE ARROW WITH ROUNDED HEAD", 10608); - _unicodeCharacterMap.Add("EQUALS SIGN ABOVE RIGHTWARDS ARROW", 10609); - _unicodeCharacterMap.Add("TILDE OPERATOR ABOVE RIGHTWARDS ARROW", 10610); - _unicodeCharacterMap.Add("LEFTWARDS ARROW ABOVE TILDE OPERATOR", 10611); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW ABOVE TILDE OPERATOR", 10612); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO", 10613); - _unicodeCharacterMap.Add("LESS THAN ABOVE LEFTWARDS ARROW", 10614); - _unicodeCharacterMap.Add("LEFTWARDS ARROW THROUGH LESS THAN", 10615); - _unicodeCharacterMap.Add("GREATER THAN ABOVE RIGHTWARDS ARROW", 10616); - _unicodeCharacterMap.Add("SUBSET ABOVE RIGHTWARDS ARROW", 10617); - _unicodeCharacterMap.Add("LEFTWARDS ARROW THROUGH SUBSET", 10618); - _unicodeCharacterMap.Add("SUPERSET ABOVE LEFTWARDS ARROW", 10619); - _unicodeCharacterMap.Add("LEFT FISH TAIL", 10620); - _unicodeCharacterMap.Add("RIGHT FISH TAIL", 10621); - _unicodeCharacterMap.Add("UP FISH TAIL", 10622); - _unicodeCharacterMap.Add("DOWN FISH TAIL", 10623); - _unicodeCharacterMap.Add("TRIPLE VERTICAL BAR DELIMITER", 10624); - _unicodeCharacterMap.Add("Z NOTATION SPOT", 10625); - _unicodeCharacterMap.Add("Z NOTATION TYPE COLON", 10626); - _unicodeCharacterMap.Add("LEFT WHITE CURLY BRACKET", 10627); - _unicodeCharacterMap.Add("RIGHT WHITE CURLY BRACKET", 10628); - _unicodeCharacterMap.Add("LEFT WHITE PARENTHESIS", 10629); - _unicodeCharacterMap.Add("RIGHT WHITE PARENTHESIS", 10630); - _unicodeCharacterMap.Add("Z NOTATION LEFT IMAGE BRACKET", 10631); - _unicodeCharacterMap.Add("Z NOTATION RIGHT IMAGE BRACKET", 10632); - _unicodeCharacterMap.Add("Z NOTATION LEFT BINDING BRACKET", 10633); - _unicodeCharacterMap.Add("Z NOTATION RIGHT BINDING BRACKET", 10634); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET WITH UNDERBAR", 10635); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET WITH UNDERBAR", 10636); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET WITH TICK IN TOP CORNER", 10637); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER", 10638); - _unicodeCharacterMap.Add("LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER", 10639); - _unicodeCharacterMap.Add("RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER", 10640); - _unicodeCharacterMap.Add("LEFT ANGLE BRACKET WITH DOT", 10641); - _unicodeCharacterMap.Add("RIGHT ANGLE BRACKET WITH DOT", 10642); - _unicodeCharacterMap.Add("LEFT ARC LESS THAN BRACKET", 10643); - _unicodeCharacterMap.Add("RIGHT ARC GREATER THAN BRACKET", 10644); - _unicodeCharacterMap.Add("DOUBLE LEFT ARC GREATER THAN BRACKET", 10645); - _unicodeCharacterMap.Add("DOUBLE RIGHT ARC LESS THAN BRACKET", 10646); - _unicodeCharacterMap.Add("LEFT BLACK TORTOISE SHELL BRACKET", 10647); - _unicodeCharacterMap.Add("RIGHT BLACK TORTOISE SHELL BRACKET", 10648); - _unicodeCharacterMap.Add("DOTTED FENCE", 10649); - _unicodeCharacterMap.Add("VERTICAL ZIGZAG LINE", 10650); - _unicodeCharacterMap.Add("MEASURED ANGLE OPENING LEFT", 10651); - _unicodeCharacterMap.Add("RIGHT ANGLE VARIANT WITH SQUARE", 10652); - _unicodeCharacterMap.Add("MEASURED RIGHT ANGLE WITH DOT", 10653); - _unicodeCharacterMap.Add("ANGLE WITH S INSIDE", 10654); - _unicodeCharacterMap.Add("ACUTE ANGLE", 10655); - _unicodeCharacterMap.Add("SPHERICAL ANGLE OPENING LEFT", 10656); - _unicodeCharacterMap.Add("SPHERICAL ANGLE OPENING UP", 10657); - _unicodeCharacterMap.Add("TURNED ANGLE", 10658); - _unicodeCharacterMap.Add("REVERSED ANGLE", 10659); - _unicodeCharacterMap.Add("ANGLE WITH UNDERBAR", 10660); - _unicodeCharacterMap.Add("REVERSED ANGLE WITH UNDERBAR", 10661); - _unicodeCharacterMap.Add("OBLIQUE ANGLE OPENING UP", 10662); - _unicodeCharacterMap.Add("OBLIQUE ANGLE OPENING DOWN", 10663); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT", 10664); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT", 10665); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT", 10666); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT", 10667); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP", 10668); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP", 10669); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN", 10670); - _unicodeCharacterMap.Add("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN", 10671); - _unicodeCharacterMap.Add("REVERSED EMPTY SET", 10672); - _unicodeCharacterMap.Add("EMPTY SET WITH OVERBAR", 10673); - _unicodeCharacterMap.Add("EMPTY SET WITH SMALL CIRCLE ABOVE", 10674); - _unicodeCharacterMap.Add("EMPTY SET WITH RIGHT ARROW ABOVE", 10675); - _unicodeCharacterMap.Add("EMPTY SET WITH LEFT ARROW ABOVE", 10676); - _unicodeCharacterMap.Add("CIRCLE WITH HORIZONTAL BAR", 10677); - _unicodeCharacterMap.Add("CIRCLED VERTICAL BAR", 10678); - _unicodeCharacterMap.Add("CIRCLED PARALLEL", 10679); - _unicodeCharacterMap.Add("CIRCLED REVERSE SOLIDUS", 10680); - _unicodeCharacterMap.Add("CIRCLED PERPENDICULAR", 10681); - _unicodeCharacterMap.Add("CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR", 10682); - _unicodeCharacterMap.Add("CIRCLE WITH SUPERIMPOSED X", 10683); - _unicodeCharacterMap.Add("CIRCLED ANTICLOCKWISE ROTATED DIVISION SIGN", 10684); - _unicodeCharacterMap.Add("UP ARROW THROUGH CIRCLE", 10685); - _unicodeCharacterMap.Add("CIRCLED WHITE BULLET", 10686); - _unicodeCharacterMap.Add("CIRCLED BULLET", 10687); - _unicodeCharacterMap.Add("CIRCLED LESS THAN", 10688); - _unicodeCharacterMap.Add("CIRCLED GREATER THAN", 10689); - _unicodeCharacterMap.Add("CIRCLE WITH SMALL CIRCLE TO THE RIGHT", 10690); - _unicodeCharacterMap.Add("CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT", 10691); - _unicodeCharacterMap.Add("SQUARED RISING DIAGONAL SLASH", 10692); - _unicodeCharacterMap.Add("SQUARED FALLING DIAGONAL SLASH", 10693); - _unicodeCharacterMap.Add("SQUARED ASTERISK", 10694); - _unicodeCharacterMap.Add("SQUARED SMALL CIRCLE", 10695); - _unicodeCharacterMap.Add("SQUARED SQUARE", 10696); - _unicodeCharacterMap.Add("TWO JOINED SQUARES", 10697); - _unicodeCharacterMap.Add("TRIANGLE WITH DOT ABOVE", 10698); - _unicodeCharacterMap.Add("TRIANGLE WITH UNDERBAR", 10699); - _unicodeCharacterMap.Add("S IN TRIANGLE", 10700); - _unicodeCharacterMap.Add("TRIANGLE WITH SERIFS AT BOTTOM", 10701); - _unicodeCharacterMap.Add("RIGHT TRIANGLE ABOVE LEFT TRIANGLE", 10702); - _unicodeCharacterMap.Add("LEFT TRIANGLE BESIDE VERTICAL BAR", 10703); - _unicodeCharacterMap.Add("VERTICAL BAR BESIDE RIGHT TRIANGLE", 10704); - _unicodeCharacterMap.Add("BOWTIE WITH LEFT HALF BLACK", 10705); - _unicodeCharacterMap.Add("BOWTIE WITH RIGHT HALF BLACK", 10706); - _unicodeCharacterMap.Add("BLACK BOWTIE", 10707); - _unicodeCharacterMap.Add("TIMES WITH LEFT HALF BLACK", 10708); - _unicodeCharacterMap.Add("TIMES WITH RIGHT HALF BLACK", 10709); - _unicodeCharacterMap.Add("WHITE HOURGLASS", 10710); - _unicodeCharacterMap.Add("BLACK HOURGLASS", 10711); - _unicodeCharacterMap.Add("LEFT WIGGLY FENCE", 10712); - _unicodeCharacterMap.Add("RIGHT WIGGLY FENCE", 10713); - _unicodeCharacterMap.Add("LEFT DOUBLE WIGGLY FENCE", 10714); - _unicodeCharacterMap.Add("RIGHT DOUBLE WIGGLY FENCE", 10715); - _unicodeCharacterMap.Add("INCOMPLETE INFINITY", 10716); - _unicodeCharacterMap.Add("TIE OVER INFINITY", 10717); - _unicodeCharacterMap.Add("INFINITY NEGATED WITH VERTICAL BAR", 10718); - _unicodeCharacterMap.Add("DOUBLE ENDED MULTIMAP", 10719); - _unicodeCharacterMap.Add("SQUARE WITH CONTOURED OUTLINE", 10720); - _unicodeCharacterMap.Add("INCREASES AS", 10721); - _unicodeCharacterMap.Add("SHUFFLE PRODUCT", 10722); - _unicodeCharacterMap.Add("EQUALS SIGN AND SLANTED PARALLEL", 10723); - _unicodeCharacterMap.Add("EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE", 10724); - _unicodeCharacterMap.Add("IDENTICAL TO AND SLANTED PARALLEL", 10725); - _unicodeCharacterMap.Add("GLEICH STARK", 10726); - _unicodeCharacterMap.Add("THERMODYNAMIC", 10727); - _unicodeCharacterMap.Add("DOWN POINTING TRIANGLE WITH LEFT HALF BLACK", 10728); - _unicodeCharacterMap.Add("DOWN POINTING TRIANGLE WITH RIGHT HALF BLACK", 10729); - _unicodeCharacterMap.Add("BLACK DIAMOND WITH DOWN ARROW", 10730); - _unicodeCharacterMap.Add("BLACK LOZENGE", 10731); - _unicodeCharacterMap.Add("WHITE CIRCLE WITH DOWN ARROW", 10732); - _unicodeCharacterMap.Add("BLACK CIRCLE WITH DOWN ARROW", 10733); - _unicodeCharacterMap.Add("ERROR BARRED WHITE SQUARE", 10734); - _unicodeCharacterMap.Add("ERROR BARRED BLACK SQUARE", 10735); - _unicodeCharacterMap.Add("ERROR BARRED WHITE DIAMOND", 10736); - _unicodeCharacterMap.Add("ERROR BARRED BLACK DIAMOND", 10737); - _unicodeCharacterMap.Add("ERROR BARRED WHITE CIRCLE", 10738); - _unicodeCharacterMap.Add("ERROR BARRED BLACK CIRCLE", 10739); - _unicodeCharacterMap.Add("RULE DELAYED", 10740); - _unicodeCharacterMap.Add("REVERSE SOLIDUS OPERATOR", 10741); - _unicodeCharacterMap.Add("SOLIDUS WITH OVERBAR", 10742); - _unicodeCharacterMap.Add("REVERSE SOLIDUS WITH HORIZONTAL STROKE", 10743); - _unicodeCharacterMap.Add("BIG SOLIDUS", 10744); - _unicodeCharacterMap.Add("BIG REVERSE SOLIDUS", 10745); - _unicodeCharacterMap.Add("DOUBLE PLUS", 10746); - _unicodeCharacterMap.Add("TRIPLE PLUS", 10747); - _unicodeCharacterMap.Add("LEFT POINTING CURVED ANGLE BRACKET", 10748); - _unicodeCharacterMap.Add("RIGHT POINTING CURVED ANGLE BRACKET", 10749); - _unicodeCharacterMap.Add("TINY", 10750); - _unicodeCharacterMap.Add("MINY", 10751); - _unicodeCharacterMap.Add("N ARY CIRCLED DOT OPERATOR", 10752); - _unicodeCharacterMap.Add("N ARY CIRCLED PLUS OPERATOR", 10753); - _unicodeCharacterMap.Add("N ARY CIRCLED TIMES OPERATOR", 10754); - _unicodeCharacterMap.Add("N ARY UNION OPERATOR WITH DOT", 10755); - _unicodeCharacterMap.Add("N ARY UNION OPERATOR WITH PLUS", 10756); - _unicodeCharacterMap.Add("N ARY SQUARE INTERSECTION OPERATOR", 10757); - _unicodeCharacterMap.Add("N ARY SQUARE UNION OPERATOR", 10758); - _unicodeCharacterMap.Add("TWO LOGICAL AND OPERATOR", 10759); - _unicodeCharacterMap.Add("TWO LOGICAL OR OPERATOR", 10760); - _unicodeCharacterMap.Add("N ARY TIMES OPERATOR", 10761); - _unicodeCharacterMap.Add("MODULO TWO SUM", 10762); - _unicodeCharacterMap.Add("SUMMATION WITH INTEGRAL", 10763); - _unicodeCharacterMap.Add("QUADRUPLE INTEGRAL OPERATOR", 10764); - _unicodeCharacterMap.Add("FINITE PART INTEGRAL", 10765); - _unicodeCharacterMap.Add("INTEGRAL WITH DOUBLE STROKE", 10766); - _unicodeCharacterMap.Add("INTEGRAL AVERAGE WITH SLASH", 10767); - _unicodeCharacterMap.Add("CIRCULATION FUNCTION", 10768); - _unicodeCharacterMap.Add("ANTICLOCKWISE INTEGRATION", 10769); - _unicodeCharacterMap.Add("LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE", 10770); - _unicodeCharacterMap.Add("LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE", 10771); - _unicodeCharacterMap.Add("LINE INTEGRATION NOT INCLUDING THE POLE", 10772); - _unicodeCharacterMap.Add("INTEGRAL AROUND A POINT OPERATOR", 10773); - _unicodeCharacterMap.Add("QUATERNION INTEGRAL OPERATOR", 10774); - _unicodeCharacterMap.Add("INTEGRAL WITH LEFTWARDS ARROW WITH HOOK", 10775); - _unicodeCharacterMap.Add("INTEGRAL WITH TIMES SIGN", 10776); - _unicodeCharacterMap.Add("INTEGRAL WITH INTERSECTION", 10777); - _unicodeCharacterMap.Add("INTEGRAL WITH UNION", 10778); - _unicodeCharacterMap.Add("INTEGRAL WITH OVERBAR", 10779); - _unicodeCharacterMap.Add("INTEGRAL WITH UNDERBAR", 10780); - _unicodeCharacterMap.Add("JOIN", 10781); - _unicodeCharacterMap.Add("LARGE LEFT TRIANGLE OPERATOR", 10782); - _unicodeCharacterMap.Add("Z NOTATION SCHEMA COMPOSITION", 10783); - _unicodeCharacterMap.Add("Z NOTATION SCHEMA PIPING", 10784); - _unicodeCharacterMap.Add("Z NOTATION SCHEMA PROJECTION", 10785); - _unicodeCharacterMap.Add("PLUS SIGN WITH SMALL CIRCLE ABOVE", 10786); - _unicodeCharacterMap.Add("PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE", 10787); - _unicodeCharacterMap.Add("PLUS SIGN WITH TILDE ABOVE", 10788); - _unicodeCharacterMap.Add("PLUS SIGN WITH DOT BELOW", 10789); - _unicodeCharacterMap.Add("PLUS SIGN WITH TILDE BELOW", 10790); - _unicodeCharacterMap.Add("PLUS SIGN WITH SUBSCRIPT TWO", 10791); - _unicodeCharacterMap.Add("PLUS SIGN WITH BLACK TRIANGLE", 10792); - _unicodeCharacterMap.Add("MINUS SIGN WITH COMMA ABOVE", 10793); - _unicodeCharacterMap.Add("MINUS SIGN WITH DOT BELOW", 10794); - _unicodeCharacterMap.Add("MINUS SIGN WITH FALLING DOTS", 10795); - _unicodeCharacterMap.Add("MINUS SIGN WITH RISING DOTS", 10796); - _unicodeCharacterMap.Add("PLUS SIGN IN LEFT HALF CIRCLE", 10797); - _unicodeCharacterMap.Add("PLUS SIGN IN RIGHT HALF CIRCLE", 10798); - _unicodeCharacterMap.Add("VECTOR OR CROSS PRODUCT", 10799); - _unicodeCharacterMap.Add("MULTIPLICATION SIGN WITH DOT ABOVE", 10800); - _unicodeCharacterMap.Add("MULTIPLICATION SIGN WITH UNDERBAR", 10801); - _unicodeCharacterMap.Add("SEMIDIRECT PRODUCT WITH BOTTOM CLOSED", 10802); - _unicodeCharacterMap.Add("SMASH PRODUCT", 10803); - _unicodeCharacterMap.Add("MULTIPLICATION SIGN IN LEFT HALF CIRCLE", 10804); - _unicodeCharacterMap.Add("MULTIPLICATION SIGN IN RIGHT HALF CIRCLE", 10805); - _unicodeCharacterMap.Add("CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT", 10806); - _unicodeCharacterMap.Add("MULTIPLICATION SIGN IN DOUBLE CIRCLE", 10807); - _unicodeCharacterMap.Add("CIRCLED DIVISION SIGN", 10808); - _unicodeCharacterMap.Add("PLUS SIGN IN TRIANGLE", 10809); - _unicodeCharacterMap.Add("MINUS SIGN IN TRIANGLE", 10810); - _unicodeCharacterMap.Add("MULTIPLICATION SIGN IN TRIANGLE", 10811); - _unicodeCharacterMap.Add("INTERIOR PRODUCT", 10812); - _unicodeCharacterMap.Add("RIGHTHAND INTERIOR PRODUCT", 10813); - _unicodeCharacterMap.Add("Z NOTATION RELATIONAL COMPOSITION", 10814); - _unicodeCharacterMap.Add("AMALGAMATION OR COPRODUCT", 10815); - _unicodeCharacterMap.Add("INTERSECTION WITH DOT", 10816); - _unicodeCharacterMap.Add("UNION WITH MINUS SIGN", 10817); - _unicodeCharacterMap.Add("UNION WITH OVERBAR", 10818); - _unicodeCharacterMap.Add("INTERSECTION WITH OVERBAR", 10819); - _unicodeCharacterMap.Add("INTERSECTION WITH LOGICAL AND", 10820); - _unicodeCharacterMap.Add("UNION WITH LOGICAL OR", 10821); - _unicodeCharacterMap.Add("UNION ABOVE INTERSECTION", 10822); - _unicodeCharacterMap.Add("INTERSECTION ABOVE UNION", 10823); - _unicodeCharacterMap.Add("UNION ABOVE BAR ABOVE INTERSECTION", 10824); - _unicodeCharacterMap.Add("INTERSECTION ABOVE BAR ABOVE UNION", 10825); - _unicodeCharacterMap.Add("UNION BESIDE AND JOINED WITH UNION", 10826); - _unicodeCharacterMap.Add("INTERSECTION BESIDE AND JOINED WITH INTERSECTION", 10827); - _unicodeCharacterMap.Add("CLOSED UNION WITH SERIFS", 10828); - _unicodeCharacterMap.Add("CLOSED INTERSECTION WITH SERIFS", 10829); - _unicodeCharacterMap.Add("DOUBLE SQUARE INTERSECTION", 10830); - _unicodeCharacterMap.Add("DOUBLE SQUARE UNION", 10831); - _unicodeCharacterMap.Add("CLOSED UNION WITH SERIFS AND SMASH PRODUCT", 10832); - _unicodeCharacterMap.Add("LOGICAL AND WITH DOT ABOVE", 10833); - _unicodeCharacterMap.Add("LOGICAL OR WITH DOT ABOVE", 10834); - _unicodeCharacterMap.Add("DOUBLE LOGICAL AND", 10835); - _unicodeCharacterMap.Add("DOUBLE LOGICAL OR", 10836); - _unicodeCharacterMap.Add("TWO INTERSECTING LOGICAL AND", 10837); - _unicodeCharacterMap.Add("TWO INTERSECTING LOGICAL OR", 10838); - _unicodeCharacterMap.Add("SLOPING LARGE OR", 10839); - _unicodeCharacterMap.Add("SLOPING LARGE AND", 10840); - _unicodeCharacterMap.Add("LOGICAL OR OVERLAPPING LOGICAL AND", 10841); - _unicodeCharacterMap.Add("LOGICAL AND WITH MIDDLE STEM", 10842); - _unicodeCharacterMap.Add("LOGICAL OR WITH MIDDLE STEM", 10843); - _unicodeCharacterMap.Add("LOGICAL AND WITH HORIZONTAL DASH", 10844); - _unicodeCharacterMap.Add("LOGICAL OR WITH HORIZONTAL DASH", 10845); - _unicodeCharacterMap.Add("LOGICAL AND WITH DOUBLE OVERBAR", 10846); - _unicodeCharacterMap.Add("LOGICAL AND WITH UNDERBAR", 10847); - _unicodeCharacterMap.Add("LOGICAL AND WITH DOUBLE UNDERBAR", 10848); - _unicodeCharacterMap.Add("SMALL VEE WITH UNDERBAR", 10849); - _unicodeCharacterMap.Add("LOGICAL OR WITH DOUBLE OVERBAR", 10850); - _unicodeCharacterMap.Add("LOGICAL OR WITH DOUBLE UNDERBAR", 10851); - _unicodeCharacterMap.Add("Z NOTATION DOMAIN ANTIRESTRICTION", 10852); - _unicodeCharacterMap.Add("Z NOTATION RANGE ANTIRESTRICTION", 10853); - _unicodeCharacterMap.Add("EQUALS SIGN WITH DOT BELOW", 10854); - _unicodeCharacterMap.Add("IDENTICAL WITH DOT ABOVE", 10855); - _unicodeCharacterMap.Add("TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE", 10856); - _unicodeCharacterMap.Add("TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE", 10857); - _unicodeCharacterMap.Add("TILDE OPERATOR WITH DOT ABOVE", 10858); - _unicodeCharacterMap.Add("TILDE OPERATOR WITH RISING DOTS", 10859); - _unicodeCharacterMap.Add("SIMILAR MINUS SIMILAR", 10860); - _unicodeCharacterMap.Add("CONGRUENT WITH DOT ABOVE", 10861); - _unicodeCharacterMap.Add("EQUALS WITH ASTERISK", 10862); - _unicodeCharacterMap.Add("ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT", 10863); - _unicodeCharacterMap.Add("APPROXIMATELY EQUAL OR EQUAL TO", 10864); - _unicodeCharacterMap.Add("EQUALS SIGN ABOVE PLUS SIGN", 10865); - _unicodeCharacterMap.Add("PLUS SIGN ABOVE EQUALS SIGN", 10866); - _unicodeCharacterMap.Add("EQUALS SIGN ABOVE TILDE OPERATOR", 10867); - _unicodeCharacterMap.Add("DOUBLE COLON EQUAL", 10868); - _unicodeCharacterMap.Add("TWO CONSECUTIVE EQUALS SIGNS", 10869); - _unicodeCharacterMap.Add("THREE CONSECUTIVE EQUALS SIGNS", 10870); - _unicodeCharacterMap.Add("EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW", 10871); - _unicodeCharacterMap.Add("EQUIVALENT WITH FOUR DOTS ABOVE", 10872); - _unicodeCharacterMap.Add("LESS THAN WITH CIRCLE INSIDE", 10873); - _unicodeCharacterMap.Add("GREATER THAN WITH CIRCLE INSIDE", 10874); - _unicodeCharacterMap.Add("LESS THAN WITH QUESTION MARK ABOVE", 10875); - _unicodeCharacterMap.Add("GREATER THAN WITH QUESTION MARK ABOVE", 10876); - _unicodeCharacterMap.Add("LESS THAN OR SLANTED EQUAL TO", 10877); - _unicodeCharacterMap.Add("GREATER THAN OR SLANTED EQUAL TO", 10878); - _unicodeCharacterMap.Add("LESS THAN OR SLANTED EQUAL TO WITH DOT INSIDE", 10879); - _unicodeCharacterMap.Add("GREATER THAN OR SLANTED EQUAL TO WITH DOT INSIDE", 10880); - _unicodeCharacterMap.Add("LESS THAN OR SLANTED EQUAL TO WITH DOT ABOVE", 10881); - _unicodeCharacterMap.Add("GREATER THAN OR SLANTED EQUAL TO WITH DOT ABOVE", 10882); - _unicodeCharacterMap.Add("LESS THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT", 10883); - _unicodeCharacterMap.Add("GREATER THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT", 10884); - _unicodeCharacterMap.Add("LESS THAN OR APPROXIMATE", 10885); - _unicodeCharacterMap.Add("GREATER THAN OR APPROXIMATE", 10886); - _unicodeCharacterMap.Add("LESS THAN AND SINGLE LINE NOT EQUAL TO", 10887); - _unicodeCharacterMap.Add("GREATER THAN AND SINGLE LINE NOT EQUAL TO", 10888); - _unicodeCharacterMap.Add("LESS THAN AND NOT APPROXIMATE", 10889); - _unicodeCharacterMap.Add("GREATER THAN AND NOT APPROXIMATE", 10890); - _unicodeCharacterMap.Add("LESS THAN ABOVE DOUBLE LINE EQUAL ABOVE GREATER THAN", 10891); - _unicodeCharacterMap.Add("GREATER THAN ABOVE DOUBLE LINE EQUAL ABOVE LESS THAN", 10892); - _unicodeCharacterMap.Add("LESS THAN ABOVE SIMILAR OR EQUAL", 10893); - _unicodeCharacterMap.Add("GREATER THAN ABOVE SIMILAR OR EQUAL", 10894); - _unicodeCharacterMap.Add("LESS THAN ABOVE SIMILAR ABOVE GREATER THAN", 10895); - _unicodeCharacterMap.Add("GREATER THAN ABOVE SIMILAR ABOVE LESS THAN", 10896); - _unicodeCharacterMap.Add("LESS THAN ABOVE GREATER THAN ABOVE DOUBLE LINE EQUAL", 10897); - _unicodeCharacterMap.Add("GREATER THAN ABOVE LESS THAN ABOVE DOUBLE LINE EQUAL", 10898); - _unicodeCharacterMap.Add("LESS THAN ABOVE SLANTED EQUAL ABOVE GREATER THAN ABOVE SLANTED EQUAL", 10899); - _unicodeCharacterMap.Add("GREATER THAN ABOVE SLANTED EQUAL ABOVE LESS THAN ABOVE SLANTED EQUAL", 10900); - _unicodeCharacterMap.Add("SLANTED EQUAL TO OR LESS THAN", 10901); - _unicodeCharacterMap.Add("SLANTED EQUAL TO OR GREATER THAN", 10902); - _unicodeCharacterMap.Add("SLANTED EQUAL TO OR LESS THAN WITH DOT INSIDE", 10903); - _unicodeCharacterMap.Add("SLANTED EQUAL TO OR GREATER THAN WITH DOT INSIDE", 10904); - _unicodeCharacterMap.Add("DOUBLE LINE EQUAL TO OR LESS THAN", 10905); - _unicodeCharacterMap.Add("DOUBLE LINE EQUAL TO OR GREATER THAN", 10906); - _unicodeCharacterMap.Add("DOUBLE LINE SLANTED EQUAL TO OR LESS THAN", 10907); - _unicodeCharacterMap.Add("DOUBLE LINE SLANTED EQUAL TO OR GREATER THAN", 10908); - _unicodeCharacterMap.Add("SIMILAR OR LESS THAN", 10909); - _unicodeCharacterMap.Add("SIMILAR OR GREATER THAN", 10910); - _unicodeCharacterMap.Add("SIMILAR ABOVE LESS THAN ABOVE EQUALS SIGN", 10911); - _unicodeCharacterMap.Add("SIMILAR ABOVE GREATER THAN ABOVE EQUALS SIGN", 10912); - _unicodeCharacterMap.Add("DOUBLE NESTED LESS THAN", 10913); - _unicodeCharacterMap.Add("DOUBLE NESTED GREATER THAN", 10914); - _unicodeCharacterMap.Add("DOUBLE NESTED LESS THAN WITH UNDERBAR", 10915); - _unicodeCharacterMap.Add("GREATER THAN OVERLAPPING LESS THAN", 10916); - _unicodeCharacterMap.Add("GREATER THAN BESIDE LESS THAN", 10917); - _unicodeCharacterMap.Add("LESS THAN CLOSED BY CURVE", 10918); - _unicodeCharacterMap.Add("GREATER THAN CLOSED BY CURVE", 10919); - _unicodeCharacterMap.Add("LESS THAN CLOSED BY CURVE ABOVE SLANTED EQUAL", 10920); - _unicodeCharacterMap.Add("GREATER THAN CLOSED BY CURVE ABOVE SLANTED EQUAL", 10921); - _unicodeCharacterMap.Add("SMALLER THAN", 10922); - _unicodeCharacterMap.Add("LARGER THAN", 10923); - _unicodeCharacterMap.Add("SMALLER THAN OR EQUAL TO", 10924); - _unicodeCharacterMap.Add("LARGER THAN OR EQUAL TO", 10925); - _unicodeCharacterMap.Add("EQUALS SIGN WITH BUMPY ABOVE", 10926); - _unicodeCharacterMap.Add("PRECEDES ABOVE SINGLE LINE EQUALS SIGN", 10927); - _unicodeCharacterMap.Add("SUCCEEDS ABOVE SINGLE LINE EQUALS SIGN", 10928); - _unicodeCharacterMap.Add("PRECEDES ABOVE SINGLE LINE NOT EQUAL TO", 10929); - _unicodeCharacterMap.Add("SUCCEEDS ABOVE SINGLE LINE NOT EQUAL TO", 10930); - _unicodeCharacterMap.Add("PRECEDES ABOVE EQUALS SIGN", 10931); - _unicodeCharacterMap.Add("SUCCEEDS ABOVE EQUALS SIGN", 10932); - _unicodeCharacterMap.Add("PRECEDES ABOVE NOT EQUAL TO", 10933); - _unicodeCharacterMap.Add("SUCCEEDS ABOVE NOT EQUAL TO", 10934); - _unicodeCharacterMap.Add("PRECEDES ABOVE ALMOST EQUAL TO", 10935); - _unicodeCharacterMap.Add("SUCCEEDS ABOVE ALMOST EQUAL TO", 10936); - _unicodeCharacterMap.Add("PRECEDES ABOVE NOT ALMOST EQUAL TO", 10937); - _unicodeCharacterMap.Add("SUCCEEDS ABOVE NOT ALMOST EQUAL TO", 10938); - _unicodeCharacterMap.Add("DOUBLE PRECEDES", 10939); - _unicodeCharacterMap.Add("DOUBLE SUCCEEDS", 10940); - _unicodeCharacterMap.Add("SUBSET WITH DOT", 10941); - _unicodeCharacterMap.Add("SUPERSET WITH DOT", 10942); - _unicodeCharacterMap.Add("SUBSET WITH PLUS SIGN BELOW", 10943); - _unicodeCharacterMap.Add("SUPERSET WITH PLUS SIGN BELOW", 10944); - _unicodeCharacterMap.Add("SUBSET WITH MULTIPLICATION SIGN BELOW", 10945); - _unicodeCharacterMap.Add("SUPERSET WITH MULTIPLICATION SIGN BELOW", 10946); - _unicodeCharacterMap.Add("SUBSET OF OR EQUAL TO WITH DOT ABOVE", 10947); - _unicodeCharacterMap.Add("SUPERSET OF OR EQUAL TO WITH DOT ABOVE", 10948); - _unicodeCharacterMap.Add("SUBSET OF ABOVE EQUALS SIGN", 10949); - _unicodeCharacterMap.Add("SUPERSET OF ABOVE EQUALS SIGN", 10950); - _unicodeCharacterMap.Add("SUBSET OF ABOVE TILDE OPERATOR", 10951); - _unicodeCharacterMap.Add("SUPERSET OF ABOVE TILDE OPERATOR", 10952); - _unicodeCharacterMap.Add("SUBSET OF ABOVE ALMOST EQUAL TO", 10953); - _unicodeCharacterMap.Add("SUPERSET OF ABOVE ALMOST EQUAL TO", 10954); - _unicodeCharacterMap.Add("SUBSET OF ABOVE NOT EQUAL TO", 10955); - _unicodeCharacterMap.Add("SUPERSET OF ABOVE NOT EQUAL TO", 10956); - _unicodeCharacterMap.Add("SQUARE LEFT OPEN BOX OPERATOR", 10957); - _unicodeCharacterMap.Add("SQUARE RIGHT OPEN BOX OPERATOR", 10958); - _unicodeCharacterMap.Add("CLOSED SUBSET", 10959); - _unicodeCharacterMap.Add("CLOSED SUPERSET", 10960); - _unicodeCharacterMap.Add("CLOSED SUBSET OR EQUAL TO", 10961); - _unicodeCharacterMap.Add("CLOSED SUPERSET OR EQUAL TO", 10962); - _unicodeCharacterMap.Add("SUBSET ABOVE SUPERSET", 10963); - _unicodeCharacterMap.Add("SUPERSET ABOVE SUBSET", 10964); - _unicodeCharacterMap.Add("SUBSET ABOVE SUBSET", 10965); - _unicodeCharacterMap.Add("SUPERSET ABOVE SUPERSET", 10966); - _unicodeCharacterMap.Add("SUPERSET BESIDE SUBSET", 10967); - _unicodeCharacterMap.Add("SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET", 10968); - _unicodeCharacterMap.Add("ELEMENT OF OPENING DOWNWARDS", 10969); - _unicodeCharacterMap.Add("PITCHFORK WITH TEE TOP", 10970); - _unicodeCharacterMap.Add("TRANSVERSAL INTERSECTION", 10971); - _unicodeCharacterMap.Add("FORKING", 10972); - _unicodeCharacterMap.Add("NONFORKING", 10973); - _unicodeCharacterMap.Add("SHORT LEFT TACK", 10974); - _unicodeCharacterMap.Add("SHORT DOWN TACK", 10975); - _unicodeCharacterMap.Add("SHORT UP TACK", 10976); - _unicodeCharacterMap.Add("PERPENDICULAR WITH S", 10977); - _unicodeCharacterMap.Add("VERTICAL BAR TRIPLE RIGHT TURNSTILE", 10978); - _unicodeCharacterMap.Add("DOUBLE VERTICAL BAR LEFT TURNSTILE", 10979); - _unicodeCharacterMap.Add("VERTICAL BAR DOUBLE LEFT TURNSTILE", 10980); - _unicodeCharacterMap.Add("DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE", 10981); - _unicodeCharacterMap.Add("LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL", 10982); - _unicodeCharacterMap.Add("SHORT DOWN TACK WITH OVERBAR", 10983); - _unicodeCharacterMap.Add("SHORT UP TACK WITH UNDERBAR", 10984); - _unicodeCharacterMap.Add("SHORT UP TACK ABOVE SHORT DOWN TACK", 10985); - _unicodeCharacterMap.Add("DOUBLE DOWN TACK", 10986); - _unicodeCharacterMap.Add("DOUBLE UP TACK", 10987); - _unicodeCharacterMap.Add("DOUBLE STROKE NOT SIGN", 10988); - _unicodeCharacterMap.Add("REVERSED DOUBLE STROKE NOT SIGN", 10989); - _unicodeCharacterMap.Add("DOES NOT DIVIDE WITH REVERSED NEGATION SLASH", 10990); - _unicodeCharacterMap.Add("VERTICAL LINE WITH CIRCLE ABOVE", 10991); - _unicodeCharacterMap.Add("VERTICAL LINE WITH CIRCLE BELOW", 10992); - _unicodeCharacterMap.Add("DOWN TACK WITH CIRCLE BELOW", 10993); - _unicodeCharacterMap.Add("PARALLEL WITH HORIZONTAL STROKE", 10994); - _unicodeCharacterMap.Add("PARALLEL WITH TILDE OPERATOR", 10995); - _unicodeCharacterMap.Add("TRIPLE VERTICAL BAR BINARY RELATION", 10996); - _unicodeCharacterMap.Add("TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE", 10997); - _unicodeCharacterMap.Add("TRIPLE COLON OPERATOR", 10998); - _unicodeCharacterMap.Add("TRIPLE NESTED LESS THAN", 10999); - _unicodeCharacterMap.Add("TRIPLE NESTED GREATER THAN", 11000); - _unicodeCharacterMap.Add("DOUBLE LINE SLANTED LESS THAN OR EQUAL TO", 11001); - _unicodeCharacterMap.Add("DOUBLE LINE SLANTED GREATER THAN OR EQUAL TO", 11002); - _unicodeCharacterMap.Add("TRIPLE SOLIDUS BINARY RELATION", 11003); - _unicodeCharacterMap.Add("LARGE TRIPLE VERTICAL BAR OPERATOR", 11004); - _unicodeCharacterMap.Add("DOUBLE SOLIDUS OPERATOR", 11005); - _unicodeCharacterMap.Add("WHITE VERTICAL BAR", 11006); - _unicodeCharacterMap.Add("N ARY WHITE VERTICAL BAR", 11007); - _unicodeCharacterMap.Add("NORTH EAST WHITE ARROW", 11008); - _unicodeCharacterMap.Add("NORTH WEST WHITE ARROW", 11009); - _unicodeCharacterMap.Add("SOUTH EAST WHITE ARROW", 11010); - _unicodeCharacterMap.Add("SOUTH WEST WHITE ARROW", 11011); - _unicodeCharacterMap.Add("LEFT RIGHT WHITE ARROW", 11012); - _unicodeCharacterMap.Add("LEFTWARDS BLACK ARROW", 11013); - _unicodeCharacterMap.Add("UPWARDS BLACK ARROW", 11014); - _unicodeCharacterMap.Add("DOWNWARDS BLACK ARROW", 11015); - _unicodeCharacterMap.Add("NORTH EAST BLACK ARROW", 11016); - _unicodeCharacterMap.Add("NORTH WEST BLACK ARROW", 11017); - _unicodeCharacterMap.Add("SOUTH EAST BLACK ARROW", 11018); - _unicodeCharacterMap.Add("SOUTH WEST BLACK ARROW", 11019); - _unicodeCharacterMap.Add("LEFT RIGHT BLACK ARROW", 11020); - _unicodeCharacterMap.Add("UP DOWN BLACK ARROW", 11021); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH TIP DOWNWARDS", 11022); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH TIP UPWARDS", 11023); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH TIP DOWNWARDS", 11024); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH TIP UPWARDS", 11025); - _unicodeCharacterMap.Add("SQUARE WITH TOP HALF BLACK", 11026); - _unicodeCharacterMap.Add("SQUARE WITH BOTTOM HALF BLACK", 11027); - _unicodeCharacterMap.Add("SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK", 11028); - _unicodeCharacterMap.Add("SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK", 11029); - _unicodeCharacterMap.Add("DIAMOND WITH LEFT HALF BLACK", 11030); - _unicodeCharacterMap.Add("DIAMOND WITH RIGHT HALF BLACK", 11031); - _unicodeCharacterMap.Add("DIAMOND WITH TOP HALF BLACK", 11032); - _unicodeCharacterMap.Add("DIAMOND WITH BOTTOM HALF BLACK", 11033); - _unicodeCharacterMap.Add("DOTTED SQUARE", 11034); - _unicodeCharacterMap.Add("BLACK LARGE SQUARE", 11035); - _unicodeCharacterMap.Add("WHITE LARGE SQUARE", 11036); - _unicodeCharacterMap.Add("BLACK VERY SMALL SQUARE", 11037); - _unicodeCharacterMap.Add("WHITE VERY SMALL SQUARE", 11038); - _unicodeCharacterMap.Add("BLACK PENTAGON", 11039); - _unicodeCharacterMap.Add("WHITE PENTAGON", 11040); - _unicodeCharacterMap.Add("WHITE HEXAGON", 11041); - _unicodeCharacterMap.Add("BLACK HEXAGON", 11042); - _unicodeCharacterMap.Add("HORIZONTAL BLACK HEXAGON", 11043); - _unicodeCharacterMap.Add("BLACK LARGE CIRCLE", 11044); - _unicodeCharacterMap.Add("BLACK MEDIUM DIAMOND", 11045); - _unicodeCharacterMap.Add("WHITE MEDIUM DIAMOND", 11046); - _unicodeCharacterMap.Add("BLACK MEDIUM LOZENGE", 11047); - _unicodeCharacterMap.Add("WHITE MEDIUM LOZENGE", 11048); - _unicodeCharacterMap.Add("BLACK SMALL DIAMOND", 11049); - _unicodeCharacterMap.Add("BLACK SMALL LOZENGE", 11050); - _unicodeCharacterMap.Add("WHITE SMALL LOZENGE", 11051); - _unicodeCharacterMap.Add("BLACK HORIZONTAL ELLIPSE", 11052); - _unicodeCharacterMap.Add("WHITE HORIZONTAL ELLIPSE", 11053); - _unicodeCharacterMap.Add("BLACK VERTICAL ELLIPSE", 11054); - _unicodeCharacterMap.Add("WHITE VERTICAL ELLIPSE", 11055); - _unicodeCharacterMap.Add("LEFT ARROW WITH SMALL CIRCLE", 11056); - _unicodeCharacterMap.Add("THREE LEFTWARDS ARROWS", 11057); - _unicodeCharacterMap.Add("LEFT ARROW WITH CIRCLED PLUS", 11058); - _unicodeCharacterMap.Add("LONG LEFTWARDS SQUIGGLE ARROW", 11059); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW WITH VERTICAL STROKE", 11060); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW WITH DOUBLE VERTICAL STROKE", 11061); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW FROM BAR", 11062); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED TRIPLE DASH ARROW", 11063); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH DOTTED STEM", 11064); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE", 11065); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 11066); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW WITH TAIL", 11067); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW WITH TAIL WITH VERTICAL STROKE", 11068); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 11069); - _unicodeCharacterMap.Add("LEFTWARDS ARROW THROUGH X", 11070); - _unicodeCharacterMap.Add("WAVE ARROW POINTING DIRECTLY LEFT", 11071); - _unicodeCharacterMap.Add("EQUALS SIGN ABOVE LEFTWARDS ARROW", 11072); - _unicodeCharacterMap.Add("REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW", 11073); - _unicodeCharacterMap.Add("LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO", 11074); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW THROUGH GREATER THAN", 11075); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW THROUGH SUPERSET", 11076); - _unicodeCharacterMap.Add("LEFTWARDS QUADRUPLE ARROW", 11077); - _unicodeCharacterMap.Add("RIGHTWARDS QUADRUPLE ARROW", 11078); - _unicodeCharacterMap.Add("REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW", 11079); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO", 11080); - _unicodeCharacterMap.Add("TILDE OPERATOR ABOVE LEFTWARDS ARROW", 11081); - _unicodeCharacterMap.Add("LEFTWARDS ARROW ABOVE ALMOST EQUAL TO", 11082); - _unicodeCharacterMap.Add("LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR", 11083); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR", 11084); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ZIGZAG ARROW", 11085); - _unicodeCharacterMap.Add("SHORT SLANTED NORTH ARROW", 11086); - _unicodeCharacterMap.Add("SHORT BACKSLANTED SOUTH ARROW", 11087); - _unicodeCharacterMap.Add("WHITE MEDIUM STAR", 11088); - _unicodeCharacterMap.Add("BLACK SMALL STAR", 11089); - _unicodeCharacterMap.Add("WHITE SMALL STAR", 11090); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING PENTAGON", 11091); - _unicodeCharacterMap.Add("WHITE RIGHT POINTING PENTAGON", 11092); - _unicodeCharacterMap.Add("HEAVY LARGE CIRCLE", 11093); - _unicodeCharacterMap.Add("HEAVY OVAL WITH OVAL INSIDE", 11094); - _unicodeCharacterMap.Add("HEAVY CIRCLE WITH CIRCLE INSIDE", 11095); - _unicodeCharacterMap.Add("HEAVY CIRCLE", 11096); - _unicodeCharacterMap.Add("HEAVY CIRCLED SALTIRE", 11097); - _unicodeCharacterMap.Add("SLANTED NORTH ARROW WITH HOOKED HEAD", 11098); - _unicodeCharacterMap.Add("BACKSLANTED SOUTH ARROW WITH HOOKED TAIL", 11099); - _unicodeCharacterMap.Add("SLANTED NORTH ARROW WITH HORIZONTAL TAIL", 11100); - _unicodeCharacterMap.Add("BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL", 11101); - _unicodeCharacterMap.Add("BENT ARROW POINTING DOWNWARDS THEN NORTH EAST", 11102); - _unicodeCharacterMap.Add("SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST", 11103); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW", 11104); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW", 11105); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW", 11106); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW", 11107); - _unicodeCharacterMap.Add("LEFT RIGHT TRIANGLE HEADED ARROW", 11108); - _unicodeCharacterMap.Add("UP DOWN TRIANGLE HEADED ARROW", 11109); - _unicodeCharacterMap.Add("NORTH WEST TRIANGLE HEADED ARROW", 11110); - _unicodeCharacterMap.Add("NORTH EAST TRIANGLE HEADED ARROW", 11111); - _unicodeCharacterMap.Add("SOUTH EAST TRIANGLE HEADED ARROW", 11112); - _unicodeCharacterMap.Add("SOUTH WEST TRIANGLE HEADED ARROW", 11113); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED DASHED ARROW", 11114); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED DASHED ARROW", 11115); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED DASHED ARROW", 11116); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED DASHED ARROW", 11117); - _unicodeCharacterMap.Add("CLOCKWISE TRIANGLE HEADED OPEN CIRCLE ARROW", 11118); - _unicodeCharacterMap.Add("ANTICLOCKWISE TRIANGLE HEADED OPEN CIRCLE ARROW", 11119); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW TO BAR", 11120); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW TO BAR", 11121); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW TO BAR", 11122); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW TO BAR", 11123); - _unicodeCharacterMap.Add("NORTH WEST TRIANGLE HEADED ARROW TO BAR", 11126); - _unicodeCharacterMap.Add("NORTH EAST TRIANGLE HEADED ARROW TO BAR", 11127); - _unicodeCharacterMap.Add("SOUTH EAST TRIANGLE HEADED ARROW TO BAR", 11128); - _unicodeCharacterMap.Add("SOUTH WEST TRIANGLE HEADED ARROW TO BAR", 11129); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", 11130); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", 11131); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", 11132); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE", 11133); - _unicodeCharacterMap.Add("HORIZONTAL TAB KEY", 11134); - _unicodeCharacterMap.Add("VERTICAL TAB KEY", 11135); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW OVER RIGHTWARDS TRIANGLE HEADED ARROW", 11136); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE HEADED ARROW", 11137); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW OVER LEFTWARDS TRIANGLE HEADED ARROW", 11138); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE HEADED ARROW", 11139); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED PAIRED ARROWS", 11140); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED PAIRED ARROWS", 11141); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED PAIRED ARROWS", 11142); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED PAIRED ARROWS", 11143); - _unicodeCharacterMap.Add("LEFTWARDS BLACK CIRCLED WHITE ARROW", 11144); - _unicodeCharacterMap.Add("UPWARDS BLACK CIRCLED WHITE ARROW", 11145); - _unicodeCharacterMap.Add("RIGHTWARDS BLACK CIRCLED WHITE ARROW", 11146); - _unicodeCharacterMap.Add("DOWNWARDS BLACK CIRCLED WHITE ARROW", 11147); - _unicodeCharacterMap.Add("ANTICLOCKWISE TRIANGLE HEADED RIGHT U SHAPED ARROW", 11148); - _unicodeCharacterMap.Add("ANTICLOCKWISE TRIANGLE HEADED BOTTOM U SHAPED ARROW", 11149); - _unicodeCharacterMap.Add("ANTICLOCKWISE TRIANGLE HEADED LEFT U SHAPED ARROW", 11150); - _unicodeCharacterMap.Add("ANTICLOCKWISE TRIANGLE HEADED TOP U SHAPED ARROW", 11151); - _unicodeCharacterMap.Add("RETURN LEFT", 11152); - _unicodeCharacterMap.Add("RETURN RIGHT", 11153); - _unicodeCharacterMap.Add("NEWLINE LEFT", 11154); - _unicodeCharacterMap.Add("NEWLINE RIGHT", 11155); - _unicodeCharacterMap.Add("FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE", 11156); - _unicodeCharacterMap.Add("RIGHTWARDS BLACK ARROW", 11157); - _unicodeCharacterMap.Add("THREE D TOP LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD", 11160); - _unicodeCharacterMap.Add("THREE D RIGHT LIGHTED UPWARDS EQUILATERAL ARROWHEAD", 11161); - _unicodeCharacterMap.Add("THREE D TOP LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD", 11162); - _unicodeCharacterMap.Add("THREE D LEFT LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD", 11163); - _unicodeCharacterMap.Add("BLACK LEFTWARDS EQUILATERAL ARROWHEAD", 11164); - _unicodeCharacterMap.Add("BLACK UPWARDS EQUILATERAL ARROWHEAD", 11165); - _unicodeCharacterMap.Add("BLACK RIGHTWARDS EQUILATERAL ARROWHEAD", 11166); - _unicodeCharacterMap.Add("BLACK DOWNWARDS EQUILATERAL ARROWHEAD", 11167); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH LONG TIP LEFTWARDS", 11168); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH LONG TIP RIGHTWARDS", 11169); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH LONG TIP LEFTWARDS", 11170); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH LONG TIP RIGHTWARDS", 11171); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH LONG TIP UPWARDS", 11172); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH LONG TIP UPWARDS", 11173); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH LONG TIP DOWNWARDS", 11174); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH LONG TIP DOWNWARDS", 11175); - _unicodeCharacterMap.Add("BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW", 11176); - _unicodeCharacterMap.Add("BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW", 11177); - _unicodeCharacterMap.Add("BLACK CURVED UPWARDS AND LEFTWARDS ARROW", 11178); - _unicodeCharacterMap.Add("BLACK CURVED UPWARDS AND RIGHTWARDS ARROW", 11179); - _unicodeCharacterMap.Add("BLACK CURVED LEFTWARDS AND UPWARDS ARROW", 11180); - _unicodeCharacterMap.Add("BLACK CURVED RIGHTWARDS AND UPWARDS ARROW", 11181); - _unicodeCharacterMap.Add("BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW", 11182); - _unicodeCharacterMap.Add("BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW", 11183); - _unicodeCharacterMap.Add("RIBBON ARROW DOWN LEFT", 11184); - _unicodeCharacterMap.Add("RIBBON ARROW DOWN RIGHT", 11185); - _unicodeCharacterMap.Add("RIBBON ARROW UP LEFT", 11186); - _unicodeCharacterMap.Add("RIBBON ARROW UP RIGHT", 11187); - _unicodeCharacterMap.Add("RIBBON ARROW LEFT UP", 11188); - _unicodeCharacterMap.Add("RIBBON ARROW RIGHT UP", 11189); - _unicodeCharacterMap.Add("RIBBON ARROW LEFT DOWN", 11190); - _unicodeCharacterMap.Add("RIBBON ARROW RIGHT DOWN", 11191); - _unicodeCharacterMap.Add("UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR", 11192); - _unicodeCharacterMap.Add("UP ARROWHEAD IN A RECTANGLE BOX", 11193); - _unicodeCharacterMap.Add("BALLOT BOX WITH LIGHT X", 11197); - _unicodeCharacterMap.Add("CIRCLED X", 11198); - _unicodeCharacterMap.Add("CIRCLED BOLD X", 11199); - _unicodeCharacterMap.Add("BLACK SQUARE CENTRED", 11200); - _unicodeCharacterMap.Add("BLACK DIAMOND CENTRED", 11201); - _unicodeCharacterMap.Add("TURNED BLACK PENTAGON", 11202); - _unicodeCharacterMap.Add("HORIZONTAL BLACK OCTAGON", 11203); - _unicodeCharacterMap.Add("BLACK OCTAGON", 11204); - _unicodeCharacterMap.Add("BLACK MEDIUM UP POINTING TRIANGLE CENTRED", 11205); - _unicodeCharacterMap.Add("BLACK MEDIUM DOWN POINTING TRIANGLE CENTRED", 11206); - _unicodeCharacterMap.Add("BLACK MEDIUM LEFT POINTING TRIANGLE CENTRED", 11207); - _unicodeCharacterMap.Add("BLACK MEDIUM RIGHT POINTING TRIANGLE CENTRED", 11208); - _unicodeCharacterMap.Add("TOP HALF BLACK CIRCLE", 11210); - _unicodeCharacterMap.Add("BOTTOM HALF BLACK CIRCLE", 11211); - _unicodeCharacterMap.Add("LIGHT FOUR POINTED BLACK CUSP", 11212); - _unicodeCharacterMap.Add("ROTATED LIGHT FOUR POINTED BLACK CUSP", 11213); - _unicodeCharacterMap.Add("WHITE FOUR POINTED CUSP", 11214); - _unicodeCharacterMap.Add("ROTATED WHITE FOUR POINTED CUSP", 11215); - _unicodeCharacterMap.Add("SQUARE POSITION INDICATOR", 11216); - _unicodeCharacterMap.Add("UNCERTAINTY SIGN", 11217); - _unicodeCharacterMap.Add("LEFTWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS", 11244); - _unicodeCharacterMap.Add("UPWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS", 11245); - _unicodeCharacterMap.Add("RIGHTWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS", 11246); - _unicodeCharacterMap.Add("DOWNWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS", 11247); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER AZU", 11264); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER BUKY", 11265); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER VEDE", 11266); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER GLAGOLI", 11267); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER DOBRO", 11268); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER YESTU", 11269); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER ZHIVETE", 11270); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER DZELO", 11271); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER ZEMLJA", 11272); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER IZHE", 11273); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER INITIAL IZHE", 11274); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER I", 11275); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER DJERVI", 11276); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER KAKO", 11277); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER LJUDIJE", 11278); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER MYSLITE", 11279); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER NASHI", 11280); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER ONU", 11281); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER POKOJI", 11282); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER RITSI", 11283); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER SLOVO", 11284); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER TVRIDO", 11285); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER UKU", 11286); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER FRITU", 11287); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER HERU", 11288); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER OTU", 11289); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER PE", 11290); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER SHTA", 11291); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER TSI", 11292); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER CHRIVI", 11293); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER SHA", 11294); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER YERU", 11295); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER YERI", 11296); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER YATI", 11297); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER SPIDERY HA", 11298); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER YU", 11299); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER SMALL YUS", 11300); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL", 11301); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER YO", 11302); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS", 11303); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER BIG YUS", 11304); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS", 11305); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER FITA", 11306); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER IZHITSA", 11307); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER SHTAPIC", 11308); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER TROKUTASTI A", 11309); - _unicodeCharacterMap.Add("GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE", 11310); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER AZU", 11312); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER BUKY", 11313); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER VEDE", 11314); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER GLAGOLI", 11315); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER DOBRO", 11316); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER YESTU", 11317); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER ZHIVETE", 11318); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER DZELO", 11319); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER ZEMLJA", 11320); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER IZHE", 11321); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER INITIAL IZHE", 11322); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER I", 11323); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER DJERVI", 11324); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER KAKO", 11325); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER LJUDIJE", 11326); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER MYSLITE", 11327); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER NASHI", 11328); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER ONU", 11329); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER POKOJI", 11330); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER RITSI", 11331); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER SLOVO", 11332); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER TVRIDO", 11333); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER UKU", 11334); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER FRITU", 11335); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER HERU", 11336); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER OTU", 11337); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER PE", 11338); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER SHTA", 11339); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER TSI", 11340); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER CHRIVI", 11341); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER SHA", 11342); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER YERU", 11343); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER YERI", 11344); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER YATI", 11345); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER SPIDERY HA", 11346); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER YU", 11347); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER SMALL YUS", 11348); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL", 11349); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER YO", 11350); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER IOTATED SMALL YUS", 11351); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER BIG YUS", 11352); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER IOTATED BIG YUS", 11353); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER FITA", 11354); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER IZHITSA", 11355); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER SHTAPIC", 11356); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER TROKUTASTI A", 11357); - _unicodeCharacterMap.Add("GLAGOLITIC SMALL LETTER LATINATE MYSLITE", 11358); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH DOUBLE BAR", 11360); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH DOUBLE BAR", 11361); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH MIDDLE TILDE", 11362); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P WITH STROKE", 11363); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH TAIL", 11364); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A WITH STROKE", 11365); - _unicodeCharacterMap.Add("LATIN SMALL LETTER T WITH DIAGONAL STROKE", 11366); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH DESCENDER", 11367); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH DESCENDER", 11368); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH DESCENDER", 11369); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH DESCENDER", 11370); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH DESCENDER", 11371); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Z WITH DESCENDER", 11372); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER ALPHA", 11373); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER M WITH HOOK", 11374); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED A", 11375); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED ALPHA", 11376); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V WITH RIGHT HOOK", 11377); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER W WITH HOOK", 11378); - _unicodeCharacterMap.Add("LATIN SMALL LETTER W WITH HOOK", 11379); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V WITH CURL", 11380); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER HALF H", 11381); - _unicodeCharacterMap.Add("LATIN SMALL LETTER HALF H", 11382); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TAILLESS PHI", 11383); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH NOTCH", 11384); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED R WITH TAIL", 11385); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH LOW RING INSIDE", 11386); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL TURNED E", 11387); - _unicodeCharacterMap.Add("LATIN SUBSCRIPT SMALL LETTER J", 11388); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL V", 11389); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH SWASH TAIL", 11390); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Z WITH SWASH TAIL", 11391); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER ALFA", 11392); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER ALFA", 11393); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER VIDA", 11394); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER VIDA", 11395); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER GAMMA", 11396); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER GAMMA", 11397); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER DALDA", 11398); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER DALDA", 11399); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER EIE", 11400); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER EIE", 11401); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER SOU", 11402); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER SOU", 11403); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER ZATA", 11404); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER ZATA", 11405); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER HATE", 11406); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER HATE", 11407); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER THETHE", 11408); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER THETHE", 11409); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER IAUDA", 11410); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER IAUDA", 11411); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER KAPA", 11412); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER KAPA", 11413); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER LAULA", 11414); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER LAULA", 11415); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER MI", 11416); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER MI", 11417); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER NI", 11418); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER NI", 11419); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER KSI", 11420); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER KSI", 11421); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER O", 11422); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER O", 11423); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER PI", 11424); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER PI", 11425); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER RO", 11426); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER RO", 11427); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER SIMA", 11428); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER SIMA", 11429); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER TAU", 11430); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER TAU", 11431); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER UA", 11432); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER UA", 11433); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER FI", 11434); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER FI", 11435); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER KHI", 11436); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER KHI", 11437); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER PSI", 11438); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER PSI", 11439); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OOU", 11440); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OOU", 11441); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER DIALECT P ALEF", 11442); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER DIALECT P ALEF", 11443); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC AIN", 11444); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC AIN", 11445); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE", 11446); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER CRYPTOGRAMMIC EIE", 11447); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER DIALECT P KAPA", 11448); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER DIALECT P KAPA", 11449); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER DIALECT P NI", 11450); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER DIALECT P NI", 11451); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI", 11452); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER CRYPTOGRAMMIC NI", 11453); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC OOU", 11454); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC OOU", 11455); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER SAMPI", 11456); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER SAMPI", 11457); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER CROSSED SHEI", 11458); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER CROSSED SHEI", 11459); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC SHEI", 11460); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC SHEI", 11461); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC ESH", 11462); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC ESH", 11463); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER AKHMIMIC KHEI", 11464); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER AKHMIMIC KHEI", 11465); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER DIALECT P HORI", 11466); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER DIALECT P HORI", 11467); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC HORI", 11468); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC HORI", 11469); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC HA", 11470); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC HA", 11471); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER L SHAPED HA", 11472); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER L SHAPED HA", 11473); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC HEI", 11474); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC HEI", 11475); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC HAT", 11476); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC HAT", 11477); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC GANGIA", 11478); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC GANGIA", 11479); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC DJA", 11480); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC DJA", 11481); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD COPTIC SHIMA", 11482); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD COPTIC SHIMA", 11483); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD NUBIAN SHIMA", 11484); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD NUBIAN SHIMA", 11485); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD NUBIAN NGI", 11486); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD NUBIAN NGI", 11487); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD NUBIAN NYI", 11488); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD NUBIAN NYI", 11489); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER OLD NUBIAN WAU", 11490); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER OLD NUBIAN WAU", 11491); - _unicodeCharacterMap.Add("COPTIC SYMBOL KAI", 11492); - _unicodeCharacterMap.Add("COPTIC SYMBOL MI RO", 11493); - _unicodeCharacterMap.Add("COPTIC SYMBOL PI RO", 11494); - _unicodeCharacterMap.Add("COPTIC SYMBOL STAUROS", 11495); - _unicodeCharacterMap.Add("COPTIC SYMBOL TAU RO", 11496); - _unicodeCharacterMap.Add("COPTIC SYMBOL KHI RO", 11497); - _unicodeCharacterMap.Add("COPTIC SYMBOL SHIMA SIMA", 11498); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI", 11499); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI", 11500); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA", 11501); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA", 11502); - _unicodeCharacterMap.Add("COPTIC COMBINING NI ABOVE", 11503); - _unicodeCharacterMap.Add("COPTIC COMBINING SPIRITUS ASPER", 11504); - _unicodeCharacterMap.Add("COPTIC COMBINING SPIRITUS LENIS", 11505); - _unicodeCharacterMap.Add("COPTIC CAPITAL LETTER BOHAIRIC KHEI", 11506); - _unicodeCharacterMap.Add("COPTIC SMALL LETTER BOHAIRIC KHEI", 11507); - _unicodeCharacterMap.Add("COPTIC OLD NUBIAN FULL STOP", 11513); - _unicodeCharacterMap.Add("COPTIC OLD NUBIAN DIRECT QUESTION MARK", 11514); - _unicodeCharacterMap.Add("COPTIC OLD NUBIAN INDIRECT QUESTION MARK", 11515); - _unicodeCharacterMap.Add("COPTIC OLD NUBIAN VERSE DIVIDER", 11516); - _unicodeCharacterMap.Add("COPTIC FRACTION ONE HALF", 11517); - _unicodeCharacterMap.Add("COPTIC FULL STOP", 11518); - _unicodeCharacterMap.Add("COPTIC MORPHOLOGICAL DIVIDER", 11519); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER AN", 11520); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER BAN", 11521); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER GAN", 11522); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER DON", 11523); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER EN", 11524); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER VIN", 11525); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER ZEN", 11526); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER TAN", 11527); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER IN", 11528); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER KAN", 11529); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER LAS", 11530); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER MAN", 11531); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER NAR", 11532); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER ON", 11533); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER PAR", 11534); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER ZHAR", 11535); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER RAE", 11536); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER SAN", 11537); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER TAR", 11538); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER UN", 11539); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER PHAR", 11540); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER KHAR", 11541); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER GHAN", 11542); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER QAR", 11543); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER SHIN", 11544); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER CHIN", 11545); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER CAN", 11546); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER JIL", 11547); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER CIL", 11548); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER CHAR", 11549); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER XAN", 11550); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER JHAN", 11551); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER HAE", 11552); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER HE", 11553); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER HIE", 11554); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER WE", 11555); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER HAR", 11556); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER HOE", 11557); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER YN", 11559); - _unicodeCharacterMap.Add("GEORGIAN SMALL LETTER AEN", 11565); - _unicodeCharacterMap.Add("TIFINAGH LETTER YA", 11568); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAB", 11569); - _unicodeCharacterMap.Add("TIFINAGH LETTER YABH", 11570); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAG", 11571); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAGHH", 11572); - _unicodeCharacterMap.Add("TIFINAGH LETTER BERBER ACADEMY YAJ", 11573); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAJ", 11574); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAD", 11575); - _unicodeCharacterMap.Add("TIFINAGH LETTER YADH", 11576); - _unicodeCharacterMap.Add("TIFINAGH LETTER YADD", 11577); - _unicodeCharacterMap.Add("TIFINAGH LETTER YADDH", 11578); - _unicodeCharacterMap.Add("TIFINAGH LETTER YEY", 11579); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAF", 11580); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAK", 11581); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YAK", 11582); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAKHH", 11583); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAH", 11584); - _unicodeCharacterMap.Add("TIFINAGH LETTER BERBER ACADEMY YAH", 11585); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YAH", 11586); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAHH", 11587); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAA", 11588); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAKH", 11589); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YAKH", 11590); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAQ", 11591); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YAQ", 11592); - _unicodeCharacterMap.Add("TIFINAGH LETTER YI", 11593); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAZH", 11594); - _unicodeCharacterMap.Add("TIFINAGH LETTER AHAGGAR YAZH", 11595); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YAZH", 11596); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAL", 11597); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAM", 11598); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAN", 11599); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YAGN", 11600); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YANG", 11601); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAP", 11602); - _unicodeCharacterMap.Add("TIFINAGH LETTER YU", 11603); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAR", 11604); - _unicodeCharacterMap.Add("TIFINAGH LETTER YARR", 11605); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAGH", 11606); - _unicodeCharacterMap.Add("TIFINAGH LETTER TUAREG YAGH", 11607); - _unicodeCharacterMap.Add("TIFINAGH LETTER AYER YAGH", 11608); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAS", 11609); - _unicodeCharacterMap.Add("TIFINAGH LETTER YASS", 11610); - _unicodeCharacterMap.Add("TIFINAGH LETTER YASH", 11611); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAT", 11612); - _unicodeCharacterMap.Add("TIFINAGH LETTER YATH", 11613); - _unicodeCharacterMap.Add("TIFINAGH LETTER YACH", 11614); - _unicodeCharacterMap.Add("TIFINAGH LETTER YATT", 11615); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAV", 11616); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAW", 11617); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAY", 11618); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAZ", 11619); - _unicodeCharacterMap.Add("TIFINAGH LETTER TAWELLEMET YAZ", 11620); - _unicodeCharacterMap.Add("TIFINAGH LETTER YAZZ", 11621); - _unicodeCharacterMap.Add("TIFINAGH LETTER YE", 11622); - _unicodeCharacterMap.Add("TIFINAGH LETTER YO", 11623); - _unicodeCharacterMap.Add("TIFINAGH MODIFIER LETTER LABIALIZATION MARK", 11631); - _unicodeCharacterMap.Add("TIFINAGH SEPARATOR MARK", 11632); - _unicodeCharacterMap.Add("TIFINAGH CONSONANT JOINER", 11647); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE LOA", 11648); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE MOA", 11649); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ROA", 11650); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SOA", 11651); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SHOA", 11652); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BOA", 11653); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TOA", 11654); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE COA", 11655); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NOA", 11656); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE NYOA", 11657); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GLOTTAL OA", 11658); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZOA", 11659); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DOA", 11660); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDOA", 11661); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE JOA", 11662); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE THOA", 11663); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CHOA", 11664); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE PHOA", 11665); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE POA", 11666); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGWA", 11667); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGWI", 11668); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGWEE", 11669); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GGWE", 11670); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SSA", 11680); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SSU", 11681); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SSI", 11682); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SSAA", 11683); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SSEE", 11684); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SSE", 11685); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE SSO", 11686); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCA", 11688); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCU", 11689); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCI", 11690); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCAA", 11691); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCEE", 11692); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCE", 11693); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCO", 11694); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZZA", 11696); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZZU", 11697); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZZI", 11698); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZZAA", 11699); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZZEE", 11700); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZZE", 11701); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE ZZO", 11702); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHA", 11704); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHU", 11705); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHI", 11706); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHAA", 11707); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHEE", 11708); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHE", 11709); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHO", 11710); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QYA", 11712); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QYU", 11713); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QYI", 11714); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QYAA", 11715); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QYEE", 11716); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QYE", 11717); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE QYO", 11718); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KYA", 11720); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KYU", 11721); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KYI", 11722); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KYAA", 11723); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KYEE", 11724); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KYE", 11725); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE KYO", 11726); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XYA", 11728); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XYU", 11729); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XYI", 11730); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XYAA", 11731); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XYEE", 11732); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XYE", 11733); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE XYO", 11734); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GYA", 11736); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GYU", 11737); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GYI", 11738); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GYAA", 11739); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GYEE", 11740); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GYE", 11741); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE GYO", 11742); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER BE", 11744); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER VE", 11745); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER GHE", 11746); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER DE", 11747); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER ZHE", 11748); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER ZE", 11749); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER KA", 11750); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER EL", 11751); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER EM", 11752); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER EN", 11753); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER O", 11754); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER PE", 11755); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER ER", 11756); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER ES", 11757); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER TE", 11758); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER HA", 11759); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER TSE", 11760); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER CHE", 11761); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER SHA", 11762); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER SHCHA", 11763); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER FITA", 11764); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER ES TE", 11765); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER A", 11766); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER IE", 11767); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER DJERV", 11768); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER MONOGRAPH UK", 11769); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER YAT", 11770); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER YU", 11771); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER IOTIFIED A", 11772); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER LITTLE YUS", 11773); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER BIG YUS", 11774); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER IOTIFIED BIG YUS", 11775); - _unicodeCharacterMap.Add("RIGHT ANGLE SUBSTITUTION MARKER", 11776); - _unicodeCharacterMap.Add("RIGHT ANGLE DOTTED SUBSTITUTION MARKER", 11777); - _unicodeCharacterMap.Add("LEFT SUBSTITUTION BRACKET", 11778); - _unicodeCharacterMap.Add("RIGHT SUBSTITUTION BRACKET", 11779); - _unicodeCharacterMap.Add("LEFT DOTTED SUBSTITUTION BRACKET", 11780); - _unicodeCharacterMap.Add("RIGHT DOTTED SUBSTITUTION BRACKET", 11781); - _unicodeCharacterMap.Add("RAISED INTERPOLATION MARKER", 11782); - _unicodeCharacterMap.Add("RAISED DOTTED INTERPOLATION MARKER", 11783); - _unicodeCharacterMap.Add("DOTTED TRANSPOSITION MARKER", 11784); - _unicodeCharacterMap.Add("LEFT TRANSPOSITION BRACKET", 11785); - _unicodeCharacterMap.Add("RIGHT TRANSPOSITION BRACKET", 11786); - _unicodeCharacterMap.Add("RAISED SQUARE", 11787); - _unicodeCharacterMap.Add("LEFT RAISED OMISSION BRACKET", 11788); - _unicodeCharacterMap.Add("RIGHT RAISED OMISSION BRACKET", 11789); - _unicodeCharacterMap.Add("EDITORIAL CORONIS", 11790); - _unicodeCharacterMap.Add("PARAGRAPHOS", 11791); - _unicodeCharacterMap.Add("FORKED PARAGRAPHOS", 11792); - _unicodeCharacterMap.Add("REVERSED FORKED PARAGRAPHOS", 11793); - _unicodeCharacterMap.Add("HYPODIASTOLE", 11794); - _unicodeCharacterMap.Add("DOTTED OBELOS", 11795); - _unicodeCharacterMap.Add("DOWNWARDS ANCORA", 11796); - _unicodeCharacterMap.Add("UPWARDS ANCORA", 11797); - _unicodeCharacterMap.Add("DOTTED RIGHT POINTING ANGLE", 11798); - _unicodeCharacterMap.Add("DOUBLE OBLIQUE HYPHEN", 11799); - _unicodeCharacterMap.Add("INVERTED INTERROBANG", 11800); - _unicodeCharacterMap.Add("PALM BRANCH", 11801); - _unicodeCharacterMap.Add("HYPHEN WITH DIAERESIS", 11802); - _unicodeCharacterMap.Add("TILDE WITH RING ABOVE", 11803); - _unicodeCharacterMap.Add("LEFT LOW PARAPHRASE BRACKET", 11804); - _unicodeCharacterMap.Add("RIGHT LOW PARAPHRASE BRACKET", 11805); - _unicodeCharacterMap.Add("TILDE WITH DOT ABOVE", 11806); - _unicodeCharacterMap.Add("TILDE WITH DOT BELOW", 11807); - _unicodeCharacterMap.Add("LEFT VERTICAL BAR WITH QUILL", 11808); - _unicodeCharacterMap.Add("RIGHT VERTICAL BAR WITH QUILL", 11809); - _unicodeCharacterMap.Add("TOP LEFT HALF BRACKET", 11810); - _unicodeCharacterMap.Add("TOP RIGHT HALF BRACKET", 11811); - _unicodeCharacterMap.Add("BOTTOM LEFT HALF BRACKET", 11812); - _unicodeCharacterMap.Add("BOTTOM RIGHT HALF BRACKET", 11813); - _unicodeCharacterMap.Add("LEFT SIDEWAYS U BRACKET", 11814); - _unicodeCharacterMap.Add("RIGHT SIDEWAYS U BRACKET", 11815); - _unicodeCharacterMap.Add("LEFT DOUBLE PARENTHESIS", 11816); - _unicodeCharacterMap.Add("RIGHT DOUBLE PARENTHESIS", 11817); - _unicodeCharacterMap.Add("TWO DOTS OVER ONE DOT PUNCTUATION", 11818); - _unicodeCharacterMap.Add("ONE DOT OVER TWO DOTS PUNCTUATION", 11819); - _unicodeCharacterMap.Add("SQUARED FOUR DOT PUNCTUATION", 11820); - _unicodeCharacterMap.Add("FIVE DOT MARK", 11821); - _unicodeCharacterMap.Add("REVERSED QUESTION MARK", 11822); - _unicodeCharacterMap.Add("VERTICAL TILDE", 11823); - _unicodeCharacterMap.Add("RING POINT", 11824); - _unicodeCharacterMap.Add("WORD SEPARATOR MIDDLE DOT", 11825); - _unicodeCharacterMap.Add("TURNED COMMA", 11826); - _unicodeCharacterMap.Add("RAISED DOT", 11827); - _unicodeCharacterMap.Add("RAISED COMMA", 11828); - _unicodeCharacterMap.Add("TURNED SEMICOLON", 11829); - _unicodeCharacterMap.Add("DAGGER WITH LEFT GUARD", 11830); - _unicodeCharacterMap.Add("DAGGER WITH RIGHT GUARD", 11831); - _unicodeCharacterMap.Add("TURNED DAGGER", 11832); - _unicodeCharacterMap.Add("TOP HALF SECTION SIGN", 11833); - _unicodeCharacterMap.Add("TWO EM DASH", 11834); - _unicodeCharacterMap.Add("THREE EM DASH", 11835); - _unicodeCharacterMap.Add("STENOGRAPHIC FULL STOP", 11836); - _unicodeCharacterMap.Add("VERTICAL SIX DOTS", 11837); - _unicodeCharacterMap.Add("WIGGLY VERTICAL LINE", 11838); - _unicodeCharacterMap.Add("CAPITULUM", 11839); - _unicodeCharacterMap.Add("DOUBLE HYPHEN", 11840); - _unicodeCharacterMap.Add("REVERSED COMMA", 11841); - _unicodeCharacterMap.Add("DOUBLE LOW REVERSED 9 QUOTATION MARK", 11842); - _unicodeCharacterMap.Add("DASH WITH LEFT UPTURN", 11843); - _unicodeCharacterMap.Add("DOUBLE SUSPENSION MARK", 11844); - _unicodeCharacterMap.Add("CJK RADICAL REPEAT", 11904); - _unicodeCharacterMap.Add("CJK RADICAL CLIFF", 11905); - _unicodeCharacterMap.Add("CJK RADICAL SECOND ONE", 11906); - _unicodeCharacterMap.Add("CJK RADICAL SECOND TWO", 11907); - _unicodeCharacterMap.Add("CJK RADICAL SECOND THREE", 11908); - _unicodeCharacterMap.Add("CJK RADICAL PERSON", 11909); - _unicodeCharacterMap.Add("CJK RADICAL BOX", 11910); - _unicodeCharacterMap.Add("CJK RADICAL TABLE", 11911); - _unicodeCharacterMap.Add("CJK RADICAL KNIFE ONE", 11912); - _unicodeCharacterMap.Add("CJK RADICAL KNIFE TWO", 11913); - _unicodeCharacterMap.Add("CJK RADICAL DIVINATION", 11914); - _unicodeCharacterMap.Add("CJK RADICAL SEAL", 11915); - _unicodeCharacterMap.Add("CJK RADICAL SMALL ONE", 11916); - _unicodeCharacterMap.Add("CJK RADICAL SMALL TWO", 11917); - _unicodeCharacterMap.Add("CJK RADICAL LAME ONE", 11918); - _unicodeCharacterMap.Add("CJK RADICAL LAME TWO", 11919); - _unicodeCharacterMap.Add("CJK RADICAL LAME THREE", 11920); - _unicodeCharacterMap.Add("CJK RADICAL LAME FOUR", 11921); - _unicodeCharacterMap.Add("CJK RADICAL SNAKE", 11922); - _unicodeCharacterMap.Add("CJK RADICAL THREAD", 11923); - _unicodeCharacterMap.Add("CJK RADICAL SNOUT ONE", 11924); - _unicodeCharacterMap.Add("CJK RADICAL SNOUT TWO", 11925); - _unicodeCharacterMap.Add("CJK RADICAL HEART ONE", 11926); - _unicodeCharacterMap.Add("CJK RADICAL HEART TWO", 11927); - _unicodeCharacterMap.Add("CJK RADICAL HAND", 11928); - _unicodeCharacterMap.Add("CJK RADICAL RAP", 11929); - _unicodeCharacterMap.Add("CJK RADICAL CHOKE", 11931); - _unicodeCharacterMap.Add("CJK RADICAL SUN", 11932); - _unicodeCharacterMap.Add("CJK RADICAL MOON", 11933); - _unicodeCharacterMap.Add("CJK RADICAL DEATH", 11934); - _unicodeCharacterMap.Add("CJK RADICAL MOTHER", 11935); - _unicodeCharacterMap.Add("CJK RADICAL CIVILIAN", 11936); - _unicodeCharacterMap.Add("CJK RADICAL WATER ONE", 11937); - _unicodeCharacterMap.Add("CJK RADICAL WATER TWO", 11938); - _unicodeCharacterMap.Add("CJK RADICAL FIRE", 11939); - _unicodeCharacterMap.Add("CJK RADICAL PAW ONE", 11940); - _unicodeCharacterMap.Add("CJK RADICAL PAW TWO", 11941); - _unicodeCharacterMap.Add("CJK RADICAL SIMPLIFIED HALF TREE TRUNK", 11942); - _unicodeCharacterMap.Add("CJK RADICAL COW", 11943); - _unicodeCharacterMap.Add("CJK RADICAL DOG", 11944); - _unicodeCharacterMap.Add("CJK RADICAL JADE", 11945); - _unicodeCharacterMap.Add("CJK RADICAL BOLT OF CLOTH", 11946); - _unicodeCharacterMap.Add("CJK RADICAL EYE", 11947); - _unicodeCharacterMap.Add("CJK RADICAL SPIRIT ONE", 11948); - _unicodeCharacterMap.Add("CJK RADICAL SPIRIT TWO", 11949); - _unicodeCharacterMap.Add("CJK RADICAL BAMBOO", 11950); - _unicodeCharacterMap.Add("CJK RADICAL SILK", 11951); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED SILK", 11952); - _unicodeCharacterMap.Add("CJK RADICAL NET ONE", 11953); - _unicodeCharacterMap.Add("CJK RADICAL NET TWO", 11954); - _unicodeCharacterMap.Add("CJK RADICAL NET THREE", 11955); - _unicodeCharacterMap.Add("CJK RADICAL NET FOUR", 11956); - _unicodeCharacterMap.Add("CJK RADICAL MESH", 11957); - _unicodeCharacterMap.Add("CJK RADICAL SHEEP", 11958); - _unicodeCharacterMap.Add("CJK RADICAL RAM", 11959); - _unicodeCharacterMap.Add("CJK RADICAL EWE", 11960); - _unicodeCharacterMap.Add("CJK RADICAL OLD", 11961); - _unicodeCharacterMap.Add("CJK RADICAL BRUSH ONE", 11962); - _unicodeCharacterMap.Add("CJK RADICAL BRUSH TWO", 11963); - _unicodeCharacterMap.Add("CJK RADICAL MEAT", 11964); - _unicodeCharacterMap.Add("CJK RADICAL MORTAR", 11965); - _unicodeCharacterMap.Add("CJK RADICAL GRASS ONE", 11966); - _unicodeCharacterMap.Add("CJK RADICAL GRASS TWO", 11967); - _unicodeCharacterMap.Add("CJK RADICAL GRASS THREE", 11968); - _unicodeCharacterMap.Add("CJK RADICAL TIGER", 11969); - _unicodeCharacterMap.Add("CJK RADICAL CLOTHES", 11970); - _unicodeCharacterMap.Add("CJK RADICAL WEST ONE", 11971); - _unicodeCharacterMap.Add("CJK RADICAL WEST TWO", 11972); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED SEE", 11973); - _unicodeCharacterMap.Add("CJK RADICAL SIMPLIFIED HORN", 11974); - _unicodeCharacterMap.Add("CJK RADICAL HORN", 11975); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED SPEECH", 11976); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED SHELL", 11977); - _unicodeCharacterMap.Add("CJK RADICAL FOOT", 11978); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED CART", 11979); - _unicodeCharacterMap.Add("CJK RADICAL SIMPLIFIED WALK", 11980); - _unicodeCharacterMap.Add("CJK RADICAL WALK ONE", 11981); - _unicodeCharacterMap.Add("CJK RADICAL WALK TWO", 11982); - _unicodeCharacterMap.Add("CJK RADICAL CITY", 11983); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED GOLD", 11984); - _unicodeCharacterMap.Add("CJK RADICAL LONG ONE", 11985); - _unicodeCharacterMap.Add("CJK RADICAL LONG TWO", 11986); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED LONG", 11987); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED GATE", 11988); - _unicodeCharacterMap.Add("CJK RADICAL MOUND ONE", 11989); - _unicodeCharacterMap.Add("CJK RADICAL MOUND TWO", 11990); - _unicodeCharacterMap.Add("CJK RADICAL RAIN", 11991); - _unicodeCharacterMap.Add("CJK RADICAL BLUE", 11992); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED TANNED LEATHER", 11993); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED LEAF", 11994); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED WIND", 11995); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED FLY", 11996); - _unicodeCharacterMap.Add("CJK RADICAL EAT ONE", 11997); - _unicodeCharacterMap.Add("CJK RADICAL EAT TWO", 11998); - _unicodeCharacterMap.Add("CJK RADICAL EAT THREE", 11999); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED EAT", 12000); - _unicodeCharacterMap.Add("CJK RADICAL HEAD", 12001); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED HORSE", 12002); - _unicodeCharacterMap.Add("CJK RADICAL BONE", 12003); - _unicodeCharacterMap.Add("CJK RADICAL GHOST", 12004); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED FISH", 12005); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED BIRD", 12006); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED SALT", 12007); - _unicodeCharacterMap.Add("CJK RADICAL SIMPLIFIED WHEAT", 12008); - _unicodeCharacterMap.Add("CJK RADICAL SIMPLIFIED YELLOW", 12009); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED FROG", 12010); - _unicodeCharacterMap.Add("CJK RADICAL J SIMPLIFIED EVEN", 12011); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED EVEN", 12012); - _unicodeCharacterMap.Add("CJK RADICAL J SIMPLIFIED TOOTH", 12013); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED TOOTH", 12014); - _unicodeCharacterMap.Add("CJK RADICAL J SIMPLIFIED DRAGON", 12015); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED DRAGON", 12016); - _unicodeCharacterMap.Add("CJK RADICAL TURTLE", 12017); - _unicodeCharacterMap.Add("CJK RADICAL J SIMPLIFIED TURTLE", 12018); - _unicodeCharacterMap.Add("CJK RADICAL C SIMPLIFIED TURTLE", 12019); - _unicodeCharacterMap.Add("KANGXI RADICAL ONE", 12032); - _unicodeCharacterMap.Add("KANGXI RADICAL LINE", 12033); - _unicodeCharacterMap.Add("KANGXI RADICAL DOT", 12034); - _unicodeCharacterMap.Add("KANGXI RADICAL SLASH", 12035); - _unicodeCharacterMap.Add("KANGXI RADICAL SECOND", 12036); - _unicodeCharacterMap.Add("KANGXI RADICAL HOOK", 12037); - _unicodeCharacterMap.Add("KANGXI RADICAL TWO", 12038); - _unicodeCharacterMap.Add("KANGXI RADICAL LID", 12039); - _unicodeCharacterMap.Add("KANGXI RADICAL MAN", 12040); - _unicodeCharacterMap.Add("KANGXI RADICAL LEGS", 12041); - _unicodeCharacterMap.Add("KANGXI RADICAL ENTER", 12042); - _unicodeCharacterMap.Add("KANGXI RADICAL EIGHT", 12043); - _unicodeCharacterMap.Add("KANGXI RADICAL DOWN BOX", 12044); - _unicodeCharacterMap.Add("KANGXI RADICAL COVER", 12045); - _unicodeCharacterMap.Add("KANGXI RADICAL ICE", 12046); - _unicodeCharacterMap.Add("KANGXI RADICAL TABLE", 12047); - _unicodeCharacterMap.Add("KANGXI RADICAL OPEN BOX", 12048); - _unicodeCharacterMap.Add("KANGXI RADICAL KNIFE", 12049); - _unicodeCharacterMap.Add("KANGXI RADICAL POWER", 12050); - _unicodeCharacterMap.Add("KANGXI RADICAL WRAP", 12051); - _unicodeCharacterMap.Add("KANGXI RADICAL SPOON", 12052); - _unicodeCharacterMap.Add("KANGXI RADICAL RIGHT OPEN BOX", 12053); - _unicodeCharacterMap.Add("KANGXI RADICAL HIDING ENCLOSURE", 12054); - _unicodeCharacterMap.Add("KANGXI RADICAL TEN", 12055); - _unicodeCharacterMap.Add("KANGXI RADICAL DIVINATION", 12056); - _unicodeCharacterMap.Add("KANGXI RADICAL SEAL", 12057); - _unicodeCharacterMap.Add("KANGXI RADICAL CLIFF", 12058); - _unicodeCharacterMap.Add("KANGXI RADICAL PRIVATE", 12059); - _unicodeCharacterMap.Add("KANGXI RADICAL AGAIN", 12060); - _unicodeCharacterMap.Add("KANGXI RADICAL MOUTH", 12061); - _unicodeCharacterMap.Add("KANGXI RADICAL ENCLOSURE", 12062); - _unicodeCharacterMap.Add("KANGXI RADICAL EARTH", 12063); - _unicodeCharacterMap.Add("KANGXI RADICAL SCHOLAR", 12064); - _unicodeCharacterMap.Add("KANGXI RADICAL GO", 12065); - _unicodeCharacterMap.Add("KANGXI RADICAL GO SLOWLY", 12066); - _unicodeCharacterMap.Add("KANGXI RADICAL EVENING", 12067); - _unicodeCharacterMap.Add("KANGXI RADICAL BIG", 12068); - _unicodeCharacterMap.Add("KANGXI RADICAL WOMAN", 12069); - _unicodeCharacterMap.Add("KANGXI RADICAL CHILD", 12070); - _unicodeCharacterMap.Add("KANGXI RADICAL ROOF", 12071); - _unicodeCharacterMap.Add("KANGXI RADICAL INCH", 12072); - _unicodeCharacterMap.Add("KANGXI RADICAL SMALL", 12073); - _unicodeCharacterMap.Add("KANGXI RADICAL LAME", 12074); - _unicodeCharacterMap.Add("KANGXI RADICAL CORPSE", 12075); - _unicodeCharacterMap.Add("KANGXI RADICAL SPROUT", 12076); - _unicodeCharacterMap.Add("KANGXI RADICAL MOUNTAIN", 12077); - _unicodeCharacterMap.Add("KANGXI RADICAL RIVER", 12078); - _unicodeCharacterMap.Add("KANGXI RADICAL WORK", 12079); - _unicodeCharacterMap.Add("KANGXI RADICAL ONESELF", 12080); - _unicodeCharacterMap.Add("KANGXI RADICAL TURBAN", 12081); - _unicodeCharacterMap.Add("KANGXI RADICAL DRY", 12082); - _unicodeCharacterMap.Add("KANGXI RADICAL SHORT THREAD", 12083); - _unicodeCharacterMap.Add("KANGXI RADICAL DOTTED CLIFF", 12084); - _unicodeCharacterMap.Add("KANGXI RADICAL LONG STRIDE", 12085); - _unicodeCharacterMap.Add("KANGXI RADICAL TWO HANDS", 12086); - _unicodeCharacterMap.Add("KANGXI RADICAL SHOOT", 12087); - _unicodeCharacterMap.Add("KANGXI RADICAL BOW", 12088); - _unicodeCharacterMap.Add("KANGXI RADICAL SNOUT", 12089); - _unicodeCharacterMap.Add("KANGXI RADICAL BRISTLE", 12090); - _unicodeCharacterMap.Add("KANGXI RADICAL STEP", 12091); - _unicodeCharacterMap.Add("KANGXI RADICAL HEART", 12092); - _unicodeCharacterMap.Add("KANGXI RADICAL HALBERD", 12093); - _unicodeCharacterMap.Add("KANGXI RADICAL DOOR", 12094); - _unicodeCharacterMap.Add("KANGXI RADICAL HAND", 12095); - _unicodeCharacterMap.Add("KANGXI RADICAL BRANCH", 12096); - _unicodeCharacterMap.Add("KANGXI RADICAL RAP", 12097); - _unicodeCharacterMap.Add("KANGXI RADICAL SCRIPT", 12098); - _unicodeCharacterMap.Add("KANGXI RADICAL DIPPER", 12099); - _unicodeCharacterMap.Add("KANGXI RADICAL AXE", 12100); - _unicodeCharacterMap.Add("KANGXI RADICAL SQUARE", 12101); - _unicodeCharacterMap.Add("KANGXI RADICAL NOT", 12102); - _unicodeCharacterMap.Add("KANGXI RADICAL SUN", 12103); - _unicodeCharacterMap.Add("KANGXI RADICAL SAY", 12104); - _unicodeCharacterMap.Add("KANGXI RADICAL MOON", 12105); - _unicodeCharacterMap.Add("KANGXI RADICAL TREE", 12106); - _unicodeCharacterMap.Add("KANGXI RADICAL LACK", 12107); - _unicodeCharacterMap.Add("KANGXI RADICAL STOP", 12108); - _unicodeCharacterMap.Add("KANGXI RADICAL DEATH", 12109); - _unicodeCharacterMap.Add("KANGXI RADICAL WEAPON", 12110); - _unicodeCharacterMap.Add("KANGXI RADICAL DO NOT", 12111); - _unicodeCharacterMap.Add("KANGXI RADICAL COMPARE", 12112); - _unicodeCharacterMap.Add("KANGXI RADICAL FUR", 12113); - _unicodeCharacterMap.Add("KANGXI RADICAL CLAN", 12114); - _unicodeCharacterMap.Add("KANGXI RADICAL STEAM", 12115); - _unicodeCharacterMap.Add("KANGXI RADICAL WATER", 12116); - _unicodeCharacterMap.Add("KANGXI RADICAL FIRE", 12117); - _unicodeCharacterMap.Add("KANGXI RADICAL CLAW", 12118); - _unicodeCharacterMap.Add("KANGXI RADICAL FATHER", 12119); - _unicodeCharacterMap.Add("KANGXI RADICAL DOUBLE X", 12120); - _unicodeCharacterMap.Add("KANGXI RADICAL HALF TREE TRUNK", 12121); - _unicodeCharacterMap.Add("KANGXI RADICAL SLICE", 12122); - _unicodeCharacterMap.Add("KANGXI RADICAL FANG", 12123); - _unicodeCharacterMap.Add("KANGXI RADICAL COW", 12124); - _unicodeCharacterMap.Add("KANGXI RADICAL DOG", 12125); - _unicodeCharacterMap.Add("KANGXI RADICAL PROFOUND", 12126); - _unicodeCharacterMap.Add("KANGXI RADICAL JADE", 12127); - _unicodeCharacterMap.Add("KANGXI RADICAL MELON", 12128); - _unicodeCharacterMap.Add("KANGXI RADICAL TILE", 12129); - _unicodeCharacterMap.Add("KANGXI RADICAL SWEET", 12130); - _unicodeCharacterMap.Add("KANGXI RADICAL LIFE", 12131); - _unicodeCharacterMap.Add("KANGXI RADICAL USE", 12132); - _unicodeCharacterMap.Add("KANGXI RADICAL FIELD", 12133); - _unicodeCharacterMap.Add("KANGXI RADICAL BOLT OF CLOTH", 12134); - _unicodeCharacterMap.Add("KANGXI RADICAL SICKNESS", 12135); - _unicodeCharacterMap.Add("KANGXI RADICAL DOTTED TENT", 12136); - _unicodeCharacterMap.Add("KANGXI RADICAL WHITE", 12137); - _unicodeCharacterMap.Add("KANGXI RADICAL SKIN", 12138); - _unicodeCharacterMap.Add("KANGXI RADICAL DISH", 12139); - _unicodeCharacterMap.Add("KANGXI RADICAL EYE", 12140); - _unicodeCharacterMap.Add("KANGXI RADICAL SPEAR", 12141); - _unicodeCharacterMap.Add("KANGXI RADICAL ARROW", 12142); - _unicodeCharacterMap.Add("KANGXI RADICAL STONE", 12143); - _unicodeCharacterMap.Add("KANGXI RADICAL SPIRIT", 12144); - _unicodeCharacterMap.Add("KANGXI RADICAL TRACK", 12145); - _unicodeCharacterMap.Add("KANGXI RADICAL GRAIN", 12146); - _unicodeCharacterMap.Add("KANGXI RADICAL CAVE", 12147); - _unicodeCharacterMap.Add("KANGXI RADICAL STAND", 12148); - _unicodeCharacterMap.Add("KANGXI RADICAL BAMBOO", 12149); - _unicodeCharacterMap.Add("KANGXI RADICAL RICE", 12150); - _unicodeCharacterMap.Add("KANGXI RADICAL SILK", 12151); - _unicodeCharacterMap.Add("KANGXI RADICAL JAR", 12152); - _unicodeCharacterMap.Add("KANGXI RADICAL NET", 12153); - _unicodeCharacterMap.Add("KANGXI RADICAL SHEEP", 12154); - _unicodeCharacterMap.Add("KANGXI RADICAL FEATHER", 12155); - _unicodeCharacterMap.Add("KANGXI RADICAL OLD", 12156); - _unicodeCharacterMap.Add("KANGXI RADICAL AND", 12157); - _unicodeCharacterMap.Add("KANGXI RADICAL PLOW", 12158); - _unicodeCharacterMap.Add("KANGXI RADICAL EAR", 12159); - _unicodeCharacterMap.Add("KANGXI RADICAL BRUSH", 12160); - _unicodeCharacterMap.Add("KANGXI RADICAL MEAT", 12161); - _unicodeCharacterMap.Add("KANGXI RADICAL MINISTER", 12162); - _unicodeCharacterMap.Add("KANGXI RADICAL SELF", 12163); - _unicodeCharacterMap.Add("KANGXI RADICAL ARRIVE", 12164); - _unicodeCharacterMap.Add("KANGXI RADICAL MORTAR", 12165); - _unicodeCharacterMap.Add("KANGXI RADICAL TONGUE", 12166); - _unicodeCharacterMap.Add("KANGXI RADICAL OPPOSE", 12167); - _unicodeCharacterMap.Add("KANGXI RADICAL BOAT", 12168); - _unicodeCharacterMap.Add("KANGXI RADICAL STOPPING", 12169); - _unicodeCharacterMap.Add("KANGXI RADICAL COLOR", 12170); - _unicodeCharacterMap.Add("KANGXI RADICAL GRASS", 12171); - _unicodeCharacterMap.Add("KANGXI RADICAL TIGER", 12172); - _unicodeCharacterMap.Add("KANGXI RADICAL INSECT", 12173); - _unicodeCharacterMap.Add("KANGXI RADICAL BLOOD", 12174); - _unicodeCharacterMap.Add("KANGXI RADICAL WALK ENCLOSURE", 12175); - _unicodeCharacterMap.Add("KANGXI RADICAL CLOTHES", 12176); - _unicodeCharacterMap.Add("KANGXI RADICAL WEST", 12177); - _unicodeCharacterMap.Add("KANGXI RADICAL SEE", 12178); - _unicodeCharacterMap.Add("KANGXI RADICAL HORN", 12179); - _unicodeCharacterMap.Add("KANGXI RADICAL SPEECH", 12180); - _unicodeCharacterMap.Add("KANGXI RADICAL VALLEY", 12181); - _unicodeCharacterMap.Add("KANGXI RADICAL BEAN", 12182); - _unicodeCharacterMap.Add("KANGXI RADICAL PIG", 12183); - _unicodeCharacterMap.Add("KANGXI RADICAL BADGER", 12184); - _unicodeCharacterMap.Add("KANGXI RADICAL SHELL", 12185); - _unicodeCharacterMap.Add("KANGXI RADICAL RED", 12186); - _unicodeCharacterMap.Add("KANGXI RADICAL RUN", 12187); - _unicodeCharacterMap.Add("KANGXI RADICAL FOOT", 12188); - _unicodeCharacterMap.Add("KANGXI RADICAL BODY", 12189); - _unicodeCharacterMap.Add("KANGXI RADICAL CART", 12190); - _unicodeCharacterMap.Add("KANGXI RADICAL BITTER", 12191); - _unicodeCharacterMap.Add("KANGXI RADICAL MORNING", 12192); - _unicodeCharacterMap.Add("KANGXI RADICAL WALK", 12193); - _unicodeCharacterMap.Add("KANGXI RADICAL CITY", 12194); - _unicodeCharacterMap.Add("KANGXI RADICAL WINE", 12195); - _unicodeCharacterMap.Add("KANGXI RADICAL DISTINGUISH", 12196); - _unicodeCharacterMap.Add("KANGXI RADICAL VILLAGE", 12197); - _unicodeCharacterMap.Add("KANGXI RADICAL GOLD", 12198); - _unicodeCharacterMap.Add("KANGXI RADICAL LONG", 12199); - _unicodeCharacterMap.Add("KANGXI RADICAL GATE", 12200); - _unicodeCharacterMap.Add("KANGXI RADICAL MOUND", 12201); - _unicodeCharacterMap.Add("KANGXI RADICAL SLAVE", 12202); - _unicodeCharacterMap.Add("KANGXI RADICAL SHORT TAILED BIRD", 12203); - _unicodeCharacterMap.Add("KANGXI RADICAL RAIN", 12204); - _unicodeCharacterMap.Add("KANGXI RADICAL BLUE", 12205); - _unicodeCharacterMap.Add("KANGXI RADICAL WRONG", 12206); - _unicodeCharacterMap.Add("KANGXI RADICAL FACE", 12207); - _unicodeCharacterMap.Add("KANGXI RADICAL LEATHER", 12208); - _unicodeCharacterMap.Add("KANGXI RADICAL TANNED LEATHER", 12209); - _unicodeCharacterMap.Add("KANGXI RADICAL LEEK", 12210); - _unicodeCharacterMap.Add("KANGXI RADICAL SOUND", 12211); - _unicodeCharacterMap.Add("KANGXI RADICAL LEAF", 12212); - _unicodeCharacterMap.Add("KANGXI RADICAL WIND", 12213); - _unicodeCharacterMap.Add("KANGXI RADICAL FLY", 12214); - _unicodeCharacterMap.Add("KANGXI RADICAL EAT", 12215); - _unicodeCharacterMap.Add("KANGXI RADICAL HEAD", 12216); - _unicodeCharacterMap.Add("KANGXI RADICAL FRAGRANT", 12217); - _unicodeCharacterMap.Add("KANGXI RADICAL HORSE", 12218); - _unicodeCharacterMap.Add("KANGXI RADICAL BONE", 12219); - _unicodeCharacterMap.Add("KANGXI RADICAL TALL", 12220); - _unicodeCharacterMap.Add("KANGXI RADICAL HAIR", 12221); - _unicodeCharacterMap.Add("KANGXI RADICAL FIGHT", 12222); - _unicodeCharacterMap.Add("KANGXI RADICAL SACRIFICIAL WINE", 12223); - _unicodeCharacterMap.Add("KANGXI RADICAL CAULDRON", 12224); - _unicodeCharacterMap.Add("KANGXI RADICAL GHOST", 12225); - _unicodeCharacterMap.Add("KANGXI RADICAL FISH", 12226); - _unicodeCharacterMap.Add("KANGXI RADICAL BIRD", 12227); - _unicodeCharacterMap.Add("KANGXI RADICAL SALT", 12228); - _unicodeCharacterMap.Add("KANGXI RADICAL DEER", 12229); - _unicodeCharacterMap.Add("KANGXI RADICAL WHEAT", 12230); - _unicodeCharacterMap.Add("KANGXI RADICAL HEMP", 12231); - _unicodeCharacterMap.Add("KANGXI RADICAL YELLOW", 12232); - _unicodeCharacterMap.Add("KANGXI RADICAL MILLET", 12233); - _unicodeCharacterMap.Add("KANGXI RADICAL BLACK", 12234); - _unicodeCharacterMap.Add("KANGXI RADICAL EMBROIDERY", 12235); - _unicodeCharacterMap.Add("KANGXI RADICAL FROG", 12236); - _unicodeCharacterMap.Add("KANGXI RADICAL TRIPOD", 12237); - _unicodeCharacterMap.Add("KANGXI RADICAL DRUM", 12238); - _unicodeCharacterMap.Add("KANGXI RADICAL RAT", 12239); - _unicodeCharacterMap.Add("KANGXI RADICAL NOSE", 12240); - _unicodeCharacterMap.Add("KANGXI RADICAL EVEN", 12241); - _unicodeCharacterMap.Add("KANGXI RADICAL TOOTH", 12242); - _unicodeCharacterMap.Add("KANGXI RADICAL DRAGON", 12243); - _unicodeCharacterMap.Add("KANGXI RADICAL TURTLE", 12244); - _unicodeCharacterMap.Add("KANGXI RADICAL FLUTE", 12245); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT", 12272); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW", 12273); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT", 12274); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW", 12275); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND", 12276); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE", 12277); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW", 12278); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT", 12279); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT", 12280); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT", 12281); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT", 12282); - _unicodeCharacterMap.Add("IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID", 12283); - _unicodeCharacterMap.Add("IDEOGRAPHIC SPACE", 12288); - _unicodeCharacterMap.Add("IDEOGRAPHIC COMMA", 12289); - _unicodeCharacterMap.Add("IDEOGRAPHIC FULL STOP", 12290); - _unicodeCharacterMap.Add("DITTO MARK", 12291); - _unicodeCharacterMap.Add("JAPANESE INDUSTRIAL STANDARD SYMBOL", 12292); - _unicodeCharacterMap.Add("IDEOGRAPHIC ITERATION MARK", 12293); - _unicodeCharacterMap.Add("IDEOGRAPHIC CLOSING MARK", 12294); - _unicodeCharacterMap.Add("IDEOGRAPHIC NUMBER ZERO", 12295); - _unicodeCharacterMap.Add("LEFT ANGLE BRACKET", 12296); - _unicodeCharacterMap.Add("RIGHT ANGLE BRACKET", 12297); - _unicodeCharacterMap.Add("LEFT DOUBLE ANGLE BRACKET", 12298); - _unicodeCharacterMap.Add("RIGHT DOUBLE ANGLE BRACKET", 12299); - _unicodeCharacterMap.Add("LEFT CORNER BRACKET", 12300); - _unicodeCharacterMap.Add("RIGHT CORNER BRACKET", 12301); - _unicodeCharacterMap.Add("LEFT WHITE CORNER BRACKET", 12302); - _unicodeCharacterMap.Add("RIGHT WHITE CORNER BRACKET", 12303); - _unicodeCharacterMap.Add("LEFT BLACK LENTICULAR BRACKET", 12304); - _unicodeCharacterMap.Add("RIGHT BLACK LENTICULAR BRACKET", 12305); - _unicodeCharacterMap.Add("POSTAL MARK", 12306); - _unicodeCharacterMap.Add("GETA MARK", 12307); - _unicodeCharacterMap.Add("LEFT TORTOISE SHELL BRACKET", 12308); - _unicodeCharacterMap.Add("RIGHT TORTOISE SHELL BRACKET", 12309); - _unicodeCharacterMap.Add("LEFT WHITE LENTICULAR BRACKET", 12310); - _unicodeCharacterMap.Add("RIGHT WHITE LENTICULAR BRACKET", 12311); - _unicodeCharacterMap.Add("LEFT WHITE TORTOISE SHELL BRACKET", 12312); - _unicodeCharacterMap.Add("RIGHT WHITE TORTOISE SHELL BRACKET", 12313); - _unicodeCharacterMap.Add("LEFT WHITE SQUARE BRACKET", 12314); - _unicodeCharacterMap.Add("RIGHT WHITE SQUARE BRACKET", 12315); - _unicodeCharacterMap.Add("WAVE DASH", 12316); - _unicodeCharacterMap.Add("REVERSED DOUBLE PRIME QUOTATION MARK", 12317); - _unicodeCharacterMap.Add("DOUBLE PRIME QUOTATION MARK", 12318); - _unicodeCharacterMap.Add("LOW DOUBLE PRIME QUOTATION MARK", 12319); - _unicodeCharacterMap.Add("POSTAL MARK FACE", 12320); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL ONE", 12321); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL TWO", 12322); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL THREE", 12323); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL FOUR", 12324); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL FIVE", 12325); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL SIX", 12326); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL SEVEN", 12327); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL EIGHT", 12328); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL NINE", 12329); - _unicodeCharacterMap.Add("IDEOGRAPHIC LEVEL TONE MARK", 12330); - _unicodeCharacterMap.Add("IDEOGRAPHIC RISING TONE MARK", 12331); - _unicodeCharacterMap.Add("IDEOGRAPHIC DEPARTING TONE MARK", 12332); - _unicodeCharacterMap.Add("IDEOGRAPHIC ENTERING TONE MARK", 12333); - _unicodeCharacterMap.Add("HANGUL SINGLE DOT TONE MARK", 12334); - _unicodeCharacterMap.Add("HANGUL DOUBLE DOT TONE MARK", 12335); - _unicodeCharacterMap.Add("WAVY DASH", 12336); - _unicodeCharacterMap.Add("VERTICAL KANA REPEAT MARK", 12337); - _unicodeCharacterMap.Add("VERTICAL KANA REPEAT WITH VOICED SOUND MARK", 12338); - _unicodeCharacterMap.Add("VERTICAL KANA REPEAT MARK UPPER HALF", 12339); - _unicodeCharacterMap.Add("VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF", 12340); - _unicodeCharacterMap.Add("VERTICAL KANA REPEAT MARK LOWER HALF", 12341); - _unicodeCharacterMap.Add("CIRCLED POSTAL MARK", 12342); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL", 12343); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL TEN", 12344); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL TWENTY", 12345); - _unicodeCharacterMap.Add("HANGZHOU NUMERAL THIRTY", 12346); - _unicodeCharacterMap.Add("VERTICAL IDEOGRAPHIC ITERATION MARK", 12347); - _unicodeCharacterMap.Add("MASU MARK", 12348); - _unicodeCharacterMap.Add("PART ALTERNATION MARK", 12349); - _unicodeCharacterMap.Add("IDEOGRAPHIC VARIATION INDICATOR", 12350); - _unicodeCharacterMap.Add("IDEOGRAPHIC HALF FILL SPACE", 12351); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL A", 12353); - _unicodeCharacterMap.Add("HIRAGANA LETTER A", 12354); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL I", 12355); - _unicodeCharacterMap.Add("HIRAGANA LETTER I", 12356); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL U", 12357); - _unicodeCharacterMap.Add("HIRAGANA LETTER U", 12358); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL E", 12359); - _unicodeCharacterMap.Add("HIRAGANA LETTER E", 12360); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL O", 12361); - _unicodeCharacterMap.Add("HIRAGANA LETTER O", 12362); - _unicodeCharacterMap.Add("HIRAGANA LETTER KA", 12363); - _unicodeCharacterMap.Add("HIRAGANA LETTER GA", 12364); - _unicodeCharacterMap.Add("HIRAGANA LETTER KI", 12365); - _unicodeCharacterMap.Add("HIRAGANA LETTER GI", 12366); - _unicodeCharacterMap.Add("HIRAGANA LETTER KU", 12367); - _unicodeCharacterMap.Add("HIRAGANA LETTER GU", 12368); - _unicodeCharacterMap.Add("HIRAGANA LETTER KE", 12369); - _unicodeCharacterMap.Add("HIRAGANA LETTER GE", 12370); - _unicodeCharacterMap.Add("HIRAGANA LETTER KO", 12371); - _unicodeCharacterMap.Add("HIRAGANA LETTER GO", 12372); - _unicodeCharacterMap.Add("HIRAGANA LETTER SA", 12373); - _unicodeCharacterMap.Add("HIRAGANA LETTER ZA", 12374); - _unicodeCharacterMap.Add("HIRAGANA LETTER SI", 12375); - _unicodeCharacterMap.Add("HIRAGANA LETTER ZI", 12376); - _unicodeCharacterMap.Add("HIRAGANA LETTER SU", 12377); - _unicodeCharacterMap.Add("HIRAGANA LETTER ZU", 12378); - _unicodeCharacterMap.Add("HIRAGANA LETTER SE", 12379); - _unicodeCharacterMap.Add("HIRAGANA LETTER ZE", 12380); - _unicodeCharacterMap.Add("HIRAGANA LETTER SO", 12381); - _unicodeCharacterMap.Add("HIRAGANA LETTER ZO", 12382); - _unicodeCharacterMap.Add("HIRAGANA LETTER TA", 12383); - _unicodeCharacterMap.Add("HIRAGANA LETTER DA", 12384); - _unicodeCharacterMap.Add("HIRAGANA LETTER TI", 12385); - _unicodeCharacterMap.Add("HIRAGANA LETTER DI", 12386); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL TU", 12387); - _unicodeCharacterMap.Add("HIRAGANA LETTER TU", 12388); - _unicodeCharacterMap.Add("HIRAGANA LETTER DU", 12389); - _unicodeCharacterMap.Add("HIRAGANA LETTER TE", 12390); - _unicodeCharacterMap.Add("HIRAGANA LETTER DE", 12391); - _unicodeCharacterMap.Add("HIRAGANA LETTER TO", 12392); - _unicodeCharacterMap.Add("HIRAGANA LETTER DO", 12393); - _unicodeCharacterMap.Add("HIRAGANA LETTER NA", 12394); - _unicodeCharacterMap.Add("HIRAGANA LETTER NI", 12395); - _unicodeCharacterMap.Add("HIRAGANA LETTER NU", 12396); - _unicodeCharacterMap.Add("HIRAGANA LETTER NE", 12397); - _unicodeCharacterMap.Add("HIRAGANA LETTER NO", 12398); - _unicodeCharacterMap.Add("HIRAGANA LETTER HA", 12399); - _unicodeCharacterMap.Add("HIRAGANA LETTER BA", 12400); - _unicodeCharacterMap.Add("HIRAGANA LETTER PA", 12401); - _unicodeCharacterMap.Add("HIRAGANA LETTER HI", 12402); - _unicodeCharacterMap.Add("HIRAGANA LETTER BI", 12403); - _unicodeCharacterMap.Add("HIRAGANA LETTER PI", 12404); - _unicodeCharacterMap.Add("HIRAGANA LETTER HU", 12405); - _unicodeCharacterMap.Add("HIRAGANA LETTER BU", 12406); - _unicodeCharacterMap.Add("HIRAGANA LETTER PU", 12407); - _unicodeCharacterMap.Add("HIRAGANA LETTER HE", 12408); - _unicodeCharacterMap.Add("HIRAGANA LETTER BE", 12409); - _unicodeCharacterMap.Add("HIRAGANA LETTER PE", 12410); - _unicodeCharacterMap.Add("HIRAGANA LETTER HO", 12411); - _unicodeCharacterMap.Add("HIRAGANA LETTER BO", 12412); - _unicodeCharacterMap.Add("HIRAGANA LETTER PO", 12413); - _unicodeCharacterMap.Add("HIRAGANA LETTER MA", 12414); - _unicodeCharacterMap.Add("HIRAGANA LETTER MI", 12415); - _unicodeCharacterMap.Add("HIRAGANA LETTER MU", 12416); - _unicodeCharacterMap.Add("HIRAGANA LETTER ME", 12417); - _unicodeCharacterMap.Add("HIRAGANA LETTER MO", 12418); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL YA", 12419); - _unicodeCharacterMap.Add("HIRAGANA LETTER YA", 12420); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL YU", 12421); - _unicodeCharacterMap.Add("HIRAGANA LETTER YU", 12422); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL YO", 12423); - _unicodeCharacterMap.Add("HIRAGANA LETTER YO", 12424); - _unicodeCharacterMap.Add("HIRAGANA LETTER RA", 12425); - _unicodeCharacterMap.Add("HIRAGANA LETTER RI", 12426); - _unicodeCharacterMap.Add("HIRAGANA LETTER RU", 12427); - _unicodeCharacterMap.Add("HIRAGANA LETTER RE", 12428); - _unicodeCharacterMap.Add("HIRAGANA LETTER RO", 12429); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL WA", 12430); - _unicodeCharacterMap.Add("HIRAGANA LETTER WA", 12431); - _unicodeCharacterMap.Add("HIRAGANA LETTER WI", 12432); - _unicodeCharacterMap.Add("HIRAGANA LETTER WE", 12433); - _unicodeCharacterMap.Add("HIRAGANA LETTER WO", 12434); - _unicodeCharacterMap.Add("HIRAGANA LETTER N", 12435); - _unicodeCharacterMap.Add("HIRAGANA LETTER VU", 12436); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL KA", 12437); - _unicodeCharacterMap.Add("HIRAGANA LETTER SMALL KE", 12438); - _unicodeCharacterMap.Add("COMBINING KATAKANA HIRAGANA VOICED SOUND MARK", 12441); - _unicodeCharacterMap.Add("COMBINING KATAKANA HIRAGANA SEMI VOICED SOUND MARK", 12442); - _unicodeCharacterMap.Add("KATAKANA HIRAGANA VOICED SOUND MARK", 12443); - _unicodeCharacterMap.Add("KATAKANA HIRAGANA SEMI VOICED SOUND MARK", 12444); - _unicodeCharacterMap.Add("HIRAGANA ITERATION MARK", 12445); - _unicodeCharacterMap.Add("HIRAGANA VOICED ITERATION MARK", 12446); - _unicodeCharacterMap.Add("HIRAGANA DIGRAPH YORI", 12447); - _unicodeCharacterMap.Add("KATAKANA HIRAGANA DOUBLE HYPHEN", 12448); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL A", 12449); - _unicodeCharacterMap.Add("KATAKANA LETTER A", 12450); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL I", 12451); - _unicodeCharacterMap.Add("KATAKANA LETTER I", 12452); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL U", 12453); - _unicodeCharacterMap.Add("KATAKANA LETTER U", 12454); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL E", 12455); - _unicodeCharacterMap.Add("KATAKANA LETTER E", 12456); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL O", 12457); - _unicodeCharacterMap.Add("KATAKANA LETTER O", 12458); - _unicodeCharacterMap.Add("KATAKANA LETTER KA", 12459); - _unicodeCharacterMap.Add("KATAKANA LETTER GA", 12460); - _unicodeCharacterMap.Add("KATAKANA LETTER KI", 12461); - _unicodeCharacterMap.Add("KATAKANA LETTER GI", 12462); - _unicodeCharacterMap.Add("KATAKANA LETTER KU", 12463); - _unicodeCharacterMap.Add("KATAKANA LETTER GU", 12464); - _unicodeCharacterMap.Add("KATAKANA LETTER KE", 12465); - _unicodeCharacterMap.Add("KATAKANA LETTER GE", 12466); - _unicodeCharacterMap.Add("KATAKANA LETTER KO", 12467); - _unicodeCharacterMap.Add("KATAKANA LETTER GO", 12468); - _unicodeCharacterMap.Add("KATAKANA LETTER SA", 12469); - _unicodeCharacterMap.Add("KATAKANA LETTER ZA", 12470); - _unicodeCharacterMap.Add("KATAKANA LETTER SI", 12471); - _unicodeCharacterMap.Add("KATAKANA LETTER ZI", 12472); - _unicodeCharacterMap.Add("KATAKANA LETTER SU", 12473); - _unicodeCharacterMap.Add("KATAKANA LETTER ZU", 12474); - _unicodeCharacterMap.Add("KATAKANA LETTER SE", 12475); - _unicodeCharacterMap.Add("KATAKANA LETTER ZE", 12476); - _unicodeCharacterMap.Add("KATAKANA LETTER SO", 12477); - _unicodeCharacterMap.Add("KATAKANA LETTER ZO", 12478); - _unicodeCharacterMap.Add("KATAKANA LETTER TA", 12479); - _unicodeCharacterMap.Add("KATAKANA LETTER DA", 12480); - _unicodeCharacterMap.Add("KATAKANA LETTER TI", 12481); - _unicodeCharacterMap.Add("KATAKANA LETTER DI", 12482); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL TU", 12483); - _unicodeCharacterMap.Add("KATAKANA LETTER TU", 12484); - _unicodeCharacterMap.Add("KATAKANA LETTER DU", 12485); - _unicodeCharacterMap.Add("KATAKANA LETTER TE", 12486); - _unicodeCharacterMap.Add("KATAKANA LETTER DE", 12487); - _unicodeCharacterMap.Add("KATAKANA LETTER TO", 12488); - _unicodeCharacterMap.Add("KATAKANA LETTER DO", 12489); - _unicodeCharacterMap.Add("KATAKANA LETTER NA", 12490); - _unicodeCharacterMap.Add("KATAKANA LETTER NI", 12491); - _unicodeCharacterMap.Add("KATAKANA LETTER NU", 12492); - _unicodeCharacterMap.Add("KATAKANA LETTER NE", 12493); - _unicodeCharacterMap.Add("KATAKANA LETTER NO", 12494); - _unicodeCharacterMap.Add("KATAKANA LETTER HA", 12495); - _unicodeCharacterMap.Add("KATAKANA LETTER BA", 12496); - _unicodeCharacterMap.Add("KATAKANA LETTER PA", 12497); - _unicodeCharacterMap.Add("KATAKANA LETTER HI", 12498); - _unicodeCharacterMap.Add("KATAKANA LETTER BI", 12499); - _unicodeCharacterMap.Add("KATAKANA LETTER PI", 12500); - _unicodeCharacterMap.Add("KATAKANA LETTER HU", 12501); - _unicodeCharacterMap.Add("KATAKANA LETTER BU", 12502); - _unicodeCharacterMap.Add("KATAKANA LETTER PU", 12503); - _unicodeCharacterMap.Add("KATAKANA LETTER HE", 12504); - _unicodeCharacterMap.Add("KATAKANA LETTER BE", 12505); - _unicodeCharacterMap.Add("KATAKANA LETTER PE", 12506); - _unicodeCharacterMap.Add("KATAKANA LETTER HO", 12507); - _unicodeCharacterMap.Add("KATAKANA LETTER BO", 12508); - _unicodeCharacterMap.Add("KATAKANA LETTER PO", 12509); - _unicodeCharacterMap.Add("KATAKANA LETTER MA", 12510); - _unicodeCharacterMap.Add("KATAKANA LETTER MI", 12511); - _unicodeCharacterMap.Add("KATAKANA LETTER MU", 12512); - _unicodeCharacterMap.Add("KATAKANA LETTER ME", 12513); - _unicodeCharacterMap.Add("KATAKANA LETTER MO", 12514); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL YA", 12515); - _unicodeCharacterMap.Add("KATAKANA LETTER YA", 12516); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL YU", 12517); - _unicodeCharacterMap.Add("KATAKANA LETTER YU", 12518); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL YO", 12519); - _unicodeCharacterMap.Add("KATAKANA LETTER YO", 12520); - _unicodeCharacterMap.Add("KATAKANA LETTER RA", 12521); - _unicodeCharacterMap.Add("KATAKANA LETTER RI", 12522); - _unicodeCharacterMap.Add("KATAKANA LETTER RU", 12523); - _unicodeCharacterMap.Add("KATAKANA LETTER RE", 12524); - _unicodeCharacterMap.Add("KATAKANA LETTER RO", 12525); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL WA", 12526); - _unicodeCharacterMap.Add("KATAKANA LETTER WA", 12527); - _unicodeCharacterMap.Add("KATAKANA LETTER WI", 12528); - _unicodeCharacterMap.Add("KATAKANA LETTER WE", 12529); - _unicodeCharacterMap.Add("KATAKANA LETTER WO", 12530); - _unicodeCharacterMap.Add("KATAKANA LETTER N", 12531); - _unicodeCharacterMap.Add("KATAKANA LETTER VU", 12532); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL KA", 12533); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL KE", 12534); - _unicodeCharacterMap.Add("KATAKANA LETTER VA", 12535); - _unicodeCharacterMap.Add("KATAKANA LETTER VI", 12536); - _unicodeCharacterMap.Add("KATAKANA LETTER VE", 12537); - _unicodeCharacterMap.Add("KATAKANA LETTER VO", 12538); - _unicodeCharacterMap.Add("KATAKANA MIDDLE DOT", 12539); - _unicodeCharacterMap.Add("KATAKANA HIRAGANA PROLONGED SOUND MARK", 12540); - _unicodeCharacterMap.Add("KATAKANA ITERATION MARK", 12541); - _unicodeCharacterMap.Add("KATAKANA VOICED ITERATION MARK", 12542); - _unicodeCharacterMap.Add("KATAKANA DIGRAPH KOTO", 12543); - _unicodeCharacterMap.Add("BOPOMOFO LETTER B", 12549); - _unicodeCharacterMap.Add("BOPOMOFO LETTER P", 12550); - _unicodeCharacterMap.Add("BOPOMOFO LETTER M", 12551); - _unicodeCharacterMap.Add("BOPOMOFO LETTER F", 12552); - _unicodeCharacterMap.Add("BOPOMOFO LETTER D", 12553); - _unicodeCharacterMap.Add("BOPOMOFO LETTER T", 12554); - _unicodeCharacterMap.Add("BOPOMOFO LETTER N", 12555); - _unicodeCharacterMap.Add("BOPOMOFO LETTER L", 12556); - _unicodeCharacterMap.Add("BOPOMOFO LETTER G", 12557); - _unicodeCharacterMap.Add("BOPOMOFO LETTER K", 12558); - _unicodeCharacterMap.Add("BOPOMOFO LETTER H", 12559); - _unicodeCharacterMap.Add("BOPOMOFO LETTER J", 12560); - _unicodeCharacterMap.Add("BOPOMOFO LETTER Q", 12561); - _unicodeCharacterMap.Add("BOPOMOFO LETTER X", 12562); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ZH", 12563); - _unicodeCharacterMap.Add("BOPOMOFO LETTER CH", 12564); - _unicodeCharacterMap.Add("BOPOMOFO LETTER SH", 12565); - _unicodeCharacterMap.Add("BOPOMOFO LETTER R", 12566); - _unicodeCharacterMap.Add("BOPOMOFO LETTER Z", 12567); - _unicodeCharacterMap.Add("BOPOMOFO LETTER C", 12568); - _unicodeCharacterMap.Add("BOPOMOFO LETTER S", 12569); - _unicodeCharacterMap.Add("BOPOMOFO LETTER A", 12570); - _unicodeCharacterMap.Add("BOPOMOFO LETTER O", 12571); - _unicodeCharacterMap.Add("BOPOMOFO LETTER E", 12572); - _unicodeCharacterMap.Add("BOPOMOFO LETTER EH", 12573); - _unicodeCharacterMap.Add("BOPOMOFO LETTER AI", 12574); - _unicodeCharacterMap.Add("BOPOMOFO LETTER EI", 12575); - _unicodeCharacterMap.Add("BOPOMOFO LETTER AU", 12576); - _unicodeCharacterMap.Add("BOPOMOFO LETTER OU", 12577); - _unicodeCharacterMap.Add("BOPOMOFO LETTER AN", 12578); - _unicodeCharacterMap.Add("BOPOMOFO LETTER EN", 12579); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ANG", 12580); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ENG", 12581); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ER", 12582); - _unicodeCharacterMap.Add("BOPOMOFO LETTER I", 12583); - _unicodeCharacterMap.Add("BOPOMOFO LETTER U", 12584); - _unicodeCharacterMap.Add("BOPOMOFO LETTER IU", 12585); - _unicodeCharacterMap.Add("BOPOMOFO LETTER V", 12586); - _unicodeCharacterMap.Add("BOPOMOFO LETTER NG", 12587); - _unicodeCharacterMap.Add("BOPOMOFO LETTER GN", 12588); - _unicodeCharacterMap.Add("BOPOMOFO LETTER IH", 12589); - _unicodeCharacterMap.Add("HANGUL LETTER KIYEOK", 12593); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGKIYEOK", 12594); - _unicodeCharacterMap.Add("HANGUL LETTER KIYEOK SIOS", 12595); - _unicodeCharacterMap.Add("HANGUL LETTER NIEUN", 12596); - _unicodeCharacterMap.Add("HANGUL LETTER NIEUN CIEUC", 12597); - _unicodeCharacterMap.Add("HANGUL LETTER NIEUN HIEUH", 12598); - _unicodeCharacterMap.Add("HANGUL LETTER TIKEUT", 12599); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGTIKEUT", 12600); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL", 12601); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL KIYEOK", 12602); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL MIEUM", 12603); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL PIEUP", 12604); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL SIOS", 12605); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL THIEUTH", 12606); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL PHIEUPH", 12607); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL HIEUH", 12608); - _unicodeCharacterMap.Add("HANGUL LETTER MIEUM", 12609); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP", 12610); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGPIEUP", 12611); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP SIOS", 12612); - _unicodeCharacterMap.Add("HANGUL LETTER SIOS", 12613); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGSIOS", 12614); - _unicodeCharacterMap.Add("HANGUL LETTER IEUNG", 12615); - _unicodeCharacterMap.Add("HANGUL LETTER CIEUC", 12616); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGCIEUC", 12617); - _unicodeCharacterMap.Add("HANGUL LETTER CHIEUCH", 12618); - _unicodeCharacterMap.Add("HANGUL LETTER KHIEUKH", 12619); - _unicodeCharacterMap.Add("HANGUL LETTER THIEUTH", 12620); - _unicodeCharacterMap.Add("HANGUL LETTER PHIEUPH", 12621); - _unicodeCharacterMap.Add("HANGUL LETTER HIEUH", 12622); - _unicodeCharacterMap.Add("HANGUL LETTER A", 12623); - _unicodeCharacterMap.Add("HANGUL LETTER AE", 12624); - _unicodeCharacterMap.Add("HANGUL LETTER YA", 12625); - _unicodeCharacterMap.Add("HANGUL LETTER YAE", 12626); - _unicodeCharacterMap.Add("HANGUL LETTER EO", 12627); - _unicodeCharacterMap.Add("HANGUL LETTER E", 12628); - _unicodeCharacterMap.Add("HANGUL LETTER YEO", 12629); - _unicodeCharacterMap.Add("HANGUL LETTER YE", 12630); - _unicodeCharacterMap.Add("HANGUL LETTER O", 12631); - _unicodeCharacterMap.Add("HANGUL LETTER WA", 12632); - _unicodeCharacterMap.Add("HANGUL LETTER WAE", 12633); - _unicodeCharacterMap.Add("HANGUL LETTER OE", 12634); - _unicodeCharacterMap.Add("HANGUL LETTER YO", 12635); - _unicodeCharacterMap.Add("HANGUL LETTER U", 12636); - _unicodeCharacterMap.Add("HANGUL LETTER WEO", 12637); - _unicodeCharacterMap.Add("HANGUL LETTER WE", 12638); - _unicodeCharacterMap.Add("HANGUL LETTER WI", 12639); - _unicodeCharacterMap.Add("HANGUL LETTER YU", 12640); - _unicodeCharacterMap.Add("HANGUL LETTER EU", 12641); - _unicodeCharacterMap.Add("HANGUL LETTER YI", 12642); - _unicodeCharacterMap.Add("HANGUL LETTER I", 12643); - _unicodeCharacterMap.Add("HANGUL FILLER", 12644); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGNIEUN", 12645); - _unicodeCharacterMap.Add("HANGUL LETTER NIEUN TIKEUT", 12646); - _unicodeCharacterMap.Add("HANGUL LETTER NIEUN SIOS", 12647); - _unicodeCharacterMap.Add("HANGUL LETTER NIEUN PANSIOS", 12648); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL KIYEOK SIOS", 12649); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL TIKEUT", 12650); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL PIEUP SIOS", 12651); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL PANSIOS", 12652); - _unicodeCharacterMap.Add("HANGUL LETTER RIEUL YEORINHIEUH", 12653); - _unicodeCharacterMap.Add("HANGUL LETTER MIEUM PIEUP", 12654); - _unicodeCharacterMap.Add("HANGUL LETTER MIEUM SIOS", 12655); - _unicodeCharacterMap.Add("HANGUL LETTER MIEUM PANSIOS", 12656); - _unicodeCharacterMap.Add("HANGUL LETTER KAPYEOUNMIEUM", 12657); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP KIYEOK", 12658); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP TIKEUT", 12659); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP SIOS KIYEOK", 12660); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP SIOS TIKEUT", 12661); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP CIEUC", 12662); - _unicodeCharacterMap.Add("HANGUL LETTER PIEUP THIEUTH", 12663); - _unicodeCharacterMap.Add("HANGUL LETTER KAPYEOUNPIEUP", 12664); - _unicodeCharacterMap.Add("HANGUL LETTER KAPYEOUNSSANGPIEUP", 12665); - _unicodeCharacterMap.Add("HANGUL LETTER SIOS KIYEOK", 12666); - _unicodeCharacterMap.Add("HANGUL LETTER SIOS NIEUN", 12667); - _unicodeCharacterMap.Add("HANGUL LETTER SIOS TIKEUT", 12668); - _unicodeCharacterMap.Add("HANGUL LETTER SIOS PIEUP", 12669); - _unicodeCharacterMap.Add("HANGUL LETTER SIOS CIEUC", 12670); - _unicodeCharacterMap.Add("HANGUL LETTER PANSIOS", 12671); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGIEUNG", 12672); - _unicodeCharacterMap.Add("HANGUL LETTER YESIEUNG", 12673); - _unicodeCharacterMap.Add("HANGUL LETTER YESIEUNG SIOS", 12674); - _unicodeCharacterMap.Add("HANGUL LETTER YESIEUNG PANSIOS", 12675); - _unicodeCharacterMap.Add("HANGUL LETTER KAPYEOUNPHIEUPH", 12676); - _unicodeCharacterMap.Add("HANGUL LETTER SSANGHIEUH", 12677); - _unicodeCharacterMap.Add("HANGUL LETTER YEORINHIEUH", 12678); - _unicodeCharacterMap.Add("HANGUL LETTER YO YA", 12679); - _unicodeCharacterMap.Add("HANGUL LETTER YO YAE", 12680); - _unicodeCharacterMap.Add("HANGUL LETTER YO I", 12681); - _unicodeCharacterMap.Add("HANGUL LETTER YU YEO", 12682); - _unicodeCharacterMap.Add("HANGUL LETTER YU YE", 12683); - _unicodeCharacterMap.Add("HANGUL LETTER YU I", 12684); - _unicodeCharacterMap.Add("HANGUL LETTER ARAEA", 12685); - _unicodeCharacterMap.Add("HANGUL LETTER ARAEAE", 12686); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION LINKING MARK", 12688); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION REVERSE MARK", 12689); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION ONE MARK", 12690); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION TWO MARK", 12691); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION THREE MARK", 12692); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION FOUR MARK", 12693); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION TOP MARK", 12694); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION MIDDLE MARK", 12695); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION BOTTOM MARK", 12696); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION FIRST MARK", 12697); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION SECOND MARK", 12698); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION THIRD MARK", 12699); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION FOURTH MARK", 12700); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION HEAVEN MARK", 12701); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION EARTH MARK", 12702); - _unicodeCharacterMap.Add("IDEOGRAPHIC ANNOTATION MAN MARK", 12703); - _unicodeCharacterMap.Add("BOPOMOFO LETTER BU", 12704); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ZI", 12705); - _unicodeCharacterMap.Add("BOPOMOFO LETTER JI", 12706); - _unicodeCharacterMap.Add("BOPOMOFO LETTER GU", 12707); - _unicodeCharacterMap.Add("BOPOMOFO LETTER EE", 12708); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ENN", 12709); - _unicodeCharacterMap.Add("BOPOMOFO LETTER OO", 12710); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ONN", 12711); - _unicodeCharacterMap.Add("BOPOMOFO LETTER IR", 12712); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ANN", 12713); - _unicodeCharacterMap.Add("BOPOMOFO LETTER INN", 12714); - _unicodeCharacterMap.Add("BOPOMOFO LETTER UNN", 12715); - _unicodeCharacterMap.Add("BOPOMOFO LETTER IM", 12716); - _unicodeCharacterMap.Add("BOPOMOFO LETTER NGG", 12717); - _unicodeCharacterMap.Add("BOPOMOFO LETTER AINN", 12718); - _unicodeCharacterMap.Add("BOPOMOFO LETTER AUNN", 12719); - _unicodeCharacterMap.Add("BOPOMOFO LETTER AM", 12720); - _unicodeCharacterMap.Add("BOPOMOFO LETTER OM", 12721); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ONG", 12722); - _unicodeCharacterMap.Add("BOPOMOFO LETTER INNN", 12723); - _unicodeCharacterMap.Add("BOPOMOFO FINAL LETTER P", 12724); - _unicodeCharacterMap.Add("BOPOMOFO FINAL LETTER T", 12725); - _unicodeCharacterMap.Add("BOPOMOFO FINAL LETTER K", 12726); - _unicodeCharacterMap.Add("BOPOMOFO FINAL LETTER H", 12727); - _unicodeCharacterMap.Add("BOPOMOFO LETTER GH", 12728); - _unicodeCharacterMap.Add("BOPOMOFO LETTER LH", 12729); - _unicodeCharacterMap.Add("BOPOMOFO LETTER ZY", 12730); - _unicodeCharacterMap.Add("CJK STROKE T", 12736); - _unicodeCharacterMap.Add("CJK STROKE WG", 12737); - _unicodeCharacterMap.Add("CJK STROKE XG", 12738); - _unicodeCharacterMap.Add("CJK STROKE BXG", 12739); - _unicodeCharacterMap.Add("CJK STROKE SW", 12740); - _unicodeCharacterMap.Add("CJK STROKE HZZ", 12741); - _unicodeCharacterMap.Add("CJK STROKE HZG", 12742); - _unicodeCharacterMap.Add("CJK STROKE HP", 12743); - _unicodeCharacterMap.Add("CJK STROKE HZWG", 12744); - _unicodeCharacterMap.Add("CJK STROKE SZWG", 12745); - _unicodeCharacterMap.Add("CJK STROKE HZT", 12746); - _unicodeCharacterMap.Add("CJK STROKE HZZP", 12747); - _unicodeCharacterMap.Add("CJK STROKE HPWG", 12748); - _unicodeCharacterMap.Add("CJK STROKE HZW", 12749); - _unicodeCharacterMap.Add("CJK STROKE HZZZ", 12750); - _unicodeCharacterMap.Add("CJK STROKE N", 12751); - _unicodeCharacterMap.Add("CJK STROKE H", 12752); - _unicodeCharacterMap.Add("CJK STROKE S", 12753); - _unicodeCharacterMap.Add("CJK STROKE P", 12754); - _unicodeCharacterMap.Add("CJK STROKE SP", 12755); - _unicodeCharacterMap.Add("CJK STROKE D", 12756); - _unicodeCharacterMap.Add("CJK STROKE HZ", 12757); - _unicodeCharacterMap.Add("CJK STROKE HG", 12758); - _unicodeCharacterMap.Add("CJK STROKE SZ", 12759); - _unicodeCharacterMap.Add("CJK STROKE SWZ", 12760); - _unicodeCharacterMap.Add("CJK STROKE ST", 12761); - _unicodeCharacterMap.Add("CJK STROKE SG", 12762); - _unicodeCharacterMap.Add("CJK STROKE PD", 12763); - _unicodeCharacterMap.Add("CJK STROKE PZ", 12764); - _unicodeCharacterMap.Add("CJK STROKE TN", 12765); - _unicodeCharacterMap.Add("CJK STROKE SZZ", 12766); - _unicodeCharacterMap.Add("CJK STROKE SWG", 12767); - _unicodeCharacterMap.Add("CJK STROKE HXWG", 12768); - _unicodeCharacterMap.Add("CJK STROKE HZZZG", 12769); - _unicodeCharacterMap.Add("CJK STROKE PG", 12770); - _unicodeCharacterMap.Add("CJK STROKE Q", 12771); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL KU", 12784); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL SI", 12785); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL SU", 12786); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL TO", 12787); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL NU", 12788); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL HA", 12789); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL HI", 12790); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL HU", 12791); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL HE", 12792); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL HO", 12793); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL MU", 12794); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL RA", 12795); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL RI", 12796); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL RU", 12797); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL RE", 12798); - _unicodeCharacterMap.Add("KATAKANA LETTER SMALL RO", 12799); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL KIYEOK", 12800); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL NIEUN", 12801); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL TIKEUT", 12802); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL RIEUL", 12803); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL MIEUM", 12804); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL PIEUP", 12805); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL SIOS", 12806); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL IEUNG", 12807); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL CIEUC", 12808); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL CHIEUCH", 12809); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL KHIEUKH", 12810); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL THIEUTH", 12811); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL PHIEUPH", 12812); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL HIEUH", 12813); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL KIYEOK A", 12814); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL NIEUN A", 12815); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL TIKEUT A", 12816); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL RIEUL A", 12817); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL MIEUM A", 12818); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL PIEUP A", 12819); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL SIOS A", 12820); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL IEUNG A", 12821); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL CIEUC A", 12822); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL CHIEUCH A", 12823); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL KHIEUKH A", 12824); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL THIEUTH A", 12825); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL PHIEUPH A", 12826); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL HIEUH A", 12827); - _unicodeCharacterMap.Add("PARENTHESIZED HANGUL CIEUC U", 12828); - _unicodeCharacterMap.Add("PARENTHESIZED KOREAN CHARACTER OJEON", 12829); - _unicodeCharacterMap.Add("PARENTHESIZED KOREAN CHARACTER O HU", 12830); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH ONE", 12832); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH TWO", 12833); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH THREE", 12834); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH FOUR", 12835); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH FIVE", 12836); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH SIX", 12837); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH SEVEN", 12838); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH EIGHT", 12839); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH NINE", 12840); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH TEN", 12841); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH MOON", 12842); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH FIRE", 12843); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH WATER", 12844); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH WOOD", 12845); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH METAL", 12846); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH EARTH", 12847); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH SUN", 12848); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH STOCK", 12849); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH HAVE", 12850); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH SOCIETY", 12851); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH NAME", 12852); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH SPECIAL", 12853); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH FINANCIAL", 12854); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH CONGRATULATION", 12855); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH LABOR", 12856); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH REPRESENT", 12857); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH CALL", 12858); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH STUDY", 12859); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH SUPERVISE", 12860); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH ENTERPRISE", 12861); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH RESOURCE", 12862); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH ALLIANCE", 12863); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH FESTIVAL", 12864); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH REST", 12865); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH SELF", 12866); - _unicodeCharacterMap.Add("PARENTHESIZED IDEOGRAPH REACH", 12867); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH QUESTION", 12868); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH KINDERGARTEN", 12869); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SCHOOL", 12870); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH KOTO", 12871); - _unicodeCharacterMap.Add("CIRCLED NUMBER TEN ON BLACK SQUARE", 12872); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY ON BLACK SQUARE", 12873); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY ON BLACK SQUARE", 12874); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY ON BLACK SQUARE", 12875); - _unicodeCharacterMap.Add("CIRCLED NUMBER FIFTY ON BLACK SQUARE", 12876); - _unicodeCharacterMap.Add("CIRCLED NUMBER SIXTY ON BLACK SQUARE", 12877); - _unicodeCharacterMap.Add("CIRCLED NUMBER SEVENTY ON BLACK SQUARE", 12878); - _unicodeCharacterMap.Add("CIRCLED NUMBER EIGHTY ON BLACK SQUARE", 12879); - _unicodeCharacterMap.Add("PARTNERSHIP SIGN", 12880); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY ONE", 12881); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY TWO", 12882); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY THREE", 12883); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY FOUR", 12884); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY FIVE", 12885); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY SIX", 12886); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY SEVEN", 12887); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY EIGHT", 12888); - _unicodeCharacterMap.Add("CIRCLED NUMBER TWENTY NINE", 12889); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY", 12890); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY ONE", 12891); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY TWO", 12892); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY THREE", 12893); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY FOUR", 12894); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY FIVE", 12895); - _unicodeCharacterMap.Add("CIRCLED HANGUL KIYEOK", 12896); - _unicodeCharacterMap.Add("CIRCLED HANGUL NIEUN", 12897); - _unicodeCharacterMap.Add("CIRCLED HANGUL TIKEUT", 12898); - _unicodeCharacterMap.Add("CIRCLED HANGUL RIEUL", 12899); - _unicodeCharacterMap.Add("CIRCLED HANGUL MIEUM", 12900); - _unicodeCharacterMap.Add("CIRCLED HANGUL PIEUP", 12901); - _unicodeCharacterMap.Add("CIRCLED HANGUL SIOS", 12902); - _unicodeCharacterMap.Add("CIRCLED HANGUL IEUNG", 12903); - _unicodeCharacterMap.Add("CIRCLED HANGUL CIEUC", 12904); - _unicodeCharacterMap.Add("CIRCLED HANGUL CHIEUCH", 12905); - _unicodeCharacterMap.Add("CIRCLED HANGUL KHIEUKH", 12906); - _unicodeCharacterMap.Add("CIRCLED HANGUL THIEUTH", 12907); - _unicodeCharacterMap.Add("CIRCLED HANGUL PHIEUPH", 12908); - _unicodeCharacterMap.Add("CIRCLED HANGUL HIEUH", 12909); - _unicodeCharacterMap.Add("CIRCLED HANGUL KIYEOK A", 12910); - _unicodeCharacterMap.Add("CIRCLED HANGUL NIEUN A", 12911); - _unicodeCharacterMap.Add("CIRCLED HANGUL TIKEUT A", 12912); - _unicodeCharacterMap.Add("CIRCLED HANGUL RIEUL A", 12913); - _unicodeCharacterMap.Add("CIRCLED HANGUL MIEUM A", 12914); - _unicodeCharacterMap.Add("CIRCLED HANGUL PIEUP A", 12915); - _unicodeCharacterMap.Add("CIRCLED HANGUL SIOS A", 12916); - _unicodeCharacterMap.Add("CIRCLED HANGUL IEUNG A", 12917); - _unicodeCharacterMap.Add("CIRCLED HANGUL CIEUC A", 12918); - _unicodeCharacterMap.Add("CIRCLED HANGUL CHIEUCH A", 12919); - _unicodeCharacterMap.Add("CIRCLED HANGUL KHIEUKH A", 12920); - _unicodeCharacterMap.Add("CIRCLED HANGUL THIEUTH A", 12921); - _unicodeCharacterMap.Add("CIRCLED HANGUL PHIEUPH A", 12922); - _unicodeCharacterMap.Add("CIRCLED HANGUL HIEUH A", 12923); - _unicodeCharacterMap.Add("CIRCLED KOREAN CHARACTER CHAMKO", 12924); - _unicodeCharacterMap.Add("CIRCLED KOREAN CHARACTER JUEUI", 12925); - _unicodeCharacterMap.Add("CIRCLED HANGUL IEUNG U", 12926); - _unicodeCharacterMap.Add("KOREAN STANDARD SYMBOL", 12927); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH ONE", 12928); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH TWO", 12929); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH THREE", 12930); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH FOUR", 12931); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH FIVE", 12932); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SIX", 12933); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SEVEN", 12934); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH EIGHT", 12935); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH NINE", 12936); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH TEN", 12937); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH MOON", 12938); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH FIRE", 12939); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH WATER", 12940); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH WOOD", 12941); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH METAL", 12942); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH EARTH", 12943); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SUN", 12944); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH STOCK", 12945); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH HAVE", 12946); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SOCIETY", 12947); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH NAME", 12948); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SPECIAL", 12949); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH FINANCIAL", 12950); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH CONGRATULATION", 12951); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH LABOR", 12952); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SECRET", 12953); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH MALE", 12954); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH FEMALE", 12955); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SUITABLE", 12956); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH EXCELLENT", 12957); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH PRINT", 12958); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH ATTENTION", 12959); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH ITEM", 12960); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH REST", 12961); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH COPY", 12962); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH CORRECT", 12963); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH HIGH", 12964); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH CENTRE", 12965); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH LOW", 12966); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH LEFT", 12967); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH RIGHT", 12968); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH MEDICINE", 12969); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH RELIGION", 12970); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH STUDY", 12971); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH SUPERVISE", 12972); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH ENTERPRISE", 12973); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH RESOURCE", 12974); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH ALLIANCE", 12975); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH NIGHT", 12976); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY SIX", 12977); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY SEVEN", 12978); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY EIGHT", 12979); - _unicodeCharacterMap.Add("CIRCLED NUMBER THIRTY NINE", 12980); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY", 12981); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY ONE", 12982); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY TWO", 12983); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY THREE", 12984); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY FOUR", 12985); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY FIVE", 12986); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY SIX", 12987); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY SEVEN", 12988); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY EIGHT", 12989); - _unicodeCharacterMap.Add("CIRCLED NUMBER FORTY NINE", 12990); - _unicodeCharacterMap.Add("CIRCLED NUMBER FIFTY", 12991); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY", 12992); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY", 12993); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH", 12994); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL", 12995); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY", 12996); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE", 12997); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY", 12998); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST", 12999); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER", 13000); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER", 13001); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER", 13002); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER", 13003); - _unicodeCharacterMap.Add("SQUARE HG", 13004); - _unicodeCharacterMap.Add("SQUARE ERG", 13005); - _unicodeCharacterMap.Add("SQUARE EV", 13006); - _unicodeCharacterMap.Add("LIMITED LIABILITY SIGN", 13007); - _unicodeCharacterMap.Add("CIRCLED KATAKANA A", 13008); - _unicodeCharacterMap.Add("CIRCLED KATAKANA I", 13009); - _unicodeCharacterMap.Add("CIRCLED KATAKANA U", 13010); - _unicodeCharacterMap.Add("CIRCLED KATAKANA E", 13011); - _unicodeCharacterMap.Add("CIRCLED KATAKANA O", 13012); - _unicodeCharacterMap.Add("CIRCLED KATAKANA KA", 13013); - _unicodeCharacterMap.Add("CIRCLED KATAKANA KI", 13014); - _unicodeCharacterMap.Add("CIRCLED KATAKANA KU", 13015); - _unicodeCharacterMap.Add("CIRCLED KATAKANA KE", 13016); - _unicodeCharacterMap.Add("CIRCLED KATAKANA KO", 13017); - _unicodeCharacterMap.Add("CIRCLED KATAKANA SA", 13018); - _unicodeCharacterMap.Add("CIRCLED KATAKANA SI", 13019); - _unicodeCharacterMap.Add("CIRCLED KATAKANA SU", 13020); - _unicodeCharacterMap.Add("CIRCLED KATAKANA SE", 13021); - _unicodeCharacterMap.Add("CIRCLED KATAKANA SO", 13022); - _unicodeCharacterMap.Add("CIRCLED KATAKANA TA", 13023); - _unicodeCharacterMap.Add("CIRCLED KATAKANA TI", 13024); - _unicodeCharacterMap.Add("CIRCLED KATAKANA TU", 13025); - _unicodeCharacterMap.Add("CIRCLED KATAKANA TE", 13026); - _unicodeCharacterMap.Add("CIRCLED KATAKANA TO", 13027); - _unicodeCharacterMap.Add("CIRCLED KATAKANA NA", 13028); - _unicodeCharacterMap.Add("CIRCLED KATAKANA NI", 13029); - _unicodeCharacterMap.Add("CIRCLED KATAKANA NU", 13030); - _unicodeCharacterMap.Add("CIRCLED KATAKANA NE", 13031); - _unicodeCharacterMap.Add("CIRCLED KATAKANA NO", 13032); - _unicodeCharacterMap.Add("CIRCLED KATAKANA HA", 13033); - _unicodeCharacterMap.Add("CIRCLED KATAKANA HI", 13034); - _unicodeCharacterMap.Add("CIRCLED KATAKANA HU", 13035); - _unicodeCharacterMap.Add("CIRCLED KATAKANA HE", 13036); - _unicodeCharacterMap.Add("CIRCLED KATAKANA HO", 13037); - _unicodeCharacterMap.Add("CIRCLED KATAKANA MA", 13038); - _unicodeCharacterMap.Add("CIRCLED KATAKANA MI", 13039); - _unicodeCharacterMap.Add("CIRCLED KATAKANA MU", 13040); - _unicodeCharacterMap.Add("CIRCLED KATAKANA ME", 13041); - _unicodeCharacterMap.Add("CIRCLED KATAKANA MO", 13042); - _unicodeCharacterMap.Add("CIRCLED KATAKANA YA", 13043); - _unicodeCharacterMap.Add("CIRCLED KATAKANA YU", 13044); - _unicodeCharacterMap.Add("CIRCLED KATAKANA YO", 13045); - _unicodeCharacterMap.Add("CIRCLED KATAKANA RA", 13046); - _unicodeCharacterMap.Add("CIRCLED KATAKANA RI", 13047); - _unicodeCharacterMap.Add("CIRCLED KATAKANA RU", 13048); - _unicodeCharacterMap.Add("CIRCLED KATAKANA RE", 13049); - _unicodeCharacterMap.Add("CIRCLED KATAKANA RO", 13050); - _unicodeCharacterMap.Add("CIRCLED KATAKANA WA", 13051); - _unicodeCharacterMap.Add("CIRCLED KATAKANA WI", 13052); - _unicodeCharacterMap.Add("CIRCLED KATAKANA WE", 13053); - _unicodeCharacterMap.Add("CIRCLED KATAKANA WO", 13054); - _unicodeCharacterMap.Add("SQUARE APAATO", 13056); - _unicodeCharacterMap.Add("SQUARE ARUHUA", 13057); - _unicodeCharacterMap.Add("SQUARE ANPEA", 13058); - _unicodeCharacterMap.Add("SQUARE AARU", 13059); - _unicodeCharacterMap.Add("SQUARE ININGU", 13060); - _unicodeCharacterMap.Add("SQUARE INTI", 13061); - _unicodeCharacterMap.Add("SQUARE UON", 13062); - _unicodeCharacterMap.Add("SQUARE ESUKUUDO", 13063); - _unicodeCharacterMap.Add("SQUARE EEKAA", 13064); - _unicodeCharacterMap.Add("SQUARE ONSU", 13065); - _unicodeCharacterMap.Add("SQUARE OOMU", 13066); - _unicodeCharacterMap.Add("SQUARE KAIRI", 13067); - _unicodeCharacterMap.Add("SQUARE KARATTO", 13068); - _unicodeCharacterMap.Add("SQUARE KARORII", 13069); - _unicodeCharacterMap.Add("SQUARE GARON", 13070); - _unicodeCharacterMap.Add("SQUARE GANMA", 13071); - _unicodeCharacterMap.Add("SQUARE GIGA", 13072); - _unicodeCharacterMap.Add("SQUARE GINII", 13073); - _unicodeCharacterMap.Add("SQUARE KYURII", 13074); - _unicodeCharacterMap.Add("SQUARE GIRUDAA", 13075); - _unicodeCharacterMap.Add("SQUARE KIRO", 13076); - _unicodeCharacterMap.Add("SQUARE KIROGURAMU", 13077); - _unicodeCharacterMap.Add("SQUARE KIROMEETORU", 13078); - _unicodeCharacterMap.Add("SQUARE KIROWATTO", 13079); - _unicodeCharacterMap.Add("SQUARE GURAMU", 13080); - _unicodeCharacterMap.Add("SQUARE GURAMUTON", 13081); - _unicodeCharacterMap.Add("SQUARE KURUZEIRO", 13082); - _unicodeCharacterMap.Add("SQUARE KUROONE", 13083); - _unicodeCharacterMap.Add("SQUARE KEESU", 13084); - _unicodeCharacterMap.Add("SQUARE KORUNA", 13085); - _unicodeCharacterMap.Add("SQUARE KOOPO", 13086); - _unicodeCharacterMap.Add("SQUARE SAIKURU", 13087); - _unicodeCharacterMap.Add("SQUARE SANTIIMU", 13088); - _unicodeCharacterMap.Add("SQUARE SIRINGU", 13089); - _unicodeCharacterMap.Add("SQUARE SENTI", 13090); - _unicodeCharacterMap.Add("SQUARE SENTO", 13091); - _unicodeCharacterMap.Add("SQUARE DAASU", 13092); - _unicodeCharacterMap.Add("SQUARE DESI", 13093); - _unicodeCharacterMap.Add("SQUARE DORU", 13094); - _unicodeCharacterMap.Add("SQUARE TON", 13095); - _unicodeCharacterMap.Add("SQUARE NANO", 13096); - _unicodeCharacterMap.Add("SQUARE NOTTO", 13097); - _unicodeCharacterMap.Add("SQUARE HAITU", 13098); - _unicodeCharacterMap.Add("SQUARE PAASENTO", 13099); - _unicodeCharacterMap.Add("SQUARE PAATU", 13100); - _unicodeCharacterMap.Add("SQUARE BAARERU", 13101); - _unicodeCharacterMap.Add("SQUARE PIASUTORU", 13102); - _unicodeCharacterMap.Add("SQUARE PIKURU", 13103); - _unicodeCharacterMap.Add("SQUARE PIKO", 13104); - _unicodeCharacterMap.Add("SQUARE BIRU", 13105); - _unicodeCharacterMap.Add("SQUARE HUARADDO", 13106); - _unicodeCharacterMap.Add("SQUARE HUIITO", 13107); - _unicodeCharacterMap.Add("SQUARE BUSSYERU", 13108); - _unicodeCharacterMap.Add("SQUARE HURAN", 13109); - _unicodeCharacterMap.Add("SQUARE HEKUTAARU", 13110); - _unicodeCharacterMap.Add("SQUARE PESO", 13111); - _unicodeCharacterMap.Add("SQUARE PENIHI", 13112); - _unicodeCharacterMap.Add("SQUARE HERUTU", 13113); - _unicodeCharacterMap.Add("SQUARE PENSU", 13114); - _unicodeCharacterMap.Add("SQUARE PEEZI", 13115); - _unicodeCharacterMap.Add("SQUARE BEETA", 13116); - _unicodeCharacterMap.Add("SQUARE POINTO", 13117); - _unicodeCharacterMap.Add("SQUARE BORUTO", 13118); - _unicodeCharacterMap.Add("SQUARE HON", 13119); - _unicodeCharacterMap.Add("SQUARE PONDO", 13120); - _unicodeCharacterMap.Add("SQUARE HOORU", 13121); - _unicodeCharacterMap.Add("SQUARE HOON", 13122); - _unicodeCharacterMap.Add("SQUARE MAIKURO", 13123); - _unicodeCharacterMap.Add("SQUARE MAIRU", 13124); - _unicodeCharacterMap.Add("SQUARE MAHHA", 13125); - _unicodeCharacterMap.Add("SQUARE MARUKU", 13126); - _unicodeCharacterMap.Add("SQUARE MANSYON", 13127); - _unicodeCharacterMap.Add("SQUARE MIKURON", 13128); - _unicodeCharacterMap.Add("SQUARE MIRI", 13129); - _unicodeCharacterMap.Add("SQUARE MIRIBAARU", 13130); - _unicodeCharacterMap.Add("SQUARE MEGA", 13131); - _unicodeCharacterMap.Add("SQUARE MEGATON", 13132); - _unicodeCharacterMap.Add("SQUARE MEETORU", 13133); - _unicodeCharacterMap.Add("SQUARE YAADO", 13134); - _unicodeCharacterMap.Add("SQUARE YAARU", 13135); - _unicodeCharacterMap.Add("SQUARE YUAN", 13136); - _unicodeCharacterMap.Add("SQUARE RITTORU", 13137); - _unicodeCharacterMap.Add("SQUARE RIRA", 13138); - _unicodeCharacterMap.Add("SQUARE RUPII", 13139); - _unicodeCharacterMap.Add("SQUARE RUUBURU", 13140); - _unicodeCharacterMap.Add("SQUARE REMU", 13141); - _unicodeCharacterMap.Add("SQUARE RENTOGEN", 13142); - _unicodeCharacterMap.Add("SQUARE WATTO", 13143); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO", 13144); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE", 13145); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO", 13146); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE", 13147); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR", 13148); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE", 13149); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX", 13150); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN", 13151); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT", 13152); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE", 13153); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN", 13154); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN", 13155); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE", 13156); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN", 13157); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN", 13158); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN", 13159); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN", 13160); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN", 13161); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN", 13162); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN", 13163); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY", 13164); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY ONE", 13165); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY TWO", 13166); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY THREE", 13167); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY FOUR", 13168); - _unicodeCharacterMap.Add("SQUARE HPA", 13169); - _unicodeCharacterMap.Add("SQUARE DA", 13170); - _unicodeCharacterMap.Add("SQUARE AU", 13171); - _unicodeCharacterMap.Add("SQUARE BAR", 13172); - _unicodeCharacterMap.Add("SQUARE OV", 13173); - _unicodeCharacterMap.Add("SQUARE PC", 13174); - _unicodeCharacterMap.Add("SQUARE DM", 13175); - _unicodeCharacterMap.Add("SQUARE DM SQUARED", 13176); - _unicodeCharacterMap.Add("SQUARE DM CUBED", 13177); - _unicodeCharacterMap.Add("SQUARE IU", 13178); - _unicodeCharacterMap.Add("SQUARE ERA NAME HEISEI", 13179); - _unicodeCharacterMap.Add("SQUARE ERA NAME SYOUWA", 13180); - _unicodeCharacterMap.Add("SQUARE ERA NAME TAISYOU", 13181); - _unicodeCharacterMap.Add("SQUARE ERA NAME MEIZI", 13182); - _unicodeCharacterMap.Add("SQUARE CORPORATION", 13183); - _unicodeCharacterMap.Add("SQUARE PA AMPS", 13184); - _unicodeCharacterMap.Add("SQUARE NA", 13185); - _unicodeCharacterMap.Add("SQUARE MU A", 13186); - _unicodeCharacterMap.Add("SQUARE MA", 13187); - _unicodeCharacterMap.Add("SQUARE KA", 13188); - _unicodeCharacterMap.Add("SQUARE KB", 13189); - _unicodeCharacterMap.Add("SQUARE MB", 13190); - _unicodeCharacterMap.Add("SQUARE GB", 13191); - _unicodeCharacterMap.Add("SQUARE CAL", 13192); - _unicodeCharacterMap.Add("SQUARE KCAL", 13193); - _unicodeCharacterMap.Add("SQUARE PF", 13194); - _unicodeCharacterMap.Add("SQUARE NF", 13195); - _unicodeCharacterMap.Add("SQUARE MU F", 13196); - _unicodeCharacterMap.Add("SQUARE MU G", 13197); - _unicodeCharacterMap.Add("SQUARE MG", 13198); - _unicodeCharacterMap.Add("SQUARE KG", 13199); - _unicodeCharacterMap.Add("SQUARE HZ", 13200); - _unicodeCharacterMap.Add("SQUARE KHZ", 13201); - _unicodeCharacterMap.Add("SQUARE MHZ", 13202); - _unicodeCharacterMap.Add("SQUARE GHZ", 13203); - _unicodeCharacterMap.Add("SQUARE THZ", 13204); - _unicodeCharacterMap.Add("SQUARE MU L", 13205); - _unicodeCharacterMap.Add("SQUARE ML", 13206); - _unicodeCharacterMap.Add("SQUARE DL", 13207); - _unicodeCharacterMap.Add("SQUARE KL", 13208); - _unicodeCharacterMap.Add("SQUARE FM", 13209); - _unicodeCharacterMap.Add("SQUARE NM", 13210); - _unicodeCharacterMap.Add("SQUARE MU M", 13211); - _unicodeCharacterMap.Add("SQUARE MM", 13212); - _unicodeCharacterMap.Add("SQUARE CM", 13213); - _unicodeCharacterMap.Add("SQUARE KM", 13214); - _unicodeCharacterMap.Add("SQUARE MM SQUARED", 13215); - _unicodeCharacterMap.Add("SQUARE CM SQUARED", 13216); - _unicodeCharacterMap.Add("SQUARE M SQUARED", 13217); - _unicodeCharacterMap.Add("SQUARE KM SQUARED", 13218); - _unicodeCharacterMap.Add("SQUARE MM CUBED", 13219); - _unicodeCharacterMap.Add("SQUARE CM CUBED", 13220); - _unicodeCharacterMap.Add("SQUARE M CUBED", 13221); - _unicodeCharacterMap.Add("SQUARE KM CUBED", 13222); - _unicodeCharacterMap.Add("SQUARE M OVER S", 13223); - _unicodeCharacterMap.Add("SQUARE M OVER S SQUARED", 13224); - _unicodeCharacterMap.Add("SQUARE PA", 13225); - _unicodeCharacterMap.Add("SQUARE KPA", 13226); - _unicodeCharacterMap.Add("SQUARE MPA", 13227); - _unicodeCharacterMap.Add("SQUARE GPA", 13228); - _unicodeCharacterMap.Add("SQUARE RAD", 13229); - _unicodeCharacterMap.Add("SQUARE RAD OVER S", 13230); - _unicodeCharacterMap.Add("SQUARE RAD OVER S SQUARED", 13231); - _unicodeCharacterMap.Add("SQUARE PS", 13232); - _unicodeCharacterMap.Add("SQUARE NS", 13233); - _unicodeCharacterMap.Add("SQUARE MU S", 13234); - _unicodeCharacterMap.Add("SQUARE MS", 13235); - _unicodeCharacterMap.Add("SQUARE PV", 13236); - _unicodeCharacterMap.Add("SQUARE NV", 13237); - _unicodeCharacterMap.Add("SQUARE MU V", 13238); - _unicodeCharacterMap.Add("SQUARE MV", 13239); - _unicodeCharacterMap.Add("SQUARE KV", 13240); - _unicodeCharacterMap.Add("SQUARE MV MEGA", 13241); - _unicodeCharacterMap.Add("SQUARE PW", 13242); - _unicodeCharacterMap.Add("SQUARE NW", 13243); - _unicodeCharacterMap.Add("SQUARE MU W", 13244); - _unicodeCharacterMap.Add("SQUARE MW", 13245); - _unicodeCharacterMap.Add("SQUARE KW", 13246); - _unicodeCharacterMap.Add("SQUARE MW MEGA", 13247); - _unicodeCharacterMap.Add("SQUARE K OHM", 13248); - _unicodeCharacterMap.Add("SQUARE M OHM", 13249); - _unicodeCharacterMap.Add("SQUARE AM", 13250); - _unicodeCharacterMap.Add("SQUARE BQ", 13251); - _unicodeCharacterMap.Add("SQUARE CC", 13252); - _unicodeCharacterMap.Add("SQUARE CD", 13253); - _unicodeCharacterMap.Add("SQUARE C OVER KG", 13254); - _unicodeCharacterMap.Add("SQUARE CO", 13255); - _unicodeCharacterMap.Add("SQUARE DB", 13256); - _unicodeCharacterMap.Add("SQUARE GY", 13257); - _unicodeCharacterMap.Add("SQUARE HA", 13258); - _unicodeCharacterMap.Add("SQUARE HP", 13259); - _unicodeCharacterMap.Add("SQUARE IN", 13260); - _unicodeCharacterMap.Add("SQUARE KK", 13261); - _unicodeCharacterMap.Add("SQUARE KM CAPITAL", 13262); - _unicodeCharacterMap.Add("SQUARE KT", 13263); - _unicodeCharacterMap.Add("SQUARE LM", 13264); - _unicodeCharacterMap.Add("SQUARE LN", 13265); - _unicodeCharacterMap.Add("SQUARE LOG", 13266); - _unicodeCharacterMap.Add("SQUARE LX", 13267); - _unicodeCharacterMap.Add("SQUARE MB SMALL", 13268); - _unicodeCharacterMap.Add("SQUARE MIL", 13269); - _unicodeCharacterMap.Add("SQUARE MOL", 13270); - _unicodeCharacterMap.Add("SQUARE PH", 13271); - _unicodeCharacterMap.Add("SQUARE PM", 13272); - _unicodeCharacterMap.Add("SQUARE PPM", 13273); - _unicodeCharacterMap.Add("SQUARE PR", 13274); - _unicodeCharacterMap.Add("SQUARE SR", 13275); - _unicodeCharacterMap.Add("SQUARE SV", 13276); - _unicodeCharacterMap.Add("SQUARE WB", 13277); - _unicodeCharacterMap.Add("SQUARE V OVER M", 13278); - _unicodeCharacterMap.Add("SQUARE A OVER M", 13279); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE", 13280); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO", 13281); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE", 13282); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR", 13283); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE", 13284); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX", 13285); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN", 13286); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT", 13287); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE", 13288); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN", 13289); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN", 13290); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE", 13291); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN", 13292); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN", 13293); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN", 13294); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN", 13295); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN", 13296); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN", 13297); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN", 13298); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY", 13299); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY ONE", 13300); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY TWO", 13301); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY THREE", 13302); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY FOUR", 13303); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY FIVE", 13304); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY SIX", 13305); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY SEVEN", 13306); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY EIGHT", 13307); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY NINE", 13308); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY", 13309); - _unicodeCharacterMap.Add("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY ONE", 13310); - _unicodeCharacterMap.Add("SQUARE GAL", 13311); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE CREATIVE HEAVEN", 19904); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE RECEPTIVE EARTH", 19905); - _unicodeCharacterMap.Add("HEXAGRAM FOR DIFFICULTY AT THE BEGINNING", 19906); - _unicodeCharacterMap.Add("HEXAGRAM FOR YOUTHFUL FOLLY", 19907); - _unicodeCharacterMap.Add("HEXAGRAM FOR WAITING", 19908); - _unicodeCharacterMap.Add("HEXAGRAM FOR CONFLICT", 19909); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE ARMY", 19910); - _unicodeCharacterMap.Add("HEXAGRAM FOR HOLDING TOGETHER", 19911); - _unicodeCharacterMap.Add("HEXAGRAM FOR SMALL TAMING", 19912); - _unicodeCharacterMap.Add("HEXAGRAM FOR TREADING", 19913); - _unicodeCharacterMap.Add("HEXAGRAM FOR PEACE", 19914); - _unicodeCharacterMap.Add("HEXAGRAM FOR STANDSTILL", 19915); - _unicodeCharacterMap.Add("HEXAGRAM FOR FELLOWSHIP", 19916); - _unicodeCharacterMap.Add("HEXAGRAM FOR GREAT POSSESSION", 19917); - _unicodeCharacterMap.Add("HEXAGRAM FOR MODESTY", 19918); - _unicodeCharacterMap.Add("HEXAGRAM FOR ENTHUSIASM", 19919); - _unicodeCharacterMap.Add("HEXAGRAM FOR FOLLOWING", 19920); - _unicodeCharacterMap.Add("HEXAGRAM FOR WORK ON THE DECAYED", 19921); - _unicodeCharacterMap.Add("HEXAGRAM FOR APPROACH", 19922); - _unicodeCharacterMap.Add("HEXAGRAM FOR CONTEMPLATION", 19923); - _unicodeCharacterMap.Add("HEXAGRAM FOR BITING THROUGH", 19924); - _unicodeCharacterMap.Add("HEXAGRAM FOR GRACE", 19925); - _unicodeCharacterMap.Add("HEXAGRAM FOR SPLITTING APART", 19926); - _unicodeCharacterMap.Add("HEXAGRAM FOR RETURN", 19927); - _unicodeCharacterMap.Add("HEXAGRAM FOR INNOCENCE", 19928); - _unicodeCharacterMap.Add("HEXAGRAM FOR GREAT TAMING", 19929); - _unicodeCharacterMap.Add("HEXAGRAM FOR MOUTH CORNERS", 19930); - _unicodeCharacterMap.Add("HEXAGRAM FOR GREAT PREPONDERANCE", 19931); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE ABYSMAL WATER", 19932); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE CLINGING FIRE", 19933); - _unicodeCharacterMap.Add("HEXAGRAM FOR INFLUENCE", 19934); - _unicodeCharacterMap.Add("HEXAGRAM FOR DURATION", 19935); - _unicodeCharacterMap.Add("HEXAGRAM FOR RETREAT", 19936); - _unicodeCharacterMap.Add("HEXAGRAM FOR GREAT POWER", 19937); - _unicodeCharacterMap.Add("HEXAGRAM FOR PROGRESS", 19938); - _unicodeCharacterMap.Add("HEXAGRAM FOR DARKENING OF THE LIGHT", 19939); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE FAMILY", 19940); - _unicodeCharacterMap.Add("HEXAGRAM FOR OPPOSITION", 19941); - _unicodeCharacterMap.Add("HEXAGRAM FOR OBSTRUCTION", 19942); - _unicodeCharacterMap.Add("HEXAGRAM FOR DELIVERANCE", 19943); - _unicodeCharacterMap.Add("HEXAGRAM FOR DECREASE", 19944); - _unicodeCharacterMap.Add("HEXAGRAM FOR INCREASE", 19945); - _unicodeCharacterMap.Add("HEXAGRAM FOR BREAKTHROUGH", 19946); - _unicodeCharacterMap.Add("HEXAGRAM FOR COMING TO MEET", 19947); - _unicodeCharacterMap.Add("HEXAGRAM FOR GATHERING TOGETHER", 19948); - _unicodeCharacterMap.Add("HEXAGRAM FOR PUSHING UPWARD", 19949); - _unicodeCharacterMap.Add("HEXAGRAM FOR OPPRESSION", 19950); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE WELL", 19951); - _unicodeCharacterMap.Add("HEXAGRAM FOR REVOLUTION", 19952); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE CAULDRON", 19953); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE AROUSING THUNDER", 19954); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE KEEPING STILL MOUNTAIN", 19955); - _unicodeCharacterMap.Add("HEXAGRAM FOR DEVELOPMENT", 19956); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE MARRYING MAIDEN", 19957); - _unicodeCharacterMap.Add("HEXAGRAM FOR ABUNDANCE", 19958); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE WANDERER", 19959); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE GENTLE WIND", 19960); - _unicodeCharacterMap.Add("HEXAGRAM FOR THE JOYOUS LAKE", 19961); - _unicodeCharacterMap.Add("HEXAGRAM FOR DISPERSION", 19962); - _unicodeCharacterMap.Add("HEXAGRAM FOR LIMITATION", 19963); - _unicodeCharacterMap.Add("HEXAGRAM FOR INNER TRUTH", 19964); - _unicodeCharacterMap.Add("HEXAGRAM FOR SMALL PREPONDERANCE", 19965); - _unicodeCharacterMap.Add("HEXAGRAM FOR AFTER COMPLETION", 19966); - _unicodeCharacterMap.Add("HEXAGRAM FOR BEFORE COMPLETION", 19967); - _unicodeCharacterMap.Add("YI SYLLABLE IT", 40960); - _unicodeCharacterMap.Add("YI SYLLABLE IX", 40961); - _unicodeCharacterMap.Add("YI SYLLABLE I", 40962); - _unicodeCharacterMap.Add("YI SYLLABLE IP", 40963); - _unicodeCharacterMap.Add("YI SYLLABLE IET", 40964); - _unicodeCharacterMap.Add("YI SYLLABLE IEX", 40965); - _unicodeCharacterMap.Add("YI SYLLABLE IE", 40966); - _unicodeCharacterMap.Add("YI SYLLABLE IEP", 40967); - _unicodeCharacterMap.Add("YI SYLLABLE AT", 40968); - _unicodeCharacterMap.Add("YI SYLLABLE AX", 40969); - _unicodeCharacterMap.Add("YI SYLLABLE A", 40970); - _unicodeCharacterMap.Add("YI SYLLABLE AP", 40971); - _unicodeCharacterMap.Add("YI SYLLABLE UOX", 40972); - _unicodeCharacterMap.Add("YI SYLLABLE UO", 40973); - _unicodeCharacterMap.Add("YI SYLLABLE UOP", 40974); - _unicodeCharacterMap.Add("YI SYLLABLE OT", 40975); - _unicodeCharacterMap.Add("YI SYLLABLE OX", 40976); - _unicodeCharacterMap.Add("YI SYLLABLE O", 40977); - _unicodeCharacterMap.Add("YI SYLLABLE OP", 40978); - _unicodeCharacterMap.Add("YI SYLLABLE EX", 40979); - _unicodeCharacterMap.Add("YI SYLLABLE E", 40980); - _unicodeCharacterMap.Add("YI SYLLABLE WU", 40981); - _unicodeCharacterMap.Add("YI SYLLABLE BIT", 40982); - _unicodeCharacterMap.Add("YI SYLLABLE BIX", 40983); - _unicodeCharacterMap.Add("YI SYLLABLE BI", 40984); - _unicodeCharacterMap.Add("YI SYLLABLE BIP", 40985); - _unicodeCharacterMap.Add("YI SYLLABLE BIET", 40986); - _unicodeCharacterMap.Add("YI SYLLABLE BIEX", 40987); - _unicodeCharacterMap.Add("YI SYLLABLE BIE", 40988); - _unicodeCharacterMap.Add("YI SYLLABLE BIEP", 40989); - _unicodeCharacterMap.Add("YI SYLLABLE BAT", 40990); - _unicodeCharacterMap.Add("YI SYLLABLE BAX", 40991); - _unicodeCharacterMap.Add("YI SYLLABLE BA", 40992); - _unicodeCharacterMap.Add("YI SYLLABLE BAP", 40993); - _unicodeCharacterMap.Add("YI SYLLABLE BUOX", 40994); - _unicodeCharacterMap.Add("YI SYLLABLE BUO", 40995); - _unicodeCharacterMap.Add("YI SYLLABLE BUOP", 40996); - _unicodeCharacterMap.Add("YI SYLLABLE BOT", 40997); - _unicodeCharacterMap.Add("YI SYLLABLE BOX", 40998); - _unicodeCharacterMap.Add("YI SYLLABLE BO", 40999); - _unicodeCharacterMap.Add("YI SYLLABLE BOP", 41000); - _unicodeCharacterMap.Add("YI SYLLABLE BEX", 41001); - _unicodeCharacterMap.Add("YI SYLLABLE BE", 41002); - _unicodeCharacterMap.Add("YI SYLLABLE BEP", 41003); - _unicodeCharacterMap.Add("YI SYLLABLE BUT", 41004); - _unicodeCharacterMap.Add("YI SYLLABLE BUX", 41005); - _unicodeCharacterMap.Add("YI SYLLABLE BU", 41006); - _unicodeCharacterMap.Add("YI SYLLABLE BUP", 41007); - _unicodeCharacterMap.Add("YI SYLLABLE BURX", 41008); - _unicodeCharacterMap.Add("YI SYLLABLE BUR", 41009); - _unicodeCharacterMap.Add("YI SYLLABLE BYT", 41010); - _unicodeCharacterMap.Add("YI SYLLABLE BYX", 41011); - _unicodeCharacterMap.Add("YI SYLLABLE BY", 41012); - _unicodeCharacterMap.Add("YI SYLLABLE BYP", 41013); - _unicodeCharacterMap.Add("YI SYLLABLE BYRX", 41014); - _unicodeCharacterMap.Add("YI SYLLABLE BYR", 41015); - _unicodeCharacterMap.Add("YI SYLLABLE PIT", 41016); - _unicodeCharacterMap.Add("YI SYLLABLE PIX", 41017); - _unicodeCharacterMap.Add("YI SYLLABLE PI", 41018); - _unicodeCharacterMap.Add("YI SYLLABLE PIP", 41019); - _unicodeCharacterMap.Add("YI SYLLABLE PIEX", 41020); - _unicodeCharacterMap.Add("YI SYLLABLE PIE", 41021); - _unicodeCharacterMap.Add("YI SYLLABLE PIEP", 41022); - _unicodeCharacterMap.Add("YI SYLLABLE PAT", 41023); - _unicodeCharacterMap.Add("YI SYLLABLE PAX", 41024); - _unicodeCharacterMap.Add("YI SYLLABLE PA", 41025); - _unicodeCharacterMap.Add("YI SYLLABLE PAP", 41026); - _unicodeCharacterMap.Add("YI SYLLABLE PUOX", 41027); - _unicodeCharacterMap.Add("YI SYLLABLE PUO", 41028); - _unicodeCharacterMap.Add("YI SYLLABLE PUOP", 41029); - _unicodeCharacterMap.Add("YI SYLLABLE POT", 41030); - _unicodeCharacterMap.Add("YI SYLLABLE POX", 41031); - _unicodeCharacterMap.Add("YI SYLLABLE PO", 41032); - _unicodeCharacterMap.Add("YI SYLLABLE POP", 41033); - _unicodeCharacterMap.Add("YI SYLLABLE PUT", 41034); - _unicodeCharacterMap.Add("YI SYLLABLE PUX", 41035); - _unicodeCharacterMap.Add("YI SYLLABLE PU", 41036); - _unicodeCharacterMap.Add("YI SYLLABLE PUP", 41037); - _unicodeCharacterMap.Add("YI SYLLABLE PURX", 41038); - _unicodeCharacterMap.Add("YI SYLLABLE PUR", 41039); - _unicodeCharacterMap.Add("YI SYLLABLE PYT", 41040); - _unicodeCharacterMap.Add("YI SYLLABLE PYX", 41041); - _unicodeCharacterMap.Add("YI SYLLABLE PY", 41042); - _unicodeCharacterMap.Add("YI SYLLABLE PYP", 41043); - _unicodeCharacterMap.Add("YI SYLLABLE PYRX", 41044); - _unicodeCharacterMap.Add("YI SYLLABLE PYR", 41045); - _unicodeCharacterMap.Add("YI SYLLABLE BBIT", 41046); - _unicodeCharacterMap.Add("YI SYLLABLE BBIX", 41047); - _unicodeCharacterMap.Add("YI SYLLABLE BBI", 41048); - _unicodeCharacterMap.Add("YI SYLLABLE BBIP", 41049); - _unicodeCharacterMap.Add("YI SYLLABLE BBIET", 41050); - _unicodeCharacterMap.Add("YI SYLLABLE BBIEX", 41051); - _unicodeCharacterMap.Add("YI SYLLABLE BBIE", 41052); - _unicodeCharacterMap.Add("YI SYLLABLE BBIEP", 41053); - _unicodeCharacterMap.Add("YI SYLLABLE BBAT", 41054); - _unicodeCharacterMap.Add("YI SYLLABLE BBAX", 41055); - _unicodeCharacterMap.Add("YI SYLLABLE BBA", 41056); - _unicodeCharacterMap.Add("YI SYLLABLE BBAP", 41057); - _unicodeCharacterMap.Add("YI SYLLABLE BBUOX", 41058); - _unicodeCharacterMap.Add("YI SYLLABLE BBUO", 41059); - _unicodeCharacterMap.Add("YI SYLLABLE BBUOP", 41060); - _unicodeCharacterMap.Add("YI SYLLABLE BBOT", 41061); - _unicodeCharacterMap.Add("YI SYLLABLE BBOX", 41062); - _unicodeCharacterMap.Add("YI SYLLABLE BBO", 41063); - _unicodeCharacterMap.Add("YI SYLLABLE BBOP", 41064); - _unicodeCharacterMap.Add("YI SYLLABLE BBEX", 41065); - _unicodeCharacterMap.Add("YI SYLLABLE BBE", 41066); - _unicodeCharacterMap.Add("YI SYLLABLE BBEP", 41067); - _unicodeCharacterMap.Add("YI SYLLABLE BBUT", 41068); - _unicodeCharacterMap.Add("YI SYLLABLE BBUX", 41069); - _unicodeCharacterMap.Add("YI SYLLABLE BBU", 41070); - _unicodeCharacterMap.Add("YI SYLLABLE BBUP", 41071); - _unicodeCharacterMap.Add("YI SYLLABLE BBURX", 41072); - _unicodeCharacterMap.Add("YI SYLLABLE BBUR", 41073); - _unicodeCharacterMap.Add("YI SYLLABLE BBYT", 41074); - _unicodeCharacterMap.Add("YI SYLLABLE BBYX", 41075); - _unicodeCharacterMap.Add("YI SYLLABLE BBY", 41076); - _unicodeCharacterMap.Add("YI SYLLABLE BBYP", 41077); - _unicodeCharacterMap.Add("YI SYLLABLE NBIT", 41078); - _unicodeCharacterMap.Add("YI SYLLABLE NBIX", 41079); - _unicodeCharacterMap.Add("YI SYLLABLE NBI", 41080); - _unicodeCharacterMap.Add("YI SYLLABLE NBIP", 41081); - _unicodeCharacterMap.Add("YI SYLLABLE NBIEX", 41082); - _unicodeCharacterMap.Add("YI SYLLABLE NBIE", 41083); - _unicodeCharacterMap.Add("YI SYLLABLE NBIEP", 41084); - _unicodeCharacterMap.Add("YI SYLLABLE NBAT", 41085); - _unicodeCharacterMap.Add("YI SYLLABLE NBAX", 41086); - _unicodeCharacterMap.Add("YI SYLLABLE NBA", 41087); - _unicodeCharacterMap.Add("YI SYLLABLE NBAP", 41088); - _unicodeCharacterMap.Add("YI SYLLABLE NBOT", 41089); - _unicodeCharacterMap.Add("YI SYLLABLE NBOX", 41090); - _unicodeCharacterMap.Add("YI SYLLABLE NBO", 41091); - _unicodeCharacterMap.Add("YI SYLLABLE NBOP", 41092); - _unicodeCharacterMap.Add("YI SYLLABLE NBUT", 41093); - _unicodeCharacterMap.Add("YI SYLLABLE NBUX", 41094); - _unicodeCharacterMap.Add("YI SYLLABLE NBU", 41095); - _unicodeCharacterMap.Add("YI SYLLABLE NBUP", 41096); - _unicodeCharacterMap.Add("YI SYLLABLE NBURX", 41097); - _unicodeCharacterMap.Add("YI SYLLABLE NBUR", 41098); - _unicodeCharacterMap.Add("YI SYLLABLE NBYT", 41099); - _unicodeCharacterMap.Add("YI SYLLABLE NBYX", 41100); - _unicodeCharacterMap.Add("YI SYLLABLE NBY", 41101); - _unicodeCharacterMap.Add("YI SYLLABLE NBYP", 41102); - _unicodeCharacterMap.Add("YI SYLLABLE NBYRX", 41103); - _unicodeCharacterMap.Add("YI SYLLABLE NBYR", 41104); - _unicodeCharacterMap.Add("YI SYLLABLE HMIT", 41105); - _unicodeCharacterMap.Add("YI SYLLABLE HMIX", 41106); - _unicodeCharacterMap.Add("YI SYLLABLE HMI", 41107); - _unicodeCharacterMap.Add("YI SYLLABLE HMIP", 41108); - _unicodeCharacterMap.Add("YI SYLLABLE HMIEX", 41109); - _unicodeCharacterMap.Add("YI SYLLABLE HMIE", 41110); - _unicodeCharacterMap.Add("YI SYLLABLE HMIEP", 41111); - _unicodeCharacterMap.Add("YI SYLLABLE HMAT", 41112); - _unicodeCharacterMap.Add("YI SYLLABLE HMAX", 41113); - _unicodeCharacterMap.Add("YI SYLLABLE HMA", 41114); - _unicodeCharacterMap.Add("YI SYLLABLE HMAP", 41115); - _unicodeCharacterMap.Add("YI SYLLABLE HMUOX", 41116); - _unicodeCharacterMap.Add("YI SYLLABLE HMUO", 41117); - _unicodeCharacterMap.Add("YI SYLLABLE HMUOP", 41118); - _unicodeCharacterMap.Add("YI SYLLABLE HMOT", 41119); - _unicodeCharacterMap.Add("YI SYLLABLE HMOX", 41120); - _unicodeCharacterMap.Add("YI SYLLABLE HMO", 41121); - _unicodeCharacterMap.Add("YI SYLLABLE HMOP", 41122); - _unicodeCharacterMap.Add("YI SYLLABLE HMUT", 41123); - _unicodeCharacterMap.Add("YI SYLLABLE HMUX", 41124); - _unicodeCharacterMap.Add("YI SYLLABLE HMU", 41125); - _unicodeCharacterMap.Add("YI SYLLABLE HMUP", 41126); - _unicodeCharacterMap.Add("YI SYLLABLE HMURX", 41127); - _unicodeCharacterMap.Add("YI SYLLABLE HMUR", 41128); - _unicodeCharacterMap.Add("YI SYLLABLE HMYX", 41129); - _unicodeCharacterMap.Add("YI SYLLABLE HMY", 41130); - _unicodeCharacterMap.Add("YI SYLLABLE HMYP", 41131); - _unicodeCharacterMap.Add("YI SYLLABLE HMYRX", 41132); - _unicodeCharacterMap.Add("YI SYLLABLE HMYR", 41133); - _unicodeCharacterMap.Add("YI SYLLABLE MIT", 41134); - _unicodeCharacterMap.Add("YI SYLLABLE MIX", 41135); - _unicodeCharacterMap.Add("YI SYLLABLE MI", 41136); - _unicodeCharacterMap.Add("YI SYLLABLE MIP", 41137); - _unicodeCharacterMap.Add("YI SYLLABLE MIEX", 41138); - _unicodeCharacterMap.Add("YI SYLLABLE MIE", 41139); - _unicodeCharacterMap.Add("YI SYLLABLE MIEP", 41140); - _unicodeCharacterMap.Add("YI SYLLABLE MAT", 41141); - _unicodeCharacterMap.Add("YI SYLLABLE MAX", 41142); - _unicodeCharacterMap.Add("YI SYLLABLE MA", 41143); - _unicodeCharacterMap.Add("YI SYLLABLE MAP", 41144); - _unicodeCharacterMap.Add("YI SYLLABLE MUOT", 41145); - _unicodeCharacterMap.Add("YI SYLLABLE MUOX", 41146); - _unicodeCharacterMap.Add("YI SYLLABLE MUO", 41147); - _unicodeCharacterMap.Add("YI SYLLABLE MUOP", 41148); - _unicodeCharacterMap.Add("YI SYLLABLE MOT", 41149); - _unicodeCharacterMap.Add("YI SYLLABLE MOX", 41150); - _unicodeCharacterMap.Add("YI SYLLABLE MO", 41151); - _unicodeCharacterMap.Add("YI SYLLABLE MOP", 41152); - _unicodeCharacterMap.Add("YI SYLLABLE MEX", 41153); - _unicodeCharacterMap.Add("YI SYLLABLE ME", 41154); - _unicodeCharacterMap.Add("YI SYLLABLE MUT", 41155); - _unicodeCharacterMap.Add("YI SYLLABLE MUX", 41156); - _unicodeCharacterMap.Add("YI SYLLABLE MU", 41157); - _unicodeCharacterMap.Add("YI SYLLABLE MUP", 41158); - _unicodeCharacterMap.Add("YI SYLLABLE MURX", 41159); - _unicodeCharacterMap.Add("YI SYLLABLE MUR", 41160); - _unicodeCharacterMap.Add("YI SYLLABLE MYT", 41161); - _unicodeCharacterMap.Add("YI SYLLABLE MYX", 41162); - _unicodeCharacterMap.Add("YI SYLLABLE MY", 41163); - _unicodeCharacterMap.Add("YI SYLLABLE MYP", 41164); - _unicodeCharacterMap.Add("YI SYLLABLE FIT", 41165); - _unicodeCharacterMap.Add("YI SYLLABLE FIX", 41166); - _unicodeCharacterMap.Add("YI SYLLABLE FI", 41167); - _unicodeCharacterMap.Add("YI SYLLABLE FIP", 41168); - _unicodeCharacterMap.Add("YI SYLLABLE FAT", 41169); - _unicodeCharacterMap.Add("YI SYLLABLE FAX", 41170); - _unicodeCharacterMap.Add("YI SYLLABLE FA", 41171); - _unicodeCharacterMap.Add("YI SYLLABLE FAP", 41172); - _unicodeCharacterMap.Add("YI SYLLABLE FOX", 41173); - _unicodeCharacterMap.Add("YI SYLLABLE FO", 41174); - _unicodeCharacterMap.Add("YI SYLLABLE FOP", 41175); - _unicodeCharacterMap.Add("YI SYLLABLE FUT", 41176); - _unicodeCharacterMap.Add("YI SYLLABLE FUX", 41177); - _unicodeCharacterMap.Add("YI SYLLABLE FU", 41178); - _unicodeCharacterMap.Add("YI SYLLABLE FUP", 41179); - _unicodeCharacterMap.Add("YI SYLLABLE FURX", 41180); - _unicodeCharacterMap.Add("YI SYLLABLE FUR", 41181); - _unicodeCharacterMap.Add("YI SYLLABLE FYT", 41182); - _unicodeCharacterMap.Add("YI SYLLABLE FYX", 41183); - _unicodeCharacterMap.Add("YI SYLLABLE FY", 41184); - _unicodeCharacterMap.Add("YI SYLLABLE FYP", 41185); - _unicodeCharacterMap.Add("YI SYLLABLE VIT", 41186); - _unicodeCharacterMap.Add("YI SYLLABLE VIX", 41187); - _unicodeCharacterMap.Add("YI SYLLABLE VI", 41188); - _unicodeCharacterMap.Add("YI SYLLABLE VIP", 41189); - _unicodeCharacterMap.Add("YI SYLLABLE VIET", 41190); - _unicodeCharacterMap.Add("YI SYLLABLE VIEX", 41191); - _unicodeCharacterMap.Add("YI SYLLABLE VIE", 41192); - _unicodeCharacterMap.Add("YI SYLLABLE VIEP", 41193); - _unicodeCharacterMap.Add("YI SYLLABLE VAT", 41194); - _unicodeCharacterMap.Add("YI SYLLABLE VAX", 41195); - _unicodeCharacterMap.Add("YI SYLLABLE VA", 41196); - _unicodeCharacterMap.Add("YI SYLLABLE VAP", 41197); - _unicodeCharacterMap.Add("YI SYLLABLE VOT", 41198); - _unicodeCharacterMap.Add("YI SYLLABLE VOX", 41199); - _unicodeCharacterMap.Add("YI SYLLABLE VO", 41200); - _unicodeCharacterMap.Add("YI SYLLABLE VOP", 41201); - _unicodeCharacterMap.Add("YI SYLLABLE VEX", 41202); - _unicodeCharacterMap.Add("YI SYLLABLE VEP", 41203); - _unicodeCharacterMap.Add("YI SYLLABLE VUT", 41204); - _unicodeCharacterMap.Add("YI SYLLABLE VUX", 41205); - _unicodeCharacterMap.Add("YI SYLLABLE VU", 41206); - _unicodeCharacterMap.Add("YI SYLLABLE VUP", 41207); - _unicodeCharacterMap.Add("YI SYLLABLE VURX", 41208); - _unicodeCharacterMap.Add("YI SYLLABLE VUR", 41209); - _unicodeCharacterMap.Add("YI SYLLABLE VYT", 41210); - _unicodeCharacterMap.Add("YI SYLLABLE VYX", 41211); - _unicodeCharacterMap.Add("YI SYLLABLE VY", 41212); - _unicodeCharacterMap.Add("YI SYLLABLE VYP", 41213); - _unicodeCharacterMap.Add("YI SYLLABLE VYRX", 41214); - _unicodeCharacterMap.Add("YI SYLLABLE VYR", 41215); - _unicodeCharacterMap.Add("YI SYLLABLE DIT", 41216); - _unicodeCharacterMap.Add("YI SYLLABLE DIX", 41217); - _unicodeCharacterMap.Add("YI SYLLABLE DI", 41218); - _unicodeCharacterMap.Add("YI SYLLABLE DIP", 41219); - _unicodeCharacterMap.Add("YI SYLLABLE DIEX", 41220); - _unicodeCharacterMap.Add("YI SYLLABLE DIE", 41221); - _unicodeCharacterMap.Add("YI SYLLABLE DIEP", 41222); - _unicodeCharacterMap.Add("YI SYLLABLE DAT", 41223); - _unicodeCharacterMap.Add("YI SYLLABLE DAX", 41224); - _unicodeCharacterMap.Add("YI SYLLABLE DA", 41225); - _unicodeCharacterMap.Add("YI SYLLABLE DAP", 41226); - _unicodeCharacterMap.Add("YI SYLLABLE DUOX", 41227); - _unicodeCharacterMap.Add("YI SYLLABLE DUO", 41228); - _unicodeCharacterMap.Add("YI SYLLABLE DOT", 41229); - _unicodeCharacterMap.Add("YI SYLLABLE DOX", 41230); - _unicodeCharacterMap.Add("YI SYLLABLE DO", 41231); - _unicodeCharacterMap.Add("YI SYLLABLE DOP", 41232); - _unicodeCharacterMap.Add("YI SYLLABLE DEX", 41233); - _unicodeCharacterMap.Add("YI SYLLABLE DE", 41234); - _unicodeCharacterMap.Add("YI SYLLABLE DEP", 41235); - _unicodeCharacterMap.Add("YI SYLLABLE DUT", 41236); - _unicodeCharacterMap.Add("YI SYLLABLE DUX", 41237); - _unicodeCharacterMap.Add("YI SYLLABLE DU", 41238); - _unicodeCharacterMap.Add("YI SYLLABLE DUP", 41239); - _unicodeCharacterMap.Add("YI SYLLABLE DURX", 41240); - _unicodeCharacterMap.Add("YI SYLLABLE DUR", 41241); - _unicodeCharacterMap.Add("YI SYLLABLE TIT", 41242); - _unicodeCharacterMap.Add("YI SYLLABLE TIX", 41243); - _unicodeCharacterMap.Add("YI SYLLABLE TI", 41244); - _unicodeCharacterMap.Add("YI SYLLABLE TIP", 41245); - _unicodeCharacterMap.Add("YI SYLLABLE TIEX", 41246); - _unicodeCharacterMap.Add("YI SYLLABLE TIE", 41247); - _unicodeCharacterMap.Add("YI SYLLABLE TIEP", 41248); - _unicodeCharacterMap.Add("YI SYLLABLE TAT", 41249); - _unicodeCharacterMap.Add("YI SYLLABLE TAX", 41250); - _unicodeCharacterMap.Add("YI SYLLABLE TA", 41251); - _unicodeCharacterMap.Add("YI SYLLABLE TAP", 41252); - _unicodeCharacterMap.Add("YI SYLLABLE TUOT", 41253); - _unicodeCharacterMap.Add("YI SYLLABLE TUOX", 41254); - _unicodeCharacterMap.Add("YI SYLLABLE TUO", 41255); - _unicodeCharacterMap.Add("YI SYLLABLE TUOP", 41256); - _unicodeCharacterMap.Add("YI SYLLABLE TOT", 41257); - _unicodeCharacterMap.Add("YI SYLLABLE TOX", 41258); - _unicodeCharacterMap.Add("YI SYLLABLE TO", 41259); - _unicodeCharacterMap.Add("YI SYLLABLE TOP", 41260); - _unicodeCharacterMap.Add("YI SYLLABLE TEX", 41261); - _unicodeCharacterMap.Add("YI SYLLABLE TE", 41262); - _unicodeCharacterMap.Add("YI SYLLABLE TEP", 41263); - _unicodeCharacterMap.Add("YI SYLLABLE TUT", 41264); - _unicodeCharacterMap.Add("YI SYLLABLE TUX", 41265); - _unicodeCharacterMap.Add("YI SYLLABLE TU", 41266); - _unicodeCharacterMap.Add("YI SYLLABLE TUP", 41267); - _unicodeCharacterMap.Add("YI SYLLABLE TURX", 41268); - _unicodeCharacterMap.Add("YI SYLLABLE TUR", 41269); - _unicodeCharacterMap.Add("YI SYLLABLE DDIT", 41270); - _unicodeCharacterMap.Add("YI SYLLABLE DDIX", 41271); - _unicodeCharacterMap.Add("YI SYLLABLE DDI", 41272); - _unicodeCharacterMap.Add("YI SYLLABLE DDIP", 41273); - _unicodeCharacterMap.Add("YI SYLLABLE DDIEX", 41274); - _unicodeCharacterMap.Add("YI SYLLABLE DDIE", 41275); - _unicodeCharacterMap.Add("YI SYLLABLE DDIEP", 41276); - _unicodeCharacterMap.Add("YI SYLLABLE DDAT", 41277); - _unicodeCharacterMap.Add("YI SYLLABLE DDAX", 41278); - _unicodeCharacterMap.Add("YI SYLLABLE DDA", 41279); - _unicodeCharacterMap.Add("YI SYLLABLE DDAP", 41280); - _unicodeCharacterMap.Add("YI SYLLABLE DDUOX", 41281); - _unicodeCharacterMap.Add("YI SYLLABLE DDUO", 41282); - _unicodeCharacterMap.Add("YI SYLLABLE DDUOP", 41283); - _unicodeCharacterMap.Add("YI SYLLABLE DDOT", 41284); - _unicodeCharacterMap.Add("YI SYLLABLE DDOX", 41285); - _unicodeCharacterMap.Add("YI SYLLABLE DDO", 41286); - _unicodeCharacterMap.Add("YI SYLLABLE DDOP", 41287); - _unicodeCharacterMap.Add("YI SYLLABLE DDEX", 41288); - _unicodeCharacterMap.Add("YI SYLLABLE DDE", 41289); - _unicodeCharacterMap.Add("YI SYLLABLE DDEP", 41290); - _unicodeCharacterMap.Add("YI SYLLABLE DDUT", 41291); - _unicodeCharacterMap.Add("YI SYLLABLE DDUX", 41292); - _unicodeCharacterMap.Add("YI SYLLABLE DDU", 41293); - _unicodeCharacterMap.Add("YI SYLLABLE DDUP", 41294); - _unicodeCharacterMap.Add("YI SYLLABLE DDURX", 41295); - _unicodeCharacterMap.Add("YI SYLLABLE DDUR", 41296); - _unicodeCharacterMap.Add("YI SYLLABLE NDIT", 41297); - _unicodeCharacterMap.Add("YI SYLLABLE NDIX", 41298); - _unicodeCharacterMap.Add("YI SYLLABLE NDI", 41299); - _unicodeCharacterMap.Add("YI SYLLABLE NDIP", 41300); - _unicodeCharacterMap.Add("YI SYLLABLE NDIEX", 41301); - _unicodeCharacterMap.Add("YI SYLLABLE NDIE", 41302); - _unicodeCharacterMap.Add("YI SYLLABLE NDAT", 41303); - _unicodeCharacterMap.Add("YI SYLLABLE NDAX", 41304); - _unicodeCharacterMap.Add("YI SYLLABLE NDA", 41305); - _unicodeCharacterMap.Add("YI SYLLABLE NDAP", 41306); - _unicodeCharacterMap.Add("YI SYLLABLE NDOT", 41307); - _unicodeCharacterMap.Add("YI SYLLABLE NDOX", 41308); - _unicodeCharacterMap.Add("YI SYLLABLE NDO", 41309); - _unicodeCharacterMap.Add("YI SYLLABLE NDOP", 41310); - _unicodeCharacterMap.Add("YI SYLLABLE NDEX", 41311); - _unicodeCharacterMap.Add("YI SYLLABLE NDE", 41312); - _unicodeCharacterMap.Add("YI SYLLABLE NDEP", 41313); - _unicodeCharacterMap.Add("YI SYLLABLE NDUT", 41314); - _unicodeCharacterMap.Add("YI SYLLABLE NDUX", 41315); - _unicodeCharacterMap.Add("YI SYLLABLE NDU", 41316); - _unicodeCharacterMap.Add("YI SYLLABLE NDUP", 41317); - _unicodeCharacterMap.Add("YI SYLLABLE NDURX", 41318); - _unicodeCharacterMap.Add("YI SYLLABLE NDUR", 41319); - _unicodeCharacterMap.Add("YI SYLLABLE HNIT", 41320); - _unicodeCharacterMap.Add("YI SYLLABLE HNIX", 41321); - _unicodeCharacterMap.Add("YI SYLLABLE HNI", 41322); - _unicodeCharacterMap.Add("YI SYLLABLE HNIP", 41323); - _unicodeCharacterMap.Add("YI SYLLABLE HNIET", 41324); - _unicodeCharacterMap.Add("YI SYLLABLE HNIEX", 41325); - _unicodeCharacterMap.Add("YI SYLLABLE HNIE", 41326); - _unicodeCharacterMap.Add("YI SYLLABLE HNIEP", 41327); - _unicodeCharacterMap.Add("YI SYLLABLE HNAT", 41328); - _unicodeCharacterMap.Add("YI SYLLABLE HNAX", 41329); - _unicodeCharacterMap.Add("YI SYLLABLE HNA", 41330); - _unicodeCharacterMap.Add("YI SYLLABLE HNAP", 41331); - _unicodeCharacterMap.Add("YI SYLLABLE HNUOX", 41332); - _unicodeCharacterMap.Add("YI SYLLABLE HNUO", 41333); - _unicodeCharacterMap.Add("YI SYLLABLE HNOT", 41334); - _unicodeCharacterMap.Add("YI SYLLABLE HNOX", 41335); - _unicodeCharacterMap.Add("YI SYLLABLE HNOP", 41336); - _unicodeCharacterMap.Add("YI SYLLABLE HNEX", 41337); - _unicodeCharacterMap.Add("YI SYLLABLE HNE", 41338); - _unicodeCharacterMap.Add("YI SYLLABLE HNEP", 41339); - _unicodeCharacterMap.Add("YI SYLLABLE HNUT", 41340); - _unicodeCharacterMap.Add("YI SYLLABLE NIT", 41341); - _unicodeCharacterMap.Add("YI SYLLABLE NIX", 41342); - _unicodeCharacterMap.Add("YI SYLLABLE NI", 41343); - _unicodeCharacterMap.Add("YI SYLLABLE NIP", 41344); - _unicodeCharacterMap.Add("YI SYLLABLE NIEX", 41345); - _unicodeCharacterMap.Add("YI SYLLABLE NIE", 41346); - _unicodeCharacterMap.Add("YI SYLLABLE NIEP", 41347); - _unicodeCharacterMap.Add("YI SYLLABLE NAX", 41348); - _unicodeCharacterMap.Add("YI SYLLABLE NA", 41349); - _unicodeCharacterMap.Add("YI SYLLABLE NAP", 41350); - _unicodeCharacterMap.Add("YI SYLLABLE NUOX", 41351); - _unicodeCharacterMap.Add("YI SYLLABLE NUO", 41352); - _unicodeCharacterMap.Add("YI SYLLABLE NUOP", 41353); - _unicodeCharacterMap.Add("YI SYLLABLE NOT", 41354); - _unicodeCharacterMap.Add("YI SYLLABLE NOX", 41355); - _unicodeCharacterMap.Add("YI SYLLABLE NO", 41356); - _unicodeCharacterMap.Add("YI SYLLABLE NOP", 41357); - _unicodeCharacterMap.Add("YI SYLLABLE NEX", 41358); - _unicodeCharacterMap.Add("YI SYLLABLE NE", 41359); - _unicodeCharacterMap.Add("YI SYLLABLE NEP", 41360); - _unicodeCharacterMap.Add("YI SYLLABLE NUT", 41361); - _unicodeCharacterMap.Add("YI SYLLABLE NUX", 41362); - _unicodeCharacterMap.Add("YI SYLLABLE NU", 41363); - _unicodeCharacterMap.Add("YI SYLLABLE NUP", 41364); - _unicodeCharacterMap.Add("YI SYLLABLE NURX", 41365); - _unicodeCharacterMap.Add("YI SYLLABLE NUR", 41366); - _unicodeCharacterMap.Add("YI SYLLABLE HLIT", 41367); - _unicodeCharacterMap.Add("YI SYLLABLE HLIX", 41368); - _unicodeCharacterMap.Add("YI SYLLABLE HLI", 41369); - _unicodeCharacterMap.Add("YI SYLLABLE HLIP", 41370); - _unicodeCharacterMap.Add("YI SYLLABLE HLIEX", 41371); - _unicodeCharacterMap.Add("YI SYLLABLE HLIE", 41372); - _unicodeCharacterMap.Add("YI SYLLABLE HLIEP", 41373); - _unicodeCharacterMap.Add("YI SYLLABLE HLAT", 41374); - _unicodeCharacterMap.Add("YI SYLLABLE HLAX", 41375); - _unicodeCharacterMap.Add("YI SYLLABLE HLA", 41376); - _unicodeCharacterMap.Add("YI SYLLABLE HLAP", 41377); - _unicodeCharacterMap.Add("YI SYLLABLE HLUOX", 41378); - _unicodeCharacterMap.Add("YI SYLLABLE HLUO", 41379); - _unicodeCharacterMap.Add("YI SYLLABLE HLUOP", 41380); - _unicodeCharacterMap.Add("YI SYLLABLE HLOX", 41381); - _unicodeCharacterMap.Add("YI SYLLABLE HLO", 41382); - _unicodeCharacterMap.Add("YI SYLLABLE HLOP", 41383); - _unicodeCharacterMap.Add("YI SYLLABLE HLEX", 41384); - _unicodeCharacterMap.Add("YI SYLLABLE HLE", 41385); - _unicodeCharacterMap.Add("YI SYLLABLE HLEP", 41386); - _unicodeCharacterMap.Add("YI SYLLABLE HLUT", 41387); - _unicodeCharacterMap.Add("YI SYLLABLE HLUX", 41388); - _unicodeCharacterMap.Add("YI SYLLABLE HLU", 41389); - _unicodeCharacterMap.Add("YI SYLLABLE HLUP", 41390); - _unicodeCharacterMap.Add("YI SYLLABLE HLURX", 41391); - _unicodeCharacterMap.Add("YI SYLLABLE HLUR", 41392); - _unicodeCharacterMap.Add("YI SYLLABLE HLYT", 41393); - _unicodeCharacterMap.Add("YI SYLLABLE HLYX", 41394); - _unicodeCharacterMap.Add("YI SYLLABLE HLY", 41395); - _unicodeCharacterMap.Add("YI SYLLABLE HLYP", 41396); - _unicodeCharacterMap.Add("YI SYLLABLE HLYRX", 41397); - _unicodeCharacterMap.Add("YI SYLLABLE HLYR", 41398); - _unicodeCharacterMap.Add("YI SYLLABLE LIT", 41399); - _unicodeCharacterMap.Add("YI SYLLABLE LIX", 41400); - _unicodeCharacterMap.Add("YI SYLLABLE LI", 41401); - _unicodeCharacterMap.Add("YI SYLLABLE LIP", 41402); - _unicodeCharacterMap.Add("YI SYLLABLE LIET", 41403); - _unicodeCharacterMap.Add("YI SYLLABLE LIEX", 41404); - _unicodeCharacterMap.Add("YI SYLLABLE LIE", 41405); - _unicodeCharacterMap.Add("YI SYLLABLE LIEP", 41406); - _unicodeCharacterMap.Add("YI SYLLABLE LAT", 41407); - _unicodeCharacterMap.Add("YI SYLLABLE LAX", 41408); - _unicodeCharacterMap.Add("YI SYLLABLE LA", 41409); - _unicodeCharacterMap.Add("YI SYLLABLE LAP", 41410); - _unicodeCharacterMap.Add("YI SYLLABLE LUOT", 41411); - _unicodeCharacterMap.Add("YI SYLLABLE LUOX", 41412); - _unicodeCharacterMap.Add("YI SYLLABLE LUO", 41413); - _unicodeCharacterMap.Add("YI SYLLABLE LUOP", 41414); - _unicodeCharacterMap.Add("YI SYLLABLE LOT", 41415); - _unicodeCharacterMap.Add("YI SYLLABLE LOX", 41416); - _unicodeCharacterMap.Add("YI SYLLABLE LO", 41417); - _unicodeCharacterMap.Add("YI SYLLABLE LOP", 41418); - _unicodeCharacterMap.Add("YI SYLLABLE LEX", 41419); - _unicodeCharacterMap.Add("YI SYLLABLE LE", 41420); - _unicodeCharacterMap.Add("YI SYLLABLE LEP", 41421); - _unicodeCharacterMap.Add("YI SYLLABLE LUT", 41422); - _unicodeCharacterMap.Add("YI SYLLABLE LUX", 41423); - _unicodeCharacterMap.Add("YI SYLLABLE LU", 41424); - _unicodeCharacterMap.Add("YI SYLLABLE LUP", 41425); - _unicodeCharacterMap.Add("YI SYLLABLE LURX", 41426); - _unicodeCharacterMap.Add("YI SYLLABLE LUR", 41427); - _unicodeCharacterMap.Add("YI SYLLABLE LYT", 41428); - _unicodeCharacterMap.Add("YI SYLLABLE LYX", 41429); - _unicodeCharacterMap.Add("YI SYLLABLE LY", 41430); - _unicodeCharacterMap.Add("YI SYLLABLE LYP", 41431); - _unicodeCharacterMap.Add("YI SYLLABLE LYRX", 41432); - _unicodeCharacterMap.Add("YI SYLLABLE LYR", 41433); - _unicodeCharacterMap.Add("YI SYLLABLE GIT", 41434); - _unicodeCharacterMap.Add("YI SYLLABLE GIX", 41435); - _unicodeCharacterMap.Add("YI SYLLABLE GI", 41436); - _unicodeCharacterMap.Add("YI SYLLABLE GIP", 41437); - _unicodeCharacterMap.Add("YI SYLLABLE GIET", 41438); - _unicodeCharacterMap.Add("YI SYLLABLE GIEX", 41439); - _unicodeCharacterMap.Add("YI SYLLABLE GIE", 41440); - _unicodeCharacterMap.Add("YI SYLLABLE GIEP", 41441); - _unicodeCharacterMap.Add("YI SYLLABLE GAT", 41442); - _unicodeCharacterMap.Add("YI SYLLABLE GAX", 41443); - _unicodeCharacterMap.Add("YI SYLLABLE GA", 41444); - _unicodeCharacterMap.Add("YI SYLLABLE GAP", 41445); - _unicodeCharacterMap.Add("YI SYLLABLE GUOT", 41446); - _unicodeCharacterMap.Add("YI SYLLABLE GUOX", 41447); - _unicodeCharacterMap.Add("YI SYLLABLE GUO", 41448); - _unicodeCharacterMap.Add("YI SYLLABLE GUOP", 41449); - _unicodeCharacterMap.Add("YI SYLLABLE GOT", 41450); - _unicodeCharacterMap.Add("YI SYLLABLE GOX", 41451); - _unicodeCharacterMap.Add("YI SYLLABLE GO", 41452); - _unicodeCharacterMap.Add("YI SYLLABLE GOP", 41453); - _unicodeCharacterMap.Add("YI SYLLABLE GET", 41454); - _unicodeCharacterMap.Add("YI SYLLABLE GEX", 41455); - _unicodeCharacterMap.Add("YI SYLLABLE GE", 41456); - _unicodeCharacterMap.Add("YI SYLLABLE GEP", 41457); - _unicodeCharacterMap.Add("YI SYLLABLE GUT", 41458); - _unicodeCharacterMap.Add("YI SYLLABLE GUX", 41459); - _unicodeCharacterMap.Add("YI SYLLABLE GU", 41460); - _unicodeCharacterMap.Add("YI SYLLABLE GUP", 41461); - _unicodeCharacterMap.Add("YI SYLLABLE GURX", 41462); - _unicodeCharacterMap.Add("YI SYLLABLE GUR", 41463); - _unicodeCharacterMap.Add("YI SYLLABLE KIT", 41464); - _unicodeCharacterMap.Add("YI SYLLABLE KIX", 41465); - _unicodeCharacterMap.Add("YI SYLLABLE KI", 41466); - _unicodeCharacterMap.Add("YI SYLLABLE KIP", 41467); - _unicodeCharacterMap.Add("YI SYLLABLE KIEX", 41468); - _unicodeCharacterMap.Add("YI SYLLABLE KIE", 41469); - _unicodeCharacterMap.Add("YI SYLLABLE KIEP", 41470); - _unicodeCharacterMap.Add("YI SYLLABLE KAT", 41471); - _unicodeCharacterMap.Add("YI SYLLABLE KAX", 41472); - _unicodeCharacterMap.Add("YI SYLLABLE KA", 41473); - _unicodeCharacterMap.Add("YI SYLLABLE KAP", 41474); - _unicodeCharacterMap.Add("YI SYLLABLE KUOX", 41475); - _unicodeCharacterMap.Add("YI SYLLABLE KUO", 41476); - _unicodeCharacterMap.Add("YI SYLLABLE KUOP", 41477); - _unicodeCharacterMap.Add("YI SYLLABLE KOT", 41478); - _unicodeCharacterMap.Add("YI SYLLABLE KOX", 41479); - _unicodeCharacterMap.Add("YI SYLLABLE KO", 41480); - _unicodeCharacterMap.Add("YI SYLLABLE KOP", 41481); - _unicodeCharacterMap.Add("YI SYLLABLE KET", 41482); - _unicodeCharacterMap.Add("YI SYLLABLE KEX", 41483); - _unicodeCharacterMap.Add("YI SYLLABLE KE", 41484); - _unicodeCharacterMap.Add("YI SYLLABLE KEP", 41485); - _unicodeCharacterMap.Add("YI SYLLABLE KUT", 41486); - _unicodeCharacterMap.Add("YI SYLLABLE KUX", 41487); - _unicodeCharacterMap.Add("YI SYLLABLE KU", 41488); - _unicodeCharacterMap.Add("YI SYLLABLE KUP", 41489); - _unicodeCharacterMap.Add("YI SYLLABLE KURX", 41490); - _unicodeCharacterMap.Add("YI SYLLABLE KUR", 41491); - _unicodeCharacterMap.Add("YI SYLLABLE GGIT", 41492); - _unicodeCharacterMap.Add("YI SYLLABLE GGIX", 41493); - _unicodeCharacterMap.Add("YI SYLLABLE GGI", 41494); - _unicodeCharacterMap.Add("YI SYLLABLE GGIEX", 41495); - _unicodeCharacterMap.Add("YI SYLLABLE GGIE", 41496); - _unicodeCharacterMap.Add("YI SYLLABLE GGIEP", 41497); - _unicodeCharacterMap.Add("YI SYLLABLE GGAT", 41498); - _unicodeCharacterMap.Add("YI SYLLABLE GGAX", 41499); - _unicodeCharacterMap.Add("YI SYLLABLE GGA", 41500); - _unicodeCharacterMap.Add("YI SYLLABLE GGAP", 41501); - _unicodeCharacterMap.Add("YI SYLLABLE GGUOT", 41502); - _unicodeCharacterMap.Add("YI SYLLABLE GGUOX", 41503); - _unicodeCharacterMap.Add("YI SYLLABLE GGUO", 41504); - _unicodeCharacterMap.Add("YI SYLLABLE GGUOP", 41505); - _unicodeCharacterMap.Add("YI SYLLABLE GGOT", 41506); - _unicodeCharacterMap.Add("YI SYLLABLE GGOX", 41507); - _unicodeCharacterMap.Add("YI SYLLABLE GGO", 41508); - _unicodeCharacterMap.Add("YI SYLLABLE GGOP", 41509); - _unicodeCharacterMap.Add("YI SYLLABLE GGET", 41510); - _unicodeCharacterMap.Add("YI SYLLABLE GGEX", 41511); - _unicodeCharacterMap.Add("YI SYLLABLE GGE", 41512); - _unicodeCharacterMap.Add("YI SYLLABLE GGEP", 41513); - _unicodeCharacterMap.Add("YI SYLLABLE GGUT", 41514); - _unicodeCharacterMap.Add("YI SYLLABLE GGUX", 41515); - _unicodeCharacterMap.Add("YI SYLLABLE GGU", 41516); - _unicodeCharacterMap.Add("YI SYLLABLE GGUP", 41517); - _unicodeCharacterMap.Add("YI SYLLABLE GGURX", 41518); - _unicodeCharacterMap.Add("YI SYLLABLE GGUR", 41519); - _unicodeCharacterMap.Add("YI SYLLABLE MGIEX", 41520); - _unicodeCharacterMap.Add("YI SYLLABLE MGIE", 41521); - _unicodeCharacterMap.Add("YI SYLLABLE MGAT", 41522); - _unicodeCharacterMap.Add("YI SYLLABLE MGAX", 41523); - _unicodeCharacterMap.Add("YI SYLLABLE MGA", 41524); - _unicodeCharacterMap.Add("YI SYLLABLE MGAP", 41525); - _unicodeCharacterMap.Add("YI SYLLABLE MGUOX", 41526); - _unicodeCharacterMap.Add("YI SYLLABLE MGUO", 41527); - _unicodeCharacterMap.Add("YI SYLLABLE MGUOP", 41528); - _unicodeCharacterMap.Add("YI SYLLABLE MGOT", 41529); - _unicodeCharacterMap.Add("YI SYLLABLE MGOX", 41530); - _unicodeCharacterMap.Add("YI SYLLABLE MGO", 41531); - _unicodeCharacterMap.Add("YI SYLLABLE MGOP", 41532); - _unicodeCharacterMap.Add("YI SYLLABLE MGEX", 41533); - _unicodeCharacterMap.Add("YI SYLLABLE MGE", 41534); - _unicodeCharacterMap.Add("YI SYLLABLE MGEP", 41535); - _unicodeCharacterMap.Add("YI SYLLABLE MGUT", 41536); - _unicodeCharacterMap.Add("YI SYLLABLE MGUX", 41537); - _unicodeCharacterMap.Add("YI SYLLABLE MGU", 41538); - _unicodeCharacterMap.Add("YI SYLLABLE MGUP", 41539); - _unicodeCharacterMap.Add("YI SYLLABLE MGURX", 41540); - _unicodeCharacterMap.Add("YI SYLLABLE MGUR", 41541); - _unicodeCharacterMap.Add("YI SYLLABLE HXIT", 41542); - _unicodeCharacterMap.Add("YI SYLLABLE HXIX", 41543); - _unicodeCharacterMap.Add("YI SYLLABLE HXI", 41544); - _unicodeCharacterMap.Add("YI SYLLABLE HXIP", 41545); - _unicodeCharacterMap.Add("YI SYLLABLE HXIET", 41546); - _unicodeCharacterMap.Add("YI SYLLABLE HXIEX", 41547); - _unicodeCharacterMap.Add("YI SYLLABLE HXIE", 41548); - _unicodeCharacterMap.Add("YI SYLLABLE HXIEP", 41549); - _unicodeCharacterMap.Add("YI SYLLABLE HXAT", 41550); - _unicodeCharacterMap.Add("YI SYLLABLE HXAX", 41551); - _unicodeCharacterMap.Add("YI SYLLABLE HXA", 41552); - _unicodeCharacterMap.Add("YI SYLLABLE HXAP", 41553); - _unicodeCharacterMap.Add("YI SYLLABLE HXUOT", 41554); - _unicodeCharacterMap.Add("YI SYLLABLE HXUOX", 41555); - _unicodeCharacterMap.Add("YI SYLLABLE HXUO", 41556); - _unicodeCharacterMap.Add("YI SYLLABLE HXUOP", 41557); - _unicodeCharacterMap.Add("YI SYLLABLE HXOT", 41558); - _unicodeCharacterMap.Add("YI SYLLABLE HXOX", 41559); - _unicodeCharacterMap.Add("YI SYLLABLE HXO", 41560); - _unicodeCharacterMap.Add("YI SYLLABLE HXOP", 41561); - _unicodeCharacterMap.Add("YI SYLLABLE HXEX", 41562); - _unicodeCharacterMap.Add("YI SYLLABLE HXE", 41563); - _unicodeCharacterMap.Add("YI SYLLABLE HXEP", 41564); - _unicodeCharacterMap.Add("YI SYLLABLE NGIEX", 41565); - _unicodeCharacterMap.Add("YI SYLLABLE NGIE", 41566); - _unicodeCharacterMap.Add("YI SYLLABLE NGIEP", 41567); - _unicodeCharacterMap.Add("YI SYLLABLE NGAT", 41568); - _unicodeCharacterMap.Add("YI SYLLABLE NGAX", 41569); - _unicodeCharacterMap.Add("YI SYLLABLE NGA", 41570); - _unicodeCharacterMap.Add("YI SYLLABLE NGAP", 41571); - _unicodeCharacterMap.Add("YI SYLLABLE NGUOT", 41572); - _unicodeCharacterMap.Add("YI SYLLABLE NGUOX", 41573); - _unicodeCharacterMap.Add("YI SYLLABLE NGUO", 41574); - _unicodeCharacterMap.Add("YI SYLLABLE NGOT", 41575); - _unicodeCharacterMap.Add("YI SYLLABLE NGOX", 41576); - _unicodeCharacterMap.Add("YI SYLLABLE NGO", 41577); - _unicodeCharacterMap.Add("YI SYLLABLE NGOP", 41578); - _unicodeCharacterMap.Add("YI SYLLABLE NGEX", 41579); - _unicodeCharacterMap.Add("YI SYLLABLE NGE", 41580); - _unicodeCharacterMap.Add("YI SYLLABLE NGEP", 41581); - _unicodeCharacterMap.Add("YI SYLLABLE HIT", 41582); - _unicodeCharacterMap.Add("YI SYLLABLE HIEX", 41583); - _unicodeCharacterMap.Add("YI SYLLABLE HIE", 41584); - _unicodeCharacterMap.Add("YI SYLLABLE HAT", 41585); - _unicodeCharacterMap.Add("YI SYLLABLE HAX", 41586); - _unicodeCharacterMap.Add("YI SYLLABLE HA", 41587); - _unicodeCharacterMap.Add("YI SYLLABLE HAP", 41588); - _unicodeCharacterMap.Add("YI SYLLABLE HUOT", 41589); - _unicodeCharacterMap.Add("YI SYLLABLE HUOX", 41590); - _unicodeCharacterMap.Add("YI SYLLABLE HUO", 41591); - _unicodeCharacterMap.Add("YI SYLLABLE HUOP", 41592); - _unicodeCharacterMap.Add("YI SYLLABLE HOT", 41593); - _unicodeCharacterMap.Add("YI SYLLABLE HOX", 41594); - _unicodeCharacterMap.Add("YI SYLLABLE HO", 41595); - _unicodeCharacterMap.Add("YI SYLLABLE HOP", 41596); - _unicodeCharacterMap.Add("YI SYLLABLE HEX", 41597); - _unicodeCharacterMap.Add("YI SYLLABLE HE", 41598); - _unicodeCharacterMap.Add("YI SYLLABLE HEP", 41599); - _unicodeCharacterMap.Add("YI SYLLABLE WAT", 41600); - _unicodeCharacterMap.Add("YI SYLLABLE WAX", 41601); - _unicodeCharacterMap.Add("YI SYLLABLE WA", 41602); - _unicodeCharacterMap.Add("YI SYLLABLE WAP", 41603); - _unicodeCharacterMap.Add("YI SYLLABLE WUOX", 41604); - _unicodeCharacterMap.Add("YI SYLLABLE WUO", 41605); - _unicodeCharacterMap.Add("YI SYLLABLE WUOP", 41606); - _unicodeCharacterMap.Add("YI SYLLABLE WOX", 41607); - _unicodeCharacterMap.Add("YI SYLLABLE WO", 41608); - _unicodeCharacterMap.Add("YI SYLLABLE WOP", 41609); - _unicodeCharacterMap.Add("YI SYLLABLE WEX", 41610); - _unicodeCharacterMap.Add("YI SYLLABLE WE", 41611); - _unicodeCharacterMap.Add("YI SYLLABLE WEP", 41612); - _unicodeCharacterMap.Add("YI SYLLABLE ZIT", 41613); - _unicodeCharacterMap.Add("YI SYLLABLE ZIX", 41614); - _unicodeCharacterMap.Add("YI SYLLABLE ZI", 41615); - _unicodeCharacterMap.Add("YI SYLLABLE ZIP", 41616); - _unicodeCharacterMap.Add("YI SYLLABLE ZIEX", 41617); - _unicodeCharacterMap.Add("YI SYLLABLE ZIE", 41618); - _unicodeCharacterMap.Add("YI SYLLABLE ZIEP", 41619); - _unicodeCharacterMap.Add("YI SYLLABLE ZAT", 41620); - _unicodeCharacterMap.Add("YI SYLLABLE ZAX", 41621); - _unicodeCharacterMap.Add("YI SYLLABLE ZA", 41622); - _unicodeCharacterMap.Add("YI SYLLABLE ZAP", 41623); - _unicodeCharacterMap.Add("YI SYLLABLE ZUOX", 41624); - _unicodeCharacterMap.Add("YI SYLLABLE ZUO", 41625); - _unicodeCharacterMap.Add("YI SYLLABLE ZUOP", 41626); - _unicodeCharacterMap.Add("YI SYLLABLE ZOT", 41627); - _unicodeCharacterMap.Add("YI SYLLABLE ZOX", 41628); - _unicodeCharacterMap.Add("YI SYLLABLE ZO", 41629); - _unicodeCharacterMap.Add("YI SYLLABLE ZOP", 41630); - _unicodeCharacterMap.Add("YI SYLLABLE ZEX", 41631); - _unicodeCharacterMap.Add("YI SYLLABLE ZE", 41632); - _unicodeCharacterMap.Add("YI SYLLABLE ZEP", 41633); - _unicodeCharacterMap.Add("YI SYLLABLE ZUT", 41634); - _unicodeCharacterMap.Add("YI SYLLABLE ZUX", 41635); - _unicodeCharacterMap.Add("YI SYLLABLE ZU", 41636); - _unicodeCharacterMap.Add("YI SYLLABLE ZUP", 41637); - _unicodeCharacterMap.Add("YI SYLLABLE ZURX", 41638); - _unicodeCharacterMap.Add("YI SYLLABLE ZUR", 41639); - _unicodeCharacterMap.Add("YI SYLLABLE ZYT", 41640); - _unicodeCharacterMap.Add("YI SYLLABLE ZYX", 41641); - _unicodeCharacterMap.Add("YI SYLLABLE ZY", 41642); - _unicodeCharacterMap.Add("YI SYLLABLE ZYP", 41643); - _unicodeCharacterMap.Add("YI SYLLABLE ZYRX", 41644); - _unicodeCharacterMap.Add("YI SYLLABLE ZYR", 41645); - _unicodeCharacterMap.Add("YI SYLLABLE CIT", 41646); - _unicodeCharacterMap.Add("YI SYLLABLE CIX", 41647); - _unicodeCharacterMap.Add("YI SYLLABLE CI", 41648); - _unicodeCharacterMap.Add("YI SYLLABLE CIP", 41649); - _unicodeCharacterMap.Add("YI SYLLABLE CIET", 41650); - _unicodeCharacterMap.Add("YI SYLLABLE CIEX", 41651); - _unicodeCharacterMap.Add("YI SYLLABLE CIE", 41652); - _unicodeCharacterMap.Add("YI SYLLABLE CIEP", 41653); - _unicodeCharacterMap.Add("YI SYLLABLE CAT", 41654); - _unicodeCharacterMap.Add("YI SYLLABLE CAX", 41655); - _unicodeCharacterMap.Add("YI SYLLABLE CA", 41656); - _unicodeCharacterMap.Add("YI SYLLABLE CAP", 41657); - _unicodeCharacterMap.Add("YI SYLLABLE CUOX", 41658); - _unicodeCharacterMap.Add("YI SYLLABLE CUO", 41659); - _unicodeCharacterMap.Add("YI SYLLABLE CUOP", 41660); - _unicodeCharacterMap.Add("YI SYLLABLE COT", 41661); - _unicodeCharacterMap.Add("YI SYLLABLE COX", 41662); - _unicodeCharacterMap.Add("YI SYLLABLE CO", 41663); - _unicodeCharacterMap.Add("YI SYLLABLE COP", 41664); - _unicodeCharacterMap.Add("YI SYLLABLE CEX", 41665); - _unicodeCharacterMap.Add("YI SYLLABLE CE", 41666); - _unicodeCharacterMap.Add("YI SYLLABLE CEP", 41667); - _unicodeCharacterMap.Add("YI SYLLABLE CUT", 41668); - _unicodeCharacterMap.Add("YI SYLLABLE CUX", 41669); - _unicodeCharacterMap.Add("YI SYLLABLE CU", 41670); - _unicodeCharacterMap.Add("YI SYLLABLE CUP", 41671); - _unicodeCharacterMap.Add("YI SYLLABLE CURX", 41672); - _unicodeCharacterMap.Add("YI SYLLABLE CUR", 41673); - _unicodeCharacterMap.Add("YI SYLLABLE CYT", 41674); - _unicodeCharacterMap.Add("YI SYLLABLE CYX", 41675); - _unicodeCharacterMap.Add("YI SYLLABLE CY", 41676); - _unicodeCharacterMap.Add("YI SYLLABLE CYP", 41677); - _unicodeCharacterMap.Add("YI SYLLABLE CYRX", 41678); - _unicodeCharacterMap.Add("YI SYLLABLE CYR", 41679); - _unicodeCharacterMap.Add("YI SYLLABLE ZZIT", 41680); - _unicodeCharacterMap.Add("YI SYLLABLE ZZIX", 41681); - _unicodeCharacterMap.Add("YI SYLLABLE ZZI", 41682); - _unicodeCharacterMap.Add("YI SYLLABLE ZZIP", 41683); - _unicodeCharacterMap.Add("YI SYLLABLE ZZIET", 41684); - _unicodeCharacterMap.Add("YI SYLLABLE ZZIEX", 41685); - _unicodeCharacterMap.Add("YI SYLLABLE ZZIE", 41686); - _unicodeCharacterMap.Add("YI SYLLABLE ZZIEP", 41687); - _unicodeCharacterMap.Add("YI SYLLABLE ZZAT", 41688); - _unicodeCharacterMap.Add("YI SYLLABLE ZZAX", 41689); - _unicodeCharacterMap.Add("YI SYLLABLE ZZA", 41690); - _unicodeCharacterMap.Add("YI SYLLABLE ZZAP", 41691); - _unicodeCharacterMap.Add("YI SYLLABLE ZZOX", 41692); - _unicodeCharacterMap.Add("YI SYLLABLE ZZO", 41693); - _unicodeCharacterMap.Add("YI SYLLABLE ZZOP", 41694); - _unicodeCharacterMap.Add("YI SYLLABLE ZZEX", 41695); - _unicodeCharacterMap.Add("YI SYLLABLE ZZE", 41696); - _unicodeCharacterMap.Add("YI SYLLABLE ZZEP", 41697); - _unicodeCharacterMap.Add("YI SYLLABLE ZZUX", 41698); - _unicodeCharacterMap.Add("YI SYLLABLE ZZU", 41699); - _unicodeCharacterMap.Add("YI SYLLABLE ZZUP", 41700); - _unicodeCharacterMap.Add("YI SYLLABLE ZZURX", 41701); - _unicodeCharacterMap.Add("YI SYLLABLE ZZUR", 41702); - _unicodeCharacterMap.Add("YI SYLLABLE ZZYT", 41703); - _unicodeCharacterMap.Add("YI SYLLABLE ZZYX", 41704); - _unicodeCharacterMap.Add("YI SYLLABLE ZZY", 41705); - _unicodeCharacterMap.Add("YI SYLLABLE ZZYP", 41706); - _unicodeCharacterMap.Add("YI SYLLABLE ZZYRX", 41707); - _unicodeCharacterMap.Add("YI SYLLABLE ZZYR", 41708); - _unicodeCharacterMap.Add("YI SYLLABLE NZIT", 41709); - _unicodeCharacterMap.Add("YI SYLLABLE NZIX", 41710); - _unicodeCharacterMap.Add("YI SYLLABLE NZI", 41711); - _unicodeCharacterMap.Add("YI SYLLABLE NZIP", 41712); - _unicodeCharacterMap.Add("YI SYLLABLE NZIEX", 41713); - _unicodeCharacterMap.Add("YI SYLLABLE NZIE", 41714); - _unicodeCharacterMap.Add("YI SYLLABLE NZIEP", 41715); - _unicodeCharacterMap.Add("YI SYLLABLE NZAT", 41716); - _unicodeCharacterMap.Add("YI SYLLABLE NZAX", 41717); - _unicodeCharacterMap.Add("YI SYLLABLE NZA", 41718); - _unicodeCharacterMap.Add("YI SYLLABLE NZAP", 41719); - _unicodeCharacterMap.Add("YI SYLLABLE NZUOX", 41720); - _unicodeCharacterMap.Add("YI SYLLABLE NZUO", 41721); - _unicodeCharacterMap.Add("YI SYLLABLE NZOX", 41722); - _unicodeCharacterMap.Add("YI SYLLABLE NZOP", 41723); - _unicodeCharacterMap.Add("YI SYLLABLE NZEX", 41724); - _unicodeCharacterMap.Add("YI SYLLABLE NZE", 41725); - _unicodeCharacterMap.Add("YI SYLLABLE NZUX", 41726); - _unicodeCharacterMap.Add("YI SYLLABLE NZU", 41727); - _unicodeCharacterMap.Add("YI SYLLABLE NZUP", 41728); - _unicodeCharacterMap.Add("YI SYLLABLE NZURX", 41729); - _unicodeCharacterMap.Add("YI SYLLABLE NZUR", 41730); - _unicodeCharacterMap.Add("YI SYLLABLE NZYT", 41731); - _unicodeCharacterMap.Add("YI SYLLABLE NZYX", 41732); - _unicodeCharacterMap.Add("YI SYLLABLE NZY", 41733); - _unicodeCharacterMap.Add("YI SYLLABLE NZYP", 41734); - _unicodeCharacterMap.Add("YI SYLLABLE NZYRX", 41735); - _unicodeCharacterMap.Add("YI SYLLABLE NZYR", 41736); - _unicodeCharacterMap.Add("YI SYLLABLE SIT", 41737); - _unicodeCharacterMap.Add("YI SYLLABLE SIX", 41738); - _unicodeCharacterMap.Add("YI SYLLABLE SI", 41739); - _unicodeCharacterMap.Add("YI SYLLABLE SIP", 41740); - _unicodeCharacterMap.Add("YI SYLLABLE SIEX", 41741); - _unicodeCharacterMap.Add("YI SYLLABLE SIE", 41742); - _unicodeCharacterMap.Add("YI SYLLABLE SIEP", 41743); - _unicodeCharacterMap.Add("YI SYLLABLE SAT", 41744); - _unicodeCharacterMap.Add("YI SYLLABLE SAX", 41745); - _unicodeCharacterMap.Add("YI SYLLABLE SA", 41746); - _unicodeCharacterMap.Add("YI SYLLABLE SAP", 41747); - _unicodeCharacterMap.Add("YI SYLLABLE SUOX", 41748); - _unicodeCharacterMap.Add("YI SYLLABLE SUO", 41749); - _unicodeCharacterMap.Add("YI SYLLABLE SUOP", 41750); - _unicodeCharacterMap.Add("YI SYLLABLE SOT", 41751); - _unicodeCharacterMap.Add("YI SYLLABLE SOX", 41752); - _unicodeCharacterMap.Add("YI SYLLABLE SO", 41753); - _unicodeCharacterMap.Add("YI SYLLABLE SOP", 41754); - _unicodeCharacterMap.Add("YI SYLLABLE SEX", 41755); - _unicodeCharacterMap.Add("YI SYLLABLE SE", 41756); - _unicodeCharacterMap.Add("YI SYLLABLE SEP", 41757); - _unicodeCharacterMap.Add("YI SYLLABLE SUT", 41758); - _unicodeCharacterMap.Add("YI SYLLABLE SUX", 41759); - _unicodeCharacterMap.Add("YI SYLLABLE SU", 41760); - _unicodeCharacterMap.Add("YI SYLLABLE SUP", 41761); - _unicodeCharacterMap.Add("YI SYLLABLE SURX", 41762); - _unicodeCharacterMap.Add("YI SYLLABLE SUR", 41763); - _unicodeCharacterMap.Add("YI SYLLABLE SYT", 41764); - _unicodeCharacterMap.Add("YI SYLLABLE SYX", 41765); - _unicodeCharacterMap.Add("YI SYLLABLE SY", 41766); - _unicodeCharacterMap.Add("YI SYLLABLE SYP", 41767); - _unicodeCharacterMap.Add("YI SYLLABLE SYRX", 41768); - _unicodeCharacterMap.Add("YI SYLLABLE SYR", 41769); - _unicodeCharacterMap.Add("YI SYLLABLE SSIT", 41770); - _unicodeCharacterMap.Add("YI SYLLABLE SSIX", 41771); - _unicodeCharacterMap.Add("YI SYLLABLE SSI", 41772); - _unicodeCharacterMap.Add("YI SYLLABLE SSIP", 41773); - _unicodeCharacterMap.Add("YI SYLLABLE SSIEX", 41774); - _unicodeCharacterMap.Add("YI SYLLABLE SSIE", 41775); - _unicodeCharacterMap.Add("YI SYLLABLE SSIEP", 41776); - _unicodeCharacterMap.Add("YI SYLLABLE SSAT", 41777); - _unicodeCharacterMap.Add("YI SYLLABLE SSAX", 41778); - _unicodeCharacterMap.Add("YI SYLLABLE SSA", 41779); - _unicodeCharacterMap.Add("YI SYLLABLE SSAP", 41780); - _unicodeCharacterMap.Add("YI SYLLABLE SSOT", 41781); - _unicodeCharacterMap.Add("YI SYLLABLE SSOX", 41782); - _unicodeCharacterMap.Add("YI SYLLABLE SSO", 41783); - _unicodeCharacterMap.Add("YI SYLLABLE SSOP", 41784); - _unicodeCharacterMap.Add("YI SYLLABLE SSEX", 41785); - _unicodeCharacterMap.Add("YI SYLLABLE SSE", 41786); - _unicodeCharacterMap.Add("YI SYLLABLE SSEP", 41787); - _unicodeCharacterMap.Add("YI SYLLABLE SSUT", 41788); - _unicodeCharacterMap.Add("YI SYLLABLE SSUX", 41789); - _unicodeCharacterMap.Add("YI SYLLABLE SSU", 41790); - _unicodeCharacterMap.Add("YI SYLLABLE SSUP", 41791); - _unicodeCharacterMap.Add("YI SYLLABLE SSYT", 41792); - _unicodeCharacterMap.Add("YI SYLLABLE SSYX", 41793); - _unicodeCharacterMap.Add("YI SYLLABLE SSY", 41794); - _unicodeCharacterMap.Add("YI SYLLABLE SSYP", 41795); - _unicodeCharacterMap.Add("YI SYLLABLE SSYRX", 41796); - _unicodeCharacterMap.Add("YI SYLLABLE SSYR", 41797); - _unicodeCharacterMap.Add("YI SYLLABLE ZHAT", 41798); - _unicodeCharacterMap.Add("YI SYLLABLE ZHAX", 41799); - _unicodeCharacterMap.Add("YI SYLLABLE ZHA", 41800); - _unicodeCharacterMap.Add("YI SYLLABLE ZHAP", 41801); - _unicodeCharacterMap.Add("YI SYLLABLE ZHUOX", 41802); - _unicodeCharacterMap.Add("YI SYLLABLE ZHUO", 41803); - _unicodeCharacterMap.Add("YI SYLLABLE ZHUOP", 41804); - _unicodeCharacterMap.Add("YI SYLLABLE ZHOT", 41805); - _unicodeCharacterMap.Add("YI SYLLABLE ZHOX", 41806); - _unicodeCharacterMap.Add("YI SYLLABLE ZHO", 41807); - _unicodeCharacterMap.Add("YI SYLLABLE ZHOP", 41808); - _unicodeCharacterMap.Add("YI SYLLABLE ZHET", 41809); - _unicodeCharacterMap.Add("YI SYLLABLE ZHEX", 41810); - _unicodeCharacterMap.Add("YI SYLLABLE ZHE", 41811); - _unicodeCharacterMap.Add("YI SYLLABLE ZHEP", 41812); - _unicodeCharacterMap.Add("YI SYLLABLE ZHUT", 41813); - _unicodeCharacterMap.Add("YI SYLLABLE ZHUX", 41814); - _unicodeCharacterMap.Add("YI SYLLABLE ZHU", 41815); - _unicodeCharacterMap.Add("YI SYLLABLE ZHUP", 41816); - _unicodeCharacterMap.Add("YI SYLLABLE ZHURX", 41817); - _unicodeCharacterMap.Add("YI SYLLABLE ZHUR", 41818); - _unicodeCharacterMap.Add("YI SYLLABLE ZHYT", 41819); - _unicodeCharacterMap.Add("YI SYLLABLE ZHYX", 41820); - _unicodeCharacterMap.Add("YI SYLLABLE ZHY", 41821); - _unicodeCharacterMap.Add("YI SYLLABLE ZHYP", 41822); - _unicodeCharacterMap.Add("YI SYLLABLE ZHYRX", 41823); - _unicodeCharacterMap.Add("YI SYLLABLE ZHYR", 41824); - _unicodeCharacterMap.Add("YI SYLLABLE CHAT", 41825); - _unicodeCharacterMap.Add("YI SYLLABLE CHAX", 41826); - _unicodeCharacterMap.Add("YI SYLLABLE CHA", 41827); - _unicodeCharacterMap.Add("YI SYLLABLE CHAP", 41828); - _unicodeCharacterMap.Add("YI SYLLABLE CHUOT", 41829); - _unicodeCharacterMap.Add("YI SYLLABLE CHUOX", 41830); - _unicodeCharacterMap.Add("YI SYLLABLE CHUO", 41831); - _unicodeCharacterMap.Add("YI SYLLABLE CHUOP", 41832); - _unicodeCharacterMap.Add("YI SYLLABLE CHOT", 41833); - _unicodeCharacterMap.Add("YI SYLLABLE CHOX", 41834); - _unicodeCharacterMap.Add("YI SYLLABLE CHO", 41835); - _unicodeCharacterMap.Add("YI SYLLABLE CHOP", 41836); - _unicodeCharacterMap.Add("YI SYLLABLE CHET", 41837); - _unicodeCharacterMap.Add("YI SYLLABLE CHEX", 41838); - _unicodeCharacterMap.Add("YI SYLLABLE CHE", 41839); - _unicodeCharacterMap.Add("YI SYLLABLE CHEP", 41840); - _unicodeCharacterMap.Add("YI SYLLABLE CHUX", 41841); - _unicodeCharacterMap.Add("YI SYLLABLE CHU", 41842); - _unicodeCharacterMap.Add("YI SYLLABLE CHUP", 41843); - _unicodeCharacterMap.Add("YI SYLLABLE CHURX", 41844); - _unicodeCharacterMap.Add("YI SYLLABLE CHUR", 41845); - _unicodeCharacterMap.Add("YI SYLLABLE CHYT", 41846); - _unicodeCharacterMap.Add("YI SYLLABLE CHYX", 41847); - _unicodeCharacterMap.Add("YI SYLLABLE CHY", 41848); - _unicodeCharacterMap.Add("YI SYLLABLE CHYP", 41849); - _unicodeCharacterMap.Add("YI SYLLABLE CHYRX", 41850); - _unicodeCharacterMap.Add("YI SYLLABLE CHYR", 41851); - _unicodeCharacterMap.Add("YI SYLLABLE RRAX", 41852); - _unicodeCharacterMap.Add("YI SYLLABLE RRA", 41853); - _unicodeCharacterMap.Add("YI SYLLABLE RRUOX", 41854); - _unicodeCharacterMap.Add("YI SYLLABLE RRUO", 41855); - _unicodeCharacterMap.Add("YI SYLLABLE RROT", 41856); - _unicodeCharacterMap.Add("YI SYLLABLE RROX", 41857); - _unicodeCharacterMap.Add("YI SYLLABLE RRO", 41858); - _unicodeCharacterMap.Add("YI SYLLABLE RROP", 41859); - _unicodeCharacterMap.Add("YI SYLLABLE RRET", 41860); - _unicodeCharacterMap.Add("YI SYLLABLE RREX", 41861); - _unicodeCharacterMap.Add("YI SYLLABLE RRE", 41862); - _unicodeCharacterMap.Add("YI SYLLABLE RREP", 41863); - _unicodeCharacterMap.Add("YI SYLLABLE RRUT", 41864); - _unicodeCharacterMap.Add("YI SYLLABLE RRUX", 41865); - _unicodeCharacterMap.Add("YI SYLLABLE RRU", 41866); - _unicodeCharacterMap.Add("YI SYLLABLE RRUP", 41867); - _unicodeCharacterMap.Add("YI SYLLABLE RRURX", 41868); - _unicodeCharacterMap.Add("YI SYLLABLE RRUR", 41869); - _unicodeCharacterMap.Add("YI SYLLABLE RRYT", 41870); - _unicodeCharacterMap.Add("YI SYLLABLE RRYX", 41871); - _unicodeCharacterMap.Add("YI SYLLABLE RRY", 41872); - _unicodeCharacterMap.Add("YI SYLLABLE RRYP", 41873); - _unicodeCharacterMap.Add("YI SYLLABLE RRYRX", 41874); - _unicodeCharacterMap.Add("YI SYLLABLE RRYR", 41875); - _unicodeCharacterMap.Add("YI SYLLABLE NRAT", 41876); - _unicodeCharacterMap.Add("YI SYLLABLE NRAX", 41877); - _unicodeCharacterMap.Add("YI SYLLABLE NRA", 41878); - _unicodeCharacterMap.Add("YI SYLLABLE NRAP", 41879); - _unicodeCharacterMap.Add("YI SYLLABLE NROX", 41880); - _unicodeCharacterMap.Add("YI SYLLABLE NRO", 41881); - _unicodeCharacterMap.Add("YI SYLLABLE NROP", 41882); - _unicodeCharacterMap.Add("YI SYLLABLE NRET", 41883); - _unicodeCharacterMap.Add("YI SYLLABLE NREX", 41884); - _unicodeCharacterMap.Add("YI SYLLABLE NRE", 41885); - _unicodeCharacterMap.Add("YI SYLLABLE NREP", 41886); - _unicodeCharacterMap.Add("YI SYLLABLE NRUT", 41887); - _unicodeCharacterMap.Add("YI SYLLABLE NRUX", 41888); - _unicodeCharacterMap.Add("YI SYLLABLE NRU", 41889); - _unicodeCharacterMap.Add("YI SYLLABLE NRUP", 41890); - _unicodeCharacterMap.Add("YI SYLLABLE NRURX", 41891); - _unicodeCharacterMap.Add("YI SYLLABLE NRUR", 41892); - _unicodeCharacterMap.Add("YI SYLLABLE NRYT", 41893); - _unicodeCharacterMap.Add("YI SYLLABLE NRYX", 41894); - _unicodeCharacterMap.Add("YI SYLLABLE NRY", 41895); - _unicodeCharacterMap.Add("YI SYLLABLE NRYP", 41896); - _unicodeCharacterMap.Add("YI SYLLABLE NRYRX", 41897); - _unicodeCharacterMap.Add("YI SYLLABLE NRYR", 41898); - _unicodeCharacterMap.Add("YI SYLLABLE SHAT", 41899); - _unicodeCharacterMap.Add("YI SYLLABLE SHAX", 41900); - _unicodeCharacterMap.Add("YI SYLLABLE SHA", 41901); - _unicodeCharacterMap.Add("YI SYLLABLE SHAP", 41902); - _unicodeCharacterMap.Add("YI SYLLABLE SHUOX", 41903); - _unicodeCharacterMap.Add("YI SYLLABLE SHUO", 41904); - _unicodeCharacterMap.Add("YI SYLLABLE SHUOP", 41905); - _unicodeCharacterMap.Add("YI SYLLABLE SHOT", 41906); - _unicodeCharacterMap.Add("YI SYLLABLE SHOX", 41907); - _unicodeCharacterMap.Add("YI SYLLABLE SHO", 41908); - _unicodeCharacterMap.Add("YI SYLLABLE SHOP", 41909); - _unicodeCharacterMap.Add("YI SYLLABLE SHET", 41910); - _unicodeCharacterMap.Add("YI SYLLABLE SHEX", 41911); - _unicodeCharacterMap.Add("YI SYLLABLE SHE", 41912); - _unicodeCharacterMap.Add("YI SYLLABLE SHEP", 41913); - _unicodeCharacterMap.Add("YI SYLLABLE SHUT", 41914); - _unicodeCharacterMap.Add("YI SYLLABLE SHUX", 41915); - _unicodeCharacterMap.Add("YI SYLLABLE SHU", 41916); - _unicodeCharacterMap.Add("YI SYLLABLE SHUP", 41917); - _unicodeCharacterMap.Add("YI SYLLABLE SHURX", 41918); - _unicodeCharacterMap.Add("YI SYLLABLE SHUR", 41919); - _unicodeCharacterMap.Add("YI SYLLABLE SHYT", 41920); - _unicodeCharacterMap.Add("YI SYLLABLE SHYX", 41921); - _unicodeCharacterMap.Add("YI SYLLABLE SHY", 41922); - _unicodeCharacterMap.Add("YI SYLLABLE SHYP", 41923); - _unicodeCharacterMap.Add("YI SYLLABLE SHYRX", 41924); - _unicodeCharacterMap.Add("YI SYLLABLE SHYR", 41925); - _unicodeCharacterMap.Add("YI SYLLABLE RAT", 41926); - _unicodeCharacterMap.Add("YI SYLLABLE RAX", 41927); - _unicodeCharacterMap.Add("YI SYLLABLE RA", 41928); - _unicodeCharacterMap.Add("YI SYLLABLE RAP", 41929); - _unicodeCharacterMap.Add("YI SYLLABLE RUOX", 41930); - _unicodeCharacterMap.Add("YI SYLLABLE RUO", 41931); - _unicodeCharacterMap.Add("YI SYLLABLE RUOP", 41932); - _unicodeCharacterMap.Add("YI SYLLABLE ROT", 41933); - _unicodeCharacterMap.Add("YI SYLLABLE ROX", 41934); - _unicodeCharacterMap.Add("YI SYLLABLE RO", 41935); - _unicodeCharacterMap.Add("YI SYLLABLE ROP", 41936); - _unicodeCharacterMap.Add("YI SYLLABLE REX", 41937); - _unicodeCharacterMap.Add("YI SYLLABLE RE", 41938); - _unicodeCharacterMap.Add("YI SYLLABLE REP", 41939); - _unicodeCharacterMap.Add("YI SYLLABLE RUT", 41940); - _unicodeCharacterMap.Add("YI SYLLABLE RUX", 41941); - _unicodeCharacterMap.Add("YI SYLLABLE RU", 41942); - _unicodeCharacterMap.Add("YI SYLLABLE RUP", 41943); - _unicodeCharacterMap.Add("YI SYLLABLE RURX", 41944); - _unicodeCharacterMap.Add("YI SYLLABLE RUR", 41945); - _unicodeCharacterMap.Add("YI SYLLABLE RYT", 41946); - _unicodeCharacterMap.Add("YI SYLLABLE RYX", 41947); - _unicodeCharacterMap.Add("YI SYLLABLE RY", 41948); - _unicodeCharacterMap.Add("YI SYLLABLE RYP", 41949); - _unicodeCharacterMap.Add("YI SYLLABLE RYRX", 41950); - _unicodeCharacterMap.Add("YI SYLLABLE RYR", 41951); - _unicodeCharacterMap.Add("YI SYLLABLE JIT", 41952); - _unicodeCharacterMap.Add("YI SYLLABLE JIX", 41953); - _unicodeCharacterMap.Add("YI SYLLABLE JI", 41954); - _unicodeCharacterMap.Add("YI SYLLABLE JIP", 41955); - _unicodeCharacterMap.Add("YI SYLLABLE JIET", 41956); - _unicodeCharacterMap.Add("YI SYLLABLE JIEX", 41957); - _unicodeCharacterMap.Add("YI SYLLABLE JIE", 41958); - _unicodeCharacterMap.Add("YI SYLLABLE JIEP", 41959); - _unicodeCharacterMap.Add("YI SYLLABLE JUOT", 41960); - _unicodeCharacterMap.Add("YI SYLLABLE JUOX", 41961); - _unicodeCharacterMap.Add("YI SYLLABLE JUO", 41962); - _unicodeCharacterMap.Add("YI SYLLABLE JUOP", 41963); - _unicodeCharacterMap.Add("YI SYLLABLE JOT", 41964); - _unicodeCharacterMap.Add("YI SYLLABLE JOX", 41965); - _unicodeCharacterMap.Add("YI SYLLABLE JO", 41966); - _unicodeCharacterMap.Add("YI SYLLABLE JOP", 41967); - _unicodeCharacterMap.Add("YI SYLLABLE JUT", 41968); - _unicodeCharacterMap.Add("YI SYLLABLE JUX", 41969); - _unicodeCharacterMap.Add("YI SYLLABLE JU", 41970); - _unicodeCharacterMap.Add("YI SYLLABLE JUP", 41971); - _unicodeCharacterMap.Add("YI SYLLABLE JURX", 41972); - _unicodeCharacterMap.Add("YI SYLLABLE JUR", 41973); - _unicodeCharacterMap.Add("YI SYLLABLE JYT", 41974); - _unicodeCharacterMap.Add("YI SYLLABLE JYX", 41975); - _unicodeCharacterMap.Add("YI SYLLABLE JY", 41976); - _unicodeCharacterMap.Add("YI SYLLABLE JYP", 41977); - _unicodeCharacterMap.Add("YI SYLLABLE JYRX", 41978); - _unicodeCharacterMap.Add("YI SYLLABLE JYR", 41979); - _unicodeCharacterMap.Add("YI SYLLABLE QIT", 41980); - _unicodeCharacterMap.Add("YI SYLLABLE QIX", 41981); - _unicodeCharacterMap.Add("YI SYLLABLE QI", 41982); - _unicodeCharacterMap.Add("YI SYLLABLE QIP", 41983); - _unicodeCharacterMap.Add("YI SYLLABLE QIET", 41984); - _unicodeCharacterMap.Add("YI SYLLABLE QIEX", 41985); - _unicodeCharacterMap.Add("YI SYLLABLE QIE", 41986); - _unicodeCharacterMap.Add("YI SYLLABLE QIEP", 41987); - _unicodeCharacterMap.Add("YI SYLLABLE QUOT", 41988); - _unicodeCharacterMap.Add("YI SYLLABLE QUOX", 41989); - _unicodeCharacterMap.Add("YI SYLLABLE QUO", 41990); - _unicodeCharacterMap.Add("YI SYLLABLE QUOP", 41991); - _unicodeCharacterMap.Add("YI SYLLABLE QOT", 41992); - _unicodeCharacterMap.Add("YI SYLLABLE QOX", 41993); - _unicodeCharacterMap.Add("YI SYLLABLE QO", 41994); - _unicodeCharacterMap.Add("YI SYLLABLE QOP", 41995); - _unicodeCharacterMap.Add("YI SYLLABLE QUT", 41996); - _unicodeCharacterMap.Add("YI SYLLABLE QUX", 41997); - _unicodeCharacterMap.Add("YI SYLLABLE QU", 41998); - _unicodeCharacterMap.Add("YI SYLLABLE QUP", 41999); - _unicodeCharacterMap.Add("YI SYLLABLE QURX", 42000); - _unicodeCharacterMap.Add("YI SYLLABLE QUR", 42001); - _unicodeCharacterMap.Add("YI SYLLABLE QYT", 42002); - _unicodeCharacterMap.Add("YI SYLLABLE QYX", 42003); - _unicodeCharacterMap.Add("YI SYLLABLE QY", 42004); - _unicodeCharacterMap.Add("YI SYLLABLE QYP", 42005); - _unicodeCharacterMap.Add("YI SYLLABLE QYRX", 42006); - _unicodeCharacterMap.Add("YI SYLLABLE QYR", 42007); - _unicodeCharacterMap.Add("YI SYLLABLE JJIT", 42008); - _unicodeCharacterMap.Add("YI SYLLABLE JJIX", 42009); - _unicodeCharacterMap.Add("YI SYLLABLE JJI", 42010); - _unicodeCharacterMap.Add("YI SYLLABLE JJIP", 42011); - _unicodeCharacterMap.Add("YI SYLLABLE JJIET", 42012); - _unicodeCharacterMap.Add("YI SYLLABLE JJIEX", 42013); - _unicodeCharacterMap.Add("YI SYLLABLE JJIE", 42014); - _unicodeCharacterMap.Add("YI SYLLABLE JJIEP", 42015); - _unicodeCharacterMap.Add("YI SYLLABLE JJUOX", 42016); - _unicodeCharacterMap.Add("YI SYLLABLE JJUO", 42017); - _unicodeCharacterMap.Add("YI SYLLABLE JJUOP", 42018); - _unicodeCharacterMap.Add("YI SYLLABLE JJOT", 42019); - _unicodeCharacterMap.Add("YI SYLLABLE JJOX", 42020); - _unicodeCharacterMap.Add("YI SYLLABLE JJO", 42021); - _unicodeCharacterMap.Add("YI SYLLABLE JJOP", 42022); - _unicodeCharacterMap.Add("YI SYLLABLE JJUT", 42023); - _unicodeCharacterMap.Add("YI SYLLABLE JJUX", 42024); - _unicodeCharacterMap.Add("YI SYLLABLE JJU", 42025); - _unicodeCharacterMap.Add("YI SYLLABLE JJUP", 42026); - _unicodeCharacterMap.Add("YI SYLLABLE JJURX", 42027); - _unicodeCharacterMap.Add("YI SYLLABLE JJUR", 42028); - _unicodeCharacterMap.Add("YI SYLLABLE JJYT", 42029); - _unicodeCharacterMap.Add("YI SYLLABLE JJYX", 42030); - _unicodeCharacterMap.Add("YI SYLLABLE JJY", 42031); - _unicodeCharacterMap.Add("YI SYLLABLE JJYP", 42032); - _unicodeCharacterMap.Add("YI SYLLABLE NJIT", 42033); - _unicodeCharacterMap.Add("YI SYLLABLE NJIX", 42034); - _unicodeCharacterMap.Add("YI SYLLABLE NJI", 42035); - _unicodeCharacterMap.Add("YI SYLLABLE NJIP", 42036); - _unicodeCharacterMap.Add("YI SYLLABLE NJIET", 42037); - _unicodeCharacterMap.Add("YI SYLLABLE NJIEX", 42038); - _unicodeCharacterMap.Add("YI SYLLABLE NJIE", 42039); - _unicodeCharacterMap.Add("YI SYLLABLE NJIEP", 42040); - _unicodeCharacterMap.Add("YI SYLLABLE NJUOX", 42041); - _unicodeCharacterMap.Add("YI SYLLABLE NJUO", 42042); - _unicodeCharacterMap.Add("YI SYLLABLE NJOT", 42043); - _unicodeCharacterMap.Add("YI SYLLABLE NJOX", 42044); - _unicodeCharacterMap.Add("YI SYLLABLE NJO", 42045); - _unicodeCharacterMap.Add("YI SYLLABLE NJOP", 42046); - _unicodeCharacterMap.Add("YI SYLLABLE NJUX", 42047); - _unicodeCharacterMap.Add("YI SYLLABLE NJU", 42048); - _unicodeCharacterMap.Add("YI SYLLABLE NJUP", 42049); - _unicodeCharacterMap.Add("YI SYLLABLE NJURX", 42050); - _unicodeCharacterMap.Add("YI SYLLABLE NJUR", 42051); - _unicodeCharacterMap.Add("YI SYLLABLE NJYT", 42052); - _unicodeCharacterMap.Add("YI SYLLABLE NJYX", 42053); - _unicodeCharacterMap.Add("YI SYLLABLE NJY", 42054); - _unicodeCharacterMap.Add("YI SYLLABLE NJYP", 42055); - _unicodeCharacterMap.Add("YI SYLLABLE NJYRX", 42056); - _unicodeCharacterMap.Add("YI SYLLABLE NJYR", 42057); - _unicodeCharacterMap.Add("YI SYLLABLE NYIT", 42058); - _unicodeCharacterMap.Add("YI SYLLABLE NYIX", 42059); - _unicodeCharacterMap.Add("YI SYLLABLE NYI", 42060); - _unicodeCharacterMap.Add("YI SYLLABLE NYIP", 42061); - _unicodeCharacterMap.Add("YI SYLLABLE NYIET", 42062); - _unicodeCharacterMap.Add("YI SYLLABLE NYIEX", 42063); - _unicodeCharacterMap.Add("YI SYLLABLE NYIE", 42064); - _unicodeCharacterMap.Add("YI SYLLABLE NYIEP", 42065); - _unicodeCharacterMap.Add("YI SYLLABLE NYUOX", 42066); - _unicodeCharacterMap.Add("YI SYLLABLE NYUO", 42067); - _unicodeCharacterMap.Add("YI SYLLABLE NYUOP", 42068); - _unicodeCharacterMap.Add("YI SYLLABLE NYOT", 42069); - _unicodeCharacterMap.Add("YI SYLLABLE NYOX", 42070); - _unicodeCharacterMap.Add("YI SYLLABLE NYO", 42071); - _unicodeCharacterMap.Add("YI SYLLABLE NYOP", 42072); - _unicodeCharacterMap.Add("YI SYLLABLE NYUT", 42073); - _unicodeCharacterMap.Add("YI SYLLABLE NYUX", 42074); - _unicodeCharacterMap.Add("YI SYLLABLE NYU", 42075); - _unicodeCharacterMap.Add("YI SYLLABLE NYUP", 42076); - _unicodeCharacterMap.Add("YI SYLLABLE XIT", 42077); - _unicodeCharacterMap.Add("YI SYLLABLE XIX", 42078); - _unicodeCharacterMap.Add("YI SYLLABLE XI", 42079); - _unicodeCharacterMap.Add("YI SYLLABLE XIP", 42080); - _unicodeCharacterMap.Add("YI SYLLABLE XIET", 42081); - _unicodeCharacterMap.Add("YI SYLLABLE XIEX", 42082); - _unicodeCharacterMap.Add("YI SYLLABLE XIE", 42083); - _unicodeCharacterMap.Add("YI SYLLABLE XIEP", 42084); - _unicodeCharacterMap.Add("YI SYLLABLE XUOX", 42085); - _unicodeCharacterMap.Add("YI SYLLABLE XUO", 42086); - _unicodeCharacterMap.Add("YI SYLLABLE XOT", 42087); - _unicodeCharacterMap.Add("YI SYLLABLE XOX", 42088); - _unicodeCharacterMap.Add("YI SYLLABLE XO", 42089); - _unicodeCharacterMap.Add("YI SYLLABLE XOP", 42090); - _unicodeCharacterMap.Add("YI SYLLABLE XYT", 42091); - _unicodeCharacterMap.Add("YI SYLLABLE XYX", 42092); - _unicodeCharacterMap.Add("YI SYLLABLE XY", 42093); - _unicodeCharacterMap.Add("YI SYLLABLE XYP", 42094); - _unicodeCharacterMap.Add("YI SYLLABLE XYRX", 42095); - _unicodeCharacterMap.Add("YI SYLLABLE XYR", 42096); - _unicodeCharacterMap.Add("YI SYLLABLE YIT", 42097); - _unicodeCharacterMap.Add("YI SYLLABLE YIX", 42098); - _unicodeCharacterMap.Add("YI SYLLABLE YI", 42099); - _unicodeCharacterMap.Add("YI SYLLABLE YIP", 42100); - _unicodeCharacterMap.Add("YI SYLLABLE YIET", 42101); - _unicodeCharacterMap.Add("YI SYLLABLE YIEX", 42102); - _unicodeCharacterMap.Add("YI SYLLABLE YIE", 42103); - _unicodeCharacterMap.Add("YI SYLLABLE YIEP", 42104); - _unicodeCharacterMap.Add("YI SYLLABLE YUOT", 42105); - _unicodeCharacterMap.Add("YI SYLLABLE YUOX", 42106); - _unicodeCharacterMap.Add("YI SYLLABLE YUO", 42107); - _unicodeCharacterMap.Add("YI SYLLABLE YUOP", 42108); - _unicodeCharacterMap.Add("YI SYLLABLE YOT", 42109); - _unicodeCharacterMap.Add("YI SYLLABLE YOX", 42110); - _unicodeCharacterMap.Add("YI SYLLABLE YO", 42111); - _unicodeCharacterMap.Add("YI SYLLABLE YOP", 42112); - _unicodeCharacterMap.Add("YI SYLLABLE YUT", 42113); - _unicodeCharacterMap.Add("YI SYLLABLE YUX", 42114); - _unicodeCharacterMap.Add("YI SYLLABLE YU", 42115); - _unicodeCharacterMap.Add("YI SYLLABLE YUP", 42116); - _unicodeCharacterMap.Add("YI SYLLABLE YURX", 42117); - _unicodeCharacterMap.Add("YI SYLLABLE YUR", 42118); - _unicodeCharacterMap.Add("YI SYLLABLE YYT", 42119); - _unicodeCharacterMap.Add("YI SYLLABLE YYX", 42120); - _unicodeCharacterMap.Add("YI SYLLABLE YY", 42121); - _unicodeCharacterMap.Add("YI SYLLABLE YYP", 42122); - _unicodeCharacterMap.Add("YI SYLLABLE YYRX", 42123); - _unicodeCharacterMap.Add("YI SYLLABLE YYR", 42124); - _unicodeCharacterMap.Add("YI RADICAL QOT", 42128); - _unicodeCharacterMap.Add("YI RADICAL LI", 42129); - _unicodeCharacterMap.Add("YI RADICAL KIT", 42130); - _unicodeCharacterMap.Add("YI RADICAL NYIP", 42131); - _unicodeCharacterMap.Add("YI RADICAL CYP", 42132); - _unicodeCharacterMap.Add("YI RADICAL SSI", 42133); - _unicodeCharacterMap.Add("YI RADICAL GGOP", 42134); - _unicodeCharacterMap.Add("YI RADICAL GEP", 42135); - _unicodeCharacterMap.Add("YI RADICAL MI", 42136); - _unicodeCharacterMap.Add("YI RADICAL HXIT", 42137); - _unicodeCharacterMap.Add("YI RADICAL LYR", 42138); - _unicodeCharacterMap.Add("YI RADICAL BBUT", 42139); - _unicodeCharacterMap.Add("YI RADICAL MOP", 42140); - _unicodeCharacterMap.Add("YI RADICAL YO", 42141); - _unicodeCharacterMap.Add("YI RADICAL PUT", 42142); - _unicodeCharacterMap.Add("YI RADICAL HXUO", 42143); - _unicodeCharacterMap.Add("YI RADICAL TAT", 42144); - _unicodeCharacterMap.Add("YI RADICAL GA", 42145); - _unicodeCharacterMap.Add("YI RADICAL ZUP", 42146); - _unicodeCharacterMap.Add("YI RADICAL CYT", 42147); - _unicodeCharacterMap.Add("YI RADICAL DDUR", 42148); - _unicodeCharacterMap.Add("YI RADICAL BUR", 42149); - _unicodeCharacterMap.Add("YI RADICAL GGUO", 42150); - _unicodeCharacterMap.Add("YI RADICAL NYOP", 42151); - _unicodeCharacterMap.Add("YI RADICAL TU", 42152); - _unicodeCharacterMap.Add("YI RADICAL OP", 42153); - _unicodeCharacterMap.Add("YI RADICAL JJUT", 42154); - _unicodeCharacterMap.Add("YI RADICAL ZOT", 42155); - _unicodeCharacterMap.Add("YI RADICAL PYT", 42156); - _unicodeCharacterMap.Add("YI RADICAL HMO", 42157); - _unicodeCharacterMap.Add("YI RADICAL YIT", 42158); - _unicodeCharacterMap.Add("YI RADICAL VUR", 42159); - _unicodeCharacterMap.Add("YI RADICAL SHY", 42160); - _unicodeCharacterMap.Add("YI RADICAL VEP", 42161); - _unicodeCharacterMap.Add("YI RADICAL ZA", 42162); - _unicodeCharacterMap.Add("YI RADICAL JO", 42163); - _unicodeCharacterMap.Add("YI RADICAL NZUP", 42164); - _unicodeCharacterMap.Add("YI RADICAL JJY", 42165); - _unicodeCharacterMap.Add("YI RADICAL GOT", 42166); - _unicodeCharacterMap.Add("YI RADICAL JJIE", 42167); - _unicodeCharacterMap.Add("YI RADICAL WO", 42168); - _unicodeCharacterMap.Add("YI RADICAL DU", 42169); - _unicodeCharacterMap.Add("YI RADICAL SHUR", 42170); - _unicodeCharacterMap.Add("YI RADICAL LIE", 42171); - _unicodeCharacterMap.Add("YI RADICAL CY", 42172); - _unicodeCharacterMap.Add("YI RADICAL CUOP", 42173); - _unicodeCharacterMap.Add("YI RADICAL CIP", 42174); - _unicodeCharacterMap.Add("YI RADICAL HXOP", 42175); - _unicodeCharacterMap.Add("YI RADICAL SHAT", 42176); - _unicodeCharacterMap.Add("YI RADICAL ZUR", 42177); - _unicodeCharacterMap.Add("YI RADICAL SHOP", 42178); - _unicodeCharacterMap.Add("YI RADICAL CHE", 42179); - _unicodeCharacterMap.Add("YI RADICAL ZZIET", 42180); - _unicodeCharacterMap.Add("YI RADICAL NBIE", 42181); - _unicodeCharacterMap.Add("YI RADICAL KE", 42182); - _unicodeCharacterMap.Add("LISU LETTER BA", 42192); - _unicodeCharacterMap.Add("LISU LETTER PA", 42193); - _unicodeCharacterMap.Add("LISU LETTER PHA", 42194); - _unicodeCharacterMap.Add("LISU LETTER DA", 42195); - _unicodeCharacterMap.Add("LISU LETTER TA", 42196); - _unicodeCharacterMap.Add("LISU LETTER THA", 42197); - _unicodeCharacterMap.Add("LISU LETTER GA", 42198); - _unicodeCharacterMap.Add("LISU LETTER KA", 42199); - _unicodeCharacterMap.Add("LISU LETTER KHA", 42200); - _unicodeCharacterMap.Add("LISU LETTER JA", 42201); - _unicodeCharacterMap.Add("LISU LETTER CA", 42202); - _unicodeCharacterMap.Add("LISU LETTER CHA", 42203); - _unicodeCharacterMap.Add("LISU LETTER DZA", 42204); - _unicodeCharacterMap.Add("LISU LETTER TSA", 42205); - _unicodeCharacterMap.Add("LISU LETTER TSHA", 42206); - _unicodeCharacterMap.Add("LISU LETTER MA", 42207); - _unicodeCharacterMap.Add("LISU LETTER NA", 42208); - _unicodeCharacterMap.Add("LISU LETTER LA", 42209); - _unicodeCharacterMap.Add("LISU LETTER SA", 42210); - _unicodeCharacterMap.Add("LISU LETTER ZHA", 42211); - _unicodeCharacterMap.Add("LISU LETTER ZA", 42212); - _unicodeCharacterMap.Add("LISU LETTER NGA", 42213); - _unicodeCharacterMap.Add("LISU LETTER HA", 42214); - _unicodeCharacterMap.Add("LISU LETTER XA", 42215); - _unicodeCharacterMap.Add("LISU LETTER HHA", 42216); - _unicodeCharacterMap.Add("LISU LETTER FA", 42217); - _unicodeCharacterMap.Add("LISU LETTER WA", 42218); - _unicodeCharacterMap.Add("LISU LETTER SHA", 42219); - _unicodeCharacterMap.Add("LISU LETTER YA", 42220); - _unicodeCharacterMap.Add("LISU LETTER GHA", 42221); - _unicodeCharacterMap.Add("LISU LETTER A", 42222); - _unicodeCharacterMap.Add("LISU LETTER AE", 42223); - _unicodeCharacterMap.Add("LISU LETTER E", 42224); - _unicodeCharacterMap.Add("LISU LETTER EU", 42225); - _unicodeCharacterMap.Add("LISU LETTER I", 42226); - _unicodeCharacterMap.Add("LISU LETTER O", 42227); - _unicodeCharacterMap.Add("LISU LETTER U", 42228); - _unicodeCharacterMap.Add("LISU LETTER UE", 42229); - _unicodeCharacterMap.Add("LISU LETTER UH", 42230); - _unicodeCharacterMap.Add("LISU LETTER OE", 42231); - _unicodeCharacterMap.Add("LISU LETTER TONE MYA TI", 42232); - _unicodeCharacterMap.Add("LISU LETTER TONE NA PO", 42233); - _unicodeCharacterMap.Add("LISU LETTER TONE MYA CYA", 42234); - _unicodeCharacterMap.Add("LISU LETTER TONE MYA BO", 42235); - _unicodeCharacterMap.Add("LISU LETTER TONE MYA NA", 42236); - _unicodeCharacterMap.Add("LISU LETTER TONE MYA JEU", 42237); - _unicodeCharacterMap.Add("LISU PUNCTUATION COMMA", 42238); - _unicodeCharacterMap.Add("LISU PUNCTUATION FULL STOP", 42239); - _unicodeCharacterMap.Add("VAI SYLLABLE EE", 42240); - _unicodeCharacterMap.Add("VAI SYLLABLE EEN", 42241); - _unicodeCharacterMap.Add("VAI SYLLABLE HEE", 42242); - _unicodeCharacterMap.Add("VAI SYLLABLE WEE", 42243); - _unicodeCharacterMap.Add("VAI SYLLABLE WEEN", 42244); - _unicodeCharacterMap.Add("VAI SYLLABLE PEE", 42245); - _unicodeCharacterMap.Add("VAI SYLLABLE BHEE", 42246); - _unicodeCharacterMap.Add("VAI SYLLABLE BEE", 42247); - _unicodeCharacterMap.Add("VAI SYLLABLE MBEE", 42248); - _unicodeCharacterMap.Add("VAI SYLLABLE KPEE", 42249); - _unicodeCharacterMap.Add("VAI SYLLABLE MGBEE", 42250); - _unicodeCharacterMap.Add("VAI SYLLABLE GBEE", 42251); - _unicodeCharacterMap.Add("VAI SYLLABLE FEE", 42252); - _unicodeCharacterMap.Add("VAI SYLLABLE VEE", 42253); - _unicodeCharacterMap.Add("VAI SYLLABLE TEE", 42254); - _unicodeCharacterMap.Add("VAI SYLLABLE THEE", 42255); - _unicodeCharacterMap.Add("VAI SYLLABLE DHEE", 42256); - _unicodeCharacterMap.Add("VAI SYLLABLE DHHEE", 42257); - _unicodeCharacterMap.Add("VAI SYLLABLE LEE", 42258); - _unicodeCharacterMap.Add("VAI SYLLABLE REE", 42259); - _unicodeCharacterMap.Add("VAI SYLLABLE DEE", 42260); - _unicodeCharacterMap.Add("VAI SYLLABLE NDEE", 42261); - _unicodeCharacterMap.Add("VAI SYLLABLE SEE", 42262); - _unicodeCharacterMap.Add("VAI SYLLABLE SHEE", 42263); - _unicodeCharacterMap.Add("VAI SYLLABLE ZEE", 42264); - _unicodeCharacterMap.Add("VAI SYLLABLE ZHEE", 42265); - _unicodeCharacterMap.Add("VAI SYLLABLE CEE", 42266); - _unicodeCharacterMap.Add("VAI SYLLABLE JEE", 42267); - _unicodeCharacterMap.Add("VAI SYLLABLE NJEE", 42268); - _unicodeCharacterMap.Add("VAI SYLLABLE YEE", 42269); - _unicodeCharacterMap.Add("VAI SYLLABLE KEE", 42270); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGEE", 42271); - _unicodeCharacterMap.Add("VAI SYLLABLE GEE", 42272); - _unicodeCharacterMap.Add("VAI SYLLABLE MEE", 42273); - _unicodeCharacterMap.Add("VAI SYLLABLE NEE", 42274); - _unicodeCharacterMap.Add("VAI SYLLABLE NYEE", 42275); - _unicodeCharacterMap.Add("VAI SYLLABLE I", 42276); - _unicodeCharacterMap.Add("VAI SYLLABLE IN", 42277); - _unicodeCharacterMap.Add("VAI SYLLABLE HI", 42278); - _unicodeCharacterMap.Add("VAI SYLLABLE HIN", 42279); - _unicodeCharacterMap.Add("VAI SYLLABLE WI", 42280); - _unicodeCharacterMap.Add("VAI SYLLABLE WIN", 42281); - _unicodeCharacterMap.Add("VAI SYLLABLE PI", 42282); - _unicodeCharacterMap.Add("VAI SYLLABLE BHI", 42283); - _unicodeCharacterMap.Add("VAI SYLLABLE BI", 42284); - _unicodeCharacterMap.Add("VAI SYLLABLE MBI", 42285); - _unicodeCharacterMap.Add("VAI SYLLABLE KPI", 42286); - _unicodeCharacterMap.Add("VAI SYLLABLE MGBI", 42287); - _unicodeCharacterMap.Add("VAI SYLLABLE GBI", 42288); - _unicodeCharacterMap.Add("VAI SYLLABLE FI", 42289); - _unicodeCharacterMap.Add("VAI SYLLABLE VI", 42290); - _unicodeCharacterMap.Add("VAI SYLLABLE TI", 42291); - _unicodeCharacterMap.Add("VAI SYLLABLE THI", 42292); - _unicodeCharacterMap.Add("VAI SYLLABLE DHI", 42293); - _unicodeCharacterMap.Add("VAI SYLLABLE DHHI", 42294); - _unicodeCharacterMap.Add("VAI SYLLABLE LI", 42295); - _unicodeCharacterMap.Add("VAI SYLLABLE RI", 42296); - _unicodeCharacterMap.Add("VAI SYLLABLE DI", 42297); - _unicodeCharacterMap.Add("VAI SYLLABLE NDI", 42298); - _unicodeCharacterMap.Add("VAI SYLLABLE SI", 42299); - _unicodeCharacterMap.Add("VAI SYLLABLE SHI", 42300); - _unicodeCharacterMap.Add("VAI SYLLABLE ZI", 42301); - _unicodeCharacterMap.Add("VAI SYLLABLE ZHI", 42302); - _unicodeCharacterMap.Add("VAI SYLLABLE CI", 42303); - _unicodeCharacterMap.Add("VAI SYLLABLE JI", 42304); - _unicodeCharacterMap.Add("VAI SYLLABLE NJI", 42305); - _unicodeCharacterMap.Add("VAI SYLLABLE YI", 42306); - _unicodeCharacterMap.Add("VAI SYLLABLE KI", 42307); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGI", 42308); - _unicodeCharacterMap.Add("VAI SYLLABLE GI", 42309); - _unicodeCharacterMap.Add("VAI SYLLABLE MI", 42310); - _unicodeCharacterMap.Add("VAI SYLLABLE NI", 42311); - _unicodeCharacterMap.Add("VAI SYLLABLE NYI", 42312); - _unicodeCharacterMap.Add("VAI SYLLABLE A", 42313); - _unicodeCharacterMap.Add("VAI SYLLABLE AN", 42314); - _unicodeCharacterMap.Add("VAI SYLLABLE NGAN", 42315); - _unicodeCharacterMap.Add("VAI SYLLABLE HA", 42316); - _unicodeCharacterMap.Add("VAI SYLLABLE HAN", 42317); - _unicodeCharacterMap.Add("VAI SYLLABLE WA", 42318); - _unicodeCharacterMap.Add("VAI SYLLABLE WAN", 42319); - _unicodeCharacterMap.Add("VAI SYLLABLE PA", 42320); - _unicodeCharacterMap.Add("VAI SYLLABLE BHA", 42321); - _unicodeCharacterMap.Add("VAI SYLLABLE BA", 42322); - _unicodeCharacterMap.Add("VAI SYLLABLE MBA", 42323); - _unicodeCharacterMap.Add("VAI SYLLABLE KPA", 42324); - _unicodeCharacterMap.Add("VAI SYLLABLE KPAN", 42325); - _unicodeCharacterMap.Add("VAI SYLLABLE MGBA", 42326); - _unicodeCharacterMap.Add("VAI SYLLABLE GBA", 42327); - _unicodeCharacterMap.Add("VAI SYLLABLE FA", 42328); - _unicodeCharacterMap.Add("VAI SYLLABLE VA", 42329); - _unicodeCharacterMap.Add("VAI SYLLABLE TA", 42330); - _unicodeCharacterMap.Add("VAI SYLLABLE THA", 42331); - _unicodeCharacterMap.Add("VAI SYLLABLE DHA", 42332); - _unicodeCharacterMap.Add("VAI SYLLABLE DHHA", 42333); - _unicodeCharacterMap.Add("VAI SYLLABLE LA", 42334); - _unicodeCharacterMap.Add("VAI SYLLABLE RA", 42335); - _unicodeCharacterMap.Add("VAI SYLLABLE DA", 42336); - _unicodeCharacterMap.Add("VAI SYLLABLE NDA", 42337); - _unicodeCharacterMap.Add("VAI SYLLABLE SA", 42338); - _unicodeCharacterMap.Add("VAI SYLLABLE SHA", 42339); - _unicodeCharacterMap.Add("VAI SYLLABLE ZA", 42340); - _unicodeCharacterMap.Add("VAI SYLLABLE ZHA", 42341); - _unicodeCharacterMap.Add("VAI SYLLABLE CA", 42342); - _unicodeCharacterMap.Add("VAI SYLLABLE JA", 42343); - _unicodeCharacterMap.Add("VAI SYLLABLE NJA", 42344); - _unicodeCharacterMap.Add("VAI SYLLABLE YA", 42345); - _unicodeCharacterMap.Add("VAI SYLLABLE KA", 42346); - _unicodeCharacterMap.Add("VAI SYLLABLE KAN", 42347); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGA", 42348); - _unicodeCharacterMap.Add("VAI SYLLABLE GA", 42349); - _unicodeCharacterMap.Add("VAI SYLLABLE MA", 42350); - _unicodeCharacterMap.Add("VAI SYLLABLE NA", 42351); - _unicodeCharacterMap.Add("VAI SYLLABLE NYA", 42352); - _unicodeCharacterMap.Add("VAI SYLLABLE OO", 42353); - _unicodeCharacterMap.Add("VAI SYLLABLE OON", 42354); - _unicodeCharacterMap.Add("VAI SYLLABLE HOO", 42355); - _unicodeCharacterMap.Add("VAI SYLLABLE WOO", 42356); - _unicodeCharacterMap.Add("VAI SYLLABLE WOON", 42357); - _unicodeCharacterMap.Add("VAI SYLLABLE POO", 42358); - _unicodeCharacterMap.Add("VAI SYLLABLE BHOO", 42359); - _unicodeCharacterMap.Add("VAI SYLLABLE BOO", 42360); - _unicodeCharacterMap.Add("VAI SYLLABLE MBOO", 42361); - _unicodeCharacterMap.Add("VAI SYLLABLE KPOO", 42362); - _unicodeCharacterMap.Add("VAI SYLLABLE MGBOO", 42363); - _unicodeCharacterMap.Add("VAI SYLLABLE GBOO", 42364); - _unicodeCharacterMap.Add("VAI SYLLABLE FOO", 42365); - _unicodeCharacterMap.Add("VAI SYLLABLE VOO", 42366); - _unicodeCharacterMap.Add("VAI SYLLABLE TOO", 42367); - _unicodeCharacterMap.Add("VAI SYLLABLE THOO", 42368); - _unicodeCharacterMap.Add("VAI SYLLABLE DHOO", 42369); - _unicodeCharacterMap.Add("VAI SYLLABLE DHHOO", 42370); - _unicodeCharacterMap.Add("VAI SYLLABLE LOO", 42371); - _unicodeCharacterMap.Add("VAI SYLLABLE ROO", 42372); - _unicodeCharacterMap.Add("VAI SYLLABLE DOO", 42373); - _unicodeCharacterMap.Add("VAI SYLLABLE NDOO", 42374); - _unicodeCharacterMap.Add("VAI SYLLABLE SOO", 42375); - _unicodeCharacterMap.Add("VAI SYLLABLE SHOO", 42376); - _unicodeCharacterMap.Add("VAI SYLLABLE ZOO", 42377); - _unicodeCharacterMap.Add("VAI SYLLABLE ZHOO", 42378); - _unicodeCharacterMap.Add("VAI SYLLABLE COO", 42379); - _unicodeCharacterMap.Add("VAI SYLLABLE JOO", 42380); - _unicodeCharacterMap.Add("VAI SYLLABLE NJOO", 42381); - _unicodeCharacterMap.Add("VAI SYLLABLE YOO", 42382); - _unicodeCharacterMap.Add("VAI SYLLABLE KOO", 42383); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGOO", 42384); - _unicodeCharacterMap.Add("VAI SYLLABLE GOO", 42385); - _unicodeCharacterMap.Add("VAI SYLLABLE MOO", 42386); - _unicodeCharacterMap.Add("VAI SYLLABLE NOO", 42387); - _unicodeCharacterMap.Add("VAI SYLLABLE NYOO", 42388); - _unicodeCharacterMap.Add("VAI SYLLABLE U", 42389); - _unicodeCharacterMap.Add("VAI SYLLABLE UN", 42390); - _unicodeCharacterMap.Add("VAI SYLLABLE HU", 42391); - _unicodeCharacterMap.Add("VAI SYLLABLE HUN", 42392); - _unicodeCharacterMap.Add("VAI SYLLABLE WU", 42393); - _unicodeCharacterMap.Add("VAI SYLLABLE WUN", 42394); - _unicodeCharacterMap.Add("VAI SYLLABLE PU", 42395); - _unicodeCharacterMap.Add("VAI SYLLABLE BHU", 42396); - _unicodeCharacterMap.Add("VAI SYLLABLE BU", 42397); - _unicodeCharacterMap.Add("VAI SYLLABLE MBU", 42398); - _unicodeCharacterMap.Add("VAI SYLLABLE KPU", 42399); - _unicodeCharacterMap.Add("VAI SYLLABLE MGBU", 42400); - _unicodeCharacterMap.Add("VAI SYLLABLE GBU", 42401); - _unicodeCharacterMap.Add("VAI SYLLABLE FU", 42402); - _unicodeCharacterMap.Add("VAI SYLLABLE VU", 42403); - _unicodeCharacterMap.Add("VAI SYLLABLE TU", 42404); - _unicodeCharacterMap.Add("VAI SYLLABLE THU", 42405); - _unicodeCharacterMap.Add("VAI SYLLABLE DHU", 42406); - _unicodeCharacterMap.Add("VAI SYLLABLE DHHU", 42407); - _unicodeCharacterMap.Add("VAI SYLLABLE LU", 42408); - _unicodeCharacterMap.Add("VAI SYLLABLE RU", 42409); - _unicodeCharacterMap.Add("VAI SYLLABLE DU", 42410); - _unicodeCharacterMap.Add("VAI SYLLABLE NDU", 42411); - _unicodeCharacterMap.Add("VAI SYLLABLE SU", 42412); - _unicodeCharacterMap.Add("VAI SYLLABLE SHU", 42413); - _unicodeCharacterMap.Add("VAI SYLLABLE ZU", 42414); - _unicodeCharacterMap.Add("VAI SYLLABLE ZHU", 42415); - _unicodeCharacterMap.Add("VAI SYLLABLE CU", 42416); - _unicodeCharacterMap.Add("VAI SYLLABLE JU", 42417); - _unicodeCharacterMap.Add("VAI SYLLABLE NJU", 42418); - _unicodeCharacterMap.Add("VAI SYLLABLE YU", 42419); - _unicodeCharacterMap.Add("VAI SYLLABLE KU", 42420); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGU", 42421); - _unicodeCharacterMap.Add("VAI SYLLABLE GU", 42422); - _unicodeCharacterMap.Add("VAI SYLLABLE MU", 42423); - _unicodeCharacterMap.Add("VAI SYLLABLE NU", 42424); - _unicodeCharacterMap.Add("VAI SYLLABLE NYU", 42425); - _unicodeCharacterMap.Add("VAI SYLLABLE O", 42426); - _unicodeCharacterMap.Add("VAI SYLLABLE ON", 42427); - _unicodeCharacterMap.Add("VAI SYLLABLE NGON", 42428); - _unicodeCharacterMap.Add("VAI SYLLABLE HO", 42429); - _unicodeCharacterMap.Add("VAI SYLLABLE HON", 42430); - _unicodeCharacterMap.Add("VAI SYLLABLE WO", 42431); - _unicodeCharacterMap.Add("VAI SYLLABLE WON", 42432); - _unicodeCharacterMap.Add("VAI SYLLABLE PO", 42433); - _unicodeCharacterMap.Add("VAI SYLLABLE BHO", 42434); - _unicodeCharacterMap.Add("VAI SYLLABLE BO", 42435); - _unicodeCharacterMap.Add("VAI SYLLABLE MBO", 42436); - _unicodeCharacterMap.Add("VAI SYLLABLE KPO", 42437); - _unicodeCharacterMap.Add("VAI SYLLABLE MGBO", 42438); - _unicodeCharacterMap.Add("VAI SYLLABLE GBO", 42439); - _unicodeCharacterMap.Add("VAI SYLLABLE GBON", 42440); - _unicodeCharacterMap.Add("VAI SYLLABLE FO", 42441); - _unicodeCharacterMap.Add("VAI SYLLABLE VO", 42442); - _unicodeCharacterMap.Add("VAI SYLLABLE TO", 42443); - _unicodeCharacterMap.Add("VAI SYLLABLE THO", 42444); - _unicodeCharacterMap.Add("VAI SYLLABLE DHO", 42445); - _unicodeCharacterMap.Add("VAI SYLLABLE DHHO", 42446); - _unicodeCharacterMap.Add("VAI SYLLABLE LO", 42447); - _unicodeCharacterMap.Add("VAI SYLLABLE RO", 42448); - _unicodeCharacterMap.Add("VAI SYLLABLE DO", 42449); - _unicodeCharacterMap.Add("VAI SYLLABLE NDO", 42450); - _unicodeCharacterMap.Add("VAI SYLLABLE SO", 42451); - _unicodeCharacterMap.Add("VAI SYLLABLE SHO", 42452); - _unicodeCharacterMap.Add("VAI SYLLABLE ZO", 42453); - _unicodeCharacterMap.Add("VAI SYLLABLE ZHO", 42454); - _unicodeCharacterMap.Add("VAI SYLLABLE CO", 42455); - _unicodeCharacterMap.Add("VAI SYLLABLE JO", 42456); - _unicodeCharacterMap.Add("VAI SYLLABLE NJO", 42457); - _unicodeCharacterMap.Add("VAI SYLLABLE YO", 42458); - _unicodeCharacterMap.Add("VAI SYLLABLE KO", 42459); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGO", 42460); - _unicodeCharacterMap.Add("VAI SYLLABLE GO", 42461); - _unicodeCharacterMap.Add("VAI SYLLABLE MO", 42462); - _unicodeCharacterMap.Add("VAI SYLLABLE NO", 42463); - _unicodeCharacterMap.Add("VAI SYLLABLE NYO", 42464); - _unicodeCharacterMap.Add("VAI SYLLABLE E", 42465); - _unicodeCharacterMap.Add("VAI SYLLABLE EN", 42466); - _unicodeCharacterMap.Add("VAI SYLLABLE NGEN", 42467); - _unicodeCharacterMap.Add("VAI SYLLABLE HE", 42468); - _unicodeCharacterMap.Add("VAI SYLLABLE HEN", 42469); - _unicodeCharacterMap.Add("VAI SYLLABLE WE", 42470); - _unicodeCharacterMap.Add("VAI SYLLABLE WEN", 42471); - _unicodeCharacterMap.Add("VAI SYLLABLE PE", 42472); - _unicodeCharacterMap.Add("VAI SYLLABLE BHE", 42473); - _unicodeCharacterMap.Add("VAI SYLLABLE BE", 42474); - _unicodeCharacterMap.Add("VAI SYLLABLE MBE", 42475); - _unicodeCharacterMap.Add("VAI SYLLABLE KPE", 42476); - _unicodeCharacterMap.Add("VAI SYLLABLE KPEN", 42477); - _unicodeCharacterMap.Add("VAI SYLLABLE MGBE", 42478); - _unicodeCharacterMap.Add("VAI SYLLABLE GBE", 42479); - _unicodeCharacterMap.Add("VAI SYLLABLE GBEN", 42480); - _unicodeCharacterMap.Add("VAI SYLLABLE FE", 42481); - _unicodeCharacterMap.Add("VAI SYLLABLE VE", 42482); - _unicodeCharacterMap.Add("VAI SYLLABLE TE", 42483); - _unicodeCharacterMap.Add("VAI SYLLABLE THE", 42484); - _unicodeCharacterMap.Add("VAI SYLLABLE DHE", 42485); - _unicodeCharacterMap.Add("VAI SYLLABLE DHHE", 42486); - _unicodeCharacterMap.Add("VAI SYLLABLE LE", 42487); - _unicodeCharacterMap.Add("VAI SYLLABLE RE", 42488); - _unicodeCharacterMap.Add("VAI SYLLABLE DE", 42489); - _unicodeCharacterMap.Add("VAI SYLLABLE NDE", 42490); - _unicodeCharacterMap.Add("VAI SYLLABLE SE", 42491); - _unicodeCharacterMap.Add("VAI SYLLABLE SHE", 42492); - _unicodeCharacterMap.Add("VAI SYLLABLE ZE", 42493); - _unicodeCharacterMap.Add("VAI SYLLABLE ZHE", 42494); - _unicodeCharacterMap.Add("VAI SYLLABLE CE", 42495); - _unicodeCharacterMap.Add("VAI SYLLABLE JE", 42496); - _unicodeCharacterMap.Add("VAI SYLLABLE NJE", 42497); - _unicodeCharacterMap.Add("VAI SYLLABLE YE", 42498); - _unicodeCharacterMap.Add("VAI SYLLABLE KE", 42499); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGE", 42500); - _unicodeCharacterMap.Add("VAI SYLLABLE NGGEN", 42501); - _unicodeCharacterMap.Add("VAI SYLLABLE GE", 42502); - _unicodeCharacterMap.Add("VAI SYLLABLE GEN", 42503); - _unicodeCharacterMap.Add("VAI SYLLABLE ME", 42504); - _unicodeCharacterMap.Add("VAI SYLLABLE NE", 42505); - _unicodeCharacterMap.Add("VAI SYLLABLE NYE", 42506); - _unicodeCharacterMap.Add("VAI SYLLABLE NG", 42507); - _unicodeCharacterMap.Add("VAI SYLLABLE LENGTHENER", 42508); - _unicodeCharacterMap.Add("VAI COMMA", 42509); - _unicodeCharacterMap.Add("VAI FULL STOP", 42510); - _unicodeCharacterMap.Add("VAI QUESTION MARK", 42511); - _unicodeCharacterMap.Add("VAI SYLLABLE NDOLE FA", 42512); - _unicodeCharacterMap.Add("VAI SYLLABLE NDOLE KA", 42513); - _unicodeCharacterMap.Add("VAI SYLLABLE NDOLE SOO", 42514); - _unicodeCharacterMap.Add("VAI SYMBOL FEENG", 42515); - _unicodeCharacterMap.Add("VAI SYMBOL KEENG", 42516); - _unicodeCharacterMap.Add("VAI SYMBOL TING", 42517); - _unicodeCharacterMap.Add("VAI SYMBOL NII", 42518); - _unicodeCharacterMap.Add("VAI SYMBOL BANG", 42519); - _unicodeCharacterMap.Add("VAI SYMBOL FAA", 42520); - _unicodeCharacterMap.Add("VAI SYMBOL TAA", 42521); - _unicodeCharacterMap.Add("VAI SYMBOL DANG", 42522); - _unicodeCharacterMap.Add("VAI SYMBOL DOONG", 42523); - _unicodeCharacterMap.Add("VAI SYMBOL KUNG", 42524); - _unicodeCharacterMap.Add("VAI SYMBOL TONG", 42525); - _unicodeCharacterMap.Add("VAI SYMBOL DO O", 42526); - _unicodeCharacterMap.Add("VAI SYMBOL JONG", 42527); - _unicodeCharacterMap.Add("VAI DIGIT ZERO", 42528); - _unicodeCharacterMap.Add("VAI DIGIT ONE", 42529); - _unicodeCharacterMap.Add("VAI DIGIT TWO", 42530); - _unicodeCharacterMap.Add("VAI DIGIT THREE", 42531); - _unicodeCharacterMap.Add("VAI DIGIT FOUR", 42532); - _unicodeCharacterMap.Add("VAI DIGIT FIVE", 42533); - _unicodeCharacterMap.Add("VAI DIGIT SIX", 42534); - _unicodeCharacterMap.Add("VAI DIGIT SEVEN", 42535); - _unicodeCharacterMap.Add("VAI DIGIT EIGHT", 42536); - _unicodeCharacterMap.Add("VAI DIGIT NINE", 42537); - _unicodeCharacterMap.Add("VAI SYLLABLE NDOLE MA", 42538); - _unicodeCharacterMap.Add("VAI SYLLABLE NDOLE DO", 42539); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZEMLYA", 42560); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZEMLYA", 42561); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DZELO", 42562); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DZELO", 42563); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER REVERSED DZE", 42564); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER REVERSED DZE", 42565); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IOTA", 42566); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IOTA", 42567); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DJERV", 42568); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DJERV", 42569); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER MONOGRAPH UK", 42570); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER MONOGRAPH UK", 42571); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BROAD OMEGA", 42572); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BROAD OMEGA", 42573); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER NEUTRAL YER", 42574); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER NEUTRAL YER", 42575); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YERU WITH BACK YER", 42576); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YERU WITH BACK YER", 42577); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IOTIFIED YAT", 42578); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IOTIFIED YAT", 42579); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER REVERSED YU", 42580); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER REVERSED YU", 42581); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IOTIFIED A", 42582); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IOTIFIED A", 42583); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS", 42584); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER CLOSED LITTLE YUS", 42585); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BLENDED YUS", 42586); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BLENDED YUS", 42587); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS", 42588); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS", 42589); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER YN", 42590); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER YN", 42591); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER REVERSED TSE", 42592); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER REVERSED TSE", 42593); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SOFT DE", 42594); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SOFT DE", 42595); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SOFT EL", 42596); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SOFT EL", 42597); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SOFT EM", 42598); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SOFT EM", 42599); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER MONOCULAR O", 42600); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER MONOCULAR O", 42601); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER BINOCULAR O", 42602); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER BINOCULAR O", 42603); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O", 42604); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DOUBLE MONOCULAR O", 42605); - _unicodeCharacterMap.Add("CYRILLIC LETTER MULTIOCULAR O", 42606); - _unicodeCharacterMap.Add("COMBINING CYRILLIC VZMET", 42607); - _unicodeCharacterMap.Add("COMBINING CYRILLIC TEN MILLIONS SIGN", 42608); - _unicodeCharacterMap.Add("COMBINING CYRILLIC HUNDRED MILLIONS SIGN", 42609); - _unicodeCharacterMap.Add("COMBINING CYRILLIC THOUSAND MILLIONS SIGN", 42610); - _unicodeCharacterMap.Add("SLAVONIC ASTERISK", 42611); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER UKRAINIAN IE", 42612); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER I", 42613); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER YI", 42614); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER U", 42615); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER HARD SIGN", 42616); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER YERU", 42617); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER SOFT SIGN", 42618); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER OMEGA", 42619); - _unicodeCharacterMap.Add("COMBINING CYRILLIC KAVYKA", 42620); - _unicodeCharacterMap.Add("COMBINING CYRILLIC PAYEROK", 42621); - _unicodeCharacterMap.Add("CYRILLIC KAVYKA", 42622); - _unicodeCharacterMap.Add("CYRILLIC PAYEROK", 42623); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DWE", 42624); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DWE", 42625); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DZWE", 42626); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DZWE", 42627); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER ZHWE", 42628); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER ZHWE", 42629); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER CCHE", 42630); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER CCHE", 42631); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DZZE", 42632); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DZZE", 42633); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK", 42634); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK", 42635); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TWE", 42636); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TWE", 42637); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TSWE", 42638); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TSWE", 42639); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TSSE", 42640); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TSSE", 42641); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER TCHE", 42642); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER TCHE", 42643); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER HWE", 42644); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER HWE", 42645); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER SHWE", 42646); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER SHWE", 42647); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER DOUBLE O", 42648); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER DOUBLE O", 42649); - _unicodeCharacterMap.Add("CYRILLIC CAPITAL LETTER CROSSED O", 42650); - _unicodeCharacterMap.Add("CYRILLIC SMALL LETTER CROSSED O", 42651); - _unicodeCharacterMap.Add("MODIFIER LETTER CYRILLIC HARD SIGN", 42652); - _unicodeCharacterMap.Add("MODIFIER LETTER CYRILLIC SOFT SIGN", 42653); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER EF", 42654); - _unicodeCharacterMap.Add("COMBINING CYRILLIC LETTER IOTIFIED E", 42655); - _unicodeCharacterMap.Add("BAMUM LETTER A", 42656); - _unicodeCharacterMap.Add("BAMUM LETTER KA", 42657); - _unicodeCharacterMap.Add("BAMUM LETTER U", 42658); - _unicodeCharacterMap.Add("BAMUM LETTER KU", 42659); - _unicodeCharacterMap.Add("BAMUM LETTER EE", 42660); - _unicodeCharacterMap.Add("BAMUM LETTER REE", 42661); - _unicodeCharacterMap.Add("BAMUM LETTER TAE", 42662); - _unicodeCharacterMap.Add("BAMUM LETTER O", 42663); - _unicodeCharacterMap.Add("BAMUM LETTER NYI", 42664); - _unicodeCharacterMap.Add("BAMUM LETTER I", 42665); - _unicodeCharacterMap.Add("BAMUM LETTER LA", 42666); - _unicodeCharacterMap.Add("BAMUM LETTER PA", 42667); - _unicodeCharacterMap.Add("BAMUM LETTER RII", 42668); - _unicodeCharacterMap.Add("BAMUM LETTER RIEE", 42669); - _unicodeCharacterMap.Add("BAMUM LETTER LEEEE", 42670); - _unicodeCharacterMap.Add("BAMUM LETTER MEEEE", 42671); - _unicodeCharacterMap.Add("BAMUM LETTER TAA", 42672); - _unicodeCharacterMap.Add("BAMUM LETTER NDAA", 42673); - _unicodeCharacterMap.Add("BAMUM LETTER NJAEM", 42674); - _unicodeCharacterMap.Add("BAMUM LETTER M", 42675); - _unicodeCharacterMap.Add("BAMUM LETTER SUU", 42676); - _unicodeCharacterMap.Add("BAMUM LETTER MU", 42677); - _unicodeCharacterMap.Add("BAMUM LETTER SHII", 42678); - _unicodeCharacterMap.Add("BAMUM LETTER SI", 42679); - _unicodeCharacterMap.Add("BAMUM LETTER SHEUX", 42680); - _unicodeCharacterMap.Add("BAMUM LETTER SEUX", 42681); - _unicodeCharacterMap.Add("BAMUM LETTER KYEE", 42682); - _unicodeCharacterMap.Add("BAMUM LETTER KET", 42683); - _unicodeCharacterMap.Add("BAMUM LETTER NUAE", 42684); - _unicodeCharacterMap.Add("BAMUM LETTER NU", 42685); - _unicodeCharacterMap.Add("BAMUM LETTER NJUAE", 42686); - _unicodeCharacterMap.Add("BAMUM LETTER YOQ", 42687); - _unicodeCharacterMap.Add("BAMUM LETTER SHU", 42688); - _unicodeCharacterMap.Add("BAMUM LETTER YUQ", 42689); - _unicodeCharacterMap.Add("BAMUM LETTER YA", 42690); - _unicodeCharacterMap.Add("BAMUM LETTER NSHA", 42691); - _unicodeCharacterMap.Add("BAMUM LETTER KEUX", 42692); - _unicodeCharacterMap.Add("BAMUM LETTER PEUX", 42693); - _unicodeCharacterMap.Add("BAMUM LETTER NJEE", 42694); - _unicodeCharacterMap.Add("BAMUM LETTER NTEE", 42695); - _unicodeCharacterMap.Add("BAMUM LETTER PUE", 42696); - _unicodeCharacterMap.Add("BAMUM LETTER WUE", 42697); - _unicodeCharacterMap.Add("BAMUM LETTER PEE", 42698); - _unicodeCharacterMap.Add("BAMUM LETTER FEE", 42699); - _unicodeCharacterMap.Add("BAMUM LETTER RU", 42700); - _unicodeCharacterMap.Add("BAMUM LETTER LU", 42701); - _unicodeCharacterMap.Add("BAMUM LETTER MI", 42702); - _unicodeCharacterMap.Add("BAMUM LETTER NI", 42703); - _unicodeCharacterMap.Add("BAMUM LETTER REUX", 42704); - _unicodeCharacterMap.Add("BAMUM LETTER RAE", 42705); - _unicodeCharacterMap.Add("BAMUM LETTER KEN", 42706); - _unicodeCharacterMap.Add("BAMUM LETTER NGKWAEN", 42707); - _unicodeCharacterMap.Add("BAMUM LETTER NGGA", 42708); - _unicodeCharacterMap.Add("BAMUM LETTER NGA", 42709); - _unicodeCharacterMap.Add("BAMUM LETTER SHO", 42710); - _unicodeCharacterMap.Add("BAMUM LETTER PUAE", 42711); - _unicodeCharacterMap.Add("BAMUM LETTER FU", 42712); - _unicodeCharacterMap.Add("BAMUM LETTER FOM", 42713); - _unicodeCharacterMap.Add("BAMUM LETTER WA", 42714); - _unicodeCharacterMap.Add("BAMUM LETTER NA", 42715); - _unicodeCharacterMap.Add("BAMUM LETTER LI", 42716); - _unicodeCharacterMap.Add("BAMUM LETTER PI", 42717); - _unicodeCharacterMap.Add("BAMUM LETTER LOQ", 42718); - _unicodeCharacterMap.Add("BAMUM LETTER KO", 42719); - _unicodeCharacterMap.Add("BAMUM LETTER MBEN", 42720); - _unicodeCharacterMap.Add("BAMUM LETTER REN", 42721); - _unicodeCharacterMap.Add("BAMUM LETTER MEN", 42722); - _unicodeCharacterMap.Add("BAMUM LETTER MA", 42723); - _unicodeCharacterMap.Add("BAMUM LETTER TI", 42724); - _unicodeCharacterMap.Add("BAMUM LETTER KI", 42725); - _unicodeCharacterMap.Add("BAMUM LETTER MO", 42726); - _unicodeCharacterMap.Add("BAMUM LETTER MBAA", 42727); - _unicodeCharacterMap.Add("BAMUM LETTER TET", 42728); - _unicodeCharacterMap.Add("BAMUM LETTER KPA", 42729); - _unicodeCharacterMap.Add("BAMUM LETTER TEN", 42730); - _unicodeCharacterMap.Add("BAMUM LETTER NTUU", 42731); - _unicodeCharacterMap.Add("BAMUM LETTER SAMBA", 42732); - _unicodeCharacterMap.Add("BAMUM LETTER FAAMAE", 42733); - _unicodeCharacterMap.Add("BAMUM LETTER KOVUU", 42734); - _unicodeCharacterMap.Add("BAMUM LETTER KOGHOM", 42735); - _unicodeCharacterMap.Add("BAMUM COMBINING MARK KOQNDON", 42736); - _unicodeCharacterMap.Add("BAMUM COMBINING MARK TUKWENTIS", 42737); - _unicodeCharacterMap.Add("BAMUM NJAEMLI", 42738); - _unicodeCharacterMap.Add("BAMUM FULL STOP", 42739); - _unicodeCharacterMap.Add("BAMUM COLON", 42740); - _unicodeCharacterMap.Add("BAMUM COMMA", 42741); - _unicodeCharacterMap.Add("BAMUM SEMICOLON", 42742); - _unicodeCharacterMap.Add("BAMUM QUESTION MARK", 42743); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YIN PING", 42752); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YANG PING", 42753); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YIN SHANG", 42754); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YANG SHANG", 42755); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YIN QU", 42756); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YANG QU", 42757); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YIN RU", 42758); - _unicodeCharacterMap.Add("MODIFIER LETTER CHINESE TONE YANG RU", 42759); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA HIGH DOTTED TONE BAR", 42760); - _unicodeCharacterMap.Add("MODIFIER LETTER HIGH DOTTED TONE BAR", 42761); - _unicodeCharacterMap.Add("MODIFIER LETTER MID DOTTED TONE BAR", 42762); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW DOTTED TONE BAR", 42763); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA LOW DOTTED TONE BAR", 42764); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA HIGH DOTTED LEFT STEM TONE BAR", 42765); - _unicodeCharacterMap.Add("MODIFIER LETTER HIGH DOTTED LEFT STEM TONE BAR", 42766); - _unicodeCharacterMap.Add("MODIFIER LETTER MID DOTTED LEFT STEM TONE BAR", 42767); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW DOTTED LEFT STEM TONE BAR", 42768); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA LOW DOTTED LEFT STEM TONE BAR", 42769); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA HIGH LEFT STEM TONE BAR", 42770); - _unicodeCharacterMap.Add("MODIFIER LETTER HIGH LEFT STEM TONE BAR", 42771); - _unicodeCharacterMap.Add("MODIFIER LETTER MID LEFT STEM TONE BAR", 42772); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW LEFT STEM TONE BAR", 42773); - _unicodeCharacterMap.Add("MODIFIER LETTER EXTRA LOW LEFT STEM TONE BAR", 42774); - _unicodeCharacterMap.Add("MODIFIER LETTER DOT VERTICAL BAR", 42775); - _unicodeCharacterMap.Add("MODIFIER LETTER DOT SLASH", 42776); - _unicodeCharacterMap.Add("MODIFIER LETTER DOT HORIZONTAL BAR", 42777); - _unicodeCharacterMap.Add("MODIFIER LETTER LOWER RIGHT CORNER ANGLE", 42778); - _unicodeCharacterMap.Add("MODIFIER LETTER RAISED UP ARROW", 42779); - _unicodeCharacterMap.Add("MODIFIER LETTER RAISED DOWN ARROW", 42780); - _unicodeCharacterMap.Add("MODIFIER LETTER RAISED EXCLAMATION MARK", 42781); - _unicodeCharacterMap.Add("MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK", 42782); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW INVERTED EXCLAMATION MARK", 42783); - _unicodeCharacterMap.Add("MODIFIER LETTER STRESS AND HIGH TONE", 42784); - _unicodeCharacterMap.Add("MODIFIER LETTER STRESS AND LOW TONE", 42785); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF", 42786); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EGYPTOLOGICAL ALEF", 42787); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER EGYPTOLOGICAL AIN", 42788); - _unicodeCharacterMap.Add("LATIN SMALL LETTER EGYPTOLOGICAL AIN", 42789); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER HENG", 42790); - _unicodeCharacterMap.Add("LATIN SMALL LETTER HENG", 42791); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TZ", 42792); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TZ", 42793); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TRESILLO", 42794); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TRESILLO", 42795); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER CUATRILLO", 42796); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CUATRILLO", 42797); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER CUATRILLO WITH COMMA", 42798); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CUATRILLO WITH COMMA", 42799); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL F", 42800); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL S", 42801); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AA", 42802); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AA", 42803); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AO", 42804); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AO", 42805); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AU", 42806); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AU", 42807); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AV", 42808); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AV", 42809); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR", 42810); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AV WITH HORIZONTAL BAR", 42811); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER AY", 42812); - _unicodeCharacterMap.Add("LATIN SMALL LETTER AY", 42813); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER REVERSED C WITH DOT", 42814); - _unicodeCharacterMap.Add("LATIN SMALL LETTER REVERSED C WITH DOT", 42815); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH STROKE", 42816); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH STROKE", 42817); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH DIAGONAL STROKE", 42818); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH DIAGONAL STROKE", 42819); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE", 42820); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE", 42821); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER BROKEN L", 42822); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BROKEN L", 42823); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH HIGH STROKE", 42824); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH HIGH STROKE", 42825); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY", 42826); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH LONG STROKE OVERLAY", 42827); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER O WITH LOOP", 42828); - _unicodeCharacterMap.Add("LATIN SMALL LETTER O WITH LOOP", 42829); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER OO", 42830); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OO", 42831); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER", 42832); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER", 42833); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P WITH FLOURISH", 42834); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH FLOURISH", 42835); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER P WITH SQUIRREL TAIL", 42836); - _unicodeCharacterMap.Add("LATIN SMALL LETTER P WITH SQUIRREL TAIL", 42837); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER", 42838); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER", 42839); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE", 42840); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Q WITH DIAGONAL STROKE", 42841); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R ROTUNDA", 42842); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R ROTUNDA", 42843); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER RUM ROTUNDA", 42844); - _unicodeCharacterMap.Add("LATIN SMALL LETTER RUM ROTUNDA", 42845); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER V WITH DIAGONAL STROKE", 42846); - _unicodeCharacterMap.Add("LATIN SMALL LETTER V WITH DIAGONAL STROKE", 42847); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER VY", 42848); - _unicodeCharacterMap.Add("LATIN SMALL LETTER VY", 42849); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER VISIGOTHIC Z", 42850); - _unicodeCharacterMap.Add("LATIN SMALL LETTER VISIGOTHIC Z", 42851); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER THORN WITH STROKE", 42852); - _unicodeCharacterMap.Add("LATIN SMALL LETTER THORN WITH STROKE", 42853); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER", 42854); - _unicodeCharacterMap.Add("LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER", 42855); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER VEND", 42856); - _unicodeCharacterMap.Add("LATIN SMALL LETTER VEND", 42857); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER ET", 42858); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ET", 42859); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER IS", 42860); - _unicodeCharacterMap.Add("LATIN SMALL LETTER IS", 42861); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER CON", 42862); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CON", 42863); - _unicodeCharacterMap.Add("MODIFIER LETTER US", 42864); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DUM", 42865); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LUM", 42866); - _unicodeCharacterMap.Add("LATIN SMALL LETTER MUM", 42867); - _unicodeCharacterMap.Add("LATIN SMALL LETTER NUM", 42868); - _unicodeCharacterMap.Add("LATIN SMALL LETTER RUM", 42869); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL RUM", 42870); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TUM", 42871); - _unicodeCharacterMap.Add("LATIN SMALL LETTER UM", 42872); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER INSULAR D", 42873); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INSULAR D", 42874); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER INSULAR F", 42875); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INSULAR F", 42876); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER INSULAR G", 42877); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED INSULAR G", 42878); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED INSULAR G", 42879); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED L", 42880); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED L", 42881); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER INSULAR R", 42882); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INSULAR R", 42883); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER INSULAR S", 42884); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INSULAR S", 42885); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER INSULAR T", 42886); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INSULAR T", 42887); - _unicodeCharacterMap.Add("MODIFIER LETTER LOW CIRCUMFLEX ACCENT", 42888); - _unicodeCharacterMap.Add("MODIFIER LETTER COLON", 42889); - _unicodeCharacterMap.Add("MODIFIER LETTER SHORT EQUALS SIGN", 42890); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER SALTILLO", 42891); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SALTILLO", 42892); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED H", 42893); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT", 42894); - _unicodeCharacterMap.Add("LATIN LETTER SINOLOGICAL DOT", 42895); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH DESCENDER", 42896); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH DESCENDER", 42897); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER C WITH BAR", 42898); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH BAR", 42899); - _unicodeCharacterMap.Add("LATIN SMALL LETTER C WITH PALATAL HOOK", 42900); - _unicodeCharacterMap.Add("LATIN SMALL LETTER H WITH PALATAL HOOK", 42901); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER B WITH FLOURISH", 42902); - _unicodeCharacterMap.Add("LATIN SMALL LETTER B WITH FLOURISH", 42903); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER F WITH STROKE", 42904); - _unicodeCharacterMap.Add("LATIN SMALL LETTER F WITH STROKE", 42905); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER VOLAPUK AE", 42906); - _unicodeCharacterMap.Add("LATIN SMALL LETTER VOLAPUK AE", 42907); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER VOLAPUK OE", 42908); - _unicodeCharacterMap.Add("LATIN SMALL LETTER VOLAPUK OE", 42909); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER VOLAPUK UE", 42910); - _unicodeCharacterMap.Add("LATIN SMALL LETTER VOLAPUK UE", 42911); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER G WITH OBLIQUE STROKE", 42912); - _unicodeCharacterMap.Add("LATIN SMALL LETTER G WITH OBLIQUE STROKE", 42913); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER K WITH OBLIQUE STROKE", 42914); - _unicodeCharacterMap.Add("LATIN SMALL LETTER K WITH OBLIQUE STROKE", 42915); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER N WITH OBLIQUE STROKE", 42916); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH OBLIQUE STROKE", 42917); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER R WITH OBLIQUE STROKE", 42918); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH OBLIQUE STROKE", 42919); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER S WITH OBLIQUE STROKE", 42920); - _unicodeCharacterMap.Add("LATIN SMALL LETTER S WITH OBLIQUE STROKE", 42921); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER H WITH HOOK", 42922); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER REVERSED OPEN E", 42923); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER SCRIPT G", 42924); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER L WITH BELT", 42925); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER SMALL CAPITAL I", 42926); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED K", 42928); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER TURNED T", 42929); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER J WITH CROSSED TAIL", 42930); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER CHI", 42931); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER BETA", 42932); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BETA", 42933); - _unicodeCharacterMap.Add("LATIN CAPITAL LETTER OMEGA", 42934); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OMEGA", 42935); - _unicodeCharacterMap.Add("LATIN EPIGRAPHIC LETTER SIDEWAYS I", 42999); - _unicodeCharacterMap.Add("MODIFIER LETTER CAPITAL H WITH STROKE", 43000); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL LIGATURE OE", 43001); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL TURNED M", 43002); - _unicodeCharacterMap.Add("LATIN EPIGRAPHIC LETTER REVERSED F", 43003); - _unicodeCharacterMap.Add("LATIN EPIGRAPHIC LETTER REVERSED P", 43004); - _unicodeCharacterMap.Add("LATIN EPIGRAPHIC LETTER INVERTED M", 43005); - _unicodeCharacterMap.Add("LATIN EPIGRAPHIC LETTER I LONGA", 43006); - _unicodeCharacterMap.Add("LATIN EPIGRAPHIC LETTER ARCHAIC M", 43007); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER A", 43008); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER I", 43009); - _unicodeCharacterMap.Add("SYLOTI NAGRI SIGN DVISVARA", 43010); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER U", 43011); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER E", 43012); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER O", 43013); - _unicodeCharacterMap.Add("SYLOTI NAGRI SIGN HASANTA", 43014); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER KO", 43015); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER KHO", 43016); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER GO", 43017); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER GHO", 43018); - _unicodeCharacterMap.Add("SYLOTI NAGRI SIGN ANUSVARA", 43019); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER CO", 43020); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER CHO", 43021); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER JO", 43022); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER JHO", 43023); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER TTO", 43024); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER TTHO", 43025); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER DDO", 43026); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER DDHO", 43027); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER TO", 43028); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER THO", 43029); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER DO", 43030); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER DHO", 43031); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER NO", 43032); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER PO", 43033); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER PHO", 43034); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER BO", 43035); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER BHO", 43036); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER MO", 43037); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER RO", 43038); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER LO", 43039); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER RRO", 43040); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER SO", 43041); - _unicodeCharacterMap.Add("SYLOTI NAGRI LETTER HO", 43042); - _unicodeCharacterMap.Add("SYLOTI NAGRI VOWEL SIGN A", 43043); - _unicodeCharacterMap.Add("SYLOTI NAGRI VOWEL SIGN I", 43044); - _unicodeCharacterMap.Add("SYLOTI NAGRI VOWEL SIGN U", 43045); - _unicodeCharacterMap.Add("SYLOTI NAGRI VOWEL SIGN E", 43046); - _unicodeCharacterMap.Add("SYLOTI NAGRI VOWEL SIGN OO", 43047); - _unicodeCharacterMap.Add("SYLOTI NAGRI POETRY MARK 1", 43048); - _unicodeCharacterMap.Add("SYLOTI NAGRI POETRY MARK 2", 43049); - _unicodeCharacterMap.Add("SYLOTI NAGRI POETRY MARK 3", 43050); - _unicodeCharacterMap.Add("SYLOTI NAGRI POETRY MARK 4", 43051); - _unicodeCharacterMap.Add("NORTH INDIC FRACTION ONE QUARTER", 43056); - _unicodeCharacterMap.Add("NORTH INDIC FRACTION ONE HALF", 43057); - _unicodeCharacterMap.Add("NORTH INDIC FRACTION THREE QUARTERS", 43058); - _unicodeCharacterMap.Add("NORTH INDIC FRACTION ONE SIXTEENTH", 43059); - _unicodeCharacterMap.Add("NORTH INDIC FRACTION ONE EIGHTH", 43060); - _unicodeCharacterMap.Add("NORTH INDIC FRACTION THREE SIXTEENTHS", 43061); - _unicodeCharacterMap.Add("NORTH INDIC QUARTER MARK", 43062); - _unicodeCharacterMap.Add("NORTH INDIC PLACEHOLDER MARK", 43063); - _unicodeCharacterMap.Add("NORTH INDIC RUPEE MARK", 43064); - _unicodeCharacterMap.Add("NORTH INDIC QUANTITY MARK", 43065); - _unicodeCharacterMap.Add("PHAGS PA LETTER KA", 43072); - _unicodeCharacterMap.Add("PHAGS PA LETTER KHA", 43073); - _unicodeCharacterMap.Add("PHAGS PA LETTER GA", 43074); - _unicodeCharacterMap.Add("PHAGS PA LETTER NGA", 43075); - _unicodeCharacterMap.Add("PHAGS PA LETTER CA", 43076); - _unicodeCharacterMap.Add("PHAGS PA LETTER CHA", 43077); - _unicodeCharacterMap.Add("PHAGS PA LETTER JA", 43078); - _unicodeCharacterMap.Add("PHAGS PA LETTER NYA", 43079); - _unicodeCharacterMap.Add("PHAGS PA LETTER TA", 43080); - _unicodeCharacterMap.Add("PHAGS PA LETTER THA", 43081); - _unicodeCharacterMap.Add("PHAGS PA LETTER DA", 43082); - _unicodeCharacterMap.Add("PHAGS PA LETTER NA", 43083); - _unicodeCharacterMap.Add("PHAGS PA LETTER PA", 43084); - _unicodeCharacterMap.Add("PHAGS PA LETTER PHA", 43085); - _unicodeCharacterMap.Add("PHAGS PA LETTER BA", 43086); - _unicodeCharacterMap.Add("PHAGS PA LETTER MA", 43087); - _unicodeCharacterMap.Add("PHAGS PA LETTER TSA", 43088); - _unicodeCharacterMap.Add("PHAGS PA LETTER TSHA", 43089); - _unicodeCharacterMap.Add("PHAGS PA LETTER DZA", 43090); - _unicodeCharacterMap.Add("PHAGS PA LETTER WA", 43091); - _unicodeCharacterMap.Add("PHAGS PA LETTER ZHA", 43092); - _unicodeCharacterMap.Add("PHAGS PA LETTER ZA", 43093); - _unicodeCharacterMap.Add("PHAGS PA LETTER SMALL A", 43094); - _unicodeCharacterMap.Add("PHAGS PA LETTER YA", 43095); - _unicodeCharacterMap.Add("PHAGS PA LETTER RA", 43096); - _unicodeCharacterMap.Add("PHAGS PA LETTER LA", 43097); - _unicodeCharacterMap.Add("PHAGS PA LETTER SHA", 43098); - _unicodeCharacterMap.Add("PHAGS PA LETTER SA", 43099); - _unicodeCharacterMap.Add("PHAGS PA LETTER HA", 43100); - _unicodeCharacterMap.Add("PHAGS PA LETTER A", 43101); - _unicodeCharacterMap.Add("PHAGS PA LETTER I", 43102); - _unicodeCharacterMap.Add("PHAGS PA LETTER U", 43103); - _unicodeCharacterMap.Add("PHAGS PA LETTER E", 43104); - _unicodeCharacterMap.Add("PHAGS PA LETTER O", 43105); - _unicodeCharacterMap.Add("PHAGS PA LETTER QA", 43106); - _unicodeCharacterMap.Add("PHAGS PA LETTER XA", 43107); - _unicodeCharacterMap.Add("PHAGS PA LETTER FA", 43108); - _unicodeCharacterMap.Add("PHAGS PA LETTER GGA", 43109); - _unicodeCharacterMap.Add("PHAGS PA LETTER EE", 43110); - _unicodeCharacterMap.Add("PHAGS PA SUBJOINED LETTER WA", 43111); - _unicodeCharacterMap.Add("PHAGS PA SUBJOINED LETTER YA", 43112); - _unicodeCharacterMap.Add("PHAGS PA LETTER TTA", 43113); - _unicodeCharacterMap.Add("PHAGS PA LETTER TTHA", 43114); - _unicodeCharacterMap.Add("PHAGS PA LETTER DDA", 43115); - _unicodeCharacterMap.Add("PHAGS PA LETTER NNA", 43116); - _unicodeCharacterMap.Add("PHAGS PA LETTER ALTERNATE YA", 43117); - _unicodeCharacterMap.Add("PHAGS PA LETTER VOICELESS SHA", 43118); - _unicodeCharacterMap.Add("PHAGS PA LETTER VOICED HA", 43119); - _unicodeCharacterMap.Add("PHAGS PA LETTER ASPIRATED FA", 43120); - _unicodeCharacterMap.Add("PHAGS PA SUBJOINED LETTER RA", 43121); - _unicodeCharacterMap.Add("PHAGS PA SUPERFIXED LETTER RA", 43122); - _unicodeCharacterMap.Add("PHAGS PA LETTER CANDRABINDU", 43123); - _unicodeCharacterMap.Add("PHAGS PA SINGLE HEAD MARK", 43124); - _unicodeCharacterMap.Add("PHAGS PA DOUBLE HEAD MARK", 43125); - _unicodeCharacterMap.Add("PHAGS PA MARK SHAD", 43126); - _unicodeCharacterMap.Add("PHAGS PA MARK DOUBLE SHAD", 43127); - _unicodeCharacterMap.Add("SAURASHTRA SIGN ANUSVARA", 43136); - _unicodeCharacterMap.Add("SAURASHTRA SIGN VISARGA", 43137); - _unicodeCharacterMap.Add("SAURASHTRA LETTER A", 43138); - _unicodeCharacterMap.Add("SAURASHTRA LETTER AA", 43139); - _unicodeCharacterMap.Add("SAURASHTRA LETTER I", 43140); - _unicodeCharacterMap.Add("SAURASHTRA LETTER II", 43141); - _unicodeCharacterMap.Add("SAURASHTRA LETTER U", 43142); - _unicodeCharacterMap.Add("SAURASHTRA LETTER UU", 43143); - _unicodeCharacterMap.Add("SAURASHTRA LETTER VOCALIC R", 43144); - _unicodeCharacterMap.Add("SAURASHTRA LETTER VOCALIC RR", 43145); - _unicodeCharacterMap.Add("SAURASHTRA LETTER VOCALIC L", 43146); - _unicodeCharacterMap.Add("SAURASHTRA LETTER VOCALIC LL", 43147); - _unicodeCharacterMap.Add("SAURASHTRA LETTER E", 43148); - _unicodeCharacterMap.Add("SAURASHTRA LETTER EE", 43149); - _unicodeCharacterMap.Add("SAURASHTRA LETTER AI", 43150); - _unicodeCharacterMap.Add("SAURASHTRA LETTER O", 43151); - _unicodeCharacterMap.Add("SAURASHTRA LETTER OO", 43152); - _unicodeCharacterMap.Add("SAURASHTRA LETTER AU", 43153); - _unicodeCharacterMap.Add("SAURASHTRA LETTER KA", 43154); - _unicodeCharacterMap.Add("SAURASHTRA LETTER KHA", 43155); - _unicodeCharacterMap.Add("SAURASHTRA LETTER GA", 43156); - _unicodeCharacterMap.Add("SAURASHTRA LETTER GHA", 43157); - _unicodeCharacterMap.Add("SAURASHTRA LETTER NGA", 43158); - _unicodeCharacterMap.Add("SAURASHTRA LETTER CA", 43159); - _unicodeCharacterMap.Add("SAURASHTRA LETTER CHA", 43160); - _unicodeCharacterMap.Add("SAURASHTRA LETTER JA", 43161); - _unicodeCharacterMap.Add("SAURASHTRA LETTER JHA", 43162); - _unicodeCharacterMap.Add("SAURASHTRA LETTER NYA", 43163); - _unicodeCharacterMap.Add("SAURASHTRA LETTER TTA", 43164); - _unicodeCharacterMap.Add("SAURASHTRA LETTER TTHA", 43165); - _unicodeCharacterMap.Add("SAURASHTRA LETTER DDA", 43166); - _unicodeCharacterMap.Add("SAURASHTRA LETTER DDHA", 43167); - _unicodeCharacterMap.Add("SAURASHTRA LETTER NNA", 43168); - _unicodeCharacterMap.Add("SAURASHTRA LETTER TA", 43169); - _unicodeCharacterMap.Add("SAURASHTRA LETTER THA", 43170); - _unicodeCharacterMap.Add("SAURASHTRA LETTER DA", 43171); - _unicodeCharacterMap.Add("SAURASHTRA LETTER DHA", 43172); - _unicodeCharacterMap.Add("SAURASHTRA LETTER NA", 43173); - _unicodeCharacterMap.Add("SAURASHTRA LETTER PA", 43174); - _unicodeCharacterMap.Add("SAURASHTRA LETTER PHA", 43175); - _unicodeCharacterMap.Add("SAURASHTRA LETTER BA", 43176); - _unicodeCharacterMap.Add("SAURASHTRA LETTER BHA", 43177); - _unicodeCharacterMap.Add("SAURASHTRA LETTER MA", 43178); - _unicodeCharacterMap.Add("SAURASHTRA LETTER YA", 43179); - _unicodeCharacterMap.Add("SAURASHTRA LETTER RA", 43180); - _unicodeCharacterMap.Add("SAURASHTRA LETTER LA", 43181); - _unicodeCharacterMap.Add("SAURASHTRA LETTER VA", 43182); - _unicodeCharacterMap.Add("SAURASHTRA LETTER SHA", 43183); - _unicodeCharacterMap.Add("SAURASHTRA LETTER SSA", 43184); - _unicodeCharacterMap.Add("SAURASHTRA LETTER SA", 43185); - _unicodeCharacterMap.Add("SAURASHTRA LETTER HA", 43186); - _unicodeCharacterMap.Add("SAURASHTRA LETTER LLA", 43187); - _unicodeCharacterMap.Add("SAURASHTRA CONSONANT SIGN HAARU", 43188); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN AA", 43189); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN I", 43190); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN II", 43191); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN U", 43192); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN UU", 43193); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN VOCALIC R", 43194); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN VOCALIC RR", 43195); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN VOCALIC L", 43196); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN VOCALIC LL", 43197); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN E", 43198); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN EE", 43199); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN AI", 43200); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN O", 43201); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN OO", 43202); - _unicodeCharacterMap.Add("SAURASHTRA VOWEL SIGN AU", 43203); - _unicodeCharacterMap.Add("SAURASHTRA SIGN VIRAMA", 43204); - _unicodeCharacterMap.Add("SAURASHTRA SIGN CANDRABINDU", 43205); - _unicodeCharacterMap.Add("SAURASHTRA DANDA", 43214); - _unicodeCharacterMap.Add("SAURASHTRA DOUBLE DANDA", 43215); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT ZERO", 43216); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT ONE", 43217); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT TWO", 43218); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT THREE", 43219); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT FOUR", 43220); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT FIVE", 43221); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT SIX", 43222); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT SEVEN", 43223); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT EIGHT", 43224); - _unicodeCharacterMap.Add("SAURASHTRA DIGIT NINE", 43225); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT ZERO", 43232); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT ONE", 43233); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT TWO", 43234); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT THREE", 43235); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT FOUR", 43236); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT FIVE", 43237); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT SIX", 43238); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT SEVEN", 43239); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT EIGHT", 43240); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI DIGIT NINE", 43241); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI LETTER A", 43242); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI LETTER U", 43243); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI LETTER KA", 43244); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI LETTER NA", 43245); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI LETTER PA", 43246); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI LETTER RA", 43247); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI LETTER VI", 43248); - _unicodeCharacterMap.Add("COMBINING DEVANAGARI SIGN AVAGRAHA", 43249); - _unicodeCharacterMap.Add("DEVANAGARI SIGN SPACING CANDRABINDU", 43250); - _unicodeCharacterMap.Add("DEVANAGARI SIGN CANDRABINDU VIRAMA", 43251); - _unicodeCharacterMap.Add("DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA", 43252); - _unicodeCharacterMap.Add("DEVANAGARI SIGN CANDRABINDU TWO", 43253); - _unicodeCharacterMap.Add("DEVANAGARI SIGN CANDRABINDU THREE", 43254); - _unicodeCharacterMap.Add("DEVANAGARI SIGN CANDRABINDU AVAGRAHA", 43255); - _unicodeCharacterMap.Add("DEVANAGARI SIGN PUSHPIKA", 43256); - _unicodeCharacterMap.Add("DEVANAGARI GAP FILLER", 43257); - _unicodeCharacterMap.Add("DEVANAGARI CARET", 43258); - _unicodeCharacterMap.Add("DEVANAGARI HEADSTROKE", 43259); - _unicodeCharacterMap.Add("DEVANAGARI SIGN SIDDHAM", 43260); - _unicodeCharacterMap.Add("DEVANAGARI JAIN OM", 43261); - _unicodeCharacterMap.Add("KAYAH LI DIGIT ZERO", 43264); - _unicodeCharacterMap.Add("KAYAH LI DIGIT ONE", 43265); - _unicodeCharacterMap.Add("KAYAH LI DIGIT TWO", 43266); - _unicodeCharacterMap.Add("KAYAH LI DIGIT THREE", 43267); - _unicodeCharacterMap.Add("KAYAH LI DIGIT FOUR", 43268); - _unicodeCharacterMap.Add("KAYAH LI DIGIT FIVE", 43269); - _unicodeCharacterMap.Add("KAYAH LI DIGIT SIX", 43270); - _unicodeCharacterMap.Add("KAYAH LI DIGIT SEVEN", 43271); - _unicodeCharacterMap.Add("KAYAH LI DIGIT EIGHT", 43272); - _unicodeCharacterMap.Add("KAYAH LI DIGIT NINE", 43273); - _unicodeCharacterMap.Add("KAYAH LI LETTER KA", 43274); - _unicodeCharacterMap.Add("KAYAH LI LETTER KHA", 43275); - _unicodeCharacterMap.Add("KAYAH LI LETTER GA", 43276); - _unicodeCharacterMap.Add("KAYAH LI LETTER NGA", 43277); - _unicodeCharacterMap.Add("KAYAH LI LETTER SA", 43278); - _unicodeCharacterMap.Add("KAYAH LI LETTER SHA", 43279); - _unicodeCharacterMap.Add("KAYAH LI LETTER ZA", 43280); - _unicodeCharacterMap.Add("KAYAH LI LETTER NYA", 43281); - _unicodeCharacterMap.Add("KAYAH LI LETTER TA", 43282); - _unicodeCharacterMap.Add("KAYAH LI LETTER HTA", 43283); - _unicodeCharacterMap.Add("KAYAH LI LETTER NA", 43284); - _unicodeCharacterMap.Add("KAYAH LI LETTER PA", 43285); - _unicodeCharacterMap.Add("KAYAH LI LETTER PHA", 43286); - _unicodeCharacterMap.Add("KAYAH LI LETTER MA", 43287); - _unicodeCharacterMap.Add("KAYAH LI LETTER DA", 43288); - _unicodeCharacterMap.Add("KAYAH LI LETTER BA", 43289); - _unicodeCharacterMap.Add("KAYAH LI LETTER RA", 43290); - _unicodeCharacterMap.Add("KAYAH LI LETTER YA", 43291); - _unicodeCharacterMap.Add("KAYAH LI LETTER LA", 43292); - _unicodeCharacterMap.Add("KAYAH LI LETTER WA", 43293); - _unicodeCharacterMap.Add("KAYAH LI LETTER THA", 43294); - _unicodeCharacterMap.Add("KAYAH LI LETTER HA", 43295); - _unicodeCharacterMap.Add("KAYAH LI LETTER VA", 43296); - _unicodeCharacterMap.Add("KAYAH LI LETTER CA", 43297); - _unicodeCharacterMap.Add("KAYAH LI LETTER A", 43298); - _unicodeCharacterMap.Add("KAYAH LI LETTER OE", 43299); - _unicodeCharacterMap.Add("KAYAH LI LETTER I", 43300); - _unicodeCharacterMap.Add("KAYAH LI LETTER OO", 43301); - _unicodeCharacterMap.Add("KAYAH LI VOWEL UE", 43302); - _unicodeCharacterMap.Add("KAYAH LI VOWEL E", 43303); - _unicodeCharacterMap.Add("KAYAH LI VOWEL U", 43304); - _unicodeCharacterMap.Add("KAYAH LI VOWEL EE", 43305); - _unicodeCharacterMap.Add("KAYAH LI VOWEL O", 43306); - _unicodeCharacterMap.Add("KAYAH LI TONE PLOPHU", 43307); - _unicodeCharacterMap.Add("KAYAH LI TONE CALYA", 43308); - _unicodeCharacterMap.Add("KAYAH LI TONE CALYA PLOPHU", 43309); - _unicodeCharacterMap.Add("KAYAH LI SIGN CWI", 43310); - _unicodeCharacterMap.Add("KAYAH LI SIGN SHYA", 43311); - _unicodeCharacterMap.Add("REJANG LETTER KA", 43312); - _unicodeCharacterMap.Add("REJANG LETTER GA", 43313); - _unicodeCharacterMap.Add("REJANG LETTER NGA", 43314); - _unicodeCharacterMap.Add("REJANG LETTER TA", 43315); - _unicodeCharacterMap.Add("REJANG LETTER DA", 43316); - _unicodeCharacterMap.Add("REJANG LETTER NA", 43317); - _unicodeCharacterMap.Add("REJANG LETTER PA", 43318); - _unicodeCharacterMap.Add("REJANG LETTER BA", 43319); - _unicodeCharacterMap.Add("REJANG LETTER MA", 43320); - _unicodeCharacterMap.Add("REJANG LETTER CA", 43321); - _unicodeCharacterMap.Add("REJANG LETTER JA", 43322); - _unicodeCharacterMap.Add("REJANG LETTER NYA", 43323); - _unicodeCharacterMap.Add("REJANG LETTER SA", 43324); - _unicodeCharacterMap.Add("REJANG LETTER RA", 43325); - _unicodeCharacterMap.Add("REJANG LETTER LA", 43326); - _unicodeCharacterMap.Add("REJANG LETTER YA", 43327); - _unicodeCharacterMap.Add("REJANG LETTER WA", 43328); - _unicodeCharacterMap.Add("REJANG LETTER HA", 43329); - _unicodeCharacterMap.Add("REJANG LETTER MBA", 43330); - _unicodeCharacterMap.Add("REJANG LETTER NGGA", 43331); - _unicodeCharacterMap.Add("REJANG LETTER NDA", 43332); - _unicodeCharacterMap.Add("REJANG LETTER NYJA", 43333); - _unicodeCharacterMap.Add("REJANG LETTER A", 43334); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN I", 43335); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN U", 43336); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN E", 43337); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN AI", 43338); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN O", 43339); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN AU", 43340); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN EU", 43341); - _unicodeCharacterMap.Add("REJANG VOWEL SIGN EA", 43342); - _unicodeCharacterMap.Add("REJANG CONSONANT SIGN NG", 43343); - _unicodeCharacterMap.Add("REJANG CONSONANT SIGN N", 43344); - _unicodeCharacterMap.Add("REJANG CONSONANT SIGN R", 43345); - _unicodeCharacterMap.Add("REJANG CONSONANT SIGN H", 43346); - _unicodeCharacterMap.Add("REJANG VIRAMA", 43347); - _unicodeCharacterMap.Add("REJANG SECTION MARK", 43359); - _unicodeCharacterMap.Add("HANGUL CHOSEONG TIKEUT MIEUM", 43360); - _unicodeCharacterMap.Add("HANGUL CHOSEONG TIKEUT PIEUP", 43361); - _unicodeCharacterMap.Add("HANGUL CHOSEONG TIKEUT SIOS", 43362); - _unicodeCharacterMap.Add("HANGUL CHOSEONG TIKEUT CIEUC", 43363); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL KIYEOK", 43364); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL SSANGKIYEOK", 43365); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL TIKEUT", 43366); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL SSANGTIKEUT", 43367); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL MIEUM", 43368); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL PIEUP", 43369); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL SSANGPIEUP", 43370); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL KAPYEOUNPIEUP", 43371); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL SIOS", 43372); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL CIEUC", 43373); - _unicodeCharacterMap.Add("HANGUL CHOSEONG RIEUL KHIEUKH", 43374); - _unicodeCharacterMap.Add("HANGUL CHOSEONG MIEUM KIYEOK", 43375); - _unicodeCharacterMap.Add("HANGUL CHOSEONG MIEUM TIKEUT", 43376); - _unicodeCharacterMap.Add("HANGUL CHOSEONG MIEUM SIOS", 43377); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP SIOS THIEUTH", 43378); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP KHIEUKH", 43379); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PIEUP HIEUH", 43380); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGSIOS PIEUP", 43381); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG RIEUL", 43382); - _unicodeCharacterMap.Add("HANGUL CHOSEONG IEUNG HIEUH", 43383); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGCIEUC HIEUH", 43384); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGTHIEUTH", 43385); - _unicodeCharacterMap.Add("HANGUL CHOSEONG PHIEUPH HIEUH", 43386); - _unicodeCharacterMap.Add("HANGUL CHOSEONG HIEUH SIOS", 43387); - _unicodeCharacterMap.Add("HANGUL CHOSEONG SSANGYEORINHIEUH", 43388); - _unicodeCharacterMap.Add("JAVANESE SIGN PANYANGGA", 43392); - _unicodeCharacterMap.Add("JAVANESE SIGN CECAK", 43393); - _unicodeCharacterMap.Add("JAVANESE SIGN LAYAR", 43394); - _unicodeCharacterMap.Add("JAVANESE SIGN WIGNYAN", 43395); - _unicodeCharacterMap.Add("JAVANESE LETTER A", 43396); - _unicodeCharacterMap.Add("JAVANESE LETTER I KAWI", 43397); - _unicodeCharacterMap.Add("JAVANESE LETTER I", 43398); - _unicodeCharacterMap.Add("JAVANESE LETTER II", 43399); - _unicodeCharacterMap.Add("JAVANESE LETTER U", 43400); - _unicodeCharacterMap.Add("JAVANESE LETTER PA CEREK", 43401); - _unicodeCharacterMap.Add("JAVANESE LETTER NGA LELET", 43402); - _unicodeCharacterMap.Add("JAVANESE LETTER NGA LELET RASWADI", 43403); - _unicodeCharacterMap.Add("JAVANESE LETTER E", 43404); - _unicodeCharacterMap.Add("JAVANESE LETTER AI", 43405); - _unicodeCharacterMap.Add("JAVANESE LETTER O", 43406); - _unicodeCharacterMap.Add("JAVANESE LETTER KA", 43407); - _unicodeCharacterMap.Add("JAVANESE LETTER KA SASAK", 43408); - _unicodeCharacterMap.Add("JAVANESE LETTER KA MURDA", 43409); - _unicodeCharacterMap.Add("JAVANESE LETTER GA", 43410); - _unicodeCharacterMap.Add("JAVANESE LETTER GA MURDA", 43411); - _unicodeCharacterMap.Add("JAVANESE LETTER NGA", 43412); - _unicodeCharacterMap.Add("JAVANESE LETTER CA", 43413); - _unicodeCharacterMap.Add("JAVANESE LETTER CA MURDA", 43414); - _unicodeCharacterMap.Add("JAVANESE LETTER JA", 43415); - _unicodeCharacterMap.Add("JAVANESE LETTER NYA MURDA", 43416); - _unicodeCharacterMap.Add("JAVANESE LETTER JA MAHAPRANA", 43417); - _unicodeCharacterMap.Add("JAVANESE LETTER NYA", 43418); - _unicodeCharacterMap.Add("JAVANESE LETTER TTA", 43419); - _unicodeCharacterMap.Add("JAVANESE LETTER TTA MAHAPRANA", 43420); - _unicodeCharacterMap.Add("JAVANESE LETTER DDA", 43421); - _unicodeCharacterMap.Add("JAVANESE LETTER DDA MAHAPRANA", 43422); - _unicodeCharacterMap.Add("JAVANESE LETTER NA MURDA", 43423); - _unicodeCharacterMap.Add("JAVANESE LETTER TA", 43424); - _unicodeCharacterMap.Add("JAVANESE LETTER TA MURDA", 43425); - _unicodeCharacterMap.Add("JAVANESE LETTER DA", 43426); - _unicodeCharacterMap.Add("JAVANESE LETTER DA MAHAPRANA", 43427); - _unicodeCharacterMap.Add("JAVANESE LETTER NA", 43428); - _unicodeCharacterMap.Add("JAVANESE LETTER PA", 43429); - _unicodeCharacterMap.Add("JAVANESE LETTER PA MURDA", 43430); - _unicodeCharacterMap.Add("JAVANESE LETTER BA", 43431); - _unicodeCharacterMap.Add("JAVANESE LETTER BA MURDA", 43432); - _unicodeCharacterMap.Add("JAVANESE LETTER MA", 43433); - _unicodeCharacterMap.Add("JAVANESE LETTER YA", 43434); - _unicodeCharacterMap.Add("JAVANESE LETTER RA", 43435); - _unicodeCharacterMap.Add("JAVANESE LETTER RA AGUNG", 43436); - _unicodeCharacterMap.Add("JAVANESE LETTER LA", 43437); - _unicodeCharacterMap.Add("JAVANESE LETTER WA", 43438); - _unicodeCharacterMap.Add("JAVANESE LETTER SA MURDA", 43439); - _unicodeCharacterMap.Add("JAVANESE LETTER SA MAHAPRANA", 43440); - _unicodeCharacterMap.Add("JAVANESE LETTER SA", 43441); - _unicodeCharacterMap.Add("JAVANESE LETTER HA", 43442); - _unicodeCharacterMap.Add("JAVANESE SIGN CECAK TELU", 43443); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN TARUNG", 43444); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN TOLONG", 43445); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN WULU", 43446); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN WULU MELIK", 43447); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN SUKU", 43448); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN SUKU MENDUT", 43449); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN TALING", 43450); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN DIRGA MURE", 43451); - _unicodeCharacterMap.Add("JAVANESE VOWEL SIGN PEPET", 43452); - _unicodeCharacterMap.Add("JAVANESE CONSONANT SIGN KERET", 43453); - _unicodeCharacterMap.Add("JAVANESE CONSONANT SIGN PENGKAL", 43454); - _unicodeCharacterMap.Add("JAVANESE CONSONANT SIGN CAKRA", 43455); - _unicodeCharacterMap.Add("JAVANESE PANGKON", 43456); - _unicodeCharacterMap.Add("JAVANESE LEFT RERENGGAN", 43457); - _unicodeCharacterMap.Add("JAVANESE RIGHT RERENGGAN", 43458); - _unicodeCharacterMap.Add("JAVANESE PADA ANDAP", 43459); - _unicodeCharacterMap.Add("JAVANESE PADA MADYA", 43460); - _unicodeCharacterMap.Add("JAVANESE PADA LUHUR", 43461); - _unicodeCharacterMap.Add("JAVANESE PADA WINDU", 43462); - _unicodeCharacterMap.Add("JAVANESE PADA PANGKAT", 43463); - _unicodeCharacterMap.Add("JAVANESE PADA LINGSA", 43464); - _unicodeCharacterMap.Add("JAVANESE PADA LUNGSI", 43465); - _unicodeCharacterMap.Add("JAVANESE PADA ADEG", 43466); - _unicodeCharacterMap.Add("JAVANESE PADA ADEG ADEG", 43467); - _unicodeCharacterMap.Add("JAVANESE PADA PISELEH", 43468); - _unicodeCharacterMap.Add("JAVANESE TURNED PADA PISELEH", 43469); - _unicodeCharacterMap.Add("JAVANESE PANGRANGKEP", 43471); - _unicodeCharacterMap.Add("JAVANESE DIGIT ZERO", 43472); - _unicodeCharacterMap.Add("JAVANESE DIGIT ONE", 43473); - _unicodeCharacterMap.Add("JAVANESE DIGIT TWO", 43474); - _unicodeCharacterMap.Add("JAVANESE DIGIT THREE", 43475); - _unicodeCharacterMap.Add("JAVANESE DIGIT FOUR", 43476); - _unicodeCharacterMap.Add("JAVANESE DIGIT FIVE", 43477); - _unicodeCharacterMap.Add("JAVANESE DIGIT SIX", 43478); - _unicodeCharacterMap.Add("JAVANESE DIGIT SEVEN", 43479); - _unicodeCharacterMap.Add("JAVANESE DIGIT EIGHT", 43480); - _unicodeCharacterMap.Add("JAVANESE DIGIT NINE", 43481); - _unicodeCharacterMap.Add("JAVANESE PADA TIRTA TUMETES", 43486); - _unicodeCharacterMap.Add("JAVANESE PADA ISEN ISEN", 43487); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN GHA", 43488); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN CHA", 43489); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN JHA", 43490); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN NNA", 43491); - _unicodeCharacterMap.Add("MYANMAR LETTER SHAN BHA", 43492); - _unicodeCharacterMap.Add("MYANMAR SIGN SHAN SAW", 43493); - _unicodeCharacterMap.Add("MYANMAR MODIFIER LETTER SHAN REDUPLICATION", 43494); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING NYA", 43495); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING FA", 43496); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING GA", 43497); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING GHA", 43498); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING JA", 43499); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING JHA", 43500); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING DDA", 43501); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING DDHA", 43502); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING NNA", 43503); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT ZERO", 43504); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT ONE", 43505); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT TWO", 43506); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT THREE", 43507); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT FOUR", 43508); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT FIVE", 43509); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT SIX", 43510); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT SEVEN", 43511); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT EIGHT", 43512); - _unicodeCharacterMap.Add("MYANMAR TAI LAING DIGIT NINE", 43513); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING LLA", 43514); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING DA", 43515); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING DHA", 43516); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING BA", 43517); - _unicodeCharacterMap.Add("MYANMAR LETTER TAI LAING BHA", 43518); - _unicodeCharacterMap.Add("CHAM LETTER A", 43520); - _unicodeCharacterMap.Add("CHAM LETTER I", 43521); - _unicodeCharacterMap.Add("CHAM LETTER U", 43522); - _unicodeCharacterMap.Add("CHAM LETTER E", 43523); - _unicodeCharacterMap.Add("CHAM LETTER AI", 43524); - _unicodeCharacterMap.Add("CHAM LETTER O", 43525); - _unicodeCharacterMap.Add("CHAM LETTER KA", 43526); - _unicodeCharacterMap.Add("CHAM LETTER KHA", 43527); - _unicodeCharacterMap.Add("CHAM LETTER GA", 43528); - _unicodeCharacterMap.Add("CHAM LETTER GHA", 43529); - _unicodeCharacterMap.Add("CHAM LETTER NGUE", 43530); - _unicodeCharacterMap.Add("CHAM LETTER NGA", 43531); - _unicodeCharacterMap.Add("CHAM LETTER CHA", 43532); - _unicodeCharacterMap.Add("CHAM LETTER CHHA", 43533); - _unicodeCharacterMap.Add("CHAM LETTER JA", 43534); - _unicodeCharacterMap.Add("CHAM LETTER JHA", 43535); - _unicodeCharacterMap.Add("CHAM LETTER NHUE", 43536); - _unicodeCharacterMap.Add("CHAM LETTER NHA", 43537); - _unicodeCharacterMap.Add("CHAM LETTER NHJA", 43538); - _unicodeCharacterMap.Add("CHAM LETTER TA", 43539); - _unicodeCharacterMap.Add("CHAM LETTER THA", 43540); - _unicodeCharacterMap.Add("CHAM LETTER DA", 43541); - _unicodeCharacterMap.Add("CHAM LETTER DHA", 43542); - _unicodeCharacterMap.Add("CHAM LETTER NUE", 43543); - _unicodeCharacterMap.Add("CHAM LETTER NA", 43544); - _unicodeCharacterMap.Add("CHAM LETTER DDA", 43545); - _unicodeCharacterMap.Add("CHAM LETTER PA", 43546); - _unicodeCharacterMap.Add("CHAM LETTER PPA", 43547); - _unicodeCharacterMap.Add("CHAM LETTER PHA", 43548); - _unicodeCharacterMap.Add("CHAM LETTER BA", 43549); - _unicodeCharacterMap.Add("CHAM LETTER BHA", 43550); - _unicodeCharacterMap.Add("CHAM LETTER MUE", 43551); - _unicodeCharacterMap.Add("CHAM LETTER MA", 43552); - _unicodeCharacterMap.Add("CHAM LETTER BBA", 43553); - _unicodeCharacterMap.Add("CHAM LETTER YA", 43554); - _unicodeCharacterMap.Add("CHAM LETTER RA", 43555); - _unicodeCharacterMap.Add("CHAM LETTER LA", 43556); - _unicodeCharacterMap.Add("CHAM LETTER VA", 43557); - _unicodeCharacterMap.Add("CHAM LETTER SSA", 43558); - _unicodeCharacterMap.Add("CHAM LETTER SA", 43559); - _unicodeCharacterMap.Add("CHAM LETTER HA", 43560); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN AA", 43561); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN I", 43562); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN II", 43563); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN EI", 43564); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN U", 43565); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN OE", 43566); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN O", 43567); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN AI", 43568); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN AU", 43569); - _unicodeCharacterMap.Add("CHAM VOWEL SIGN UE", 43570); - _unicodeCharacterMap.Add("CHAM CONSONANT SIGN YA", 43571); - _unicodeCharacterMap.Add("CHAM CONSONANT SIGN RA", 43572); - _unicodeCharacterMap.Add("CHAM CONSONANT SIGN LA", 43573); - _unicodeCharacterMap.Add("CHAM CONSONANT SIGN WA", 43574); - _unicodeCharacterMap.Add("CHAM LETTER FINAL K", 43584); - _unicodeCharacterMap.Add("CHAM LETTER FINAL G", 43585); - _unicodeCharacterMap.Add("CHAM LETTER FINAL NG", 43586); - _unicodeCharacterMap.Add("CHAM CONSONANT SIGN FINAL NG", 43587); - _unicodeCharacterMap.Add("CHAM LETTER FINAL CH", 43588); - _unicodeCharacterMap.Add("CHAM LETTER FINAL T", 43589); - _unicodeCharacterMap.Add("CHAM LETTER FINAL N", 43590); - _unicodeCharacterMap.Add("CHAM LETTER FINAL P", 43591); - _unicodeCharacterMap.Add("CHAM LETTER FINAL Y", 43592); - _unicodeCharacterMap.Add("CHAM LETTER FINAL R", 43593); - _unicodeCharacterMap.Add("CHAM LETTER FINAL L", 43594); - _unicodeCharacterMap.Add("CHAM LETTER FINAL SS", 43595); - _unicodeCharacterMap.Add("CHAM CONSONANT SIGN FINAL M", 43596); - _unicodeCharacterMap.Add("CHAM CONSONANT SIGN FINAL H", 43597); - _unicodeCharacterMap.Add("CHAM DIGIT ZERO", 43600); - _unicodeCharacterMap.Add("CHAM DIGIT ONE", 43601); - _unicodeCharacterMap.Add("CHAM DIGIT TWO", 43602); - _unicodeCharacterMap.Add("CHAM DIGIT THREE", 43603); - _unicodeCharacterMap.Add("CHAM DIGIT FOUR", 43604); - _unicodeCharacterMap.Add("CHAM DIGIT FIVE", 43605); - _unicodeCharacterMap.Add("CHAM DIGIT SIX", 43606); - _unicodeCharacterMap.Add("CHAM DIGIT SEVEN", 43607); - _unicodeCharacterMap.Add("CHAM DIGIT EIGHT", 43608); - _unicodeCharacterMap.Add("CHAM DIGIT NINE", 43609); - _unicodeCharacterMap.Add("CHAM PUNCTUATION SPIRAL", 43612); - _unicodeCharacterMap.Add("CHAM PUNCTUATION DANDA", 43613); - _unicodeCharacterMap.Add("CHAM PUNCTUATION DOUBLE DANDA", 43614); - _unicodeCharacterMap.Add("CHAM PUNCTUATION TRIPLE DANDA", 43615); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI GA", 43616); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI CA", 43617); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI CHA", 43618); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI JA", 43619); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI JHA", 43620); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI NYA", 43621); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI TTA", 43622); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI TTHA", 43623); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI DDA", 43624); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI DDHA", 43625); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI DHA", 43626); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI NA", 43627); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI SA", 43628); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI HA", 43629); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI HHA", 43630); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI FA", 43631); - _unicodeCharacterMap.Add("MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION", 43632); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI XA", 43633); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI ZA", 43634); - _unicodeCharacterMap.Add("MYANMAR LETTER KHAMTI RA", 43635); - _unicodeCharacterMap.Add("MYANMAR LOGOGRAM KHAMTI OAY", 43636); - _unicodeCharacterMap.Add("MYANMAR LOGOGRAM KHAMTI QN", 43637); - _unicodeCharacterMap.Add("MYANMAR LOGOGRAM KHAMTI HM", 43638); - _unicodeCharacterMap.Add("MYANMAR SYMBOL AITON EXCLAMATION", 43639); - _unicodeCharacterMap.Add("MYANMAR SYMBOL AITON ONE", 43640); - _unicodeCharacterMap.Add("MYANMAR SYMBOL AITON TWO", 43641); - _unicodeCharacterMap.Add("MYANMAR LETTER AITON RA", 43642); - _unicodeCharacterMap.Add("MYANMAR SIGN PAO KAREN TONE", 43643); - _unicodeCharacterMap.Add("MYANMAR SIGN TAI LAING TONE 2", 43644); - _unicodeCharacterMap.Add("MYANMAR SIGN TAI LAING TONE 5", 43645); - _unicodeCharacterMap.Add("MYANMAR LETTER SHWE PALAUNG CHA", 43646); - _unicodeCharacterMap.Add("MYANMAR LETTER SHWE PALAUNG SHA", 43647); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW KO", 43648); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH KO", 43649); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW KHO", 43650); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH KHO", 43651); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW KHHO", 43652); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH KHHO", 43653); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW GO", 43654); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH GO", 43655); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW NGO", 43656); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH NGO", 43657); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW CO", 43658); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH CO", 43659); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW CHO", 43660); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH CHO", 43661); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW SO", 43662); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH SO", 43663); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW NYO", 43664); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH NYO", 43665); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW DO", 43666); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH DO", 43667); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW TO", 43668); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH TO", 43669); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW THO", 43670); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH THO", 43671); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW NO", 43672); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH NO", 43673); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW BO", 43674); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH BO", 43675); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW PO", 43676); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH PO", 43677); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW PHO", 43678); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH PHO", 43679); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW FO", 43680); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH FO", 43681); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW MO", 43682); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH MO", 43683); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW YO", 43684); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH YO", 43685); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW RO", 43686); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH RO", 43687); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW LO", 43688); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH LO", 43689); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW VO", 43690); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH VO", 43691); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW HO", 43692); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH HO", 43693); - _unicodeCharacterMap.Add("TAI VIET LETTER LOW O", 43694); - _unicodeCharacterMap.Add("TAI VIET LETTER HIGH O", 43695); - _unicodeCharacterMap.Add("TAI VIET MAI KANG", 43696); - _unicodeCharacterMap.Add("TAI VIET VOWEL AA", 43697); - _unicodeCharacterMap.Add("TAI VIET VOWEL I", 43698); - _unicodeCharacterMap.Add("TAI VIET VOWEL UE", 43699); - _unicodeCharacterMap.Add("TAI VIET VOWEL U", 43700); - _unicodeCharacterMap.Add("TAI VIET VOWEL E", 43701); - _unicodeCharacterMap.Add("TAI VIET VOWEL O", 43702); - _unicodeCharacterMap.Add("TAI VIET MAI KHIT", 43703); - _unicodeCharacterMap.Add("TAI VIET VOWEL IA", 43704); - _unicodeCharacterMap.Add("TAI VIET VOWEL UEA", 43705); - _unicodeCharacterMap.Add("TAI VIET VOWEL UA", 43706); - _unicodeCharacterMap.Add("TAI VIET VOWEL AUE", 43707); - _unicodeCharacterMap.Add("TAI VIET VOWEL AY", 43708); - _unicodeCharacterMap.Add("TAI VIET VOWEL AN", 43709); - _unicodeCharacterMap.Add("TAI VIET VOWEL AM", 43710); - _unicodeCharacterMap.Add("TAI VIET TONE MAI EK", 43711); - _unicodeCharacterMap.Add("TAI VIET TONE MAI NUENG", 43712); - _unicodeCharacterMap.Add("TAI VIET TONE MAI THO", 43713); - _unicodeCharacterMap.Add("TAI VIET TONE MAI SONG", 43714); - _unicodeCharacterMap.Add("TAI VIET SYMBOL KON", 43739); - _unicodeCharacterMap.Add("TAI VIET SYMBOL NUENG", 43740); - _unicodeCharacterMap.Add("TAI VIET SYMBOL SAM", 43741); - _unicodeCharacterMap.Add("TAI VIET SYMBOL HO HOI", 43742); - _unicodeCharacterMap.Add("TAI VIET SYMBOL KOI KOI", 43743); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER E", 43744); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER O", 43745); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER CHA", 43746); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER NYA", 43747); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER TTA", 43748); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER TTHA", 43749); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER DDA", 43750); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER DDHA", 43751); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER NNA", 43752); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER SHA", 43753); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER SSA", 43754); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN II", 43755); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN UU", 43756); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN AAI", 43757); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN AU", 43758); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN AAU", 43759); - _unicodeCharacterMap.Add("MEETEI MAYEK CHEIKHAN", 43760); - _unicodeCharacterMap.Add("MEETEI MAYEK AHANG KHUDAM", 43761); - _unicodeCharacterMap.Add("MEETEI MAYEK ANJI", 43762); - _unicodeCharacterMap.Add("MEETEI MAYEK SYLLABLE REPETITION MARK", 43763); - _unicodeCharacterMap.Add("MEETEI MAYEK WORD REPETITION MARK", 43764); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN VISARGA", 43765); - _unicodeCharacterMap.Add("MEETEI MAYEK VIRAMA", 43766); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TTHU", 43777); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TTHI", 43778); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TTHAA", 43779); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TTHEE", 43780); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TTHE", 43781); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE TTHO", 43782); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDHU", 43785); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDHI", 43786); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDHAA", 43787); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDHEE", 43788); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDHE", 43789); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DDHO", 43790); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DZU", 43793); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DZI", 43794); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DZAA", 43795); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DZEE", 43796); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DZE", 43797); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE DZO", 43798); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHHA", 43808); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHHU", 43809); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHHI", 43810); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHHAA", 43811); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHHEE", 43812); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHHE", 43813); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE CCHHO", 43814); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BBA", 43816); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BBU", 43817); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BBI", 43818); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BBAA", 43819); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BBEE", 43820); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BBE", 43821); - _unicodeCharacterMap.Add("ETHIOPIC SYLLABLE BBO", 43822); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BARRED ALPHA", 43824); - _unicodeCharacterMap.Add("LATIN SMALL LETTER A REVERSED SCHWA", 43825); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BLACKLETTER E", 43826); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BARRED E", 43827); - _unicodeCharacterMap.Add("LATIN SMALL LETTER E WITH FLOURISH", 43828); - _unicodeCharacterMap.Add("LATIN SMALL LETTER LENIS F", 43829); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SCRIPT G WITH CROSSED TAIL", 43830); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH INVERTED LAZY S", 43831); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE", 43832); - _unicodeCharacterMap.Add("LATIN SMALL LETTER L WITH MIDDLE RING", 43833); - _unicodeCharacterMap.Add("LATIN SMALL LETTER M WITH CROSSED TAIL", 43834); - _unicodeCharacterMap.Add("LATIN SMALL LETTER N WITH CROSSED TAIL", 43835); - _unicodeCharacterMap.Add("LATIN SMALL LETTER ENG WITH CROSSED TAIL", 43836); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BLACKLETTER O", 43837); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BLACKLETTER O WITH STROKE", 43838); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OPEN O WITH STROKE", 43839); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INVERTED OE", 43840); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED OE WITH STROKE", 43841); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE", 43842); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED O OPEN O", 43843); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED O OPEN O WITH STROKE", 43844); - _unicodeCharacterMap.Add("LATIN SMALL LETTER STIRRUP R", 43845); - _unicodeCharacterMap.Add("LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG", 43846); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITHOUT HANDLE", 43847); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DOUBLE R", 43848); - _unicodeCharacterMap.Add("LATIN SMALL LETTER R WITH CROSSED TAIL", 43849); - _unicodeCharacterMap.Add("LATIN SMALL LETTER DOUBLE R WITH CROSSED TAIL", 43850); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SCRIPT R", 43851); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SCRIPT R WITH RING", 43852); - _unicodeCharacterMap.Add("LATIN SMALL LETTER BASELINE ESH", 43853); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH SHORT RIGHT LEG", 43854); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG", 43855); - _unicodeCharacterMap.Add("LATIN SMALL LETTER UI", 43856); - _unicodeCharacterMap.Add("LATIN SMALL LETTER TURNED UI", 43857); - _unicodeCharacterMap.Add("LATIN SMALL LETTER U WITH LEFT HOOK", 43858); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CHI", 43859); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CHI WITH LOW RIGHT RING", 43860); - _unicodeCharacterMap.Add("LATIN SMALL LETTER CHI WITH LOW LEFT SERIF", 43861); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X WITH LOW RIGHT RING", 43862); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X WITH LONG LEFT LEG", 43863); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING", 43864); - _unicodeCharacterMap.Add("LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF", 43865); - _unicodeCharacterMap.Add("LATIN SMALL LETTER Y WITH SHORT RIGHT LEG", 43866); - _unicodeCharacterMap.Add("MODIFIER BREVE WITH INVERTED BREVE", 43867); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL HENG", 43868); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL L WITH INVERTED LAZY S", 43869); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL L WITH MIDDLE TILDE", 43870); - _unicodeCharacterMap.Add("MODIFIER LETTER SMALL U WITH LEFT HOOK", 43871); - _unicodeCharacterMap.Add("LATIN SMALL LETTER SAKHA YAT", 43872); - _unicodeCharacterMap.Add("LATIN SMALL LETTER IOTIFIED E", 43873); - _unicodeCharacterMap.Add("LATIN SMALL LETTER OPEN OE", 43874); - _unicodeCharacterMap.Add("LATIN SMALL LETTER UO", 43875); - _unicodeCharacterMap.Add("LATIN SMALL LETTER INVERTED ALPHA", 43876); - _unicodeCharacterMap.Add("GREEK LETTER SMALL CAPITAL OMEGA", 43877); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER A", 43888); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER E", 43889); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER I", 43890); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER O", 43891); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER U", 43892); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER V", 43893); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER GA", 43894); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER KA", 43895); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER GE", 43896); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER GI", 43897); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER GO", 43898); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER GU", 43899); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER GV", 43900); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER HA", 43901); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER HE", 43902); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER HI", 43903); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER HO", 43904); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER HU", 43905); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER HV", 43906); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER LA", 43907); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER LE", 43908); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER LI", 43909); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER LO", 43910); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER LU", 43911); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER LV", 43912); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER MA", 43913); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER ME", 43914); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER MI", 43915); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER MO", 43916); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER MU", 43917); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER NA", 43918); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER HNA", 43919); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER NAH", 43920); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER NE", 43921); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER NI", 43922); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER NO", 43923); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER NU", 43924); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER NV", 43925); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER QUA", 43926); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER QUE", 43927); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER QUI", 43928); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER QUO", 43929); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER QUU", 43930); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER QUV", 43931); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER SA", 43932); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER S", 43933); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER SE", 43934); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER SI", 43935); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER SO", 43936); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER SU", 43937); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER SV", 43938); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER DA", 43939); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TA", 43940); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER DE", 43941); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TE", 43942); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER DI", 43943); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TI", 43944); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER DO", 43945); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER DU", 43946); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER DV", 43947); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER DLA", 43948); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TLA", 43949); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TLE", 43950); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TLI", 43951); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TLO", 43952); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TLU", 43953); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TLV", 43954); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TSA", 43955); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TSE", 43956); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TSI", 43957); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TSO", 43958); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TSU", 43959); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER TSV", 43960); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER WA", 43961); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER WE", 43962); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER WI", 43963); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER WO", 43964); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER WU", 43965); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER WV", 43966); - _unicodeCharacterMap.Add("CHEROKEE SMALL LETTER YA", 43967); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER KOK", 43968); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER SAM", 43969); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER LAI", 43970); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER MIT", 43971); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER PA", 43972); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER NA", 43973); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER CHIL", 43974); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER TIL", 43975); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER KHOU", 43976); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER NGOU", 43977); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER THOU", 43978); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER WAI", 43979); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER YANG", 43980); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER HUK", 43981); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER UN", 43982); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER I", 43983); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER PHAM", 43984); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER ATIYA", 43985); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER GOK", 43986); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER JHAM", 43987); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER RAI", 43988); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER BA", 43989); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER JIL", 43990); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER DIL", 43991); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER GHOU", 43992); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER DHOU", 43993); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER BHAM", 43994); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER KOK LONSUM", 43995); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER LAI LONSUM", 43996); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER MIT LONSUM", 43997); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER PA LONSUM", 43998); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER NA LONSUM", 43999); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER TIL LONSUM", 44000); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER NGOU LONSUM", 44001); - _unicodeCharacterMap.Add("MEETEI MAYEK LETTER I LONSUM", 44002); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN ONAP", 44003); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN INAP", 44004); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN ANAP", 44005); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN YENAP", 44006); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN SOUNAP", 44007); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN UNAP", 44008); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN CHEINAP", 44009); - _unicodeCharacterMap.Add("MEETEI MAYEK VOWEL SIGN NUNG", 44010); - _unicodeCharacterMap.Add("MEETEI MAYEK CHEIKHEI", 44011); - _unicodeCharacterMap.Add("MEETEI MAYEK LUM IYEK", 44012); - _unicodeCharacterMap.Add("MEETEI MAYEK APUN IYEK", 44013); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT ZERO", 44016); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT ONE", 44017); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT TWO", 44018); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT THREE", 44019); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT FOUR", 44020); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT FIVE", 44021); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT SIX", 44022); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT SEVEN", 44023); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT EIGHT", 44024); - _unicodeCharacterMap.Add("MEETEI MAYEK DIGIT NINE", 44025); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O YEO", 55216); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG O O I", 55217); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO A", 55218); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO AE", 55219); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YO EO", 55220); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U YEO", 55221); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG U I I", 55222); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU AE", 55223); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG YU O", 55224); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EU A", 55225); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EU EO", 55226); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EU E", 55227); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG EU O", 55228); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I YA O", 55229); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I YAE", 55230); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I YEO", 55231); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I YE", 55232); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I O I", 55233); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I YO", 55234); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I YU", 55235); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG I I", 55236); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG ARAEA A", 55237); - _unicodeCharacterMap.Add("HANGUL JUNGSEONG ARAEA E", 55238); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN RIEUL", 55243); - _unicodeCharacterMap.Add("HANGUL JONGSEONG NIEUN CHIEUCH", 55244); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGTIKEUT", 55245); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGTIKEUT PIEUP", 55246); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT PIEUP", 55247); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT SIOS", 55248); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT SIOS KIYEOK", 55249); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT CIEUC", 55250); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT CHIEUCH", 55251); - _unicodeCharacterMap.Add("HANGUL JONGSEONG TIKEUT THIEUTH", 55252); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL SSANGKIYEOK", 55253); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL KIYEOK HIEUH", 55254); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGRIEUL KHIEUKH", 55255); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL MIEUM HIEUH", 55256); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL PIEUP TIKEUT", 55257); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL PIEUP PHIEUPH", 55258); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL YESIEUNG", 55259); - _unicodeCharacterMap.Add("HANGUL JONGSEONG RIEUL YEORINHIEUH HIEUH", 55260); - _unicodeCharacterMap.Add("HANGUL JONGSEONG KAPYEOUNRIEUL", 55261); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM NIEUN", 55262); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM SSANGNIEUN", 55263); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGMIEUM", 55264); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM PIEUP SIOS", 55265); - _unicodeCharacterMap.Add("HANGUL JONGSEONG MIEUM CIEUC", 55266); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP TIKEUT", 55267); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP RIEUL PHIEUPH", 55268); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP MIEUM", 55269); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGPIEUP", 55270); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP SIOS TIKEUT", 55271); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP CIEUC", 55272); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PIEUP CHIEUCH", 55273); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS MIEUM", 55274); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS KAPYEOUNPIEUP", 55275); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGSIOS KIYEOK", 55276); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGSIOS TIKEUT", 55277); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS PANSIOS", 55278); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS CIEUC", 55279); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS CHIEUCH", 55280); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS THIEUTH", 55281); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SIOS HIEUH", 55282); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PANSIOS PIEUP", 55283); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PANSIOS KAPYEOUNPIEUP", 55284); - _unicodeCharacterMap.Add("HANGUL JONGSEONG YESIEUNG MIEUM", 55285); - _unicodeCharacterMap.Add("HANGUL JONGSEONG YESIEUNG HIEUH", 55286); - _unicodeCharacterMap.Add("HANGUL JONGSEONG CIEUC PIEUP", 55287); - _unicodeCharacterMap.Add("HANGUL JONGSEONG CIEUC SSANGPIEUP", 55288); - _unicodeCharacterMap.Add("HANGUL JONGSEONG SSANGCIEUC", 55289); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PHIEUPH SIOS", 55290); - _unicodeCharacterMap.Add("HANGUL JONGSEONG PHIEUPH THIEUTH", 55291); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F900", 63744); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F901", 63745); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F902", 63746); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F903", 63747); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F904", 63748); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F905", 63749); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F906", 63750); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F907", 63751); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F908", 63752); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F909", 63753); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F90A", 63754); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F90B", 63755); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F90C", 63756); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F90D", 63757); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F90E", 63758); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F90F", 63759); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F910", 63760); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F911", 63761); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F912", 63762); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F913", 63763); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F914", 63764); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F915", 63765); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F916", 63766); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F917", 63767); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F918", 63768); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F919", 63769); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F91A", 63770); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F91B", 63771); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F91C", 63772); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F91D", 63773); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F91E", 63774); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F91F", 63775); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F920", 63776); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F921", 63777); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F922", 63778); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F923", 63779); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F924", 63780); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F925", 63781); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F926", 63782); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F927", 63783); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F928", 63784); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F929", 63785); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F92A", 63786); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F92B", 63787); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F92C", 63788); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F92D", 63789); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F92E", 63790); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F92F", 63791); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F930", 63792); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F931", 63793); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F932", 63794); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F933", 63795); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F934", 63796); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F935", 63797); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F936", 63798); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F937", 63799); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F938", 63800); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F939", 63801); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F93A", 63802); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F93B", 63803); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F93C", 63804); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F93D", 63805); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F93E", 63806); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F93F", 63807); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F940", 63808); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F941", 63809); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F942", 63810); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F943", 63811); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F944", 63812); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F945", 63813); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F946", 63814); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F947", 63815); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F948", 63816); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F949", 63817); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F94A", 63818); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F94B", 63819); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F94C", 63820); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F94D", 63821); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F94E", 63822); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F94F", 63823); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F950", 63824); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F951", 63825); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F952", 63826); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F953", 63827); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F954", 63828); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F955", 63829); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F956", 63830); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F957", 63831); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F958", 63832); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F959", 63833); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F95A", 63834); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F95B", 63835); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F95C", 63836); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F95D", 63837); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F95E", 63838); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F95F", 63839); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F960", 63840); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F961", 63841); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F962", 63842); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F963", 63843); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F964", 63844); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F965", 63845); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F966", 63846); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F967", 63847); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F968", 63848); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F969", 63849); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F96A", 63850); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F96B", 63851); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F96C", 63852); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F96D", 63853); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F96E", 63854); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F96F", 63855); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F970", 63856); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F971", 63857); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F972", 63858); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F973", 63859); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F974", 63860); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F975", 63861); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F976", 63862); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F977", 63863); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F978", 63864); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F979", 63865); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F97A", 63866); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F97B", 63867); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F97C", 63868); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F97D", 63869); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F97E", 63870); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F97F", 63871); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F980", 63872); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F981", 63873); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F982", 63874); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F983", 63875); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F984", 63876); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F985", 63877); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F986", 63878); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F987", 63879); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F988", 63880); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F989", 63881); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F98A", 63882); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F98B", 63883); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F98C", 63884); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F98D", 63885); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F98E", 63886); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F98F", 63887); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F990", 63888); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F991", 63889); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F992", 63890); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F993", 63891); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F994", 63892); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F995", 63893); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F996", 63894); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F997", 63895); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F998", 63896); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F999", 63897); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F99A", 63898); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F99B", 63899); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F99C", 63900); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F99D", 63901); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F99E", 63902); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F99F", 63903); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A0", 63904); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A1", 63905); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A2", 63906); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A3", 63907); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A4", 63908); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A5", 63909); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A6", 63910); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A7", 63911); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A8", 63912); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9A9", 63913); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9AA", 63914); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9AB", 63915); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9AC", 63916); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9AD", 63917); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9AE", 63918); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9AF", 63919); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B0", 63920); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B1", 63921); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B2", 63922); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B3", 63923); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B4", 63924); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B5", 63925); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B6", 63926); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B7", 63927); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B8", 63928); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9B9", 63929); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9BA", 63930); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9BB", 63931); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9BC", 63932); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9BD", 63933); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9BE", 63934); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9BF", 63935); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C0", 63936); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C1", 63937); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C2", 63938); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C3", 63939); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C4", 63940); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C5", 63941); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C6", 63942); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C7", 63943); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C8", 63944); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9C9", 63945); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9CA", 63946); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9CB", 63947); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9CC", 63948); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9CD", 63949); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9CE", 63950); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9CF", 63951); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D0", 63952); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D1", 63953); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D2", 63954); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D3", 63955); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D4", 63956); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D5", 63957); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D6", 63958); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D7", 63959); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D8", 63960); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9D9", 63961); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9DA", 63962); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9DB", 63963); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9DC", 63964); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9DD", 63965); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9DE", 63966); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9DF", 63967); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E0", 63968); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E1", 63969); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E2", 63970); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E3", 63971); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E4", 63972); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E5", 63973); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E6", 63974); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E7", 63975); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E8", 63976); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9E9", 63977); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9EA", 63978); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9EB", 63979); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9EC", 63980); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9ED", 63981); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9EE", 63982); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9EF", 63983); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F0", 63984); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F1", 63985); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F2", 63986); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F3", 63987); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F4", 63988); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F5", 63989); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F6", 63990); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F7", 63991); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F8", 63992); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9F9", 63993); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9FA", 63994); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9FB", 63995); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9FC", 63996); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9FD", 63997); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9FE", 63998); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH F9FF", 63999); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA00", 64000); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA01", 64001); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA02", 64002); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA03", 64003); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA04", 64004); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA05", 64005); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA06", 64006); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA07", 64007); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA08", 64008); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA09", 64009); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA0A", 64010); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA0B", 64011); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA0C", 64012); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA0D", 64013); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA0E", 64014); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA0F", 64015); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA10", 64016); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA11", 64017); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA12", 64018); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA13", 64019); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA14", 64020); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA15", 64021); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA16", 64022); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA17", 64023); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA18", 64024); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA19", 64025); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA1A", 64026); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA1B", 64027); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA1C", 64028); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA1D", 64029); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA1E", 64030); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA1F", 64031); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA20", 64032); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA21", 64033); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA22", 64034); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA23", 64035); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA24", 64036); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA25", 64037); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA26", 64038); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA27", 64039); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA28", 64040); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA29", 64041); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA2A", 64042); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA2B", 64043); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA2C", 64044); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA2D", 64045); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA2E", 64046); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA2F", 64047); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA30", 64048); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA31", 64049); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA32", 64050); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA33", 64051); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA34", 64052); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA35", 64053); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA36", 64054); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA37", 64055); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA38", 64056); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA39", 64057); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA3A", 64058); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA3B", 64059); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA3C", 64060); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA3D", 64061); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA3E", 64062); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA3F", 64063); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA40", 64064); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA41", 64065); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA42", 64066); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA43", 64067); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA44", 64068); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA45", 64069); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA46", 64070); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA47", 64071); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA48", 64072); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA49", 64073); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA4A", 64074); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA4B", 64075); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA4C", 64076); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA4D", 64077); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA4E", 64078); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA4F", 64079); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA50", 64080); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA51", 64081); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA52", 64082); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA53", 64083); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA54", 64084); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA55", 64085); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA56", 64086); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA57", 64087); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA58", 64088); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA59", 64089); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA5A", 64090); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA5B", 64091); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA5C", 64092); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA5D", 64093); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA5E", 64094); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA5F", 64095); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA60", 64096); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA61", 64097); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA62", 64098); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA63", 64099); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA64", 64100); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA65", 64101); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA66", 64102); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA67", 64103); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA68", 64104); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA69", 64105); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA6A", 64106); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA6B", 64107); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA6C", 64108); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA6D", 64109); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA70", 64112); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA71", 64113); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA72", 64114); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA73", 64115); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA74", 64116); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA75", 64117); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA76", 64118); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA77", 64119); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA78", 64120); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA79", 64121); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA7A", 64122); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA7B", 64123); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA7C", 64124); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA7D", 64125); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA7E", 64126); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA7F", 64127); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA80", 64128); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA81", 64129); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA82", 64130); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA83", 64131); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA84", 64132); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA85", 64133); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA86", 64134); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA87", 64135); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA88", 64136); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA89", 64137); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA8A", 64138); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA8B", 64139); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA8C", 64140); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA8D", 64141); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA8E", 64142); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA8F", 64143); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA90", 64144); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA91", 64145); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA92", 64146); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA93", 64147); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA94", 64148); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA95", 64149); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA96", 64150); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA97", 64151); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA98", 64152); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA99", 64153); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA9A", 64154); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA9B", 64155); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA9C", 64156); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA9D", 64157); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA9E", 64158); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FA9F", 64159); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA0", 64160); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA1", 64161); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA2", 64162); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA3", 64163); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA4", 64164); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA5", 64165); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA6", 64166); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA7", 64167); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA8", 64168); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAA9", 64169); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAAA", 64170); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAAB", 64171); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAAC", 64172); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAAD", 64173); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAAE", 64174); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAAF", 64175); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB0", 64176); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB1", 64177); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB2", 64178); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB3", 64179); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB4", 64180); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB5", 64181); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB6", 64182); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB7", 64183); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB8", 64184); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAB9", 64185); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FABA", 64186); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FABB", 64187); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FABC", 64188); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FABD", 64189); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FABE", 64190); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FABF", 64191); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC0", 64192); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC1", 64193); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC2", 64194); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC3", 64195); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC4", 64196); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC5", 64197); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC6", 64198); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC7", 64199); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC8", 64200); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAC9", 64201); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FACA", 64202); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FACB", 64203); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FACC", 64204); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FACD", 64205); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FACE", 64206); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FACF", 64207); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD0", 64208); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD1", 64209); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD2", 64210); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD3", 64211); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD4", 64212); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD5", 64213); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD6", 64214); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD7", 64215); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD8", 64216); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH FAD9", 64217); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE FF", 64256); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE FI", 64257); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE FL", 64258); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE FFI", 64259); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE FFL", 64260); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE LONG S T", 64261); - _unicodeCharacterMap.Add("LATIN SMALL LIGATURE ST", 64262); - _unicodeCharacterMap.Add("ARMENIAN SMALL LIGATURE MEN NOW", 64275); - _unicodeCharacterMap.Add("ARMENIAN SMALL LIGATURE MEN ECH", 64276); - _unicodeCharacterMap.Add("ARMENIAN SMALL LIGATURE MEN INI", 64277); - _unicodeCharacterMap.Add("ARMENIAN SMALL LIGATURE VEW NOW", 64278); - _unicodeCharacterMap.Add("ARMENIAN SMALL LIGATURE MEN XEH", 64279); - _unicodeCharacterMap.Add("HEBREW LETTER YOD WITH HIRIQ", 64285); - _unicodeCharacterMap.Add("HEBREW POINT JUDEO SPANISH VARIKA", 64286); - _unicodeCharacterMap.Add("HEBREW LIGATURE YIDDISH YOD YOD PATAH", 64287); - _unicodeCharacterMap.Add("HEBREW LETTER ALTERNATIVE AYIN", 64288); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE ALEF", 64289); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE DALET", 64290); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE HE", 64291); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE KAF", 64292); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE LAMED", 64293); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE FINAL MEM", 64294); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE RESH", 64295); - _unicodeCharacterMap.Add("HEBREW LETTER WIDE TAV", 64296); - _unicodeCharacterMap.Add("HEBREW LETTER ALTERNATIVE PLUS SIGN", 64297); - _unicodeCharacterMap.Add("HEBREW LETTER SHIN WITH SHIN DOT", 64298); - _unicodeCharacterMap.Add("HEBREW LETTER SHIN WITH SIN DOT", 64299); - _unicodeCharacterMap.Add("HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT", 64300); - _unicodeCharacterMap.Add("HEBREW LETTER SHIN WITH DAGESH AND SIN DOT", 64301); - _unicodeCharacterMap.Add("HEBREW LETTER ALEF WITH PATAH", 64302); - _unicodeCharacterMap.Add("HEBREW LETTER ALEF WITH QAMATS", 64303); - _unicodeCharacterMap.Add("HEBREW LETTER ALEF WITH MAPIQ", 64304); - _unicodeCharacterMap.Add("HEBREW LETTER BET WITH DAGESH", 64305); - _unicodeCharacterMap.Add("HEBREW LETTER GIMEL WITH DAGESH", 64306); - _unicodeCharacterMap.Add("HEBREW LETTER DALET WITH DAGESH", 64307); - _unicodeCharacterMap.Add("HEBREW LETTER HE WITH MAPIQ", 64308); - _unicodeCharacterMap.Add("HEBREW LETTER VAV WITH DAGESH", 64309); - _unicodeCharacterMap.Add("HEBREW LETTER ZAYIN WITH DAGESH", 64310); - _unicodeCharacterMap.Add("HEBREW LETTER TET WITH DAGESH", 64312); - _unicodeCharacterMap.Add("HEBREW LETTER YOD WITH DAGESH", 64313); - _unicodeCharacterMap.Add("HEBREW LETTER FINAL KAF WITH DAGESH", 64314); - _unicodeCharacterMap.Add("HEBREW LETTER KAF WITH DAGESH", 64315); - _unicodeCharacterMap.Add("HEBREW LETTER LAMED WITH DAGESH", 64316); - _unicodeCharacterMap.Add("HEBREW LETTER MEM WITH DAGESH", 64318); - _unicodeCharacterMap.Add("HEBREW LETTER NUN WITH DAGESH", 64320); - _unicodeCharacterMap.Add("HEBREW LETTER SAMEKH WITH DAGESH", 64321); - _unicodeCharacterMap.Add("HEBREW LETTER FINAL PE WITH DAGESH", 64323); - _unicodeCharacterMap.Add("HEBREW LETTER PE WITH DAGESH", 64324); - _unicodeCharacterMap.Add("HEBREW LETTER TSADI WITH DAGESH", 64326); - _unicodeCharacterMap.Add("HEBREW LETTER QOF WITH DAGESH", 64327); - _unicodeCharacterMap.Add("HEBREW LETTER RESH WITH DAGESH", 64328); - _unicodeCharacterMap.Add("HEBREW LETTER SHIN WITH DAGESH", 64329); - _unicodeCharacterMap.Add("HEBREW LETTER TAV WITH DAGESH", 64330); - _unicodeCharacterMap.Add("HEBREW LETTER VAV WITH HOLAM", 64331); - _unicodeCharacterMap.Add("HEBREW LETTER BET WITH RAFE", 64332); - _unicodeCharacterMap.Add("HEBREW LETTER KAF WITH RAFE", 64333); - _unicodeCharacterMap.Add("HEBREW LETTER PE WITH RAFE", 64334); - _unicodeCharacterMap.Add("HEBREW LIGATURE ALEF LAMED", 64335); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WASLA ISOLATED FORM", 64336); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WASLA FINAL FORM", 64337); - _unicodeCharacterMap.Add("ARABIC LETTER BEEH ISOLATED FORM", 64338); - _unicodeCharacterMap.Add("ARABIC LETTER BEEH FINAL FORM", 64339); - _unicodeCharacterMap.Add("ARABIC LETTER BEEH INITIAL FORM", 64340); - _unicodeCharacterMap.Add("ARABIC LETTER BEEH MEDIAL FORM", 64341); - _unicodeCharacterMap.Add("ARABIC LETTER PEH ISOLATED FORM", 64342); - _unicodeCharacterMap.Add("ARABIC LETTER PEH FINAL FORM", 64343); - _unicodeCharacterMap.Add("ARABIC LETTER PEH INITIAL FORM", 64344); - _unicodeCharacterMap.Add("ARABIC LETTER PEH MEDIAL FORM", 64345); - _unicodeCharacterMap.Add("ARABIC LETTER BEHEH ISOLATED FORM", 64346); - _unicodeCharacterMap.Add("ARABIC LETTER BEHEH FINAL FORM", 64347); - _unicodeCharacterMap.Add("ARABIC LETTER BEHEH INITIAL FORM", 64348); - _unicodeCharacterMap.Add("ARABIC LETTER BEHEH MEDIAL FORM", 64349); - _unicodeCharacterMap.Add("ARABIC LETTER TTEHEH ISOLATED FORM", 64350); - _unicodeCharacterMap.Add("ARABIC LETTER TTEHEH FINAL FORM", 64351); - _unicodeCharacterMap.Add("ARABIC LETTER TTEHEH INITIAL FORM", 64352); - _unicodeCharacterMap.Add("ARABIC LETTER TTEHEH MEDIAL FORM", 64353); - _unicodeCharacterMap.Add("ARABIC LETTER TEHEH ISOLATED FORM", 64354); - _unicodeCharacterMap.Add("ARABIC LETTER TEHEH FINAL FORM", 64355); - _unicodeCharacterMap.Add("ARABIC LETTER TEHEH INITIAL FORM", 64356); - _unicodeCharacterMap.Add("ARABIC LETTER TEHEH MEDIAL FORM", 64357); - _unicodeCharacterMap.Add("ARABIC LETTER TTEH ISOLATED FORM", 64358); - _unicodeCharacterMap.Add("ARABIC LETTER TTEH FINAL FORM", 64359); - _unicodeCharacterMap.Add("ARABIC LETTER TTEH INITIAL FORM", 64360); - _unicodeCharacterMap.Add("ARABIC LETTER TTEH MEDIAL FORM", 64361); - _unicodeCharacterMap.Add("ARABIC LETTER VEH ISOLATED FORM", 64362); - _unicodeCharacterMap.Add("ARABIC LETTER VEH FINAL FORM", 64363); - _unicodeCharacterMap.Add("ARABIC LETTER VEH INITIAL FORM", 64364); - _unicodeCharacterMap.Add("ARABIC LETTER VEH MEDIAL FORM", 64365); - _unicodeCharacterMap.Add("ARABIC LETTER PEHEH ISOLATED FORM", 64366); - _unicodeCharacterMap.Add("ARABIC LETTER PEHEH FINAL FORM", 64367); - _unicodeCharacterMap.Add("ARABIC LETTER PEHEH INITIAL FORM", 64368); - _unicodeCharacterMap.Add("ARABIC LETTER PEHEH MEDIAL FORM", 64369); - _unicodeCharacterMap.Add("ARABIC LETTER DYEH ISOLATED FORM", 64370); - _unicodeCharacterMap.Add("ARABIC LETTER DYEH FINAL FORM", 64371); - _unicodeCharacterMap.Add("ARABIC LETTER DYEH INITIAL FORM", 64372); - _unicodeCharacterMap.Add("ARABIC LETTER DYEH MEDIAL FORM", 64373); - _unicodeCharacterMap.Add("ARABIC LETTER NYEH ISOLATED FORM", 64374); - _unicodeCharacterMap.Add("ARABIC LETTER NYEH FINAL FORM", 64375); - _unicodeCharacterMap.Add("ARABIC LETTER NYEH INITIAL FORM", 64376); - _unicodeCharacterMap.Add("ARABIC LETTER NYEH MEDIAL FORM", 64377); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEH ISOLATED FORM", 64378); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEH FINAL FORM", 64379); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEH INITIAL FORM", 64380); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEH MEDIAL FORM", 64381); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEHEH ISOLATED FORM", 64382); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEHEH FINAL FORM", 64383); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEHEH INITIAL FORM", 64384); - _unicodeCharacterMap.Add("ARABIC LETTER TCHEHEH MEDIAL FORM", 64385); - _unicodeCharacterMap.Add("ARABIC LETTER DDAHAL ISOLATED FORM", 64386); - _unicodeCharacterMap.Add("ARABIC LETTER DDAHAL FINAL FORM", 64387); - _unicodeCharacterMap.Add("ARABIC LETTER DAHAL ISOLATED FORM", 64388); - _unicodeCharacterMap.Add("ARABIC LETTER DAHAL FINAL FORM", 64389); - _unicodeCharacterMap.Add("ARABIC LETTER DUL ISOLATED FORM", 64390); - _unicodeCharacterMap.Add("ARABIC LETTER DUL FINAL FORM", 64391); - _unicodeCharacterMap.Add("ARABIC LETTER DDAL ISOLATED FORM", 64392); - _unicodeCharacterMap.Add("ARABIC LETTER DDAL FINAL FORM", 64393); - _unicodeCharacterMap.Add("ARABIC LETTER JEH ISOLATED FORM", 64394); - _unicodeCharacterMap.Add("ARABIC LETTER JEH FINAL FORM", 64395); - _unicodeCharacterMap.Add("ARABIC LETTER RREH ISOLATED FORM", 64396); - _unicodeCharacterMap.Add("ARABIC LETTER RREH FINAL FORM", 64397); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH ISOLATED FORM", 64398); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH FINAL FORM", 64399); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH INITIAL FORM", 64400); - _unicodeCharacterMap.Add("ARABIC LETTER KEHEH MEDIAL FORM", 64401); - _unicodeCharacterMap.Add("ARABIC LETTER GAF ISOLATED FORM", 64402); - _unicodeCharacterMap.Add("ARABIC LETTER GAF FINAL FORM", 64403); - _unicodeCharacterMap.Add("ARABIC LETTER GAF INITIAL FORM", 64404); - _unicodeCharacterMap.Add("ARABIC LETTER GAF MEDIAL FORM", 64405); - _unicodeCharacterMap.Add("ARABIC LETTER GUEH ISOLATED FORM", 64406); - _unicodeCharacterMap.Add("ARABIC LETTER GUEH FINAL FORM", 64407); - _unicodeCharacterMap.Add("ARABIC LETTER GUEH INITIAL FORM", 64408); - _unicodeCharacterMap.Add("ARABIC LETTER GUEH MEDIAL FORM", 64409); - _unicodeCharacterMap.Add("ARABIC LETTER NGOEH ISOLATED FORM", 64410); - _unicodeCharacterMap.Add("ARABIC LETTER NGOEH FINAL FORM", 64411); - _unicodeCharacterMap.Add("ARABIC LETTER NGOEH INITIAL FORM", 64412); - _unicodeCharacterMap.Add("ARABIC LETTER NGOEH MEDIAL FORM", 64413); - _unicodeCharacterMap.Add("ARABIC LETTER NOON GHUNNA ISOLATED FORM", 64414); - _unicodeCharacterMap.Add("ARABIC LETTER NOON GHUNNA FINAL FORM", 64415); - _unicodeCharacterMap.Add("ARABIC LETTER RNOON ISOLATED FORM", 64416); - _unicodeCharacterMap.Add("ARABIC LETTER RNOON FINAL FORM", 64417); - _unicodeCharacterMap.Add("ARABIC LETTER RNOON INITIAL FORM", 64418); - _unicodeCharacterMap.Add("ARABIC LETTER RNOON MEDIAL FORM", 64419); - _unicodeCharacterMap.Add("ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM", 64420); - _unicodeCharacterMap.Add("ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM", 64421); - _unicodeCharacterMap.Add("ARABIC LETTER HEH GOAL ISOLATED FORM", 64422); - _unicodeCharacterMap.Add("ARABIC LETTER HEH GOAL FINAL FORM", 64423); - _unicodeCharacterMap.Add("ARABIC LETTER HEH GOAL INITIAL FORM", 64424); - _unicodeCharacterMap.Add("ARABIC LETTER HEH GOAL MEDIAL FORM", 64425); - _unicodeCharacterMap.Add("ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM", 64426); - _unicodeCharacterMap.Add("ARABIC LETTER HEH DOACHASHMEE FINAL FORM", 64427); - _unicodeCharacterMap.Add("ARABIC LETTER HEH DOACHASHMEE INITIAL FORM", 64428); - _unicodeCharacterMap.Add("ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM", 64429); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE ISOLATED FORM", 64430); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE FINAL FORM", 64431); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM", 64432); - _unicodeCharacterMap.Add("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM", 64433); - _unicodeCharacterMap.Add("ARABIC SYMBOL DOT ABOVE", 64434); - _unicodeCharacterMap.Add("ARABIC SYMBOL DOT BELOW", 64435); - _unicodeCharacterMap.Add("ARABIC SYMBOL TWO DOTS ABOVE", 64436); - _unicodeCharacterMap.Add("ARABIC SYMBOL TWO DOTS BELOW", 64437); - _unicodeCharacterMap.Add("ARABIC SYMBOL THREE DOTS ABOVE", 64438); - _unicodeCharacterMap.Add("ARABIC SYMBOL THREE DOTS BELOW", 64439); - _unicodeCharacterMap.Add("ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE", 64440); - _unicodeCharacterMap.Add("ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW", 64441); - _unicodeCharacterMap.Add("ARABIC SYMBOL FOUR DOTS ABOVE", 64442); - _unicodeCharacterMap.Add("ARABIC SYMBOL FOUR DOTS BELOW", 64443); - _unicodeCharacterMap.Add("ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW", 64444); - _unicodeCharacterMap.Add("ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE", 64445); - _unicodeCharacterMap.Add("ARABIC SYMBOL TWO DOTS VERTICALLY BELOW", 64446); - _unicodeCharacterMap.Add("ARABIC SYMBOL RING", 64447); - _unicodeCharacterMap.Add("ARABIC SYMBOL SMALL TAH ABOVE", 64448); - _unicodeCharacterMap.Add("ARABIC SYMBOL SMALL TAH BELOW", 64449); - _unicodeCharacterMap.Add("ARABIC LETTER NG ISOLATED FORM", 64467); - _unicodeCharacterMap.Add("ARABIC LETTER NG FINAL FORM", 64468); - _unicodeCharacterMap.Add("ARABIC LETTER NG INITIAL FORM", 64469); - _unicodeCharacterMap.Add("ARABIC LETTER NG MEDIAL FORM", 64470); - _unicodeCharacterMap.Add("ARABIC LETTER U ISOLATED FORM", 64471); - _unicodeCharacterMap.Add("ARABIC LETTER U FINAL FORM", 64472); - _unicodeCharacterMap.Add("ARABIC LETTER OE ISOLATED FORM", 64473); - _unicodeCharacterMap.Add("ARABIC LETTER OE FINAL FORM", 64474); - _unicodeCharacterMap.Add("ARABIC LETTER YU ISOLATED FORM", 64475); - _unicodeCharacterMap.Add("ARABIC LETTER YU FINAL FORM", 64476); - _unicodeCharacterMap.Add("ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM", 64477); - _unicodeCharacterMap.Add("ARABIC LETTER VE ISOLATED FORM", 64478); - _unicodeCharacterMap.Add("ARABIC LETTER VE FINAL FORM", 64479); - _unicodeCharacterMap.Add("ARABIC LETTER KIRGHIZ OE ISOLATED FORM", 64480); - _unicodeCharacterMap.Add("ARABIC LETTER KIRGHIZ OE FINAL FORM", 64481); - _unicodeCharacterMap.Add("ARABIC LETTER KIRGHIZ YU ISOLATED FORM", 64482); - _unicodeCharacterMap.Add("ARABIC LETTER KIRGHIZ YU FINAL FORM", 64483); - _unicodeCharacterMap.Add("ARABIC LETTER E ISOLATED FORM", 64484); - _unicodeCharacterMap.Add("ARABIC LETTER E FINAL FORM", 64485); - _unicodeCharacterMap.Add("ARABIC LETTER E INITIAL FORM", 64486); - _unicodeCharacterMap.Add("ARABIC LETTER E MEDIAL FORM", 64487); - _unicodeCharacterMap.Add("ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM", 64488); - _unicodeCharacterMap.Add("ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM", 64489); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM", 64490); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM", 64491); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM", 64492); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM", 64493); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM", 64494); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM", 64495); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM", 64496); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM", 64497); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM", 64498); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM", 64499); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM", 64500); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM", 64501); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM", 64502); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM", 64503); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM", 64504); - _unicodeCharacterMap.Add("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM", 64505); - _unicodeCharacterMap.Add("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM", 64506); - _unicodeCharacterMap.Add("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM", 64507); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH ISOLATED FORM", 64508); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH FINAL FORM", 64509); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH INITIAL FORM", 64510); - _unicodeCharacterMap.Add("ARABIC LETTER FARSI YEH MEDIAL FORM", 64511); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM", 64512); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM", 64513); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM", 64514); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM", 64515); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM", 64516); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM", 64517); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH HAH ISOLATED FORM", 64518); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM", 64519); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM", 64520); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM", 64521); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH YEH ISOLATED FORM", 64522); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM", 64523); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH HAH ISOLATED FORM", 64524); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM", 64525); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM", 64526); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM", 64527); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH YEH ISOLATED FORM", 64528); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM", 64529); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM", 64530); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM", 64531); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH YEH ISOLATED FORM", 64532); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM", 64533); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM", 64534); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM", 64535); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM", 64536); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM", 64537); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM", 64538); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM", 64539); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM", 64540); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM", 64541); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM", 64542); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM", 64543); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH HAH ISOLATED FORM", 64544); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM", 64545); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM", 64546); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH HAH ISOLATED FORM", 64547); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM", 64548); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM", 64549); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH HAH ISOLATED FORM", 64550); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM", 64551); - _unicodeCharacterMap.Add("ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM", 64552); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM", 64553); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM", 64554); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM", 64555); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM", 64556); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM", 64557); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH HAH ISOLATED FORM", 64558); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM", 64559); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM", 64560); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM", 64561); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH YEH ISOLATED FORM", 64562); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH HAH ISOLATED FORM", 64563); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM", 64564); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM", 64565); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH YEH ISOLATED FORM", 64566); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM", 64567); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM", 64568); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH HAH ISOLATED FORM", 64569); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM", 64570); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH LAM ISOLATED FORM", 64571); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM", 64572); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM", 64573); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH YEH ISOLATED FORM", 64574); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM", 64575); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH HAH ISOLATED FORM", 64576); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM", 64577); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM", 64578); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM", 64579); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH YEH ISOLATED FORM", 64580); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM", 64581); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM", 64582); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM", 64583); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM", 64584); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM", 64585); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM", 64586); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM", 64587); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH HAH ISOLATED FORM", 64588); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM", 64589); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM", 64590); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM", 64591); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH YEH ISOLATED FORM", 64592); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM", 64593); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM", 64594); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM", 64595); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH YEH ISOLATED FORM", 64596); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM", 64597); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAH ISOLATED FORM", 64598); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM", 64599); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM", 64600); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM", 64601); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH YEH ISOLATED FORM", 64602); - _unicodeCharacterMap.Add("ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM", 64603); - _unicodeCharacterMap.Add("ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM", 64604); - _unicodeCharacterMap.Add("ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM", 64605); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM", 64606); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM", 64607); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM", 64608); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM", 64609); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM", 64610); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM", 64611); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM", 64612); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM", 64613); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM", 64614); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM", 64615); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM", 64616); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM", 64617); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH REH FINAL FORM", 64618); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH ZAIN FINAL FORM", 64619); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH MEEM FINAL FORM", 64620); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH NOON FINAL FORM", 64621); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM", 64622); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH YEH FINAL FORM", 64623); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH REH FINAL FORM", 64624); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH ZAIN FINAL FORM", 64625); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM FINAL FORM", 64626); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH NOON FINAL FORM", 64627); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM", 64628); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH YEH FINAL FORM", 64629); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH REH FINAL FORM", 64630); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH ZAIN FINAL FORM", 64631); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH MEEM FINAL FORM", 64632); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH NOON FINAL FORM", 64633); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM", 64634); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH YEH FINAL FORM", 64635); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM", 64636); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH YEH FINAL FORM", 64637); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM", 64638); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH YEH FINAL FORM", 64639); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH ALEF FINAL FORM", 64640); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH LAM FINAL FORM", 64641); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH MEEM FINAL FORM", 64642); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM", 64643); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH YEH FINAL FORM", 64644); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH MEEM FINAL FORM", 64645); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM", 64646); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH YEH FINAL FORM", 64647); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH ALEF FINAL FORM", 64648); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH MEEM FINAL FORM", 64649); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH REH FINAL FORM", 64650); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH ZAIN FINAL FORM", 64651); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH MEEM FINAL FORM", 64652); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH NOON FINAL FORM", 64653); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM", 64654); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH YEH FINAL FORM", 64655); - _unicodeCharacterMap.Add("ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM", 64656); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH REH FINAL FORM", 64657); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH ZAIN FINAL FORM", 64658); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH MEEM FINAL FORM", 64659); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH NOON FINAL FORM", 64660); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM", 64661); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH YEH FINAL FORM", 64662); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM", 64663); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM", 64664); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM", 64665); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM", 64666); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM", 64667); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH JEEM INITIAL FORM", 64668); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH HAH INITIAL FORM", 64669); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH KHAH INITIAL FORM", 64670); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH MEEM INITIAL FORM", 64671); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH HEH INITIAL FORM", 64672); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH JEEM INITIAL FORM", 64673); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH HAH INITIAL FORM", 64674); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH KHAH INITIAL FORM", 64675); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM INITIAL FORM", 64676); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH HEH INITIAL FORM", 64677); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH MEEM INITIAL FORM", 64678); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH HAH INITIAL FORM", 64679); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM", 64680); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH JEEM INITIAL FORM", 64681); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH MEEM INITIAL FORM", 64682); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM", 64683); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM", 64684); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM", 64685); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH HAH INITIAL FORM", 64686); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM", 64687); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM", 64688); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH HAH INITIAL FORM", 64689); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH KHAH INITIAL FORM", 64690); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH MEEM INITIAL FORM", 64691); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH JEEM INITIAL FORM", 64692); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH HAH INITIAL FORM", 64693); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH KHAH INITIAL FORM", 64694); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH MEEM INITIAL FORM", 64695); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH HAH INITIAL FORM", 64696); - _unicodeCharacterMap.Add("ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM", 64697); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH JEEM INITIAL FORM", 64698); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH MEEM INITIAL FORM", 64699); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM", 64700); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM", 64701); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH JEEM INITIAL FORM", 64702); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH HAH INITIAL FORM", 64703); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH KHAH INITIAL FORM", 64704); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH MEEM INITIAL FORM", 64705); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH HAH INITIAL FORM", 64706); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH MEEM INITIAL FORM", 64707); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH JEEM INITIAL FORM", 64708); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH HAH INITIAL FORM", 64709); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH KHAH INITIAL FORM", 64710); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH LAM INITIAL FORM", 64711); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH MEEM INITIAL FORM", 64712); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH JEEM INITIAL FORM", 64713); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH HAH INITIAL FORM", 64714); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH KHAH INITIAL FORM", 64715); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH MEEM INITIAL FORM", 64716); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH HEH INITIAL FORM", 64717); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM", 64718); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH HAH INITIAL FORM", 64719); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM", 64720); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM", 64721); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM INITIAL FORM", 64722); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH HAH INITIAL FORM", 64723); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH KHAH INITIAL FORM", 64724); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH MEEM INITIAL FORM", 64725); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH HEH INITIAL FORM", 64726); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH JEEM INITIAL FORM", 64727); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH MEEM INITIAL FORM", 64728); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM", 64729); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH JEEM INITIAL FORM", 64730); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAH INITIAL FORM", 64731); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH KHAH INITIAL FORM", 64732); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH MEEM INITIAL FORM", 64733); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HEH INITIAL FORM", 64734); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM", 64735); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM", 64736); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM", 64737); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH HEH MEDIAL FORM", 64738); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM", 64739); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH HEH MEDIAL FORM", 64740); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM", 64741); - _unicodeCharacterMap.Add("ARABIC LIGATURE THEH WITH HEH MEDIAL FORM", 64742); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM", 64743); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM", 64744); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM", 64745); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM", 64746); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH LAM MEDIAL FORM", 64747); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM", 64748); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM", 64749); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM", 64750); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH HEH MEDIAL FORM", 64751); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM", 64752); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HEH MEDIAL FORM", 64753); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM", 64754); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM", 64755); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM", 64756); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM", 64757); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH YEH ISOLATED FORM", 64758); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM", 64759); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH YEH ISOLATED FORM", 64760); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM", 64761); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM", 64762); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM", 64763); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM", 64764); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM", 64765); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM", 64766); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM", 64767); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH YEH ISOLATED FORM", 64768); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM", 64769); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM", 64770); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM", 64771); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM", 64772); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM", 64773); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH YEH ISOLATED FORM", 64774); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM", 64775); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH YEH ISOLATED FORM", 64776); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM", 64777); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM", 64778); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM", 64779); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM", 64780); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM", 64781); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH REH ISOLATED FORM", 64782); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH REH ISOLATED FORM", 64783); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH REH ISOLATED FORM", 64784); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM", 64785); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH YEH FINAL FORM", 64786); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM", 64787); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH YEH FINAL FORM", 64788); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM", 64789); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH YEH FINAL FORM", 64790); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM", 64791); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH YEH FINAL FORM", 64792); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM", 64793); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH YEH FINAL FORM", 64794); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM", 64795); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH YEH FINAL FORM", 64796); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM", 64797); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH YEH FINAL FORM", 64798); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM", 64799); - _unicodeCharacterMap.Add("ARABIC LIGATURE KHAH WITH YEH FINAL FORM", 64800); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM", 64801); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH YEH FINAL FORM", 64802); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM", 64803); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH YEH FINAL FORM", 64804); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM", 64805); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HAH FINAL FORM", 64806); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM", 64807); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM", 64808); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH REH FINAL FORM", 64809); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH REH FINAL FORM", 64810); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH REH FINAL FORM", 64811); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH REH FINAL FORM", 64812); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM", 64813); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM", 64814); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM", 64815); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM", 64816); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH HEH INITIAL FORM", 64817); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM", 64818); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH MEEM INITIAL FORM", 64819); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM", 64820); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM", 64821); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM", 64822); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM", 64823); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM", 64824); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM", 64825); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM", 64826); - _unicodeCharacterMap.Add("ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM", 64827); - _unicodeCharacterMap.Add("ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM", 64828); - _unicodeCharacterMap.Add("ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM", 64829); - _unicodeCharacterMap.Add("ORNATE LEFT PARENTHESIS", 64830); - _unicodeCharacterMap.Add("ORNATE RIGHT PARENTHESIS", 64831); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM", 64848); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM", 64849); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM", 64850); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM", 64851); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM", 64852); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM", 64853); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM", 64854); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM", 64855); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM", 64856); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM", 64857); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM", 64858); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM", 64859); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM", 64860); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM", 64861); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM", 64862); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM", 64863); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM", 64864); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM", 64865); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM", 64866); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM", 64867); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM", 64868); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM", 64869); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM", 64870); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM", 64871); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM", 64872); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM", 64873); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM", 64874); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM", 64875); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM", 64876); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM", 64877); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM", 64878); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM", 64879); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM", 64880); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM", 64881); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM", 64882); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM", 64883); - _unicodeCharacterMap.Add("ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM", 64884); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM", 64885); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM", 64886); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM", 64887); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM", 64888); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM", 64889); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM", 64890); - _unicodeCharacterMap.Add("ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM", 64891); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM", 64892); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM", 64893); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM", 64894); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM", 64895); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM", 64896); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM", 64897); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM", 64898); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM", 64899); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM", 64900); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM", 64901); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM", 64902); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM", 64903); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM", 64904); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM", 64905); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM", 64906); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM", 64907); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM", 64908); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM", 64909); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM", 64910); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM", 64911); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM", 64914); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM", 64915); - _unicodeCharacterMap.Add("ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM", 64916); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM", 64917); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM", 64918); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM", 64919); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM", 64920); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM", 64921); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM", 64922); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM", 64923); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM", 64924); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM", 64925); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM", 64926); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM", 64927); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM", 64928); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM", 64929); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM", 64930); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM", 64931); - _unicodeCharacterMap.Add("ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM", 64932); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM", 64933); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM", 64934); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM", 64935); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM", 64936); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM", 64937); - _unicodeCharacterMap.Add("ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM", 64938); - _unicodeCharacterMap.Add("ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM", 64939); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM", 64940); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM", 64941); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM", 64942); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM", 64943); - _unicodeCharacterMap.Add("ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM", 64944); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM", 64945); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM", 64946); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM", 64947); - _unicodeCharacterMap.Add("ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM", 64948); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM", 64949); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM", 64950); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM", 64951); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM", 64952); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM", 64953); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM", 64954); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM", 64955); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM", 64956); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM", 64957); - _unicodeCharacterMap.Add("ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM", 64958); - _unicodeCharacterMap.Add("ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM", 64959); - _unicodeCharacterMap.Add("ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM", 64960); - _unicodeCharacterMap.Add("ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM", 64961); - _unicodeCharacterMap.Add("ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM", 64962); - _unicodeCharacterMap.Add("ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM", 64963); - _unicodeCharacterMap.Add("ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM", 64964); - _unicodeCharacterMap.Add("ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM", 64965); - _unicodeCharacterMap.Add("ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM", 64966); - _unicodeCharacterMap.Add("ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM", 64967); - _unicodeCharacterMap.Add("ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM", 65008); - _unicodeCharacterMap.Add("ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM", 65009); - _unicodeCharacterMap.Add("ARABIC LIGATURE ALLAH ISOLATED FORM", 65010); - _unicodeCharacterMap.Add("ARABIC LIGATURE AKBAR ISOLATED FORM", 65011); - _unicodeCharacterMap.Add("ARABIC LIGATURE MOHAMMAD ISOLATED FORM", 65012); - _unicodeCharacterMap.Add("ARABIC LIGATURE SALAM ISOLATED FORM", 65013); - _unicodeCharacterMap.Add("ARABIC LIGATURE RASOUL ISOLATED FORM", 65014); - _unicodeCharacterMap.Add("ARABIC LIGATURE ALAYHE ISOLATED FORM", 65015); - _unicodeCharacterMap.Add("ARABIC LIGATURE WASALLAM ISOLATED FORM", 65016); - _unicodeCharacterMap.Add("ARABIC LIGATURE SALLA ISOLATED FORM", 65017); - _unicodeCharacterMap.Add("ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM", 65018); - _unicodeCharacterMap.Add("ARABIC LIGATURE JALLAJALALOUHOU", 65019); - _unicodeCharacterMap.Add("RIAL SIGN", 65020); - _unicodeCharacterMap.Add("ARABIC LIGATURE BISMILLAH AR RAHMAN AR RAHEEM", 65021); - _unicodeCharacterMap.Add("VARIATION SELECTOR 1", 65024); - _unicodeCharacterMap.Add("VARIATION SELECTOR 2", 65025); - _unicodeCharacterMap.Add("VARIATION SELECTOR 3", 65026); - _unicodeCharacterMap.Add("VARIATION SELECTOR 4", 65027); - _unicodeCharacterMap.Add("VARIATION SELECTOR 5", 65028); - _unicodeCharacterMap.Add("VARIATION SELECTOR 6", 65029); - _unicodeCharacterMap.Add("VARIATION SELECTOR 7", 65030); - _unicodeCharacterMap.Add("VARIATION SELECTOR 8", 65031); - _unicodeCharacterMap.Add("VARIATION SELECTOR 9", 65032); - _unicodeCharacterMap.Add("VARIATION SELECTOR 10", 65033); - _unicodeCharacterMap.Add("VARIATION SELECTOR 11", 65034); - _unicodeCharacterMap.Add("VARIATION SELECTOR 12", 65035); - _unicodeCharacterMap.Add("VARIATION SELECTOR 13", 65036); - _unicodeCharacterMap.Add("VARIATION SELECTOR 14", 65037); - _unicodeCharacterMap.Add("VARIATION SELECTOR 15", 65038); - _unicodeCharacterMap.Add("VARIATION SELECTOR 16", 65039); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL COMMA", 65040); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA", 65041); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP", 65042); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL COLON", 65043); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL SEMICOLON", 65044); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK", 65045); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL QUESTION MARK", 65046); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET", 65047); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET", 65048); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS", 65049); - _unicodeCharacterMap.Add("COMBINING LIGATURE LEFT HALF", 65056); - _unicodeCharacterMap.Add("COMBINING LIGATURE RIGHT HALF", 65057); - _unicodeCharacterMap.Add("COMBINING DOUBLE TILDE LEFT HALF", 65058); - _unicodeCharacterMap.Add("COMBINING DOUBLE TILDE RIGHT HALF", 65059); - _unicodeCharacterMap.Add("COMBINING MACRON LEFT HALF", 65060); - _unicodeCharacterMap.Add("COMBINING MACRON RIGHT HALF", 65061); - _unicodeCharacterMap.Add("COMBINING CONJOINING MACRON", 65062); - _unicodeCharacterMap.Add("COMBINING LIGATURE LEFT HALF BELOW", 65063); - _unicodeCharacterMap.Add("COMBINING LIGATURE RIGHT HALF BELOW", 65064); - _unicodeCharacterMap.Add("COMBINING TILDE LEFT HALF BELOW", 65065); - _unicodeCharacterMap.Add("COMBINING TILDE RIGHT HALF BELOW", 65066); - _unicodeCharacterMap.Add("COMBINING MACRON LEFT HALF BELOW", 65067); - _unicodeCharacterMap.Add("COMBINING MACRON RIGHT HALF BELOW", 65068); - _unicodeCharacterMap.Add("COMBINING CONJOINING MACRON BELOW", 65069); - _unicodeCharacterMap.Add("COMBINING CYRILLIC TITLO LEFT HALF", 65070); - _unicodeCharacterMap.Add("COMBINING CYRILLIC TITLO RIGHT HALF", 65071); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL TWO DOT LEADER", 65072); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL EM DASH", 65073); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL EN DASH", 65074); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LOW LINE", 65075); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL WAVY LOW LINE", 65076); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS", 65077); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS", 65078); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET", 65079); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET", 65080); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET", 65081); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET", 65082); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET", 65083); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET", 65084); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET", 65085); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET", 65086); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET", 65087); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET", 65088); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET", 65089); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET", 65090); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET", 65091); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET", 65092); - _unicodeCharacterMap.Add("SESAME DOT", 65093); - _unicodeCharacterMap.Add("WHITE SESAME DOT", 65094); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET", 65095); - _unicodeCharacterMap.Add("PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET", 65096); - _unicodeCharacterMap.Add("DASHED OVERLINE", 65097); - _unicodeCharacterMap.Add("CENTRELINE OVERLINE", 65098); - _unicodeCharacterMap.Add("WAVY OVERLINE", 65099); - _unicodeCharacterMap.Add("DOUBLE WAVY OVERLINE", 65100); - _unicodeCharacterMap.Add("DASHED LOW LINE", 65101); - _unicodeCharacterMap.Add("CENTRELINE LOW LINE", 65102); - _unicodeCharacterMap.Add("WAVY LOW LINE", 65103); - _unicodeCharacterMap.Add("SMALL COMMA", 65104); - _unicodeCharacterMap.Add("SMALL IDEOGRAPHIC COMMA", 65105); - _unicodeCharacterMap.Add("SMALL FULL STOP", 65106); - _unicodeCharacterMap.Add("SMALL SEMICOLON", 65108); - _unicodeCharacterMap.Add("SMALL COLON", 65109); - _unicodeCharacterMap.Add("SMALL QUESTION MARK", 65110); - _unicodeCharacterMap.Add("SMALL EXCLAMATION MARK", 65111); - _unicodeCharacterMap.Add("SMALL EM DASH", 65112); - _unicodeCharacterMap.Add("SMALL LEFT PARENTHESIS", 65113); - _unicodeCharacterMap.Add("SMALL RIGHT PARENTHESIS", 65114); - _unicodeCharacterMap.Add("SMALL LEFT CURLY BRACKET", 65115); - _unicodeCharacterMap.Add("SMALL RIGHT CURLY BRACKET", 65116); - _unicodeCharacterMap.Add("SMALL LEFT TORTOISE SHELL BRACKET", 65117); - _unicodeCharacterMap.Add("SMALL RIGHT TORTOISE SHELL BRACKET", 65118); - _unicodeCharacterMap.Add("SMALL NUMBER SIGN", 65119); - _unicodeCharacterMap.Add("SMALL AMPERSAND", 65120); - _unicodeCharacterMap.Add("SMALL ASTERISK", 65121); - _unicodeCharacterMap.Add("SMALL PLUS SIGN", 65122); - _unicodeCharacterMap.Add("SMALL HYPHEN MINUS", 65123); - _unicodeCharacterMap.Add("SMALL LESS THAN SIGN", 65124); - _unicodeCharacterMap.Add("SMALL GREATER THAN SIGN", 65125); - _unicodeCharacterMap.Add("SMALL EQUALS SIGN", 65126); - _unicodeCharacterMap.Add("SMALL REVERSE SOLIDUS", 65128); - _unicodeCharacterMap.Add("SMALL DOLLAR SIGN", 65129); - _unicodeCharacterMap.Add("SMALL PERCENT SIGN", 65130); - _unicodeCharacterMap.Add("SMALL COMMERCIAL AT", 65131); - _unicodeCharacterMap.Add("ARABIC FATHATAN ISOLATED FORM", 65136); - _unicodeCharacterMap.Add("ARABIC TATWEEL WITH FATHATAN ABOVE", 65137); - _unicodeCharacterMap.Add("ARABIC DAMMATAN ISOLATED FORM", 65138); - _unicodeCharacterMap.Add("ARABIC TAIL FRAGMENT", 65139); - _unicodeCharacterMap.Add("ARABIC KASRATAN ISOLATED FORM", 65140); - _unicodeCharacterMap.Add("ARABIC FATHA ISOLATED FORM", 65142); - _unicodeCharacterMap.Add("ARABIC FATHA MEDIAL FORM", 65143); - _unicodeCharacterMap.Add("ARABIC DAMMA ISOLATED FORM", 65144); - _unicodeCharacterMap.Add("ARABIC DAMMA MEDIAL FORM", 65145); - _unicodeCharacterMap.Add("ARABIC KASRA ISOLATED FORM", 65146); - _unicodeCharacterMap.Add("ARABIC KASRA MEDIAL FORM", 65147); - _unicodeCharacterMap.Add("ARABIC SHADDA ISOLATED FORM", 65148); - _unicodeCharacterMap.Add("ARABIC SHADDA MEDIAL FORM", 65149); - _unicodeCharacterMap.Add("ARABIC SUKUN ISOLATED FORM", 65150); - _unicodeCharacterMap.Add("ARABIC SUKUN MEDIAL FORM", 65151); - _unicodeCharacterMap.Add("ARABIC LETTER HAMZA ISOLATED FORM", 65152); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM", 65153); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM", 65154); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM", 65155); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM", 65156); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM", 65157); - _unicodeCharacterMap.Add("ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM", 65158); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM", 65159); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM", 65160); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM", 65161); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM", 65162); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM", 65163); - _unicodeCharacterMap.Add("ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM", 65164); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF ISOLATED FORM", 65165); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF FINAL FORM", 65166); - _unicodeCharacterMap.Add("ARABIC LETTER BEH ISOLATED FORM", 65167); - _unicodeCharacterMap.Add("ARABIC LETTER BEH FINAL FORM", 65168); - _unicodeCharacterMap.Add("ARABIC LETTER BEH INITIAL FORM", 65169); - _unicodeCharacterMap.Add("ARABIC LETTER BEH MEDIAL FORM", 65170); - _unicodeCharacterMap.Add("ARABIC LETTER TEH MARBUTA ISOLATED FORM", 65171); - _unicodeCharacterMap.Add("ARABIC LETTER TEH MARBUTA FINAL FORM", 65172); - _unicodeCharacterMap.Add("ARABIC LETTER TEH ISOLATED FORM", 65173); - _unicodeCharacterMap.Add("ARABIC LETTER TEH FINAL FORM", 65174); - _unicodeCharacterMap.Add("ARABIC LETTER TEH INITIAL FORM", 65175); - _unicodeCharacterMap.Add("ARABIC LETTER TEH MEDIAL FORM", 65176); - _unicodeCharacterMap.Add("ARABIC LETTER THEH ISOLATED FORM", 65177); - _unicodeCharacterMap.Add("ARABIC LETTER THEH FINAL FORM", 65178); - _unicodeCharacterMap.Add("ARABIC LETTER THEH INITIAL FORM", 65179); - _unicodeCharacterMap.Add("ARABIC LETTER THEH MEDIAL FORM", 65180); - _unicodeCharacterMap.Add("ARABIC LETTER JEEM ISOLATED FORM", 65181); - _unicodeCharacterMap.Add("ARABIC LETTER JEEM FINAL FORM", 65182); - _unicodeCharacterMap.Add("ARABIC LETTER JEEM INITIAL FORM", 65183); - _unicodeCharacterMap.Add("ARABIC LETTER JEEM MEDIAL FORM", 65184); - _unicodeCharacterMap.Add("ARABIC LETTER HAH ISOLATED FORM", 65185); - _unicodeCharacterMap.Add("ARABIC LETTER HAH FINAL FORM", 65186); - _unicodeCharacterMap.Add("ARABIC LETTER HAH INITIAL FORM", 65187); - _unicodeCharacterMap.Add("ARABIC LETTER HAH MEDIAL FORM", 65188); - _unicodeCharacterMap.Add("ARABIC LETTER KHAH ISOLATED FORM", 65189); - _unicodeCharacterMap.Add("ARABIC LETTER KHAH FINAL FORM", 65190); - _unicodeCharacterMap.Add("ARABIC LETTER KHAH INITIAL FORM", 65191); - _unicodeCharacterMap.Add("ARABIC LETTER KHAH MEDIAL FORM", 65192); - _unicodeCharacterMap.Add("ARABIC LETTER DAL ISOLATED FORM", 65193); - _unicodeCharacterMap.Add("ARABIC LETTER DAL FINAL FORM", 65194); - _unicodeCharacterMap.Add("ARABIC LETTER THAL ISOLATED FORM", 65195); - _unicodeCharacterMap.Add("ARABIC LETTER THAL FINAL FORM", 65196); - _unicodeCharacterMap.Add("ARABIC LETTER REH ISOLATED FORM", 65197); - _unicodeCharacterMap.Add("ARABIC LETTER REH FINAL FORM", 65198); - _unicodeCharacterMap.Add("ARABIC LETTER ZAIN ISOLATED FORM", 65199); - _unicodeCharacterMap.Add("ARABIC LETTER ZAIN FINAL FORM", 65200); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN ISOLATED FORM", 65201); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN FINAL FORM", 65202); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN INITIAL FORM", 65203); - _unicodeCharacterMap.Add("ARABIC LETTER SEEN MEDIAL FORM", 65204); - _unicodeCharacterMap.Add("ARABIC LETTER SHEEN ISOLATED FORM", 65205); - _unicodeCharacterMap.Add("ARABIC LETTER SHEEN FINAL FORM", 65206); - _unicodeCharacterMap.Add("ARABIC LETTER SHEEN INITIAL FORM", 65207); - _unicodeCharacterMap.Add("ARABIC LETTER SHEEN MEDIAL FORM", 65208); - _unicodeCharacterMap.Add("ARABIC LETTER SAD ISOLATED FORM", 65209); - _unicodeCharacterMap.Add("ARABIC LETTER SAD FINAL FORM", 65210); - _unicodeCharacterMap.Add("ARABIC LETTER SAD INITIAL FORM", 65211); - _unicodeCharacterMap.Add("ARABIC LETTER SAD MEDIAL FORM", 65212); - _unicodeCharacterMap.Add("ARABIC LETTER DAD ISOLATED FORM", 65213); - _unicodeCharacterMap.Add("ARABIC LETTER DAD FINAL FORM", 65214); - _unicodeCharacterMap.Add("ARABIC LETTER DAD INITIAL FORM", 65215); - _unicodeCharacterMap.Add("ARABIC LETTER DAD MEDIAL FORM", 65216); - _unicodeCharacterMap.Add("ARABIC LETTER TAH ISOLATED FORM", 65217); - _unicodeCharacterMap.Add("ARABIC LETTER TAH FINAL FORM", 65218); - _unicodeCharacterMap.Add("ARABIC LETTER TAH INITIAL FORM", 65219); - _unicodeCharacterMap.Add("ARABIC LETTER TAH MEDIAL FORM", 65220); - _unicodeCharacterMap.Add("ARABIC LETTER ZAH ISOLATED FORM", 65221); - _unicodeCharacterMap.Add("ARABIC LETTER ZAH FINAL FORM", 65222); - _unicodeCharacterMap.Add("ARABIC LETTER ZAH INITIAL FORM", 65223); - _unicodeCharacterMap.Add("ARABIC LETTER ZAH MEDIAL FORM", 65224); - _unicodeCharacterMap.Add("ARABIC LETTER AIN ISOLATED FORM", 65225); - _unicodeCharacterMap.Add("ARABIC LETTER AIN FINAL FORM", 65226); - _unicodeCharacterMap.Add("ARABIC LETTER AIN INITIAL FORM", 65227); - _unicodeCharacterMap.Add("ARABIC LETTER AIN MEDIAL FORM", 65228); - _unicodeCharacterMap.Add("ARABIC LETTER GHAIN ISOLATED FORM", 65229); - _unicodeCharacterMap.Add("ARABIC LETTER GHAIN FINAL FORM", 65230); - _unicodeCharacterMap.Add("ARABIC LETTER GHAIN INITIAL FORM", 65231); - _unicodeCharacterMap.Add("ARABIC LETTER GHAIN MEDIAL FORM", 65232); - _unicodeCharacterMap.Add("ARABIC LETTER FEH ISOLATED FORM", 65233); - _unicodeCharacterMap.Add("ARABIC LETTER FEH FINAL FORM", 65234); - _unicodeCharacterMap.Add("ARABIC LETTER FEH INITIAL FORM", 65235); - _unicodeCharacterMap.Add("ARABIC LETTER FEH MEDIAL FORM", 65236); - _unicodeCharacterMap.Add("ARABIC LETTER QAF ISOLATED FORM", 65237); - _unicodeCharacterMap.Add("ARABIC LETTER QAF FINAL FORM", 65238); - _unicodeCharacterMap.Add("ARABIC LETTER QAF INITIAL FORM", 65239); - _unicodeCharacterMap.Add("ARABIC LETTER QAF MEDIAL FORM", 65240); - _unicodeCharacterMap.Add("ARABIC LETTER KAF ISOLATED FORM", 65241); - _unicodeCharacterMap.Add("ARABIC LETTER KAF FINAL FORM", 65242); - _unicodeCharacterMap.Add("ARABIC LETTER KAF INITIAL FORM", 65243); - _unicodeCharacterMap.Add("ARABIC LETTER KAF MEDIAL FORM", 65244); - _unicodeCharacterMap.Add("ARABIC LETTER LAM ISOLATED FORM", 65245); - _unicodeCharacterMap.Add("ARABIC LETTER LAM FINAL FORM", 65246); - _unicodeCharacterMap.Add("ARABIC LETTER LAM INITIAL FORM", 65247); - _unicodeCharacterMap.Add("ARABIC LETTER LAM MEDIAL FORM", 65248); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM ISOLATED FORM", 65249); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM FINAL FORM", 65250); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM INITIAL FORM", 65251); - _unicodeCharacterMap.Add("ARABIC LETTER MEEM MEDIAL FORM", 65252); - _unicodeCharacterMap.Add("ARABIC LETTER NOON ISOLATED FORM", 65253); - _unicodeCharacterMap.Add("ARABIC LETTER NOON FINAL FORM", 65254); - _unicodeCharacterMap.Add("ARABIC LETTER NOON INITIAL FORM", 65255); - _unicodeCharacterMap.Add("ARABIC LETTER NOON MEDIAL FORM", 65256); - _unicodeCharacterMap.Add("ARABIC LETTER HEH ISOLATED FORM", 65257); - _unicodeCharacterMap.Add("ARABIC LETTER HEH FINAL FORM", 65258); - _unicodeCharacterMap.Add("ARABIC LETTER HEH INITIAL FORM", 65259); - _unicodeCharacterMap.Add("ARABIC LETTER HEH MEDIAL FORM", 65260); - _unicodeCharacterMap.Add("ARABIC LETTER WAW ISOLATED FORM", 65261); - _unicodeCharacterMap.Add("ARABIC LETTER WAW FINAL FORM", 65262); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF MAKSURA ISOLATED FORM", 65263); - _unicodeCharacterMap.Add("ARABIC LETTER ALEF MAKSURA FINAL FORM", 65264); - _unicodeCharacterMap.Add("ARABIC LETTER YEH ISOLATED FORM", 65265); - _unicodeCharacterMap.Add("ARABIC LETTER YEH FINAL FORM", 65266); - _unicodeCharacterMap.Add("ARABIC LETTER YEH INITIAL FORM", 65267); - _unicodeCharacterMap.Add("ARABIC LETTER YEH MEDIAL FORM", 65268); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM", 65269); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM", 65270); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM", 65271); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM", 65272); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM", 65273); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM", 65274); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM", 65275); - _unicodeCharacterMap.Add("ARABIC LIGATURE LAM WITH ALEF FINAL FORM", 65276); - _unicodeCharacterMap.Add("ZERO WIDTH NO BREAK SPACE", 65279); - _unicodeCharacterMap.Add("FULLWIDTH EXCLAMATION MARK", 65281); - _unicodeCharacterMap.Add("FULLWIDTH QUOTATION MARK", 65282); - _unicodeCharacterMap.Add("FULLWIDTH NUMBER SIGN", 65283); - _unicodeCharacterMap.Add("FULLWIDTH DOLLAR SIGN", 65284); - _unicodeCharacterMap.Add("FULLWIDTH PERCENT SIGN", 65285); - _unicodeCharacterMap.Add("FULLWIDTH AMPERSAND", 65286); - _unicodeCharacterMap.Add("FULLWIDTH APOSTROPHE", 65287); - _unicodeCharacterMap.Add("FULLWIDTH LEFT PARENTHESIS", 65288); - _unicodeCharacterMap.Add("FULLWIDTH RIGHT PARENTHESIS", 65289); - _unicodeCharacterMap.Add("FULLWIDTH ASTERISK", 65290); - _unicodeCharacterMap.Add("FULLWIDTH PLUS SIGN", 65291); - _unicodeCharacterMap.Add("FULLWIDTH COMMA", 65292); - _unicodeCharacterMap.Add("FULLWIDTH HYPHEN MINUS", 65293); - _unicodeCharacterMap.Add("FULLWIDTH FULL STOP", 65294); - _unicodeCharacterMap.Add("FULLWIDTH SOLIDUS", 65295); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT ZERO", 65296); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT ONE", 65297); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT TWO", 65298); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT THREE", 65299); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT FOUR", 65300); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT FIVE", 65301); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT SIX", 65302); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT SEVEN", 65303); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT EIGHT", 65304); - _unicodeCharacterMap.Add("FULLWIDTH DIGIT NINE", 65305); - _unicodeCharacterMap.Add("FULLWIDTH COLON", 65306); - _unicodeCharacterMap.Add("FULLWIDTH SEMICOLON", 65307); - _unicodeCharacterMap.Add("FULLWIDTH LESS THAN SIGN", 65308); - _unicodeCharacterMap.Add("FULLWIDTH EQUALS SIGN", 65309); - _unicodeCharacterMap.Add("FULLWIDTH GREATER THAN SIGN", 65310); - _unicodeCharacterMap.Add("FULLWIDTH QUESTION MARK", 65311); - _unicodeCharacterMap.Add("FULLWIDTH COMMERCIAL AT", 65312); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER A", 65313); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER B", 65314); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER C", 65315); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER D", 65316); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER E", 65317); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER F", 65318); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER G", 65319); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER H", 65320); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER I", 65321); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER J", 65322); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER K", 65323); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER L", 65324); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER M", 65325); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER N", 65326); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER O", 65327); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER P", 65328); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER Q", 65329); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER R", 65330); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER S", 65331); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER T", 65332); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER U", 65333); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER V", 65334); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER W", 65335); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER X", 65336); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER Y", 65337); - _unicodeCharacterMap.Add("FULLWIDTH LATIN CAPITAL LETTER Z", 65338); - _unicodeCharacterMap.Add("FULLWIDTH LEFT SQUARE BRACKET", 65339); - _unicodeCharacterMap.Add("FULLWIDTH REVERSE SOLIDUS", 65340); - _unicodeCharacterMap.Add("FULLWIDTH RIGHT SQUARE BRACKET", 65341); - _unicodeCharacterMap.Add("FULLWIDTH CIRCUMFLEX ACCENT", 65342); - _unicodeCharacterMap.Add("FULLWIDTH LOW LINE", 65343); - _unicodeCharacterMap.Add("FULLWIDTH GRAVE ACCENT", 65344); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER A", 65345); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER B", 65346); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER C", 65347); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER D", 65348); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER E", 65349); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER F", 65350); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER G", 65351); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER H", 65352); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER I", 65353); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER J", 65354); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER K", 65355); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER L", 65356); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER M", 65357); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER N", 65358); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER O", 65359); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER P", 65360); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER Q", 65361); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER R", 65362); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER S", 65363); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER T", 65364); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER U", 65365); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER V", 65366); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER W", 65367); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER X", 65368); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER Y", 65369); - _unicodeCharacterMap.Add("FULLWIDTH LATIN SMALL LETTER Z", 65370); - _unicodeCharacterMap.Add("FULLWIDTH LEFT CURLY BRACKET", 65371); - _unicodeCharacterMap.Add("FULLWIDTH VERTICAL LINE", 65372); - _unicodeCharacterMap.Add("FULLWIDTH RIGHT CURLY BRACKET", 65373); - _unicodeCharacterMap.Add("FULLWIDTH TILDE", 65374); - _unicodeCharacterMap.Add("FULLWIDTH LEFT WHITE PARENTHESIS", 65375); - _unicodeCharacterMap.Add("FULLWIDTH RIGHT WHITE PARENTHESIS", 65376); - _unicodeCharacterMap.Add("HALFWIDTH IDEOGRAPHIC FULL STOP", 65377); - _unicodeCharacterMap.Add("HALFWIDTH LEFT CORNER BRACKET", 65378); - _unicodeCharacterMap.Add("HALFWIDTH RIGHT CORNER BRACKET", 65379); - _unicodeCharacterMap.Add("HALFWIDTH IDEOGRAPHIC COMMA", 65380); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA MIDDLE DOT", 65381); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER WO", 65382); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL A", 65383); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL I", 65384); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL U", 65385); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL E", 65386); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL O", 65387); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL YA", 65388); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL YU", 65389); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL YO", 65390); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SMALL TU", 65391); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA HIRAGANA PROLONGED SOUND MARK", 65392); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER A", 65393); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER I", 65394); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER U", 65395); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER E", 65396); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER O", 65397); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER KA", 65398); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER KI", 65399); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER KU", 65400); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER KE", 65401); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER KO", 65402); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SA", 65403); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SI", 65404); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SU", 65405); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SE", 65406); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER SO", 65407); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER TA", 65408); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER TI", 65409); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER TU", 65410); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER TE", 65411); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER TO", 65412); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER NA", 65413); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER NI", 65414); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER NU", 65415); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER NE", 65416); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER NO", 65417); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER HA", 65418); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER HI", 65419); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER HU", 65420); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER HE", 65421); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER HO", 65422); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER MA", 65423); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER MI", 65424); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER MU", 65425); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER ME", 65426); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER MO", 65427); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER YA", 65428); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER YU", 65429); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER YO", 65430); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER RA", 65431); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER RI", 65432); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER RU", 65433); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER RE", 65434); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER RO", 65435); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER WA", 65436); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA LETTER N", 65437); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA VOICED SOUND MARK", 65438); - _unicodeCharacterMap.Add("HALFWIDTH KATAKANA SEMI VOICED SOUND MARK", 65439); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL FILLER", 65440); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER KIYEOK", 65441); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER SSANGKIYEOK", 65442); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER KIYEOK SIOS", 65443); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER NIEUN", 65444); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER NIEUN CIEUC", 65445); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER NIEUN HIEUH", 65446); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER TIKEUT", 65447); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER SSANGTIKEUT", 65448); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL", 65449); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL KIYEOK", 65450); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL MIEUM", 65451); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL PIEUP", 65452); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL SIOS", 65453); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL THIEUTH", 65454); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL PHIEUPH", 65455); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER RIEUL HIEUH", 65456); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER MIEUM", 65457); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER PIEUP", 65458); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER SSANGPIEUP", 65459); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER PIEUP SIOS", 65460); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER SIOS", 65461); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER SSANGSIOS", 65462); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER IEUNG", 65463); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER CIEUC", 65464); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER SSANGCIEUC", 65465); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER CHIEUCH", 65466); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER KHIEUKH", 65467); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER THIEUTH", 65468); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER PHIEUPH", 65469); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER HIEUH", 65470); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER A", 65474); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER AE", 65475); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER YA", 65476); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER YAE", 65477); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER EO", 65478); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER E", 65479); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER YEO", 65482); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER YE", 65483); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER O", 65484); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER WA", 65485); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER WAE", 65486); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER OE", 65487); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER YO", 65490); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER U", 65491); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER WEO", 65492); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER WE", 65493); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER WI", 65494); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER YU", 65495); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER EU", 65498); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER YI", 65499); - _unicodeCharacterMap.Add("HALFWIDTH HANGUL LETTER I", 65500); - _unicodeCharacterMap.Add("FULLWIDTH CENT SIGN", 65504); - _unicodeCharacterMap.Add("FULLWIDTH POUND SIGN", 65505); - _unicodeCharacterMap.Add("FULLWIDTH NOT SIGN", 65506); - _unicodeCharacterMap.Add("FULLWIDTH MACRON", 65507); - _unicodeCharacterMap.Add("FULLWIDTH BROKEN BAR", 65508); - _unicodeCharacterMap.Add("FULLWIDTH YEN SIGN", 65509); - _unicodeCharacterMap.Add("FULLWIDTH WON SIGN", 65510); - _unicodeCharacterMap.Add("HALFWIDTH FORMS LIGHT VERTICAL", 65512); - _unicodeCharacterMap.Add("HALFWIDTH LEFTWARDS ARROW", 65513); - _unicodeCharacterMap.Add("HALFWIDTH UPWARDS ARROW", 65514); - _unicodeCharacterMap.Add("HALFWIDTH RIGHTWARDS ARROW", 65515); - _unicodeCharacterMap.Add("HALFWIDTH DOWNWARDS ARROW", 65516); - _unicodeCharacterMap.Add("HALFWIDTH BLACK SQUARE", 65517); - _unicodeCharacterMap.Add("HALFWIDTH WHITE CIRCLE", 65518); - _unicodeCharacterMap.Add("INTERLINEAR ANNOTATION ANCHOR", 65529); - _unicodeCharacterMap.Add("INTERLINEAR ANNOTATION SEPARATOR", 65530); - _unicodeCharacterMap.Add("INTERLINEAR ANNOTATION TERMINATOR", 65531); - _unicodeCharacterMap.Add("OBJECT REPLACEMENT CHARACTER", 65532); - _unicodeCharacterMap.Add("REPLACEMENT CHARACTER", 65533); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B008 A", 65536); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B038 E", 65537); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B028 I", 65538); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B061 O", 65539); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B010 U", 65540); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B001 DA", 65541); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B045 DE", 65542); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B007 DI", 65543); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B014 DO", 65544); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B051 DU", 65545); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B057 JA", 65546); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B046 JE", 65547); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B036 JO", 65549); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B065 JU", 65550); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B077 KA", 65551); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B044 KE", 65552); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B067 KI", 65553); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B070 KO", 65554); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B081 KU", 65555); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B080 MA", 65556); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B013 ME", 65557); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B073 MI", 65558); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B015 MO", 65559); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B023 MU", 65560); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B006 NA", 65561); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B024 NE", 65562); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B030 NI", 65563); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B052 NO", 65564); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B055 NU", 65565); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B003 PA", 65566); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B072 PE", 65567); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B039 PI", 65568); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B011 PO", 65569); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B050 PU", 65570); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B016 QA", 65571); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B078 QE", 65572); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B021 QI", 65573); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B032 QO", 65574); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B060 RA", 65576); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B027 RE", 65577); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B053 RI", 65578); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B002 RO", 65579); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B026 RU", 65580); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B031 SA", 65581); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B009 SE", 65582); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B041 SI", 65583); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B012 SO", 65584); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B058 SU", 65585); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B059 TA", 65586); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B004 TE", 65587); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B037 TI", 65588); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B005 TO", 65589); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B069 TU", 65590); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B054 WA", 65591); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B075 WE", 65592); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B040 WI", 65593); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B042 WO", 65594); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B017 ZA", 65596); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B074 ZE", 65597); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B020 ZO", 65599); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B025 A2", 65600); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B043 A3", 65601); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B085 AU", 65602); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B071 DWE", 65603); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B090 DWO", 65604); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B048 NWA", 65605); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B029 PU2", 65606); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B062 PTE", 65607); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B076 RA2", 65608); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B033 RA3", 65609); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B068 RO2", 65610); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B066 TA2", 65611); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B087 TWE", 65612); - _unicodeCharacterMap.Add("LINEAR B SYLLABLE B091 TWO", 65613); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B018", 65616); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B019", 65617); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B022", 65618); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B034", 65619); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B047", 65620); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B049", 65621); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B056", 65622); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B063", 65623); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B064", 65624); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B079", 65625); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B082", 65626); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B083", 65627); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B086", 65628); - _unicodeCharacterMap.Add("LINEAR B SYMBOL B089", 65629); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B100 MAN", 65664); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B102 WOMAN", 65665); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B104 DEER", 65666); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B105 EQUID", 65667); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B105F MARE", 65668); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B105M STALLION", 65669); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B106F EWE", 65670); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B106M RAM", 65671); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B107F SHE GOAT", 65672); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B107M HE GOAT", 65673); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B108F SOW", 65674); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B108M BOAR", 65675); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B109F COW", 65676); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B109M BULL", 65677); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B120 WHEAT", 65678); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B121 BARLEY", 65679); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B122 OLIVE", 65680); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B123 SPICE", 65681); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B125 CYPERUS", 65682); - _unicodeCharacterMap.Add("LINEAR B MONOGRAM B127 KAPO", 65683); - _unicodeCharacterMap.Add("LINEAR B MONOGRAM B128 KANAKO", 65684); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B130 OIL", 65685); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B131 WINE", 65686); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B132", 65687); - _unicodeCharacterMap.Add("LINEAR B MONOGRAM B133 AREPA", 65688); - _unicodeCharacterMap.Add("LINEAR B MONOGRAM B135 MERI", 65689); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B140 BRONZE", 65690); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B141 GOLD", 65691); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B142", 65692); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B145 WOOL", 65693); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B146", 65694); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B150", 65695); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B151 HORN", 65696); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B152", 65697); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B153", 65698); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B154", 65699); - _unicodeCharacterMap.Add("LINEAR B MONOGRAM B156 TURO2", 65700); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B157", 65701); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B158", 65702); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B159 CLOTH", 65703); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B160", 65704); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B161", 65705); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B162 GARMENT", 65706); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B163 ARMOUR", 65707); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B164", 65708); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B165", 65709); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B166", 65710); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B167", 65711); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B168", 65712); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B169", 65713); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B170", 65714); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B171", 65715); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B172", 65716); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B173 MONTH", 65717); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B174", 65718); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B176 TREE", 65719); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B177", 65720); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B178", 65721); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B179", 65722); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B180", 65723); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B181", 65724); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B182", 65725); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B183", 65726); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B184", 65727); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B185", 65728); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B189", 65729); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B190", 65730); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B191 HELMET", 65731); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B220 FOOTSTOOL", 65732); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B225 BATHTUB", 65733); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B230 SPEAR", 65734); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B231 ARROW", 65735); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B232", 65736); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B233 SWORD", 65737); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B234", 65738); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B236", 65739); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B240 WHEELED CHARIOT", 65740); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B241 CHARIOT", 65741); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B242 CHARIOT FRAME", 65742); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B243 WHEEL", 65743); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B245", 65744); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B246", 65745); - _unicodeCharacterMap.Add("LINEAR B MONOGRAM B247 DIPTE", 65746); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B248", 65747); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B249", 65748); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B251", 65749); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B252", 65750); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B253", 65751); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B254 DART", 65752); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B255", 65753); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B256", 65754); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B257", 65755); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B258", 65756); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM B259", 65757); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B155", 65758); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B200", 65759); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B201", 65760); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B202", 65761); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B203", 65762); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B204", 65763); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B205", 65764); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B206", 65765); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B207", 65766); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B208", 65767); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B209", 65768); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B210", 65769); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B211", 65770); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B212", 65771); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B213", 65772); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B214", 65773); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B215", 65774); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B216", 65775); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B217", 65776); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B218", 65777); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B219", 65778); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B221", 65779); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B222", 65780); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B226", 65781); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B227", 65782); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B228", 65783); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B229", 65784); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B250", 65785); - _unicodeCharacterMap.Add("LINEAR B IDEOGRAM VESSEL B305", 65786); - _unicodeCharacterMap.Add("AEGEAN WORD SEPARATOR LINE", 65792); - _unicodeCharacterMap.Add("AEGEAN WORD SEPARATOR DOT", 65793); - _unicodeCharacterMap.Add("AEGEAN CHECK MARK", 65794); - _unicodeCharacterMap.Add("AEGEAN NUMBER ONE", 65799); - _unicodeCharacterMap.Add("AEGEAN NUMBER TWO", 65800); - _unicodeCharacterMap.Add("AEGEAN NUMBER THREE", 65801); - _unicodeCharacterMap.Add("AEGEAN NUMBER FOUR", 65802); - _unicodeCharacterMap.Add("AEGEAN NUMBER FIVE", 65803); - _unicodeCharacterMap.Add("AEGEAN NUMBER SIX", 65804); - _unicodeCharacterMap.Add("AEGEAN NUMBER SEVEN", 65805); - _unicodeCharacterMap.Add("AEGEAN NUMBER EIGHT", 65806); - _unicodeCharacterMap.Add("AEGEAN NUMBER NINE", 65807); - _unicodeCharacterMap.Add("AEGEAN NUMBER TEN", 65808); - _unicodeCharacterMap.Add("AEGEAN NUMBER TWENTY", 65809); - _unicodeCharacterMap.Add("AEGEAN NUMBER THIRTY", 65810); - _unicodeCharacterMap.Add("AEGEAN NUMBER FORTY", 65811); - _unicodeCharacterMap.Add("AEGEAN NUMBER FIFTY", 65812); - _unicodeCharacterMap.Add("AEGEAN NUMBER SIXTY", 65813); - _unicodeCharacterMap.Add("AEGEAN NUMBER SEVENTY", 65814); - _unicodeCharacterMap.Add("AEGEAN NUMBER EIGHTY", 65815); - _unicodeCharacterMap.Add("AEGEAN NUMBER NINETY", 65816); - _unicodeCharacterMap.Add("AEGEAN NUMBER ONE HUNDRED", 65817); - _unicodeCharacterMap.Add("AEGEAN NUMBER TWO HUNDRED", 65818); - _unicodeCharacterMap.Add("AEGEAN NUMBER THREE HUNDRED", 65819); - _unicodeCharacterMap.Add("AEGEAN NUMBER FOUR HUNDRED", 65820); - _unicodeCharacterMap.Add("AEGEAN NUMBER FIVE HUNDRED", 65821); - _unicodeCharacterMap.Add("AEGEAN NUMBER SIX HUNDRED", 65822); - _unicodeCharacterMap.Add("AEGEAN NUMBER SEVEN HUNDRED", 65823); - _unicodeCharacterMap.Add("AEGEAN NUMBER EIGHT HUNDRED", 65824); - _unicodeCharacterMap.Add("AEGEAN NUMBER NINE HUNDRED", 65825); - _unicodeCharacterMap.Add("AEGEAN NUMBER ONE THOUSAND", 65826); - _unicodeCharacterMap.Add("AEGEAN NUMBER TWO THOUSAND", 65827); - _unicodeCharacterMap.Add("AEGEAN NUMBER THREE THOUSAND", 65828); - _unicodeCharacterMap.Add("AEGEAN NUMBER FOUR THOUSAND", 65829); - _unicodeCharacterMap.Add("AEGEAN NUMBER FIVE THOUSAND", 65830); - _unicodeCharacterMap.Add("AEGEAN NUMBER SIX THOUSAND", 65831); - _unicodeCharacterMap.Add("AEGEAN NUMBER SEVEN THOUSAND", 65832); - _unicodeCharacterMap.Add("AEGEAN NUMBER EIGHT THOUSAND", 65833); - _unicodeCharacterMap.Add("AEGEAN NUMBER NINE THOUSAND", 65834); - _unicodeCharacterMap.Add("AEGEAN NUMBER TEN THOUSAND", 65835); - _unicodeCharacterMap.Add("AEGEAN NUMBER TWENTY THOUSAND", 65836); - _unicodeCharacterMap.Add("AEGEAN NUMBER THIRTY THOUSAND", 65837); - _unicodeCharacterMap.Add("AEGEAN NUMBER FORTY THOUSAND", 65838); - _unicodeCharacterMap.Add("AEGEAN NUMBER FIFTY THOUSAND", 65839); - _unicodeCharacterMap.Add("AEGEAN NUMBER SIXTY THOUSAND", 65840); - _unicodeCharacterMap.Add("AEGEAN NUMBER SEVENTY THOUSAND", 65841); - _unicodeCharacterMap.Add("AEGEAN NUMBER EIGHTY THOUSAND", 65842); - _unicodeCharacterMap.Add("AEGEAN NUMBER NINETY THOUSAND", 65843); - _unicodeCharacterMap.Add("AEGEAN WEIGHT BASE UNIT", 65847); - _unicodeCharacterMap.Add("AEGEAN WEIGHT FIRST SUBUNIT", 65848); - _unicodeCharacterMap.Add("AEGEAN WEIGHT SECOND SUBUNIT", 65849); - _unicodeCharacterMap.Add("AEGEAN WEIGHT THIRD SUBUNIT", 65850); - _unicodeCharacterMap.Add("AEGEAN WEIGHT FOURTH SUBUNIT", 65851); - _unicodeCharacterMap.Add("AEGEAN DRY MEASURE FIRST SUBUNIT", 65852); - _unicodeCharacterMap.Add("AEGEAN LIQUID MEASURE FIRST SUBUNIT", 65853); - _unicodeCharacterMap.Add("AEGEAN MEASURE SECOND SUBUNIT", 65854); - _unicodeCharacterMap.Add("AEGEAN MEASURE THIRD SUBUNIT", 65855); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC ONE QUARTER", 65856); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC ONE HALF", 65857); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC ONE DRACHMA", 65858); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE", 65859); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIFTY", 65860); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE HUNDRED", 65861); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE THOUSAND", 65862); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIFTY THOUSAND", 65863); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE TALENTS", 65864); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC TEN TALENTS", 65865); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIFTY TALENTS", 65866); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS", 65867); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS", 65868); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS", 65869); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS", 65870); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE STATERS", 65871); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC TEN STATERS", 65872); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIFTY STATERS", 65873); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS", 65874); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS", 65875); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS", 65876); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS", 65877); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS", 65878); - _unicodeCharacterMap.Add("GREEK ACROPHONIC ATTIC TEN MNAS", 65879); - _unicodeCharacterMap.Add("GREEK ACROPHONIC HERAEUM ONE PLETHRON", 65880); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN ONE", 65881); - _unicodeCharacterMap.Add("GREEK ACROPHONIC HERMIONIAN ONE", 65882); - _unicodeCharacterMap.Add("GREEK ACROPHONIC EPIDAUREAN TWO", 65883); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN TWO", 65884); - _unicodeCharacterMap.Add("GREEK ACROPHONIC CYRENAIC TWO DRACHMAS", 65885); - _unicodeCharacterMap.Add("GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS", 65886); - _unicodeCharacterMap.Add("GREEK ACROPHONIC TROEZENIAN FIVE", 65887); - _unicodeCharacterMap.Add("GREEK ACROPHONIC TROEZENIAN TEN", 65888); - _unicodeCharacterMap.Add("GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM", 65889); - _unicodeCharacterMap.Add("GREEK ACROPHONIC HERMIONIAN TEN", 65890); - _unicodeCharacterMap.Add("GREEK ACROPHONIC MESSENIAN TEN", 65891); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN TEN", 65892); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN THIRTY", 65893); - _unicodeCharacterMap.Add("GREEK ACROPHONIC TROEZENIAN FIFTY", 65894); - _unicodeCharacterMap.Add("GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM", 65895); - _unicodeCharacterMap.Add("GREEK ACROPHONIC HERMIONIAN FIFTY", 65896); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN FIFTY", 65897); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN ONE HUNDRED", 65898); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN THREE HUNDRED", 65899); - _unicodeCharacterMap.Add("GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED", 65900); - _unicodeCharacterMap.Add("GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED", 65901); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN FIVE HUNDRED", 65902); - _unicodeCharacterMap.Add("GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED", 65903); - _unicodeCharacterMap.Add("GREEK ACROPHONIC NAXIAN FIVE HUNDRED", 65904); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN ONE THOUSAND", 65905); - _unicodeCharacterMap.Add("GREEK ACROPHONIC THESPIAN FIVE THOUSAND", 65906); - _unicodeCharacterMap.Add("GREEK ACROPHONIC DELPHIC FIVE MNAS", 65907); - _unicodeCharacterMap.Add("GREEK ACROPHONIC STRATIAN FIFTY MNAS", 65908); - _unicodeCharacterMap.Add("GREEK ONE HALF SIGN", 65909); - _unicodeCharacterMap.Add("GREEK ONE HALF SIGN ALTERNATE FORM", 65910); - _unicodeCharacterMap.Add("GREEK TWO THIRDS SIGN", 65911); - _unicodeCharacterMap.Add("GREEK THREE QUARTERS SIGN", 65912); - _unicodeCharacterMap.Add("GREEK YEAR SIGN", 65913); - _unicodeCharacterMap.Add("GREEK TALENT SIGN", 65914); - _unicodeCharacterMap.Add("GREEK DRACHMA SIGN", 65915); - _unicodeCharacterMap.Add("GREEK OBOL SIGN", 65916); - _unicodeCharacterMap.Add("GREEK TWO OBOLS SIGN", 65917); - _unicodeCharacterMap.Add("GREEK THREE OBOLS SIGN", 65918); - _unicodeCharacterMap.Add("GREEK FOUR OBOLS SIGN", 65919); - _unicodeCharacterMap.Add("GREEK FIVE OBOLS SIGN", 65920); - _unicodeCharacterMap.Add("GREEK METRETES SIGN", 65921); - _unicodeCharacterMap.Add("GREEK KYATHOS BASE SIGN", 65922); - _unicodeCharacterMap.Add("GREEK LITRA SIGN", 65923); - _unicodeCharacterMap.Add("GREEK OUNKIA SIGN", 65924); - _unicodeCharacterMap.Add("GREEK XESTES SIGN", 65925); - _unicodeCharacterMap.Add("GREEK ARTABE SIGN", 65926); - _unicodeCharacterMap.Add("GREEK AROURA SIGN", 65927); - _unicodeCharacterMap.Add("GREEK GRAMMA SIGN", 65928); - _unicodeCharacterMap.Add("GREEK TRYBLION BASE SIGN", 65929); - _unicodeCharacterMap.Add("GREEK ZERO SIGN", 65930); - _unicodeCharacterMap.Add("GREEK ONE QUARTER SIGN", 65931); - _unicodeCharacterMap.Add("GREEK SINUSOID SIGN", 65932); - _unicodeCharacterMap.Add("GREEK INDICTION SIGN", 65933); - _unicodeCharacterMap.Add("NOMISMA SIGN", 65934); - _unicodeCharacterMap.Add("ROMAN SEXTANS SIGN", 65936); - _unicodeCharacterMap.Add("ROMAN UNCIA SIGN", 65937); - _unicodeCharacterMap.Add("ROMAN SEMUNCIA SIGN", 65938); - _unicodeCharacterMap.Add("ROMAN SEXTULA SIGN", 65939); - _unicodeCharacterMap.Add("ROMAN DIMIDIA SEXTULA SIGN", 65940); - _unicodeCharacterMap.Add("ROMAN SILIQUA SIGN", 65941); - _unicodeCharacterMap.Add("ROMAN DENARIUS SIGN", 65942); - _unicodeCharacterMap.Add("ROMAN QUINARIUS SIGN", 65943); - _unicodeCharacterMap.Add("ROMAN SESTERTIUS SIGN", 65944); - _unicodeCharacterMap.Add("ROMAN DUPONDIUS SIGN", 65945); - _unicodeCharacterMap.Add("ROMAN AS SIGN", 65946); - _unicodeCharacterMap.Add("ROMAN CENTURIAL SIGN", 65947); - _unicodeCharacterMap.Add("GREEK SYMBOL TAU RHO", 65952); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN PEDESTRIAN", 66000); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN PLUMED HEAD", 66001); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN TATTOOED HEAD", 66002); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN CAPTIVE", 66003); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN CHILD", 66004); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN WOMAN", 66005); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN HELMET", 66006); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN GAUNTLET", 66007); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN TIARA", 66008); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN ARROW", 66009); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN BOW", 66010); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN SHIELD", 66011); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN CLUB", 66012); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN MANACLES", 66013); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN MATTOCK", 66014); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN SAW", 66015); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN LID", 66016); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN BOOMERANG", 66017); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN CARPENTRY PLANE", 66018); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN DOLIUM", 66019); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN COMB", 66020); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN SLING", 66021); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN COLUMN", 66022); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN BEEHIVE", 66023); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN SHIP", 66024); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN HORN", 66025); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN HIDE", 66026); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN BULLS LEG", 66027); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN CAT", 66028); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN RAM", 66029); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN EAGLE", 66030); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN DOVE", 66031); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN TUNNY", 66032); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN BEE", 66033); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN PLANE TREE", 66034); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN VINE", 66035); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN PAPYRUS", 66036); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN ROSETTE", 66037); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN LILY", 66038); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN OX BACK", 66039); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN FLUTE", 66040); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN GRATER", 66041); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN STRAINER", 66042); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN SMALL AXE", 66043); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN WAVY BAND", 66044); - _unicodeCharacterMap.Add("PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE", 66045); - _unicodeCharacterMap.Add("LYCIAN LETTER A", 66176); - _unicodeCharacterMap.Add("LYCIAN LETTER E", 66177); - _unicodeCharacterMap.Add("LYCIAN LETTER B", 66178); - _unicodeCharacterMap.Add("LYCIAN LETTER BH", 66179); - _unicodeCharacterMap.Add("LYCIAN LETTER G", 66180); - _unicodeCharacterMap.Add("LYCIAN LETTER D", 66181); - _unicodeCharacterMap.Add("LYCIAN LETTER I", 66182); - _unicodeCharacterMap.Add("LYCIAN LETTER W", 66183); - _unicodeCharacterMap.Add("LYCIAN LETTER Z", 66184); - _unicodeCharacterMap.Add("LYCIAN LETTER TH", 66185); - _unicodeCharacterMap.Add("LYCIAN LETTER J", 66186); - _unicodeCharacterMap.Add("LYCIAN LETTER K", 66187); - _unicodeCharacterMap.Add("LYCIAN LETTER Q", 66188); - _unicodeCharacterMap.Add("LYCIAN LETTER L", 66189); - _unicodeCharacterMap.Add("LYCIAN LETTER M", 66190); - _unicodeCharacterMap.Add("LYCIAN LETTER N", 66191); - _unicodeCharacterMap.Add("LYCIAN LETTER MM", 66192); - _unicodeCharacterMap.Add("LYCIAN LETTER NN", 66193); - _unicodeCharacterMap.Add("LYCIAN LETTER U", 66194); - _unicodeCharacterMap.Add("LYCIAN LETTER P", 66195); - _unicodeCharacterMap.Add("LYCIAN LETTER KK", 66196); - _unicodeCharacterMap.Add("LYCIAN LETTER R", 66197); - _unicodeCharacterMap.Add("LYCIAN LETTER S", 66198); - _unicodeCharacterMap.Add("LYCIAN LETTER T", 66199); - _unicodeCharacterMap.Add("LYCIAN LETTER TT", 66200); - _unicodeCharacterMap.Add("LYCIAN LETTER AN", 66201); - _unicodeCharacterMap.Add("LYCIAN LETTER EN", 66202); - _unicodeCharacterMap.Add("LYCIAN LETTER H", 66203); - _unicodeCharacterMap.Add("LYCIAN LETTER X", 66204); - _unicodeCharacterMap.Add("CARIAN LETTER A", 66208); - _unicodeCharacterMap.Add("CARIAN LETTER P2", 66209); - _unicodeCharacterMap.Add("CARIAN LETTER D", 66210); - _unicodeCharacterMap.Add("CARIAN LETTER L", 66211); - _unicodeCharacterMap.Add("CARIAN LETTER UUU", 66212); - _unicodeCharacterMap.Add("CARIAN LETTER R", 66213); - _unicodeCharacterMap.Add("CARIAN LETTER LD", 66214); - _unicodeCharacterMap.Add("CARIAN LETTER A2", 66215); - _unicodeCharacterMap.Add("CARIAN LETTER Q", 66216); - _unicodeCharacterMap.Add("CARIAN LETTER B", 66217); - _unicodeCharacterMap.Add("CARIAN LETTER M", 66218); - _unicodeCharacterMap.Add("CARIAN LETTER O", 66219); - _unicodeCharacterMap.Add("CARIAN LETTER D2", 66220); - _unicodeCharacterMap.Add("CARIAN LETTER T", 66221); - _unicodeCharacterMap.Add("CARIAN LETTER SH", 66222); - _unicodeCharacterMap.Add("CARIAN LETTER SH2", 66223); - _unicodeCharacterMap.Add("CARIAN LETTER S", 66224); - _unicodeCharacterMap.Add("CARIAN LETTER C 18", 66225); - _unicodeCharacterMap.Add("CARIAN LETTER U", 66226); - _unicodeCharacterMap.Add("CARIAN LETTER NN", 66227); - _unicodeCharacterMap.Add("CARIAN LETTER X", 66228); - _unicodeCharacterMap.Add("CARIAN LETTER N", 66229); - _unicodeCharacterMap.Add("CARIAN LETTER TT2", 66230); - _unicodeCharacterMap.Add("CARIAN LETTER P", 66231); - _unicodeCharacterMap.Add("CARIAN LETTER SS", 66232); - _unicodeCharacterMap.Add("CARIAN LETTER I", 66233); - _unicodeCharacterMap.Add("CARIAN LETTER E", 66234); - _unicodeCharacterMap.Add("CARIAN LETTER UUUU", 66235); - _unicodeCharacterMap.Add("CARIAN LETTER K", 66236); - _unicodeCharacterMap.Add("CARIAN LETTER K2", 66237); - _unicodeCharacterMap.Add("CARIAN LETTER ND", 66238); - _unicodeCharacterMap.Add("CARIAN LETTER UU", 66239); - _unicodeCharacterMap.Add("CARIAN LETTER G", 66240); - _unicodeCharacterMap.Add("CARIAN LETTER G2", 66241); - _unicodeCharacterMap.Add("CARIAN LETTER ST", 66242); - _unicodeCharacterMap.Add("CARIAN LETTER ST2", 66243); - _unicodeCharacterMap.Add("CARIAN LETTER NG", 66244); - _unicodeCharacterMap.Add("CARIAN LETTER II", 66245); - _unicodeCharacterMap.Add("CARIAN LETTER C 39", 66246); - _unicodeCharacterMap.Add("CARIAN LETTER TT", 66247); - _unicodeCharacterMap.Add("CARIAN LETTER UUU2", 66248); - _unicodeCharacterMap.Add("CARIAN LETTER RR", 66249); - _unicodeCharacterMap.Add("CARIAN LETTER MB", 66250); - _unicodeCharacterMap.Add("CARIAN LETTER MB2", 66251); - _unicodeCharacterMap.Add("CARIAN LETTER MB3", 66252); - _unicodeCharacterMap.Add("CARIAN LETTER MB4", 66253); - _unicodeCharacterMap.Add("CARIAN LETTER LD2", 66254); - _unicodeCharacterMap.Add("CARIAN LETTER E2", 66255); - _unicodeCharacterMap.Add("CARIAN LETTER UUU3", 66256); - _unicodeCharacterMap.Add("COPTIC EPACT THOUSANDS MARK", 66272); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT ONE", 66273); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT TWO", 66274); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT THREE", 66275); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT FOUR", 66276); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT FIVE", 66277); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT SIX", 66278); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT SEVEN", 66279); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT EIGHT", 66280); - _unicodeCharacterMap.Add("COPTIC EPACT DIGIT NINE", 66281); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER TEN", 66282); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER TWENTY", 66283); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER THIRTY", 66284); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER FORTY", 66285); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER FIFTY", 66286); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER SIXTY", 66287); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER SEVENTY", 66288); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER EIGHTY", 66289); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER NINETY", 66290); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER ONE HUNDRED", 66291); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER TWO HUNDRED", 66292); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER THREE HUNDRED", 66293); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER FOUR HUNDRED", 66294); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER FIVE HUNDRED", 66295); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER SIX HUNDRED", 66296); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER SEVEN HUNDRED", 66297); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER EIGHT HUNDRED", 66298); - _unicodeCharacterMap.Add("COPTIC EPACT NUMBER NINE HUNDRED", 66299); - _unicodeCharacterMap.Add("OLD ITALIC LETTER A", 66304); - _unicodeCharacterMap.Add("OLD ITALIC LETTER BE", 66305); - _unicodeCharacterMap.Add("OLD ITALIC LETTER KE", 66306); - _unicodeCharacterMap.Add("OLD ITALIC LETTER DE", 66307); - _unicodeCharacterMap.Add("OLD ITALIC LETTER E", 66308); - _unicodeCharacterMap.Add("OLD ITALIC LETTER VE", 66309); - _unicodeCharacterMap.Add("OLD ITALIC LETTER ZE", 66310); - _unicodeCharacterMap.Add("OLD ITALIC LETTER HE", 66311); - _unicodeCharacterMap.Add("OLD ITALIC LETTER THE", 66312); - _unicodeCharacterMap.Add("OLD ITALIC LETTER I", 66313); - _unicodeCharacterMap.Add("OLD ITALIC LETTER KA", 66314); - _unicodeCharacterMap.Add("OLD ITALIC LETTER EL", 66315); - _unicodeCharacterMap.Add("OLD ITALIC LETTER EM", 66316); - _unicodeCharacterMap.Add("OLD ITALIC LETTER EN", 66317); - _unicodeCharacterMap.Add("OLD ITALIC LETTER ESH", 66318); - _unicodeCharacterMap.Add("OLD ITALIC LETTER O", 66319); - _unicodeCharacterMap.Add("OLD ITALIC LETTER PE", 66320); - _unicodeCharacterMap.Add("OLD ITALIC LETTER SHE", 66321); - _unicodeCharacterMap.Add("OLD ITALIC LETTER KU", 66322); - _unicodeCharacterMap.Add("OLD ITALIC LETTER ER", 66323); - _unicodeCharacterMap.Add("OLD ITALIC LETTER ES", 66324); - _unicodeCharacterMap.Add("OLD ITALIC LETTER TE", 66325); - _unicodeCharacterMap.Add("OLD ITALIC LETTER U", 66326); - _unicodeCharacterMap.Add("OLD ITALIC LETTER EKS", 66327); - _unicodeCharacterMap.Add("OLD ITALIC LETTER PHE", 66328); - _unicodeCharacterMap.Add("OLD ITALIC LETTER KHE", 66329); - _unicodeCharacterMap.Add("OLD ITALIC LETTER EF", 66330); - _unicodeCharacterMap.Add("OLD ITALIC LETTER ERS", 66331); - _unicodeCharacterMap.Add("OLD ITALIC LETTER CHE", 66332); - _unicodeCharacterMap.Add("OLD ITALIC LETTER II", 66333); - _unicodeCharacterMap.Add("OLD ITALIC LETTER UU", 66334); - _unicodeCharacterMap.Add("OLD ITALIC LETTER ESS", 66335); - _unicodeCharacterMap.Add("OLD ITALIC NUMERAL ONE", 66336); - _unicodeCharacterMap.Add("OLD ITALIC NUMERAL FIVE", 66337); - _unicodeCharacterMap.Add("OLD ITALIC NUMERAL TEN", 66338); - _unicodeCharacterMap.Add("OLD ITALIC NUMERAL FIFTY", 66339); - _unicodeCharacterMap.Add("GOTHIC LETTER AHSA", 66352); - _unicodeCharacterMap.Add("GOTHIC LETTER BAIRKAN", 66353); - _unicodeCharacterMap.Add("GOTHIC LETTER GIBA", 66354); - _unicodeCharacterMap.Add("GOTHIC LETTER DAGS", 66355); - _unicodeCharacterMap.Add("GOTHIC LETTER AIHVUS", 66356); - _unicodeCharacterMap.Add("GOTHIC LETTER QAIRTHRA", 66357); - _unicodeCharacterMap.Add("GOTHIC LETTER IUJA", 66358); - _unicodeCharacterMap.Add("GOTHIC LETTER HAGL", 66359); - _unicodeCharacterMap.Add("GOTHIC LETTER THIUTH", 66360); - _unicodeCharacterMap.Add("GOTHIC LETTER EIS", 66361); - _unicodeCharacterMap.Add("GOTHIC LETTER KUSMA", 66362); - _unicodeCharacterMap.Add("GOTHIC LETTER LAGUS", 66363); - _unicodeCharacterMap.Add("GOTHIC LETTER MANNA", 66364); - _unicodeCharacterMap.Add("GOTHIC LETTER NAUTHS", 66365); - _unicodeCharacterMap.Add("GOTHIC LETTER JER", 66366); - _unicodeCharacterMap.Add("GOTHIC LETTER URUS", 66367); - _unicodeCharacterMap.Add("GOTHIC LETTER PAIRTHRA", 66368); - _unicodeCharacterMap.Add("GOTHIC LETTER NINETY", 66369); - _unicodeCharacterMap.Add("GOTHIC LETTER RAIDA", 66370); - _unicodeCharacterMap.Add("GOTHIC LETTER SAUIL", 66371); - _unicodeCharacterMap.Add("GOTHIC LETTER TEIWS", 66372); - _unicodeCharacterMap.Add("GOTHIC LETTER WINJA", 66373); - _unicodeCharacterMap.Add("GOTHIC LETTER FAIHU", 66374); - _unicodeCharacterMap.Add("GOTHIC LETTER IGGWS", 66375); - _unicodeCharacterMap.Add("GOTHIC LETTER HWAIR", 66376); - _unicodeCharacterMap.Add("GOTHIC LETTER OTHAL", 66377); - _unicodeCharacterMap.Add("GOTHIC LETTER NINE HUNDRED", 66378); - _unicodeCharacterMap.Add("OLD PERMIC LETTER AN", 66384); - _unicodeCharacterMap.Add("OLD PERMIC LETTER BUR", 66385); - _unicodeCharacterMap.Add("OLD PERMIC LETTER GAI", 66386); - _unicodeCharacterMap.Add("OLD PERMIC LETTER DOI", 66387); - _unicodeCharacterMap.Add("OLD PERMIC LETTER E", 66388); - _unicodeCharacterMap.Add("OLD PERMIC LETTER ZHOI", 66389); - _unicodeCharacterMap.Add("OLD PERMIC LETTER DZHOI", 66390); - _unicodeCharacterMap.Add("OLD PERMIC LETTER ZATA", 66391); - _unicodeCharacterMap.Add("OLD PERMIC LETTER DZITA", 66392); - _unicodeCharacterMap.Add("OLD PERMIC LETTER I", 66393); - _unicodeCharacterMap.Add("OLD PERMIC LETTER KOKE", 66394); - _unicodeCharacterMap.Add("OLD PERMIC LETTER LEI", 66395); - _unicodeCharacterMap.Add("OLD PERMIC LETTER MENOE", 66396); - _unicodeCharacterMap.Add("OLD PERMIC LETTER NENOE", 66397); - _unicodeCharacterMap.Add("OLD PERMIC LETTER VOOI", 66398); - _unicodeCharacterMap.Add("OLD PERMIC LETTER PEEI", 66399); - _unicodeCharacterMap.Add("OLD PERMIC LETTER REI", 66400); - _unicodeCharacterMap.Add("OLD PERMIC LETTER SII", 66401); - _unicodeCharacterMap.Add("OLD PERMIC LETTER TAI", 66402); - _unicodeCharacterMap.Add("OLD PERMIC LETTER U", 66403); - _unicodeCharacterMap.Add("OLD PERMIC LETTER CHERY", 66404); - _unicodeCharacterMap.Add("OLD PERMIC LETTER SHOOI", 66405); - _unicodeCharacterMap.Add("OLD PERMIC LETTER SHCHOOI", 66406); - _unicodeCharacterMap.Add("OLD PERMIC LETTER YRY", 66407); - _unicodeCharacterMap.Add("OLD PERMIC LETTER YERU", 66408); - _unicodeCharacterMap.Add("OLD PERMIC LETTER O", 66409); - _unicodeCharacterMap.Add("OLD PERMIC LETTER OO", 66410); - _unicodeCharacterMap.Add("OLD PERMIC LETTER EF", 66411); - _unicodeCharacterMap.Add("OLD PERMIC LETTER HA", 66412); - _unicodeCharacterMap.Add("OLD PERMIC LETTER TSIU", 66413); - _unicodeCharacterMap.Add("OLD PERMIC LETTER VER", 66414); - _unicodeCharacterMap.Add("OLD PERMIC LETTER YER", 66415); - _unicodeCharacterMap.Add("OLD PERMIC LETTER YERI", 66416); - _unicodeCharacterMap.Add("OLD PERMIC LETTER YAT", 66417); - _unicodeCharacterMap.Add("OLD PERMIC LETTER IE", 66418); - _unicodeCharacterMap.Add("OLD PERMIC LETTER YU", 66419); - _unicodeCharacterMap.Add("OLD PERMIC LETTER YA", 66420); - _unicodeCharacterMap.Add("OLD PERMIC LETTER IA", 66421); - _unicodeCharacterMap.Add("COMBINING OLD PERMIC LETTER AN", 66422); - _unicodeCharacterMap.Add("COMBINING OLD PERMIC LETTER DOI", 66423); - _unicodeCharacterMap.Add("COMBINING OLD PERMIC LETTER ZATA", 66424); - _unicodeCharacterMap.Add("COMBINING OLD PERMIC LETTER NENOE", 66425); - _unicodeCharacterMap.Add("COMBINING OLD PERMIC LETTER SII", 66426); - _unicodeCharacterMap.Add("UGARITIC LETTER ALPA", 66432); - _unicodeCharacterMap.Add("UGARITIC LETTER BETA", 66433); - _unicodeCharacterMap.Add("UGARITIC LETTER GAMLA", 66434); - _unicodeCharacterMap.Add("UGARITIC LETTER KHA", 66435); - _unicodeCharacterMap.Add("UGARITIC LETTER DELTA", 66436); - _unicodeCharacterMap.Add("UGARITIC LETTER HO", 66437); - _unicodeCharacterMap.Add("UGARITIC LETTER WO", 66438); - _unicodeCharacterMap.Add("UGARITIC LETTER ZETA", 66439); - _unicodeCharacterMap.Add("UGARITIC LETTER HOTA", 66440); - _unicodeCharacterMap.Add("UGARITIC LETTER TET", 66441); - _unicodeCharacterMap.Add("UGARITIC LETTER YOD", 66442); - _unicodeCharacterMap.Add("UGARITIC LETTER KAF", 66443); - _unicodeCharacterMap.Add("UGARITIC LETTER SHIN", 66444); - _unicodeCharacterMap.Add("UGARITIC LETTER LAMDA", 66445); - _unicodeCharacterMap.Add("UGARITIC LETTER MEM", 66446); - _unicodeCharacterMap.Add("UGARITIC LETTER DHAL", 66447); - _unicodeCharacterMap.Add("UGARITIC LETTER NUN", 66448); - _unicodeCharacterMap.Add("UGARITIC LETTER ZU", 66449); - _unicodeCharacterMap.Add("UGARITIC LETTER SAMKA", 66450); - _unicodeCharacterMap.Add("UGARITIC LETTER AIN", 66451); - _unicodeCharacterMap.Add("UGARITIC LETTER PU", 66452); - _unicodeCharacterMap.Add("UGARITIC LETTER SADE", 66453); - _unicodeCharacterMap.Add("UGARITIC LETTER QOPA", 66454); - _unicodeCharacterMap.Add("UGARITIC LETTER RASHA", 66455); - _unicodeCharacterMap.Add("UGARITIC LETTER THANNA", 66456); - _unicodeCharacterMap.Add("UGARITIC LETTER GHAIN", 66457); - _unicodeCharacterMap.Add("UGARITIC LETTER TO", 66458); - _unicodeCharacterMap.Add("UGARITIC LETTER I", 66459); - _unicodeCharacterMap.Add("UGARITIC LETTER U", 66460); - _unicodeCharacterMap.Add("UGARITIC LETTER SSU", 66461); - _unicodeCharacterMap.Add("UGARITIC WORD DIVIDER", 66463); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN A", 66464); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN I", 66465); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN U", 66466); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN KA", 66467); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN KU", 66468); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN GA", 66469); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN GU", 66470); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN XA", 66471); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN CA", 66472); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN JA", 66473); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN JI", 66474); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN TA", 66475); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN TU", 66476); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN DA", 66477); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN DI", 66478); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN DU", 66479); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN THA", 66480); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN PA", 66481); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN BA", 66482); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN FA", 66483); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN NA", 66484); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN NU", 66485); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN MA", 66486); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN MI", 66487); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN MU", 66488); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN YA", 66489); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN VA", 66490); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN VI", 66491); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN RA", 66492); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN RU", 66493); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN LA", 66494); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN SA", 66495); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN ZA", 66496); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN SHA", 66497); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN SSA", 66498); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN HA", 66499); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN AURAMAZDAA", 66504); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN AURAMAZDAA 2", 66505); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN AURAMAZDAAHA", 66506); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN XSHAAYATHIYA", 66507); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN DAHYAAUSH", 66508); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN DAHYAAUSH 2", 66509); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN BAGA", 66510); - _unicodeCharacterMap.Add("OLD PERSIAN SIGN BUUMISH", 66511); - _unicodeCharacterMap.Add("OLD PERSIAN WORD DIVIDER", 66512); - _unicodeCharacterMap.Add("OLD PERSIAN NUMBER ONE", 66513); - _unicodeCharacterMap.Add("OLD PERSIAN NUMBER TWO", 66514); - _unicodeCharacterMap.Add("OLD PERSIAN NUMBER TEN", 66515); - _unicodeCharacterMap.Add("OLD PERSIAN NUMBER TWENTY", 66516); - _unicodeCharacterMap.Add("OLD PERSIAN NUMBER HUNDRED", 66517); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER LONG I", 66560); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER LONG E", 66561); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER LONG A", 66562); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER LONG AH", 66563); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER LONG O", 66564); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER LONG OO", 66565); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER SHORT I", 66566); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER SHORT E", 66567); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER SHORT A", 66568); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER SHORT AH", 66569); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER SHORT O", 66570); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER SHORT OO", 66571); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER AY", 66572); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER OW", 66573); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER WU", 66574); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER YEE", 66575); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER H", 66576); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER PEE", 66577); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER BEE", 66578); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER TEE", 66579); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER DEE", 66580); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER CHEE", 66581); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER JEE", 66582); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER KAY", 66583); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER GAY", 66584); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER EF", 66585); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER VEE", 66586); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER ETH", 66587); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER THEE", 66588); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER ES", 66589); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER ZEE", 66590); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER ESH", 66591); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER ZHEE", 66592); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER ER", 66593); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER EL", 66594); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER EM", 66595); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER EN", 66596); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER ENG", 66597); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER OI", 66598); - _unicodeCharacterMap.Add("DESERET CAPITAL LETTER EW", 66599); - _unicodeCharacterMap.Add("DESERET SMALL LETTER LONG I", 66600); - _unicodeCharacterMap.Add("DESERET SMALL LETTER LONG E", 66601); - _unicodeCharacterMap.Add("DESERET SMALL LETTER LONG A", 66602); - _unicodeCharacterMap.Add("DESERET SMALL LETTER LONG AH", 66603); - _unicodeCharacterMap.Add("DESERET SMALL LETTER LONG O", 66604); - _unicodeCharacterMap.Add("DESERET SMALL LETTER LONG OO", 66605); - _unicodeCharacterMap.Add("DESERET SMALL LETTER SHORT I", 66606); - _unicodeCharacterMap.Add("DESERET SMALL LETTER SHORT E", 66607); - _unicodeCharacterMap.Add("DESERET SMALL LETTER SHORT A", 66608); - _unicodeCharacterMap.Add("DESERET SMALL LETTER SHORT AH", 66609); - _unicodeCharacterMap.Add("DESERET SMALL LETTER SHORT O", 66610); - _unicodeCharacterMap.Add("DESERET SMALL LETTER SHORT OO", 66611); - _unicodeCharacterMap.Add("DESERET SMALL LETTER AY", 66612); - _unicodeCharacterMap.Add("DESERET SMALL LETTER OW", 66613); - _unicodeCharacterMap.Add("DESERET SMALL LETTER WU", 66614); - _unicodeCharacterMap.Add("DESERET SMALL LETTER YEE", 66615); - _unicodeCharacterMap.Add("DESERET SMALL LETTER H", 66616); - _unicodeCharacterMap.Add("DESERET SMALL LETTER PEE", 66617); - _unicodeCharacterMap.Add("DESERET SMALL LETTER BEE", 66618); - _unicodeCharacterMap.Add("DESERET SMALL LETTER TEE", 66619); - _unicodeCharacterMap.Add("DESERET SMALL LETTER DEE", 66620); - _unicodeCharacterMap.Add("DESERET SMALL LETTER CHEE", 66621); - _unicodeCharacterMap.Add("DESERET SMALL LETTER JEE", 66622); - _unicodeCharacterMap.Add("DESERET SMALL LETTER KAY", 66623); - _unicodeCharacterMap.Add("DESERET SMALL LETTER GAY", 66624); - _unicodeCharacterMap.Add("DESERET SMALL LETTER EF", 66625); - _unicodeCharacterMap.Add("DESERET SMALL LETTER VEE", 66626); - _unicodeCharacterMap.Add("DESERET SMALL LETTER ETH", 66627); - _unicodeCharacterMap.Add("DESERET SMALL LETTER THEE", 66628); - _unicodeCharacterMap.Add("DESERET SMALL LETTER ES", 66629); - _unicodeCharacterMap.Add("DESERET SMALL LETTER ZEE", 66630); - _unicodeCharacterMap.Add("DESERET SMALL LETTER ESH", 66631); - _unicodeCharacterMap.Add("DESERET SMALL LETTER ZHEE", 66632); - _unicodeCharacterMap.Add("DESERET SMALL LETTER ER", 66633); - _unicodeCharacterMap.Add("DESERET SMALL LETTER EL", 66634); - _unicodeCharacterMap.Add("DESERET SMALL LETTER EM", 66635); - _unicodeCharacterMap.Add("DESERET SMALL LETTER EN", 66636); - _unicodeCharacterMap.Add("DESERET SMALL LETTER ENG", 66637); - _unicodeCharacterMap.Add("DESERET SMALL LETTER OI", 66638); - _unicodeCharacterMap.Add("DESERET SMALL LETTER EW", 66639); - _unicodeCharacterMap.Add("SHAVIAN LETTER PEEP", 66640); - _unicodeCharacterMap.Add("SHAVIAN LETTER TOT", 66641); - _unicodeCharacterMap.Add("SHAVIAN LETTER KICK", 66642); - _unicodeCharacterMap.Add("SHAVIAN LETTER FEE", 66643); - _unicodeCharacterMap.Add("SHAVIAN LETTER THIGH", 66644); - _unicodeCharacterMap.Add("SHAVIAN LETTER SO", 66645); - _unicodeCharacterMap.Add("SHAVIAN LETTER SURE", 66646); - _unicodeCharacterMap.Add("SHAVIAN LETTER CHURCH", 66647); - _unicodeCharacterMap.Add("SHAVIAN LETTER YEA", 66648); - _unicodeCharacterMap.Add("SHAVIAN LETTER HUNG", 66649); - _unicodeCharacterMap.Add("SHAVIAN LETTER BIB", 66650); - _unicodeCharacterMap.Add("SHAVIAN LETTER DEAD", 66651); - _unicodeCharacterMap.Add("SHAVIAN LETTER GAG", 66652); - _unicodeCharacterMap.Add("SHAVIAN LETTER VOW", 66653); - _unicodeCharacterMap.Add("SHAVIAN LETTER THEY", 66654); - _unicodeCharacterMap.Add("SHAVIAN LETTER ZOO", 66655); - _unicodeCharacterMap.Add("SHAVIAN LETTER MEASURE", 66656); - _unicodeCharacterMap.Add("SHAVIAN LETTER JUDGE", 66657); - _unicodeCharacterMap.Add("SHAVIAN LETTER WOE", 66658); - _unicodeCharacterMap.Add("SHAVIAN LETTER HA HA", 66659); - _unicodeCharacterMap.Add("SHAVIAN LETTER LOLL", 66660); - _unicodeCharacterMap.Add("SHAVIAN LETTER MIME", 66661); - _unicodeCharacterMap.Add("SHAVIAN LETTER IF", 66662); - _unicodeCharacterMap.Add("SHAVIAN LETTER EGG", 66663); - _unicodeCharacterMap.Add("SHAVIAN LETTER ASH", 66664); - _unicodeCharacterMap.Add("SHAVIAN LETTER ADO", 66665); - _unicodeCharacterMap.Add("SHAVIAN LETTER ON", 66666); - _unicodeCharacterMap.Add("SHAVIAN LETTER WOOL", 66667); - _unicodeCharacterMap.Add("SHAVIAN LETTER OUT", 66668); - _unicodeCharacterMap.Add("SHAVIAN LETTER AH", 66669); - _unicodeCharacterMap.Add("SHAVIAN LETTER ROAR", 66670); - _unicodeCharacterMap.Add("SHAVIAN LETTER NUN", 66671); - _unicodeCharacterMap.Add("SHAVIAN LETTER EAT", 66672); - _unicodeCharacterMap.Add("SHAVIAN LETTER AGE", 66673); - _unicodeCharacterMap.Add("SHAVIAN LETTER ICE", 66674); - _unicodeCharacterMap.Add("SHAVIAN LETTER UP", 66675); - _unicodeCharacterMap.Add("SHAVIAN LETTER OAK", 66676); - _unicodeCharacterMap.Add("SHAVIAN LETTER OOZE", 66677); - _unicodeCharacterMap.Add("SHAVIAN LETTER OIL", 66678); - _unicodeCharacterMap.Add("SHAVIAN LETTER AWE", 66679); - _unicodeCharacterMap.Add("SHAVIAN LETTER ARE", 66680); - _unicodeCharacterMap.Add("SHAVIAN LETTER OR", 66681); - _unicodeCharacterMap.Add("SHAVIAN LETTER AIR", 66682); - _unicodeCharacterMap.Add("SHAVIAN LETTER ERR", 66683); - _unicodeCharacterMap.Add("SHAVIAN LETTER ARRAY", 66684); - _unicodeCharacterMap.Add("SHAVIAN LETTER EAR", 66685); - _unicodeCharacterMap.Add("SHAVIAN LETTER IAN", 66686); - _unicodeCharacterMap.Add("SHAVIAN LETTER YEW", 66687); - _unicodeCharacterMap.Add("OSMANYA LETTER ALEF", 66688); - _unicodeCharacterMap.Add("OSMANYA LETTER BA", 66689); - _unicodeCharacterMap.Add("OSMANYA LETTER TA", 66690); - _unicodeCharacterMap.Add("OSMANYA LETTER JA", 66691); - _unicodeCharacterMap.Add("OSMANYA LETTER XA", 66692); - _unicodeCharacterMap.Add("OSMANYA LETTER KHA", 66693); - _unicodeCharacterMap.Add("OSMANYA LETTER DEEL", 66694); - _unicodeCharacterMap.Add("OSMANYA LETTER RA", 66695); - _unicodeCharacterMap.Add("OSMANYA LETTER SA", 66696); - _unicodeCharacterMap.Add("OSMANYA LETTER SHIIN", 66697); - _unicodeCharacterMap.Add("OSMANYA LETTER DHA", 66698); - _unicodeCharacterMap.Add("OSMANYA LETTER CAYN", 66699); - _unicodeCharacterMap.Add("OSMANYA LETTER GA", 66700); - _unicodeCharacterMap.Add("OSMANYA LETTER FA", 66701); - _unicodeCharacterMap.Add("OSMANYA LETTER QAAF", 66702); - _unicodeCharacterMap.Add("OSMANYA LETTER KAAF", 66703); - _unicodeCharacterMap.Add("OSMANYA LETTER LAAN", 66704); - _unicodeCharacterMap.Add("OSMANYA LETTER MIIN", 66705); - _unicodeCharacterMap.Add("OSMANYA LETTER NUUN", 66706); - _unicodeCharacterMap.Add("OSMANYA LETTER WAW", 66707); - _unicodeCharacterMap.Add("OSMANYA LETTER HA", 66708); - _unicodeCharacterMap.Add("OSMANYA LETTER YA", 66709); - _unicodeCharacterMap.Add("OSMANYA LETTER A", 66710); - _unicodeCharacterMap.Add("OSMANYA LETTER E", 66711); - _unicodeCharacterMap.Add("OSMANYA LETTER I", 66712); - _unicodeCharacterMap.Add("OSMANYA LETTER O", 66713); - _unicodeCharacterMap.Add("OSMANYA LETTER U", 66714); - _unicodeCharacterMap.Add("OSMANYA LETTER AA", 66715); - _unicodeCharacterMap.Add("OSMANYA LETTER EE", 66716); - _unicodeCharacterMap.Add("OSMANYA LETTER OO", 66717); - _unicodeCharacterMap.Add("OSMANYA DIGIT ZERO", 66720); - _unicodeCharacterMap.Add("OSMANYA DIGIT ONE", 66721); - _unicodeCharacterMap.Add("OSMANYA DIGIT TWO", 66722); - _unicodeCharacterMap.Add("OSMANYA DIGIT THREE", 66723); - _unicodeCharacterMap.Add("OSMANYA DIGIT FOUR", 66724); - _unicodeCharacterMap.Add("OSMANYA DIGIT FIVE", 66725); - _unicodeCharacterMap.Add("OSMANYA DIGIT SIX", 66726); - _unicodeCharacterMap.Add("OSMANYA DIGIT SEVEN", 66727); - _unicodeCharacterMap.Add("OSMANYA DIGIT EIGHT", 66728); - _unicodeCharacterMap.Add("OSMANYA DIGIT NINE", 66729); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER A", 66736); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER AI", 66737); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER AIN", 66738); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER AH", 66739); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER BRA", 66740); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER CHA", 66741); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER EHCHA", 66742); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER E", 66743); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER EIN", 66744); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER HA", 66745); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER HYA", 66746); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER I", 66747); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER KA", 66748); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER EHKA", 66749); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER KYA", 66750); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER LA", 66751); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER MA", 66752); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER NA", 66753); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER O", 66754); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER OIN", 66755); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER PA", 66756); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER EHPA", 66757); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER SA", 66758); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER SHA", 66759); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER TA", 66760); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER EHTA", 66761); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER TSA", 66762); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER EHTSA", 66763); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER TSHA", 66764); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER DHA", 66765); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER U", 66766); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER WA", 66767); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER KHA", 66768); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER GHA", 66769); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER ZA", 66770); - _unicodeCharacterMap.Add("OSAGE CAPITAL LETTER ZHA", 66771); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER A", 66776); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER AI", 66777); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER AIN", 66778); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER AH", 66779); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER BRA", 66780); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER CHA", 66781); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER EHCHA", 66782); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER E", 66783); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER EIN", 66784); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER HA", 66785); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER HYA", 66786); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER I", 66787); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER KA", 66788); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER EHKA", 66789); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER KYA", 66790); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER LA", 66791); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER MA", 66792); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER NA", 66793); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER O", 66794); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER OIN", 66795); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER PA", 66796); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER EHPA", 66797); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER SA", 66798); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER SHA", 66799); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER TA", 66800); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER EHTA", 66801); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER TSA", 66802); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER EHTSA", 66803); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER TSHA", 66804); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER DHA", 66805); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER U", 66806); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER WA", 66807); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER KHA", 66808); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER GHA", 66809); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER ZA", 66810); - _unicodeCharacterMap.Add("OSAGE SMALL LETTER ZHA", 66811); - _unicodeCharacterMap.Add("ELBASAN LETTER A", 66816); - _unicodeCharacterMap.Add("ELBASAN LETTER BE", 66817); - _unicodeCharacterMap.Add("ELBASAN LETTER CE", 66818); - _unicodeCharacterMap.Add("ELBASAN LETTER CHE", 66819); - _unicodeCharacterMap.Add("ELBASAN LETTER DE", 66820); - _unicodeCharacterMap.Add("ELBASAN LETTER NDE", 66821); - _unicodeCharacterMap.Add("ELBASAN LETTER DHE", 66822); - _unicodeCharacterMap.Add("ELBASAN LETTER EI", 66823); - _unicodeCharacterMap.Add("ELBASAN LETTER E", 66824); - _unicodeCharacterMap.Add("ELBASAN LETTER FE", 66825); - _unicodeCharacterMap.Add("ELBASAN LETTER GE", 66826); - _unicodeCharacterMap.Add("ELBASAN LETTER GJE", 66827); - _unicodeCharacterMap.Add("ELBASAN LETTER HE", 66828); - _unicodeCharacterMap.Add("ELBASAN LETTER I", 66829); - _unicodeCharacterMap.Add("ELBASAN LETTER JE", 66830); - _unicodeCharacterMap.Add("ELBASAN LETTER KE", 66831); - _unicodeCharacterMap.Add("ELBASAN LETTER LE", 66832); - _unicodeCharacterMap.Add("ELBASAN LETTER LLE", 66833); - _unicodeCharacterMap.Add("ELBASAN LETTER ME", 66834); - _unicodeCharacterMap.Add("ELBASAN LETTER NE", 66835); - _unicodeCharacterMap.Add("ELBASAN LETTER NA", 66836); - _unicodeCharacterMap.Add("ELBASAN LETTER NJE", 66837); - _unicodeCharacterMap.Add("ELBASAN LETTER O", 66838); - _unicodeCharacterMap.Add("ELBASAN LETTER PE", 66839); - _unicodeCharacterMap.Add("ELBASAN LETTER QE", 66840); - _unicodeCharacterMap.Add("ELBASAN LETTER RE", 66841); - _unicodeCharacterMap.Add("ELBASAN LETTER RRE", 66842); - _unicodeCharacterMap.Add("ELBASAN LETTER SE", 66843); - _unicodeCharacterMap.Add("ELBASAN LETTER SHE", 66844); - _unicodeCharacterMap.Add("ELBASAN LETTER TE", 66845); - _unicodeCharacterMap.Add("ELBASAN LETTER THE", 66846); - _unicodeCharacterMap.Add("ELBASAN LETTER U", 66847); - _unicodeCharacterMap.Add("ELBASAN LETTER VE", 66848); - _unicodeCharacterMap.Add("ELBASAN LETTER XE", 66849); - _unicodeCharacterMap.Add("ELBASAN LETTER Y", 66850); - _unicodeCharacterMap.Add("ELBASAN LETTER ZE", 66851); - _unicodeCharacterMap.Add("ELBASAN LETTER ZHE", 66852); - _unicodeCharacterMap.Add("ELBASAN LETTER GHE", 66853); - _unicodeCharacterMap.Add("ELBASAN LETTER GHAMMA", 66854); - _unicodeCharacterMap.Add("ELBASAN LETTER KHE", 66855); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER ALT", 66864); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER BET", 66865); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER GIM", 66866); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER DAT", 66867); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER EB", 66868); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER ZARL", 66869); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER EYN", 66870); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER ZHIL", 66871); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER TAS", 66872); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CHA", 66873); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER YOWD", 66874); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER ZHA", 66875); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER IRB", 66876); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER SHA", 66877); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER LAN", 66878); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER INYA", 66879); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER XEYN", 66880); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER DYAN", 66881); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CAR", 66882); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER JHOX", 66883); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER KAR", 66884); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER LYIT", 66885); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER HEYT", 66886); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER QAY", 66887); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER AOR", 66888); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CHOY", 66889); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CHI", 66890); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CYAY", 66891); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER MAQ", 66892); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER QAR", 66893); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER NOWC", 66894); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER DZYAY", 66895); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER SHAK", 66896); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER JAYN", 66897); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER ON", 66898); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER TYAY", 66899); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER FAM", 66900); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER DZAY", 66901); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CHAT", 66902); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER PEN", 66903); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER GHEYS", 66904); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER RAT", 66905); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER SEYK", 66906); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER VEYZ", 66907); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER TIWR", 66908); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER SHOY", 66909); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER IWN", 66910); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CYAW", 66911); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER CAYN", 66912); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER YAYD", 66913); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER PIWR", 66914); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN LETTER KIW", 66915); - _unicodeCharacterMap.Add("CAUCASIAN ALBANIAN CITATION MARK", 66927); - _unicodeCharacterMap.Add("LINEAR A SIGN AB001", 67072); - _unicodeCharacterMap.Add("LINEAR A SIGN AB002", 67073); - _unicodeCharacterMap.Add("LINEAR A SIGN AB003", 67074); - _unicodeCharacterMap.Add("LINEAR A SIGN AB004", 67075); - _unicodeCharacterMap.Add("LINEAR A SIGN AB005", 67076); - _unicodeCharacterMap.Add("LINEAR A SIGN AB006", 67077); - _unicodeCharacterMap.Add("LINEAR A SIGN AB007", 67078); - _unicodeCharacterMap.Add("LINEAR A SIGN AB008", 67079); - _unicodeCharacterMap.Add("LINEAR A SIGN AB009", 67080); - _unicodeCharacterMap.Add("LINEAR A SIGN AB010", 67081); - _unicodeCharacterMap.Add("LINEAR A SIGN AB011", 67082); - _unicodeCharacterMap.Add("LINEAR A SIGN AB013", 67083); - _unicodeCharacterMap.Add("LINEAR A SIGN AB016", 67084); - _unicodeCharacterMap.Add("LINEAR A SIGN AB017", 67085); - _unicodeCharacterMap.Add("LINEAR A SIGN AB020", 67086); - _unicodeCharacterMap.Add("LINEAR A SIGN AB021", 67087); - _unicodeCharacterMap.Add("LINEAR A SIGN AB021F", 67088); - _unicodeCharacterMap.Add("LINEAR A SIGN AB021M", 67089); - _unicodeCharacterMap.Add("LINEAR A SIGN AB022", 67090); - _unicodeCharacterMap.Add("LINEAR A SIGN AB022F", 67091); - _unicodeCharacterMap.Add("LINEAR A SIGN AB022M", 67092); - _unicodeCharacterMap.Add("LINEAR A SIGN AB023", 67093); - _unicodeCharacterMap.Add("LINEAR A SIGN AB023M", 67094); - _unicodeCharacterMap.Add("LINEAR A SIGN AB024", 67095); - _unicodeCharacterMap.Add("LINEAR A SIGN AB026", 67096); - _unicodeCharacterMap.Add("LINEAR A SIGN AB027", 67097); - _unicodeCharacterMap.Add("LINEAR A SIGN AB028", 67098); - _unicodeCharacterMap.Add("LINEAR A SIGN A028B", 67099); - _unicodeCharacterMap.Add("LINEAR A SIGN AB029", 67100); - _unicodeCharacterMap.Add("LINEAR A SIGN AB030", 67101); - _unicodeCharacterMap.Add("LINEAR A SIGN AB031", 67102); - _unicodeCharacterMap.Add("LINEAR A SIGN AB034", 67103); - _unicodeCharacterMap.Add("LINEAR A SIGN AB037", 67104); - _unicodeCharacterMap.Add("LINEAR A SIGN AB038", 67105); - _unicodeCharacterMap.Add("LINEAR A SIGN AB039", 67106); - _unicodeCharacterMap.Add("LINEAR A SIGN AB040", 67107); - _unicodeCharacterMap.Add("LINEAR A SIGN AB041", 67108); - _unicodeCharacterMap.Add("LINEAR A SIGN AB044", 67109); - _unicodeCharacterMap.Add("LINEAR A SIGN AB045", 67110); - _unicodeCharacterMap.Add("LINEAR A SIGN AB046", 67111); - _unicodeCharacterMap.Add("LINEAR A SIGN AB047", 67112); - _unicodeCharacterMap.Add("LINEAR A SIGN AB048", 67113); - _unicodeCharacterMap.Add("LINEAR A SIGN AB049", 67114); - _unicodeCharacterMap.Add("LINEAR A SIGN AB050", 67115); - _unicodeCharacterMap.Add("LINEAR A SIGN AB051", 67116); - _unicodeCharacterMap.Add("LINEAR A SIGN AB053", 67117); - _unicodeCharacterMap.Add("LINEAR A SIGN AB054", 67118); - _unicodeCharacterMap.Add("LINEAR A SIGN AB055", 67119); - _unicodeCharacterMap.Add("LINEAR A SIGN AB056", 67120); - _unicodeCharacterMap.Add("LINEAR A SIGN AB057", 67121); - _unicodeCharacterMap.Add("LINEAR A SIGN AB058", 67122); - _unicodeCharacterMap.Add("LINEAR A SIGN AB059", 67123); - _unicodeCharacterMap.Add("LINEAR A SIGN AB060", 67124); - _unicodeCharacterMap.Add("LINEAR A SIGN AB061", 67125); - _unicodeCharacterMap.Add("LINEAR A SIGN AB065", 67126); - _unicodeCharacterMap.Add("LINEAR A SIGN AB066", 67127); - _unicodeCharacterMap.Add("LINEAR A SIGN AB067", 67128); - _unicodeCharacterMap.Add("LINEAR A SIGN AB069", 67129); - _unicodeCharacterMap.Add("LINEAR A SIGN AB070", 67130); - _unicodeCharacterMap.Add("LINEAR A SIGN AB073", 67131); - _unicodeCharacterMap.Add("LINEAR A SIGN AB074", 67132); - _unicodeCharacterMap.Add("LINEAR A SIGN AB076", 67133); - _unicodeCharacterMap.Add("LINEAR A SIGN AB077", 67134); - _unicodeCharacterMap.Add("LINEAR A SIGN AB078", 67135); - _unicodeCharacterMap.Add("LINEAR A SIGN AB079", 67136); - _unicodeCharacterMap.Add("LINEAR A SIGN AB080", 67137); - _unicodeCharacterMap.Add("LINEAR A SIGN AB081", 67138); - _unicodeCharacterMap.Add("LINEAR A SIGN AB082", 67139); - _unicodeCharacterMap.Add("LINEAR A SIGN AB085", 67140); - _unicodeCharacterMap.Add("LINEAR A SIGN AB086", 67141); - _unicodeCharacterMap.Add("LINEAR A SIGN AB087", 67142); - _unicodeCharacterMap.Add("LINEAR A SIGN A100 102", 67143); - _unicodeCharacterMap.Add("LINEAR A SIGN AB118", 67144); - _unicodeCharacterMap.Add("LINEAR A SIGN AB120", 67145); - _unicodeCharacterMap.Add("LINEAR A SIGN A120B", 67146); - _unicodeCharacterMap.Add("LINEAR A SIGN AB122", 67147); - _unicodeCharacterMap.Add("LINEAR A SIGN AB123", 67148); - _unicodeCharacterMap.Add("LINEAR A SIGN AB131A", 67149); - _unicodeCharacterMap.Add("LINEAR A SIGN AB131B", 67150); - _unicodeCharacterMap.Add("LINEAR A SIGN A131C", 67151); - _unicodeCharacterMap.Add("LINEAR A SIGN AB164", 67152); - _unicodeCharacterMap.Add("LINEAR A SIGN AB171", 67153); - _unicodeCharacterMap.Add("LINEAR A SIGN AB180", 67154); - _unicodeCharacterMap.Add("LINEAR A SIGN AB188", 67155); - _unicodeCharacterMap.Add("LINEAR A SIGN AB191", 67156); - _unicodeCharacterMap.Add("LINEAR A SIGN A301", 67157); - _unicodeCharacterMap.Add("LINEAR A SIGN A302", 67158); - _unicodeCharacterMap.Add("LINEAR A SIGN A303", 67159); - _unicodeCharacterMap.Add("LINEAR A SIGN A304", 67160); - _unicodeCharacterMap.Add("LINEAR A SIGN A305", 67161); - _unicodeCharacterMap.Add("LINEAR A SIGN A306", 67162); - _unicodeCharacterMap.Add("LINEAR A SIGN A307", 67163); - _unicodeCharacterMap.Add("LINEAR A SIGN A308", 67164); - _unicodeCharacterMap.Add("LINEAR A SIGN A309A", 67165); - _unicodeCharacterMap.Add("LINEAR A SIGN A309B", 67166); - _unicodeCharacterMap.Add("LINEAR A SIGN A309C", 67167); - _unicodeCharacterMap.Add("LINEAR A SIGN A310", 67168); - _unicodeCharacterMap.Add("LINEAR A SIGN A311", 67169); - _unicodeCharacterMap.Add("LINEAR A SIGN A312", 67170); - _unicodeCharacterMap.Add("LINEAR A SIGN A313A", 67171); - _unicodeCharacterMap.Add("LINEAR A SIGN A313B", 67172); - _unicodeCharacterMap.Add("LINEAR A SIGN A313C", 67173); - _unicodeCharacterMap.Add("LINEAR A SIGN A314", 67174); - _unicodeCharacterMap.Add("LINEAR A SIGN A315", 67175); - _unicodeCharacterMap.Add("LINEAR A SIGN A316", 67176); - _unicodeCharacterMap.Add("LINEAR A SIGN A317", 67177); - _unicodeCharacterMap.Add("LINEAR A SIGN A318", 67178); - _unicodeCharacterMap.Add("LINEAR A SIGN A319", 67179); - _unicodeCharacterMap.Add("LINEAR A SIGN A320", 67180); - _unicodeCharacterMap.Add("LINEAR A SIGN A321", 67181); - _unicodeCharacterMap.Add("LINEAR A SIGN A322", 67182); - _unicodeCharacterMap.Add("LINEAR A SIGN A323", 67183); - _unicodeCharacterMap.Add("LINEAR A SIGN A324", 67184); - _unicodeCharacterMap.Add("LINEAR A SIGN A325", 67185); - _unicodeCharacterMap.Add("LINEAR A SIGN A326", 67186); - _unicodeCharacterMap.Add("LINEAR A SIGN A327", 67187); - _unicodeCharacterMap.Add("LINEAR A SIGN A328", 67188); - _unicodeCharacterMap.Add("LINEAR A SIGN A329", 67189); - _unicodeCharacterMap.Add("LINEAR A SIGN A330", 67190); - _unicodeCharacterMap.Add("LINEAR A SIGN A331", 67191); - _unicodeCharacterMap.Add("LINEAR A SIGN A332", 67192); - _unicodeCharacterMap.Add("LINEAR A SIGN A333", 67193); - _unicodeCharacterMap.Add("LINEAR A SIGN A334", 67194); - _unicodeCharacterMap.Add("LINEAR A SIGN A335", 67195); - _unicodeCharacterMap.Add("LINEAR A SIGN A336", 67196); - _unicodeCharacterMap.Add("LINEAR A SIGN A337", 67197); - _unicodeCharacterMap.Add("LINEAR A SIGN A338", 67198); - _unicodeCharacterMap.Add("LINEAR A SIGN A339", 67199); - _unicodeCharacterMap.Add("LINEAR A SIGN A340", 67200); - _unicodeCharacterMap.Add("LINEAR A SIGN A341", 67201); - _unicodeCharacterMap.Add("LINEAR A SIGN A342", 67202); - _unicodeCharacterMap.Add("LINEAR A SIGN A343", 67203); - _unicodeCharacterMap.Add("LINEAR A SIGN A344", 67204); - _unicodeCharacterMap.Add("LINEAR A SIGN A345", 67205); - _unicodeCharacterMap.Add("LINEAR A SIGN A346", 67206); - _unicodeCharacterMap.Add("LINEAR A SIGN A347", 67207); - _unicodeCharacterMap.Add("LINEAR A SIGN A348", 67208); - _unicodeCharacterMap.Add("LINEAR A SIGN A349", 67209); - _unicodeCharacterMap.Add("LINEAR A SIGN A350", 67210); - _unicodeCharacterMap.Add("LINEAR A SIGN A351", 67211); - _unicodeCharacterMap.Add("LINEAR A SIGN A352", 67212); - _unicodeCharacterMap.Add("LINEAR A SIGN A353", 67213); - _unicodeCharacterMap.Add("LINEAR A SIGN A354", 67214); - _unicodeCharacterMap.Add("LINEAR A SIGN A355", 67215); - _unicodeCharacterMap.Add("LINEAR A SIGN A356", 67216); - _unicodeCharacterMap.Add("LINEAR A SIGN A357", 67217); - _unicodeCharacterMap.Add("LINEAR A SIGN A358", 67218); - _unicodeCharacterMap.Add("LINEAR A SIGN A359", 67219); - _unicodeCharacterMap.Add("LINEAR A SIGN A360", 67220); - _unicodeCharacterMap.Add("LINEAR A SIGN A361", 67221); - _unicodeCharacterMap.Add("LINEAR A SIGN A362", 67222); - _unicodeCharacterMap.Add("LINEAR A SIGN A363", 67223); - _unicodeCharacterMap.Add("LINEAR A SIGN A364", 67224); - _unicodeCharacterMap.Add("LINEAR A SIGN A365", 67225); - _unicodeCharacterMap.Add("LINEAR A SIGN A366", 67226); - _unicodeCharacterMap.Add("LINEAR A SIGN A367", 67227); - _unicodeCharacterMap.Add("LINEAR A SIGN A368", 67228); - _unicodeCharacterMap.Add("LINEAR A SIGN A369", 67229); - _unicodeCharacterMap.Add("LINEAR A SIGN A370", 67230); - _unicodeCharacterMap.Add("LINEAR A SIGN A371", 67231); - _unicodeCharacterMap.Add("LINEAR A SIGN A400 VAS", 67232); - _unicodeCharacterMap.Add("LINEAR A SIGN A401 VAS", 67233); - _unicodeCharacterMap.Add("LINEAR A SIGN A402 VAS", 67234); - _unicodeCharacterMap.Add("LINEAR A SIGN A403 VAS", 67235); - _unicodeCharacterMap.Add("LINEAR A SIGN A404 VAS", 67236); - _unicodeCharacterMap.Add("LINEAR A SIGN A405 VAS", 67237); - _unicodeCharacterMap.Add("LINEAR A SIGN A406 VAS", 67238); - _unicodeCharacterMap.Add("LINEAR A SIGN A407 VAS", 67239); - _unicodeCharacterMap.Add("LINEAR A SIGN A408 VAS", 67240); - _unicodeCharacterMap.Add("LINEAR A SIGN A409 VAS", 67241); - _unicodeCharacterMap.Add("LINEAR A SIGN A410 VAS", 67242); - _unicodeCharacterMap.Add("LINEAR A SIGN A411 VAS", 67243); - _unicodeCharacterMap.Add("LINEAR A SIGN A412 VAS", 67244); - _unicodeCharacterMap.Add("LINEAR A SIGN A413 VAS", 67245); - _unicodeCharacterMap.Add("LINEAR A SIGN A414 VAS", 67246); - _unicodeCharacterMap.Add("LINEAR A SIGN A415 VAS", 67247); - _unicodeCharacterMap.Add("LINEAR A SIGN A416 VAS", 67248); - _unicodeCharacterMap.Add("LINEAR A SIGN A417 VAS", 67249); - _unicodeCharacterMap.Add("LINEAR A SIGN A418 VAS", 67250); - _unicodeCharacterMap.Add("LINEAR A SIGN A501", 67251); - _unicodeCharacterMap.Add("LINEAR A SIGN A502", 67252); - _unicodeCharacterMap.Add("LINEAR A SIGN A503", 67253); - _unicodeCharacterMap.Add("LINEAR A SIGN A504", 67254); - _unicodeCharacterMap.Add("LINEAR A SIGN A505", 67255); - _unicodeCharacterMap.Add("LINEAR A SIGN A506", 67256); - _unicodeCharacterMap.Add("LINEAR A SIGN A508", 67257); - _unicodeCharacterMap.Add("LINEAR A SIGN A509", 67258); - _unicodeCharacterMap.Add("LINEAR A SIGN A510", 67259); - _unicodeCharacterMap.Add("LINEAR A SIGN A511", 67260); - _unicodeCharacterMap.Add("LINEAR A SIGN A512", 67261); - _unicodeCharacterMap.Add("LINEAR A SIGN A513", 67262); - _unicodeCharacterMap.Add("LINEAR A SIGN A515", 67263); - _unicodeCharacterMap.Add("LINEAR A SIGN A516", 67264); - _unicodeCharacterMap.Add("LINEAR A SIGN A520", 67265); - _unicodeCharacterMap.Add("LINEAR A SIGN A521", 67266); - _unicodeCharacterMap.Add("LINEAR A SIGN A523", 67267); - _unicodeCharacterMap.Add("LINEAR A SIGN A524", 67268); - _unicodeCharacterMap.Add("LINEAR A SIGN A525", 67269); - _unicodeCharacterMap.Add("LINEAR A SIGN A526", 67270); - _unicodeCharacterMap.Add("LINEAR A SIGN A527", 67271); - _unicodeCharacterMap.Add("LINEAR A SIGN A528", 67272); - _unicodeCharacterMap.Add("LINEAR A SIGN A529", 67273); - _unicodeCharacterMap.Add("LINEAR A SIGN A530", 67274); - _unicodeCharacterMap.Add("LINEAR A SIGN A531", 67275); - _unicodeCharacterMap.Add("LINEAR A SIGN A532", 67276); - _unicodeCharacterMap.Add("LINEAR A SIGN A534", 67277); - _unicodeCharacterMap.Add("LINEAR A SIGN A535", 67278); - _unicodeCharacterMap.Add("LINEAR A SIGN A536", 67279); - _unicodeCharacterMap.Add("LINEAR A SIGN A537", 67280); - _unicodeCharacterMap.Add("LINEAR A SIGN A538", 67281); - _unicodeCharacterMap.Add("LINEAR A SIGN A539", 67282); - _unicodeCharacterMap.Add("LINEAR A SIGN A540", 67283); - _unicodeCharacterMap.Add("LINEAR A SIGN A541", 67284); - _unicodeCharacterMap.Add("LINEAR A SIGN A542", 67285); - _unicodeCharacterMap.Add("LINEAR A SIGN A545", 67286); - _unicodeCharacterMap.Add("LINEAR A SIGN A547", 67287); - _unicodeCharacterMap.Add("LINEAR A SIGN A548", 67288); - _unicodeCharacterMap.Add("LINEAR A SIGN A549", 67289); - _unicodeCharacterMap.Add("LINEAR A SIGN A550", 67290); - _unicodeCharacterMap.Add("LINEAR A SIGN A551", 67291); - _unicodeCharacterMap.Add("LINEAR A SIGN A552", 67292); - _unicodeCharacterMap.Add("LINEAR A SIGN A553", 67293); - _unicodeCharacterMap.Add("LINEAR A SIGN A554", 67294); - _unicodeCharacterMap.Add("LINEAR A SIGN A555", 67295); - _unicodeCharacterMap.Add("LINEAR A SIGN A556", 67296); - _unicodeCharacterMap.Add("LINEAR A SIGN A557", 67297); - _unicodeCharacterMap.Add("LINEAR A SIGN A559", 67298); - _unicodeCharacterMap.Add("LINEAR A SIGN A563", 67299); - _unicodeCharacterMap.Add("LINEAR A SIGN A564", 67300); - _unicodeCharacterMap.Add("LINEAR A SIGN A565", 67301); - _unicodeCharacterMap.Add("LINEAR A SIGN A566", 67302); - _unicodeCharacterMap.Add("LINEAR A SIGN A568", 67303); - _unicodeCharacterMap.Add("LINEAR A SIGN A569", 67304); - _unicodeCharacterMap.Add("LINEAR A SIGN A570", 67305); - _unicodeCharacterMap.Add("LINEAR A SIGN A571", 67306); - _unicodeCharacterMap.Add("LINEAR A SIGN A572", 67307); - _unicodeCharacterMap.Add("LINEAR A SIGN A573", 67308); - _unicodeCharacterMap.Add("LINEAR A SIGN A574", 67309); - _unicodeCharacterMap.Add("LINEAR A SIGN A575", 67310); - _unicodeCharacterMap.Add("LINEAR A SIGN A576", 67311); - _unicodeCharacterMap.Add("LINEAR A SIGN A577", 67312); - _unicodeCharacterMap.Add("LINEAR A SIGN A578", 67313); - _unicodeCharacterMap.Add("LINEAR A SIGN A579", 67314); - _unicodeCharacterMap.Add("LINEAR A SIGN A580", 67315); - _unicodeCharacterMap.Add("LINEAR A SIGN A581", 67316); - _unicodeCharacterMap.Add("LINEAR A SIGN A582", 67317); - _unicodeCharacterMap.Add("LINEAR A SIGN A583", 67318); - _unicodeCharacterMap.Add("LINEAR A SIGN A584", 67319); - _unicodeCharacterMap.Add("LINEAR A SIGN A585", 67320); - _unicodeCharacterMap.Add("LINEAR A SIGN A586", 67321); - _unicodeCharacterMap.Add("LINEAR A SIGN A587", 67322); - _unicodeCharacterMap.Add("LINEAR A SIGN A588", 67323); - _unicodeCharacterMap.Add("LINEAR A SIGN A589", 67324); - _unicodeCharacterMap.Add("LINEAR A SIGN A591", 67325); - _unicodeCharacterMap.Add("LINEAR A SIGN A592", 67326); - _unicodeCharacterMap.Add("LINEAR A SIGN A594", 67327); - _unicodeCharacterMap.Add("LINEAR A SIGN A595", 67328); - _unicodeCharacterMap.Add("LINEAR A SIGN A596", 67329); - _unicodeCharacterMap.Add("LINEAR A SIGN A598", 67330); - _unicodeCharacterMap.Add("LINEAR A SIGN A600", 67331); - _unicodeCharacterMap.Add("LINEAR A SIGN A601", 67332); - _unicodeCharacterMap.Add("LINEAR A SIGN A602", 67333); - _unicodeCharacterMap.Add("LINEAR A SIGN A603", 67334); - _unicodeCharacterMap.Add("LINEAR A SIGN A604", 67335); - _unicodeCharacterMap.Add("LINEAR A SIGN A606", 67336); - _unicodeCharacterMap.Add("LINEAR A SIGN A608", 67337); - _unicodeCharacterMap.Add("LINEAR A SIGN A609", 67338); - _unicodeCharacterMap.Add("LINEAR A SIGN A610", 67339); - _unicodeCharacterMap.Add("LINEAR A SIGN A611", 67340); - _unicodeCharacterMap.Add("LINEAR A SIGN A612", 67341); - _unicodeCharacterMap.Add("LINEAR A SIGN A613", 67342); - _unicodeCharacterMap.Add("LINEAR A SIGN A614", 67343); - _unicodeCharacterMap.Add("LINEAR A SIGN A615", 67344); - _unicodeCharacterMap.Add("LINEAR A SIGN A616", 67345); - _unicodeCharacterMap.Add("LINEAR A SIGN A617", 67346); - _unicodeCharacterMap.Add("LINEAR A SIGN A618", 67347); - _unicodeCharacterMap.Add("LINEAR A SIGN A619", 67348); - _unicodeCharacterMap.Add("LINEAR A SIGN A620", 67349); - _unicodeCharacterMap.Add("LINEAR A SIGN A621", 67350); - _unicodeCharacterMap.Add("LINEAR A SIGN A622", 67351); - _unicodeCharacterMap.Add("LINEAR A SIGN A623", 67352); - _unicodeCharacterMap.Add("LINEAR A SIGN A624", 67353); - _unicodeCharacterMap.Add("LINEAR A SIGN A626", 67354); - _unicodeCharacterMap.Add("LINEAR A SIGN A627", 67355); - _unicodeCharacterMap.Add("LINEAR A SIGN A628", 67356); - _unicodeCharacterMap.Add("LINEAR A SIGN A629", 67357); - _unicodeCharacterMap.Add("LINEAR A SIGN A634", 67358); - _unicodeCharacterMap.Add("LINEAR A SIGN A637", 67359); - _unicodeCharacterMap.Add("LINEAR A SIGN A638", 67360); - _unicodeCharacterMap.Add("LINEAR A SIGN A640", 67361); - _unicodeCharacterMap.Add("LINEAR A SIGN A642", 67362); - _unicodeCharacterMap.Add("LINEAR A SIGN A643", 67363); - _unicodeCharacterMap.Add("LINEAR A SIGN A644", 67364); - _unicodeCharacterMap.Add("LINEAR A SIGN A645", 67365); - _unicodeCharacterMap.Add("LINEAR A SIGN A646", 67366); - _unicodeCharacterMap.Add("LINEAR A SIGN A648", 67367); - _unicodeCharacterMap.Add("LINEAR A SIGN A649", 67368); - _unicodeCharacterMap.Add("LINEAR A SIGN A651", 67369); - _unicodeCharacterMap.Add("LINEAR A SIGN A652", 67370); - _unicodeCharacterMap.Add("LINEAR A SIGN A653", 67371); - _unicodeCharacterMap.Add("LINEAR A SIGN A654", 67372); - _unicodeCharacterMap.Add("LINEAR A SIGN A655", 67373); - _unicodeCharacterMap.Add("LINEAR A SIGN A656", 67374); - _unicodeCharacterMap.Add("LINEAR A SIGN A657", 67375); - _unicodeCharacterMap.Add("LINEAR A SIGN A658", 67376); - _unicodeCharacterMap.Add("LINEAR A SIGN A659", 67377); - _unicodeCharacterMap.Add("LINEAR A SIGN A660", 67378); - _unicodeCharacterMap.Add("LINEAR A SIGN A661", 67379); - _unicodeCharacterMap.Add("LINEAR A SIGN A662", 67380); - _unicodeCharacterMap.Add("LINEAR A SIGN A663", 67381); - _unicodeCharacterMap.Add("LINEAR A SIGN A664", 67382); - _unicodeCharacterMap.Add("LINEAR A SIGN A701 A", 67392); - _unicodeCharacterMap.Add("LINEAR A SIGN A702 B", 67393); - _unicodeCharacterMap.Add("LINEAR A SIGN A703 D", 67394); - _unicodeCharacterMap.Add("LINEAR A SIGN A704 E", 67395); - _unicodeCharacterMap.Add("LINEAR A SIGN A705 F", 67396); - _unicodeCharacterMap.Add("LINEAR A SIGN A706 H", 67397); - _unicodeCharacterMap.Add("LINEAR A SIGN A707 J", 67398); - _unicodeCharacterMap.Add("LINEAR A SIGN A708 K", 67399); - _unicodeCharacterMap.Add("LINEAR A SIGN A709 L", 67400); - _unicodeCharacterMap.Add("LINEAR A SIGN A709 2 L2", 67401); - _unicodeCharacterMap.Add("LINEAR A SIGN A709 3 L3", 67402); - _unicodeCharacterMap.Add("LINEAR A SIGN A709 4 L4", 67403); - _unicodeCharacterMap.Add("LINEAR A SIGN A709 6 L6", 67404); - _unicodeCharacterMap.Add("LINEAR A SIGN A710 W", 67405); - _unicodeCharacterMap.Add("LINEAR A SIGN A711 X", 67406); - _unicodeCharacterMap.Add("LINEAR A SIGN A712 Y", 67407); - _unicodeCharacterMap.Add("LINEAR A SIGN A713 OMEGA", 67408); - _unicodeCharacterMap.Add("LINEAR A SIGN A714 ABB", 67409); - _unicodeCharacterMap.Add("LINEAR A SIGN A715 BB", 67410); - _unicodeCharacterMap.Add("LINEAR A SIGN A717 DD", 67411); - _unicodeCharacterMap.Add("LINEAR A SIGN A726 EYYY", 67412); - _unicodeCharacterMap.Add("LINEAR A SIGN A732 JE", 67413); - _unicodeCharacterMap.Add("LINEAR A SIGN A800", 67424); - _unicodeCharacterMap.Add("LINEAR A SIGN A801", 67425); - _unicodeCharacterMap.Add("LINEAR A SIGN A802", 67426); - _unicodeCharacterMap.Add("LINEAR A SIGN A803", 67427); - _unicodeCharacterMap.Add("LINEAR A SIGN A804", 67428); - _unicodeCharacterMap.Add("LINEAR A SIGN A805", 67429); - _unicodeCharacterMap.Add("LINEAR A SIGN A806", 67430); - _unicodeCharacterMap.Add("LINEAR A SIGN A807", 67431); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE A", 67584); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE E", 67585); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE I", 67586); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE O", 67587); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE U", 67588); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE JA", 67589); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE JO", 67592); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE KA", 67594); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE KE", 67595); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE KI", 67596); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE KO", 67597); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE KU", 67598); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE LA", 67599); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE LE", 67600); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE LI", 67601); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE LO", 67602); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE LU", 67603); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE MA", 67604); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE ME", 67605); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE MI", 67606); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE MO", 67607); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE MU", 67608); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE NA", 67609); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE NE", 67610); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE NI", 67611); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE NO", 67612); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE NU", 67613); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE PA", 67614); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE PE", 67615); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE PI", 67616); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE PO", 67617); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE PU", 67618); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE RA", 67619); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE RE", 67620); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE RI", 67621); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE RO", 67622); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE RU", 67623); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE SA", 67624); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE SE", 67625); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE SI", 67626); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE SO", 67627); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE SU", 67628); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE TA", 67629); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE TE", 67630); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE TI", 67631); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE TO", 67632); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE TU", 67633); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE WA", 67634); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE WE", 67635); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE WI", 67636); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE WO", 67637); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE XA", 67639); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE XE", 67640); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE ZA", 67644); - _unicodeCharacterMap.Add("CYPRIOT SYLLABLE ZO", 67647); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER ALEPH", 67648); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER BETH", 67649); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER GIMEL", 67650); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER DALETH", 67651); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER HE", 67652); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER WAW", 67653); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER ZAYIN", 67654); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER HETH", 67655); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER TETH", 67656); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER YODH", 67657); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER KAPH", 67658); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER LAMEDH", 67659); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER MEM", 67660); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER NUN", 67661); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER SAMEKH", 67662); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER AYIN", 67663); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER PE", 67664); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER SADHE", 67665); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER QOPH", 67666); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER RESH", 67667); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER SHIN", 67668); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC LETTER TAW", 67669); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC SECTION SIGN", 67671); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER ONE", 67672); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER TWO", 67673); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER THREE", 67674); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER TEN", 67675); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER TWENTY", 67676); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER ONE HUNDRED", 67677); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER ONE THOUSAND", 67678); - _unicodeCharacterMap.Add("IMPERIAL ARAMAIC NUMBER TEN THOUSAND", 67679); - _unicodeCharacterMap.Add("PALMYRENE LETTER ALEPH", 67680); - _unicodeCharacterMap.Add("PALMYRENE LETTER BETH", 67681); - _unicodeCharacterMap.Add("PALMYRENE LETTER GIMEL", 67682); - _unicodeCharacterMap.Add("PALMYRENE LETTER DALETH", 67683); - _unicodeCharacterMap.Add("PALMYRENE LETTER HE", 67684); - _unicodeCharacterMap.Add("PALMYRENE LETTER WAW", 67685); - _unicodeCharacterMap.Add("PALMYRENE LETTER ZAYIN", 67686); - _unicodeCharacterMap.Add("PALMYRENE LETTER HETH", 67687); - _unicodeCharacterMap.Add("PALMYRENE LETTER TETH", 67688); - _unicodeCharacterMap.Add("PALMYRENE LETTER YODH", 67689); - _unicodeCharacterMap.Add("PALMYRENE LETTER KAPH", 67690); - _unicodeCharacterMap.Add("PALMYRENE LETTER LAMEDH", 67691); - _unicodeCharacterMap.Add("PALMYRENE LETTER MEM", 67692); - _unicodeCharacterMap.Add("PALMYRENE LETTER FINAL NUN", 67693); - _unicodeCharacterMap.Add("PALMYRENE LETTER NUN", 67694); - _unicodeCharacterMap.Add("PALMYRENE LETTER SAMEKH", 67695); - _unicodeCharacterMap.Add("PALMYRENE LETTER AYIN", 67696); - _unicodeCharacterMap.Add("PALMYRENE LETTER PE", 67697); - _unicodeCharacterMap.Add("PALMYRENE LETTER SADHE", 67698); - _unicodeCharacterMap.Add("PALMYRENE LETTER QOPH", 67699); - _unicodeCharacterMap.Add("PALMYRENE LETTER RESH", 67700); - _unicodeCharacterMap.Add("PALMYRENE LETTER SHIN", 67701); - _unicodeCharacterMap.Add("PALMYRENE LETTER TAW", 67702); - _unicodeCharacterMap.Add("PALMYRENE LEFT POINTING FLEURON", 67703); - _unicodeCharacterMap.Add("PALMYRENE RIGHT POINTING FLEURON", 67704); - _unicodeCharacterMap.Add("PALMYRENE NUMBER ONE", 67705); - _unicodeCharacterMap.Add("PALMYRENE NUMBER TWO", 67706); - _unicodeCharacterMap.Add("PALMYRENE NUMBER THREE", 67707); - _unicodeCharacterMap.Add("PALMYRENE NUMBER FOUR", 67708); - _unicodeCharacterMap.Add("PALMYRENE NUMBER FIVE", 67709); - _unicodeCharacterMap.Add("PALMYRENE NUMBER TEN", 67710); - _unicodeCharacterMap.Add("PALMYRENE NUMBER TWENTY", 67711); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL ALEPH", 67712); - _unicodeCharacterMap.Add("NABATAEAN LETTER ALEPH", 67713); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL BETH", 67714); - _unicodeCharacterMap.Add("NABATAEAN LETTER BETH", 67715); - _unicodeCharacterMap.Add("NABATAEAN LETTER GIMEL", 67716); - _unicodeCharacterMap.Add("NABATAEAN LETTER DALETH", 67717); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL HE", 67718); - _unicodeCharacterMap.Add("NABATAEAN LETTER HE", 67719); - _unicodeCharacterMap.Add("NABATAEAN LETTER WAW", 67720); - _unicodeCharacterMap.Add("NABATAEAN LETTER ZAYIN", 67721); - _unicodeCharacterMap.Add("NABATAEAN LETTER HETH", 67722); - _unicodeCharacterMap.Add("NABATAEAN LETTER TETH", 67723); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL YODH", 67724); - _unicodeCharacterMap.Add("NABATAEAN LETTER YODH", 67725); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL KAPH", 67726); - _unicodeCharacterMap.Add("NABATAEAN LETTER KAPH", 67727); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL LAMEDH", 67728); - _unicodeCharacterMap.Add("NABATAEAN LETTER LAMEDH", 67729); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL MEM", 67730); - _unicodeCharacterMap.Add("NABATAEAN LETTER MEM", 67731); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL NUN", 67732); - _unicodeCharacterMap.Add("NABATAEAN LETTER NUN", 67733); - _unicodeCharacterMap.Add("NABATAEAN LETTER SAMEKH", 67734); - _unicodeCharacterMap.Add("NABATAEAN LETTER AYIN", 67735); - _unicodeCharacterMap.Add("NABATAEAN LETTER PE", 67736); - _unicodeCharacterMap.Add("NABATAEAN LETTER SADHE", 67737); - _unicodeCharacterMap.Add("NABATAEAN LETTER QOPH", 67738); - _unicodeCharacterMap.Add("NABATAEAN LETTER RESH", 67739); - _unicodeCharacterMap.Add("NABATAEAN LETTER FINAL SHIN", 67740); - _unicodeCharacterMap.Add("NABATAEAN LETTER SHIN", 67741); - _unicodeCharacterMap.Add("NABATAEAN LETTER TAW", 67742); - _unicodeCharacterMap.Add("NABATAEAN NUMBER ONE", 67751); - _unicodeCharacterMap.Add("NABATAEAN NUMBER TWO", 67752); - _unicodeCharacterMap.Add("NABATAEAN NUMBER THREE", 67753); - _unicodeCharacterMap.Add("NABATAEAN NUMBER FOUR", 67754); - _unicodeCharacterMap.Add("NABATAEAN CRUCIFORM NUMBER FOUR", 67755); - _unicodeCharacterMap.Add("NABATAEAN NUMBER FIVE", 67756); - _unicodeCharacterMap.Add("NABATAEAN NUMBER TEN", 67757); - _unicodeCharacterMap.Add("NABATAEAN NUMBER TWENTY", 67758); - _unicodeCharacterMap.Add("NABATAEAN NUMBER ONE HUNDRED", 67759); - _unicodeCharacterMap.Add("HATRAN LETTER ALEPH", 67808); - _unicodeCharacterMap.Add("HATRAN LETTER BETH", 67809); - _unicodeCharacterMap.Add("HATRAN LETTER GIMEL", 67810); - _unicodeCharacterMap.Add("HATRAN LETTER DALETH RESH", 67811); - _unicodeCharacterMap.Add("HATRAN LETTER HE", 67812); - _unicodeCharacterMap.Add("HATRAN LETTER WAW", 67813); - _unicodeCharacterMap.Add("HATRAN LETTER ZAYN", 67814); - _unicodeCharacterMap.Add("HATRAN LETTER HETH", 67815); - _unicodeCharacterMap.Add("HATRAN LETTER TETH", 67816); - _unicodeCharacterMap.Add("HATRAN LETTER YODH", 67817); - _unicodeCharacterMap.Add("HATRAN LETTER KAPH", 67818); - _unicodeCharacterMap.Add("HATRAN LETTER LAMEDH", 67819); - _unicodeCharacterMap.Add("HATRAN LETTER MEM", 67820); - _unicodeCharacterMap.Add("HATRAN LETTER NUN", 67821); - _unicodeCharacterMap.Add("HATRAN LETTER SAMEKH", 67822); - _unicodeCharacterMap.Add("HATRAN LETTER AYN", 67823); - _unicodeCharacterMap.Add("HATRAN LETTER PE", 67824); - _unicodeCharacterMap.Add("HATRAN LETTER SADHE", 67825); - _unicodeCharacterMap.Add("HATRAN LETTER QOPH", 67826); - _unicodeCharacterMap.Add("HATRAN LETTER SHIN", 67828); - _unicodeCharacterMap.Add("HATRAN LETTER TAW", 67829); - _unicodeCharacterMap.Add("HATRAN NUMBER ONE", 67835); - _unicodeCharacterMap.Add("HATRAN NUMBER FIVE", 67836); - _unicodeCharacterMap.Add("HATRAN NUMBER TEN", 67837); - _unicodeCharacterMap.Add("HATRAN NUMBER TWENTY", 67838); - _unicodeCharacterMap.Add("HATRAN NUMBER ONE HUNDRED", 67839); - _unicodeCharacterMap.Add("PHOENICIAN LETTER ALF", 67840); - _unicodeCharacterMap.Add("PHOENICIAN LETTER BET", 67841); - _unicodeCharacterMap.Add("PHOENICIAN LETTER GAML", 67842); - _unicodeCharacterMap.Add("PHOENICIAN LETTER DELT", 67843); - _unicodeCharacterMap.Add("PHOENICIAN LETTER HE", 67844); - _unicodeCharacterMap.Add("PHOENICIAN LETTER WAU", 67845); - _unicodeCharacterMap.Add("PHOENICIAN LETTER ZAI", 67846); - _unicodeCharacterMap.Add("PHOENICIAN LETTER HET", 67847); - _unicodeCharacterMap.Add("PHOENICIAN LETTER TET", 67848); - _unicodeCharacterMap.Add("PHOENICIAN LETTER YOD", 67849); - _unicodeCharacterMap.Add("PHOENICIAN LETTER KAF", 67850); - _unicodeCharacterMap.Add("PHOENICIAN LETTER LAMD", 67851); - _unicodeCharacterMap.Add("PHOENICIAN LETTER MEM", 67852); - _unicodeCharacterMap.Add("PHOENICIAN LETTER NUN", 67853); - _unicodeCharacterMap.Add("PHOENICIAN LETTER SEMK", 67854); - _unicodeCharacterMap.Add("PHOENICIAN LETTER AIN", 67855); - _unicodeCharacterMap.Add("PHOENICIAN LETTER PE", 67856); - _unicodeCharacterMap.Add("PHOENICIAN LETTER SADE", 67857); - _unicodeCharacterMap.Add("PHOENICIAN LETTER QOF", 67858); - _unicodeCharacterMap.Add("PHOENICIAN LETTER ROSH", 67859); - _unicodeCharacterMap.Add("PHOENICIAN LETTER SHIN", 67860); - _unicodeCharacterMap.Add("PHOENICIAN LETTER TAU", 67861); - _unicodeCharacterMap.Add("PHOENICIAN NUMBER ONE", 67862); - _unicodeCharacterMap.Add("PHOENICIAN NUMBER TEN", 67863); - _unicodeCharacterMap.Add("PHOENICIAN NUMBER TWENTY", 67864); - _unicodeCharacterMap.Add("PHOENICIAN NUMBER ONE HUNDRED", 67865); - _unicodeCharacterMap.Add("PHOENICIAN NUMBER TWO", 67866); - _unicodeCharacterMap.Add("PHOENICIAN NUMBER THREE", 67867); - _unicodeCharacterMap.Add("PHOENICIAN WORD SEPARATOR", 67871); - _unicodeCharacterMap.Add("LYDIAN LETTER A", 67872); - _unicodeCharacterMap.Add("LYDIAN LETTER B", 67873); - _unicodeCharacterMap.Add("LYDIAN LETTER G", 67874); - _unicodeCharacterMap.Add("LYDIAN LETTER D", 67875); - _unicodeCharacterMap.Add("LYDIAN LETTER E", 67876); - _unicodeCharacterMap.Add("LYDIAN LETTER V", 67877); - _unicodeCharacterMap.Add("LYDIAN LETTER I", 67878); - _unicodeCharacterMap.Add("LYDIAN LETTER Y", 67879); - _unicodeCharacterMap.Add("LYDIAN LETTER K", 67880); - _unicodeCharacterMap.Add("LYDIAN LETTER L", 67881); - _unicodeCharacterMap.Add("LYDIAN LETTER M", 67882); - _unicodeCharacterMap.Add("LYDIAN LETTER N", 67883); - _unicodeCharacterMap.Add("LYDIAN LETTER O", 67884); - _unicodeCharacterMap.Add("LYDIAN LETTER R", 67885); - _unicodeCharacterMap.Add("LYDIAN LETTER SS", 67886); - _unicodeCharacterMap.Add("LYDIAN LETTER T", 67887); - _unicodeCharacterMap.Add("LYDIAN LETTER U", 67888); - _unicodeCharacterMap.Add("LYDIAN LETTER F", 67889); - _unicodeCharacterMap.Add("LYDIAN LETTER Q", 67890); - _unicodeCharacterMap.Add("LYDIAN LETTER S", 67891); - _unicodeCharacterMap.Add("LYDIAN LETTER TT", 67892); - _unicodeCharacterMap.Add("LYDIAN LETTER AN", 67893); - _unicodeCharacterMap.Add("LYDIAN LETTER EN", 67894); - _unicodeCharacterMap.Add("LYDIAN LETTER LY", 67895); - _unicodeCharacterMap.Add("LYDIAN LETTER NN", 67896); - _unicodeCharacterMap.Add("LYDIAN LETTER C", 67897); - _unicodeCharacterMap.Add("LYDIAN TRIANGULAR MARK", 67903); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER A", 67968); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER E", 67969); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER I", 67970); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER O", 67971); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER YA", 67972); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER WA", 67973); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER BA", 67974); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER BA 2", 67975); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER PA", 67976); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER MA", 67977); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER NA", 67978); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER NA 2", 67979); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER NE", 67980); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER NE 2", 67981); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER RA", 67982); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER RA 2", 67983); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER LA", 67984); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER KHA", 67985); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER HHA", 67986); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER SA", 67987); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER SA 2", 67988); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER SE", 67989); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER KA", 67990); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER QA", 67991); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER TA", 67992); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER TA 2", 67993); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER TE", 67994); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER TE 2", 67995); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER TO", 67996); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC LETTER DA", 67997); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC SYMBOL VIDJ", 67998); - _unicodeCharacterMap.Add("MEROITIC HIEROGLYPHIC SYMBOL VIDJ 2", 67999); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER A", 68000); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER E", 68001); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER I", 68002); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER O", 68003); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER YA", 68004); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER WA", 68005); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER BA", 68006); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER PA", 68007); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER MA", 68008); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER NA", 68009); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER NE", 68010); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER RA", 68011); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER LA", 68012); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER KHA", 68013); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER HHA", 68014); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER SA", 68015); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER ARCHAIC SA", 68016); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER SE", 68017); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER KA", 68018); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER QA", 68019); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER TA", 68020); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER TE", 68021); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER TO", 68022); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LETTER DA", 68023); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS", 68028); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION ONE HALF", 68029); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LOGOGRAM RMT", 68030); - _unicodeCharacterMap.Add("MEROITIC CURSIVE LOGOGRAM IMN", 68031); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER ONE", 68032); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TWO", 68033); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER THREE", 68034); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FOUR", 68035); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FIVE", 68036); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SIX", 68037); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SEVEN", 68038); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER EIGHT", 68039); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER NINE", 68040); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TEN", 68041); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TWENTY", 68042); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER THIRTY", 68043); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FORTY", 68044); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FIFTY", 68045); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SIXTY", 68046); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SEVENTY", 68047); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER ONE HUNDRED", 68050); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TWO HUNDRED", 68051); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER THREE HUNDRED", 68052); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FOUR HUNDRED", 68053); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FIVE HUNDRED", 68054); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SIX HUNDRED", 68055); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SEVEN HUNDRED", 68056); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER EIGHT HUNDRED", 68057); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER NINE HUNDRED", 68058); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER ONE THOUSAND", 68059); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TWO THOUSAND", 68060); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER THREE THOUSAND", 68061); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FOUR THOUSAND", 68062); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FIVE THOUSAND", 68063); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SIX THOUSAND", 68064); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SEVEN THOUSAND", 68065); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER EIGHT THOUSAND", 68066); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER NINE THOUSAND", 68067); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TEN THOUSAND", 68068); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TWENTY THOUSAND", 68069); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER THIRTY THOUSAND", 68070); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FORTY THOUSAND", 68071); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FIFTY THOUSAND", 68072); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SIXTY THOUSAND", 68073); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SEVENTY THOUSAND", 68074); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER EIGHTY THOUSAND", 68075); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER NINETY THOUSAND", 68076); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND", 68077); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND", 68078); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND", 68079); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND", 68080); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND", 68081); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND", 68082); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND", 68083); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND", 68084); - _unicodeCharacterMap.Add("MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND", 68085); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION ONE TWELFTH", 68086); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION TWO TWELFTHS", 68087); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION THREE TWELFTHS", 68088); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION FOUR TWELFTHS", 68089); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION FIVE TWELFTHS", 68090); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION SIX TWELFTHS", 68091); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION SEVEN TWELFTHS", 68092); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION EIGHT TWELFTHS", 68093); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION NINE TWELFTHS", 68094); - _unicodeCharacterMap.Add("MEROITIC CURSIVE FRACTION TEN TWELFTHS", 68095); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER A", 68096); - _unicodeCharacterMap.Add("KHAROSHTHI VOWEL SIGN I", 68097); - _unicodeCharacterMap.Add("KHAROSHTHI VOWEL SIGN U", 68098); - _unicodeCharacterMap.Add("KHAROSHTHI VOWEL SIGN VOCALIC R", 68099); - _unicodeCharacterMap.Add("KHAROSHTHI VOWEL SIGN E", 68101); - _unicodeCharacterMap.Add("KHAROSHTHI VOWEL SIGN O", 68102); - _unicodeCharacterMap.Add("KHAROSHTHI VOWEL LENGTH MARK", 68108); - _unicodeCharacterMap.Add("KHAROSHTHI SIGN DOUBLE RING BELOW", 68109); - _unicodeCharacterMap.Add("KHAROSHTHI SIGN ANUSVARA", 68110); - _unicodeCharacterMap.Add("KHAROSHTHI SIGN VISARGA", 68111); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER KA", 68112); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER KHA", 68113); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER GA", 68114); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER GHA", 68115); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER CA", 68117); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER CHA", 68118); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER JA", 68119); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER NYA", 68121); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER TTA", 68122); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER TTHA", 68123); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER DDA", 68124); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER DDHA", 68125); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER NNA", 68126); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER TA", 68127); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER THA", 68128); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER DA", 68129); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER DHA", 68130); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER NA", 68131); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER PA", 68132); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER PHA", 68133); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER BA", 68134); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER BHA", 68135); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER MA", 68136); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER YA", 68137); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER RA", 68138); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER LA", 68139); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER VA", 68140); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER SHA", 68141); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER SSA", 68142); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER SA", 68143); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER ZA", 68144); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER HA", 68145); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER KKA", 68146); - _unicodeCharacterMap.Add("KHAROSHTHI LETTER TTTHA", 68147); - _unicodeCharacterMap.Add("KHAROSHTHI SIGN BAR ABOVE", 68152); - _unicodeCharacterMap.Add("KHAROSHTHI SIGN CAUDA", 68153); - _unicodeCharacterMap.Add("KHAROSHTHI SIGN DOT BELOW", 68154); - _unicodeCharacterMap.Add("KHAROSHTHI VIRAMA", 68159); - _unicodeCharacterMap.Add("KHAROSHTHI DIGIT ONE", 68160); - _unicodeCharacterMap.Add("KHAROSHTHI DIGIT TWO", 68161); - _unicodeCharacterMap.Add("KHAROSHTHI DIGIT THREE", 68162); - _unicodeCharacterMap.Add("KHAROSHTHI DIGIT FOUR", 68163); - _unicodeCharacterMap.Add("KHAROSHTHI NUMBER TEN", 68164); - _unicodeCharacterMap.Add("KHAROSHTHI NUMBER TWENTY", 68165); - _unicodeCharacterMap.Add("KHAROSHTHI NUMBER ONE HUNDRED", 68166); - _unicodeCharacterMap.Add("KHAROSHTHI NUMBER ONE THOUSAND", 68167); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION DOT", 68176); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION SMALL CIRCLE", 68177); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION CIRCLE", 68178); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION CRESCENT BAR", 68179); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION MANGALAM", 68180); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION LOTUS", 68181); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION DANDA", 68182); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION DOUBLE DANDA", 68183); - _unicodeCharacterMap.Add("KHAROSHTHI PUNCTUATION LINES", 68184); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER HE", 68192); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER LAMEDH", 68193); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER HETH", 68194); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER MEM", 68195); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER QOPH", 68196); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER WAW", 68197); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER SHIN", 68198); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER RESH", 68199); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER BETH", 68200); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER TAW", 68201); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER SAT", 68202); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER KAPH", 68203); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER NUN", 68204); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER KHETH", 68205); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER SADHE", 68206); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER SAMEKH", 68207); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER FE", 68208); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER ALEF", 68209); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER AYN", 68210); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER DHADHE", 68211); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER GIMEL", 68212); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER DALETH", 68213); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER GHAYN", 68214); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER TETH", 68215); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER ZAYN", 68216); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER DHALETH", 68217); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER YODH", 68218); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER THAW", 68219); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN LETTER THETH", 68220); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN NUMBER ONE", 68221); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN NUMBER FIFTY", 68222); - _unicodeCharacterMap.Add("OLD SOUTH ARABIAN NUMERIC INDICATOR", 68223); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER HEH", 68224); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER LAM", 68225); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER HAH", 68226); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER MEEM", 68227); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER QAF", 68228); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER WAW", 68229); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER ES 2", 68230); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER REH", 68231); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER BEH", 68232); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER TEH", 68233); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER ES 1", 68234); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER KAF", 68235); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER NOON", 68236); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER KHAH", 68237); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER SAD", 68238); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER ES 3", 68239); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER FEH", 68240); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER ALEF", 68241); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER AIN", 68242); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER DAD", 68243); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER GEEM", 68244); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER DAL", 68245); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER GHAIN", 68246); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER TAH", 68247); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER ZAIN", 68248); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER THAL", 68249); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER YEH", 68250); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER THEH", 68251); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN LETTER ZAH", 68252); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN NUMBER ONE", 68253); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN NUMBER TEN", 68254); - _unicodeCharacterMap.Add("OLD NORTH ARABIAN NUMBER TWENTY", 68255); - _unicodeCharacterMap.Add("MANICHAEAN LETTER ALEPH", 68288); - _unicodeCharacterMap.Add("MANICHAEAN LETTER BETH", 68289); - _unicodeCharacterMap.Add("MANICHAEAN LETTER BHETH", 68290); - _unicodeCharacterMap.Add("MANICHAEAN LETTER GIMEL", 68291); - _unicodeCharacterMap.Add("MANICHAEAN LETTER GHIMEL", 68292); - _unicodeCharacterMap.Add("MANICHAEAN LETTER DALETH", 68293); - _unicodeCharacterMap.Add("MANICHAEAN LETTER HE", 68294); - _unicodeCharacterMap.Add("MANICHAEAN LETTER WAW", 68295); - _unicodeCharacterMap.Add("MANICHAEAN SIGN UD", 68296); - _unicodeCharacterMap.Add("MANICHAEAN LETTER ZAYIN", 68297); - _unicodeCharacterMap.Add("MANICHAEAN LETTER ZHAYIN", 68298); - _unicodeCharacterMap.Add("MANICHAEAN LETTER JAYIN", 68299); - _unicodeCharacterMap.Add("MANICHAEAN LETTER JHAYIN", 68300); - _unicodeCharacterMap.Add("MANICHAEAN LETTER HETH", 68301); - _unicodeCharacterMap.Add("MANICHAEAN LETTER TETH", 68302); - _unicodeCharacterMap.Add("MANICHAEAN LETTER YODH", 68303); - _unicodeCharacterMap.Add("MANICHAEAN LETTER KAPH", 68304); - _unicodeCharacterMap.Add("MANICHAEAN LETTER XAPH", 68305); - _unicodeCharacterMap.Add("MANICHAEAN LETTER KHAPH", 68306); - _unicodeCharacterMap.Add("MANICHAEAN LETTER LAMEDH", 68307); - _unicodeCharacterMap.Add("MANICHAEAN LETTER DHAMEDH", 68308); - _unicodeCharacterMap.Add("MANICHAEAN LETTER THAMEDH", 68309); - _unicodeCharacterMap.Add("MANICHAEAN LETTER MEM", 68310); - _unicodeCharacterMap.Add("MANICHAEAN LETTER NUN", 68311); - _unicodeCharacterMap.Add("MANICHAEAN LETTER SAMEKH", 68312); - _unicodeCharacterMap.Add("MANICHAEAN LETTER AYIN", 68313); - _unicodeCharacterMap.Add("MANICHAEAN LETTER AAYIN", 68314); - _unicodeCharacterMap.Add("MANICHAEAN LETTER PE", 68315); - _unicodeCharacterMap.Add("MANICHAEAN LETTER FE", 68316); - _unicodeCharacterMap.Add("MANICHAEAN LETTER SADHE", 68317); - _unicodeCharacterMap.Add("MANICHAEAN LETTER QOPH", 68318); - _unicodeCharacterMap.Add("MANICHAEAN LETTER XOPH", 68319); - _unicodeCharacterMap.Add("MANICHAEAN LETTER QHOPH", 68320); - _unicodeCharacterMap.Add("MANICHAEAN LETTER RESH", 68321); - _unicodeCharacterMap.Add("MANICHAEAN LETTER SHIN", 68322); - _unicodeCharacterMap.Add("MANICHAEAN LETTER SSHIN", 68323); - _unicodeCharacterMap.Add("MANICHAEAN LETTER TAW", 68324); - _unicodeCharacterMap.Add("MANICHAEAN ABBREVIATION MARK ABOVE", 68325); - _unicodeCharacterMap.Add("MANICHAEAN ABBREVIATION MARK BELOW", 68326); - _unicodeCharacterMap.Add("MANICHAEAN NUMBER ONE", 68331); - _unicodeCharacterMap.Add("MANICHAEAN NUMBER FIVE", 68332); - _unicodeCharacterMap.Add("MANICHAEAN NUMBER TEN", 68333); - _unicodeCharacterMap.Add("MANICHAEAN NUMBER TWENTY", 68334); - _unicodeCharacterMap.Add("MANICHAEAN NUMBER ONE HUNDRED", 68335); - _unicodeCharacterMap.Add("MANICHAEAN PUNCTUATION STAR", 68336); - _unicodeCharacterMap.Add("MANICHAEAN PUNCTUATION FLEURON", 68337); - _unicodeCharacterMap.Add("MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT", 68338); - _unicodeCharacterMap.Add("MANICHAEAN PUNCTUATION DOT WITHIN DOT", 68339); - _unicodeCharacterMap.Add("MANICHAEAN PUNCTUATION DOT", 68340); - _unicodeCharacterMap.Add("MANICHAEAN PUNCTUATION TWO DOTS", 68341); - _unicodeCharacterMap.Add("MANICHAEAN PUNCTUATION LINE FILLER", 68342); - _unicodeCharacterMap.Add("AVESTAN LETTER A", 68352); - _unicodeCharacterMap.Add("AVESTAN LETTER AA", 68353); - _unicodeCharacterMap.Add("AVESTAN LETTER AO", 68354); - _unicodeCharacterMap.Add("AVESTAN LETTER AAO", 68355); - _unicodeCharacterMap.Add("AVESTAN LETTER AN", 68356); - _unicodeCharacterMap.Add("AVESTAN LETTER AAN", 68357); - _unicodeCharacterMap.Add("AVESTAN LETTER AE", 68358); - _unicodeCharacterMap.Add("AVESTAN LETTER AEE", 68359); - _unicodeCharacterMap.Add("AVESTAN LETTER E", 68360); - _unicodeCharacterMap.Add("AVESTAN LETTER EE", 68361); - _unicodeCharacterMap.Add("AVESTAN LETTER O", 68362); - _unicodeCharacterMap.Add("AVESTAN LETTER OO", 68363); - _unicodeCharacterMap.Add("AVESTAN LETTER I", 68364); - _unicodeCharacterMap.Add("AVESTAN LETTER II", 68365); - _unicodeCharacterMap.Add("AVESTAN LETTER U", 68366); - _unicodeCharacterMap.Add("AVESTAN LETTER UU", 68367); - _unicodeCharacterMap.Add("AVESTAN LETTER KE", 68368); - _unicodeCharacterMap.Add("AVESTAN LETTER XE", 68369); - _unicodeCharacterMap.Add("AVESTAN LETTER XYE", 68370); - _unicodeCharacterMap.Add("AVESTAN LETTER XVE", 68371); - _unicodeCharacterMap.Add("AVESTAN LETTER GE", 68372); - _unicodeCharacterMap.Add("AVESTAN LETTER GGE", 68373); - _unicodeCharacterMap.Add("AVESTAN LETTER GHE", 68374); - _unicodeCharacterMap.Add("AVESTAN LETTER CE", 68375); - _unicodeCharacterMap.Add("AVESTAN LETTER JE", 68376); - _unicodeCharacterMap.Add("AVESTAN LETTER TE", 68377); - _unicodeCharacterMap.Add("AVESTAN LETTER THE", 68378); - _unicodeCharacterMap.Add("AVESTAN LETTER DE", 68379); - _unicodeCharacterMap.Add("AVESTAN LETTER DHE", 68380); - _unicodeCharacterMap.Add("AVESTAN LETTER TTE", 68381); - _unicodeCharacterMap.Add("AVESTAN LETTER PE", 68382); - _unicodeCharacterMap.Add("AVESTAN LETTER FE", 68383); - _unicodeCharacterMap.Add("AVESTAN LETTER BE", 68384); - _unicodeCharacterMap.Add("AVESTAN LETTER BHE", 68385); - _unicodeCharacterMap.Add("AVESTAN LETTER NGE", 68386); - _unicodeCharacterMap.Add("AVESTAN LETTER NGYE", 68387); - _unicodeCharacterMap.Add("AVESTAN LETTER NGVE", 68388); - _unicodeCharacterMap.Add("AVESTAN LETTER NE", 68389); - _unicodeCharacterMap.Add("AVESTAN LETTER NYE", 68390); - _unicodeCharacterMap.Add("AVESTAN LETTER NNE", 68391); - _unicodeCharacterMap.Add("AVESTAN LETTER ME", 68392); - _unicodeCharacterMap.Add("AVESTAN LETTER HME", 68393); - _unicodeCharacterMap.Add("AVESTAN LETTER YYE", 68394); - _unicodeCharacterMap.Add("AVESTAN LETTER YE", 68395); - _unicodeCharacterMap.Add("AVESTAN LETTER VE", 68396); - _unicodeCharacterMap.Add("AVESTAN LETTER RE", 68397); - _unicodeCharacterMap.Add("AVESTAN LETTER LE", 68398); - _unicodeCharacterMap.Add("AVESTAN LETTER SE", 68399); - _unicodeCharacterMap.Add("AVESTAN LETTER ZE", 68400); - _unicodeCharacterMap.Add("AVESTAN LETTER SHE", 68401); - _unicodeCharacterMap.Add("AVESTAN LETTER ZHE", 68402); - _unicodeCharacterMap.Add("AVESTAN LETTER SHYE", 68403); - _unicodeCharacterMap.Add("AVESTAN LETTER SSHE", 68404); - _unicodeCharacterMap.Add("AVESTAN LETTER HE", 68405); - _unicodeCharacterMap.Add("AVESTAN ABBREVIATION MARK", 68409); - _unicodeCharacterMap.Add("TINY TWO DOTS OVER ONE DOT PUNCTUATION", 68410); - _unicodeCharacterMap.Add("SMALL TWO DOTS OVER ONE DOT PUNCTUATION", 68411); - _unicodeCharacterMap.Add("LARGE TWO DOTS OVER ONE DOT PUNCTUATION", 68412); - _unicodeCharacterMap.Add("LARGE ONE DOT OVER TWO DOTS PUNCTUATION", 68413); - _unicodeCharacterMap.Add("LARGE TWO RINGS OVER ONE RING PUNCTUATION", 68414); - _unicodeCharacterMap.Add("LARGE ONE RING OVER TWO RINGS PUNCTUATION", 68415); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER ALEPH", 68416); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER BETH", 68417); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER GIMEL", 68418); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER DALETH", 68419); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER HE", 68420); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER WAW", 68421); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER ZAYIN", 68422); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER HETH", 68423); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER TETH", 68424); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER YODH", 68425); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER KAPH", 68426); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER LAMEDH", 68427); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER MEM", 68428); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER NUN", 68429); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER SAMEKH", 68430); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER AYIN", 68431); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER PE", 68432); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER SADHE", 68433); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER QOPH", 68434); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER RESH", 68435); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER SHIN", 68436); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN LETTER TAW", 68437); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER ONE", 68440); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER TWO", 68441); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER THREE", 68442); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER FOUR", 68443); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER TEN", 68444); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER TWENTY", 68445); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED", 68446); - _unicodeCharacterMap.Add("INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND", 68447); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER ALEPH", 68448); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER BETH", 68449); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER GIMEL", 68450); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER DALETH", 68451); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER HE", 68452); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER WAW AYIN RESH", 68453); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER ZAYIN", 68454); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER HETH", 68455); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER TETH", 68456); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER YODH", 68457); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER KAPH", 68458); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER LAMEDH", 68459); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER MEM QOPH", 68460); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER NUN", 68461); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER SAMEKH", 68462); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER PE", 68463); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER SADHE", 68464); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER SHIN", 68465); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI LETTER TAW", 68466); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER ONE", 68472); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER TWO", 68473); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER THREE", 68474); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER FOUR", 68475); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER TEN", 68476); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER TWENTY", 68477); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED", 68478); - _unicodeCharacterMap.Add("INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND", 68479); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER ALEPH", 68480); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER BETH", 68481); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER GIMEL", 68482); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER DALETH", 68483); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER HE", 68484); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER WAW AYIN RESH", 68485); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER ZAYIN", 68486); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER HETH", 68487); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER YODH", 68488); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER KAPH", 68489); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER LAMEDH", 68490); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER MEM QOPH", 68491); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER NUN", 68492); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER SAMEKH", 68493); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER PE", 68494); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER SADHE", 68495); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER SHIN", 68496); - _unicodeCharacterMap.Add("PSALTER PAHLAVI LETTER TAW", 68497); - _unicodeCharacterMap.Add("PSALTER PAHLAVI SECTION MARK", 68505); - _unicodeCharacterMap.Add("PSALTER PAHLAVI TURNED SECTION MARK", 68506); - _unicodeCharacterMap.Add("PSALTER PAHLAVI FOUR DOTS WITH CROSS", 68507); - _unicodeCharacterMap.Add("PSALTER PAHLAVI FOUR DOTS WITH DOT", 68508); - _unicodeCharacterMap.Add("PSALTER PAHLAVI NUMBER ONE", 68521); - _unicodeCharacterMap.Add("PSALTER PAHLAVI NUMBER TWO", 68522); - _unicodeCharacterMap.Add("PSALTER PAHLAVI NUMBER THREE", 68523); - _unicodeCharacterMap.Add("PSALTER PAHLAVI NUMBER FOUR", 68524); - _unicodeCharacterMap.Add("PSALTER PAHLAVI NUMBER TEN", 68525); - _unicodeCharacterMap.Add("PSALTER PAHLAVI NUMBER TWENTY", 68526); - _unicodeCharacterMap.Add("PSALTER PAHLAVI NUMBER ONE HUNDRED", 68527); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON A", 68608); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI A", 68609); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AE", 68610); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON I", 68611); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI I", 68612); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI E", 68613); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON O", 68614); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON OE", 68615); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI OE", 68616); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AB", 68617); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AB", 68618); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AEB", 68619); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AEB", 68620); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AG", 68621); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AG", 68622); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AEG", 68623); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AEG", 68624); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AD", 68625); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AD", 68626); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AED", 68627); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON EZ", 68628); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI EZ", 68629); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AY", 68630); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AY", 68631); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AEY", 68632); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AEY", 68633); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AEK", 68634); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AEK", 68635); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON OEK", 68636); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI OEK", 68637); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AL", 68638); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AL", 68639); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AEL", 68640); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON ELT", 68641); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON EM", 68642); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AN", 68643); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AEN", 68644); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AEN", 68645); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON ENT", 68646); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI ENT", 68647); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON ENC", 68648); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI ENC", 68649); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON ENY", 68650); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI ENY", 68651); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI ANG", 68652); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON ENG", 68653); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AENG", 68654); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON EP", 68655); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON OP", 68656); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON IC", 68657); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON EC", 68658); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI EC", 68659); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AQ", 68660); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AQ", 68661); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON IQ", 68662); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI IQ", 68663); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON OQ", 68664); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI OQ", 68665); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AR", 68666); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AR", 68667); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AER", 68668); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AS", 68669); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AES", 68670); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON ASH", 68671); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI ASH", 68672); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON ESH", 68673); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI ESH", 68674); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AT", 68675); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AT", 68676); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON AET", 68677); - _unicodeCharacterMap.Add("OLD TURKIC LETTER YENISEI AET", 68678); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON OT", 68679); - _unicodeCharacterMap.Add("OLD TURKIC LETTER ORKHON BASH", 68680); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER A", 68736); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER AA", 68737); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EB", 68738); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER AMB", 68739); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EC", 68740); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ENC", 68741); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ECS", 68742); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ED", 68743); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER AND", 68744); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER E", 68745); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER CLOSE E", 68746); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EE", 68747); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EF", 68748); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EG", 68749); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EGY", 68750); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EH", 68751); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER I", 68752); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER II", 68753); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EJ", 68754); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EK", 68755); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER AK", 68756); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER UNK", 68757); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EL", 68758); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ELY", 68759); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EM", 68760); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EN", 68761); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ENY", 68762); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER O", 68763); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER OO", 68764); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE", 68765); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE", 68766); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER OEE", 68767); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EP", 68768); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EMP", 68769); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ER", 68770); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER SHORT ER", 68771); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ES", 68772); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ESZ", 68773); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ET", 68774); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ENT", 68775); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ETY", 68776); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ECH", 68777); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER U", 68778); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER UU", 68779); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE", 68780); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE", 68781); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EV", 68782); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EZ", 68783); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER EZS", 68784); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER ENT SHAPED SIGN", 68785); - _unicodeCharacterMap.Add("OLD HUNGARIAN CAPITAL LETTER US", 68786); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER A", 68800); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER AA", 68801); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EB", 68802); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER AMB", 68803); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EC", 68804); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ENC", 68805); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ECS", 68806); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ED", 68807); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER AND", 68808); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER E", 68809); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER CLOSE E", 68810); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EE", 68811); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EF", 68812); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EG", 68813); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EGY", 68814); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EH", 68815); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER I", 68816); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER II", 68817); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EJ", 68818); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EK", 68819); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER AK", 68820); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER UNK", 68821); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EL", 68822); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ELY", 68823); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EM", 68824); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EN", 68825); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ENY", 68826); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER O", 68827); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER OO", 68828); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE", 68829); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER RUDIMENTA OE", 68830); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER OEE", 68831); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EP", 68832); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EMP", 68833); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ER", 68834); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER SHORT ER", 68835); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ES", 68836); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ESZ", 68837); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ET", 68838); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ENT", 68839); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ETY", 68840); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ECH", 68841); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER U", 68842); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER UU", 68843); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE", 68844); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER RUDIMENTA UE", 68845); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EV", 68846); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EZ", 68847); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER EZS", 68848); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER ENT SHAPED SIGN", 68849); - _unicodeCharacterMap.Add("OLD HUNGARIAN SMALL LETTER US", 68850); - _unicodeCharacterMap.Add("OLD HUNGARIAN NUMBER ONE", 68858); - _unicodeCharacterMap.Add("OLD HUNGARIAN NUMBER FIVE", 68859); - _unicodeCharacterMap.Add("OLD HUNGARIAN NUMBER TEN", 68860); - _unicodeCharacterMap.Add("OLD HUNGARIAN NUMBER FIFTY", 68861); - _unicodeCharacterMap.Add("OLD HUNGARIAN NUMBER ONE HUNDRED", 68862); - _unicodeCharacterMap.Add("OLD HUNGARIAN NUMBER ONE THOUSAND", 68863); - _unicodeCharacterMap.Add("RUMI DIGIT ONE", 69216); - _unicodeCharacterMap.Add("RUMI DIGIT TWO", 69217); - _unicodeCharacterMap.Add("RUMI DIGIT THREE", 69218); - _unicodeCharacterMap.Add("RUMI DIGIT FOUR", 69219); - _unicodeCharacterMap.Add("RUMI DIGIT FIVE", 69220); - _unicodeCharacterMap.Add("RUMI DIGIT SIX", 69221); - _unicodeCharacterMap.Add("RUMI DIGIT SEVEN", 69222); - _unicodeCharacterMap.Add("RUMI DIGIT EIGHT", 69223); - _unicodeCharacterMap.Add("RUMI DIGIT NINE", 69224); - _unicodeCharacterMap.Add("RUMI NUMBER TEN", 69225); - _unicodeCharacterMap.Add("RUMI NUMBER TWENTY", 69226); - _unicodeCharacterMap.Add("RUMI NUMBER THIRTY", 69227); - _unicodeCharacterMap.Add("RUMI NUMBER FORTY", 69228); - _unicodeCharacterMap.Add("RUMI NUMBER FIFTY", 69229); - _unicodeCharacterMap.Add("RUMI NUMBER SIXTY", 69230); - _unicodeCharacterMap.Add("RUMI NUMBER SEVENTY", 69231); - _unicodeCharacterMap.Add("RUMI NUMBER EIGHTY", 69232); - _unicodeCharacterMap.Add("RUMI NUMBER NINETY", 69233); - _unicodeCharacterMap.Add("RUMI NUMBER ONE HUNDRED", 69234); - _unicodeCharacterMap.Add("RUMI NUMBER TWO HUNDRED", 69235); - _unicodeCharacterMap.Add("RUMI NUMBER THREE HUNDRED", 69236); - _unicodeCharacterMap.Add("RUMI NUMBER FOUR HUNDRED", 69237); - _unicodeCharacterMap.Add("RUMI NUMBER FIVE HUNDRED", 69238); - _unicodeCharacterMap.Add("RUMI NUMBER SIX HUNDRED", 69239); - _unicodeCharacterMap.Add("RUMI NUMBER SEVEN HUNDRED", 69240); - _unicodeCharacterMap.Add("RUMI NUMBER EIGHT HUNDRED", 69241); - _unicodeCharacterMap.Add("RUMI NUMBER NINE HUNDRED", 69242); - _unicodeCharacterMap.Add("RUMI FRACTION ONE HALF", 69243); - _unicodeCharacterMap.Add("RUMI FRACTION ONE QUARTER", 69244); - _unicodeCharacterMap.Add("RUMI FRACTION ONE THIRD", 69245); - _unicodeCharacterMap.Add("RUMI FRACTION TWO THIRDS", 69246); - _unicodeCharacterMap.Add("BRAHMI SIGN CANDRABINDU", 69632); - _unicodeCharacterMap.Add("BRAHMI SIGN ANUSVARA", 69633); - _unicodeCharacterMap.Add("BRAHMI SIGN VISARGA", 69634); - _unicodeCharacterMap.Add("BRAHMI SIGN JIHVAMULIYA", 69635); - _unicodeCharacterMap.Add("BRAHMI SIGN UPADHMANIYA", 69636); - _unicodeCharacterMap.Add("BRAHMI LETTER A", 69637); - _unicodeCharacterMap.Add("BRAHMI LETTER AA", 69638); - _unicodeCharacterMap.Add("BRAHMI LETTER I", 69639); - _unicodeCharacterMap.Add("BRAHMI LETTER II", 69640); - _unicodeCharacterMap.Add("BRAHMI LETTER U", 69641); - _unicodeCharacterMap.Add("BRAHMI LETTER UU", 69642); - _unicodeCharacterMap.Add("BRAHMI LETTER VOCALIC R", 69643); - _unicodeCharacterMap.Add("BRAHMI LETTER VOCALIC RR", 69644); - _unicodeCharacterMap.Add("BRAHMI LETTER VOCALIC L", 69645); - _unicodeCharacterMap.Add("BRAHMI LETTER VOCALIC LL", 69646); - _unicodeCharacterMap.Add("BRAHMI LETTER E", 69647); - _unicodeCharacterMap.Add("BRAHMI LETTER AI", 69648); - _unicodeCharacterMap.Add("BRAHMI LETTER O", 69649); - _unicodeCharacterMap.Add("BRAHMI LETTER AU", 69650); - _unicodeCharacterMap.Add("BRAHMI LETTER KA", 69651); - _unicodeCharacterMap.Add("BRAHMI LETTER KHA", 69652); - _unicodeCharacterMap.Add("BRAHMI LETTER GA", 69653); - _unicodeCharacterMap.Add("BRAHMI LETTER GHA", 69654); - _unicodeCharacterMap.Add("BRAHMI LETTER NGA", 69655); - _unicodeCharacterMap.Add("BRAHMI LETTER CA", 69656); - _unicodeCharacterMap.Add("BRAHMI LETTER CHA", 69657); - _unicodeCharacterMap.Add("BRAHMI LETTER JA", 69658); - _unicodeCharacterMap.Add("BRAHMI LETTER JHA", 69659); - _unicodeCharacterMap.Add("BRAHMI LETTER NYA", 69660); - _unicodeCharacterMap.Add("BRAHMI LETTER TTA", 69661); - _unicodeCharacterMap.Add("BRAHMI LETTER TTHA", 69662); - _unicodeCharacterMap.Add("BRAHMI LETTER DDA", 69663); - _unicodeCharacterMap.Add("BRAHMI LETTER DDHA", 69664); - _unicodeCharacterMap.Add("BRAHMI LETTER NNA", 69665); - _unicodeCharacterMap.Add("BRAHMI LETTER TA", 69666); - _unicodeCharacterMap.Add("BRAHMI LETTER THA", 69667); - _unicodeCharacterMap.Add("BRAHMI LETTER DA", 69668); - _unicodeCharacterMap.Add("BRAHMI LETTER DHA", 69669); - _unicodeCharacterMap.Add("BRAHMI LETTER NA", 69670); - _unicodeCharacterMap.Add("BRAHMI LETTER PA", 69671); - _unicodeCharacterMap.Add("BRAHMI LETTER PHA", 69672); - _unicodeCharacterMap.Add("BRAHMI LETTER BA", 69673); - _unicodeCharacterMap.Add("BRAHMI LETTER BHA", 69674); - _unicodeCharacterMap.Add("BRAHMI LETTER MA", 69675); - _unicodeCharacterMap.Add("BRAHMI LETTER YA", 69676); - _unicodeCharacterMap.Add("BRAHMI LETTER RA", 69677); - _unicodeCharacterMap.Add("BRAHMI LETTER LA", 69678); - _unicodeCharacterMap.Add("BRAHMI LETTER VA", 69679); - _unicodeCharacterMap.Add("BRAHMI LETTER SHA", 69680); - _unicodeCharacterMap.Add("BRAHMI LETTER SSA", 69681); - _unicodeCharacterMap.Add("BRAHMI LETTER SA", 69682); - _unicodeCharacterMap.Add("BRAHMI LETTER HA", 69683); - _unicodeCharacterMap.Add("BRAHMI LETTER LLA", 69684); - _unicodeCharacterMap.Add("BRAHMI LETTER OLD TAMIL LLLA", 69685); - _unicodeCharacterMap.Add("BRAHMI LETTER OLD TAMIL RRA", 69686); - _unicodeCharacterMap.Add("BRAHMI LETTER OLD TAMIL NNNA", 69687); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN AA", 69688); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN BHATTIPROLU AA", 69689); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN I", 69690); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN II", 69691); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN U", 69692); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN UU", 69693); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN VOCALIC R", 69694); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN VOCALIC RR", 69695); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN VOCALIC L", 69696); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN VOCALIC LL", 69697); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN E", 69698); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN AI", 69699); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN O", 69700); - _unicodeCharacterMap.Add("BRAHMI VOWEL SIGN AU", 69701); - _unicodeCharacterMap.Add("BRAHMI VIRAMA", 69702); - _unicodeCharacterMap.Add("BRAHMI DANDA", 69703); - _unicodeCharacterMap.Add("BRAHMI DOUBLE DANDA", 69704); - _unicodeCharacterMap.Add("BRAHMI PUNCTUATION DOT", 69705); - _unicodeCharacterMap.Add("BRAHMI PUNCTUATION DOUBLE DOT", 69706); - _unicodeCharacterMap.Add("BRAHMI PUNCTUATION LINE", 69707); - _unicodeCharacterMap.Add("BRAHMI PUNCTUATION CRESCENT BAR", 69708); - _unicodeCharacterMap.Add("BRAHMI PUNCTUATION LOTUS", 69709); - _unicodeCharacterMap.Add("BRAHMI NUMBER ONE", 69714); - _unicodeCharacterMap.Add("BRAHMI NUMBER TWO", 69715); - _unicodeCharacterMap.Add("BRAHMI NUMBER THREE", 69716); - _unicodeCharacterMap.Add("BRAHMI NUMBER FOUR", 69717); - _unicodeCharacterMap.Add("BRAHMI NUMBER FIVE", 69718); - _unicodeCharacterMap.Add("BRAHMI NUMBER SIX", 69719); - _unicodeCharacterMap.Add("BRAHMI NUMBER SEVEN", 69720); - _unicodeCharacterMap.Add("BRAHMI NUMBER EIGHT", 69721); - _unicodeCharacterMap.Add("BRAHMI NUMBER NINE", 69722); - _unicodeCharacterMap.Add("BRAHMI NUMBER TEN", 69723); - _unicodeCharacterMap.Add("BRAHMI NUMBER TWENTY", 69724); - _unicodeCharacterMap.Add("BRAHMI NUMBER THIRTY", 69725); - _unicodeCharacterMap.Add("BRAHMI NUMBER FORTY", 69726); - _unicodeCharacterMap.Add("BRAHMI NUMBER FIFTY", 69727); - _unicodeCharacterMap.Add("BRAHMI NUMBER SIXTY", 69728); - _unicodeCharacterMap.Add("BRAHMI NUMBER SEVENTY", 69729); - _unicodeCharacterMap.Add("BRAHMI NUMBER EIGHTY", 69730); - _unicodeCharacterMap.Add("BRAHMI NUMBER NINETY", 69731); - _unicodeCharacterMap.Add("BRAHMI NUMBER ONE HUNDRED", 69732); - _unicodeCharacterMap.Add("BRAHMI NUMBER ONE THOUSAND", 69733); - _unicodeCharacterMap.Add("BRAHMI DIGIT ZERO", 69734); - _unicodeCharacterMap.Add("BRAHMI DIGIT ONE", 69735); - _unicodeCharacterMap.Add("BRAHMI DIGIT TWO", 69736); - _unicodeCharacterMap.Add("BRAHMI DIGIT THREE", 69737); - _unicodeCharacterMap.Add("BRAHMI DIGIT FOUR", 69738); - _unicodeCharacterMap.Add("BRAHMI DIGIT FIVE", 69739); - _unicodeCharacterMap.Add("BRAHMI DIGIT SIX", 69740); - _unicodeCharacterMap.Add("BRAHMI DIGIT SEVEN", 69741); - _unicodeCharacterMap.Add("BRAHMI DIGIT EIGHT", 69742); - _unicodeCharacterMap.Add("BRAHMI DIGIT NINE", 69743); - _unicodeCharacterMap.Add("BRAHMI NUMBER JOINER", 69759); - _unicodeCharacterMap.Add("KAITHI SIGN CANDRABINDU", 69760); - _unicodeCharacterMap.Add("KAITHI SIGN ANUSVARA", 69761); - _unicodeCharacterMap.Add("KAITHI SIGN VISARGA", 69762); - _unicodeCharacterMap.Add("KAITHI LETTER A", 69763); - _unicodeCharacterMap.Add("KAITHI LETTER AA", 69764); - _unicodeCharacterMap.Add("KAITHI LETTER I", 69765); - _unicodeCharacterMap.Add("KAITHI LETTER II", 69766); - _unicodeCharacterMap.Add("KAITHI LETTER U", 69767); - _unicodeCharacterMap.Add("KAITHI LETTER UU", 69768); - _unicodeCharacterMap.Add("KAITHI LETTER E", 69769); - _unicodeCharacterMap.Add("KAITHI LETTER AI", 69770); - _unicodeCharacterMap.Add("KAITHI LETTER O", 69771); - _unicodeCharacterMap.Add("KAITHI LETTER AU", 69772); - _unicodeCharacterMap.Add("KAITHI LETTER KA", 69773); - _unicodeCharacterMap.Add("KAITHI LETTER KHA", 69774); - _unicodeCharacterMap.Add("KAITHI LETTER GA", 69775); - _unicodeCharacterMap.Add("KAITHI LETTER GHA", 69776); - _unicodeCharacterMap.Add("KAITHI LETTER NGA", 69777); - _unicodeCharacterMap.Add("KAITHI LETTER CA", 69778); - _unicodeCharacterMap.Add("KAITHI LETTER CHA", 69779); - _unicodeCharacterMap.Add("KAITHI LETTER JA", 69780); - _unicodeCharacterMap.Add("KAITHI LETTER JHA", 69781); - _unicodeCharacterMap.Add("KAITHI LETTER NYA", 69782); - _unicodeCharacterMap.Add("KAITHI LETTER TTA", 69783); - _unicodeCharacterMap.Add("KAITHI LETTER TTHA", 69784); - _unicodeCharacterMap.Add("KAITHI LETTER DDA", 69785); - _unicodeCharacterMap.Add("KAITHI LETTER DDDHA", 69786); - _unicodeCharacterMap.Add("KAITHI LETTER DDHA", 69787); - _unicodeCharacterMap.Add("KAITHI LETTER RHA", 69788); - _unicodeCharacterMap.Add("KAITHI LETTER NNA", 69789); - _unicodeCharacterMap.Add("KAITHI LETTER TA", 69790); - _unicodeCharacterMap.Add("KAITHI LETTER THA", 69791); - _unicodeCharacterMap.Add("KAITHI LETTER DA", 69792); - _unicodeCharacterMap.Add("KAITHI LETTER DHA", 69793); - _unicodeCharacterMap.Add("KAITHI LETTER NA", 69794); - _unicodeCharacterMap.Add("KAITHI LETTER PA", 69795); - _unicodeCharacterMap.Add("KAITHI LETTER PHA", 69796); - _unicodeCharacterMap.Add("KAITHI LETTER BA", 69797); - _unicodeCharacterMap.Add("KAITHI LETTER BHA", 69798); - _unicodeCharacterMap.Add("KAITHI LETTER MA", 69799); - _unicodeCharacterMap.Add("KAITHI LETTER YA", 69800); - _unicodeCharacterMap.Add("KAITHI LETTER RA", 69801); - _unicodeCharacterMap.Add("KAITHI LETTER LA", 69802); - _unicodeCharacterMap.Add("KAITHI LETTER VA", 69803); - _unicodeCharacterMap.Add("KAITHI LETTER SHA", 69804); - _unicodeCharacterMap.Add("KAITHI LETTER SSA", 69805); - _unicodeCharacterMap.Add("KAITHI LETTER SA", 69806); - _unicodeCharacterMap.Add("KAITHI LETTER HA", 69807); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN AA", 69808); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN I", 69809); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN II", 69810); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN U", 69811); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN UU", 69812); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN E", 69813); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN AI", 69814); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN O", 69815); - _unicodeCharacterMap.Add("KAITHI VOWEL SIGN AU", 69816); - _unicodeCharacterMap.Add("KAITHI SIGN VIRAMA", 69817); - _unicodeCharacterMap.Add("KAITHI SIGN NUKTA", 69818); - _unicodeCharacterMap.Add("KAITHI ABBREVIATION SIGN", 69819); - _unicodeCharacterMap.Add("KAITHI ENUMERATION SIGN", 69820); - _unicodeCharacterMap.Add("KAITHI NUMBER SIGN", 69821); - _unicodeCharacterMap.Add("KAITHI SECTION MARK", 69822); - _unicodeCharacterMap.Add("KAITHI DOUBLE SECTION MARK", 69823); - _unicodeCharacterMap.Add("KAITHI DANDA", 69824); - _unicodeCharacterMap.Add("KAITHI DOUBLE DANDA", 69825); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER SAH", 69840); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER TAH", 69841); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER BAH", 69842); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER CAH", 69843); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER DAH", 69844); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER GAH", 69845); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER MAH", 69846); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER NGAH", 69847); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER LAH", 69848); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER NAH", 69849); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER VAH", 69850); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER PAH", 69851); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER YAH", 69852); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER RAH", 69853); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER HAH", 69854); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER KAH", 69855); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER JAH", 69856); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER NYAH", 69857); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER AH", 69858); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER EEH", 69859); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER IH", 69860); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER UH", 69861); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER OH", 69862); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER EH", 69863); - _unicodeCharacterMap.Add("SORA SOMPENG LETTER MAE", 69864); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT ZERO", 69872); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT ONE", 69873); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT TWO", 69874); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT THREE", 69875); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT FOUR", 69876); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT FIVE", 69877); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT SIX", 69878); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT SEVEN", 69879); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT EIGHT", 69880); - _unicodeCharacterMap.Add("SORA SOMPENG DIGIT NINE", 69881); - _unicodeCharacterMap.Add("CHAKMA SIGN CANDRABINDU", 69888); - _unicodeCharacterMap.Add("CHAKMA SIGN ANUSVARA", 69889); - _unicodeCharacterMap.Add("CHAKMA SIGN VISARGA", 69890); - _unicodeCharacterMap.Add("CHAKMA LETTER AA", 69891); - _unicodeCharacterMap.Add("CHAKMA LETTER I", 69892); - _unicodeCharacterMap.Add("CHAKMA LETTER U", 69893); - _unicodeCharacterMap.Add("CHAKMA LETTER E", 69894); - _unicodeCharacterMap.Add("CHAKMA LETTER KAA", 69895); - _unicodeCharacterMap.Add("CHAKMA LETTER KHAA", 69896); - _unicodeCharacterMap.Add("CHAKMA LETTER GAA", 69897); - _unicodeCharacterMap.Add("CHAKMA LETTER GHAA", 69898); - _unicodeCharacterMap.Add("CHAKMA LETTER NGAA", 69899); - _unicodeCharacterMap.Add("CHAKMA LETTER CAA", 69900); - _unicodeCharacterMap.Add("CHAKMA LETTER CHAA", 69901); - _unicodeCharacterMap.Add("CHAKMA LETTER JAA", 69902); - _unicodeCharacterMap.Add("CHAKMA LETTER JHAA", 69903); - _unicodeCharacterMap.Add("CHAKMA LETTER NYAA", 69904); - _unicodeCharacterMap.Add("CHAKMA LETTER TTAA", 69905); - _unicodeCharacterMap.Add("CHAKMA LETTER TTHAA", 69906); - _unicodeCharacterMap.Add("CHAKMA LETTER DDAA", 69907); - _unicodeCharacterMap.Add("CHAKMA LETTER DDHAA", 69908); - _unicodeCharacterMap.Add("CHAKMA LETTER NNAA", 69909); - _unicodeCharacterMap.Add("CHAKMA LETTER TAA", 69910); - _unicodeCharacterMap.Add("CHAKMA LETTER THAA", 69911); - _unicodeCharacterMap.Add("CHAKMA LETTER DAA", 69912); - _unicodeCharacterMap.Add("CHAKMA LETTER DHAA", 69913); - _unicodeCharacterMap.Add("CHAKMA LETTER NAA", 69914); - _unicodeCharacterMap.Add("CHAKMA LETTER PAA", 69915); - _unicodeCharacterMap.Add("CHAKMA LETTER PHAA", 69916); - _unicodeCharacterMap.Add("CHAKMA LETTER BAA", 69917); - _unicodeCharacterMap.Add("CHAKMA LETTER BHAA", 69918); - _unicodeCharacterMap.Add("CHAKMA LETTER MAA", 69919); - _unicodeCharacterMap.Add("CHAKMA LETTER YYAA", 69920); - _unicodeCharacterMap.Add("CHAKMA LETTER YAA", 69921); - _unicodeCharacterMap.Add("CHAKMA LETTER RAA", 69922); - _unicodeCharacterMap.Add("CHAKMA LETTER LAA", 69923); - _unicodeCharacterMap.Add("CHAKMA LETTER WAA", 69924); - _unicodeCharacterMap.Add("CHAKMA LETTER SAA", 69925); - _unicodeCharacterMap.Add("CHAKMA LETTER HAA", 69926); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN A", 69927); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN I", 69928); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN II", 69929); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN U", 69930); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN UU", 69931); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN E", 69932); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN AI", 69933); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN O", 69934); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN AU", 69935); - _unicodeCharacterMap.Add("CHAKMA VOWEL SIGN OI", 69936); - _unicodeCharacterMap.Add("CHAKMA O MARK", 69937); - _unicodeCharacterMap.Add("CHAKMA AU MARK", 69938); - _unicodeCharacterMap.Add("CHAKMA VIRAMA", 69939); - _unicodeCharacterMap.Add("CHAKMA MAAYYAA", 69940); - _unicodeCharacterMap.Add("CHAKMA DIGIT ZERO", 69942); - _unicodeCharacterMap.Add("CHAKMA DIGIT ONE", 69943); - _unicodeCharacterMap.Add("CHAKMA DIGIT TWO", 69944); - _unicodeCharacterMap.Add("CHAKMA DIGIT THREE", 69945); - _unicodeCharacterMap.Add("CHAKMA DIGIT FOUR", 69946); - _unicodeCharacterMap.Add("CHAKMA DIGIT FIVE", 69947); - _unicodeCharacterMap.Add("CHAKMA DIGIT SIX", 69948); - _unicodeCharacterMap.Add("CHAKMA DIGIT SEVEN", 69949); - _unicodeCharacterMap.Add("CHAKMA DIGIT EIGHT", 69950); - _unicodeCharacterMap.Add("CHAKMA DIGIT NINE", 69951); - _unicodeCharacterMap.Add("CHAKMA SECTION MARK", 69952); - _unicodeCharacterMap.Add("CHAKMA DANDA", 69953); - _unicodeCharacterMap.Add("CHAKMA DOUBLE DANDA", 69954); - _unicodeCharacterMap.Add("CHAKMA QUESTION MARK", 69955); - _unicodeCharacterMap.Add("MAHAJANI LETTER A", 69968); - _unicodeCharacterMap.Add("MAHAJANI LETTER I", 69969); - _unicodeCharacterMap.Add("MAHAJANI LETTER U", 69970); - _unicodeCharacterMap.Add("MAHAJANI LETTER E", 69971); - _unicodeCharacterMap.Add("MAHAJANI LETTER O", 69972); - _unicodeCharacterMap.Add("MAHAJANI LETTER KA", 69973); - _unicodeCharacterMap.Add("MAHAJANI LETTER KHA", 69974); - _unicodeCharacterMap.Add("MAHAJANI LETTER GA", 69975); - _unicodeCharacterMap.Add("MAHAJANI LETTER GHA", 69976); - _unicodeCharacterMap.Add("MAHAJANI LETTER CA", 69977); - _unicodeCharacterMap.Add("MAHAJANI LETTER CHA", 69978); - _unicodeCharacterMap.Add("MAHAJANI LETTER JA", 69979); - _unicodeCharacterMap.Add("MAHAJANI LETTER JHA", 69980); - _unicodeCharacterMap.Add("MAHAJANI LETTER NYA", 69981); - _unicodeCharacterMap.Add("MAHAJANI LETTER TTA", 69982); - _unicodeCharacterMap.Add("MAHAJANI LETTER TTHA", 69983); - _unicodeCharacterMap.Add("MAHAJANI LETTER DDA", 69984); - _unicodeCharacterMap.Add("MAHAJANI LETTER DDHA", 69985); - _unicodeCharacterMap.Add("MAHAJANI LETTER NNA", 69986); - _unicodeCharacterMap.Add("MAHAJANI LETTER TA", 69987); - _unicodeCharacterMap.Add("MAHAJANI LETTER THA", 69988); - _unicodeCharacterMap.Add("MAHAJANI LETTER DA", 69989); - _unicodeCharacterMap.Add("MAHAJANI LETTER DHA", 69990); - _unicodeCharacterMap.Add("MAHAJANI LETTER NA", 69991); - _unicodeCharacterMap.Add("MAHAJANI LETTER PA", 69992); - _unicodeCharacterMap.Add("MAHAJANI LETTER PHA", 69993); - _unicodeCharacterMap.Add("MAHAJANI LETTER BA", 69994); - _unicodeCharacterMap.Add("MAHAJANI LETTER BHA", 69995); - _unicodeCharacterMap.Add("MAHAJANI LETTER MA", 69996); - _unicodeCharacterMap.Add("MAHAJANI LETTER RA", 69997); - _unicodeCharacterMap.Add("MAHAJANI LETTER LA", 69998); - _unicodeCharacterMap.Add("MAHAJANI LETTER VA", 69999); - _unicodeCharacterMap.Add("MAHAJANI LETTER SA", 70000); - _unicodeCharacterMap.Add("MAHAJANI LETTER HA", 70001); - _unicodeCharacterMap.Add("MAHAJANI LETTER RRA", 70002); - _unicodeCharacterMap.Add("MAHAJANI SIGN NUKTA", 70003); - _unicodeCharacterMap.Add("MAHAJANI ABBREVIATION SIGN", 70004); - _unicodeCharacterMap.Add("MAHAJANI SECTION MARK", 70005); - _unicodeCharacterMap.Add("MAHAJANI LIGATURE SHRI", 70006); - _unicodeCharacterMap.Add("SHARADA SIGN CANDRABINDU", 70016); - _unicodeCharacterMap.Add("SHARADA SIGN ANUSVARA", 70017); - _unicodeCharacterMap.Add("SHARADA SIGN VISARGA", 70018); - _unicodeCharacterMap.Add("SHARADA LETTER A", 70019); - _unicodeCharacterMap.Add("SHARADA LETTER AA", 70020); - _unicodeCharacterMap.Add("SHARADA LETTER I", 70021); - _unicodeCharacterMap.Add("SHARADA LETTER II", 70022); - _unicodeCharacterMap.Add("SHARADA LETTER U", 70023); - _unicodeCharacterMap.Add("SHARADA LETTER UU", 70024); - _unicodeCharacterMap.Add("SHARADA LETTER VOCALIC R", 70025); - _unicodeCharacterMap.Add("SHARADA LETTER VOCALIC RR", 70026); - _unicodeCharacterMap.Add("SHARADA LETTER VOCALIC L", 70027); - _unicodeCharacterMap.Add("SHARADA LETTER VOCALIC LL", 70028); - _unicodeCharacterMap.Add("SHARADA LETTER E", 70029); - _unicodeCharacterMap.Add("SHARADA LETTER AI", 70030); - _unicodeCharacterMap.Add("SHARADA LETTER O", 70031); - _unicodeCharacterMap.Add("SHARADA LETTER AU", 70032); - _unicodeCharacterMap.Add("SHARADA LETTER KA", 70033); - _unicodeCharacterMap.Add("SHARADA LETTER KHA", 70034); - _unicodeCharacterMap.Add("SHARADA LETTER GA", 70035); - _unicodeCharacterMap.Add("SHARADA LETTER GHA", 70036); - _unicodeCharacterMap.Add("SHARADA LETTER NGA", 70037); - _unicodeCharacterMap.Add("SHARADA LETTER CA", 70038); - _unicodeCharacterMap.Add("SHARADA LETTER CHA", 70039); - _unicodeCharacterMap.Add("SHARADA LETTER JA", 70040); - _unicodeCharacterMap.Add("SHARADA LETTER JHA", 70041); - _unicodeCharacterMap.Add("SHARADA LETTER NYA", 70042); - _unicodeCharacterMap.Add("SHARADA LETTER TTA", 70043); - _unicodeCharacterMap.Add("SHARADA LETTER TTHA", 70044); - _unicodeCharacterMap.Add("SHARADA LETTER DDA", 70045); - _unicodeCharacterMap.Add("SHARADA LETTER DDHA", 70046); - _unicodeCharacterMap.Add("SHARADA LETTER NNA", 70047); - _unicodeCharacterMap.Add("SHARADA LETTER TA", 70048); - _unicodeCharacterMap.Add("SHARADA LETTER THA", 70049); - _unicodeCharacterMap.Add("SHARADA LETTER DA", 70050); - _unicodeCharacterMap.Add("SHARADA LETTER DHA", 70051); - _unicodeCharacterMap.Add("SHARADA LETTER NA", 70052); - _unicodeCharacterMap.Add("SHARADA LETTER PA", 70053); - _unicodeCharacterMap.Add("SHARADA LETTER PHA", 70054); - _unicodeCharacterMap.Add("SHARADA LETTER BA", 70055); - _unicodeCharacterMap.Add("SHARADA LETTER BHA", 70056); - _unicodeCharacterMap.Add("SHARADA LETTER MA", 70057); - _unicodeCharacterMap.Add("SHARADA LETTER YA", 70058); - _unicodeCharacterMap.Add("SHARADA LETTER RA", 70059); - _unicodeCharacterMap.Add("SHARADA LETTER LA", 70060); - _unicodeCharacterMap.Add("SHARADA LETTER LLA", 70061); - _unicodeCharacterMap.Add("SHARADA LETTER VA", 70062); - _unicodeCharacterMap.Add("SHARADA LETTER SHA", 70063); - _unicodeCharacterMap.Add("SHARADA LETTER SSA", 70064); - _unicodeCharacterMap.Add("SHARADA LETTER SA", 70065); - _unicodeCharacterMap.Add("SHARADA LETTER HA", 70066); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN AA", 70067); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN I", 70068); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN II", 70069); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN U", 70070); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN UU", 70071); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN VOCALIC R", 70072); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN VOCALIC RR", 70073); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN VOCALIC L", 70074); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN VOCALIC LL", 70075); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN E", 70076); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN AI", 70077); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN O", 70078); - _unicodeCharacterMap.Add("SHARADA VOWEL SIGN AU", 70079); - _unicodeCharacterMap.Add("SHARADA SIGN VIRAMA", 70080); - _unicodeCharacterMap.Add("SHARADA SIGN AVAGRAHA", 70081); - _unicodeCharacterMap.Add("SHARADA SIGN JIHVAMULIYA", 70082); - _unicodeCharacterMap.Add("SHARADA SIGN UPADHMANIYA", 70083); - _unicodeCharacterMap.Add("SHARADA OM", 70084); - _unicodeCharacterMap.Add("SHARADA DANDA", 70085); - _unicodeCharacterMap.Add("SHARADA DOUBLE DANDA", 70086); - _unicodeCharacterMap.Add("SHARADA ABBREVIATION SIGN", 70087); - _unicodeCharacterMap.Add("SHARADA SEPARATOR", 70088); - _unicodeCharacterMap.Add("SHARADA SANDHI MARK", 70089); - _unicodeCharacterMap.Add("SHARADA SIGN NUKTA", 70090); - _unicodeCharacterMap.Add("SHARADA VOWEL MODIFIER MARK", 70091); - _unicodeCharacterMap.Add("SHARADA EXTRA SHORT VOWEL MARK", 70092); - _unicodeCharacterMap.Add("SHARADA SUTRA MARK", 70093); - _unicodeCharacterMap.Add("SHARADA DIGIT ZERO", 70096); - _unicodeCharacterMap.Add("SHARADA DIGIT ONE", 70097); - _unicodeCharacterMap.Add("SHARADA DIGIT TWO", 70098); - _unicodeCharacterMap.Add("SHARADA DIGIT THREE", 70099); - _unicodeCharacterMap.Add("SHARADA DIGIT FOUR", 70100); - _unicodeCharacterMap.Add("SHARADA DIGIT FIVE", 70101); - _unicodeCharacterMap.Add("SHARADA DIGIT SIX", 70102); - _unicodeCharacterMap.Add("SHARADA DIGIT SEVEN", 70103); - _unicodeCharacterMap.Add("SHARADA DIGIT EIGHT", 70104); - _unicodeCharacterMap.Add("SHARADA DIGIT NINE", 70105); - _unicodeCharacterMap.Add("SHARADA EKAM", 70106); - _unicodeCharacterMap.Add("SHARADA SIGN SIDDHAM", 70107); - _unicodeCharacterMap.Add("SHARADA HEADSTROKE", 70108); - _unicodeCharacterMap.Add("SHARADA CONTINUATION SIGN", 70109); - _unicodeCharacterMap.Add("SHARADA SECTION MARK 1", 70110); - _unicodeCharacterMap.Add("SHARADA SECTION MARK 2", 70111); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT ONE", 70113); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT TWO", 70114); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT THREE", 70115); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT FOUR", 70116); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT FIVE", 70117); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT SIX", 70118); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT SEVEN", 70119); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT EIGHT", 70120); - _unicodeCharacterMap.Add("SINHALA ARCHAIC DIGIT NINE", 70121); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER TEN", 70122); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER TWENTY", 70123); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER THIRTY", 70124); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER FORTY", 70125); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER FIFTY", 70126); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER SIXTY", 70127); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER SEVENTY", 70128); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER EIGHTY", 70129); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER NINETY", 70130); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER ONE HUNDRED", 70131); - _unicodeCharacterMap.Add("SINHALA ARCHAIC NUMBER ONE THOUSAND", 70132); - _unicodeCharacterMap.Add("KHOJKI LETTER A", 70144); - _unicodeCharacterMap.Add("KHOJKI LETTER AA", 70145); - _unicodeCharacterMap.Add("KHOJKI LETTER I", 70146); - _unicodeCharacterMap.Add("KHOJKI LETTER U", 70147); - _unicodeCharacterMap.Add("KHOJKI LETTER E", 70148); - _unicodeCharacterMap.Add("KHOJKI LETTER AI", 70149); - _unicodeCharacterMap.Add("KHOJKI LETTER O", 70150); - _unicodeCharacterMap.Add("KHOJKI LETTER AU", 70151); - _unicodeCharacterMap.Add("KHOJKI LETTER KA", 70152); - _unicodeCharacterMap.Add("KHOJKI LETTER KHA", 70153); - _unicodeCharacterMap.Add("KHOJKI LETTER GA", 70154); - _unicodeCharacterMap.Add("KHOJKI LETTER GGA", 70155); - _unicodeCharacterMap.Add("KHOJKI LETTER GHA", 70156); - _unicodeCharacterMap.Add("KHOJKI LETTER NGA", 70157); - _unicodeCharacterMap.Add("KHOJKI LETTER CA", 70158); - _unicodeCharacterMap.Add("KHOJKI LETTER CHA", 70159); - _unicodeCharacterMap.Add("KHOJKI LETTER JA", 70160); - _unicodeCharacterMap.Add("KHOJKI LETTER JJA", 70161); - _unicodeCharacterMap.Add("KHOJKI LETTER NYA", 70163); - _unicodeCharacterMap.Add("KHOJKI LETTER TTA", 70164); - _unicodeCharacterMap.Add("KHOJKI LETTER TTHA", 70165); - _unicodeCharacterMap.Add("KHOJKI LETTER DDA", 70166); - _unicodeCharacterMap.Add("KHOJKI LETTER DDHA", 70167); - _unicodeCharacterMap.Add("KHOJKI LETTER NNA", 70168); - _unicodeCharacterMap.Add("KHOJKI LETTER TA", 70169); - _unicodeCharacterMap.Add("KHOJKI LETTER THA", 70170); - _unicodeCharacterMap.Add("KHOJKI LETTER DA", 70171); - _unicodeCharacterMap.Add("KHOJKI LETTER DDDA", 70172); - _unicodeCharacterMap.Add("KHOJKI LETTER DHA", 70173); - _unicodeCharacterMap.Add("KHOJKI LETTER NA", 70174); - _unicodeCharacterMap.Add("KHOJKI LETTER PA", 70175); - _unicodeCharacterMap.Add("KHOJKI LETTER PHA", 70176); - _unicodeCharacterMap.Add("KHOJKI LETTER BA", 70177); - _unicodeCharacterMap.Add("KHOJKI LETTER BBA", 70178); - _unicodeCharacterMap.Add("KHOJKI LETTER BHA", 70179); - _unicodeCharacterMap.Add("KHOJKI LETTER MA", 70180); - _unicodeCharacterMap.Add("KHOJKI LETTER YA", 70181); - _unicodeCharacterMap.Add("KHOJKI LETTER RA", 70182); - _unicodeCharacterMap.Add("KHOJKI LETTER LA", 70183); - _unicodeCharacterMap.Add("KHOJKI LETTER VA", 70184); - _unicodeCharacterMap.Add("KHOJKI LETTER SA", 70185); - _unicodeCharacterMap.Add("KHOJKI LETTER HA", 70186); - _unicodeCharacterMap.Add("KHOJKI LETTER LLA", 70187); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN AA", 70188); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN I", 70189); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN II", 70190); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN U", 70191); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN E", 70192); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN AI", 70193); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN O", 70194); - _unicodeCharacterMap.Add("KHOJKI VOWEL SIGN AU", 70195); - _unicodeCharacterMap.Add("KHOJKI SIGN ANUSVARA", 70196); - _unicodeCharacterMap.Add("KHOJKI SIGN VIRAMA", 70197); - _unicodeCharacterMap.Add("KHOJKI SIGN NUKTA", 70198); - _unicodeCharacterMap.Add("KHOJKI SIGN SHADDA", 70199); - _unicodeCharacterMap.Add("KHOJKI DANDA", 70200); - _unicodeCharacterMap.Add("KHOJKI DOUBLE DANDA", 70201); - _unicodeCharacterMap.Add("KHOJKI WORD SEPARATOR", 70202); - _unicodeCharacterMap.Add("KHOJKI SECTION MARK", 70203); - _unicodeCharacterMap.Add("KHOJKI DOUBLE SECTION MARK", 70204); - _unicodeCharacterMap.Add("KHOJKI ABBREVIATION SIGN", 70205); - _unicodeCharacterMap.Add("KHOJKI SIGN SUKUN", 70206); - _unicodeCharacterMap.Add("MULTANI LETTER A", 70272); - _unicodeCharacterMap.Add("MULTANI LETTER I", 70273); - _unicodeCharacterMap.Add("MULTANI LETTER U", 70274); - _unicodeCharacterMap.Add("MULTANI LETTER E", 70275); - _unicodeCharacterMap.Add("MULTANI LETTER KA", 70276); - _unicodeCharacterMap.Add("MULTANI LETTER KHA", 70277); - _unicodeCharacterMap.Add("MULTANI LETTER GA", 70278); - _unicodeCharacterMap.Add("MULTANI LETTER GHA", 70280); - _unicodeCharacterMap.Add("MULTANI LETTER CA", 70282); - _unicodeCharacterMap.Add("MULTANI LETTER CHA", 70283); - _unicodeCharacterMap.Add("MULTANI LETTER JA", 70284); - _unicodeCharacterMap.Add("MULTANI LETTER JJA", 70285); - _unicodeCharacterMap.Add("MULTANI LETTER NYA", 70287); - _unicodeCharacterMap.Add("MULTANI LETTER TTA", 70288); - _unicodeCharacterMap.Add("MULTANI LETTER TTHA", 70289); - _unicodeCharacterMap.Add("MULTANI LETTER DDA", 70290); - _unicodeCharacterMap.Add("MULTANI LETTER DDDA", 70291); - _unicodeCharacterMap.Add("MULTANI LETTER DDHA", 70292); - _unicodeCharacterMap.Add("MULTANI LETTER NNA", 70293); - _unicodeCharacterMap.Add("MULTANI LETTER TA", 70294); - _unicodeCharacterMap.Add("MULTANI LETTER THA", 70295); - _unicodeCharacterMap.Add("MULTANI LETTER DA", 70296); - _unicodeCharacterMap.Add("MULTANI LETTER DHA", 70297); - _unicodeCharacterMap.Add("MULTANI LETTER NA", 70298); - _unicodeCharacterMap.Add("MULTANI LETTER PA", 70299); - _unicodeCharacterMap.Add("MULTANI LETTER PHA", 70300); - _unicodeCharacterMap.Add("MULTANI LETTER BA", 70301); - _unicodeCharacterMap.Add("MULTANI LETTER BHA", 70303); - _unicodeCharacterMap.Add("MULTANI LETTER MA", 70304); - _unicodeCharacterMap.Add("MULTANI LETTER YA", 70305); - _unicodeCharacterMap.Add("MULTANI LETTER RA", 70306); - _unicodeCharacterMap.Add("MULTANI LETTER LA", 70307); - _unicodeCharacterMap.Add("MULTANI LETTER VA", 70308); - _unicodeCharacterMap.Add("MULTANI LETTER SA", 70309); - _unicodeCharacterMap.Add("MULTANI LETTER HA", 70310); - _unicodeCharacterMap.Add("MULTANI LETTER RRA", 70311); - _unicodeCharacterMap.Add("MULTANI LETTER RHA", 70312); - _unicodeCharacterMap.Add("MULTANI SECTION MARK", 70313); - _unicodeCharacterMap.Add("KHUDAWADI LETTER A", 70320); - _unicodeCharacterMap.Add("KHUDAWADI LETTER AA", 70321); - _unicodeCharacterMap.Add("KHUDAWADI LETTER I", 70322); - _unicodeCharacterMap.Add("KHUDAWADI LETTER II", 70323); - _unicodeCharacterMap.Add("KHUDAWADI LETTER U", 70324); - _unicodeCharacterMap.Add("KHUDAWADI LETTER UU", 70325); - _unicodeCharacterMap.Add("KHUDAWADI LETTER E", 70326); - _unicodeCharacterMap.Add("KHUDAWADI LETTER AI", 70327); - _unicodeCharacterMap.Add("KHUDAWADI LETTER O", 70328); - _unicodeCharacterMap.Add("KHUDAWADI LETTER AU", 70329); - _unicodeCharacterMap.Add("KHUDAWADI LETTER KA", 70330); - _unicodeCharacterMap.Add("KHUDAWADI LETTER KHA", 70331); - _unicodeCharacterMap.Add("KHUDAWADI LETTER GA", 70332); - _unicodeCharacterMap.Add("KHUDAWADI LETTER GGA", 70333); - _unicodeCharacterMap.Add("KHUDAWADI LETTER GHA", 70334); - _unicodeCharacterMap.Add("KHUDAWADI LETTER NGA", 70335); - _unicodeCharacterMap.Add("KHUDAWADI LETTER CA", 70336); - _unicodeCharacterMap.Add("KHUDAWADI LETTER CHA", 70337); - _unicodeCharacterMap.Add("KHUDAWADI LETTER JA", 70338); - _unicodeCharacterMap.Add("KHUDAWADI LETTER JJA", 70339); - _unicodeCharacterMap.Add("KHUDAWADI LETTER JHA", 70340); - _unicodeCharacterMap.Add("KHUDAWADI LETTER NYA", 70341); - _unicodeCharacterMap.Add("KHUDAWADI LETTER TTA", 70342); - _unicodeCharacterMap.Add("KHUDAWADI LETTER TTHA", 70343); - _unicodeCharacterMap.Add("KHUDAWADI LETTER DDA", 70344); - _unicodeCharacterMap.Add("KHUDAWADI LETTER DDDA", 70345); - _unicodeCharacterMap.Add("KHUDAWADI LETTER RRA", 70346); - _unicodeCharacterMap.Add("KHUDAWADI LETTER DDHA", 70347); - _unicodeCharacterMap.Add("KHUDAWADI LETTER NNA", 70348); - _unicodeCharacterMap.Add("KHUDAWADI LETTER TA", 70349); - _unicodeCharacterMap.Add("KHUDAWADI LETTER THA", 70350); - _unicodeCharacterMap.Add("KHUDAWADI LETTER DA", 70351); - _unicodeCharacterMap.Add("KHUDAWADI LETTER DHA", 70352); - _unicodeCharacterMap.Add("KHUDAWADI LETTER NA", 70353); - _unicodeCharacterMap.Add("KHUDAWADI LETTER PA", 70354); - _unicodeCharacterMap.Add("KHUDAWADI LETTER PHA", 70355); - _unicodeCharacterMap.Add("KHUDAWADI LETTER BA", 70356); - _unicodeCharacterMap.Add("KHUDAWADI LETTER BBA", 70357); - _unicodeCharacterMap.Add("KHUDAWADI LETTER BHA", 70358); - _unicodeCharacterMap.Add("KHUDAWADI LETTER MA", 70359); - _unicodeCharacterMap.Add("KHUDAWADI LETTER YA", 70360); - _unicodeCharacterMap.Add("KHUDAWADI LETTER RA", 70361); - _unicodeCharacterMap.Add("KHUDAWADI LETTER LA", 70362); - _unicodeCharacterMap.Add("KHUDAWADI LETTER VA", 70363); - _unicodeCharacterMap.Add("KHUDAWADI LETTER SHA", 70364); - _unicodeCharacterMap.Add("KHUDAWADI LETTER SA", 70365); - _unicodeCharacterMap.Add("KHUDAWADI LETTER HA", 70366); - _unicodeCharacterMap.Add("KHUDAWADI SIGN ANUSVARA", 70367); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN AA", 70368); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN I", 70369); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN II", 70370); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN U", 70371); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN UU", 70372); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN E", 70373); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN AI", 70374); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN O", 70375); - _unicodeCharacterMap.Add("KHUDAWADI VOWEL SIGN AU", 70376); - _unicodeCharacterMap.Add("KHUDAWADI SIGN NUKTA", 70377); - _unicodeCharacterMap.Add("KHUDAWADI SIGN VIRAMA", 70378); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT ZERO", 70384); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT ONE", 70385); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT TWO", 70386); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT THREE", 70387); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT FOUR", 70388); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT FIVE", 70389); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT SIX", 70390); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT SEVEN", 70391); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT EIGHT", 70392); - _unicodeCharacterMap.Add("KHUDAWADI DIGIT NINE", 70393); - _unicodeCharacterMap.Add("GRANTHA SIGN COMBINING ANUSVARA ABOVE", 70400); - _unicodeCharacterMap.Add("GRANTHA SIGN CANDRABINDU", 70401); - _unicodeCharacterMap.Add("GRANTHA SIGN ANUSVARA", 70402); - _unicodeCharacterMap.Add("GRANTHA SIGN VISARGA", 70403); - _unicodeCharacterMap.Add("GRANTHA LETTER A", 70405); - _unicodeCharacterMap.Add("GRANTHA LETTER AA", 70406); - _unicodeCharacterMap.Add("GRANTHA LETTER I", 70407); - _unicodeCharacterMap.Add("GRANTHA LETTER II", 70408); - _unicodeCharacterMap.Add("GRANTHA LETTER U", 70409); - _unicodeCharacterMap.Add("GRANTHA LETTER UU", 70410); - _unicodeCharacterMap.Add("GRANTHA LETTER VOCALIC R", 70411); - _unicodeCharacterMap.Add("GRANTHA LETTER VOCALIC L", 70412); - _unicodeCharacterMap.Add("GRANTHA LETTER EE", 70415); - _unicodeCharacterMap.Add("GRANTHA LETTER AI", 70416); - _unicodeCharacterMap.Add("GRANTHA LETTER OO", 70419); - _unicodeCharacterMap.Add("GRANTHA LETTER AU", 70420); - _unicodeCharacterMap.Add("GRANTHA LETTER KA", 70421); - _unicodeCharacterMap.Add("GRANTHA LETTER KHA", 70422); - _unicodeCharacterMap.Add("GRANTHA LETTER GA", 70423); - _unicodeCharacterMap.Add("GRANTHA LETTER GHA", 70424); - _unicodeCharacterMap.Add("GRANTHA LETTER NGA", 70425); - _unicodeCharacterMap.Add("GRANTHA LETTER CA", 70426); - _unicodeCharacterMap.Add("GRANTHA LETTER CHA", 70427); - _unicodeCharacterMap.Add("GRANTHA LETTER JA", 70428); - _unicodeCharacterMap.Add("GRANTHA LETTER JHA", 70429); - _unicodeCharacterMap.Add("GRANTHA LETTER NYA", 70430); - _unicodeCharacterMap.Add("GRANTHA LETTER TTA", 70431); - _unicodeCharacterMap.Add("GRANTHA LETTER TTHA", 70432); - _unicodeCharacterMap.Add("GRANTHA LETTER DDA", 70433); - _unicodeCharacterMap.Add("GRANTHA LETTER DDHA", 70434); - _unicodeCharacterMap.Add("GRANTHA LETTER NNA", 70435); - _unicodeCharacterMap.Add("GRANTHA LETTER TA", 70436); - _unicodeCharacterMap.Add("GRANTHA LETTER THA", 70437); - _unicodeCharacterMap.Add("GRANTHA LETTER DA", 70438); - _unicodeCharacterMap.Add("GRANTHA LETTER DHA", 70439); - _unicodeCharacterMap.Add("GRANTHA LETTER NA", 70440); - _unicodeCharacterMap.Add("GRANTHA LETTER PA", 70442); - _unicodeCharacterMap.Add("GRANTHA LETTER PHA", 70443); - _unicodeCharacterMap.Add("GRANTHA LETTER BA", 70444); - _unicodeCharacterMap.Add("GRANTHA LETTER BHA", 70445); - _unicodeCharacterMap.Add("GRANTHA LETTER MA", 70446); - _unicodeCharacterMap.Add("GRANTHA LETTER YA", 70447); - _unicodeCharacterMap.Add("GRANTHA LETTER RA", 70448); - _unicodeCharacterMap.Add("GRANTHA LETTER LA", 70450); - _unicodeCharacterMap.Add("GRANTHA LETTER LLA", 70451); - _unicodeCharacterMap.Add("GRANTHA LETTER VA", 70453); - _unicodeCharacterMap.Add("GRANTHA LETTER SHA", 70454); - _unicodeCharacterMap.Add("GRANTHA LETTER SSA", 70455); - _unicodeCharacterMap.Add("GRANTHA LETTER SA", 70456); - _unicodeCharacterMap.Add("GRANTHA LETTER HA", 70457); - _unicodeCharacterMap.Add("GRANTHA SIGN NUKTA", 70460); - _unicodeCharacterMap.Add("GRANTHA SIGN AVAGRAHA", 70461); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN AA", 70462); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN I", 70463); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN II", 70464); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN U", 70465); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN UU", 70466); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN VOCALIC R", 70467); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN VOCALIC RR", 70468); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN EE", 70471); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN AI", 70472); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN OO", 70475); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN AU", 70476); - _unicodeCharacterMap.Add("GRANTHA SIGN VIRAMA", 70477); - _unicodeCharacterMap.Add("GRANTHA OM", 70480); - _unicodeCharacterMap.Add("GRANTHA AU LENGTH MARK", 70487); - _unicodeCharacterMap.Add("GRANTHA SIGN PLUTA", 70493); - _unicodeCharacterMap.Add("GRANTHA LETTER VEDIC ANUSVARA", 70494); - _unicodeCharacterMap.Add("GRANTHA LETTER VEDIC DOUBLE ANUSVARA", 70495); - _unicodeCharacterMap.Add("GRANTHA LETTER VOCALIC RR", 70496); - _unicodeCharacterMap.Add("GRANTHA LETTER VOCALIC LL", 70497); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN VOCALIC L", 70498); - _unicodeCharacterMap.Add("GRANTHA VOWEL SIGN VOCALIC LL", 70499); - _unicodeCharacterMap.Add("COMBINING GRANTHA DIGIT ZERO", 70502); - _unicodeCharacterMap.Add("COMBINING GRANTHA DIGIT ONE", 70503); - _unicodeCharacterMap.Add("COMBINING GRANTHA DIGIT TWO", 70504); - _unicodeCharacterMap.Add("COMBINING GRANTHA DIGIT THREE", 70505); - _unicodeCharacterMap.Add("COMBINING GRANTHA DIGIT FOUR", 70506); - _unicodeCharacterMap.Add("COMBINING GRANTHA DIGIT FIVE", 70507); - _unicodeCharacterMap.Add("COMBINING GRANTHA DIGIT SIX", 70508); - _unicodeCharacterMap.Add("COMBINING GRANTHA LETTER A", 70512); - _unicodeCharacterMap.Add("COMBINING GRANTHA LETTER KA", 70513); - _unicodeCharacterMap.Add("COMBINING GRANTHA LETTER NA", 70514); - _unicodeCharacterMap.Add("COMBINING GRANTHA LETTER VI", 70515); - _unicodeCharacterMap.Add("COMBINING GRANTHA LETTER PA", 70516); - _unicodeCharacterMap.Add("NEWA LETTER A", 70656); - _unicodeCharacterMap.Add("NEWA LETTER AA", 70657); - _unicodeCharacterMap.Add("NEWA LETTER I", 70658); - _unicodeCharacterMap.Add("NEWA LETTER II", 70659); - _unicodeCharacterMap.Add("NEWA LETTER U", 70660); - _unicodeCharacterMap.Add("NEWA LETTER UU", 70661); - _unicodeCharacterMap.Add("NEWA LETTER VOCALIC R", 70662); - _unicodeCharacterMap.Add("NEWA LETTER VOCALIC RR", 70663); - _unicodeCharacterMap.Add("NEWA LETTER VOCALIC L", 70664); - _unicodeCharacterMap.Add("NEWA LETTER VOCALIC LL", 70665); - _unicodeCharacterMap.Add("NEWA LETTER E", 70666); - _unicodeCharacterMap.Add("NEWA LETTER AI", 70667); - _unicodeCharacterMap.Add("NEWA LETTER O", 70668); - _unicodeCharacterMap.Add("NEWA LETTER AU", 70669); - _unicodeCharacterMap.Add("NEWA LETTER KA", 70670); - _unicodeCharacterMap.Add("NEWA LETTER KHA", 70671); - _unicodeCharacterMap.Add("NEWA LETTER GA", 70672); - _unicodeCharacterMap.Add("NEWA LETTER GHA", 70673); - _unicodeCharacterMap.Add("NEWA LETTER NGA", 70674); - _unicodeCharacterMap.Add("NEWA LETTER NGHA", 70675); - _unicodeCharacterMap.Add("NEWA LETTER CA", 70676); - _unicodeCharacterMap.Add("NEWA LETTER CHA", 70677); - _unicodeCharacterMap.Add("NEWA LETTER JA", 70678); - _unicodeCharacterMap.Add("NEWA LETTER JHA", 70679); - _unicodeCharacterMap.Add("NEWA LETTER NYA", 70680); - _unicodeCharacterMap.Add("NEWA LETTER NYHA", 70681); - _unicodeCharacterMap.Add("NEWA LETTER TTA", 70682); - _unicodeCharacterMap.Add("NEWA LETTER TTHA", 70683); - _unicodeCharacterMap.Add("NEWA LETTER DDA", 70684); - _unicodeCharacterMap.Add("NEWA LETTER DDHA", 70685); - _unicodeCharacterMap.Add("NEWA LETTER NNA", 70686); - _unicodeCharacterMap.Add("NEWA LETTER TA", 70687); - _unicodeCharacterMap.Add("NEWA LETTER THA", 70688); - _unicodeCharacterMap.Add("NEWA LETTER DA", 70689); - _unicodeCharacterMap.Add("NEWA LETTER DHA", 70690); - _unicodeCharacterMap.Add("NEWA LETTER NA", 70691); - _unicodeCharacterMap.Add("NEWA LETTER NHA", 70692); - _unicodeCharacterMap.Add("NEWA LETTER PA", 70693); - _unicodeCharacterMap.Add("NEWA LETTER PHA", 70694); - _unicodeCharacterMap.Add("NEWA LETTER BA", 70695); - _unicodeCharacterMap.Add("NEWA LETTER BHA", 70696); - _unicodeCharacterMap.Add("NEWA LETTER MA", 70697); - _unicodeCharacterMap.Add("NEWA LETTER MHA", 70698); - _unicodeCharacterMap.Add("NEWA LETTER YA", 70699); - _unicodeCharacterMap.Add("NEWA LETTER RA", 70700); - _unicodeCharacterMap.Add("NEWA LETTER RHA", 70701); - _unicodeCharacterMap.Add("NEWA LETTER LA", 70702); - _unicodeCharacterMap.Add("NEWA LETTER LHA", 70703); - _unicodeCharacterMap.Add("NEWA LETTER WA", 70704); - _unicodeCharacterMap.Add("NEWA LETTER SHA", 70705); - _unicodeCharacterMap.Add("NEWA LETTER SSA", 70706); - _unicodeCharacterMap.Add("NEWA LETTER SA", 70707); - _unicodeCharacterMap.Add("NEWA LETTER HA", 70708); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN AA", 70709); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN I", 70710); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN II", 70711); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN U", 70712); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN UU", 70713); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN VOCALIC R", 70714); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN VOCALIC RR", 70715); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN VOCALIC L", 70716); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN VOCALIC LL", 70717); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN E", 70718); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN AI", 70719); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN O", 70720); - _unicodeCharacterMap.Add("NEWA VOWEL SIGN AU", 70721); - _unicodeCharacterMap.Add("NEWA SIGN VIRAMA", 70722); - _unicodeCharacterMap.Add("NEWA SIGN CANDRABINDU", 70723); - _unicodeCharacterMap.Add("NEWA SIGN ANUSVARA", 70724); - _unicodeCharacterMap.Add("NEWA SIGN VISARGA", 70725); - _unicodeCharacterMap.Add("NEWA SIGN NUKTA", 70726); - _unicodeCharacterMap.Add("NEWA SIGN AVAGRAHA", 70727); - _unicodeCharacterMap.Add("NEWA SIGN FINAL ANUSVARA", 70728); - _unicodeCharacterMap.Add("NEWA OM", 70729); - _unicodeCharacterMap.Add("NEWA SIDDHI", 70730); - _unicodeCharacterMap.Add("NEWA DANDA", 70731); - _unicodeCharacterMap.Add("NEWA DOUBLE DANDA", 70732); - _unicodeCharacterMap.Add("NEWA COMMA", 70733); - _unicodeCharacterMap.Add("NEWA GAP FILLER", 70734); - _unicodeCharacterMap.Add("NEWA ABBREVIATION SIGN", 70735); - _unicodeCharacterMap.Add("NEWA DIGIT ZERO", 70736); - _unicodeCharacterMap.Add("NEWA DIGIT ONE", 70737); - _unicodeCharacterMap.Add("NEWA DIGIT TWO", 70738); - _unicodeCharacterMap.Add("NEWA DIGIT THREE", 70739); - _unicodeCharacterMap.Add("NEWA DIGIT FOUR", 70740); - _unicodeCharacterMap.Add("NEWA DIGIT FIVE", 70741); - _unicodeCharacterMap.Add("NEWA DIGIT SIX", 70742); - _unicodeCharacterMap.Add("NEWA DIGIT SEVEN", 70743); - _unicodeCharacterMap.Add("NEWA DIGIT EIGHT", 70744); - _unicodeCharacterMap.Add("NEWA DIGIT NINE", 70745); - _unicodeCharacterMap.Add("NEWA PLACEHOLDER MARK", 70747); - _unicodeCharacterMap.Add("NEWA INSERTION SIGN", 70749); - _unicodeCharacterMap.Add("TIRHUTA ANJI", 70784); - _unicodeCharacterMap.Add("TIRHUTA LETTER A", 70785); - _unicodeCharacterMap.Add("TIRHUTA LETTER AA", 70786); - _unicodeCharacterMap.Add("TIRHUTA LETTER I", 70787); - _unicodeCharacterMap.Add("TIRHUTA LETTER II", 70788); - _unicodeCharacterMap.Add("TIRHUTA LETTER U", 70789); - _unicodeCharacterMap.Add("TIRHUTA LETTER UU", 70790); - _unicodeCharacterMap.Add("TIRHUTA LETTER VOCALIC R", 70791); - _unicodeCharacterMap.Add("TIRHUTA LETTER VOCALIC RR", 70792); - _unicodeCharacterMap.Add("TIRHUTA LETTER VOCALIC L", 70793); - _unicodeCharacterMap.Add("TIRHUTA LETTER VOCALIC LL", 70794); - _unicodeCharacterMap.Add("TIRHUTA LETTER E", 70795); - _unicodeCharacterMap.Add("TIRHUTA LETTER AI", 70796); - _unicodeCharacterMap.Add("TIRHUTA LETTER O", 70797); - _unicodeCharacterMap.Add("TIRHUTA LETTER AU", 70798); - _unicodeCharacterMap.Add("TIRHUTA LETTER KA", 70799); - _unicodeCharacterMap.Add("TIRHUTA LETTER KHA", 70800); - _unicodeCharacterMap.Add("TIRHUTA LETTER GA", 70801); - _unicodeCharacterMap.Add("TIRHUTA LETTER GHA", 70802); - _unicodeCharacterMap.Add("TIRHUTA LETTER NGA", 70803); - _unicodeCharacterMap.Add("TIRHUTA LETTER CA", 70804); - _unicodeCharacterMap.Add("TIRHUTA LETTER CHA", 70805); - _unicodeCharacterMap.Add("TIRHUTA LETTER JA", 70806); - _unicodeCharacterMap.Add("TIRHUTA LETTER JHA", 70807); - _unicodeCharacterMap.Add("TIRHUTA LETTER NYA", 70808); - _unicodeCharacterMap.Add("TIRHUTA LETTER TTA", 70809); - _unicodeCharacterMap.Add("TIRHUTA LETTER TTHA", 70810); - _unicodeCharacterMap.Add("TIRHUTA LETTER DDA", 70811); - _unicodeCharacterMap.Add("TIRHUTA LETTER DDHA", 70812); - _unicodeCharacterMap.Add("TIRHUTA LETTER NNA", 70813); - _unicodeCharacterMap.Add("TIRHUTA LETTER TA", 70814); - _unicodeCharacterMap.Add("TIRHUTA LETTER THA", 70815); - _unicodeCharacterMap.Add("TIRHUTA LETTER DA", 70816); - _unicodeCharacterMap.Add("TIRHUTA LETTER DHA", 70817); - _unicodeCharacterMap.Add("TIRHUTA LETTER NA", 70818); - _unicodeCharacterMap.Add("TIRHUTA LETTER PA", 70819); - _unicodeCharacterMap.Add("TIRHUTA LETTER PHA", 70820); - _unicodeCharacterMap.Add("TIRHUTA LETTER BA", 70821); - _unicodeCharacterMap.Add("TIRHUTA LETTER BHA", 70822); - _unicodeCharacterMap.Add("TIRHUTA LETTER MA", 70823); - _unicodeCharacterMap.Add("TIRHUTA LETTER YA", 70824); - _unicodeCharacterMap.Add("TIRHUTA LETTER RA", 70825); - _unicodeCharacterMap.Add("TIRHUTA LETTER LA", 70826); - _unicodeCharacterMap.Add("TIRHUTA LETTER VA", 70827); - _unicodeCharacterMap.Add("TIRHUTA LETTER SHA", 70828); - _unicodeCharacterMap.Add("TIRHUTA LETTER SSA", 70829); - _unicodeCharacterMap.Add("TIRHUTA LETTER SA", 70830); - _unicodeCharacterMap.Add("TIRHUTA LETTER HA", 70831); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN AA", 70832); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN I", 70833); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN II", 70834); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN U", 70835); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN UU", 70836); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN VOCALIC R", 70837); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN VOCALIC RR", 70838); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN VOCALIC L", 70839); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN VOCALIC LL", 70840); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN E", 70841); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN SHORT E", 70842); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN AI", 70843); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN O", 70844); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN SHORT O", 70845); - _unicodeCharacterMap.Add("TIRHUTA VOWEL SIGN AU", 70846); - _unicodeCharacterMap.Add("TIRHUTA SIGN CANDRABINDU", 70847); - _unicodeCharacterMap.Add("TIRHUTA SIGN ANUSVARA", 70848); - _unicodeCharacterMap.Add("TIRHUTA SIGN VISARGA", 70849); - _unicodeCharacterMap.Add("TIRHUTA SIGN VIRAMA", 70850); - _unicodeCharacterMap.Add("TIRHUTA SIGN NUKTA", 70851); - _unicodeCharacterMap.Add("TIRHUTA SIGN AVAGRAHA", 70852); - _unicodeCharacterMap.Add("TIRHUTA GVANG", 70853); - _unicodeCharacterMap.Add("TIRHUTA ABBREVIATION SIGN", 70854); - _unicodeCharacterMap.Add("TIRHUTA OM", 70855); - _unicodeCharacterMap.Add("TIRHUTA DIGIT ZERO", 70864); - _unicodeCharacterMap.Add("TIRHUTA DIGIT ONE", 70865); - _unicodeCharacterMap.Add("TIRHUTA DIGIT TWO", 70866); - _unicodeCharacterMap.Add("TIRHUTA DIGIT THREE", 70867); - _unicodeCharacterMap.Add("TIRHUTA DIGIT FOUR", 70868); - _unicodeCharacterMap.Add("TIRHUTA DIGIT FIVE", 70869); - _unicodeCharacterMap.Add("TIRHUTA DIGIT SIX", 70870); - _unicodeCharacterMap.Add("TIRHUTA DIGIT SEVEN", 70871); - _unicodeCharacterMap.Add("TIRHUTA DIGIT EIGHT", 70872); - _unicodeCharacterMap.Add("TIRHUTA DIGIT NINE", 70873); - _unicodeCharacterMap.Add("SIDDHAM LETTER A", 71040); - _unicodeCharacterMap.Add("SIDDHAM LETTER AA", 71041); - _unicodeCharacterMap.Add("SIDDHAM LETTER I", 71042); - _unicodeCharacterMap.Add("SIDDHAM LETTER II", 71043); - _unicodeCharacterMap.Add("SIDDHAM LETTER U", 71044); - _unicodeCharacterMap.Add("SIDDHAM LETTER UU", 71045); - _unicodeCharacterMap.Add("SIDDHAM LETTER VOCALIC R", 71046); - _unicodeCharacterMap.Add("SIDDHAM LETTER VOCALIC RR", 71047); - _unicodeCharacterMap.Add("SIDDHAM LETTER VOCALIC L", 71048); - _unicodeCharacterMap.Add("SIDDHAM LETTER VOCALIC LL", 71049); - _unicodeCharacterMap.Add("SIDDHAM LETTER E", 71050); - _unicodeCharacterMap.Add("SIDDHAM LETTER AI", 71051); - _unicodeCharacterMap.Add("SIDDHAM LETTER O", 71052); - _unicodeCharacterMap.Add("SIDDHAM LETTER AU", 71053); - _unicodeCharacterMap.Add("SIDDHAM LETTER KA", 71054); - _unicodeCharacterMap.Add("SIDDHAM LETTER KHA", 71055); - _unicodeCharacterMap.Add("SIDDHAM LETTER GA", 71056); - _unicodeCharacterMap.Add("SIDDHAM LETTER GHA", 71057); - _unicodeCharacterMap.Add("SIDDHAM LETTER NGA", 71058); - _unicodeCharacterMap.Add("SIDDHAM LETTER CA", 71059); - _unicodeCharacterMap.Add("SIDDHAM LETTER CHA", 71060); - _unicodeCharacterMap.Add("SIDDHAM LETTER JA", 71061); - _unicodeCharacterMap.Add("SIDDHAM LETTER JHA", 71062); - _unicodeCharacterMap.Add("SIDDHAM LETTER NYA", 71063); - _unicodeCharacterMap.Add("SIDDHAM LETTER TTA", 71064); - _unicodeCharacterMap.Add("SIDDHAM LETTER TTHA", 71065); - _unicodeCharacterMap.Add("SIDDHAM LETTER DDA", 71066); - _unicodeCharacterMap.Add("SIDDHAM LETTER DDHA", 71067); - _unicodeCharacterMap.Add("SIDDHAM LETTER NNA", 71068); - _unicodeCharacterMap.Add("SIDDHAM LETTER TA", 71069); - _unicodeCharacterMap.Add("SIDDHAM LETTER THA", 71070); - _unicodeCharacterMap.Add("SIDDHAM LETTER DA", 71071); - _unicodeCharacterMap.Add("SIDDHAM LETTER DHA", 71072); - _unicodeCharacterMap.Add("SIDDHAM LETTER NA", 71073); - _unicodeCharacterMap.Add("SIDDHAM LETTER PA", 71074); - _unicodeCharacterMap.Add("SIDDHAM LETTER PHA", 71075); - _unicodeCharacterMap.Add("SIDDHAM LETTER BA", 71076); - _unicodeCharacterMap.Add("SIDDHAM LETTER BHA", 71077); - _unicodeCharacterMap.Add("SIDDHAM LETTER MA", 71078); - _unicodeCharacterMap.Add("SIDDHAM LETTER YA", 71079); - _unicodeCharacterMap.Add("SIDDHAM LETTER RA", 71080); - _unicodeCharacterMap.Add("SIDDHAM LETTER LA", 71081); - _unicodeCharacterMap.Add("SIDDHAM LETTER VA", 71082); - _unicodeCharacterMap.Add("SIDDHAM LETTER SHA", 71083); - _unicodeCharacterMap.Add("SIDDHAM LETTER SSA", 71084); - _unicodeCharacterMap.Add("SIDDHAM LETTER SA", 71085); - _unicodeCharacterMap.Add("SIDDHAM LETTER HA", 71086); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN AA", 71087); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN I", 71088); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN II", 71089); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN U", 71090); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN UU", 71091); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN VOCALIC R", 71092); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN VOCALIC RR", 71093); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN E", 71096); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN AI", 71097); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN O", 71098); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN AU", 71099); - _unicodeCharacterMap.Add("SIDDHAM SIGN CANDRABINDU", 71100); - _unicodeCharacterMap.Add("SIDDHAM SIGN ANUSVARA", 71101); - _unicodeCharacterMap.Add("SIDDHAM SIGN VISARGA", 71102); - _unicodeCharacterMap.Add("SIDDHAM SIGN VIRAMA", 71103); - _unicodeCharacterMap.Add("SIDDHAM SIGN NUKTA", 71104); - _unicodeCharacterMap.Add("SIDDHAM SIGN SIDDHAM", 71105); - _unicodeCharacterMap.Add("SIDDHAM DANDA", 71106); - _unicodeCharacterMap.Add("SIDDHAM DOUBLE DANDA", 71107); - _unicodeCharacterMap.Add("SIDDHAM SEPARATOR DOT", 71108); - _unicodeCharacterMap.Add("SIDDHAM SEPARATOR BAR", 71109); - _unicodeCharacterMap.Add("SIDDHAM REPETITION MARK 1", 71110); - _unicodeCharacterMap.Add("SIDDHAM REPETITION MARK 2", 71111); - _unicodeCharacterMap.Add("SIDDHAM REPETITION MARK 3", 71112); - _unicodeCharacterMap.Add("SIDDHAM END OF TEXT MARK", 71113); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH TRIDENT AND U SHAPED ORNAMENTS", 71114); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS", 71115); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS", 71116); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS", 71117); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS", 71118); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK DOUBLE RING", 71119); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK DOUBLE RING WITH RAYS", 71120); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS", 71121); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS", 71122); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS", 71123); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS", 71124); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH CIRCLES AND RAYS", 71125); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES", 71126); - _unicodeCharacterMap.Add("SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES", 71127); - _unicodeCharacterMap.Add("SIDDHAM LETTER THREE CIRCLE ALTERNATE I", 71128); - _unicodeCharacterMap.Add("SIDDHAM LETTER TWO CIRCLE ALTERNATE I", 71129); - _unicodeCharacterMap.Add("SIDDHAM LETTER TWO CIRCLE ALTERNATE II", 71130); - _unicodeCharacterMap.Add("SIDDHAM LETTER ALTERNATE U", 71131); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN ALTERNATE U", 71132); - _unicodeCharacterMap.Add("SIDDHAM VOWEL SIGN ALTERNATE UU", 71133); - _unicodeCharacterMap.Add("MODI LETTER A", 71168); - _unicodeCharacterMap.Add("MODI LETTER AA", 71169); - _unicodeCharacterMap.Add("MODI LETTER I", 71170); - _unicodeCharacterMap.Add("MODI LETTER II", 71171); - _unicodeCharacterMap.Add("MODI LETTER U", 71172); - _unicodeCharacterMap.Add("MODI LETTER UU", 71173); - _unicodeCharacterMap.Add("MODI LETTER VOCALIC R", 71174); - _unicodeCharacterMap.Add("MODI LETTER VOCALIC RR", 71175); - _unicodeCharacterMap.Add("MODI LETTER VOCALIC L", 71176); - _unicodeCharacterMap.Add("MODI LETTER VOCALIC LL", 71177); - _unicodeCharacterMap.Add("MODI LETTER E", 71178); - _unicodeCharacterMap.Add("MODI LETTER AI", 71179); - _unicodeCharacterMap.Add("MODI LETTER O", 71180); - _unicodeCharacterMap.Add("MODI LETTER AU", 71181); - _unicodeCharacterMap.Add("MODI LETTER KA", 71182); - _unicodeCharacterMap.Add("MODI LETTER KHA", 71183); - _unicodeCharacterMap.Add("MODI LETTER GA", 71184); - _unicodeCharacterMap.Add("MODI LETTER GHA", 71185); - _unicodeCharacterMap.Add("MODI LETTER NGA", 71186); - _unicodeCharacterMap.Add("MODI LETTER CA", 71187); - _unicodeCharacterMap.Add("MODI LETTER CHA", 71188); - _unicodeCharacterMap.Add("MODI LETTER JA", 71189); - _unicodeCharacterMap.Add("MODI LETTER JHA", 71190); - _unicodeCharacterMap.Add("MODI LETTER NYA", 71191); - _unicodeCharacterMap.Add("MODI LETTER TTA", 71192); - _unicodeCharacterMap.Add("MODI LETTER TTHA", 71193); - _unicodeCharacterMap.Add("MODI LETTER DDA", 71194); - _unicodeCharacterMap.Add("MODI LETTER DDHA", 71195); - _unicodeCharacterMap.Add("MODI LETTER NNA", 71196); - _unicodeCharacterMap.Add("MODI LETTER TA", 71197); - _unicodeCharacterMap.Add("MODI LETTER THA", 71198); - _unicodeCharacterMap.Add("MODI LETTER DA", 71199); - _unicodeCharacterMap.Add("MODI LETTER DHA", 71200); - _unicodeCharacterMap.Add("MODI LETTER NA", 71201); - _unicodeCharacterMap.Add("MODI LETTER PA", 71202); - _unicodeCharacterMap.Add("MODI LETTER PHA", 71203); - _unicodeCharacterMap.Add("MODI LETTER BA", 71204); - _unicodeCharacterMap.Add("MODI LETTER BHA", 71205); - _unicodeCharacterMap.Add("MODI LETTER MA", 71206); - _unicodeCharacterMap.Add("MODI LETTER YA", 71207); - _unicodeCharacterMap.Add("MODI LETTER RA", 71208); - _unicodeCharacterMap.Add("MODI LETTER LA", 71209); - _unicodeCharacterMap.Add("MODI LETTER VA", 71210); - _unicodeCharacterMap.Add("MODI LETTER SHA", 71211); - _unicodeCharacterMap.Add("MODI LETTER SSA", 71212); - _unicodeCharacterMap.Add("MODI LETTER SA", 71213); - _unicodeCharacterMap.Add("MODI LETTER HA", 71214); - _unicodeCharacterMap.Add("MODI LETTER LLA", 71215); - _unicodeCharacterMap.Add("MODI VOWEL SIGN AA", 71216); - _unicodeCharacterMap.Add("MODI VOWEL SIGN I", 71217); - _unicodeCharacterMap.Add("MODI VOWEL SIGN II", 71218); - _unicodeCharacterMap.Add("MODI VOWEL SIGN U", 71219); - _unicodeCharacterMap.Add("MODI VOWEL SIGN UU", 71220); - _unicodeCharacterMap.Add("MODI VOWEL SIGN VOCALIC R", 71221); - _unicodeCharacterMap.Add("MODI VOWEL SIGN VOCALIC RR", 71222); - _unicodeCharacterMap.Add("MODI VOWEL SIGN VOCALIC L", 71223); - _unicodeCharacterMap.Add("MODI VOWEL SIGN VOCALIC LL", 71224); - _unicodeCharacterMap.Add("MODI VOWEL SIGN E", 71225); - _unicodeCharacterMap.Add("MODI VOWEL SIGN AI", 71226); - _unicodeCharacterMap.Add("MODI VOWEL SIGN O", 71227); - _unicodeCharacterMap.Add("MODI VOWEL SIGN AU", 71228); - _unicodeCharacterMap.Add("MODI SIGN ANUSVARA", 71229); - _unicodeCharacterMap.Add("MODI SIGN VISARGA", 71230); - _unicodeCharacterMap.Add("MODI SIGN VIRAMA", 71231); - _unicodeCharacterMap.Add("MODI SIGN ARDHACANDRA", 71232); - _unicodeCharacterMap.Add("MODI DANDA", 71233); - _unicodeCharacterMap.Add("MODI DOUBLE DANDA", 71234); - _unicodeCharacterMap.Add("MODI ABBREVIATION SIGN", 71235); - _unicodeCharacterMap.Add("MODI SIGN HUVA", 71236); - _unicodeCharacterMap.Add("MODI DIGIT ZERO", 71248); - _unicodeCharacterMap.Add("MODI DIGIT ONE", 71249); - _unicodeCharacterMap.Add("MODI DIGIT TWO", 71250); - _unicodeCharacterMap.Add("MODI DIGIT THREE", 71251); - _unicodeCharacterMap.Add("MODI DIGIT FOUR", 71252); - _unicodeCharacterMap.Add("MODI DIGIT FIVE", 71253); - _unicodeCharacterMap.Add("MODI DIGIT SIX", 71254); - _unicodeCharacterMap.Add("MODI DIGIT SEVEN", 71255); - _unicodeCharacterMap.Add("MODI DIGIT EIGHT", 71256); - _unicodeCharacterMap.Add("MODI DIGIT NINE", 71257); - _unicodeCharacterMap.Add("MONGOLIAN BIRGA WITH ORNAMENT", 71264); - _unicodeCharacterMap.Add("MONGOLIAN ROTATED BIRGA", 71265); - _unicodeCharacterMap.Add("MONGOLIAN DOUBLE BIRGA WITH ORNAMENT", 71266); - _unicodeCharacterMap.Add("MONGOLIAN TRIPLE BIRGA WITH ORNAMENT", 71267); - _unicodeCharacterMap.Add("MONGOLIAN BIRGA WITH DOUBLE ORNAMENT", 71268); - _unicodeCharacterMap.Add("MONGOLIAN ROTATED BIRGA WITH ORNAMENT", 71269); - _unicodeCharacterMap.Add("MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT", 71270); - _unicodeCharacterMap.Add("MONGOLIAN INVERTED BIRGA", 71271); - _unicodeCharacterMap.Add("MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT", 71272); - _unicodeCharacterMap.Add("MONGOLIAN SWIRL BIRGA", 71273); - _unicodeCharacterMap.Add("MONGOLIAN SWIRL BIRGA WITH ORNAMENT", 71274); - _unicodeCharacterMap.Add("MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT", 71275); - _unicodeCharacterMap.Add("MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT", 71276); - _unicodeCharacterMap.Add("TAKRI LETTER A", 71296); - _unicodeCharacterMap.Add("TAKRI LETTER AA", 71297); - _unicodeCharacterMap.Add("TAKRI LETTER I", 71298); - _unicodeCharacterMap.Add("TAKRI LETTER II", 71299); - _unicodeCharacterMap.Add("TAKRI LETTER U", 71300); - _unicodeCharacterMap.Add("TAKRI LETTER UU", 71301); - _unicodeCharacterMap.Add("TAKRI LETTER E", 71302); - _unicodeCharacterMap.Add("TAKRI LETTER AI", 71303); - _unicodeCharacterMap.Add("TAKRI LETTER O", 71304); - _unicodeCharacterMap.Add("TAKRI LETTER AU", 71305); - _unicodeCharacterMap.Add("TAKRI LETTER KA", 71306); - _unicodeCharacterMap.Add("TAKRI LETTER KHA", 71307); - _unicodeCharacterMap.Add("TAKRI LETTER GA", 71308); - _unicodeCharacterMap.Add("TAKRI LETTER GHA", 71309); - _unicodeCharacterMap.Add("TAKRI LETTER NGA", 71310); - _unicodeCharacterMap.Add("TAKRI LETTER CA", 71311); - _unicodeCharacterMap.Add("TAKRI LETTER CHA", 71312); - _unicodeCharacterMap.Add("TAKRI LETTER JA", 71313); - _unicodeCharacterMap.Add("TAKRI LETTER JHA", 71314); - _unicodeCharacterMap.Add("TAKRI LETTER NYA", 71315); - _unicodeCharacterMap.Add("TAKRI LETTER TTA", 71316); - _unicodeCharacterMap.Add("TAKRI LETTER TTHA", 71317); - _unicodeCharacterMap.Add("TAKRI LETTER DDA", 71318); - _unicodeCharacterMap.Add("TAKRI LETTER DDHA", 71319); - _unicodeCharacterMap.Add("TAKRI LETTER NNA", 71320); - _unicodeCharacterMap.Add("TAKRI LETTER TA", 71321); - _unicodeCharacterMap.Add("TAKRI LETTER THA", 71322); - _unicodeCharacterMap.Add("TAKRI LETTER DA", 71323); - _unicodeCharacterMap.Add("TAKRI LETTER DHA", 71324); - _unicodeCharacterMap.Add("TAKRI LETTER NA", 71325); - _unicodeCharacterMap.Add("TAKRI LETTER PA", 71326); - _unicodeCharacterMap.Add("TAKRI LETTER PHA", 71327); - _unicodeCharacterMap.Add("TAKRI LETTER BA", 71328); - _unicodeCharacterMap.Add("TAKRI LETTER BHA", 71329); - _unicodeCharacterMap.Add("TAKRI LETTER MA", 71330); - _unicodeCharacterMap.Add("TAKRI LETTER YA", 71331); - _unicodeCharacterMap.Add("TAKRI LETTER RA", 71332); - _unicodeCharacterMap.Add("TAKRI LETTER LA", 71333); - _unicodeCharacterMap.Add("TAKRI LETTER VA", 71334); - _unicodeCharacterMap.Add("TAKRI LETTER SHA", 71335); - _unicodeCharacterMap.Add("TAKRI LETTER SA", 71336); - _unicodeCharacterMap.Add("TAKRI LETTER HA", 71337); - _unicodeCharacterMap.Add("TAKRI LETTER RRA", 71338); - _unicodeCharacterMap.Add("TAKRI SIGN ANUSVARA", 71339); - _unicodeCharacterMap.Add("TAKRI SIGN VISARGA", 71340); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN AA", 71341); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN I", 71342); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN II", 71343); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN U", 71344); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN UU", 71345); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN E", 71346); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN AI", 71347); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN O", 71348); - _unicodeCharacterMap.Add("TAKRI VOWEL SIGN AU", 71349); - _unicodeCharacterMap.Add("TAKRI SIGN VIRAMA", 71350); - _unicodeCharacterMap.Add("TAKRI SIGN NUKTA", 71351); - _unicodeCharacterMap.Add("TAKRI DIGIT ZERO", 71360); - _unicodeCharacterMap.Add("TAKRI DIGIT ONE", 71361); - _unicodeCharacterMap.Add("TAKRI DIGIT TWO", 71362); - _unicodeCharacterMap.Add("TAKRI DIGIT THREE", 71363); - _unicodeCharacterMap.Add("TAKRI DIGIT FOUR", 71364); - _unicodeCharacterMap.Add("TAKRI DIGIT FIVE", 71365); - _unicodeCharacterMap.Add("TAKRI DIGIT SIX", 71366); - _unicodeCharacterMap.Add("TAKRI DIGIT SEVEN", 71367); - _unicodeCharacterMap.Add("TAKRI DIGIT EIGHT", 71368); - _unicodeCharacterMap.Add("TAKRI DIGIT NINE", 71369); - _unicodeCharacterMap.Add("AHOM LETTER KA", 71424); - _unicodeCharacterMap.Add("AHOM LETTER KHA", 71425); - _unicodeCharacterMap.Add("AHOM LETTER NGA", 71426); - _unicodeCharacterMap.Add("AHOM LETTER NA", 71427); - _unicodeCharacterMap.Add("AHOM LETTER TA", 71428); - _unicodeCharacterMap.Add("AHOM LETTER ALTERNATE TA", 71429); - _unicodeCharacterMap.Add("AHOM LETTER PA", 71430); - _unicodeCharacterMap.Add("AHOM LETTER PHA", 71431); - _unicodeCharacterMap.Add("AHOM LETTER BA", 71432); - _unicodeCharacterMap.Add("AHOM LETTER MA", 71433); - _unicodeCharacterMap.Add("AHOM LETTER JA", 71434); - _unicodeCharacterMap.Add("AHOM LETTER CHA", 71435); - _unicodeCharacterMap.Add("AHOM LETTER THA", 71436); - _unicodeCharacterMap.Add("AHOM LETTER RA", 71437); - _unicodeCharacterMap.Add("AHOM LETTER LA", 71438); - _unicodeCharacterMap.Add("AHOM LETTER SA", 71439); - _unicodeCharacterMap.Add("AHOM LETTER NYA", 71440); - _unicodeCharacterMap.Add("AHOM LETTER HA", 71441); - _unicodeCharacterMap.Add("AHOM LETTER A", 71442); - _unicodeCharacterMap.Add("AHOM LETTER DA", 71443); - _unicodeCharacterMap.Add("AHOM LETTER DHA", 71444); - _unicodeCharacterMap.Add("AHOM LETTER GA", 71445); - _unicodeCharacterMap.Add("AHOM LETTER ALTERNATE GA", 71446); - _unicodeCharacterMap.Add("AHOM LETTER GHA", 71447); - _unicodeCharacterMap.Add("AHOM LETTER BHA", 71448); - _unicodeCharacterMap.Add("AHOM LETTER JHA", 71449); - _unicodeCharacterMap.Add("AHOM CONSONANT SIGN MEDIAL LA", 71453); - _unicodeCharacterMap.Add("AHOM CONSONANT SIGN MEDIAL RA", 71454); - _unicodeCharacterMap.Add("AHOM CONSONANT SIGN MEDIAL LIGATING RA", 71455); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN A", 71456); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN AA", 71457); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN I", 71458); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN II", 71459); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN U", 71460); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN UU", 71461); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN E", 71462); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN AW", 71463); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN O", 71464); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN AI", 71465); - _unicodeCharacterMap.Add("AHOM VOWEL SIGN AM", 71466); - _unicodeCharacterMap.Add("AHOM SIGN KILLER", 71467); - _unicodeCharacterMap.Add("AHOM DIGIT ZERO", 71472); - _unicodeCharacterMap.Add("AHOM DIGIT ONE", 71473); - _unicodeCharacterMap.Add("AHOM DIGIT TWO", 71474); - _unicodeCharacterMap.Add("AHOM DIGIT THREE", 71475); - _unicodeCharacterMap.Add("AHOM DIGIT FOUR", 71476); - _unicodeCharacterMap.Add("AHOM DIGIT FIVE", 71477); - _unicodeCharacterMap.Add("AHOM DIGIT SIX", 71478); - _unicodeCharacterMap.Add("AHOM DIGIT SEVEN", 71479); - _unicodeCharacterMap.Add("AHOM DIGIT EIGHT", 71480); - _unicodeCharacterMap.Add("AHOM DIGIT NINE", 71481); - _unicodeCharacterMap.Add("AHOM NUMBER TEN", 71482); - _unicodeCharacterMap.Add("AHOM NUMBER TWENTY", 71483); - _unicodeCharacterMap.Add("AHOM SIGN SMALL SECTION", 71484); - _unicodeCharacterMap.Add("AHOM SIGN SECTION", 71485); - _unicodeCharacterMap.Add("AHOM SIGN RULAI", 71486); - _unicodeCharacterMap.Add("AHOM SYMBOL VI", 71487); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER NGAA", 71840); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER A", 71841); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER WI", 71842); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER YU", 71843); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER YA", 71844); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER YO", 71845); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER II", 71846); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER UU", 71847); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER E", 71848); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER O", 71849); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER ANG", 71850); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER GA", 71851); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER KO", 71852); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER ENY", 71853); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER YUJ", 71854); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER UC", 71855); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER ENN", 71856); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER ODD", 71857); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER TTE", 71858); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER NUNG", 71859); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER DA", 71860); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER AT", 71861); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER AM", 71862); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER BU", 71863); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER PU", 71864); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER HIYO", 71865); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER HOLO", 71866); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER HORR", 71867); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER HAR", 71868); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER SSUU", 71869); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER SII", 71870); - _unicodeCharacterMap.Add("WARANG CITI CAPITAL LETTER VIYO", 71871); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER NGAA", 71872); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER A", 71873); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER WI", 71874); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER YU", 71875); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER YA", 71876); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER YO", 71877); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER II", 71878); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER UU", 71879); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER E", 71880); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER O", 71881); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER ANG", 71882); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER GA", 71883); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER KO", 71884); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER ENY", 71885); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER YUJ", 71886); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER UC", 71887); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER ENN", 71888); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER ODD", 71889); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER TTE", 71890); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER NUNG", 71891); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER DA", 71892); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER AT", 71893); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER AM", 71894); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER BU", 71895); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER PU", 71896); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER HIYO", 71897); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER HOLO", 71898); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER HORR", 71899); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER HAR", 71900); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER SSUU", 71901); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER SII", 71902); - _unicodeCharacterMap.Add("WARANG CITI SMALL LETTER VIYO", 71903); - _unicodeCharacterMap.Add("WARANG CITI DIGIT ZERO", 71904); - _unicodeCharacterMap.Add("WARANG CITI DIGIT ONE", 71905); - _unicodeCharacterMap.Add("WARANG CITI DIGIT TWO", 71906); - _unicodeCharacterMap.Add("WARANG CITI DIGIT THREE", 71907); - _unicodeCharacterMap.Add("WARANG CITI DIGIT FOUR", 71908); - _unicodeCharacterMap.Add("WARANG CITI DIGIT FIVE", 71909); - _unicodeCharacterMap.Add("WARANG CITI DIGIT SIX", 71910); - _unicodeCharacterMap.Add("WARANG CITI DIGIT SEVEN", 71911); - _unicodeCharacterMap.Add("WARANG CITI DIGIT EIGHT", 71912); - _unicodeCharacterMap.Add("WARANG CITI DIGIT NINE", 71913); - _unicodeCharacterMap.Add("WARANG CITI NUMBER TEN", 71914); - _unicodeCharacterMap.Add("WARANG CITI NUMBER TWENTY", 71915); - _unicodeCharacterMap.Add("WARANG CITI NUMBER THIRTY", 71916); - _unicodeCharacterMap.Add("WARANG CITI NUMBER FORTY", 71917); - _unicodeCharacterMap.Add("WARANG CITI NUMBER FIFTY", 71918); - _unicodeCharacterMap.Add("WARANG CITI NUMBER SIXTY", 71919); - _unicodeCharacterMap.Add("WARANG CITI NUMBER SEVENTY", 71920); - _unicodeCharacterMap.Add("WARANG CITI NUMBER EIGHTY", 71921); - _unicodeCharacterMap.Add("WARANG CITI NUMBER NINETY", 71922); - _unicodeCharacterMap.Add("WARANG CITI OM", 71935); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER PA", 72384); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER KA", 72385); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER LA", 72386); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER MA", 72387); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER DA", 72388); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER ZA", 72389); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER VA", 72390); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER NGA", 72391); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER HA", 72392); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER GA", 72393); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER KHA", 72394); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER SA", 72395); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER BA", 72396); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER CA", 72397); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER TA", 72398); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER THA", 72399); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER NA", 72400); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER PHA", 72401); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER RA", 72402); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FA", 72403); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER CHA", 72404); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER A", 72405); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER E", 72406); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER I", 72407); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER O", 72408); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER U", 72409); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER UA", 72410); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER IA", 72411); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL P", 72412); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL K", 72413); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL T", 72414); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL M", 72415); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL N", 72416); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL L", 72417); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL W", 72418); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL NG", 72419); - _unicodeCharacterMap.Add("PAU CIN HAU LETTER FINAL Y", 72420); - _unicodeCharacterMap.Add("PAU CIN HAU RISING TONE LONG", 72421); - _unicodeCharacterMap.Add("PAU CIN HAU RISING TONE", 72422); - _unicodeCharacterMap.Add("PAU CIN HAU SANDHI GLOTTAL STOP", 72423); - _unicodeCharacterMap.Add("PAU CIN HAU RISING TONE LONG FINAL", 72424); - _unicodeCharacterMap.Add("PAU CIN HAU RISING TONE FINAL", 72425); - _unicodeCharacterMap.Add("PAU CIN HAU SANDHI GLOTTAL STOP FINAL", 72426); - _unicodeCharacterMap.Add("PAU CIN HAU SANDHI TONE LONG", 72427); - _unicodeCharacterMap.Add("PAU CIN HAU SANDHI TONE", 72428); - _unicodeCharacterMap.Add("PAU CIN HAU SANDHI TONE LONG FINAL", 72429); - _unicodeCharacterMap.Add("PAU CIN HAU SANDHI TONE FINAL", 72430); - _unicodeCharacterMap.Add("PAU CIN HAU MID LEVEL TONE", 72431); - _unicodeCharacterMap.Add("PAU CIN HAU GLOTTAL STOP VARIANT", 72432); - _unicodeCharacterMap.Add("PAU CIN HAU MID LEVEL TONE LONG FINAL", 72433); - _unicodeCharacterMap.Add("PAU CIN HAU MID LEVEL TONE FINAL", 72434); - _unicodeCharacterMap.Add("PAU CIN HAU LOW FALLING TONE LONG", 72435); - _unicodeCharacterMap.Add("PAU CIN HAU LOW FALLING TONE", 72436); - _unicodeCharacterMap.Add("PAU CIN HAU GLOTTAL STOP", 72437); - _unicodeCharacterMap.Add("PAU CIN HAU LOW FALLING TONE LONG FINAL", 72438); - _unicodeCharacterMap.Add("PAU CIN HAU LOW FALLING TONE FINAL", 72439); - _unicodeCharacterMap.Add("PAU CIN HAU GLOTTAL STOP FINAL", 72440); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER A", 72704); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER AA", 72705); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER I", 72706); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER II", 72707); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER U", 72708); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER UU", 72709); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER VOCALIC R", 72710); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER VOCALIC RR", 72711); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER VOCALIC L", 72712); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER E", 72714); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER AI", 72715); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER O", 72716); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER AU", 72717); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER KA", 72718); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER KHA", 72719); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER GA", 72720); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER GHA", 72721); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER NGA", 72722); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER CA", 72723); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER CHA", 72724); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER JA", 72725); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER JHA", 72726); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER NYA", 72727); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER TTA", 72728); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER TTHA", 72729); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER DDA", 72730); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER DDHA", 72731); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER NNA", 72732); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER TA", 72733); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER THA", 72734); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER DA", 72735); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER DHA", 72736); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER NA", 72737); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER PA", 72738); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER PHA", 72739); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER BA", 72740); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER BHA", 72741); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER MA", 72742); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER YA", 72743); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER RA", 72744); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER LA", 72745); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER VA", 72746); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER SHA", 72747); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER SSA", 72748); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER SA", 72749); - _unicodeCharacterMap.Add("BHAIKSUKI LETTER HA", 72750); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN AA", 72751); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN I", 72752); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN II", 72753); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN U", 72754); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN UU", 72755); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN VOCALIC R", 72756); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN VOCALIC RR", 72757); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN VOCALIC L", 72758); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN E", 72760); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN AI", 72761); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN O", 72762); - _unicodeCharacterMap.Add("BHAIKSUKI VOWEL SIGN AU", 72763); - _unicodeCharacterMap.Add("BHAIKSUKI SIGN CANDRABINDU", 72764); - _unicodeCharacterMap.Add("BHAIKSUKI SIGN ANUSVARA", 72765); - _unicodeCharacterMap.Add("BHAIKSUKI SIGN VISARGA", 72766); - _unicodeCharacterMap.Add("BHAIKSUKI SIGN VIRAMA", 72767); - _unicodeCharacterMap.Add("BHAIKSUKI SIGN AVAGRAHA", 72768); - _unicodeCharacterMap.Add("BHAIKSUKI DANDA", 72769); - _unicodeCharacterMap.Add("BHAIKSUKI DOUBLE DANDA", 72770); - _unicodeCharacterMap.Add("BHAIKSUKI WORD SEPARATOR", 72771); - _unicodeCharacterMap.Add("BHAIKSUKI GAP FILLER 1", 72772); - _unicodeCharacterMap.Add("BHAIKSUKI GAP FILLER 2", 72773); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT ZERO", 72784); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT ONE", 72785); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT TWO", 72786); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT THREE", 72787); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT FOUR", 72788); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT FIVE", 72789); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT SIX", 72790); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT SEVEN", 72791); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT EIGHT", 72792); - _unicodeCharacterMap.Add("BHAIKSUKI DIGIT NINE", 72793); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER ONE", 72794); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER TWO", 72795); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER THREE", 72796); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER FOUR", 72797); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER FIVE", 72798); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER SIX", 72799); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER SEVEN", 72800); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER EIGHT", 72801); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER NINE", 72802); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER TEN", 72803); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER TWENTY", 72804); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER THIRTY", 72805); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER FORTY", 72806); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER FIFTY", 72807); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER SIXTY", 72808); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER SEVENTY", 72809); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER EIGHTY", 72810); - _unicodeCharacterMap.Add("BHAIKSUKI NUMBER NINETY", 72811); - _unicodeCharacterMap.Add("BHAIKSUKI HUNDREDS UNIT MARK", 72812); - _unicodeCharacterMap.Add("MARCHEN HEAD MARK", 72816); - _unicodeCharacterMap.Add("MARCHEN MARK SHAD", 72817); - _unicodeCharacterMap.Add("MARCHEN LETTER KA", 72818); - _unicodeCharacterMap.Add("MARCHEN LETTER KHA", 72819); - _unicodeCharacterMap.Add("MARCHEN LETTER GA", 72820); - _unicodeCharacterMap.Add("MARCHEN LETTER NGA", 72821); - _unicodeCharacterMap.Add("MARCHEN LETTER CA", 72822); - _unicodeCharacterMap.Add("MARCHEN LETTER CHA", 72823); - _unicodeCharacterMap.Add("MARCHEN LETTER JA", 72824); - _unicodeCharacterMap.Add("MARCHEN LETTER NYA", 72825); - _unicodeCharacterMap.Add("MARCHEN LETTER TA", 72826); - _unicodeCharacterMap.Add("MARCHEN LETTER THA", 72827); - _unicodeCharacterMap.Add("MARCHEN LETTER DA", 72828); - _unicodeCharacterMap.Add("MARCHEN LETTER NA", 72829); - _unicodeCharacterMap.Add("MARCHEN LETTER PA", 72830); - _unicodeCharacterMap.Add("MARCHEN LETTER PHA", 72831); - _unicodeCharacterMap.Add("MARCHEN LETTER BA", 72832); - _unicodeCharacterMap.Add("MARCHEN LETTER MA", 72833); - _unicodeCharacterMap.Add("MARCHEN LETTER TSA", 72834); - _unicodeCharacterMap.Add("MARCHEN LETTER TSHA", 72835); - _unicodeCharacterMap.Add("MARCHEN LETTER DZA", 72836); - _unicodeCharacterMap.Add("MARCHEN LETTER WA", 72837); - _unicodeCharacterMap.Add("MARCHEN LETTER ZHA", 72838); - _unicodeCharacterMap.Add("MARCHEN LETTER ZA", 72839); - _unicodeCharacterMap.Add("MARCHEN LETTER A", 72840); - _unicodeCharacterMap.Add("MARCHEN LETTER YA", 72841); - _unicodeCharacterMap.Add("MARCHEN LETTER RA", 72842); - _unicodeCharacterMap.Add("MARCHEN LETTER LA", 72843); - _unicodeCharacterMap.Add("MARCHEN LETTER SHA", 72844); - _unicodeCharacterMap.Add("MARCHEN LETTER SA", 72845); - _unicodeCharacterMap.Add("MARCHEN LETTER HA", 72846); - _unicodeCharacterMap.Add("MARCHEN LETTER A", 72847); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER KA", 72850); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER KHA", 72851); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER GA", 72852); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER NGA", 72853); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER CA", 72854); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER CHA", 72855); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER JA", 72856); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER NYA", 72857); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER TA", 72858); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER THA", 72859); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER DA", 72860); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER NA", 72861); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER PA", 72862); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER PHA", 72863); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER BA", 72864); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER MA", 72865); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER TSA", 72866); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER TSHA", 72867); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER DZA", 72868); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER WA", 72869); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER ZHA", 72870); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER ZA", 72871); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER YA", 72873); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER RA", 72874); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER LA", 72875); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER SHA", 72876); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER SA", 72877); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER HA", 72878); - _unicodeCharacterMap.Add("MARCHEN SUBJOINED LETTER A", 72879); - _unicodeCharacterMap.Add("MARCHEN VOWEL SIGN AA", 72880); - _unicodeCharacterMap.Add("MARCHEN VOWEL SIGN I", 72881); - _unicodeCharacterMap.Add("MARCHEN VOWEL SIGN U", 72882); - _unicodeCharacterMap.Add("MARCHEN VOWEL SIGN E", 72883); - _unicodeCharacterMap.Add("MARCHEN VOWEL SIGN O", 72884); - _unicodeCharacterMap.Add("MARCHEN SIGN ANUSVARA", 72885); - _unicodeCharacterMap.Add("MARCHEN SIGN CANDRABINDU", 72886); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A", 73728); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES A", 73729); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES BAD", 73730); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES GAN2 TENU", 73731); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES HA", 73732); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES IGI", 73733); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES LAGAR GUNU", 73734); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES MUSH", 73735); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A TIMES SAG", 73736); - _unicodeCharacterMap.Add("CUNEIFORM SIGN A2", 73737); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB", 73738); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES ASH2", 73739); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES DUN3 GUNU", 73740); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES GAL", 73741); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES GAN2 TENU", 73742); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES HA", 73743); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES IGI GUNU", 73744); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES IMIN", 73745); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES LAGAB", 73746); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES SHESH", 73747); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES U PLUS U PLUS U", 73748); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB GUNU", 73749); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB2", 73750); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB2 TIMES BALAG", 73751); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB2 TIMES GAN2 TENU", 73752); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB2 TIMES ME PLUS EN", 73753); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB2 TIMES SHA3", 73754); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB2 TIMES TAK4", 73755); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AD", 73756); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AK", 73757); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AK TIMES ERIN2", 73758); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AK TIMES SHITA PLUS GISH", 73759); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL", 73760); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES AL", 73761); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES DIM2", 73762); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES GISH", 73763); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES HA", 73764); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES KAD3", 73765); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES KI", 73766); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES SHE", 73767); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AL TIMES USH", 73768); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ALAN", 73769); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ALEPH", 73770); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AMAR", 73771); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AMAR TIMES SHE", 73772); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AN", 73773); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AN OVER AN", 73774); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AN THREE TIMES", 73775); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA", 73776); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AN PLUS NAGA SQUARED", 73777); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ANSHE", 73778); - _unicodeCharacterMap.Add("CUNEIFORM SIGN APIN", 73779); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ARAD", 73780); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ARAD TIMES KUR", 73781); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ARKAB", 73782); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASAL2", 73783); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASH", 73784); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASH ZIDA TENU", 73785); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASH KABA TENU", 73786); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP", 73787); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASH OVER ASH OVER ASH", 73788); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH", 73789); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASH2", 73790); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ASHGAB", 73791); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BA", 73792); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAD", 73793); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAG3", 73794); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAHAR2", 73795); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAL", 73796); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAL OVER BAL", 73797); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BALAG", 73798); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAR", 73799); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BARA2", 73800); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BI", 73801); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BI TIMES A", 73802); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BI TIMES GAR", 73803); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BI TIMES IGI GUNU", 73804); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BU", 73805); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BU OVER BU AB", 73806); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BU OVER BU UN", 73807); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BU CROSSING BU", 73808); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BULUG", 73809); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BULUG OVER BULUG", 73810); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BUR", 73811); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BUR2", 73812); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DA", 73813); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG", 73814); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH", 73815); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES AMAR", 73816); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES BALAG", 73817); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES BI", 73818); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES GA", 73819); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH", 73820); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES GI", 73821); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES GIR2", 73822); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES GUD", 73823); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES HA", 73824); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES IR", 73825); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU", 73826); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES KAK", 73827); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES LA", 73828); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES LU", 73829); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2", 73830); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES LUM", 73831); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES NE", 73832); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP", 73833); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES SI", 73834); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES TAK4", 73835); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2", 73836); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES USH", 73837); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAM", 73838); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAR", 73839); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DARA3", 73840); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DARA4", 73841); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DI", 73842); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIB", 73843); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIM", 73844); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIM TIMES SHE", 73845); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIM2", 73846); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIN", 73847); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIN KASKAL U GUNU DISH", 73848); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DISH", 73849); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DU", 73850); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DU OVER DU", 73851); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DU GUNU", 73852); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DU SHESHIG", 73853); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUB", 73854); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUB TIMES ESH2", 73855); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUB2", 73856); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG", 73857); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUGUD", 73858); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUH", 73859); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUN", 73860); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUN3", 73861); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUN3 GUNU", 73862); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUN3 GUNU GUNU", 73863); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUN4", 73864); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUR2", 73865); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E", 73866); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E TIMES PAP", 73867); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E OVER E NUN OVER NUN", 73868); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2", 73869); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA", 73870); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES GAR", 73871); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES MI", 73872); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES SAL", 73873); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES SHE", 73874); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES U", 73875); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EDIN", 73876); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EGIR", 73877); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EL", 73878); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EN", 73879); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EN TIMES GAN2", 73880); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EN TIMES GAN2 TENU", 73881); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EN TIMES ME", 73882); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EN CROSSING EN", 73883); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EN OPPOSING EN", 73884); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EN SQUARED", 73885); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EREN", 73886); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ERIN2", 73887); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ESH2", 73888); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN", 73889); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES A", 73890); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES A PLUS LAL", 73891); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL", 73892); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES AN", 73893); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES BAD", 73894); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES DUN3 GUNU", 73895); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU", 73896); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES HA", 73897); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES HA GUNU", 73898); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES IGI GUNU", 73899); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES KASKAL", 73900); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED", 73901); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES KU3", 73902); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES LA", 73903); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL", 73904); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES LI", 73905); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES LU", 73906); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES U2", 73907); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES UD", 73908); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA", 73909); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA GUNU", 73910); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2", 73911); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA", 73912); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES A PLUS HA", 73913); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES A PLUS IGI", 73914); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB", 73915); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES AN", 73916); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES ASH", 73917); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL", 73918); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES BAD", 73919); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES BAR PLUS RA", 73920); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES BUR", 73921); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES BUR PLUS RA", 73922); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES DA", 73923); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES DI", 73924); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE", 73925); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES DUB", 73926); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES EL", 73927); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES EL PLUS LA", 73928); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES EN", 73929); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU", 73930); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GAN2 TENU", 73931); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GAR", 73932); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GI", 73933); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GI4", 73934); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GI4 PLUS A", 73935); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU", 73936); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2", 73937); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES HAL", 73938); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES HAL PLUS LA", 73939); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES HI PLUS LI", 73940); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES HUB2", 73941); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES IGI GUNU", 73942); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH", 73943); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES KAK", 73944); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES KASKAL", 73945); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES KID", 73946); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES KID PLUS LAL", 73947); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN", 73948); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES LA", 73949); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES ME PLUS EN", 73950); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES MI", 73951); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES NUN", 73952); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES NUN OVER NUN", 73953); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES PA", 73954); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES SAL", 73955); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES SAR", 73956); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES SHE", 73957); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR", 73958); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES SHID", 73959); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES SUM", 73960); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES TAK4", 73961); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES U", 73962); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES UD", 73963); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES UD PLUS DU", 73964); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 OVER GA2", 73965); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GABA", 73966); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GABA CROSSING GABA", 73967); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAD", 73968); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR", 73969); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAL", 73970); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR", 73971); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GALAM", 73972); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAM", 73973); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAN", 73974); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAN2", 73975); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAN2 TENU", 73976); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAN2 OVER GAN2", 73977); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAN2 CROSSING GAN2", 73978); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAR", 73979); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GAR3", 73980); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GASHAN", 73981); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GESHTIN", 73982); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GESHTIN TIMES KUR", 73983); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GI", 73984); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GI TIMES E", 73985); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GI TIMES U", 73986); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GI CROSSING GI", 73987); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GI4", 73988); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GI4 OVER GI4", 73989); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GI4 CROSSING GI4", 73990); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIDIM", 73991); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR2", 73992); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR2 GUNU", 73993); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR3", 73994); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR3 TIMES A PLUS IGI", 73995); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR3 TIMES GAN2 TENU", 73996); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR3 TIMES IGI", 73997); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI", 73998); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIR3 TIMES PA", 73999); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GISAL", 74000); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GISH", 74001); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GISH CROSSING GISH", 74002); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GISH TIMES BAD", 74003); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GISH TIMES TAK4", 74004); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GISH TENU", 74005); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU", 74006); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU CROSSING GU", 74007); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU2", 74008); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU2 TIMES KAK", 74009); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU", 74010); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU2 TIMES NUN", 74011); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2", 74012); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU2 GUNU", 74013); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUD", 74014); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUD TIMES A PLUS KUR", 74015); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUD TIMES KUR", 74016); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUD OVER GUD LUGAL", 74017); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUL", 74018); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUM", 74019); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUM TIMES SHE", 74020); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUR", 74021); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUR7", 74022); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GURUN", 74023); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GURUSH", 74024); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HA", 74025); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HA TENU", 74026); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HA GUNU", 74027); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HAL", 74028); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI", 74029); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES ASH", 74030); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES ASH2", 74031); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES BAD", 74032); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES DISH", 74033); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES GAD", 74034); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES KIN", 74035); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES NUN", 74036); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES SHE", 74037); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES U", 74038); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HU", 74039); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUB2", 74040); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUB2 TIMES AN", 74041); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUB2 TIMES HAL", 74042); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUB2 TIMES KASKAL", 74043); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUB2 TIMES LISH", 74044); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUB2 TIMES UD", 74045); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUL2", 74046); - _unicodeCharacterMap.Add("CUNEIFORM SIGN I", 74047); - _unicodeCharacterMap.Add("CUNEIFORM SIGN I A", 74048); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IB", 74049); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IDIM", 74050); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IDIM OVER IDIM BUR", 74051); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IDIM OVER IDIM SQUARED", 74052); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IG", 74053); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IGI", 74054); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IGI DIB", 74055); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IGI RI", 74056); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD", 74057); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IGI GUNU", 74058); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IL", 74059); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IL TIMES GAN2 TENU", 74060); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IL2", 74061); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IM", 74062); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IM TIMES TAK4", 74063); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IM CROSSING IM", 74064); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IM OPPOSING IM", 74065); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IM SQUARED", 74066); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IMIN", 74067); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IN", 74068); - _unicodeCharacterMap.Add("CUNEIFORM SIGN IR", 74069); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ISH", 74070); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA", 74071); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES A", 74072); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES AD", 74073); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES AD PLUS KU3", 74074); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ASH2", 74075); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES BAD", 74076); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES BALAG", 74077); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES BAR", 74078); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES BI", 74079); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ERIN2", 74080); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ESH2", 74081); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GA", 74082); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GAL", 74083); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GAN2 TENU", 74084); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GAR", 74085); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A", 74086); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GI", 74087); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GIR2", 74088); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GISH PLUS SAR", 74089); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GISH CROSSING GISH", 74090); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GU", 74091); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GUR7", 74092); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES IGI", 74093); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES IM", 74094); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES KAK", 74095); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES KI", 74096); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES KID", 74097); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES LI", 74098); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES LU", 74099); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ME", 74100); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ME PLUS DU", 74101); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ME PLUS GI", 74102); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ME PLUS TE", 74103); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES MI", 74104); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ", 74105); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES NE", 74106); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES NUN", 74107); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES PI", 74108); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES RU", 74109); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SA", 74110); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SAR", 74111); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SHA", 74112); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SHE", 74113); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SHID", 74114); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SHU", 74115); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SIG", 74116); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SUHUR", 74117); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES TAR", 74118); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES U", 74119); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES U2", 74120); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES UD", 74121); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES UMUM TIMES PA", 74122); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES USH", 74123); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ZI", 74124); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA2", 74125); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA2 CROSSING KA2", 74126); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAB", 74127); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAD2", 74128); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAD3", 74129); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAD4", 74130); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAD5", 74131); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAD5 OVER KAD5", 74132); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAK", 74133); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAK TIMES IGI GUNU", 74134); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAL", 74135); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAL TIMES BAD", 74136); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAL CROSSING KAL", 74137); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAM2", 74138); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAM4", 74139); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KASKAL", 74140); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U", 74141); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U", 74142); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KESH2", 74143); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KI", 74144); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KI TIMES BAD", 74145); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KI TIMES U", 74146); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KI TIMES UD", 74147); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KID", 74148); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KIN", 74149); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KISAL", 74150); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KISH", 74151); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KISIM5", 74152); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KISIM5 OVER KISIM5", 74153); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KU", 74154); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2", 74155); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KU3", 74156); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KU4", 74157); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KU4 VARIANT FORM", 74158); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KU7", 74159); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KUL", 74160); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KUL GUNU", 74161); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KUN", 74162); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KUR", 74163); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KUR OPPOSING KUR", 74164); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KUSHU2", 74165); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KWU318", 74166); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LA", 74167); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB", 74168); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES A", 74169); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA", 74170); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES A PLUS GAR", 74171); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES A PLUS LAL", 74172); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES AL", 74173); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES AN", 74174); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU", 74175); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES BAD", 74176); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES BI", 74177); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES DAR", 74178); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES EN", 74179); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES GA", 74180); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES GAR", 74181); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES GUD", 74182); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD", 74183); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES HA", 74184); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES HAL", 74185); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN", 74186); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES IGI GUNU", 74187); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES IM", 74188); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES IM PLUS HA", 74189); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES IM PLUS LU", 74190); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES KI", 74191); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES KIN", 74192); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES KU3", 74193); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES KUL", 74194); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A", 74195); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES LAGAB", 74196); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES LISH", 74197); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES LU", 74198); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES LUL", 74199); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES ME", 74200); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES ME PLUS EN", 74201); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES MUSH", 74202); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES NE", 74203); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM", 74204); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2", 74205); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU", 74206); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES SHU2", 74207); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2", 74208); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES SUM", 74209); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES TAG", 74210); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES TAK4", 74211); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA", 74212); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES U", 74213); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES U PLUS A", 74214); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U", 74215); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH", 74216); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES UD", 74217); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES USH", 74218); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB SQUARED", 74219); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAR", 74220); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAR TIMES SHE", 74221); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM", 74222); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAR GUNU", 74223); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE", 74224); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAHSHU", 74225); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAL", 74226); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAL TIMES LAL", 74227); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAM", 74228); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAM TIMES KUR", 74229); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAM TIMES KUR PLUS RU", 74230); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LI", 74231); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LIL", 74232); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LIMMU2", 74233); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LISH", 74234); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU", 74235); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU TIMES BAD", 74236); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2", 74237); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES AL", 74238); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES BAD", 74239); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES ESH2", 74240); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES ESH2 TENU", 74241); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES GAN2 TENU", 74242); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES HI TIMES BAD", 74243); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES IM", 74244); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES KAD2", 74245); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES KAD3", 74246); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH", 74247); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES KI", 74248); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES LA PLUS ASH", 74249); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES LAGAB", 74250); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES ME PLUS EN", 74251); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES NE", 74252); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES NU", 74253); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES SI PLUS ASH", 74254); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU", 74255); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES TUG2", 74256); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TENU", 74257); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 CROSSING LU2", 74258); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 OPPOSING LU2", 74259); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 SQUARED", 74260); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 SHESHIG", 74261); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU3", 74262); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUGAL", 74263); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUGAL OVER LUGAL", 74264); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUGAL OPPOSING LUGAL", 74265); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUGAL SHESHIG", 74266); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUH", 74267); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUL", 74268); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUM", 74269); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUM OVER LUM", 74270); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR", 74271); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MA", 74272); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MA TIMES TAK4", 74273); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MA GUNU", 74274); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MA2", 74275); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MAH", 74276); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MAR", 74277); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MASH", 74278); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MASH2", 74279); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ME", 74280); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MES", 74281); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MI", 74282); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MIN", 74283); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MU", 74284); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MU OVER MU", 74285); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUG", 74286); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUG GUNU", 74287); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUNSUB", 74288); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MURGU2", 74289); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH", 74290); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH TIMES A", 74291); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH TIMES KUR", 74292); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH TIMES ZA", 74293); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH OVER MUSH", 74294); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA", 74295); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH CROSSING MUSH", 74296); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH3", 74297); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH3 TIMES A", 74298); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH3 TIMES A PLUS DI", 74299); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH3 TIMES DI", 74300); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH3 GUNU", 74301); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NA", 74302); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NA2", 74303); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAGA", 74304); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAGA INVERTED", 74305); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAGA TIMES SHU TENU", 74306); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAGA OPPOSING NAGA", 74307); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAGAR", 74308); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAM NUTILLU", 74309); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAM", 74310); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NAM2", 74311); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NE", 74312); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NE TIMES A", 74313); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NE TIMES UD", 74314); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NE SHESHIG", 74315); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NI", 74316); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NI TIMES E", 74317); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NI2", 74318); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NIM", 74319); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NIM TIMES GAN2 TENU", 74320); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU", 74321); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2", 74322); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES AN", 74323); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES ASH", 74324); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH", 74325); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES GUD", 74326); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU", 74327); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES NE", 74328); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES NUN", 74329); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES SHE", 74330); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN", 74331); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH", 74332); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH", 74333); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH", 74334); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES USH", 74335); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NISAG", 74336); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NU", 74337); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NU11", 74338); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN", 74339); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN LAGAR TIMES GAR", 74340); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN LAGAR TIMES MASH", 74341); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN LAGAR TIMES SAL", 74342); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL", 74343); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN LAGAR TIMES USH", 74344); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN TENU", 74345); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN OVER NUN", 74346); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN CROSSING NUN", 74347); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR", 74348); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ", 74349); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB", 74350); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES BI", 74351); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES DUG", 74352); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES GUD", 74353); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU", 74354); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3", 74355); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES LA", 74356); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES NE", 74357); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3", 74358); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ AB2 TIMES U2", 74359); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI", 74360); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U", 74361); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PA", 74362); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PAD", 74363); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PAN", 74364); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PAP", 74365); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PESH2", 74366); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI", 74367); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES A", 74368); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES AB", 74369); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES BI", 74370); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES BU", 74371); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES E", 74372); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES I", 74373); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES IB", 74374); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES U", 74375); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI TIMES U2", 74376); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PI CROSSING PI", 74377); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PIRIG", 74378); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PIRIG TIMES KAL", 74379); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PIRIG TIMES UD", 74380); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PIRIG TIMES ZA", 74381); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PIRIG OPPOSING PIRIG", 74382); - _unicodeCharacterMap.Add("CUNEIFORM SIGN RA", 74383); - _unicodeCharacterMap.Add("CUNEIFORM SIGN RAB", 74384); - _unicodeCharacterMap.Add("CUNEIFORM SIGN RI", 74385); - _unicodeCharacterMap.Add("CUNEIFORM SIGN RU", 74386); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SA", 74387); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG NUTILLU", 74388); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG", 74389); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES A", 74390); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES DU", 74391); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES DUB", 74392); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES HA", 74393); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES KAK", 74394); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES KUR", 74395); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES LUM", 74396); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES MI", 74397); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES NUN", 74398); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES SAL", 74399); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES SHID", 74400); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES TAB", 74401); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES U2", 74402); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES UB", 74403); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES UM", 74404); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES UR", 74405); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES USH", 74406); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG OVER SAG", 74407); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG GUNU", 74408); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAL", 74409); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAL LAGAB TIMES ASH2", 74410); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SANGA2", 74411); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAR", 74412); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA", 74413); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3", 74414); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES A", 74415); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES BAD", 74416); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES GISH", 74417); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES NE", 74418); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES SHU2", 74419); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES TUR", 74420); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES U", 74421); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA3 TIMES U PLUS A", 74422); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA6", 74423); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHAB6", 74424); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHAR2", 74425); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE", 74426); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE HU", 74427); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR", 74428); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR", 74429); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHEG9", 74430); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHEN", 74431); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHESH", 74432); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHESH2", 74433); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHESHLAM", 74434); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHID", 74435); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHID TIMES A", 74436); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHID TIMES IM", 74437); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM", 74438); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES A", 74439); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES BAL", 74440); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES BULUG", 74441); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES DIN", 74442); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES GAR", 74443); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES IGI", 74444); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES IGI GUNU", 74445); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES KUSHU2", 74446); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES LUL", 74447); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES MUG", 74448); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIM TIMES SAL", 74449); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHINIG", 74450); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIR", 74451); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIR TENU", 74452); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR", 74453); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHITA", 74454); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHU", 74455); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHU OVER INVERTED SHU", 74456); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHU2", 74457); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHUBUR", 74458); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SI", 74459); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SI GUNU", 74460); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SIG", 74461); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SIG4", 74462); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SIG4 OVER SIG4 SHU2", 74463); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SIK2", 74464); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SILA3", 74465); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SU", 74466); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SU OVER SU", 74467); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SUD", 74468); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SUD2", 74469); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SUHUR", 74470); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SUM", 74471); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SUMASH", 74472); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SUR", 74473); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SUR9", 74474); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TA", 74475); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TA ASTERISK", 74476); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TA TIMES HI", 74477); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TA TIMES MI", 74478); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TA GUNU", 74479); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAB", 74480); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH", 74481); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAB SQUARED", 74482); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAG", 74483); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAG TIMES BI", 74484); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAG TIMES GUD", 74485); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAG TIMES SHE", 74486); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAG TIMES SHU", 74487); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAG TIMES TUG2", 74488); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAG TIMES UD", 74489); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAK4", 74490); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAR", 74491); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TE", 74492); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TE GUNU", 74493); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TI", 74494); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TI TENU", 74495); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TIL", 74496); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TIR", 74497); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TIR TIMES TAK4", 74498); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TIR OVER TIR", 74499); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR", 74500); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TU", 74501); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TUG2", 74502); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TUK", 74503); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TUM", 74504); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TUR", 74505); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA", 74506); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U", 74507); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U GUD", 74508); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U U U", 74509); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR", 74510); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U OVER U SUR OVER SUR", 74511); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED", 74512); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U2", 74513); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UB", 74514); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD", 74515); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD KUSHU2", 74516); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD TIMES BAD", 74517); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD TIMES MI", 74518); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD TIMES U PLUS U PLUS U", 74519); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU", 74520); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD GUNU", 74521); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD SHESHIG", 74522); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UD SHESHIG TIMES BAD", 74523); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UDUG", 74524); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UM", 74525); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UM TIMES LAGAB", 74526); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UM TIMES ME PLUS DA", 74527); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UM TIMES SHA3", 74528); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UM TIMES U", 74529); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UMBIN", 74530); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UMUM", 74531); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UMUM TIMES KASKAL", 74532); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UMUM TIMES PA", 74533); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UN", 74534); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UN GUNU", 74535); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR", 74536); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR CROSSING UR", 74537); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR SHESHIG", 74538); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2", 74539); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES A PLUS HA", 74540); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES A PLUS NA", 74541); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES AL", 74542); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES HA", 74543); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES NUN", 74544); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES U2", 74545); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH", 74546); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES U2 PLUS BI", 74547); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR4", 74548); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URI", 74549); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URI3", 74550); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU", 74551); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES A", 74552); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES ASHGAB", 74553); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES BAR", 74554); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES DUN", 74555); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES GA", 74556); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES GAL", 74557); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES GAN2 TENU", 74558); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES GAR", 74559); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES GU", 74560); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES HA", 74561); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES IGI", 74562); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES IM", 74563); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES ISH", 74564); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES KI", 74565); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES LUM", 74566); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES MIN", 74567); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES PA", 74568); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES SHE", 74569); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES SIG4", 74570); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES TU", 74571); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES U PLUS GUD", 74572); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES UD", 74573); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES URUDA", 74574); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URUDA", 74575); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URUDA TIMES U", 74576); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USH", 74577); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USH TIMES A", 74578); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USH TIMES KU", 74579); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USH TIMES KUR", 74580); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USH TIMES TAK4", 74581); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USHX", 74582); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USH2", 74583); - _unicodeCharacterMap.Add("CUNEIFORM SIGN USHUMX", 74584); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UTUKI", 74585); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UZ3", 74586); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UZ3 TIMES KASKAL", 74587); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UZU", 74588); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZA", 74589); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZA TENU", 74590); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZA SQUARED TIMES KUR", 74591); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZAG", 74592); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZAMX", 74593); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZE2", 74594); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZI", 74595); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZI OVER ZI", 74596); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZI3", 74597); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZIB", 74598); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZIB KABA TENU", 74599); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZIG", 74600); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZIZ2", 74601); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZU", 74602); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZU5", 74603); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZU5 TIMES A", 74604); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZUBUR", 74605); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZUM", 74606); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KAP ELAMITE", 74607); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES NUN", 74608); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB2 TIMES A", 74609); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AMAR TIMES KUG", 74610); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH", 74611); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG3", 74612); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DISH PLUS SHU", 74613); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUB TIMES SHE", 74614); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES GUD", 74615); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES SHE", 74616); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A", 74617); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES ASH2", 74618); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GE22", 74619); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GIG", 74620); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HUSH", 74621); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ANSHE", 74622); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES ASH3", 74623); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GISH", 74624); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES GUD", 74625); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES HI TIMES ASH2", 74626); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES LUM", 74627); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES PA", 74628); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES SHUL", 74629); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES TU", 74630); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES UR2", 74631); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES GI", 74632); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 SHESHIG TIMES BAD", 74633); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL", 74634); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES SHU", 74635); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MESH", 74636); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH3 TIMES ZA", 74637); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NA4", 74638); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NIN", 74639); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NIN9", 74640); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES BAL", 74641); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES GI", 74642); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES", 74643); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PESH2 ASTERISK", 74644); - _unicodeCharacterMap.Add("CUNEIFORM SIGN PIR2", 74645); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES IGI GUNU", 74646); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TI2", 74647); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UM TIMES ME", 74648); - _unicodeCharacterMap.Add("CUNEIFORM SIGN U U", 74649); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO ASH", 74752); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE ASH", 74753); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR ASH", 74754); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE ASH", 74755); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX ASH", 74756); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN ASH", 74757); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT ASH", 74758); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE ASH", 74759); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE DISH", 74760); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR DISH", 74761); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE DISH", 74762); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX DISH", 74763); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN DISH", 74764); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT DISH", 74765); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE DISH", 74766); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR U", 74767); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE U", 74768); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX U", 74769); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN U", 74770); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT U", 74771); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE U", 74772); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE GESH2", 74773); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO GESH2", 74774); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE GESH2", 74775); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR GESH2", 74776); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE GESH2", 74777); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX GESH2", 74778); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN GESH2", 74779); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT GESH2", 74780); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE GESH2", 74781); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE GESHU", 74782); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO GESHU", 74783); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE GESHU", 74784); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR GESHU", 74785); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE GESHU", 74786); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO SHAR2", 74787); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE SHAR2", 74788); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM", 74789); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR SHAR2", 74790); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE SHAR2", 74791); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX SHAR2", 74792); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN SHAR2", 74793); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT SHAR2", 74794); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE SHAR2", 74795); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE SHARU", 74796); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO SHARU", 74797); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE SHARU", 74798); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM", 74799); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR SHARU", 74800); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE SHARU", 74801); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH", 74802); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN", 74803); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE BURU", 74804); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO BURU", 74805); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE BURU", 74806); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM", 74807); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR BURU", 74808); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE BURU", 74809); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16", 74810); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21", 74811); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU", 74812); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4", 74813); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A", 74814); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B", 74815); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9", 74816); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3", 74817); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A", 74818); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B", 74819); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU", 74820); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3", 74821); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU", 74822); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3", 74823); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4", 74824); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A", 74825); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO ASH TENU", 74826); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE ASH TENU", 74827); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR ASH TENU", 74828); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE ASH TENU", 74829); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX ASH TENU", 74830); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE BAN2", 74831); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO BAN2", 74832); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN THREE BAN2", 74833); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR BAN2", 74834); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM", 74835); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE BAN2", 74836); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM", 74837); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NIGIDAMIN", 74838); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NIGIDAESH", 74839); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE ESHE3", 74840); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO ESHE3", 74841); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE THIRD DISH", 74842); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO THIRDS DISH", 74843); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH", 74844); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A", 74845); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A", 74846); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH", 74847); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE QUARTER ASH", 74848); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH", 74849); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER", 74850); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE QUARTER GUR", 74851); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ONE HALF GUR", 74852); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD", 74853); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS", 74854); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ELAMITE FORTY", 74855); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN ELAMITE FIFTY", 74856); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM", 74857); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM", 74858); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM", 74859); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM", 74860); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM", 74861); - _unicodeCharacterMap.Add("CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM", 74862); - _unicodeCharacterMap.Add("CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER", 74864); - _unicodeCharacterMap.Add("CUNEIFORM PUNCTUATION SIGN VERTICAL COLON", 74865); - _unicodeCharacterMap.Add("CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON", 74866); - _unicodeCharacterMap.Add("CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON", 74867); - _unicodeCharacterMap.Add("CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON", 74868); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES NUN TENU", 74880); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AB TIMES SHU2", 74881); - _unicodeCharacterMap.Add("CUNEIFORM SIGN AD TIMES ESH2", 74882); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAD TIMES DISH TENU", 74883); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAHAR2 TIMES AB2", 74884); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAHAR2 TIMES NI", 74885); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BAHAR2 TIMES ZA", 74886); - _unicodeCharacterMap.Add("CUNEIFORM SIGN BU OVER BU TIMES NA2", 74887); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DA TIMES TAK4", 74888); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DAG TIMES KUR", 74889); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIM TIMES IGI", 74890); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIM TIMES U U U", 74891); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DIM2 TIMES UD", 74892); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES ANSHE", 74893); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES ASH", 74894); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES ASH AT LEFT", 74895); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES DIN", 74896); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES DUN", 74897); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES ERIN2", 74898); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES GA", 74899); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES GI", 74900); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES GIR2 GUNU", 74901); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES GISH", 74902); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES HA", 74903); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES HI", 74904); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES IGI GUNU", 74905); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES KASKAL", 74906); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES KUR", 74907); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES KUSHU2", 74908); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL", 74909); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES LAK 020", 74910); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES LAM", 74911); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES LAM TIMES KUR", 74912); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES LUH PLUS GISH", 74913); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES MASH", 74914); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES MES", 74915); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES MI", 74916); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES NI", 74917); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES PI", 74918); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES SHE", 74919); - _unicodeCharacterMap.Add("CUNEIFORM SIGN DUG TIMES SI GUNU", 74920); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES KUR", 74921); - _unicodeCharacterMap.Add("CUNEIFORM SIGN E2 TIMES PAP", 74922); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ERIN2 X", 74923); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ESH2 CROSSING ESH2", 74924); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES ASH", 74925); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES HI", 74926); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU", 74927); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES LA", 74928); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES LAL", 74929); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES ME", 74930); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES MES", 74931); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN SHESHIG TIMES SU", 74932); - _unicodeCharacterMap.Add("CUNEIFORM SIGN EZEN TIMES SU", 74933); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES BAHAR2", 74934); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES DIM GUNU", 74935); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU", 74936); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL", 74937); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES EREN", 74938); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GA", 74939); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GAR PLUS DI", 74940); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES GAR PLUS NE", 74941); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES HA PLUS A", 74942); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL", 74943); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES LAM", 74944); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR", 74945); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES LUH", 74946); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES MUSH", 74947); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES NE", 74948); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES NE PLUS E2", 74949); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES NE PLUS GI", 74950); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES SHIM", 74951); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GA2 TIMES ZIZ2", 74952); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GABA ROTATED NINETY DEGREES", 74953); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GESHTIN TIMES U", 74954); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH", 74955); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GU2 TIMES IGI GUNU", 74956); - _unicodeCharacterMap.Add("CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4", 74957); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HA TENU GUNU", 74958); - _unicodeCharacterMap.Add("CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH", 74959); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES BU", 74960); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES KA", 74961); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES U U U", 74962); - _unicodeCharacterMap.Add("CUNEIFORM SIGN KA TIMES UR", 74963); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU", 74964); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 003", 74965); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 021", 74966); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 025", 74967); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 030", 74968); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 050", 74969); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 051", 74970); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 062", 74971); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 079 OVER LAK 079 GUNU", 74972); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 080", 74973); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 081 OVER LAK 081", 74974); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 092", 74975); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 130", 74976); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 142", 74977); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 210", 74978); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 219", 74979); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 220", 74980); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 225", 74981); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 228", 74982); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 238", 74983); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 265", 74984); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 266", 74985); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 343", 74986); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 347", 74987); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 348", 74988); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 383", 74989); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 384", 74990); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 390", 74991); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 441", 74992); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 449", 74993); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 449 TIMES GU", 74994); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 449 TIMES IGI", 74995); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 449 TIMES PAP PLUS LU3", 74996); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 449 TIMES PAP PLUS PAP PLUS LU3", 74997); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 449 TIMES U2 PLUS BA", 74998); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 450", 74999); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 457", 75000); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 470", 75001); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 483", 75002); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 490", 75003); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 492", 75004); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 493", 75005); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 495", 75006); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 550", 75007); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 608", 75008); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617", 75009); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES ASH", 75010); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES BAD", 75011); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES DUN3 GUNU GUNU", 75012); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES KU3", 75013); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES LA", 75014); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES TAR", 75015); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES TE", 75016); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES U2", 75017); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES UD", 75018); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 617 TIMES URUDA", 75019); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 636", 75020); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648", 75021); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES DUB", 75022); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES GA", 75023); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES IGI", 75024); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES IGI GUNU", 75025); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES NI", 75026); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES PAP PLUS PAP PLUS LU3", 75027); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES SHESH PLUS KI", 75028); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES UD", 75029); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 648 TIMES URUDA", 75030); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 724", 75031); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LAK 749", 75032); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 GUNU TIMES ASH", 75033); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES DISH", 75034); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES HAL", 75035); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES PAP", 75036); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3", 75037); - _unicodeCharacterMap.Add("CUNEIFORM SIGN LU2 TIMES TAK4", 75038); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MI PLUS ZA7", 75039); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH OVER MUSH TIMES GA", 75040); - _unicodeCharacterMap.Add("CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK", 75041); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES DIM GUNU", 75042); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES GISH", 75043); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES GUL", 75044); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES HI", 75045); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES KESH2", 75046); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES LAK 050", 75047); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES MASH", 75048); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP", 75049); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES U", 75050); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES U PLUS U", 75051); - _unicodeCharacterMap.Add("CUNEIFORM SIGN NINDA2 TIMES URUDA", 75052); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG GUNU TIMES HA", 75053); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES EN", 75054); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES SHE AT LEFT", 75055); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SAG TIMES TAK4", 75056); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHA6 TENU", 75057); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE OVER SHE", 75058); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE PLUS HUB2", 75059); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE PLUS NAM2", 75060); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHE PLUS SAR", 75061); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI", 75062); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN", 75063); - _unicodeCharacterMap.Add("CUNEIFORM SIGN SI TIMES TAK4", 75064); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TAK4 PLUS SAG", 75065); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TUM TIMES GAN2 TENU", 75066); - _unicodeCharacterMap.Add("CUNEIFORM SIGN TUM TIMES THREE DISH", 75067); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 INVERTED", 75068); - _unicodeCharacterMap.Add("CUNEIFORM SIGN UR2 TIMES UD", 75069); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES DARA3", 75070); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES LAK 668", 75071); - _unicodeCharacterMap.Add("CUNEIFORM SIGN URU TIMES LU3", 75072); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZA7", 75073); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZU OVER ZU PLUS SAR", 75074); - _unicodeCharacterMap.Add("CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU", 75075); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A001", 77824); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A002", 77825); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A003", 77826); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A004", 77827); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A005", 77828); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A005A", 77829); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A006", 77830); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A006A", 77831); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A006B", 77832); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A007", 77833); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A008", 77834); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A009", 77835); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A010", 77836); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A011", 77837); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A012", 77838); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A013", 77839); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A014", 77840); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A014A", 77841); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A015", 77842); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A016", 77843); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A017", 77844); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A017A", 77845); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A018", 77846); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A019", 77847); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A020", 77848); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A021", 77849); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A022", 77850); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A023", 77851); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A024", 77852); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A025", 77853); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A026", 77854); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A027", 77855); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A028", 77856); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A029", 77857); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A030", 77858); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A031", 77859); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A032", 77860); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A032A", 77861); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A033", 77862); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A034", 77863); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A035", 77864); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A036", 77865); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A037", 77866); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A038", 77867); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A039", 77868); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A040", 77869); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A040A", 77870); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A041", 77871); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A042", 77872); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A042A", 77873); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A043", 77874); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A043A", 77875); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A044", 77876); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A045", 77877); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A045A", 77878); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A046", 77879); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A047", 77880); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A048", 77881); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A049", 77882); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A050", 77883); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A051", 77884); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A052", 77885); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A053", 77886); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A054", 77887); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A055", 77888); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A056", 77889); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A057", 77890); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A058", 77891); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A059", 77892); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A060", 77893); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A061", 77894); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A062", 77895); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A063", 77896); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A064", 77897); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A065", 77898); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A066", 77899); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A067", 77900); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A068", 77901); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A069", 77902); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH A070", 77903); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B001", 77904); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B002", 77905); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B003", 77906); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B004", 77907); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B005", 77908); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B005A", 77909); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B006", 77910); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B007", 77911); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B008", 77912); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH B009", 77913); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C001", 77914); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C002", 77915); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C002A", 77916); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C002B", 77917); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C002C", 77918); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C003", 77919); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C004", 77920); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C005", 77921); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C006", 77922); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C007", 77923); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C008", 77924); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C009", 77925); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C010", 77926); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C010A", 77927); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C011", 77928); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C012", 77929); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C013", 77930); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C014", 77931); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C015", 77932); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C016", 77933); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C017", 77934); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C018", 77935); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C019", 77936); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C020", 77937); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C021", 77938); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C022", 77939); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C023", 77940); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH C024", 77941); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D001", 77942); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D002", 77943); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D003", 77944); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D004", 77945); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D005", 77946); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D006", 77947); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D007", 77948); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D008", 77949); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D008A", 77950); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D009", 77951); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D010", 77952); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D011", 77953); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D012", 77954); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D013", 77955); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D014", 77956); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D015", 77957); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D016", 77958); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D017", 77959); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D018", 77960); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D019", 77961); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D020", 77962); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D021", 77963); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D022", 77964); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D023", 77965); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D024", 77966); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D025", 77967); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D026", 77968); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D027", 77969); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D027A", 77970); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D028", 77971); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D029", 77972); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D030", 77973); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D031", 77974); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D031A", 77975); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D032", 77976); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D033", 77977); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D034", 77978); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D034A", 77979); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D035", 77980); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D036", 77981); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D037", 77982); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D038", 77983); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D039", 77984); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D040", 77985); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D041", 77986); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D042", 77987); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D043", 77988); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D044", 77989); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D045", 77990); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D046", 77991); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D046A", 77992); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D047", 77993); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D048", 77994); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D048A", 77995); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D049", 77996); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050", 77997); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050A", 77998); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050B", 77999); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050C", 78000); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050D", 78001); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050E", 78002); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050F", 78003); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050G", 78004); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050H", 78005); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D050I", 78006); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D051", 78007); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D052", 78008); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D052A", 78009); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D053", 78010); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D054", 78011); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D054A", 78012); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D055", 78013); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D056", 78014); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D057", 78015); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D058", 78016); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D059", 78017); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D060", 78018); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D061", 78019); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D062", 78020); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D063", 78021); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D064", 78022); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D065", 78023); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D066", 78024); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067", 78025); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067A", 78026); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067B", 78027); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067C", 78028); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067D", 78029); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067E", 78030); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067F", 78031); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067G", 78032); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH D067H", 78033); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E001", 78034); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E002", 78035); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E003", 78036); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E004", 78037); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E005", 78038); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E006", 78039); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E007", 78040); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E008", 78041); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E008A", 78042); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E009", 78043); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E009A", 78044); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E010", 78045); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E011", 78046); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E012", 78047); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E013", 78048); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E014", 78049); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E015", 78050); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E016", 78051); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E016A", 78052); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E017", 78053); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E017A", 78054); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E018", 78055); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E019", 78056); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E020", 78057); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E020A", 78058); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E021", 78059); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E022", 78060); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E023", 78061); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E024", 78062); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E025", 78063); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E026", 78064); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E027", 78065); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E028", 78066); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E028A", 78067); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E029", 78068); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E030", 78069); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E031", 78070); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E032", 78071); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E033", 78072); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E034", 78073); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E034A", 78074); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E036", 78075); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E037", 78076); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH E038", 78077); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F001", 78078); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F001A", 78079); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F002", 78080); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F003", 78081); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F004", 78082); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F005", 78083); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F006", 78084); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F007", 78085); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F008", 78086); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F009", 78087); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F010", 78088); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F011", 78089); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F012", 78090); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F013", 78091); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F013A", 78092); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F014", 78093); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F015", 78094); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F016", 78095); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F017", 78096); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F018", 78097); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F019", 78098); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F020", 78099); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F021", 78100); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F021A", 78101); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F022", 78102); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F023", 78103); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F024", 78104); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F025", 78105); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F026", 78106); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F027", 78107); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F028", 78108); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F029", 78109); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F030", 78110); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F031", 78111); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F031A", 78112); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F032", 78113); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F033", 78114); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F034", 78115); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F035", 78116); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F036", 78117); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F037", 78118); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F037A", 78119); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F038", 78120); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F038A", 78121); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F039", 78122); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F040", 78123); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F041", 78124); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F042", 78125); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F043", 78126); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F044", 78127); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F045", 78128); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F045A", 78129); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F046", 78130); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F046A", 78131); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F047", 78132); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F047A", 78133); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F048", 78134); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F049", 78135); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F050", 78136); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F051", 78137); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F051A", 78138); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F051B", 78139); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F051C", 78140); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F052", 78141); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH F053", 78142); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G001", 78143); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G002", 78144); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G003", 78145); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G004", 78146); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G005", 78147); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G006", 78148); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G006A", 78149); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G007", 78150); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G007A", 78151); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G007B", 78152); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G008", 78153); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G009", 78154); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G010", 78155); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G011", 78156); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G011A", 78157); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G012", 78158); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G013", 78159); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G014", 78160); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G015", 78161); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G016", 78162); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G017", 78163); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G018", 78164); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G019", 78165); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G020", 78166); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G020A", 78167); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G021", 78168); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G022", 78169); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G023", 78170); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G024", 78171); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G025", 78172); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G026", 78173); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G026A", 78174); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G027", 78175); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G028", 78176); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G029", 78177); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G030", 78178); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G031", 78179); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G032", 78180); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G033", 78181); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G034", 78182); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G035", 78183); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G036", 78184); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G036A", 78185); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G037", 78186); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G037A", 78187); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G038", 78188); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G039", 78189); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G040", 78190); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G041", 78191); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G042", 78192); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G043", 78193); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G043A", 78194); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G044", 78195); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G045", 78196); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G045A", 78197); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G046", 78198); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G047", 78199); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G048", 78200); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G049", 78201); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G050", 78202); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G051", 78203); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G052", 78204); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G053", 78205); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH G054", 78206); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H001", 78207); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H002", 78208); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H003", 78209); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H004", 78210); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H005", 78211); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H006", 78212); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H006A", 78213); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H007", 78214); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH H008", 78215); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I001", 78216); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I002", 78217); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I003", 78218); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I004", 78219); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I005", 78220); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I005A", 78221); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I006", 78222); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I007", 78223); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I008", 78224); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I009", 78225); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I009A", 78226); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I010", 78227); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I010A", 78228); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I011", 78229); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I011A", 78230); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I012", 78231); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I013", 78232); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I014", 78233); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH I015", 78234); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K001", 78235); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K002", 78236); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K003", 78237); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K004", 78238); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K005", 78239); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K006", 78240); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K007", 78241); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH K008", 78242); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L001", 78243); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L002", 78244); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L002A", 78245); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L003", 78246); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L004", 78247); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L005", 78248); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L006", 78249); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L006A", 78250); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L007", 78251); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH L008", 78252); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M001", 78253); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M001A", 78254); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M001B", 78255); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M002", 78256); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M003", 78257); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M003A", 78258); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M004", 78259); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M005", 78260); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M006", 78261); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M007", 78262); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M008", 78263); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M009", 78264); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M010", 78265); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M010A", 78266); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M011", 78267); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012", 78268); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012A", 78269); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012B", 78270); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012C", 78271); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012D", 78272); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012E", 78273); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012F", 78274); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012G", 78275); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M012H", 78276); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M013", 78277); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M014", 78278); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M015", 78279); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M015A", 78280); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M016", 78281); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M016A", 78282); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M017", 78283); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M017A", 78284); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M018", 78285); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M019", 78286); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M020", 78287); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M021", 78288); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M022", 78289); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M022A", 78290); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M023", 78291); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M024", 78292); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M024A", 78293); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M025", 78294); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M026", 78295); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M027", 78296); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M028", 78297); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M028A", 78298); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M029", 78299); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M030", 78300); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M031", 78301); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M031A", 78302); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M032", 78303); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M033", 78304); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M033A", 78305); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M033B", 78306); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M034", 78307); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M035", 78308); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M036", 78309); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M037", 78310); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M038", 78311); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M039", 78312); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M040", 78313); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M040A", 78314); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M041", 78315); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M042", 78316); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M043", 78317); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH M044", 78318); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N001", 78319); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N002", 78320); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N003", 78321); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N004", 78322); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N005", 78323); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N006", 78324); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N007", 78325); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N008", 78326); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N009", 78327); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N010", 78328); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N011", 78329); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N012", 78330); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N013", 78331); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N014", 78332); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N015", 78333); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N016", 78334); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N017", 78335); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N018", 78336); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N018A", 78337); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N018B", 78338); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N019", 78339); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N020", 78340); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N021", 78341); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N022", 78342); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N023", 78343); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N024", 78344); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N025", 78345); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N025A", 78346); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N026", 78347); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N027", 78348); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N028", 78349); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N029", 78350); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N030", 78351); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N031", 78352); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N032", 78353); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N033", 78354); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N033A", 78355); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N034", 78356); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N034A", 78357); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N035", 78358); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N035A", 78359); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N036", 78360); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N037", 78361); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N037A", 78362); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N038", 78363); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N039", 78364); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N040", 78365); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N041", 78366); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH N042", 78367); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL001", 78368); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL002", 78369); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL003", 78370); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL004", 78371); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL005", 78372); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL005A", 78373); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL006", 78374); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL007", 78375); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL008", 78376); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL009", 78377); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL010", 78378); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL011", 78379); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL012", 78380); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL013", 78381); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL014", 78382); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL015", 78383); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL016", 78384); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL017", 78385); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL017A", 78386); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL018", 78387); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL019", 78388); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NL020", 78389); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU001", 78390); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU002", 78391); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU003", 78392); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU004", 78393); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU005", 78394); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU006", 78395); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU007", 78396); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU008", 78397); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU009", 78398); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU010", 78399); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU010A", 78400); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU011", 78401); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU011A", 78402); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU012", 78403); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU013", 78404); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU014", 78405); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU015", 78406); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU016", 78407); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU017", 78408); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU018", 78409); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU018A", 78410); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU019", 78411); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU020", 78412); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU021", 78413); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU022", 78414); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH NU022A", 78415); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O001", 78416); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O001A", 78417); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O002", 78418); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O003", 78419); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O004", 78420); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O005", 78421); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O005A", 78422); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O006", 78423); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O006A", 78424); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O006B", 78425); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O006C", 78426); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O006D", 78427); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O006E", 78428); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O006F", 78429); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O007", 78430); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O008", 78431); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O009", 78432); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O010", 78433); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O010A", 78434); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O010B", 78435); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O010C", 78436); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O011", 78437); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O012", 78438); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O013", 78439); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O014", 78440); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O015", 78441); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O016", 78442); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O017", 78443); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O018", 78444); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O019", 78445); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O019A", 78446); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O020", 78447); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O020A", 78448); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O021", 78449); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O022", 78450); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O023", 78451); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O024", 78452); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O024A", 78453); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O025", 78454); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O025A", 78455); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O026", 78456); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O027", 78457); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O028", 78458); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O029", 78459); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O029A", 78460); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O030", 78461); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O030A", 78462); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O031", 78463); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O032", 78464); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O033", 78465); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O033A", 78466); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O034", 78467); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O035", 78468); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O036", 78469); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O036A", 78470); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O036B", 78471); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O036C", 78472); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O036D", 78473); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O037", 78474); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O038", 78475); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O039", 78476); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O040", 78477); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O041", 78478); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O042", 78479); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O043", 78480); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O044", 78481); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O045", 78482); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O046", 78483); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O047", 78484); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O048", 78485); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O049", 78486); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O050", 78487); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O050A", 78488); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O050B", 78489); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH O051", 78490); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P001", 78491); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P001A", 78492); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P002", 78493); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P003", 78494); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P003A", 78495); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P004", 78496); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P005", 78497); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P006", 78498); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P007", 78499); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P008", 78500); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P009", 78501); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P010", 78502); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH P011", 78503); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Q001", 78504); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Q002", 78505); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Q003", 78506); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Q004", 78507); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Q005", 78508); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Q006", 78509); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Q007", 78510); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R001", 78511); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R002", 78512); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R002A", 78513); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R003", 78514); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R003A", 78515); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R003B", 78516); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R004", 78517); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R005", 78518); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R006", 78519); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R007", 78520); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R008", 78521); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R009", 78522); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R010", 78523); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R010A", 78524); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R011", 78525); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R012", 78526); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R013", 78527); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R014", 78528); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R015", 78529); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R016", 78530); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R016A", 78531); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R017", 78532); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R018", 78533); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R019", 78534); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R020", 78535); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R021", 78536); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R022", 78537); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R023", 78538); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R024", 78539); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R025", 78540); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R026", 78541); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R027", 78542); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R028", 78543); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH R029", 78544); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S001", 78545); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S002", 78546); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S002A", 78547); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S003", 78548); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S004", 78549); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S005", 78550); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S006", 78551); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S006A", 78552); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S007", 78553); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S008", 78554); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S009", 78555); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S010", 78556); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S011", 78557); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S012", 78558); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S013", 78559); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S014", 78560); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S014A", 78561); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S014B", 78562); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S015", 78563); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S016", 78564); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S017", 78565); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S017A", 78566); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S018", 78567); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S019", 78568); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S020", 78569); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S021", 78570); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S022", 78571); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S023", 78572); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S024", 78573); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S025", 78574); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S026", 78575); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S026A", 78576); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S026B", 78577); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S027", 78578); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S028", 78579); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S029", 78580); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S030", 78581); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S031", 78582); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S032", 78583); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S033", 78584); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S034", 78585); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S035", 78586); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S035A", 78587); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S036", 78588); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S037", 78589); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S038", 78590); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S039", 78591); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S040", 78592); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S041", 78593); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S042", 78594); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S043", 78595); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S044", 78596); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S045", 78597); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH S046", 78598); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T001", 78599); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T002", 78600); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T003", 78601); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T003A", 78602); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T004", 78603); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T005", 78604); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T006", 78605); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T007", 78606); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T007A", 78607); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T008", 78608); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T008A", 78609); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T009", 78610); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T009A", 78611); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T010", 78612); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T011", 78613); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T011A", 78614); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T012", 78615); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T013", 78616); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T014", 78617); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T015", 78618); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T016", 78619); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T016A", 78620); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T017", 78621); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T018", 78622); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T019", 78623); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T020", 78624); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T021", 78625); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T022", 78626); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T023", 78627); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T024", 78628); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T025", 78629); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T026", 78630); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T027", 78631); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T028", 78632); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T029", 78633); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T030", 78634); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T031", 78635); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T032", 78636); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T032A", 78637); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T033", 78638); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T033A", 78639); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T034", 78640); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T035", 78641); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH T036", 78642); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U001", 78643); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U002", 78644); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U003", 78645); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U004", 78646); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U005", 78647); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U006", 78648); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U006A", 78649); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U006B", 78650); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U007", 78651); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U008", 78652); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U009", 78653); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U010", 78654); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U011", 78655); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U012", 78656); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U013", 78657); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U014", 78658); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U015", 78659); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U016", 78660); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U017", 78661); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U018", 78662); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U019", 78663); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U020", 78664); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U021", 78665); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U022", 78666); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U023", 78667); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U023A", 78668); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U024", 78669); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U025", 78670); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U026", 78671); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U027", 78672); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U028", 78673); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U029", 78674); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U029A", 78675); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U030", 78676); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U031", 78677); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U032", 78678); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U032A", 78679); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U033", 78680); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U034", 78681); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U035", 78682); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U036", 78683); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U037", 78684); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U038", 78685); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U039", 78686); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U040", 78687); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U041", 78688); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH U042", 78689); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001", 78690); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001A", 78691); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001B", 78692); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001C", 78693); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001D", 78694); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001E", 78695); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001F", 78696); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001G", 78697); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001H", 78698); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V001I", 78699); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V002", 78700); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V002A", 78701); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V003", 78702); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V004", 78703); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V005", 78704); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V006", 78705); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V007", 78706); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V007A", 78707); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V007B", 78708); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V008", 78709); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V009", 78710); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V010", 78711); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V011", 78712); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V011A", 78713); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V011B", 78714); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V011C", 78715); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V012", 78716); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V012A", 78717); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V012B", 78718); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V013", 78719); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V014", 78720); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V015", 78721); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V016", 78722); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V017", 78723); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V018", 78724); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V019", 78725); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020", 78726); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020A", 78727); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020B", 78728); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020C", 78729); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020D", 78730); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020E", 78731); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020F", 78732); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020G", 78733); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020H", 78734); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020I", 78735); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020J", 78736); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020K", 78737); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V020L", 78738); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V021", 78739); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V022", 78740); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V023", 78741); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V023A", 78742); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V024", 78743); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V025", 78744); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V026", 78745); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V027", 78746); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V028", 78747); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V028A", 78748); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V029", 78749); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V029A", 78750); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V030", 78751); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V030A", 78752); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V031", 78753); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V031A", 78754); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V032", 78755); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V033", 78756); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V033A", 78757); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V034", 78758); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V035", 78759); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V036", 78760); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V037", 78761); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V037A", 78762); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V038", 78763); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V039", 78764); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V040", 78765); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH V040A", 78766); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W001", 78767); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W002", 78768); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W003", 78769); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W003A", 78770); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W004", 78771); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W005", 78772); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W006", 78773); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W007", 78774); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W008", 78775); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W009", 78776); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W009A", 78777); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W010", 78778); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W010A", 78779); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W011", 78780); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W012", 78781); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W013", 78782); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W014", 78783); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W014A", 78784); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W015", 78785); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W016", 78786); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W017", 78787); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W017A", 78788); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W018", 78789); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W018A", 78790); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W019", 78791); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W020", 78792); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W021", 78793); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W022", 78794); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W023", 78795); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W024", 78796); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W024A", 78797); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH W025", 78798); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X001", 78799); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X002", 78800); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X003", 78801); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X004", 78802); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X004A", 78803); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X004B", 78804); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X005", 78805); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X006", 78806); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X006A", 78807); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X007", 78808); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X008", 78809); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH X008A", 78810); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y001", 78811); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y001A", 78812); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y002", 78813); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y003", 78814); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y004", 78815); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y005", 78816); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y006", 78817); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y007", 78818); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Y008", 78819); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z001", 78820); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z002", 78821); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z002A", 78822); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z002B", 78823); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z002C", 78824); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z002D", 78825); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z003", 78826); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z003A", 78827); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z003B", 78828); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z004", 78829); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z004A", 78830); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z005", 78831); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z005A", 78832); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z006", 78833); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z007", 78834); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z008", 78835); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z009", 78836); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z010", 78837); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z011", 78838); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z012", 78839); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z013", 78840); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z014", 78841); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015", 78842); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015A", 78843); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015B", 78844); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015C", 78845); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015D", 78846); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015E", 78847); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015F", 78848); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015G", 78849); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015H", 78850); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z015I", 78851); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016", 78852); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016A", 78853); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016B", 78854); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016C", 78855); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016D", 78856); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016E", 78857); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016F", 78858); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016G", 78859); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH Z016H", 78860); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA001", 78861); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA002", 78862); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA003", 78863); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA004", 78864); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA005", 78865); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA006", 78866); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA007", 78867); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA007A", 78868); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA007B", 78869); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA008", 78870); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA009", 78871); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA010", 78872); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA011", 78873); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA012", 78874); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA013", 78875); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA014", 78876); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA015", 78877); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA016", 78878); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA017", 78879); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA018", 78880); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA019", 78881); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA020", 78882); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA021", 78883); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA022", 78884); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA023", 78885); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA024", 78886); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA025", 78887); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA026", 78888); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA027", 78889); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA028", 78890); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA029", 78891); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA030", 78892); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA031", 78893); - _unicodeCharacterMap.Add("EGYPTIAN HIEROGLYPH AA032", 78894); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A001", 82944); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A002", 82945); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A003", 82946); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A004", 82947); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A005", 82948); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A006", 82949); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A007", 82950); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A008", 82951); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A009", 82952); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A010", 82953); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A010A", 82954); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A011", 82955); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A012", 82956); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A013", 82957); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A014", 82958); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A015", 82959); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A016", 82960); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A017", 82961); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A018", 82962); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A019", 82963); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A020", 82964); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A021", 82965); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A022", 82966); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A023", 82967); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A024", 82968); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A025", 82969); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A026", 82970); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A026A", 82971); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A027", 82972); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A028", 82973); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A029", 82974); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A030", 82975); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A031", 82976); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A032", 82977); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A033", 82978); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A034", 82979); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A035", 82980); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A036", 82981); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A037", 82982); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A038", 82983); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A039", 82984); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A039A", 82985); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A040", 82986); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A041", 82987); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A041A", 82988); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A042", 82989); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A043", 82990); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A044", 82991); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A045", 82992); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A045A", 82993); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A046", 82994); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A046A", 82995); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A046B", 82996); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A047", 82997); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A048", 82998); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A049", 82999); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A050", 83000); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A051", 83001); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A052", 83002); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A053", 83003); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A054", 83004); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A055", 83005); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A056", 83006); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A057", 83007); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A058", 83008); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A059", 83009); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A060", 83010); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A061", 83011); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A062", 83012); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A063", 83013); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A064", 83014); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A065", 83015); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A066", 83016); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A066A", 83017); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A066B", 83018); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A066C", 83019); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A067", 83020); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A068", 83021); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A069", 83022); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A070", 83023); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A071", 83024); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A072", 83025); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A073", 83026); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A074", 83027); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A075", 83028); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A076", 83029); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A077", 83030); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A078", 83031); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A079", 83032); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A080", 83033); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A081", 83034); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A082", 83035); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A083", 83036); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A084", 83037); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A085", 83038); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A086", 83039); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A087", 83040); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A088", 83041); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A089", 83042); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A090", 83043); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A091", 83044); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A092", 83045); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A093", 83046); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A094", 83047); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A095", 83048); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A096", 83049); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A097", 83050); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A097A", 83051); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A098", 83052); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A098A", 83053); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A099", 83054); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A100", 83055); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A100A", 83056); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A101", 83057); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A101A", 83058); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A102", 83059); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A102A", 83060); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A103", 83061); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A104", 83062); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A104A", 83063); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A104B", 83064); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A104C", 83065); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A105", 83066); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A105A", 83067); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A105B", 83068); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A106", 83069); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A107", 83070); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A107A", 83071); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A107B", 83072); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A107C", 83073); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A108", 83074); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A109", 83075); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A110", 83076); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A110A", 83077); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A110B", 83078); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A111", 83079); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A112", 83080); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A113", 83081); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A114", 83082); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A115", 83083); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A115A", 83084); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A116", 83085); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A117", 83086); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A118", 83087); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A119", 83088); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A120", 83089); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A121", 83090); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A122", 83091); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A123", 83092); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A124", 83093); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A125", 83094); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A125A", 83095); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A126", 83096); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A127", 83097); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A128", 83098); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A129", 83099); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A130", 83100); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A131", 83101); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A132", 83102); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A133", 83103); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A134", 83104); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A135", 83105); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A135A", 83106); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A136", 83107); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A137", 83108); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A138", 83109); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A139", 83110); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A140", 83111); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A141", 83112); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A142", 83113); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A143", 83114); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A144", 83115); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A145", 83116); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A146", 83117); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A147", 83118); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A148", 83119); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A149", 83120); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A150", 83121); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A151", 83122); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A152", 83123); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A153", 83124); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A154", 83125); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A155", 83126); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A156", 83127); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A157", 83128); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A158", 83129); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A159", 83130); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A160", 83131); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A161", 83132); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A162", 83133); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A163", 83134); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A164", 83135); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A165", 83136); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A166", 83137); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A167", 83138); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A168", 83139); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A169", 83140); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A170", 83141); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A171", 83142); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A172", 83143); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A173", 83144); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A174", 83145); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A175", 83146); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A176", 83147); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A177", 83148); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A178", 83149); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A179", 83150); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A180", 83151); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A181", 83152); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A182", 83153); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A183", 83154); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A184", 83155); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A185", 83156); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A186", 83157); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A187", 83158); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A188", 83159); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A189", 83160); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A190", 83161); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A191", 83162); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A192", 83163); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A193", 83164); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A194", 83165); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A195", 83166); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A196", 83167); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A197", 83168); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A198", 83169); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A199", 83170); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A200", 83171); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A201", 83172); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A202", 83173); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A202A", 83174); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A202B", 83175); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A203", 83176); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A204", 83177); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A205", 83178); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A206", 83179); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A207", 83180); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A207A", 83181); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A208", 83182); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A209", 83183); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A209A", 83184); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A210", 83185); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A211", 83186); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A212", 83187); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A213", 83188); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A214", 83189); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A215", 83190); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A215A", 83191); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A216", 83192); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A216A", 83193); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A217", 83194); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A218", 83195); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A219", 83196); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A220", 83197); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A221", 83198); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A222", 83199); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A223", 83200); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A224", 83201); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A225", 83202); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A226", 83203); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A227", 83204); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A227A", 83205); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A228", 83206); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A229", 83207); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A230", 83208); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A231", 83209); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A232", 83210); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A233", 83211); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A234", 83212); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A235", 83213); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A236", 83214); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A237", 83215); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A238", 83216); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A239", 83217); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A240", 83218); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A241", 83219); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A242", 83220); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A243", 83221); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A244", 83222); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A245", 83223); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A246", 83224); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A247", 83225); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A248", 83226); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A249", 83227); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A250", 83228); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A251", 83229); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A252", 83230); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A253", 83231); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A254", 83232); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A255", 83233); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A256", 83234); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A257", 83235); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A258", 83236); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A259", 83237); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A260", 83238); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A261", 83239); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A262", 83240); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A263", 83241); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A264", 83242); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A265", 83243); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A266", 83244); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A267", 83245); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A267A", 83246); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A268", 83247); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A269", 83248); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A270", 83249); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A271", 83250); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A272", 83251); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A273", 83252); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A274", 83253); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A275", 83254); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A276", 83255); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A277", 83256); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A278", 83257); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A279", 83258); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A280", 83259); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A281", 83260); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A282", 83261); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A283", 83262); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A284", 83263); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A285", 83264); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A286", 83265); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A287", 83266); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A288", 83267); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A289", 83268); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A289A", 83269); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A290", 83270); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A291", 83271); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A292", 83272); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A293", 83273); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A294", 83274); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A294A", 83275); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A295", 83276); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A296", 83277); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A297", 83278); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A298", 83279); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A299", 83280); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A299A", 83281); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A300", 83282); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A301", 83283); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A302", 83284); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A303", 83285); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A304", 83286); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A305", 83287); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A306", 83288); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A307", 83289); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A308", 83290); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A309", 83291); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A309A", 83292); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A310", 83293); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A311", 83294); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A312", 83295); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A313", 83296); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A314", 83297); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A315", 83298); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A316", 83299); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A317", 83300); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A318", 83301); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A319", 83302); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A320", 83303); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A321", 83304); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A322", 83305); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A323", 83306); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A324", 83307); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A325", 83308); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A326", 83309); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A327", 83310); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A328", 83311); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A329", 83312); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A329A", 83313); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A330", 83314); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A331", 83315); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A332A", 83316); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A332B", 83317); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A332C", 83318); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A333", 83319); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A334", 83320); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A335", 83321); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A336", 83322); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A336A", 83323); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A336B", 83324); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A336C", 83325); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A337", 83326); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A338", 83327); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A339", 83328); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A340", 83329); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A341", 83330); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A342", 83331); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A343", 83332); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A344", 83333); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A345", 83334); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A346", 83335); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A347", 83336); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A348", 83337); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A349", 83338); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A350", 83339); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A351", 83340); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A352", 83341); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A353", 83342); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A354", 83343); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A355", 83344); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A356", 83345); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A357", 83346); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A358", 83347); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A359", 83348); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A359A", 83349); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A360", 83350); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A361", 83351); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A362", 83352); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A363", 83353); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A364", 83354); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A364A", 83355); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A365", 83356); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A366", 83357); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A367", 83358); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A368", 83359); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A368A", 83360); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A369", 83361); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A370", 83362); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A371", 83363); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A371A", 83364); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A372", 83365); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A373", 83366); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A374", 83367); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A375", 83368); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A376", 83369); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A377", 83370); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A378", 83371); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A379", 83372); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A380", 83373); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A381", 83374); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A381A", 83375); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A382", 83376); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A383 RA OR RI", 83377); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A383A", 83378); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A384", 83379); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A385", 83380); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A386", 83381); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A386A", 83382); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A387", 83383); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A388", 83384); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A389", 83385); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A390", 83386); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A391", 83387); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A392", 83388); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A393 EIGHT", 83389); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A394", 83390); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A395", 83391); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A396", 83392); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A397", 83393); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A398", 83394); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A399", 83395); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A400", 83396); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A401", 83397); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A402", 83398); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A403", 83399); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A404", 83400); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A405", 83401); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A406", 83402); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A407", 83403); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A408", 83404); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A409", 83405); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK", 83406); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK", 83407); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A411", 83408); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A412", 83409); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A413", 83410); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A414", 83411); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A415", 83412); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A416", 83413); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A417", 83414); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A418", 83415); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A419", 83416); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A420", 83417); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A421", 83418); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A422", 83419); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A423", 83420); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A424", 83421); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A425", 83422); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A426", 83423); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A427", 83424); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A428", 83425); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A429", 83426); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A430", 83427); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A431", 83428); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A432", 83429); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A433", 83430); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A434", 83431); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A435", 83432); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A436", 83433); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A437", 83434); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A438", 83435); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A439", 83436); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A440", 83437); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A441", 83438); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A442", 83439); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A443", 83440); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A444", 83441); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A445", 83442); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A446", 83443); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A447", 83444); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A448", 83445); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A449", 83446); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A450", 83447); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A450A", 83448); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A451", 83449); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A452", 83450); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A453", 83451); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A454", 83452); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A455", 83453); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A456", 83454); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A457", 83455); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A457A", 83456); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A458", 83457); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A459", 83458); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A460", 83459); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A461", 83460); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A462", 83461); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A463", 83462); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A464", 83463); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A465", 83464); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A466", 83465); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A467", 83466); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A468", 83467); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A469", 83468); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A470", 83469); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A471", 83470); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A472", 83471); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A473", 83472); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A474", 83473); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A475", 83474); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A476", 83475); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A477", 83476); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A478", 83477); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A479", 83478); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A480", 83479); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A481", 83480); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A482", 83481); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A483", 83482); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A484", 83483); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A485", 83484); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A486", 83485); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A487", 83486); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A488", 83487); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A489", 83488); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A490", 83489); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A491", 83490); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A492", 83491); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A493", 83492); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A494", 83493); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A495", 83494); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A496", 83495); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A497", 83496); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A501", 83497); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A502", 83498); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A503", 83499); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A504", 83500); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A505", 83501); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A506", 83502); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A507", 83503); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A508", 83504); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A509", 83505); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A510", 83506); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A511", 83507); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A512", 83508); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A513", 83509); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A514", 83510); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A515", 83511); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A516", 83512); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A517", 83513); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A518", 83514); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A519", 83515); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A520", 83516); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A521", 83517); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A522", 83518); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A523", 83519); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A524", 83520); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A525", 83521); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A526", 83522); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A527", 83523); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A528", 83524); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A529", 83525); - _unicodeCharacterMap.Add("ANATOLIAN HIEROGLYPH A530", 83526); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NGKUE MFON", 92160); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A GBIEE FON", 92161); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PON MFON PIPAEMGBIEE", 92162); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PON MFON PIPAEMBA", 92163); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NAA MFON", 92164); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SHUENSHUET", 92165); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A TITA MFON", 92166); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NZA MFON", 92167); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SHINDA PA NJI", 92168); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PON PA NJI PIPAEMGBIEE", 92169); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PON PA NJI PIPAEMBA", 92170); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAEMBGBIEE", 92171); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A TU MAEMBA", 92172); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NGANGU", 92173); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAEMVEUX", 92174); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MANSUAE", 92175); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MVEUAENGAM", 92176); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SEUNYAM", 92177); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NTOQPEN", 92178); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A KEUKEUTNDA", 92179); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NKINDI", 92180); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SUU", 92181); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NGKUENZEUM", 92182); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A LAPAQ", 92183); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A LET KUT", 92184); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NTAP MFAA", 92185); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAEKEUP", 92186); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PASHAE", 92187); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A GHEUAERAE", 92188); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PAMSHAE", 92189); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MON NGGEUAET", 92190); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NZUN MEUT", 92191); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A U YUQ NAE", 92192); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A GHEUAEGHEUAE", 92193); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NTAP NTAA", 92194); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SISA", 92195); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MGBASA", 92196); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MEUNJOMNDEUQ", 92197); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MOOMPUQ", 92198); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A KAFA", 92199); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PA LEERAEWA", 92200); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NDA LEERAEWA", 92201); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PET", 92202); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAEMKPEN", 92203); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NIKA", 92204); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PUP", 92205); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A TUAEP", 92206); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A LUAEP", 92207); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SONJAM", 92208); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A TEUTEUWEN", 92209); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAENYI", 92210); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A KET", 92211); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NDAANGGEUAET", 92212); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A KUOQ", 92213); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MOOMEUT", 92214); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SHUM", 92215); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A LOMMAE", 92216); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A FIRI", 92217); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A ROM", 92218); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A KPOQ", 92219); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SOQ", 92220); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAP PIEET", 92221); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SHIRAE", 92222); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NTAP", 92223); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SHOQ NSHUT YUM", 92224); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NYIT MONGKEUAEQ", 92225); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PAARAE", 92226); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NKAARAE", 92227); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A UNKNOWN", 92228); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NGGEN", 92229); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAESI", 92230); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NJAM", 92231); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MBANYI", 92232); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NYET", 92233); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A TEUAEN", 92234); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A SOT", 92235); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A PAAM", 92236); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NSHIEE", 92237); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MAEM", 92238); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NYI", 92239); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A KAQ", 92240); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NSHA", 92241); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A VEE", 92242); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A LU", 92243); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NEN", 92244); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A NAQ", 92245); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE A MBAQ", 92246); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NSHUET", 92247); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B TU MAEMGBIEE", 92248); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B SIEE", 92249); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B SET TU", 92250); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B LOM NTEUM", 92251); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MBA MAELEE", 92252); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B KIEEM", 92253); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B YEURAE", 92254); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MBAARAE", 92255); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B KAM", 92256); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B PEESHI", 92257); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B YAFU LEERAEWA", 92258); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B LAM NSHUT NYAM", 92259); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NTIEE SHEUOQ", 92260); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NDU NJAA", 92261); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B GHEUGHEUAEM", 92262); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B PIT", 92263); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B TU NSIEE", 92264); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B SHET NJAQ", 92265); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B SHEUAEQTU", 92266); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MFON TEUAEQ", 92267); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MBIT MBAAKET", 92268); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NYI NTEUM", 92269); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B KEUPUQ", 92270); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B GHEUGHEN", 92271); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B KEUYEUX", 92272); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B LAANAE", 92273); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B PARUM", 92274); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B VEUM", 92275); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NGKINDI MVOP", 92276); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NGGEU MBU", 92277); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B WUAET", 92278); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B SAKEUAE", 92279); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B TAAM", 92280); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MEUQ", 92281); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NGGUOQ", 92282); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NGGUOQ LARGE", 92283); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MFIYAQ", 92284); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B SUE", 92285); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MBEURI", 92286); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MONTIEEN", 92287); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NYAEMAE", 92288); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B PUNGAAM", 92289); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MEUT NGGEET", 92290); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B FEUX", 92291); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MBUOQ", 92292); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B FEE", 92293); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B KEUAEM", 92294); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MA NJEUAENA", 92295); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MA NJUQA", 92296); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B LET", 92297); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NGGAAM", 92298); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NSEN", 92299); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B MA", 92300); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B KIQ", 92301); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE B NGOM", 92302); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGKUE MAEMBA", 92303); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NZA", 92304); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C YUM", 92305); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C WANGKUOQ", 92306); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGGEN", 92307); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NDEUAEREE", 92308); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGKAQ", 92309); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C GHARAE", 92310); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBEEKEET", 92311); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C GBAYI", 92312); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NYIR MKPARAQ MEUN", 92313); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NTU MBIT", 92314); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBEUM", 92315); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C PIRIEEN", 92316); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NDOMBU", 92317); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBAA CABBAGE TREE", 92318); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KEUSHEUAEP", 92319); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C GHAP", 92320); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KEUKAQ", 92321); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C YU MUOMAE", 92322); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NZEUM", 92323); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBUE", 92324); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NSEUAEN", 92325); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBIT", 92326); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C YEUQ", 92327); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KPARAQ", 92328); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KAA", 92329); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C SEUX", 92330); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NDIDA", 92331); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C TAASHAE", 92332); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NJUEQ", 92333); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C TITA YUE", 92334); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C SUAET", 92335); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGGUAEN NYAM", 92336); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C VEUX", 92337); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NANSANAQ", 92338); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MA KEUAERI", 92339); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NTAA", 92340); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGGUON", 92341); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C LAP", 92342); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBIRIEEN", 92343); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MGBASAQ", 92344); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NTEUNGBA", 92345); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C TEUTEUX", 92346); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGGUM", 92347); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C FUE", 92348); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NDEUT", 92349); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NSA", 92350); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NSHAQ", 92351); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C BUNG", 92352); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C VEUAEPEN", 92353); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBERAE", 92354); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C RU", 92355); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NJAEM", 92356); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C LAM", 92357); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C TITUAEP", 92358); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NSUOT NGOM", 92359); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NJEEEE", 92360); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KET", 92361); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGGU", 92362); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MAESI", 92363); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBUAEM", 92364); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C LU", 92365); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KUT", 92366); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NJAM", 92367); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGOM", 92368); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C WUP", 92369); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGGUEET", 92370); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NSOM", 92371); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NTEN", 92372); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KUOP NKAARAE", 92373); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NSUN", 92374); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NDAM", 92375); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MA NSIEE", 92376); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C YAA", 92377); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NDAP", 92378); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C SHUEQ", 92379); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C SETFON", 92380); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBI", 92381); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MAEMBA", 92382); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBANYI", 92383); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KEUSEUX", 92384); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBEUX", 92385); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KEUM", 92386); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MBAA PICKET", 92387); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C YUWOQ", 92388); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NJEUX", 92389); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MIEE", 92390); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C MUAE", 92391); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C SHIQ", 92392); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KEN LAW", 92393); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C KEN FATIGUE", 92394); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NGAQ", 92395); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C NAQ", 92396); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C LIQ", 92397); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C PIN", 92398); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C PEN", 92399); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE C TET", 92400); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MBUO", 92401); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D WAP", 92402); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NJI", 92403); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MFON", 92404); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NJIEE", 92405); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D LIEE", 92406); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NJEUT", 92407); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NSHEE", 92408); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGGAAMAE", 92409); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NYAM", 92410); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D WUAEN", 92411); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGKUN", 92412); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SHEE", 92413); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGKAP", 92414); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KEUAETMEUN", 92415); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TEUT", 92416); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SHEUAE", 92417); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NJAP", 92418); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SUE", 92419); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KET", 92420); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D YAEMMAE", 92421); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KUOM", 92422); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SAP", 92423); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MFEUT", 92424); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NDEUX", 92425); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MALEERI", 92426); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MEUT", 92427); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SEUAEQ", 92428); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D YEN", 92429); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NJEUAEM", 92430); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KEUOT MBUAE", 92431); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGKEURI", 92432); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TU", 92433); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D GHAA", 92434); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGKYEE", 92435); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D FEUFEUAET", 92436); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NDEE", 92437); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MGBOFUM", 92438); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D LEUAEP", 92439); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NDON", 92440); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MONI", 92441); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MGBEUN", 92442); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D PUUT", 92443); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MGBIEE", 92444); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MFO", 92445); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D LUM", 92446); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NSIEEP", 92447); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MBAA", 92448); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KWAET", 92449); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NYET", 92450); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TEUAEN", 92451); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SOT", 92452); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D YUWOQ", 92453); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KEUM", 92454); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D RAEM", 92455); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TEEEE", 92456); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGKEUAEQ", 92457); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MFEUAE", 92458); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NSIEET", 92459); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KEUP", 92460); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D PIP", 92461); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D PEUTAE", 92462); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NYUE", 92463); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D LET", 92464); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGGAAM", 92465); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MFIEE", 92466); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGGWAEN", 92467); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D YUOM", 92468); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D PAP", 92469); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D YUOP", 92470); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NDAM", 92471); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NTEUM", 92472); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SUAE", 92473); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KUN", 92474); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGGEUX", 92475); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGKIEE", 92476); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TUOT", 92477); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MEUN", 92478); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KUQ", 92479); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NSUM", 92480); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TEUN", 92481); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MAENJET", 92482); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGGAP", 92483); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D LEUM", 92484); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NGGUOM", 92485); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NSHUT", 92486); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NJUEQ", 92487); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D GHEUAE", 92488); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KU", 92489); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D REN OLD", 92490); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TAE", 92491); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TOQ", 92492); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NYI", 92493); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D RII", 92494); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D LEEEE", 92495); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MEEEE", 92496); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D M", 92497); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SUU", 92498); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MU", 92499); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SHII", 92500); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SHEUX", 92501); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D KYEE", 92502); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NU", 92503); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SHU", 92504); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NTEE", 92505); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D PEE", 92506); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NI", 92507); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SHOQ", 92508); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D PUQ", 92509); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MVOP", 92510); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D LOQ", 92511); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D REN MUCH", 92512); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D TI", 92513); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D NTUU", 92514); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D MBAA SEVEN", 92515); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D SAQ", 92516); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE D FAA", 92517); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NDAP", 92518); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TOON", 92519); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MBEUM", 92520); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LAP", 92521); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E VOM", 92522); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LOON", 92523); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PAA", 92524); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SOM", 92525); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E RAQ", 92526); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NSHUOP", 92527); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NDUN", 92528); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PUAE", 92529); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TAM", 92530); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGKA", 92531); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KPEUX", 92532); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E WUO", 92533); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SEE", 92534); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGGEUAET", 92535); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PAAM", 92536); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TOO", 92537); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KUOP", 92538); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LOM", 92539); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NSHIEE", 92540); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGOP", 92541); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MAEM", 92542); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGKEUX", 92543); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGOQ", 92544); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NSHUE", 92545); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E RIMGBA", 92546); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NJEUX", 92547); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PEEM", 92548); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SAA", 92549); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGGURAE", 92550); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MGBA", 92551); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GHEUX", 92552); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGKEUAEM", 92553); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NJAEMLI", 92554); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MAP", 92555); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LOOT", 92556); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGGEEEE", 92557); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NDIQ", 92558); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TAEN NTEUM", 92559); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SET", 92560); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PUM", 92561); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NDAA SOFTNESS", 92562); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGGUAESHAE NYAM", 92563); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YIEE", 92564); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GHEUN", 92565); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TUAE", 92566); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YEUAE", 92567); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PO", 92568); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TUMAE", 92569); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KEUAE", 92570); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SUAEN", 92571); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TEUAEQ", 92572); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E VEUAE", 92573); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E WEUX", 92574); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LAAM", 92575); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PU", 92576); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TAAQ", 92577); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GHAAMAE", 92578); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGEUREUT", 92579); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SHEUAEQ", 92580); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MGBEN", 92581); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MBEE", 92582); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NZAQ", 92583); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NKOM", 92584); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GBET", 92585); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TUM", 92586); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KUET", 92587); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YAP", 92588); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NYI CLEAVER", 92589); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YIT", 92590); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MFEUQ", 92591); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NDIAQ", 92592); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PIEEQ", 92593); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YUEQ", 92594); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LEUAEM", 92595); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FUE", 92596); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GBEUX", 92597); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGKUP", 92598); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KET", 92599); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MAE", 92600); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGKAAMI", 92601); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GHET", 92602); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FA", 92603); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NTUM", 92604); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PEUT", 92605); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YEUM", 92606); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGGEUAE", 92607); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NYI BETWEEN", 92608); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NZUQ", 92609); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E POON", 92610); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MIEE", 92611); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FUET", 92612); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NAE", 92613); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MUAE", 92614); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GHEUAE", 92615); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FU I", 92616); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MVI", 92617); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PUAQ", 92618); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGKUM", 92619); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KUT", 92620); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PIET", 92621); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NTAP", 92622); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YEUAET", 92623); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGGUP", 92624); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PA PEOPLE", 92625); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FU CALL", 92626); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FOM", 92627); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NJEE", 92628); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E A", 92629); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TOQ", 92630); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E O", 92631); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E I", 92632); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LAQ", 92633); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PA PLURAL", 92634); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TAA", 92635); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TAQ", 92636); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NDAA MY HOUSE", 92637); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SHIQ", 92638); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YEUX", 92639); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGUAE", 92640); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YUAEN", 92641); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YOQ SWIMMING", 92642); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YOQ COVER", 92643); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YUQ", 92644); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E YUN", 92645); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KEUX", 92646); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PEUX", 92647); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NJEE EPOCH", 92648); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PUE", 92649); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E WUE", 92650); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FEE", 92651); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E VEE", 92652); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LU", 92653); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MI", 92654); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E REUX", 92655); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E RAE", 92656); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGUAET", 92657); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NGA", 92658); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SHO", 92659); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E SHOQ", 92660); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FU REMEDY", 92661); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E NA", 92662); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E PI", 92663); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E LOQ", 92664); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KO", 92665); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MEN", 92666); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MA", 92667); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MAQ", 92668); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TEU", 92669); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E KI", 92670); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E MON", 92671); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E TEN", 92672); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E FAQ", 92673); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE E GHOM", 92674); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F KA", 92675); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F U", 92676); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F KU", 92677); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F EE", 92678); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F REE", 92679); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F TAE", 92680); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NYI", 92681); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F LA", 92682); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F RII", 92683); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F RIEE", 92684); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F MEEEE", 92685); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F TAA", 92686); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NDAA", 92687); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NJAEM", 92688); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F M", 92689); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F SUU", 92690); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F SHII", 92691); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F SI", 92692); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F SEUX", 92693); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F KYEE", 92694); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F KET", 92695); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NUAE", 92696); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NU", 92697); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NJUAE", 92698); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F YOQ", 92699); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F SHU", 92700); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F YA", 92701); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NSHA", 92702); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F PEUX", 92703); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NTEE", 92704); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F WUE", 92705); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F PEE", 92706); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F RU", 92707); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NI", 92708); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F REUX", 92709); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F KEN", 92710); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NGKWAEN", 92711); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F NGGA", 92712); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F SHO", 92713); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F PUAE", 92714); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F FOM", 92715); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F WA", 92716); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F LI", 92717); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F LOQ", 92718); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F KO", 92719); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F MBEN", 92720); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F REN", 92721); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F MA", 92722); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F MO", 92723); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F MBAA", 92724); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F TET", 92725); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F KPA", 92726); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F SAMBA", 92727); - _unicodeCharacterMap.Add("BAMUM LETTER PHASE F VUEQ", 92728); - _unicodeCharacterMap.Add("MRO LETTER TA", 92736); - _unicodeCharacterMap.Add("MRO LETTER NGI", 92737); - _unicodeCharacterMap.Add("MRO LETTER YO", 92738); - _unicodeCharacterMap.Add("MRO LETTER MIM", 92739); - _unicodeCharacterMap.Add("MRO LETTER BA", 92740); - _unicodeCharacterMap.Add("MRO LETTER DA", 92741); - _unicodeCharacterMap.Add("MRO LETTER A", 92742); - _unicodeCharacterMap.Add("MRO LETTER PHI", 92743); - _unicodeCharacterMap.Add("MRO LETTER KHAI", 92744); - _unicodeCharacterMap.Add("MRO LETTER HAO", 92745); - _unicodeCharacterMap.Add("MRO LETTER DAI", 92746); - _unicodeCharacterMap.Add("MRO LETTER CHU", 92747); - _unicodeCharacterMap.Add("MRO LETTER KEAAE", 92748); - _unicodeCharacterMap.Add("MRO LETTER OL", 92749); - _unicodeCharacterMap.Add("MRO LETTER MAEM", 92750); - _unicodeCharacterMap.Add("MRO LETTER NIN", 92751); - _unicodeCharacterMap.Add("MRO LETTER PA", 92752); - _unicodeCharacterMap.Add("MRO LETTER OO", 92753); - _unicodeCharacterMap.Add("MRO LETTER O", 92754); - _unicodeCharacterMap.Add("MRO LETTER RO", 92755); - _unicodeCharacterMap.Add("MRO LETTER SHI", 92756); - _unicodeCharacterMap.Add("MRO LETTER THEA", 92757); - _unicodeCharacterMap.Add("MRO LETTER EA", 92758); - _unicodeCharacterMap.Add("MRO LETTER WA", 92759); - _unicodeCharacterMap.Add("MRO LETTER E", 92760); - _unicodeCharacterMap.Add("MRO LETTER KO", 92761); - _unicodeCharacterMap.Add("MRO LETTER LAN", 92762); - _unicodeCharacterMap.Add("MRO LETTER LA", 92763); - _unicodeCharacterMap.Add("MRO LETTER HAI", 92764); - _unicodeCharacterMap.Add("MRO LETTER RI", 92765); - _unicodeCharacterMap.Add("MRO LETTER TEK", 92766); - _unicodeCharacterMap.Add("MRO DIGIT ZERO", 92768); - _unicodeCharacterMap.Add("MRO DIGIT ONE", 92769); - _unicodeCharacterMap.Add("MRO DIGIT TWO", 92770); - _unicodeCharacterMap.Add("MRO DIGIT THREE", 92771); - _unicodeCharacterMap.Add("MRO DIGIT FOUR", 92772); - _unicodeCharacterMap.Add("MRO DIGIT FIVE", 92773); - _unicodeCharacterMap.Add("MRO DIGIT SIX", 92774); - _unicodeCharacterMap.Add("MRO DIGIT SEVEN", 92775); - _unicodeCharacterMap.Add("MRO DIGIT EIGHT", 92776); - _unicodeCharacterMap.Add("MRO DIGIT NINE", 92777); - _unicodeCharacterMap.Add("MRO DANDA", 92782); - _unicodeCharacterMap.Add("MRO DOUBLE DANDA", 92783); - _unicodeCharacterMap.Add("BASSA VAH LETTER ENNI", 92880); - _unicodeCharacterMap.Add("BASSA VAH LETTER KA", 92881); - _unicodeCharacterMap.Add("BASSA VAH LETTER SE", 92882); - _unicodeCharacterMap.Add("BASSA VAH LETTER FA", 92883); - _unicodeCharacterMap.Add("BASSA VAH LETTER MBE", 92884); - _unicodeCharacterMap.Add("BASSA VAH LETTER YIE", 92885); - _unicodeCharacterMap.Add("BASSA VAH LETTER GAH", 92886); - _unicodeCharacterMap.Add("BASSA VAH LETTER DHII", 92887); - _unicodeCharacterMap.Add("BASSA VAH LETTER KPAH", 92888); - _unicodeCharacterMap.Add("BASSA VAH LETTER JO", 92889); - _unicodeCharacterMap.Add("BASSA VAH LETTER HWAH", 92890); - _unicodeCharacterMap.Add("BASSA VAH LETTER WA", 92891); - _unicodeCharacterMap.Add("BASSA VAH LETTER ZO", 92892); - _unicodeCharacterMap.Add("BASSA VAH LETTER GBU", 92893); - _unicodeCharacterMap.Add("BASSA VAH LETTER DO", 92894); - _unicodeCharacterMap.Add("BASSA VAH LETTER CE", 92895); - _unicodeCharacterMap.Add("BASSA VAH LETTER UWU", 92896); - _unicodeCharacterMap.Add("BASSA VAH LETTER TO", 92897); - _unicodeCharacterMap.Add("BASSA VAH LETTER BA", 92898); - _unicodeCharacterMap.Add("BASSA VAH LETTER VU", 92899); - _unicodeCharacterMap.Add("BASSA VAH LETTER YEIN", 92900); - _unicodeCharacterMap.Add("BASSA VAH LETTER PA", 92901); - _unicodeCharacterMap.Add("BASSA VAH LETTER WADDA", 92902); - _unicodeCharacterMap.Add("BASSA VAH LETTER A", 92903); - _unicodeCharacterMap.Add("BASSA VAH LETTER O", 92904); - _unicodeCharacterMap.Add("BASSA VAH LETTER OO", 92905); - _unicodeCharacterMap.Add("BASSA VAH LETTER U", 92906); - _unicodeCharacterMap.Add("BASSA VAH LETTER EE", 92907); - _unicodeCharacterMap.Add("BASSA VAH LETTER E", 92908); - _unicodeCharacterMap.Add("BASSA VAH LETTER I", 92909); - _unicodeCharacterMap.Add("BASSA VAH COMBINING HIGH TONE", 92912); - _unicodeCharacterMap.Add("BASSA VAH COMBINING LOW TONE", 92913); - _unicodeCharacterMap.Add("BASSA VAH COMBINING MID TONE", 92914); - _unicodeCharacterMap.Add("BASSA VAH COMBINING LOW MID TONE", 92915); - _unicodeCharacterMap.Add("BASSA VAH COMBINING HIGH LOW TONE", 92916); - _unicodeCharacterMap.Add("BASSA VAH FULL STOP", 92917); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KEEB", 92928); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KEEV", 92929); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KIB", 92930); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KIV", 92931); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAUB", 92932); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAUV", 92933); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KUB", 92934); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KUV", 92935); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KEB", 92936); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KEV", 92937); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAIB", 92938); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAIV", 92939); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KOOB", 92940); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KOOV", 92941); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAWB", 92942); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAWV", 92943); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KUAB", 92944); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KUAV", 92945); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KOB", 92946); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KOV", 92947); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KIAB", 92948); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KIAV", 92949); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAB", 92950); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAV", 92951); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KWB", 92952); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KWV", 92953); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAAB", 92954); - _unicodeCharacterMap.Add("PAHAWH HMONG VOWEL KAAV", 92955); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT VAU", 92956); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT NTSAU", 92957); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT LAU", 92958); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT HAU", 92959); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT NLAU", 92960); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT RAU", 92961); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT NKAU", 92962); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT QHAU", 92963); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT YAU", 92964); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT HLAU", 92965); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT MAU", 92966); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT CHAU", 92967); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT NCHAU", 92968); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT HNAU", 92969); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT PLHAU", 92970); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT NTHAU", 92971); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT NAU", 92972); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT AU", 92973); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT XAU", 92974); - _unicodeCharacterMap.Add("PAHAWH HMONG CONSONANT CAU", 92975); - _unicodeCharacterMap.Add("PAHAWH HMONG MARK CIM TUB", 92976); - _unicodeCharacterMap.Add("PAHAWH HMONG MARK CIM SO", 92977); - _unicodeCharacterMap.Add("PAHAWH HMONG MARK CIM KES", 92978); - _unicodeCharacterMap.Add("PAHAWH HMONG MARK CIM KHAV", 92979); - _unicodeCharacterMap.Add("PAHAWH HMONG MARK CIM SUAM", 92980); - _unicodeCharacterMap.Add("PAHAWH HMONG MARK CIM HOM", 92981); - _unicodeCharacterMap.Add("PAHAWH HMONG MARK CIM TAUM", 92982); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN VOS THOM", 92983); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN VOS TSHAB CEEB", 92984); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM CHEEM", 92985); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN VOS THIAB", 92986); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN VOS FEEM", 92987); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN XYEEM NTXIV", 92988); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN XYEEM RHO", 92989); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN XYEEM TOV", 92990); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN XYEEM FAIB", 92991); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN VOS SEEV", 92992); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN MEEJ SUAB", 92993); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN VOS NRUA", 92994); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN IB YAM", 92995); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN XAUS", 92996); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM TSOV ROG", 92997); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT ZERO", 93008); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT ONE", 93009); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT TWO", 93010); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT THREE", 93011); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT FOUR", 93012); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT FIVE", 93013); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT SIX", 93014); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT SEVEN", 93015); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT EIGHT", 93016); - _unicodeCharacterMap.Add("PAHAWH HMONG DIGIT NINE", 93017); - _unicodeCharacterMap.Add("PAHAWH HMONG NUMBER TENS", 93019); - _unicodeCharacterMap.Add("PAHAWH HMONG NUMBER HUNDREDS", 93020); - _unicodeCharacterMap.Add("PAHAWH HMONG NUMBER TEN THOUSANDS", 93021); - _unicodeCharacterMap.Add("PAHAWH HMONG NUMBER MILLIONS", 93022); - _unicodeCharacterMap.Add("PAHAWH HMONG NUMBER HUNDRED MILLIONS", 93023); - _unicodeCharacterMap.Add("PAHAWH HMONG NUMBER TEN BILLIONS", 93024); - _unicodeCharacterMap.Add("PAHAWH HMONG NUMBER TRILLIONS", 93025); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN VOS LUB", 93027); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN XYOO", 93028); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN HLI", 93029); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN THIRD STAGE HLI", 93030); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN ZWJ THAJ", 93031); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN HNUB", 93032); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN NQIG", 93033); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN XIAB", 93034); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN NTUJ", 93035); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN AV", 93036); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN TXHEEJ CEEV", 93037); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN MEEJ TSEEB", 93038); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN TAU", 93039); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN LOS", 93040); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN MUS", 93041); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG", 93042); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM CUAM TSHOOJ", 93043); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM TXWV", 93044); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM TXWV CHWV", 93045); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM PUB DAWB", 93046); - _unicodeCharacterMap.Add("PAHAWH HMONG SIGN CIM NRES TOS", 93047); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN TSHEEJ", 93053); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN YEEG", 93054); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN LIS", 93055); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN LAUJ", 93056); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN XYOOJ", 93057); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN KOO", 93058); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN HAWJ", 93059); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN MUAS", 93060); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN THOJ", 93061); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN TSAB", 93062); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN PHAB", 93063); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN KHAB", 93064); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN HAM", 93065); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN VAJ", 93066); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN FAJ", 93067); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN YAJ", 93068); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN TSWB", 93069); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN KWM", 93070); - _unicodeCharacterMap.Add("PAHAWH HMONG CLAN SIGN VWJ", 93071); - _unicodeCharacterMap.Add("MIAO LETTER PA", 93952); - _unicodeCharacterMap.Add("MIAO LETTER BA", 93953); - _unicodeCharacterMap.Add("MIAO LETTER YI PA", 93954); - _unicodeCharacterMap.Add("MIAO LETTER PLA", 93955); - _unicodeCharacterMap.Add("MIAO LETTER MA", 93956); - _unicodeCharacterMap.Add("MIAO LETTER MHA", 93957); - _unicodeCharacterMap.Add("MIAO LETTER ARCHAIC MA", 93958); - _unicodeCharacterMap.Add("MIAO LETTER FA", 93959); - _unicodeCharacterMap.Add("MIAO LETTER VA", 93960); - _unicodeCharacterMap.Add("MIAO LETTER VFA", 93961); - _unicodeCharacterMap.Add("MIAO LETTER TA", 93962); - _unicodeCharacterMap.Add("MIAO LETTER DA", 93963); - _unicodeCharacterMap.Add("MIAO LETTER YI TTA", 93964); - _unicodeCharacterMap.Add("MIAO LETTER YI TA", 93965); - _unicodeCharacterMap.Add("MIAO LETTER TTA", 93966); - _unicodeCharacterMap.Add("MIAO LETTER DDA", 93967); - _unicodeCharacterMap.Add("MIAO LETTER NA", 93968); - _unicodeCharacterMap.Add("MIAO LETTER NHA", 93969); - _unicodeCharacterMap.Add("MIAO LETTER YI NNA", 93970); - _unicodeCharacterMap.Add("MIAO LETTER ARCHAIC NA", 93971); - _unicodeCharacterMap.Add("MIAO LETTER NNA", 93972); - _unicodeCharacterMap.Add("MIAO LETTER NNHA", 93973); - _unicodeCharacterMap.Add("MIAO LETTER LA", 93974); - _unicodeCharacterMap.Add("MIAO LETTER LYA", 93975); - _unicodeCharacterMap.Add("MIAO LETTER LHA", 93976); - _unicodeCharacterMap.Add("MIAO LETTER LHYA", 93977); - _unicodeCharacterMap.Add("MIAO LETTER TLHA", 93978); - _unicodeCharacterMap.Add("MIAO LETTER DLHA", 93979); - _unicodeCharacterMap.Add("MIAO LETTER TLHYA", 93980); - _unicodeCharacterMap.Add("MIAO LETTER DLHYA", 93981); - _unicodeCharacterMap.Add("MIAO LETTER KA", 93982); - _unicodeCharacterMap.Add("MIAO LETTER GA", 93983); - _unicodeCharacterMap.Add("MIAO LETTER YI KA", 93984); - _unicodeCharacterMap.Add("MIAO LETTER QA", 93985); - _unicodeCharacterMap.Add("MIAO LETTER QGA", 93986); - _unicodeCharacterMap.Add("MIAO LETTER NGA", 93987); - _unicodeCharacterMap.Add("MIAO LETTER NGHA", 93988); - _unicodeCharacterMap.Add("MIAO LETTER ARCHAIC NGA", 93989); - _unicodeCharacterMap.Add("MIAO LETTER HA", 93990); - _unicodeCharacterMap.Add("MIAO LETTER XA", 93991); - _unicodeCharacterMap.Add("MIAO LETTER GHA", 93992); - _unicodeCharacterMap.Add("MIAO LETTER GHHA", 93993); - _unicodeCharacterMap.Add("MIAO LETTER TSSA", 93994); - _unicodeCharacterMap.Add("MIAO LETTER DZZA", 93995); - _unicodeCharacterMap.Add("MIAO LETTER NYA", 93996); - _unicodeCharacterMap.Add("MIAO LETTER NYHA", 93997); - _unicodeCharacterMap.Add("MIAO LETTER TSHA", 93998); - _unicodeCharacterMap.Add("MIAO LETTER DZHA", 93999); - _unicodeCharacterMap.Add("MIAO LETTER YI TSHA", 94000); - _unicodeCharacterMap.Add("MIAO LETTER YI DZHA", 94001); - _unicodeCharacterMap.Add("MIAO LETTER REFORMED TSHA", 94002); - _unicodeCharacterMap.Add("MIAO LETTER SHA", 94003); - _unicodeCharacterMap.Add("MIAO LETTER SSA", 94004); - _unicodeCharacterMap.Add("MIAO LETTER ZHA", 94005); - _unicodeCharacterMap.Add("MIAO LETTER ZSHA", 94006); - _unicodeCharacterMap.Add("MIAO LETTER TSA", 94007); - _unicodeCharacterMap.Add("MIAO LETTER DZA", 94008); - _unicodeCharacterMap.Add("MIAO LETTER YI TSA", 94009); - _unicodeCharacterMap.Add("MIAO LETTER SA", 94010); - _unicodeCharacterMap.Add("MIAO LETTER ZA", 94011); - _unicodeCharacterMap.Add("MIAO LETTER ZSA", 94012); - _unicodeCharacterMap.Add("MIAO LETTER ZZA", 94013); - _unicodeCharacterMap.Add("MIAO LETTER ZZSA", 94014); - _unicodeCharacterMap.Add("MIAO LETTER ARCHAIC ZZA", 94015); - _unicodeCharacterMap.Add("MIAO LETTER ZZYA", 94016); - _unicodeCharacterMap.Add("MIAO LETTER ZZSYA", 94017); - _unicodeCharacterMap.Add("MIAO LETTER WA", 94018); - _unicodeCharacterMap.Add("MIAO LETTER AH", 94019); - _unicodeCharacterMap.Add("MIAO LETTER HHA", 94020); - _unicodeCharacterMap.Add("MIAO LETTER NASALIZATION", 94032); - _unicodeCharacterMap.Add("MIAO SIGN ASPIRATION", 94033); - _unicodeCharacterMap.Add("MIAO SIGN REFORMED VOICING", 94034); - _unicodeCharacterMap.Add("MIAO SIGN REFORMED ASPIRATION", 94035); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN A", 94036); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN AA", 94037); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN AHH", 94038); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN AN", 94039); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN ANG", 94040); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN O", 94041); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN OO", 94042); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN WO", 94043); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN W", 94044); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN E", 94045); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN EN", 94046); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN ENG", 94047); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN OEY", 94048); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN I", 94049); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN IA", 94050); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN IAN", 94051); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN IANG", 94052); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN IO", 94053); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN IE", 94054); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN II", 94055); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN IU", 94056); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN ING", 94057); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN U", 94058); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN UA", 94059); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN UAN", 94060); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN UANG", 94061); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN UU", 94062); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN UEI", 94063); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN UNG", 94064); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN Y", 94065); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN YI", 94066); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN AE", 94067); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN AEE", 94068); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN ERR", 94069); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN ROUNDED ERR", 94070); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN ER", 94071); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN ROUNDED ER", 94072); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN AI", 94073); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN EI", 94074); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN AU", 94075); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN OU", 94076); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN N", 94077); - _unicodeCharacterMap.Add("MIAO VOWEL SIGN NG", 94078); - _unicodeCharacterMap.Add("MIAO TONE RIGHT", 94095); - _unicodeCharacterMap.Add("MIAO TONE TOP RIGHT", 94096); - _unicodeCharacterMap.Add("MIAO TONE ABOVE", 94097); - _unicodeCharacterMap.Add("MIAO TONE BELOW", 94098); - _unicodeCharacterMap.Add("MIAO LETTER TONE 2", 94099); - _unicodeCharacterMap.Add("MIAO LETTER TONE 3", 94100); - _unicodeCharacterMap.Add("MIAO LETTER TONE 4", 94101); - _unicodeCharacterMap.Add("MIAO LETTER TONE 5", 94102); - _unicodeCharacterMap.Add("MIAO LETTER TONE 6", 94103); - _unicodeCharacterMap.Add("MIAO LETTER TONE 7", 94104); - _unicodeCharacterMap.Add("MIAO LETTER TONE 8", 94105); - _unicodeCharacterMap.Add("MIAO LETTER REFORMED TONE 1", 94106); - _unicodeCharacterMap.Add("MIAO LETTER REFORMED TONE 2", 94107); - _unicodeCharacterMap.Add("MIAO LETTER REFORMED TONE 4", 94108); - _unicodeCharacterMap.Add("MIAO LETTER REFORMED TONE 5", 94109); - _unicodeCharacterMap.Add("MIAO LETTER REFORMED TONE 6", 94110); - _unicodeCharacterMap.Add("MIAO LETTER REFORMED TONE 8", 94111); - _unicodeCharacterMap.Add("TANGUT ITERATION MARK", 94176); - _unicodeCharacterMap.Add("TANGUT COMPONENT 001", 100352); - _unicodeCharacterMap.Add("TANGUT COMPONENT 002", 100353); - _unicodeCharacterMap.Add("TANGUT COMPONENT 003", 100354); - _unicodeCharacterMap.Add("TANGUT COMPONENT 004", 100355); - _unicodeCharacterMap.Add("TANGUT COMPONENT 005", 100356); - _unicodeCharacterMap.Add("TANGUT COMPONENT 006", 100357); - _unicodeCharacterMap.Add("TANGUT COMPONENT 007", 100358); - _unicodeCharacterMap.Add("TANGUT COMPONENT 008", 100359); - _unicodeCharacterMap.Add("TANGUT COMPONENT 009", 100360); - _unicodeCharacterMap.Add("TANGUT COMPONENT 010", 100361); - _unicodeCharacterMap.Add("TANGUT COMPONENT 011", 100362); - _unicodeCharacterMap.Add("TANGUT COMPONENT 012", 100363); - _unicodeCharacterMap.Add("TANGUT COMPONENT 013", 100364); - _unicodeCharacterMap.Add("TANGUT COMPONENT 014", 100365); - _unicodeCharacterMap.Add("TANGUT COMPONENT 015", 100366); - _unicodeCharacterMap.Add("TANGUT COMPONENT 016", 100367); - _unicodeCharacterMap.Add("TANGUT COMPONENT 017", 100368); - _unicodeCharacterMap.Add("TANGUT COMPONENT 018", 100369); - _unicodeCharacterMap.Add("TANGUT COMPONENT 019", 100370); - _unicodeCharacterMap.Add("TANGUT COMPONENT 020", 100371); - _unicodeCharacterMap.Add("TANGUT COMPONENT 021", 100372); - _unicodeCharacterMap.Add("TANGUT COMPONENT 022", 100373); - _unicodeCharacterMap.Add("TANGUT COMPONENT 023", 100374); - _unicodeCharacterMap.Add("TANGUT COMPONENT 024", 100375); - _unicodeCharacterMap.Add("TANGUT COMPONENT 025", 100376); - _unicodeCharacterMap.Add("TANGUT COMPONENT 026", 100377); - _unicodeCharacterMap.Add("TANGUT COMPONENT 027", 100378); - _unicodeCharacterMap.Add("TANGUT COMPONENT 028", 100379); - _unicodeCharacterMap.Add("TANGUT COMPONENT 029", 100380); - _unicodeCharacterMap.Add("TANGUT COMPONENT 030", 100381); - _unicodeCharacterMap.Add("TANGUT COMPONENT 031", 100382); - _unicodeCharacterMap.Add("TANGUT COMPONENT 032", 100383); - _unicodeCharacterMap.Add("TANGUT COMPONENT 033", 100384); - _unicodeCharacterMap.Add("TANGUT COMPONENT 034", 100385); - _unicodeCharacterMap.Add("TANGUT COMPONENT 035", 100386); - _unicodeCharacterMap.Add("TANGUT COMPONENT 036", 100387); - _unicodeCharacterMap.Add("TANGUT COMPONENT 037", 100388); - _unicodeCharacterMap.Add("TANGUT COMPONENT 038", 100389); - _unicodeCharacterMap.Add("TANGUT COMPONENT 039", 100390); - _unicodeCharacterMap.Add("TANGUT COMPONENT 040", 100391); - _unicodeCharacterMap.Add("TANGUT COMPONENT 041", 100392); - _unicodeCharacterMap.Add("TANGUT COMPONENT 042", 100393); - _unicodeCharacterMap.Add("TANGUT COMPONENT 043", 100394); - _unicodeCharacterMap.Add("TANGUT COMPONENT 044", 100395); - _unicodeCharacterMap.Add("TANGUT COMPONENT 045", 100396); - _unicodeCharacterMap.Add("TANGUT COMPONENT 046", 100397); - _unicodeCharacterMap.Add("TANGUT COMPONENT 047", 100398); - _unicodeCharacterMap.Add("TANGUT COMPONENT 048", 100399); - _unicodeCharacterMap.Add("TANGUT COMPONENT 049", 100400); - _unicodeCharacterMap.Add("TANGUT COMPONENT 050", 100401); - _unicodeCharacterMap.Add("TANGUT COMPONENT 051", 100402); - _unicodeCharacterMap.Add("TANGUT COMPONENT 052", 100403); - _unicodeCharacterMap.Add("TANGUT COMPONENT 053", 100404); - _unicodeCharacterMap.Add("TANGUT COMPONENT 054", 100405); - _unicodeCharacterMap.Add("TANGUT COMPONENT 055", 100406); - _unicodeCharacterMap.Add("TANGUT COMPONENT 056", 100407); - _unicodeCharacterMap.Add("TANGUT COMPONENT 057", 100408); - _unicodeCharacterMap.Add("TANGUT COMPONENT 058", 100409); - _unicodeCharacterMap.Add("TANGUT COMPONENT 059", 100410); - _unicodeCharacterMap.Add("TANGUT COMPONENT 060", 100411); - _unicodeCharacterMap.Add("TANGUT COMPONENT 061", 100412); - _unicodeCharacterMap.Add("TANGUT COMPONENT 062", 100413); - _unicodeCharacterMap.Add("TANGUT COMPONENT 063", 100414); - _unicodeCharacterMap.Add("TANGUT COMPONENT 064", 100415); - _unicodeCharacterMap.Add("TANGUT COMPONENT 065", 100416); - _unicodeCharacterMap.Add("TANGUT COMPONENT 066", 100417); - _unicodeCharacterMap.Add("TANGUT COMPONENT 067", 100418); - _unicodeCharacterMap.Add("TANGUT COMPONENT 068", 100419); - _unicodeCharacterMap.Add("TANGUT COMPONENT 069", 100420); - _unicodeCharacterMap.Add("TANGUT COMPONENT 070", 100421); - _unicodeCharacterMap.Add("TANGUT COMPONENT 071", 100422); - _unicodeCharacterMap.Add("TANGUT COMPONENT 072", 100423); - _unicodeCharacterMap.Add("TANGUT COMPONENT 073", 100424); - _unicodeCharacterMap.Add("TANGUT COMPONENT 074", 100425); - _unicodeCharacterMap.Add("TANGUT COMPONENT 075", 100426); - _unicodeCharacterMap.Add("TANGUT COMPONENT 076", 100427); - _unicodeCharacterMap.Add("TANGUT COMPONENT 077", 100428); - _unicodeCharacterMap.Add("TANGUT COMPONENT 078", 100429); - _unicodeCharacterMap.Add("TANGUT COMPONENT 079", 100430); - _unicodeCharacterMap.Add("TANGUT COMPONENT 080", 100431); - _unicodeCharacterMap.Add("TANGUT COMPONENT 081", 100432); - _unicodeCharacterMap.Add("TANGUT COMPONENT 082", 100433); - _unicodeCharacterMap.Add("TANGUT COMPONENT 083", 100434); - _unicodeCharacterMap.Add("TANGUT COMPONENT 084", 100435); - _unicodeCharacterMap.Add("TANGUT COMPONENT 085", 100436); - _unicodeCharacterMap.Add("TANGUT COMPONENT 086", 100437); - _unicodeCharacterMap.Add("TANGUT COMPONENT 087", 100438); - _unicodeCharacterMap.Add("TANGUT COMPONENT 088", 100439); - _unicodeCharacterMap.Add("TANGUT COMPONENT 089", 100440); - _unicodeCharacterMap.Add("TANGUT COMPONENT 090", 100441); - _unicodeCharacterMap.Add("TANGUT COMPONENT 091", 100442); - _unicodeCharacterMap.Add("TANGUT COMPONENT 092", 100443); - _unicodeCharacterMap.Add("TANGUT COMPONENT 093", 100444); - _unicodeCharacterMap.Add("TANGUT COMPONENT 094", 100445); - _unicodeCharacterMap.Add("TANGUT COMPONENT 095", 100446); - _unicodeCharacterMap.Add("TANGUT COMPONENT 096", 100447); - _unicodeCharacterMap.Add("TANGUT COMPONENT 097", 100448); - _unicodeCharacterMap.Add("TANGUT COMPONENT 098", 100449); - _unicodeCharacterMap.Add("TANGUT COMPONENT 099", 100450); - _unicodeCharacterMap.Add("TANGUT COMPONENT 100", 100451); - _unicodeCharacterMap.Add("TANGUT COMPONENT 101", 100452); - _unicodeCharacterMap.Add("TANGUT COMPONENT 102", 100453); - _unicodeCharacterMap.Add("TANGUT COMPONENT 103", 100454); - _unicodeCharacterMap.Add("TANGUT COMPONENT 104", 100455); - _unicodeCharacterMap.Add("TANGUT COMPONENT 105", 100456); - _unicodeCharacterMap.Add("TANGUT COMPONENT 106", 100457); - _unicodeCharacterMap.Add("TANGUT COMPONENT 107", 100458); - _unicodeCharacterMap.Add("TANGUT COMPONENT 108", 100459); - _unicodeCharacterMap.Add("TANGUT COMPONENT 109", 100460); - _unicodeCharacterMap.Add("TANGUT COMPONENT 110", 100461); - _unicodeCharacterMap.Add("TANGUT COMPONENT 111", 100462); - _unicodeCharacterMap.Add("TANGUT COMPONENT 112", 100463); - _unicodeCharacterMap.Add("TANGUT COMPONENT 113", 100464); - _unicodeCharacterMap.Add("TANGUT COMPONENT 114", 100465); - _unicodeCharacterMap.Add("TANGUT COMPONENT 115", 100466); - _unicodeCharacterMap.Add("TANGUT COMPONENT 116", 100467); - _unicodeCharacterMap.Add("TANGUT COMPONENT 117", 100468); - _unicodeCharacterMap.Add("TANGUT COMPONENT 118", 100469); - _unicodeCharacterMap.Add("TANGUT COMPONENT 119", 100470); - _unicodeCharacterMap.Add("TANGUT COMPONENT 120", 100471); - _unicodeCharacterMap.Add("TANGUT COMPONENT 121", 100472); - _unicodeCharacterMap.Add("TANGUT COMPONENT 122", 100473); - _unicodeCharacterMap.Add("TANGUT COMPONENT 123", 100474); - _unicodeCharacterMap.Add("TANGUT COMPONENT 124", 100475); - _unicodeCharacterMap.Add("TANGUT COMPONENT 125", 100476); - _unicodeCharacterMap.Add("TANGUT COMPONENT 126", 100477); - _unicodeCharacterMap.Add("TANGUT COMPONENT 127", 100478); - _unicodeCharacterMap.Add("TANGUT COMPONENT 128", 100479); - _unicodeCharacterMap.Add("TANGUT COMPONENT 129", 100480); - _unicodeCharacterMap.Add("TANGUT COMPONENT 130", 100481); - _unicodeCharacterMap.Add("TANGUT COMPONENT 131", 100482); - _unicodeCharacterMap.Add("TANGUT COMPONENT 132", 100483); - _unicodeCharacterMap.Add("TANGUT COMPONENT 133", 100484); - _unicodeCharacterMap.Add("TANGUT COMPONENT 134", 100485); - _unicodeCharacterMap.Add("TANGUT COMPONENT 135", 100486); - _unicodeCharacterMap.Add("TANGUT COMPONENT 136", 100487); - _unicodeCharacterMap.Add("TANGUT COMPONENT 137", 100488); - _unicodeCharacterMap.Add("TANGUT COMPONENT 138", 100489); - _unicodeCharacterMap.Add("TANGUT COMPONENT 139", 100490); - _unicodeCharacterMap.Add("TANGUT COMPONENT 140", 100491); - _unicodeCharacterMap.Add("TANGUT COMPONENT 141", 100492); - _unicodeCharacterMap.Add("TANGUT COMPONENT 142", 100493); - _unicodeCharacterMap.Add("TANGUT COMPONENT 143", 100494); - _unicodeCharacterMap.Add("TANGUT COMPONENT 144", 100495); - _unicodeCharacterMap.Add("TANGUT COMPONENT 145", 100496); - _unicodeCharacterMap.Add("TANGUT COMPONENT 146", 100497); - _unicodeCharacterMap.Add("TANGUT COMPONENT 147", 100498); - _unicodeCharacterMap.Add("TANGUT COMPONENT 148", 100499); - _unicodeCharacterMap.Add("TANGUT COMPONENT 149", 100500); - _unicodeCharacterMap.Add("TANGUT COMPONENT 150", 100501); - _unicodeCharacterMap.Add("TANGUT COMPONENT 151", 100502); - _unicodeCharacterMap.Add("TANGUT COMPONENT 152", 100503); - _unicodeCharacterMap.Add("TANGUT COMPONENT 153", 100504); - _unicodeCharacterMap.Add("TANGUT COMPONENT 154", 100505); - _unicodeCharacterMap.Add("TANGUT COMPONENT 155", 100506); - _unicodeCharacterMap.Add("TANGUT COMPONENT 156", 100507); - _unicodeCharacterMap.Add("TANGUT COMPONENT 157", 100508); - _unicodeCharacterMap.Add("TANGUT COMPONENT 158", 100509); - _unicodeCharacterMap.Add("TANGUT COMPONENT 159", 100510); - _unicodeCharacterMap.Add("TANGUT COMPONENT 160", 100511); - _unicodeCharacterMap.Add("TANGUT COMPONENT 161", 100512); - _unicodeCharacterMap.Add("TANGUT COMPONENT 162", 100513); - _unicodeCharacterMap.Add("TANGUT COMPONENT 163", 100514); - _unicodeCharacterMap.Add("TANGUT COMPONENT 164", 100515); - _unicodeCharacterMap.Add("TANGUT COMPONENT 165", 100516); - _unicodeCharacterMap.Add("TANGUT COMPONENT 166", 100517); - _unicodeCharacterMap.Add("TANGUT COMPONENT 167", 100518); - _unicodeCharacterMap.Add("TANGUT COMPONENT 168", 100519); - _unicodeCharacterMap.Add("TANGUT COMPONENT 169", 100520); - _unicodeCharacterMap.Add("TANGUT COMPONENT 170", 100521); - _unicodeCharacterMap.Add("TANGUT COMPONENT 171", 100522); - _unicodeCharacterMap.Add("TANGUT COMPONENT 172", 100523); - _unicodeCharacterMap.Add("TANGUT COMPONENT 173", 100524); - _unicodeCharacterMap.Add("TANGUT COMPONENT 174", 100525); - _unicodeCharacterMap.Add("TANGUT COMPONENT 175", 100526); - _unicodeCharacterMap.Add("TANGUT COMPONENT 176", 100527); - _unicodeCharacterMap.Add("TANGUT COMPONENT 177", 100528); - _unicodeCharacterMap.Add("TANGUT COMPONENT 178", 100529); - _unicodeCharacterMap.Add("TANGUT COMPONENT 179", 100530); - _unicodeCharacterMap.Add("TANGUT COMPONENT 180", 100531); - _unicodeCharacterMap.Add("TANGUT COMPONENT 181", 100532); - _unicodeCharacterMap.Add("TANGUT COMPONENT 182", 100533); - _unicodeCharacterMap.Add("TANGUT COMPONENT 183", 100534); - _unicodeCharacterMap.Add("TANGUT COMPONENT 184", 100535); - _unicodeCharacterMap.Add("TANGUT COMPONENT 185", 100536); - _unicodeCharacterMap.Add("TANGUT COMPONENT 186", 100537); - _unicodeCharacterMap.Add("TANGUT COMPONENT 187", 100538); - _unicodeCharacterMap.Add("TANGUT COMPONENT 188", 100539); - _unicodeCharacterMap.Add("TANGUT COMPONENT 189", 100540); - _unicodeCharacterMap.Add("TANGUT COMPONENT 190", 100541); - _unicodeCharacterMap.Add("TANGUT COMPONENT 191", 100542); - _unicodeCharacterMap.Add("TANGUT COMPONENT 192", 100543); - _unicodeCharacterMap.Add("TANGUT COMPONENT 193", 100544); - _unicodeCharacterMap.Add("TANGUT COMPONENT 194", 100545); - _unicodeCharacterMap.Add("TANGUT COMPONENT 195", 100546); - _unicodeCharacterMap.Add("TANGUT COMPONENT 196", 100547); - _unicodeCharacterMap.Add("TANGUT COMPONENT 197", 100548); - _unicodeCharacterMap.Add("TANGUT COMPONENT 198", 100549); - _unicodeCharacterMap.Add("TANGUT COMPONENT 199", 100550); - _unicodeCharacterMap.Add("TANGUT COMPONENT 200", 100551); - _unicodeCharacterMap.Add("TANGUT COMPONENT 201", 100552); - _unicodeCharacterMap.Add("TANGUT COMPONENT 202", 100553); - _unicodeCharacterMap.Add("TANGUT COMPONENT 203", 100554); - _unicodeCharacterMap.Add("TANGUT COMPONENT 204", 100555); - _unicodeCharacterMap.Add("TANGUT COMPONENT 205", 100556); - _unicodeCharacterMap.Add("TANGUT COMPONENT 206", 100557); - _unicodeCharacterMap.Add("TANGUT COMPONENT 207", 100558); - _unicodeCharacterMap.Add("TANGUT COMPONENT 208", 100559); - _unicodeCharacterMap.Add("TANGUT COMPONENT 209", 100560); - _unicodeCharacterMap.Add("TANGUT COMPONENT 210", 100561); - _unicodeCharacterMap.Add("TANGUT COMPONENT 211", 100562); - _unicodeCharacterMap.Add("TANGUT COMPONENT 212", 100563); - _unicodeCharacterMap.Add("TANGUT COMPONENT 213", 100564); - _unicodeCharacterMap.Add("TANGUT COMPONENT 214", 100565); - _unicodeCharacterMap.Add("TANGUT COMPONENT 215", 100566); - _unicodeCharacterMap.Add("TANGUT COMPONENT 216", 100567); - _unicodeCharacterMap.Add("TANGUT COMPONENT 217", 100568); - _unicodeCharacterMap.Add("TANGUT COMPONENT 218", 100569); - _unicodeCharacterMap.Add("TANGUT COMPONENT 219", 100570); - _unicodeCharacterMap.Add("TANGUT COMPONENT 220", 100571); - _unicodeCharacterMap.Add("TANGUT COMPONENT 221", 100572); - _unicodeCharacterMap.Add("TANGUT COMPONENT 222", 100573); - _unicodeCharacterMap.Add("TANGUT COMPONENT 223", 100574); - _unicodeCharacterMap.Add("TANGUT COMPONENT 224", 100575); - _unicodeCharacterMap.Add("TANGUT COMPONENT 225", 100576); - _unicodeCharacterMap.Add("TANGUT COMPONENT 226", 100577); - _unicodeCharacterMap.Add("TANGUT COMPONENT 227", 100578); - _unicodeCharacterMap.Add("TANGUT COMPONENT 228", 100579); - _unicodeCharacterMap.Add("TANGUT COMPONENT 229", 100580); - _unicodeCharacterMap.Add("TANGUT COMPONENT 230", 100581); - _unicodeCharacterMap.Add("TANGUT COMPONENT 231", 100582); - _unicodeCharacterMap.Add("TANGUT COMPONENT 232", 100583); - _unicodeCharacterMap.Add("TANGUT COMPONENT 233", 100584); - _unicodeCharacterMap.Add("TANGUT COMPONENT 234", 100585); - _unicodeCharacterMap.Add("TANGUT COMPONENT 235", 100586); - _unicodeCharacterMap.Add("TANGUT COMPONENT 236", 100587); - _unicodeCharacterMap.Add("TANGUT COMPONENT 237", 100588); - _unicodeCharacterMap.Add("TANGUT COMPONENT 238", 100589); - _unicodeCharacterMap.Add("TANGUT COMPONENT 239", 100590); - _unicodeCharacterMap.Add("TANGUT COMPONENT 240", 100591); - _unicodeCharacterMap.Add("TANGUT COMPONENT 241", 100592); - _unicodeCharacterMap.Add("TANGUT COMPONENT 242", 100593); - _unicodeCharacterMap.Add("TANGUT COMPONENT 243", 100594); - _unicodeCharacterMap.Add("TANGUT COMPONENT 244", 100595); - _unicodeCharacterMap.Add("TANGUT COMPONENT 245", 100596); - _unicodeCharacterMap.Add("TANGUT COMPONENT 246", 100597); - _unicodeCharacterMap.Add("TANGUT COMPONENT 247", 100598); - _unicodeCharacterMap.Add("TANGUT COMPONENT 248", 100599); - _unicodeCharacterMap.Add("TANGUT COMPONENT 249", 100600); - _unicodeCharacterMap.Add("TANGUT COMPONENT 250", 100601); - _unicodeCharacterMap.Add("TANGUT COMPONENT 251", 100602); - _unicodeCharacterMap.Add("TANGUT COMPONENT 252", 100603); - _unicodeCharacterMap.Add("TANGUT COMPONENT 253", 100604); - _unicodeCharacterMap.Add("TANGUT COMPONENT 254", 100605); - _unicodeCharacterMap.Add("TANGUT COMPONENT 255", 100606); - _unicodeCharacterMap.Add("TANGUT COMPONENT 256", 100607); - _unicodeCharacterMap.Add("TANGUT COMPONENT 257", 100608); - _unicodeCharacterMap.Add("TANGUT COMPONENT 258", 100609); - _unicodeCharacterMap.Add("TANGUT COMPONENT 259", 100610); - _unicodeCharacterMap.Add("TANGUT COMPONENT 260", 100611); - _unicodeCharacterMap.Add("TANGUT COMPONENT 261", 100612); - _unicodeCharacterMap.Add("TANGUT COMPONENT 262", 100613); - _unicodeCharacterMap.Add("TANGUT COMPONENT 263", 100614); - _unicodeCharacterMap.Add("TANGUT COMPONENT 264", 100615); - _unicodeCharacterMap.Add("TANGUT COMPONENT 265", 100616); - _unicodeCharacterMap.Add("TANGUT COMPONENT 266", 100617); - _unicodeCharacterMap.Add("TANGUT COMPONENT 267", 100618); - _unicodeCharacterMap.Add("TANGUT COMPONENT 268", 100619); - _unicodeCharacterMap.Add("TANGUT COMPONENT 269", 100620); - _unicodeCharacterMap.Add("TANGUT COMPONENT 270", 100621); - _unicodeCharacterMap.Add("TANGUT COMPONENT 271", 100622); - _unicodeCharacterMap.Add("TANGUT COMPONENT 272", 100623); - _unicodeCharacterMap.Add("TANGUT COMPONENT 273", 100624); - _unicodeCharacterMap.Add("TANGUT COMPONENT 274", 100625); - _unicodeCharacterMap.Add("TANGUT COMPONENT 275", 100626); - _unicodeCharacterMap.Add("TANGUT COMPONENT 276", 100627); - _unicodeCharacterMap.Add("TANGUT COMPONENT 277", 100628); - _unicodeCharacterMap.Add("TANGUT COMPONENT 278", 100629); - _unicodeCharacterMap.Add("TANGUT COMPONENT 279", 100630); - _unicodeCharacterMap.Add("TANGUT COMPONENT 280", 100631); - _unicodeCharacterMap.Add("TANGUT COMPONENT 281", 100632); - _unicodeCharacterMap.Add("TANGUT COMPONENT 282", 100633); - _unicodeCharacterMap.Add("TANGUT COMPONENT 283", 100634); - _unicodeCharacterMap.Add("TANGUT COMPONENT 284", 100635); - _unicodeCharacterMap.Add("TANGUT COMPONENT 285", 100636); - _unicodeCharacterMap.Add("TANGUT COMPONENT 286", 100637); - _unicodeCharacterMap.Add("TANGUT COMPONENT 287", 100638); - _unicodeCharacterMap.Add("TANGUT COMPONENT 288", 100639); - _unicodeCharacterMap.Add("TANGUT COMPONENT 289", 100640); - _unicodeCharacterMap.Add("TANGUT COMPONENT 290", 100641); - _unicodeCharacterMap.Add("TANGUT COMPONENT 291", 100642); - _unicodeCharacterMap.Add("TANGUT COMPONENT 292", 100643); - _unicodeCharacterMap.Add("TANGUT COMPONENT 293", 100644); - _unicodeCharacterMap.Add("TANGUT COMPONENT 294", 100645); - _unicodeCharacterMap.Add("TANGUT COMPONENT 295", 100646); - _unicodeCharacterMap.Add("TANGUT COMPONENT 296", 100647); - _unicodeCharacterMap.Add("TANGUT COMPONENT 297", 100648); - _unicodeCharacterMap.Add("TANGUT COMPONENT 298", 100649); - _unicodeCharacterMap.Add("TANGUT COMPONENT 299", 100650); - _unicodeCharacterMap.Add("TANGUT COMPONENT 300", 100651); - _unicodeCharacterMap.Add("TANGUT COMPONENT 301", 100652); - _unicodeCharacterMap.Add("TANGUT COMPONENT 302", 100653); - _unicodeCharacterMap.Add("TANGUT COMPONENT 303", 100654); - _unicodeCharacterMap.Add("TANGUT COMPONENT 304", 100655); - _unicodeCharacterMap.Add("TANGUT COMPONENT 305", 100656); - _unicodeCharacterMap.Add("TANGUT COMPONENT 306", 100657); - _unicodeCharacterMap.Add("TANGUT COMPONENT 307", 100658); - _unicodeCharacterMap.Add("TANGUT COMPONENT 308", 100659); - _unicodeCharacterMap.Add("TANGUT COMPONENT 309", 100660); - _unicodeCharacterMap.Add("TANGUT COMPONENT 310", 100661); - _unicodeCharacterMap.Add("TANGUT COMPONENT 311", 100662); - _unicodeCharacterMap.Add("TANGUT COMPONENT 312", 100663); - _unicodeCharacterMap.Add("TANGUT COMPONENT 313", 100664); - _unicodeCharacterMap.Add("TANGUT COMPONENT 314", 100665); - _unicodeCharacterMap.Add("TANGUT COMPONENT 315", 100666); - _unicodeCharacterMap.Add("TANGUT COMPONENT 316", 100667); - _unicodeCharacterMap.Add("TANGUT COMPONENT 317", 100668); - _unicodeCharacterMap.Add("TANGUT COMPONENT 318", 100669); - _unicodeCharacterMap.Add("TANGUT COMPONENT 319", 100670); - _unicodeCharacterMap.Add("TANGUT COMPONENT 320", 100671); - _unicodeCharacterMap.Add("TANGUT COMPONENT 321", 100672); - _unicodeCharacterMap.Add("TANGUT COMPONENT 322", 100673); - _unicodeCharacterMap.Add("TANGUT COMPONENT 323", 100674); - _unicodeCharacterMap.Add("TANGUT COMPONENT 324", 100675); - _unicodeCharacterMap.Add("TANGUT COMPONENT 325", 100676); - _unicodeCharacterMap.Add("TANGUT COMPONENT 326", 100677); - _unicodeCharacterMap.Add("TANGUT COMPONENT 327", 100678); - _unicodeCharacterMap.Add("TANGUT COMPONENT 328", 100679); - _unicodeCharacterMap.Add("TANGUT COMPONENT 329", 100680); - _unicodeCharacterMap.Add("TANGUT COMPONENT 330", 100681); - _unicodeCharacterMap.Add("TANGUT COMPONENT 331", 100682); - _unicodeCharacterMap.Add("TANGUT COMPONENT 332", 100683); - _unicodeCharacterMap.Add("TANGUT COMPONENT 333", 100684); - _unicodeCharacterMap.Add("TANGUT COMPONENT 334", 100685); - _unicodeCharacterMap.Add("TANGUT COMPONENT 335", 100686); - _unicodeCharacterMap.Add("TANGUT COMPONENT 336", 100687); - _unicodeCharacterMap.Add("TANGUT COMPONENT 337", 100688); - _unicodeCharacterMap.Add("TANGUT COMPONENT 338", 100689); - _unicodeCharacterMap.Add("TANGUT COMPONENT 339", 100690); - _unicodeCharacterMap.Add("TANGUT COMPONENT 340", 100691); - _unicodeCharacterMap.Add("TANGUT COMPONENT 341", 100692); - _unicodeCharacterMap.Add("TANGUT COMPONENT 342", 100693); - _unicodeCharacterMap.Add("TANGUT COMPONENT 343", 100694); - _unicodeCharacterMap.Add("TANGUT COMPONENT 344", 100695); - _unicodeCharacterMap.Add("TANGUT COMPONENT 345", 100696); - _unicodeCharacterMap.Add("TANGUT COMPONENT 346", 100697); - _unicodeCharacterMap.Add("TANGUT COMPONENT 347", 100698); - _unicodeCharacterMap.Add("TANGUT COMPONENT 348", 100699); - _unicodeCharacterMap.Add("TANGUT COMPONENT 349", 100700); - _unicodeCharacterMap.Add("TANGUT COMPONENT 350", 100701); - _unicodeCharacterMap.Add("TANGUT COMPONENT 351", 100702); - _unicodeCharacterMap.Add("TANGUT COMPONENT 352", 100703); - _unicodeCharacterMap.Add("TANGUT COMPONENT 353", 100704); - _unicodeCharacterMap.Add("TANGUT COMPONENT 354", 100705); - _unicodeCharacterMap.Add("TANGUT COMPONENT 355", 100706); - _unicodeCharacterMap.Add("TANGUT COMPONENT 356", 100707); - _unicodeCharacterMap.Add("TANGUT COMPONENT 357", 100708); - _unicodeCharacterMap.Add("TANGUT COMPONENT 358", 100709); - _unicodeCharacterMap.Add("TANGUT COMPONENT 359", 100710); - _unicodeCharacterMap.Add("TANGUT COMPONENT 360", 100711); - _unicodeCharacterMap.Add("TANGUT COMPONENT 361", 100712); - _unicodeCharacterMap.Add("TANGUT COMPONENT 362", 100713); - _unicodeCharacterMap.Add("TANGUT COMPONENT 363", 100714); - _unicodeCharacterMap.Add("TANGUT COMPONENT 364", 100715); - _unicodeCharacterMap.Add("TANGUT COMPONENT 365", 100716); - _unicodeCharacterMap.Add("TANGUT COMPONENT 366", 100717); - _unicodeCharacterMap.Add("TANGUT COMPONENT 367", 100718); - _unicodeCharacterMap.Add("TANGUT COMPONENT 368", 100719); - _unicodeCharacterMap.Add("TANGUT COMPONENT 369", 100720); - _unicodeCharacterMap.Add("TANGUT COMPONENT 370", 100721); - _unicodeCharacterMap.Add("TANGUT COMPONENT 371", 100722); - _unicodeCharacterMap.Add("TANGUT COMPONENT 372", 100723); - _unicodeCharacterMap.Add("TANGUT COMPONENT 373", 100724); - _unicodeCharacterMap.Add("TANGUT COMPONENT 374", 100725); - _unicodeCharacterMap.Add("TANGUT COMPONENT 375", 100726); - _unicodeCharacterMap.Add("TANGUT COMPONENT 376", 100727); - _unicodeCharacterMap.Add("TANGUT COMPONENT 377", 100728); - _unicodeCharacterMap.Add("TANGUT COMPONENT 378", 100729); - _unicodeCharacterMap.Add("TANGUT COMPONENT 379", 100730); - _unicodeCharacterMap.Add("TANGUT COMPONENT 380", 100731); - _unicodeCharacterMap.Add("TANGUT COMPONENT 381", 100732); - _unicodeCharacterMap.Add("TANGUT COMPONENT 382", 100733); - _unicodeCharacterMap.Add("TANGUT COMPONENT 383", 100734); - _unicodeCharacterMap.Add("TANGUT COMPONENT 384", 100735); - _unicodeCharacterMap.Add("TANGUT COMPONENT 385", 100736); - _unicodeCharacterMap.Add("TANGUT COMPONENT 386", 100737); - _unicodeCharacterMap.Add("TANGUT COMPONENT 387", 100738); - _unicodeCharacterMap.Add("TANGUT COMPONENT 388", 100739); - _unicodeCharacterMap.Add("TANGUT COMPONENT 389", 100740); - _unicodeCharacterMap.Add("TANGUT COMPONENT 390", 100741); - _unicodeCharacterMap.Add("TANGUT COMPONENT 391", 100742); - _unicodeCharacterMap.Add("TANGUT COMPONENT 392", 100743); - _unicodeCharacterMap.Add("TANGUT COMPONENT 393", 100744); - _unicodeCharacterMap.Add("TANGUT COMPONENT 394", 100745); - _unicodeCharacterMap.Add("TANGUT COMPONENT 395", 100746); - _unicodeCharacterMap.Add("TANGUT COMPONENT 396", 100747); - _unicodeCharacterMap.Add("TANGUT COMPONENT 397", 100748); - _unicodeCharacterMap.Add("TANGUT COMPONENT 398", 100749); - _unicodeCharacterMap.Add("TANGUT COMPONENT 399", 100750); - _unicodeCharacterMap.Add("TANGUT COMPONENT 400", 100751); - _unicodeCharacterMap.Add("TANGUT COMPONENT 401", 100752); - _unicodeCharacterMap.Add("TANGUT COMPONENT 402", 100753); - _unicodeCharacterMap.Add("TANGUT COMPONENT 403", 100754); - _unicodeCharacterMap.Add("TANGUT COMPONENT 404", 100755); - _unicodeCharacterMap.Add("TANGUT COMPONENT 405", 100756); - _unicodeCharacterMap.Add("TANGUT COMPONENT 406", 100757); - _unicodeCharacterMap.Add("TANGUT COMPONENT 407", 100758); - _unicodeCharacterMap.Add("TANGUT COMPONENT 408", 100759); - _unicodeCharacterMap.Add("TANGUT COMPONENT 409", 100760); - _unicodeCharacterMap.Add("TANGUT COMPONENT 410", 100761); - _unicodeCharacterMap.Add("TANGUT COMPONENT 411", 100762); - _unicodeCharacterMap.Add("TANGUT COMPONENT 412", 100763); - _unicodeCharacterMap.Add("TANGUT COMPONENT 413", 100764); - _unicodeCharacterMap.Add("TANGUT COMPONENT 414", 100765); - _unicodeCharacterMap.Add("TANGUT COMPONENT 415", 100766); - _unicodeCharacterMap.Add("TANGUT COMPONENT 416", 100767); - _unicodeCharacterMap.Add("TANGUT COMPONENT 417", 100768); - _unicodeCharacterMap.Add("TANGUT COMPONENT 418", 100769); - _unicodeCharacterMap.Add("TANGUT COMPONENT 419", 100770); - _unicodeCharacterMap.Add("TANGUT COMPONENT 420", 100771); - _unicodeCharacterMap.Add("TANGUT COMPONENT 421", 100772); - _unicodeCharacterMap.Add("TANGUT COMPONENT 422", 100773); - _unicodeCharacterMap.Add("TANGUT COMPONENT 423", 100774); - _unicodeCharacterMap.Add("TANGUT COMPONENT 424", 100775); - _unicodeCharacterMap.Add("TANGUT COMPONENT 425", 100776); - _unicodeCharacterMap.Add("TANGUT COMPONENT 426", 100777); - _unicodeCharacterMap.Add("TANGUT COMPONENT 427", 100778); - _unicodeCharacterMap.Add("TANGUT COMPONENT 428", 100779); - _unicodeCharacterMap.Add("TANGUT COMPONENT 429", 100780); - _unicodeCharacterMap.Add("TANGUT COMPONENT 430", 100781); - _unicodeCharacterMap.Add("TANGUT COMPONENT 431", 100782); - _unicodeCharacterMap.Add("TANGUT COMPONENT 432", 100783); - _unicodeCharacterMap.Add("TANGUT COMPONENT 433", 100784); - _unicodeCharacterMap.Add("TANGUT COMPONENT 434", 100785); - _unicodeCharacterMap.Add("TANGUT COMPONENT 435", 100786); - _unicodeCharacterMap.Add("TANGUT COMPONENT 436", 100787); - _unicodeCharacterMap.Add("TANGUT COMPONENT 437", 100788); - _unicodeCharacterMap.Add("TANGUT COMPONENT 438", 100789); - _unicodeCharacterMap.Add("TANGUT COMPONENT 439", 100790); - _unicodeCharacterMap.Add("TANGUT COMPONENT 440", 100791); - _unicodeCharacterMap.Add("TANGUT COMPONENT 441", 100792); - _unicodeCharacterMap.Add("TANGUT COMPONENT 442", 100793); - _unicodeCharacterMap.Add("TANGUT COMPONENT 443", 100794); - _unicodeCharacterMap.Add("TANGUT COMPONENT 444", 100795); - _unicodeCharacterMap.Add("TANGUT COMPONENT 445", 100796); - _unicodeCharacterMap.Add("TANGUT COMPONENT 446", 100797); - _unicodeCharacterMap.Add("TANGUT COMPONENT 447", 100798); - _unicodeCharacterMap.Add("TANGUT COMPONENT 448", 100799); - _unicodeCharacterMap.Add("TANGUT COMPONENT 449", 100800); - _unicodeCharacterMap.Add("TANGUT COMPONENT 450", 100801); - _unicodeCharacterMap.Add("TANGUT COMPONENT 451", 100802); - _unicodeCharacterMap.Add("TANGUT COMPONENT 452", 100803); - _unicodeCharacterMap.Add("TANGUT COMPONENT 453", 100804); - _unicodeCharacterMap.Add("TANGUT COMPONENT 454", 100805); - _unicodeCharacterMap.Add("TANGUT COMPONENT 455", 100806); - _unicodeCharacterMap.Add("TANGUT COMPONENT 456", 100807); - _unicodeCharacterMap.Add("TANGUT COMPONENT 457", 100808); - _unicodeCharacterMap.Add("TANGUT COMPONENT 458", 100809); - _unicodeCharacterMap.Add("TANGUT COMPONENT 459", 100810); - _unicodeCharacterMap.Add("TANGUT COMPONENT 460", 100811); - _unicodeCharacterMap.Add("TANGUT COMPONENT 461", 100812); - _unicodeCharacterMap.Add("TANGUT COMPONENT 462", 100813); - _unicodeCharacterMap.Add("TANGUT COMPONENT 463", 100814); - _unicodeCharacterMap.Add("TANGUT COMPONENT 464", 100815); - _unicodeCharacterMap.Add("TANGUT COMPONENT 465", 100816); - _unicodeCharacterMap.Add("TANGUT COMPONENT 466", 100817); - _unicodeCharacterMap.Add("TANGUT COMPONENT 467", 100818); - _unicodeCharacterMap.Add("TANGUT COMPONENT 468", 100819); - _unicodeCharacterMap.Add("TANGUT COMPONENT 469", 100820); - _unicodeCharacterMap.Add("TANGUT COMPONENT 470", 100821); - _unicodeCharacterMap.Add("TANGUT COMPONENT 471", 100822); - _unicodeCharacterMap.Add("TANGUT COMPONENT 472", 100823); - _unicodeCharacterMap.Add("TANGUT COMPONENT 473", 100824); - _unicodeCharacterMap.Add("TANGUT COMPONENT 474", 100825); - _unicodeCharacterMap.Add("TANGUT COMPONENT 475", 100826); - _unicodeCharacterMap.Add("TANGUT COMPONENT 476", 100827); - _unicodeCharacterMap.Add("TANGUT COMPONENT 477", 100828); - _unicodeCharacterMap.Add("TANGUT COMPONENT 478", 100829); - _unicodeCharacterMap.Add("TANGUT COMPONENT 479", 100830); - _unicodeCharacterMap.Add("TANGUT COMPONENT 480", 100831); - _unicodeCharacterMap.Add("TANGUT COMPONENT 481", 100832); - _unicodeCharacterMap.Add("TANGUT COMPONENT 482", 100833); - _unicodeCharacterMap.Add("TANGUT COMPONENT 483", 100834); - _unicodeCharacterMap.Add("TANGUT COMPONENT 484", 100835); - _unicodeCharacterMap.Add("TANGUT COMPONENT 485", 100836); - _unicodeCharacterMap.Add("TANGUT COMPONENT 486", 100837); - _unicodeCharacterMap.Add("TANGUT COMPONENT 487", 100838); - _unicodeCharacterMap.Add("TANGUT COMPONENT 488", 100839); - _unicodeCharacterMap.Add("TANGUT COMPONENT 489", 100840); - _unicodeCharacterMap.Add("TANGUT COMPONENT 490", 100841); - _unicodeCharacterMap.Add("TANGUT COMPONENT 491", 100842); - _unicodeCharacterMap.Add("TANGUT COMPONENT 492", 100843); - _unicodeCharacterMap.Add("TANGUT COMPONENT 493", 100844); - _unicodeCharacterMap.Add("TANGUT COMPONENT 494", 100845); - _unicodeCharacterMap.Add("TANGUT COMPONENT 495", 100846); - _unicodeCharacterMap.Add("TANGUT COMPONENT 496", 100847); - _unicodeCharacterMap.Add("TANGUT COMPONENT 497", 100848); - _unicodeCharacterMap.Add("TANGUT COMPONENT 498", 100849); - _unicodeCharacterMap.Add("TANGUT COMPONENT 499", 100850); - _unicodeCharacterMap.Add("TANGUT COMPONENT 500", 100851); - _unicodeCharacterMap.Add("TANGUT COMPONENT 501", 100852); - _unicodeCharacterMap.Add("TANGUT COMPONENT 502", 100853); - _unicodeCharacterMap.Add("TANGUT COMPONENT 503", 100854); - _unicodeCharacterMap.Add("TANGUT COMPONENT 504", 100855); - _unicodeCharacterMap.Add("TANGUT COMPONENT 505", 100856); - _unicodeCharacterMap.Add("TANGUT COMPONENT 506", 100857); - _unicodeCharacterMap.Add("TANGUT COMPONENT 507", 100858); - _unicodeCharacterMap.Add("TANGUT COMPONENT 508", 100859); - _unicodeCharacterMap.Add("TANGUT COMPONENT 509", 100860); - _unicodeCharacterMap.Add("TANGUT COMPONENT 510", 100861); - _unicodeCharacterMap.Add("TANGUT COMPONENT 511", 100862); - _unicodeCharacterMap.Add("TANGUT COMPONENT 512", 100863); - _unicodeCharacterMap.Add("TANGUT COMPONENT 513", 100864); - _unicodeCharacterMap.Add("TANGUT COMPONENT 514", 100865); - _unicodeCharacterMap.Add("TANGUT COMPONENT 515", 100866); - _unicodeCharacterMap.Add("TANGUT COMPONENT 516", 100867); - _unicodeCharacterMap.Add("TANGUT COMPONENT 517", 100868); - _unicodeCharacterMap.Add("TANGUT COMPONENT 518", 100869); - _unicodeCharacterMap.Add("TANGUT COMPONENT 519", 100870); - _unicodeCharacterMap.Add("TANGUT COMPONENT 520", 100871); - _unicodeCharacterMap.Add("TANGUT COMPONENT 521", 100872); - _unicodeCharacterMap.Add("TANGUT COMPONENT 522", 100873); - _unicodeCharacterMap.Add("TANGUT COMPONENT 523", 100874); - _unicodeCharacterMap.Add("TANGUT COMPONENT 524", 100875); - _unicodeCharacterMap.Add("TANGUT COMPONENT 525", 100876); - _unicodeCharacterMap.Add("TANGUT COMPONENT 526", 100877); - _unicodeCharacterMap.Add("TANGUT COMPONENT 527", 100878); - _unicodeCharacterMap.Add("TANGUT COMPONENT 528", 100879); - _unicodeCharacterMap.Add("TANGUT COMPONENT 529", 100880); - _unicodeCharacterMap.Add("TANGUT COMPONENT 530", 100881); - _unicodeCharacterMap.Add("TANGUT COMPONENT 531", 100882); - _unicodeCharacterMap.Add("TANGUT COMPONENT 532", 100883); - _unicodeCharacterMap.Add("TANGUT COMPONENT 533", 100884); - _unicodeCharacterMap.Add("TANGUT COMPONENT 534", 100885); - _unicodeCharacterMap.Add("TANGUT COMPONENT 535", 100886); - _unicodeCharacterMap.Add("TANGUT COMPONENT 536", 100887); - _unicodeCharacterMap.Add("TANGUT COMPONENT 537", 100888); - _unicodeCharacterMap.Add("TANGUT COMPONENT 538", 100889); - _unicodeCharacterMap.Add("TANGUT COMPONENT 539", 100890); - _unicodeCharacterMap.Add("TANGUT COMPONENT 540", 100891); - _unicodeCharacterMap.Add("TANGUT COMPONENT 541", 100892); - _unicodeCharacterMap.Add("TANGUT COMPONENT 542", 100893); - _unicodeCharacterMap.Add("TANGUT COMPONENT 543", 100894); - _unicodeCharacterMap.Add("TANGUT COMPONENT 544", 100895); - _unicodeCharacterMap.Add("TANGUT COMPONENT 545", 100896); - _unicodeCharacterMap.Add("TANGUT COMPONENT 546", 100897); - _unicodeCharacterMap.Add("TANGUT COMPONENT 547", 100898); - _unicodeCharacterMap.Add("TANGUT COMPONENT 548", 100899); - _unicodeCharacterMap.Add("TANGUT COMPONENT 549", 100900); - _unicodeCharacterMap.Add("TANGUT COMPONENT 550", 100901); - _unicodeCharacterMap.Add("TANGUT COMPONENT 551", 100902); - _unicodeCharacterMap.Add("TANGUT COMPONENT 552", 100903); - _unicodeCharacterMap.Add("TANGUT COMPONENT 553", 100904); - _unicodeCharacterMap.Add("TANGUT COMPONENT 554", 100905); - _unicodeCharacterMap.Add("TANGUT COMPONENT 555", 100906); - _unicodeCharacterMap.Add("TANGUT COMPONENT 556", 100907); - _unicodeCharacterMap.Add("TANGUT COMPONENT 557", 100908); - _unicodeCharacterMap.Add("TANGUT COMPONENT 558", 100909); - _unicodeCharacterMap.Add("TANGUT COMPONENT 559", 100910); - _unicodeCharacterMap.Add("TANGUT COMPONENT 560", 100911); - _unicodeCharacterMap.Add("TANGUT COMPONENT 561", 100912); - _unicodeCharacterMap.Add("TANGUT COMPONENT 562", 100913); - _unicodeCharacterMap.Add("TANGUT COMPONENT 563", 100914); - _unicodeCharacterMap.Add("TANGUT COMPONENT 564", 100915); - _unicodeCharacterMap.Add("TANGUT COMPONENT 565", 100916); - _unicodeCharacterMap.Add("TANGUT COMPONENT 566", 100917); - _unicodeCharacterMap.Add("TANGUT COMPONENT 567", 100918); - _unicodeCharacterMap.Add("TANGUT COMPONENT 568", 100919); - _unicodeCharacterMap.Add("TANGUT COMPONENT 569", 100920); - _unicodeCharacterMap.Add("TANGUT COMPONENT 570", 100921); - _unicodeCharacterMap.Add("TANGUT COMPONENT 571", 100922); - _unicodeCharacterMap.Add("TANGUT COMPONENT 572", 100923); - _unicodeCharacterMap.Add("TANGUT COMPONENT 573", 100924); - _unicodeCharacterMap.Add("TANGUT COMPONENT 574", 100925); - _unicodeCharacterMap.Add("TANGUT COMPONENT 575", 100926); - _unicodeCharacterMap.Add("TANGUT COMPONENT 576", 100927); - _unicodeCharacterMap.Add("TANGUT COMPONENT 577", 100928); - _unicodeCharacterMap.Add("TANGUT COMPONENT 578", 100929); - _unicodeCharacterMap.Add("TANGUT COMPONENT 579", 100930); - _unicodeCharacterMap.Add("TANGUT COMPONENT 580", 100931); - _unicodeCharacterMap.Add("TANGUT COMPONENT 581", 100932); - _unicodeCharacterMap.Add("TANGUT COMPONENT 582", 100933); - _unicodeCharacterMap.Add("TANGUT COMPONENT 583", 100934); - _unicodeCharacterMap.Add("TANGUT COMPONENT 584", 100935); - _unicodeCharacterMap.Add("TANGUT COMPONENT 585", 100936); - _unicodeCharacterMap.Add("TANGUT COMPONENT 586", 100937); - _unicodeCharacterMap.Add("TANGUT COMPONENT 587", 100938); - _unicodeCharacterMap.Add("TANGUT COMPONENT 588", 100939); - _unicodeCharacterMap.Add("TANGUT COMPONENT 589", 100940); - _unicodeCharacterMap.Add("TANGUT COMPONENT 590", 100941); - _unicodeCharacterMap.Add("TANGUT COMPONENT 591", 100942); - _unicodeCharacterMap.Add("TANGUT COMPONENT 592", 100943); - _unicodeCharacterMap.Add("TANGUT COMPONENT 593", 100944); - _unicodeCharacterMap.Add("TANGUT COMPONENT 594", 100945); - _unicodeCharacterMap.Add("TANGUT COMPONENT 595", 100946); - _unicodeCharacterMap.Add("TANGUT COMPONENT 596", 100947); - _unicodeCharacterMap.Add("TANGUT COMPONENT 597", 100948); - _unicodeCharacterMap.Add("TANGUT COMPONENT 598", 100949); - _unicodeCharacterMap.Add("TANGUT COMPONENT 599", 100950); - _unicodeCharacterMap.Add("TANGUT COMPONENT 600", 100951); - _unicodeCharacterMap.Add("TANGUT COMPONENT 601", 100952); - _unicodeCharacterMap.Add("TANGUT COMPONENT 602", 100953); - _unicodeCharacterMap.Add("TANGUT COMPONENT 603", 100954); - _unicodeCharacterMap.Add("TANGUT COMPONENT 604", 100955); - _unicodeCharacterMap.Add("TANGUT COMPONENT 605", 100956); - _unicodeCharacterMap.Add("TANGUT COMPONENT 606", 100957); - _unicodeCharacterMap.Add("TANGUT COMPONENT 607", 100958); - _unicodeCharacterMap.Add("TANGUT COMPONENT 608", 100959); - _unicodeCharacterMap.Add("TANGUT COMPONENT 609", 100960); - _unicodeCharacterMap.Add("TANGUT COMPONENT 610", 100961); - _unicodeCharacterMap.Add("TANGUT COMPONENT 611", 100962); - _unicodeCharacterMap.Add("TANGUT COMPONENT 612", 100963); - _unicodeCharacterMap.Add("TANGUT COMPONENT 613", 100964); - _unicodeCharacterMap.Add("TANGUT COMPONENT 614", 100965); - _unicodeCharacterMap.Add("TANGUT COMPONENT 615", 100966); - _unicodeCharacterMap.Add("TANGUT COMPONENT 616", 100967); - _unicodeCharacterMap.Add("TANGUT COMPONENT 617", 100968); - _unicodeCharacterMap.Add("TANGUT COMPONENT 618", 100969); - _unicodeCharacterMap.Add("TANGUT COMPONENT 619", 100970); - _unicodeCharacterMap.Add("TANGUT COMPONENT 620", 100971); - _unicodeCharacterMap.Add("TANGUT COMPONENT 621", 100972); - _unicodeCharacterMap.Add("TANGUT COMPONENT 622", 100973); - _unicodeCharacterMap.Add("TANGUT COMPONENT 623", 100974); - _unicodeCharacterMap.Add("TANGUT COMPONENT 624", 100975); - _unicodeCharacterMap.Add("TANGUT COMPONENT 625", 100976); - _unicodeCharacterMap.Add("TANGUT COMPONENT 626", 100977); - _unicodeCharacterMap.Add("TANGUT COMPONENT 627", 100978); - _unicodeCharacterMap.Add("TANGUT COMPONENT 628", 100979); - _unicodeCharacterMap.Add("TANGUT COMPONENT 629", 100980); - _unicodeCharacterMap.Add("TANGUT COMPONENT 630", 100981); - _unicodeCharacterMap.Add("TANGUT COMPONENT 631", 100982); - _unicodeCharacterMap.Add("TANGUT COMPONENT 632", 100983); - _unicodeCharacterMap.Add("TANGUT COMPONENT 633", 100984); - _unicodeCharacterMap.Add("TANGUT COMPONENT 634", 100985); - _unicodeCharacterMap.Add("TANGUT COMPONENT 635", 100986); - _unicodeCharacterMap.Add("TANGUT COMPONENT 636", 100987); - _unicodeCharacterMap.Add("TANGUT COMPONENT 637", 100988); - _unicodeCharacterMap.Add("TANGUT COMPONENT 638", 100989); - _unicodeCharacterMap.Add("TANGUT COMPONENT 639", 100990); - _unicodeCharacterMap.Add("TANGUT COMPONENT 640", 100991); - _unicodeCharacterMap.Add("TANGUT COMPONENT 641", 100992); - _unicodeCharacterMap.Add("TANGUT COMPONENT 642", 100993); - _unicodeCharacterMap.Add("TANGUT COMPONENT 643", 100994); - _unicodeCharacterMap.Add("TANGUT COMPONENT 644", 100995); - _unicodeCharacterMap.Add("TANGUT COMPONENT 645", 100996); - _unicodeCharacterMap.Add("TANGUT COMPONENT 646", 100997); - _unicodeCharacterMap.Add("TANGUT COMPONENT 647", 100998); - _unicodeCharacterMap.Add("TANGUT COMPONENT 648", 100999); - _unicodeCharacterMap.Add("TANGUT COMPONENT 649", 101000); - _unicodeCharacterMap.Add("TANGUT COMPONENT 650", 101001); - _unicodeCharacterMap.Add("TANGUT COMPONENT 651", 101002); - _unicodeCharacterMap.Add("TANGUT COMPONENT 652", 101003); - _unicodeCharacterMap.Add("TANGUT COMPONENT 653", 101004); - _unicodeCharacterMap.Add("TANGUT COMPONENT 654", 101005); - _unicodeCharacterMap.Add("TANGUT COMPONENT 655", 101006); - _unicodeCharacterMap.Add("TANGUT COMPONENT 656", 101007); - _unicodeCharacterMap.Add("TANGUT COMPONENT 657", 101008); - _unicodeCharacterMap.Add("TANGUT COMPONENT 658", 101009); - _unicodeCharacterMap.Add("TANGUT COMPONENT 659", 101010); - _unicodeCharacterMap.Add("TANGUT COMPONENT 660", 101011); - _unicodeCharacterMap.Add("TANGUT COMPONENT 661", 101012); - _unicodeCharacterMap.Add("TANGUT COMPONENT 662", 101013); - _unicodeCharacterMap.Add("TANGUT COMPONENT 663", 101014); - _unicodeCharacterMap.Add("TANGUT COMPONENT 664", 101015); - _unicodeCharacterMap.Add("TANGUT COMPONENT 665", 101016); - _unicodeCharacterMap.Add("TANGUT COMPONENT 666", 101017); - _unicodeCharacterMap.Add("TANGUT COMPONENT 667", 101018); - _unicodeCharacterMap.Add("TANGUT COMPONENT 668", 101019); - _unicodeCharacterMap.Add("TANGUT COMPONENT 669", 101020); - _unicodeCharacterMap.Add("TANGUT COMPONENT 670", 101021); - _unicodeCharacterMap.Add("TANGUT COMPONENT 671", 101022); - _unicodeCharacterMap.Add("TANGUT COMPONENT 672", 101023); - _unicodeCharacterMap.Add("TANGUT COMPONENT 673", 101024); - _unicodeCharacterMap.Add("TANGUT COMPONENT 674", 101025); - _unicodeCharacterMap.Add("TANGUT COMPONENT 675", 101026); - _unicodeCharacterMap.Add("TANGUT COMPONENT 676", 101027); - _unicodeCharacterMap.Add("TANGUT COMPONENT 677", 101028); - _unicodeCharacterMap.Add("TANGUT COMPONENT 678", 101029); - _unicodeCharacterMap.Add("TANGUT COMPONENT 679", 101030); - _unicodeCharacterMap.Add("TANGUT COMPONENT 680", 101031); - _unicodeCharacterMap.Add("TANGUT COMPONENT 681", 101032); - _unicodeCharacterMap.Add("TANGUT COMPONENT 682", 101033); - _unicodeCharacterMap.Add("TANGUT COMPONENT 683", 101034); - _unicodeCharacterMap.Add("TANGUT COMPONENT 684", 101035); - _unicodeCharacterMap.Add("TANGUT COMPONENT 685", 101036); - _unicodeCharacterMap.Add("TANGUT COMPONENT 686", 101037); - _unicodeCharacterMap.Add("TANGUT COMPONENT 687", 101038); - _unicodeCharacterMap.Add("TANGUT COMPONENT 688", 101039); - _unicodeCharacterMap.Add("TANGUT COMPONENT 689", 101040); - _unicodeCharacterMap.Add("TANGUT COMPONENT 690", 101041); - _unicodeCharacterMap.Add("TANGUT COMPONENT 691", 101042); - _unicodeCharacterMap.Add("TANGUT COMPONENT 692", 101043); - _unicodeCharacterMap.Add("TANGUT COMPONENT 693", 101044); - _unicodeCharacterMap.Add("TANGUT COMPONENT 694", 101045); - _unicodeCharacterMap.Add("TANGUT COMPONENT 695", 101046); - _unicodeCharacterMap.Add("TANGUT COMPONENT 696", 101047); - _unicodeCharacterMap.Add("TANGUT COMPONENT 697", 101048); - _unicodeCharacterMap.Add("TANGUT COMPONENT 698", 101049); - _unicodeCharacterMap.Add("TANGUT COMPONENT 699", 101050); - _unicodeCharacterMap.Add("TANGUT COMPONENT 700", 101051); - _unicodeCharacterMap.Add("TANGUT COMPONENT 701", 101052); - _unicodeCharacterMap.Add("TANGUT COMPONENT 702", 101053); - _unicodeCharacterMap.Add("TANGUT COMPONENT 703", 101054); - _unicodeCharacterMap.Add("TANGUT COMPONENT 704", 101055); - _unicodeCharacterMap.Add("TANGUT COMPONENT 705", 101056); - _unicodeCharacterMap.Add("TANGUT COMPONENT 706", 101057); - _unicodeCharacterMap.Add("TANGUT COMPONENT 707", 101058); - _unicodeCharacterMap.Add("TANGUT COMPONENT 708", 101059); - _unicodeCharacterMap.Add("TANGUT COMPONENT 709", 101060); - _unicodeCharacterMap.Add("TANGUT COMPONENT 710", 101061); - _unicodeCharacterMap.Add("TANGUT COMPONENT 711", 101062); - _unicodeCharacterMap.Add("TANGUT COMPONENT 712", 101063); - _unicodeCharacterMap.Add("TANGUT COMPONENT 713", 101064); - _unicodeCharacterMap.Add("TANGUT COMPONENT 714", 101065); - _unicodeCharacterMap.Add("TANGUT COMPONENT 715", 101066); - _unicodeCharacterMap.Add("TANGUT COMPONENT 716", 101067); - _unicodeCharacterMap.Add("TANGUT COMPONENT 717", 101068); - _unicodeCharacterMap.Add("TANGUT COMPONENT 718", 101069); - _unicodeCharacterMap.Add("TANGUT COMPONENT 719", 101070); - _unicodeCharacterMap.Add("TANGUT COMPONENT 720", 101071); - _unicodeCharacterMap.Add("TANGUT COMPONENT 721", 101072); - _unicodeCharacterMap.Add("TANGUT COMPONENT 722", 101073); - _unicodeCharacterMap.Add("TANGUT COMPONENT 723", 101074); - _unicodeCharacterMap.Add("TANGUT COMPONENT 724", 101075); - _unicodeCharacterMap.Add("TANGUT COMPONENT 725", 101076); - _unicodeCharacterMap.Add("TANGUT COMPONENT 726", 101077); - _unicodeCharacterMap.Add("TANGUT COMPONENT 727", 101078); - _unicodeCharacterMap.Add("TANGUT COMPONENT 728", 101079); - _unicodeCharacterMap.Add("TANGUT COMPONENT 729", 101080); - _unicodeCharacterMap.Add("TANGUT COMPONENT 730", 101081); - _unicodeCharacterMap.Add("TANGUT COMPONENT 731", 101082); - _unicodeCharacterMap.Add("TANGUT COMPONENT 732", 101083); - _unicodeCharacterMap.Add("TANGUT COMPONENT 733", 101084); - _unicodeCharacterMap.Add("TANGUT COMPONENT 734", 101085); - _unicodeCharacterMap.Add("TANGUT COMPONENT 735", 101086); - _unicodeCharacterMap.Add("TANGUT COMPONENT 736", 101087); - _unicodeCharacterMap.Add("TANGUT COMPONENT 737", 101088); - _unicodeCharacterMap.Add("TANGUT COMPONENT 738", 101089); - _unicodeCharacterMap.Add("TANGUT COMPONENT 739", 101090); - _unicodeCharacterMap.Add("TANGUT COMPONENT 740", 101091); - _unicodeCharacterMap.Add("TANGUT COMPONENT 741", 101092); - _unicodeCharacterMap.Add("TANGUT COMPONENT 742", 101093); - _unicodeCharacterMap.Add("TANGUT COMPONENT 743", 101094); - _unicodeCharacterMap.Add("TANGUT COMPONENT 744", 101095); - _unicodeCharacterMap.Add("TANGUT COMPONENT 745", 101096); - _unicodeCharacterMap.Add("TANGUT COMPONENT 746", 101097); - _unicodeCharacterMap.Add("TANGUT COMPONENT 747", 101098); - _unicodeCharacterMap.Add("TANGUT COMPONENT 748", 101099); - _unicodeCharacterMap.Add("TANGUT COMPONENT 749", 101100); - _unicodeCharacterMap.Add("TANGUT COMPONENT 750", 101101); - _unicodeCharacterMap.Add("TANGUT COMPONENT 751", 101102); - _unicodeCharacterMap.Add("TANGUT COMPONENT 752", 101103); - _unicodeCharacterMap.Add("TANGUT COMPONENT 753", 101104); - _unicodeCharacterMap.Add("TANGUT COMPONENT 754", 101105); - _unicodeCharacterMap.Add("TANGUT COMPONENT 755", 101106); - _unicodeCharacterMap.Add("KATAKANA LETTER ARCHAIC E", 110592); - _unicodeCharacterMap.Add("HIRAGANA LETTER ARCHAIC YE", 110593); - _unicodeCharacterMap.Add("DUPLOYAN LETTER H", 113664); - _unicodeCharacterMap.Add("DUPLOYAN LETTER X", 113665); - _unicodeCharacterMap.Add("DUPLOYAN LETTER P", 113666); - _unicodeCharacterMap.Add("DUPLOYAN LETTER T", 113667); - _unicodeCharacterMap.Add("DUPLOYAN LETTER F", 113668); - _unicodeCharacterMap.Add("DUPLOYAN LETTER K", 113669); - _unicodeCharacterMap.Add("DUPLOYAN LETTER L", 113670); - _unicodeCharacterMap.Add("DUPLOYAN LETTER B", 113671); - _unicodeCharacterMap.Add("DUPLOYAN LETTER D", 113672); - _unicodeCharacterMap.Add("DUPLOYAN LETTER V", 113673); - _unicodeCharacterMap.Add("DUPLOYAN LETTER G", 113674); - _unicodeCharacterMap.Add("DUPLOYAN LETTER R", 113675); - _unicodeCharacterMap.Add("DUPLOYAN LETTER P N", 113676); - _unicodeCharacterMap.Add("DUPLOYAN LETTER D S", 113677); - _unicodeCharacterMap.Add("DUPLOYAN LETTER F N", 113678); - _unicodeCharacterMap.Add("DUPLOYAN LETTER K M", 113679); - _unicodeCharacterMap.Add("DUPLOYAN LETTER R S", 113680); - _unicodeCharacterMap.Add("DUPLOYAN LETTER TH", 113681); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN DH", 113682); - _unicodeCharacterMap.Add("DUPLOYAN LETTER DH", 113683); - _unicodeCharacterMap.Add("DUPLOYAN LETTER KK", 113684); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN J", 113685); - _unicodeCharacterMap.Add("DUPLOYAN LETTER HL", 113686); - _unicodeCharacterMap.Add("DUPLOYAN LETTER LH", 113687); - _unicodeCharacterMap.Add("DUPLOYAN LETTER RH", 113688); - _unicodeCharacterMap.Add("DUPLOYAN LETTER M", 113689); - _unicodeCharacterMap.Add("DUPLOYAN LETTER N", 113690); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J", 113691); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S", 113692); - _unicodeCharacterMap.Add("DUPLOYAN LETTER M N", 113693); - _unicodeCharacterMap.Add("DUPLOYAN LETTER N M", 113694); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J M", 113695); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S J", 113696); - _unicodeCharacterMap.Add("DUPLOYAN LETTER M WITH DOT", 113697); - _unicodeCharacterMap.Add("DUPLOYAN LETTER N WITH DOT", 113698); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J WITH DOT", 113699); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE", 113700); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S WITH DOT", 113701); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S WITH DOT BELOW", 113702); - _unicodeCharacterMap.Add("DUPLOYAN LETTER M S", 113703); - _unicodeCharacterMap.Add("DUPLOYAN LETTER N S", 113704); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J S", 113705); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S S", 113706); - _unicodeCharacterMap.Add("DUPLOYAN LETTER M N S", 113707); - _unicodeCharacterMap.Add("DUPLOYAN LETTER N M S", 113708); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J M S", 113709); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S J S", 113710); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J S WITH DOT", 113711); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J N", 113712); - _unicodeCharacterMap.Add("DUPLOYAN LETTER J N S", 113713); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S T", 113714); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S T R", 113715); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S P", 113716); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S P R", 113717); - _unicodeCharacterMap.Add("DUPLOYAN LETTER T S", 113718); - _unicodeCharacterMap.Add("DUPLOYAN LETTER T R S", 113719); - _unicodeCharacterMap.Add("DUPLOYAN LETTER W", 113720); - _unicodeCharacterMap.Add("DUPLOYAN LETTER WH", 113721); - _unicodeCharacterMap.Add("DUPLOYAN LETTER W R", 113722); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S N", 113723); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S M", 113724); - _unicodeCharacterMap.Add("DUPLOYAN LETTER K R S", 113725); - _unicodeCharacterMap.Add("DUPLOYAN LETTER G R S", 113726); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S K", 113727); - _unicodeCharacterMap.Add("DUPLOYAN LETTER S K R", 113728); - _unicodeCharacterMap.Add("DUPLOYAN LETTER A", 113729); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN OW", 113730); - _unicodeCharacterMap.Add("DUPLOYAN LETTER OA", 113731); - _unicodeCharacterMap.Add("DUPLOYAN LETTER O", 113732); - _unicodeCharacterMap.Add("DUPLOYAN LETTER AOU", 113733); - _unicodeCharacterMap.Add("DUPLOYAN LETTER I", 113734); - _unicodeCharacterMap.Add("DUPLOYAN LETTER E", 113735); - _unicodeCharacterMap.Add("DUPLOYAN LETTER IE", 113736); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SHORT I", 113737); - _unicodeCharacterMap.Add("DUPLOYAN LETTER UI", 113738); - _unicodeCharacterMap.Add("DUPLOYAN LETTER EE", 113739); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN EH", 113740); - _unicodeCharacterMap.Add("DUPLOYAN LETTER ROMANIAN I", 113741); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN EE", 113742); - _unicodeCharacterMap.Add("DUPLOYAN LETTER LONG I", 113743); - _unicodeCharacterMap.Add("DUPLOYAN LETTER YE", 113744); - _unicodeCharacterMap.Add("DUPLOYAN LETTER U", 113745); - _unicodeCharacterMap.Add("DUPLOYAN LETTER EU", 113746); - _unicodeCharacterMap.Add("DUPLOYAN LETTER XW", 113747); - _unicodeCharacterMap.Add("DUPLOYAN LETTER U N", 113748); - _unicodeCharacterMap.Add("DUPLOYAN LETTER LONG U", 113749); - _unicodeCharacterMap.Add("DUPLOYAN LETTER ROMANIAN U", 113750); - _unicodeCharacterMap.Add("DUPLOYAN LETTER UH", 113751); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN U", 113752); - _unicodeCharacterMap.Add("DUPLOYAN LETTER OOH", 113753); - _unicodeCharacterMap.Add("DUPLOYAN LETTER OW", 113754); - _unicodeCharacterMap.Add("DUPLOYAN LETTER OU", 113755); - _unicodeCharacterMap.Add("DUPLOYAN LETTER WA", 113756); - _unicodeCharacterMap.Add("DUPLOYAN LETTER WO", 113757); - _unicodeCharacterMap.Add("DUPLOYAN LETTER WI", 113758); - _unicodeCharacterMap.Add("DUPLOYAN LETTER WEI", 113759); - _unicodeCharacterMap.Add("DUPLOYAN LETTER WOW", 113760); - _unicodeCharacterMap.Add("DUPLOYAN LETTER NASAL U", 113761); - _unicodeCharacterMap.Add("DUPLOYAN LETTER NASAL O", 113762); - _unicodeCharacterMap.Add("DUPLOYAN LETTER NASAL I", 113763); - _unicodeCharacterMap.Add("DUPLOYAN LETTER NASAL A", 113764); - _unicodeCharacterMap.Add("DUPLOYAN LETTER PERNIN AN", 113765); - _unicodeCharacterMap.Add("DUPLOYAN LETTER PERNIN AM", 113766); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN EN", 113767); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN AN", 113768); - _unicodeCharacterMap.Add("DUPLOYAN LETTER SLOAN ON", 113769); - _unicodeCharacterMap.Add("DUPLOYAN LETTER VOCALIC M", 113770); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LEFT HORIZONTAL SECANT", 113776); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX MID HORIZONTAL SECANT", 113777); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT", 113778); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW VERTICAL SECANT", 113779); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX MID VERTICAL SECANT", 113780); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH VERTICAL SECANT", 113781); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX ATTACHED SECANT", 113782); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX ATTACHED LEFT TO RIGHT SECANT", 113783); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX ATTACHED TANGENT", 113784); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX ATTACHED TAIL", 113785); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX ATTACHED E HOOK", 113786); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX ATTACHED I HOOK", 113787); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX ATTACHED TANGENT HOOK", 113788); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH ACUTE", 113792); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH TIGHT ACUTE", 113793); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH GRAVE", 113794); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH LONG GRAVE", 113795); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH DOT", 113796); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH CIRCLE", 113797); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH LINE", 113798); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH WAVE", 113799); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX HIGH VERTICAL", 113800); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW ACUTE", 113808); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW TIGHT ACUTE", 113809); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW GRAVE", 113810); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW LONG GRAVE", 113811); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW DOT", 113812); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW CIRCLE", 113813); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW LINE", 113814); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW WAVE", 113815); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW VERTICAL", 113816); - _unicodeCharacterMap.Add("DUPLOYAN AFFIX LOW ARROW", 113817); - _unicodeCharacterMap.Add("DUPLOYAN SIGN O WITH CROSS", 113820); - _unicodeCharacterMap.Add("DUPLOYAN THICK LETTER SELECTOR", 113821); - _unicodeCharacterMap.Add("DUPLOYAN DOUBLE MARK", 113822); - _unicodeCharacterMap.Add("DUPLOYAN PUNCTUATION CHINOOK FULL STOP", 113823); - _unicodeCharacterMap.Add("SHORTHAND FORMAT LETTER OVERLAP", 113824); - _unicodeCharacterMap.Add("SHORTHAND FORMAT CONTINUING OVERLAP", 113825); - _unicodeCharacterMap.Add("SHORTHAND FORMAT DOWN STEP", 113826); - _unicodeCharacterMap.Add("SHORTHAND FORMAT UP STEP", 113827); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PSILI", 118784); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DASEIA", 118785); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PERISPOMENI", 118786); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON", 118787); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OXEIA DIPLI", 118788); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON", 118789); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL VAREIA DIPLI", 118790); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KATHISTI", 118791); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SYRMATIKI", 118792); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PARAKLITIKI", 118793); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YPOKRISIS", 118794); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI", 118795); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KREMASTI", 118796); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON", 118797); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON", 118798); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TELEIA", 118799); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMATA", 118800); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APOSTROFOS", 118801); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI", 118802); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SYNEVMA", 118803); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL THITA", 118804); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION", 118805); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORGON ARCHAION", 118806); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PSILON", 118807); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL CHAMILON", 118808); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL VATHY", 118809); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ISON ARCHAION", 118810); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION", 118811); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION", 118812); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SAXIMATA", 118813); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PARICHON", 118814); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA", 118815); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION", 118816); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION", 118817); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION", 118818); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APOTHEMA", 118819); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KLASMA", 118820); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL REVMA", 118821); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION", 118822); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TINAGMA", 118823); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ANATRICHISMA", 118824); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SEISMA", 118825); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION", 118826); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU", 118827); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION", 118828); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL THEMA", 118829); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL LEMOI", 118830); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DYO", 118831); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TRIA", 118832); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TESSERA", 118833); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KRATIMATA", 118834); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APESO EXO NEO", 118835); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION", 118836); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL IMIFTHORA", 118837); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION", 118838); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON", 118839); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PELASTON", 118840); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PSIFISTON", 118841); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KONTEVMA", 118842); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION", 118843); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL RAPISMA", 118844); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION", 118845); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION", 118846); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ICHADIN", 118847); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL NANA", 118848); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PETASMA", 118849); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO", 118850); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TROMIKON ALLO", 118851); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL STRAGGISMATA", 118852); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GRONTHISMATA", 118853); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ISON NEO", 118854); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OLIGON NEO", 118855); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OXEIA NEO", 118856); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PETASTI", 118857); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KOUFISMA", 118858); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA", 118859); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA", 118860); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PELASTON NEO", 118861); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO", 118862); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO", 118863); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YPSILI", 118864); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO", 118865); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO", 118866); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YPORROI", 118867); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON", 118868); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ELAFRON", 118869); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL CHAMILI", 118870); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MIKRON ISON", 118871); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL VAREIA NEO", 118872); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PIASMA NEO", 118873); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PSIFISTON NEO", 118874); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OMALON", 118875); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ANTIKENOMA", 118876); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL LYGISMA", 118877); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO", 118878); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO", 118879); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA", 118880); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KYLISMA", 118881); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA", 118882); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TROMIKON NEO", 118883); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL EKSTREPTON", 118884); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SYNAGMA NEO", 118885); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SYRMA", 118886); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL CHOREVMA NEO", 118887); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL EPEGERMA", 118888); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SEISMA NEO", 118889); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL XIRON KLASMA", 118890); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON", 118891); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA", 118892); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA", 118893); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA", 118894); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA", 118895); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA", 118896); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA", 118897); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON", 118898); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON", 118899); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON", 118900); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL OYRANISMA NEO", 118901); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO", 118902); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO", 118903); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL THEMA APLOUN", 118904); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL THES KAI APOTHES", 118905); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KATAVASMA", 118906); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ENDOFONON", 118907); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YFEN KATO", 118908); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YFEN ANO", 118909); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL STAVROS", 118910); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KLASMA ANO", 118911); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION", 118912); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION", 118913); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KRATIMA ALLO", 118914); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KRATIMA NEO", 118915); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APODERMA NEO", 118916); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APLI", 118917); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIPLI", 118918); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TRIPLI", 118919); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TETRAPLI", 118920); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KORONIS", 118921); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU", 118922); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON", 118923); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON", 118924); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON", 118925); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU", 118926); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORGON NEO ANO", 118927); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA", 118928); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA", 118929); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIGORGON", 118930); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO", 118931); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO", 118932); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA", 118933); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL TRIGORGON", 118934); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARGON", 118935); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL IMIDIARGON", 118936); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIARGON", 118937); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI", 118938); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI", 118939); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI ARGI", 118940); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI METRIA", 118941); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI MESI", 118942); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI GORGI", 118943); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI", 118944); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI", 118945); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS", 118946); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS", 118947); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS", 118948); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS", 118949); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS", 118950); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS", 118951); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS", 118952); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS", 118953); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS", 118954); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS", 118955); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS", 118956); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS", 118957); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS", 118958); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS", 118959); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS", 118960); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS", 118961); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS", 118962); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS", 118963); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN", 118964); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN", 118965); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU", 118966); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL IMIFONON", 118967); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL IMIFTHORON", 118968); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU", 118969); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA", 118970); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA", 118971); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS", 118972); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI", 118973); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI", 118974); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE", 118975); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO", 118976); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO", 118977); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO", 118978); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS", 118979); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS", 118980); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS", 118981); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI", 118982); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA NENANO", 118983); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL CHROA ZYGOS", 118984); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL CHROA KLITON", 118985); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL CHROA SPATHI", 118986); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION", 118987); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA", 118988); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION", 118989); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION", 118990); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION", 118991); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA", 118992); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA", 118993); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA", 118994); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA", 118995); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA", 118996); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA", 118997); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA", 118998); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA", 118999); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GENIKI DIESIS", 119000); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GENIKI YFESIS", 119001); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI", 119002); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI", 119003); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI", 119004); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS", 119005); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS", 119006); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU", 119007); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU", 119008); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU", 119009); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS", 119010); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU", 119011); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU", 119012); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU", 119013); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIGRAMMA GG", 119014); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU", 119015); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL STIGMA", 119016); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARKTIKO PA", 119017); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARKTIKO VOU", 119018); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARKTIKO GA", 119019); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARKTIKO DI", 119020); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARKTIKO KE", 119021); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARKTIKO ZO", 119022); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL ARKTIKO NI", 119023); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO", 119024); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO", 119025); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO", 119026); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO", 119027); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL KLASMA KATO", 119028); - _unicodeCharacterMap.Add("BYZANTINE MUSICAL SYMBOL GORGON NEO KATO", 119029); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SINGLE BARLINE", 119040); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DOUBLE BARLINE", 119041); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FINAL BARLINE", 119042); - _unicodeCharacterMap.Add("MUSICAL SYMBOL REVERSE FINAL BARLINE", 119043); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DASHED BARLINE", 119044); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SHORT BARLINE", 119045); - _unicodeCharacterMap.Add("MUSICAL SYMBOL LEFT REPEAT SIGN", 119046); - _unicodeCharacterMap.Add("MUSICAL SYMBOL RIGHT REPEAT SIGN", 119047); - _unicodeCharacterMap.Add("MUSICAL SYMBOL REPEAT DOTS", 119048); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DAL SEGNO", 119049); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DA CAPO", 119050); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SEGNO", 119051); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CODA", 119052); - _unicodeCharacterMap.Add("MUSICAL SYMBOL REPEATED FIGURE 1", 119053); - _unicodeCharacterMap.Add("MUSICAL SYMBOL REPEATED FIGURE 2", 119054); - _unicodeCharacterMap.Add("MUSICAL SYMBOL REPEATED FIGURE 3", 119055); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FERMATA", 119056); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FERMATA BELOW", 119057); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BREATH MARK", 119058); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CAESURA", 119059); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BRACE", 119060); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BRACKET", 119061); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ONE LINE STAFF", 119062); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TWO LINE STAFF", 119063); - _unicodeCharacterMap.Add("MUSICAL SYMBOL THREE LINE STAFF", 119064); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FOUR LINE STAFF", 119065); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FIVE LINE STAFF", 119066); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SIX LINE STAFF", 119067); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SIX STRING FRETBOARD", 119068); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FOUR STRING FRETBOARD", 119069); - _unicodeCharacterMap.Add("MUSICAL SYMBOL G CLEF", 119070); - _unicodeCharacterMap.Add("MUSICAL SYMBOL G CLEF OTTAVA ALTA", 119071); - _unicodeCharacterMap.Add("MUSICAL SYMBOL G CLEF OTTAVA BASSA", 119072); - _unicodeCharacterMap.Add("MUSICAL SYMBOL C CLEF", 119073); - _unicodeCharacterMap.Add("MUSICAL SYMBOL F CLEF", 119074); - _unicodeCharacterMap.Add("MUSICAL SYMBOL F CLEF OTTAVA ALTA", 119075); - _unicodeCharacterMap.Add("MUSICAL SYMBOL F CLEF OTTAVA BASSA", 119076); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DRUM CLEF 1", 119077); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DRUM CLEF 2", 119078); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MULTIPLE MEASURE REST", 119081); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DOUBLE SHARP", 119082); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DOUBLE FLAT", 119083); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FLAT UP", 119084); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FLAT DOWN", 119085); - _unicodeCharacterMap.Add("MUSICAL SYMBOL NATURAL UP", 119086); - _unicodeCharacterMap.Add("MUSICAL SYMBOL NATURAL DOWN", 119087); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SHARP UP", 119088); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SHARP DOWN", 119089); - _unicodeCharacterMap.Add("MUSICAL SYMBOL QUARTER TONE SHARP", 119090); - _unicodeCharacterMap.Add("MUSICAL SYMBOL QUARTER TONE FLAT", 119091); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMMON TIME", 119092); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CUT TIME", 119093); - _unicodeCharacterMap.Add("MUSICAL SYMBOL OTTAVA ALTA", 119094); - _unicodeCharacterMap.Add("MUSICAL SYMBOL OTTAVA BASSA", 119095); - _unicodeCharacterMap.Add("MUSICAL SYMBOL QUINDICESIMA ALTA", 119096); - _unicodeCharacterMap.Add("MUSICAL SYMBOL QUINDICESIMA BASSA", 119097); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MULTI REST", 119098); - _unicodeCharacterMap.Add("MUSICAL SYMBOL WHOLE REST", 119099); - _unicodeCharacterMap.Add("MUSICAL SYMBOL HALF REST", 119100); - _unicodeCharacterMap.Add("MUSICAL SYMBOL QUARTER REST", 119101); - _unicodeCharacterMap.Add("MUSICAL SYMBOL EIGHTH REST", 119102); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SIXTEENTH REST", 119103); - _unicodeCharacterMap.Add("MUSICAL SYMBOL THIRTY SECOND REST", 119104); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SIXTY FOURTH REST", 119105); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ONE HUNDRED TWENTY EIGHTH REST", 119106); - _unicodeCharacterMap.Add("MUSICAL SYMBOL X NOTEHEAD", 119107); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PLUS NOTEHEAD", 119108); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CIRCLE X NOTEHEAD", 119109); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SQUARE NOTEHEAD WHITE", 119110); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SQUARE NOTEHEAD BLACK", 119111); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE", 119112); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK", 119113); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE", 119114); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK", 119115); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE", 119116); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK", 119117); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE", 119118); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK", 119119); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE", 119120); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK", 119121); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MOON NOTEHEAD WHITE", 119122); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MOON NOTEHEAD BLACK", 119123); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE ROUND NOTEHEAD DOWN WHITE", 119124); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TRIANGLE ROUND NOTEHEAD DOWN BLACK", 119125); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PARENTHESIS NOTEHEAD", 119126); - _unicodeCharacterMap.Add("MUSICAL SYMBOL VOID NOTEHEAD", 119127); - _unicodeCharacterMap.Add("MUSICAL SYMBOL NOTEHEAD BLACK", 119128); - _unicodeCharacterMap.Add("MUSICAL SYMBOL NULL NOTEHEAD", 119129); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE", 119130); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK", 119131); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BREVE", 119132); - _unicodeCharacterMap.Add("MUSICAL SYMBOL WHOLE NOTE", 119133); - _unicodeCharacterMap.Add("MUSICAL SYMBOL HALF NOTE", 119134); - _unicodeCharacterMap.Add("MUSICAL SYMBOL QUARTER NOTE", 119135); - _unicodeCharacterMap.Add("MUSICAL SYMBOL EIGHTH NOTE", 119136); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SIXTEENTH NOTE", 119137); - _unicodeCharacterMap.Add("MUSICAL SYMBOL THIRTY SECOND NOTE", 119138); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SIXTY FOURTH NOTE", 119139); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ONE HUNDRED TWENTY EIGHTH NOTE", 119140); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING STEM", 119141); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING SPRECHGESANG STEM", 119142); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING TREMOLO 1", 119143); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING TREMOLO 2", 119144); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING TREMOLO 3", 119145); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FINGERED TREMOLO 1", 119146); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FINGERED TREMOLO 2", 119147); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FINGERED TREMOLO 3", 119148); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING AUGMENTATION DOT", 119149); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING FLAG 1", 119150); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING FLAG 2", 119151); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING FLAG 3", 119152); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING FLAG 4", 119153); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING FLAG 5", 119154); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BEGIN BEAM", 119155); - _unicodeCharacterMap.Add("MUSICAL SYMBOL END BEAM", 119156); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BEGIN TIE", 119157); - _unicodeCharacterMap.Add("MUSICAL SYMBOL END TIE", 119158); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BEGIN SLUR", 119159); - _unicodeCharacterMap.Add("MUSICAL SYMBOL END SLUR", 119160); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BEGIN PHRASE", 119161); - _unicodeCharacterMap.Add("MUSICAL SYMBOL END PHRASE", 119162); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING ACCENT", 119163); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING STACCATO", 119164); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING TENUTO", 119165); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING STACCATISSIMO", 119166); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING MARCATO", 119167); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING MARCATO STACCATO", 119168); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING ACCENT STACCATO", 119169); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING LOURE", 119170); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ARPEGGIATO UP", 119171); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ARPEGGIATO DOWN", 119172); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING DOIT", 119173); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING RIP", 119174); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING FLIP", 119175); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING SMEAR", 119176); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING BEND", 119177); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING DOUBLE TONGUE", 119178); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING TRIPLE TONGUE", 119179); - _unicodeCharacterMap.Add("MUSICAL SYMBOL RINFORZANDO", 119180); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SUBITO", 119181); - _unicodeCharacterMap.Add("MUSICAL SYMBOL Z", 119182); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PIANO", 119183); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MEZZO", 119184); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FORTE", 119185); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CRESCENDO", 119186); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DECRESCENDO", 119187); - _unicodeCharacterMap.Add("MUSICAL SYMBOL GRACE NOTE SLASH", 119188); - _unicodeCharacterMap.Add("MUSICAL SYMBOL GRACE NOTE NO SLASH", 119189); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TR", 119190); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TURN", 119191); - _unicodeCharacterMap.Add("MUSICAL SYMBOL INVERTED TURN", 119192); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TURN SLASH", 119193); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TURN UP", 119194); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 1", 119195); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 2", 119196); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 3", 119197); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 4", 119198); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 5", 119199); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 6", 119200); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 7", 119201); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 8", 119202); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 9", 119203); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 10", 119204); - _unicodeCharacterMap.Add("MUSICAL SYMBOL ORNAMENT STROKE 11", 119205); - _unicodeCharacterMap.Add("MUSICAL SYMBOL HAUPTSTIMME", 119206); - _unicodeCharacterMap.Add("MUSICAL SYMBOL NEBENSTIMME", 119207); - _unicodeCharacterMap.Add("MUSICAL SYMBOL END OF STIMME", 119208); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DEGREE SLASH", 119209); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING DOWN BOW", 119210); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING UP BOW", 119211); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING HARMONIC", 119212); - _unicodeCharacterMap.Add("MUSICAL SYMBOL COMBINING SNAP PIZZICATO", 119213); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PEDAL MARK", 119214); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PEDAL UP MARK", 119215); - _unicodeCharacterMap.Add("MUSICAL SYMBOL HALF PEDAL MARK", 119216); - _unicodeCharacterMap.Add("MUSICAL SYMBOL GLISSANDO UP", 119217); - _unicodeCharacterMap.Add("MUSICAL SYMBOL GLISSANDO DOWN", 119218); - _unicodeCharacterMap.Add("MUSICAL SYMBOL WITH FINGERNAILS", 119219); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DAMP", 119220); - _unicodeCharacterMap.Add("MUSICAL SYMBOL DAMP ALL", 119221); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MAXIMA", 119222); - _unicodeCharacterMap.Add("MUSICAL SYMBOL LONGA", 119223); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BREVIS", 119224); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SEMIBREVIS WHITE", 119225); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SEMIBREVIS BLACK", 119226); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MINIMA", 119227); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MINIMA BLACK", 119228); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SEMIMINIMA WHITE", 119229); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SEMIMINIMA BLACK", 119230); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FUSA WHITE", 119231); - _unicodeCharacterMap.Add("MUSICAL SYMBOL FUSA BLACK", 119232); - _unicodeCharacterMap.Add("MUSICAL SYMBOL LONGA PERFECTA REST", 119233); - _unicodeCharacterMap.Add("MUSICAL SYMBOL LONGA IMPERFECTA REST", 119234); - _unicodeCharacterMap.Add("MUSICAL SYMBOL BREVIS REST", 119235); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SEMIBREVIS REST", 119236); - _unicodeCharacterMap.Add("MUSICAL SYMBOL MINIMA REST", 119237); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SEMIMINIMA REST", 119238); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA", 119239); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA", 119240); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION 1", 119241); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA", 119242); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA", 119243); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION 1", 119244); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION 2", 119245); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION 3", 119246); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CROIX", 119247); - _unicodeCharacterMap.Add("MUSICAL SYMBOL GREGORIAN C CLEF", 119248); - _unicodeCharacterMap.Add("MUSICAL SYMBOL GREGORIAN F CLEF", 119249); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SQUARE B", 119250); - _unicodeCharacterMap.Add("MUSICAL SYMBOL VIRGA", 119251); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PODATUS", 119252); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CLIVIS", 119253); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SCANDICUS", 119254); - _unicodeCharacterMap.Add("MUSICAL SYMBOL CLIMACUS", 119255); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TORCULUS", 119256); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PORRECTUS", 119257); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PORRECTUS FLEXUS", 119258); - _unicodeCharacterMap.Add("MUSICAL SYMBOL SCANDICUS FLEXUS", 119259); - _unicodeCharacterMap.Add("MUSICAL SYMBOL TORCULUS RESUPINUS", 119260); - _unicodeCharacterMap.Add("MUSICAL SYMBOL PES SUBPUNCTIS", 119261); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN C CLEF", 119262); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN END OF PIECE", 119263); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN FINAL NOTE", 119264); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN RECITATIVE MARK", 119265); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN WHOLE NOTE", 119266); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN HALF NOTE", 119267); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN", 119268); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP", 119269); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN", 119270); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP", 119271); - _unicodeCharacterMap.Add("MUSICAL SYMBOL KIEVAN FLAT SIGN", 119272); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 1", 119296); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 2", 119297); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 3", 119298); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 4", 119299); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 5", 119300); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 6", 119301); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 7", 119302); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 8", 119303); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 9", 119304); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 10", 119305); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 11", 119306); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 12", 119307); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 13", 119308); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 14", 119309); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 15", 119310); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 16", 119311); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 17", 119312); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 18", 119313); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 19", 119314); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 20", 119315); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 21", 119316); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 22", 119317); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 23", 119318); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 24", 119319); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 50", 119320); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 51", 119321); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 52", 119322); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 53", 119323); - _unicodeCharacterMap.Add("GREEK VOCAL NOTATION SYMBOL 54", 119324); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 1", 119325); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 2", 119326); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 4", 119327); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 5", 119328); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 7", 119329); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 8", 119330); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 11", 119331); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 12", 119332); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 13", 119333); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 14", 119334); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 17", 119335); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 18", 119336); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 19", 119337); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 23", 119338); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 24", 119339); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 25", 119340); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 26", 119341); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 27", 119342); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 29", 119343); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 30", 119344); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 32", 119345); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 36", 119346); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 37", 119347); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 38", 119348); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 39", 119349); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 40", 119350); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 42", 119351); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 43", 119352); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 45", 119353); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 47", 119354); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 48", 119355); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 49", 119356); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 50", 119357); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 51", 119358); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 52", 119359); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 53", 119360); - _unicodeCharacterMap.Add("GREEK INSTRUMENTAL NOTATION SYMBOL 54", 119361); - _unicodeCharacterMap.Add("COMBINING GREEK MUSICAL TRISEME", 119362); - _unicodeCharacterMap.Add("COMBINING GREEK MUSICAL TETRASEME", 119363); - _unicodeCharacterMap.Add("COMBINING GREEK MUSICAL PENTASEME", 119364); - _unicodeCharacterMap.Add("GREEK MUSICAL LEIMMA", 119365); - _unicodeCharacterMap.Add("MONOGRAM FOR EARTH", 119552); - _unicodeCharacterMap.Add("DIGRAM FOR HEAVENLY EARTH", 119553); - _unicodeCharacterMap.Add("DIGRAM FOR HUMAN EARTH", 119554); - _unicodeCharacterMap.Add("DIGRAM FOR EARTHLY HEAVEN", 119555); - _unicodeCharacterMap.Add("DIGRAM FOR EARTHLY HUMAN", 119556); - _unicodeCharacterMap.Add("DIGRAM FOR EARTH", 119557); - _unicodeCharacterMap.Add("TETRAGRAM FOR CENTRE", 119558); - _unicodeCharacterMap.Add("TETRAGRAM FOR FULL CIRCLE", 119559); - _unicodeCharacterMap.Add("TETRAGRAM FOR MIRED", 119560); - _unicodeCharacterMap.Add("TETRAGRAM FOR BARRIER", 119561); - _unicodeCharacterMap.Add("TETRAGRAM FOR KEEPING SMALL", 119562); - _unicodeCharacterMap.Add("TETRAGRAM FOR CONTRARIETY", 119563); - _unicodeCharacterMap.Add("TETRAGRAM FOR ASCENT", 119564); - _unicodeCharacterMap.Add("TETRAGRAM FOR OPPOSITION", 119565); - _unicodeCharacterMap.Add("TETRAGRAM FOR BRANCHING OUT", 119566); - _unicodeCharacterMap.Add("TETRAGRAM FOR DEFECTIVENESS OR DISTORTION", 119567); - _unicodeCharacterMap.Add("TETRAGRAM FOR DIVERGENCE", 119568); - _unicodeCharacterMap.Add("TETRAGRAM FOR YOUTHFULNESS", 119569); - _unicodeCharacterMap.Add("TETRAGRAM FOR INCREASE", 119570); - _unicodeCharacterMap.Add("TETRAGRAM FOR PENETRATION", 119571); - _unicodeCharacterMap.Add("TETRAGRAM FOR REACH", 119572); - _unicodeCharacterMap.Add("TETRAGRAM FOR CONTACT", 119573); - _unicodeCharacterMap.Add("TETRAGRAM FOR HOLDING BACK", 119574); - _unicodeCharacterMap.Add("TETRAGRAM FOR WAITING", 119575); - _unicodeCharacterMap.Add("TETRAGRAM FOR FOLLOWING", 119576); - _unicodeCharacterMap.Add("TETRAGRAM FOR ADVANCE", 119577); - _unicodeCharacterMap.Add("TETRAGRAM FOR RELEASE", 119578); - _unicodeCharacterMap.Add("TETRAGRAM FOR RESISTANCE", 119579); - _unicodeCharacterMap.Add("TETRAGRAM FOR EASE", 119580); - _unicodeCharacterMap.Add("TETRAGRAM FOR JOY", 119581); - _unicodeCharacterMap.Add("TETRAGRAM FOR CONTENTION", 119582); - _unicodeCharacterMap.Add("TETRAGRAM FOR ENDEAVOUR", 119583); - _unicodeCharacterMap.Add("TETRAGRAM FOR DUTIES", 119584); - _unicodeCharacterMap.Add("TETRAGRAM FOR CHANGE", 119585); - _unicodeCharacterMap.Add("TETRAGRAM FOR DECISIVENESS", 119586); - _unicodeCharacterMap.Add("TETRAGRAM FOR BOLD RESOLUTION", 119587); - _unicodeCharacterMap.Add("TETRAGRAM FOR PACKING", 119588); - _unicodeCharacterMap.Add("TETRAGRAM FOR LEGION", 119589); - _unicodeCharacterMap.Add("TETRAGRAM FOR CLOSENESS", 119590); - _unicodeCharacterMap.Add("TETRAGRAM FOR KINSHIP", 119591); - _unicodeCharacterMap.Add("TETRAGRAM FOR GATHERING", 119592); - _unicodeCharacterMap.Add("TETRAGRAM FOR STRENGTH", 119593); - _unicodeCharacterMap.Add("TETRAGRAM FOR PURITY", 119594); - _unicodeCharacterMap.Add("TETRAGRAM FOR FULLNESS", 119595); - _unicodeCharacterMap.Add("TETRAGRAM FOR RESIDENCE", 119596); - _unicodeCharacterMap.Add("TETRAGRAM FOR LAW OR MODEL", 119597); - _unicodeCharacterMap.Add("TETRAGRAM FOR RESPONSE", 119598); - _unicodeCharacterMap.Add("TETRAGRAM FOR GOING TO MEET", 119599); - _unicodeCharacterMap.Add("TETRAGRAM FOR ENCOUNTERS", 119600); - _unicodeCharacterMap.Add("TETRAGRAM FOR STOVE", 119601); - _unicodeCharacterMap.Add("TETRAGRAM FOR GREATNESS", 119602); - _unicodeCharacterMap.Add("TETRAGRAM FOR ENLARGEMENT", 119603); - _unicodeCharacterMap.Add("TETRAGRAM FOR PATTERN", 119604); - _unicodeCharacterMap.Add("TETRAGRAM FOR RITUAL", 119605); - _unicodeCharacterMap.Add("TETRAGRAM FOR FLIGHT", 119606); - _unicodeCharacterMap.Add("TETRAGRAM FOR VASTNESS OR WASTING", 119607); - _unicodeCharacterMap.Add("TETRAGRAM FOR CONSTANCY", 119608); - _unicodeCharacterMap.Add("TETRAGRAM FOR MEASURE", 119609); - _unicodeCharacterMap.Add("TETRAGRAM FOR ETERNITY", 119610); - _unicodeCharacterMap.Add("TETRAGRAM FOR UNITY", 119611); - _unicodeCharacterMap.Add("TETRAGRAM FOR DIMINISHMENT", 119612); - _unicodeCharacterMap.Add("TETRAGRAM FOR CLOSED MOUTH", 119613); - _unicodeCharacterMap.Add("TETRAGRAM FOR GUARDEDNESS", 119614); - _unicodeCharacterMap.Add("TETRAGRAM FOR GATHERING IN", 119615); - _unicodeCharacterMap.Add("TETRAGRAM FOR MASSING", 119616); - _unicodeCharacterMap.Add("TETRAGRAM FOR ACCUMULATION", 119617); - _unicodeCharacterMap.Add("TETRAGRAM FOR EMBELLISHMENT", 119618); - _unicodeCharacterMap.Add("TETRAGRAM FOR DOUBT", 119619); - _unicodeCharacterMap.Add("TETRAGRAM FOR WATCH", 119620); - _unicodeCharacterMap.Add("TETRAGRAM FOR SINKING", 119621); - _unicodeCharacterMap.Add("TETRAGRAM FOR INNER", 119622); - _unicodeCharacterMap.Add("TETRAGRAM FOR DEPARTURE", 119623); - _unicodeCharacterMap.Add("TETRAGRAM FOR DARKENING", 119624); - _unicodeCharacterMap.Add("TETRAGRAM FOR DIMMING", 119625); - _unicodeCharacterMap.Add("TETRAGRAM FOR EXHAUSTION", 119626); - _unicodeCharacterMap.Add("TETRAGRAM FOR SEVERANCE", 119627); - _unicodeCharacterMap.Add("TETRAGRAM FOR STOPPAGE", 119628); - _unicodeCharacterMap.Add("TETRAGRAM FOR HARDNESS", 119629); - _unicodeCharacterMap.Add("TETRAGRAM FOR COMPLETION", 119630); - _unicodeCharacterMap.Add("TETRAGRAM FOR CLOSURE", 119631); - _unicodeCharacterMap.Add("TETRAGRAM FOR FAILURE", 119632); - _unicodeCharacterMap.Add("TETRAGRAM FOR AGGRAVATION", 119633); - _unicodeCharacterMap.Add("TETRAGRAM FOR COMPLIANCE", 119634); - _unicodeCharacterMap.Add("TETRAGRAM FOR ON THE VERGE", 119635); - _unicodeCharacterMap.Add("TETRAGRAM FOR DIFFICULTIES", 119636); - _unicodeCharacterMap.Add("TETRAGRAM FOR LABOURING", 119637); - _unicodeCharacterMap.Add("TETRAGRAM FOR FOSTERING", 119638); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT ONE", 119648); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT TWO", 119649); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT THREE", 119650); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT FOUR", 119651); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT FIVE", 119652); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT SIX", 119653); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT SEVEN", 119654); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT EIGHT", 119655); - _unicodeCharacterMap.Add("COUNTING ROD UNIT DIGIT NINE", 119656); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT ONE", 119657); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT TWO", 119658); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT THREE", 119659); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT FOUR", 119660); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT FIVE", 119661); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT SIX", 119662); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT SEVEN", 119663); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT EIGHT", 119664); - _unicodeCharacterMap.Add("COUNTING ROD TENS DIGIT NINE", 119665); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL A", 119808); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL B", 119809); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL C", 119810); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL D", 119811); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL E", 119812); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL F", 119813); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL G", 119814); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL H", 119815); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL I", 119816); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL J", 119817); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL K", 119818); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL L", 119819); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL M", 119820); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL N", 119821); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL O", 119822); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL P", 119823); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL Q", 119824); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL R", 119825); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL S", 119826); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL T", 119827); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL U", 119828); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL V", 119829); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL W", 119830); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL X", 119831); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL Y", 119832); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL Z", 119833); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL A", 119834); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL B", 119835); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL C", 119836); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL D", 119837); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL E", 119838); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL F", 119839); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL G", 119840); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL H", 119841); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL I", 119842); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL J", 119843); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL K", 119844); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL L", 119845); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL M", 119846); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL N", 119847); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL O", 119848); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL P", 119849); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL Q", 119850); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL R", 119851); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL S", 119852); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL T", 119853); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL U", 119854); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL V", 119855); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL W", 119856); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL X", 119857); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL Y", 119858); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL Z", 119859); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL A", 119860); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL B", 119861); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL C", 119862); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL D", 119863); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL E", 119864); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL F", 119865); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL G", 119866); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL H", 119867); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL I", 119868); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL J", 119869); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL K", 119870); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL L", 119871); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL M", 119872); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL N", 119873); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL O", 119874); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL P", 119875); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL Q", 119876); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL R", 119877); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL S", 119878); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL T", 119879); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL U", 119880); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL V", 119881); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL W", 119882); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL X", 119883); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL Y", 119884); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL Z", 119885); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL A", 119886); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL B", 119887); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL C", 119888); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL D", 119889); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL E", 119890); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL F", 119891); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL G", 119892); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL I", 119894); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL J", 119895); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL K", 119896); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL L", 119897); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL M", 119898); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL N", 119899); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL O", 119900); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL P", 119901); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL Q", 119902); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL R", 119903); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL S", 119904); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL T", 119905); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL U", 119906); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL V", 119907); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL W", 119908); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL X", 119909); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL Y", 119910); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL Z", 119911); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL A", 119912); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL B", 119913); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL C", 119914); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL D", 119915); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL E", 119916); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL F", 119917); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL G", 119918); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL H", 119919); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL I", 119920); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL J", 119921); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL K", 119922); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL L", 119923); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL M", 119924); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL N", 119925); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL O", 119926); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL P", 119927); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL Q", 119928); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL R", 119929); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL S", 119930); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL T", 119931); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL U", 119932); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL V", 119933); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL W", 119934); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL X", 119935); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL Y", 119936); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL Z", 119937); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL A", 119938); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL B", 119939); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL C", 119940); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL D", 119941); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL E", 119942); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL F", 119943); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL G", 119944); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL H", 119945); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL I", 119946); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL J", 119947); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL K", 119948); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL L", 119949); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL M", 119950); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL N", 119951); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL O", 119952); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL P", 119953); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL Q", 119954); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL R", 119955); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL S", 119956); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL T", 119957); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL U", 119958); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL V", 119959); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL W", 119960); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL X", 119961); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL Y", 119962); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL Z", 119963); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL A", 119964); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL C", 119966); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL D", 119967); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL G", 119970); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL J", 119973); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL K", 119974); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL N", 119977); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL O", 119978); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL P", 119979); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL Q", 119980); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL S", 119982); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL T", 119983); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL U", 119984); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL V", 119985); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL W", 119986); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL X", 119987); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL Y", 119988); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT CAPITAL Z", 119989); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL A", 119990); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL B", 119991); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL C", 119992); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL D", 119993); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL F", 119995); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL H", 119997); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL I", 119998); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL J", 119999); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL K", 120000); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL L", 120001); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL M", 120002); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL N", 120003); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL P", 120005); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL Q", 120006); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL R", 120007); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL S", 120008); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL T", 120009); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL U", 120010); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL V", 120011); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL W", 120012); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL X", 120013); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL Y", 120014); - _unicodeCharacterMap.Add("MATHEMATICAL SCRIPT SMALL Z", 120015); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL A", 120016); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL B", 120017); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL C", 120018); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL D", 120019); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL E", 120020); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL F", 120021); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL G", 120022); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL H", 120023); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL I", 120024); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL J", 120025); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL K", 120026); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL L", 120027); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL M", 120028); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL N", 120029); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL O", 120030); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL P", 120031); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL Q", 120032); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL R", 120033); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL S", 120034); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL T", 120035); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL U", 120036); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL V", 120037); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL W", 120038); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL X", 120039); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL Y", 120040); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT CAPITAL Z", 120041); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL A", 120042); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL B", 120043); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL C", 120044); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL D", 120045); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL E", 120046); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL F", 120047); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL G", 120048); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL H", 120049); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL I", 120050); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL J", 120051); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL K", 120052); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL L", 120053); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL M", 120054); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL N", 120055); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL O", 120056); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL P", 120057); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL Q", 120058); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL R", 120059); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL S", 120060); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL T", 120061); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL U", 120062); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL V", 120063); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL W", 120064); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL X", 120065); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL Y", 120066); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SCRIPT SMALL Z", 120067); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL A", 120068); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL B", 120069); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL D", 120071); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL E", 120072); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL F", 120073); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL G", 120074); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL J", 120077); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL K", 120078); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL L", 120079); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL M", 120080); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL N", 120081); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL O", 120082); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL P", 120083); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL Q", 120084); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL S", 120086); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL T", 120087); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL U", 120088); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL V", 120089); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL W", 120090); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL X", 120091); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR CAPITAL Y", 120092); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL A", 120094); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL B", 120095); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL C", 120096); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL D", 120097); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL E", 120098); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL F", 120099); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL G", 120100); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL H", 120101); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL I", 120102); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL J", 120103); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL K", 120104); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL L", 120105); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL M", 120106); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL N", 120107); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL O", 120108); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL P", 120109); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL Q", 120110); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL R", 120111); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL S", 120112); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL T", 120113); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL U", 120114); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL V", 120115); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL W", 120116); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL X", 120117); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL Y", 120118); - _unicodeCharacterMap.Add("MATHEMATICAL FRAKTUR SMALL Z", 120119); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL A", 120120); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL B", 120121); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL D", 120123); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL E", 120124); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL F", 120125); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL G", 120126); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL I", 120128); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL J", 120129); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL K", 120130); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL L", 120131); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL M", 120132); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL O", 120134); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL S", 120138); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL T", 120139); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL U", 120140); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL V", 120141); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL W", 120142); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL X", 120143); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK CAPITAL Y", 120144); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL A", 120146); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL B", 120147); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL C", 120148); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL D", 120149); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL E", 120150); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL F", 120151); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL G", 120152); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL H", 120153); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL I", 120154); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL J", 120155); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL K", 120156); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL L", 120157); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL M", 120158); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL N", 120159); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL O", 120160); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL P", 120161); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL Q", 120162); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL R", 120163); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL S", 120164); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL T", 120165); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL U", 120166); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL V", 120167); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL W", 120168); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL X", 120169); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL Y", 120170); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK SMALL Z", 120171); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL A", 120172); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL B", 120173); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL C", 120174); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL D", 120175); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL E", 120176); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL F", 120177); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL G", 120178); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL H", 120179); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL I", 120180); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL J", 120181); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL K", 120182); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL L", 120183); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL M", 120184); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL N", 120185); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL O", 120186); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL P", 120187); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL Q", 120188); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL R", 120189); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL S", 120190); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL T", 120191); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL U", 120192); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL V", 120193); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL W", 120194); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL X", 120195); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL Y", 120196); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR CAPITAL Z", 120197); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL A", 120198); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL B", 120199); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL C", 120200); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL D", 120201); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL E", 120202); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL F", 120203); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL G", 120204); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL H", 120205); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL I", 120206); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL J", 120207); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL K", 120208); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL L", 120209); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL M", 120210); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL N", 120211); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL O", 120212); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL P", 120213); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL Q", 120214); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL R", 120215); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL S", 120216); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL T", 120217); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL U", 120218); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL V", 120219); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL W", 120220); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL X", 120221); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL Y", 120222); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD FRAKTUR SMALL Z", 120223); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL A", 120224); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL B", 120225); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL C", 120226); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL D", 120227); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL E", 120228); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL F", 120229); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL G", 120230); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL H", 120231); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL I", 120232); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL J", 120233); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL K", 120234); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL L", 120235); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL M", 120236); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL N", 120237); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL O", 120238); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL P", 120239); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL Q", 120240); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL R", 120241); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL S", 120242); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL T", 120243); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL U", 120244); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL V", 120245); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL W", 120246); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL X", 120247); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL Y", 120248); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF CAPITAL Z", 120249); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL A", 120250); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL B", 120251); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL C", 120252); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL D", 120253); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL E", 120254); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL F", 120255); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL G", 120256); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL H", 120257); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL I", 120258); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL J", 120259); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL K", 120260); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL L", 120261); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL M", 120262); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL N", 120263); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL O", 120264); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL P", 120265); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL Q", 120266); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL R", 120267); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL S", 120268); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL T", 120269); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL U", 120270); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL V", 120271); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL W", 120272); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL X", 120273); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL Y", 120274); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF SMALL Z", 120275); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL A", 120276); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL B", 120277); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL C", 120278); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL D", 120279); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL E", 120280); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL F", 120281); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL G", 120282); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL H", 120283); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL I", 120284); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL J", 120285); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL K", 120286); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL L", 120287); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL M", 120288); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL N", 120289); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL O", 120290); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL P", 120291); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL Q", 120292); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL R", 120293); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL S", 120294); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL T", 120295); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL U", 120296); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL V", 120297); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL W", 120298); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL X", 120299); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL Y", 120300); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL Z", 120301); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL A", 120302); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL B", 120303); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL C", 120304); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL D", 120305); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL E", 120306); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL F", 120307); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL G", 120308); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL H", 120309); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL I", 120310); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL J", 120311); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL K", 120312); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL L", 120313); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL M", 120314); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL N", 120315); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL O", 120316); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL P", 120317); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL Q", 120318); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL R", 120319); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL S", 120320); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL T", 120321); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL U", 120322); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL V", 120323); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL W", 120324); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL X", 120325); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL Y", 120326); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL Z", 120327); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL A", 120328); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL B", 120329); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL C", 120330); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL D", 120331); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL E", 120332); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL F", 120333); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL G", 120334); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL H", 120335); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL I", 120336); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL J", 120337); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL K", 120338); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL L", 120339); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL M", 120340); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL N", 120341); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL O", 120342); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL P", 120343); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL Q", 120344); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL R", 120345); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL S", 120346); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL T", 120347); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL U", 120348); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL V", 120349); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL W", 120350); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL X", 120351); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL Y", 120352); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC CAPITAL Z", 120353); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL A", 120354); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL B", 120355); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL C", 120356); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL D", 120357); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL E", 120358); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL F", 120359); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL G", 120360); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL H", 120361); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL I", 120362); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL J", 120363); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL K", 120364); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL L", 120365); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL M", 120366); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL N", 120367); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL O", 120368); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL P", 120369); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL Q", 120370); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL R", 120371); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL S", 120372); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL T", 120373); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL U", 120374); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL V", 120375); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL W", 120376); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL X", 120377); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL Y", 120378); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF ITALIC SMALL Z", 120379); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL A", 120380); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL B", 120381); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL C", 120382); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL D", 120383); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL E", 120384); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL F", 120385); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL G", 120386); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL H", 120387); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL I", 120388); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL J", 120389); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL K", 120390); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL L", 120391); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL M", 120392); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL N", 120393); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL O", 120394); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL P", 120395); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL Q", 120396); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL R", 120397); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL S", 120398); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL T", 120399); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL U", 120400); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL V", 120401); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL W", 120402); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL X", 120403); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL Y", 120404); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL Z", 120405); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL A", 120406); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL B", 120407); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL C", 120408); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL D", 120409); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL E", 120410); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL F", 120411); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL G", 120412); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL H", 120413); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL I", 120414); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL J", 120415); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL K", 120416); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL L", 120417); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL M", 120418); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL N", 120419); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL O", 120420); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL P", 120421); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL Q", 120422); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL R", 120423); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL S", 120424); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL T", 120425); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL U", 120426); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL V", 120427); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL W", 120428); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL X", 120429); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL Y", 120430); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL Z", 120431); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL A", 120432); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL B", 120433); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL C", 120434); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL D", 120435); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL E", 120436); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL F", 120437); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL G", 120438); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL H", 120439); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL I", 120440); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL J", 120441); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL K", 120442); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL L", 120443); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL M", 120444); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL N", 120445); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL O", 120446); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL P", 120447); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL Q", 120448); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL R", 120449); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL S", 120450); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL T", 120451); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL U", 120452); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL V", 120453); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL W", 120454); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL X", 120455); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL Y", 120456); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE CAPITAL Z", 120457); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL A", 120458); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL B", 120459); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL C", 120460); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL D", 120461); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL E", 120462); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL F", 120463); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL G", 120464); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL H", 120465); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL I", 120466); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL J", 120467); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL K", 120468); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL L", 120469); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL M", 120470); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL N", 120471); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL O", 120472); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL P", 120473); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL Q", 120474); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL R", 120475); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL S", 120476); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL T", 120477); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL U", 120478); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL V", 120479); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL W", 120480); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL X", 120481); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL Y", 120482); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE SMALL Z", 120483); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL DOTLESS I", 120484); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL DOTLESS J", 120485); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL ALPHA", 120488); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL BETA", 120489); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL GAMMA", 120490); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL DELTA", 120491); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL EPSILON", 120492); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL ZETA", 120493); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL ETA", 120494); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL THETA", 120495); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL IOTA", 120496); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL KAPPA", 120497); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL LAMDA", 120498); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL MU", 120499); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL NU", 120500); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL XI", 120501); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL OMICRON", 120502); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL PI", 120503); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL RHO", 120504); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL THETA SYMBOL", 120505); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL SIGMA", 120506); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL TAU", 120507); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL UPSILON", 120508); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL PHI", 120509); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL CHI", 120510); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL PSI", 120511); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL OMEGA", 120512); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD NABLA", 120513); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL ALPHA", 120514); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL BETA", 120515); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL GAMMA", 120516); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL DELTA", 120517); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL EPSILON", 120518); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL ZETA", 120519); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL ETA", 120520); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL THETA", 120521); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL IOTA", 120522); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL KAPPA", 120523); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL LAMDA", 120524); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL MU", 120525); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL NU", 120526); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL XI", 120527); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL OMICRON", 120528); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL PI", 120529); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL RHO", 120530); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL FINAL SIGMA", 120531); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL SIGMA", 120532); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL TAU", 120533); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL UPSILON", 120534); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL PHI", 120535); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL CHI", 120536); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL PSI", 120537); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL OMEGA", 120538); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD PARTIAL DIFFERENTIAL", 120539); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD EPSILON SYMBOL", 120540); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD THETA SYMBOL", 120541); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD KAPPA SYMBOL", 120542); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD PHI SYMBOL", 120543); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD RHO SYMBOL", 120544); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD PI SYMBOL", 120545); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL ALPHA", 120546); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL BETA", 120547); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL GAMMA", 120548); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL DELTA", 120549); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL EPSILON", 120550); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL ZETA", 120551); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL ETA", 120552); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL THETA", 120553); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL IOTA", 120554); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL KAPPA", 120555); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL LAMDA", 120556); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL MU", 120557); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL NU", 120558); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL XI", 120559); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL OMICRON", 120560); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL PI", 120561); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL RHO", 120562); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL THETA SYMBOL", 120563); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL SIGMA", 120564); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL TAU", 120565); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL UPSILON", 120566); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL PHI", 120567); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL CHI", 120568); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL PSI", 120569); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC CAPITAL OMEGA", 120570); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC NABLA", 120571); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL ALPHA", 120572); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL BETA", 120573); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL GAMMA", 120574); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL DELTA", 120575); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL EPSILON", 120576); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL ZETA", 120577); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL ETA", 120578); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL THETA", 120579); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL IOTA", 120580); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL KAPPA", 120581); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL LAMDA", 120582); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL MU", 120583); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL NU", 120584); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL XI", 120585); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL OMICRON", 120586); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL PI", 120587); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL RHO", 120588); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL FINAL SIGMA", 120589); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL SIGMA", 120590); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL TAU", 120591); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL UPSILON", 120592); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL PHI", 120593); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL CHI", 120594); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL PSI", 120595); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC SMALL OMEGA", 120596); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL", 120597); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC EPSILON SYMBOL", 120598); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC THETA SYMBOL", 120599); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC KAPPA SYMBOL", 120600); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC PHI SYMBOL", 120601); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC RHO SYMBOL", 120602); - _unicodeCharacterMap.Add("MATHEMATICAL ITALIC PI SYMBOL", 120603); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL ALPHA", 120604); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL BETA", 120605); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL GAMMA", 120606); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL DELTA", 120607); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL EPSILON", 120608); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL ZETA", 120609); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL ETA", 120610); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL THETA", 120611); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL IOTA", 120612); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL KAPPA", 120613); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL LAMDA", 120614); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL MU", 120615); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL NU", 120616); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL XI", 120617); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL OMICRON", 120618); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL PI", 120619); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL RHO", 120620); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL", 120621); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL SIGMA", 120622); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL TAU", 120623); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL UPSILON", 120624); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL PHI", 120625); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL CHI", 120626); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL PSI", 120627); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC CAPITAL OMEGA", 120628); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC NABLA", 120629); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL ALPHA", 120630); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL BETA", 120631); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL GAMMA", 120632); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL DELTA", 120633); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL EPSILON", 120634); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL ZETA", 120635); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL ETA", 120636); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL THETA", 120637); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL IOTA", 120638); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL KAPPA", 120639); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL LAMDA", 120640); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL MU", 120641); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL NU", 120642); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL XI", 120643); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL OMICRON", 120644); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL PI", 120645); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL RHO", 120646); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA", 120647); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL SIGMA", 120648); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL TAU", 120649); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL UPSILON", 120650); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL PHI", 120651); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL CHI", 120652); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL PSI", 120653); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC SMALL OMEGA", 120654); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL", 120655); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC EPSILON SYMBOL", 120656); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC THETA SYMBOL", 120657); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC KAPPA SYMBOL", 120658); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC PHI SYMBOL", 120659); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC RHO SYMBOL", 120660); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD ITALIC PI SYMBOL", 120661); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL ALPHA", 120662); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL BETA", 120663); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL GAMMA", 120664); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL DELTA", 120665); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL EPSILON", 120666); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL ZETA", 120667); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL ETA", 120668); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL THETA", 120669); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL IOTA", 120670); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL KAPPA", 120671); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL LAMDA", 120672); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL MU", 120673); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL NU", 120674); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL XI", 120675); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL OMICRON", 120676); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL PI", 120677); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL RHO", 120678); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL THETA SYMBOL", 120679); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL SIGMA", 120680); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL TAU", 120681); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL UPSILON", 120682); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL PHI", 120683); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL CHI", 120684); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL PSI", 120685); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD CAPITAL OMEGA", 120686); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD NABLA", 120687); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL ALPHA", 120688); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL BETA", 120689); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL GAMMA", 120690); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL DELTA", 120691); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL EPSILON", 120692); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL ZETA", 120693); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL ETA", 120694); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL THETA", 120695); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL IOTA", 120696); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL KAPPA", 120697); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL LAMDA", 120698); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL MU", 120699); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL NU", 120700); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL XI", 120701); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL OMICRON", 120702); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL PI", 120703); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL RHO", 120704); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL FINAL SIGMA", 120705); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL SIGMA", 120706); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL TAU", 120707); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL UPSILON", 120708); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL PHI", 120709); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL CHI", 120710); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL PSI", 120711); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD SMALL OMEGA", 120712); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD PARTIAL DIFFERENTIAL", 120713); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD EPSILON SYMBOL", 120714); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD THETA SYMBOL", 120715); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD KAPPA SYMBOL", 120716); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD PHI SYMBOL", 120717); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD RHO SYMBOL", 120718); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD PI SYMBOL", 120719); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL ALPHA", 120720); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL BETA", 120721); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL GAMMA", 120722); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL DELTA", 120723); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL EPSILON", 120724); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL ZETA", 120725); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL ETA", 120726); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL THETA", 120727); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL IOTA", 120728); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL KAPPA", 120729); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL LAMDA", 120730); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL MU", 120731); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL NU", 120732); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL XI", 120733); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL OMICRON", 120734); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL PI", 120735); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL RHO", 120736); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL THETA SYMBOL", 120737); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL SIGMA", 120738); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL TAU", 120739); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL UPSILON", 120740); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL PHI", 120741); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL CHI", 120742); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL PSI", 120743); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL OMEGA", 120744); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC NABLA", 120745); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL ALPHA", 120746); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL BETA", 120747); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL GAMMA", 120748); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL DELTA", 120749); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL EPSILON", 120750); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL ZETA", 120751); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL ETA", 120752); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL THETA", 120753); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL IOTA", 120754); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL KAPPA", 120755); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL LAMDA", 120756); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL MU", 120757); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL NU", 120758); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL XI", 120759); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL OMICRON", 120760); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL PI", 120761); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL RHO", 120762); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL FINAL SIGMA", 120763); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL SIGMA", 120764); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL TAU", 120765); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL UPSILON", 120766); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL PHI", 120767); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL CHI", 120768); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL PSI", 120769); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC SMALL OMEGA", 120770); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC PARTIAL DIFFERENTIAL", 120771); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC EPSILON SYMBOL", 120772); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC THETA SYMBOL", 120773); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC KAPPA SYMBOL", 120774); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC PHI SYMBOL", 120775); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC RHO SYMBOL", 120776); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD ITALIC PI SYMBOL", 120777); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD CAPITAL DIGAMMA", 120778); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD SMALL DIGAMMA", 120779); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT ZERO", 120782); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT ONE", 120783); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT TWO", 120784); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT THREE", 120785); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT FOUR", 120786); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT FIVE", 120787); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT SIX", 120788); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT SEVEN", 120789); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT EIGHT", 120790); - _unicodeCharacterMap.Add("MATHEMATICAL BOLD DIGIT NINE", 120791); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT ZERO", 120792); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT ONE", 120793); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT TWO", 120794); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT THREE", 120795); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT FOUR", 120796); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT FIVE", 120797); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT SIX", 120798); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT SEVEN", 120799); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT EIGHT", 120800); - _unicodeCharacterMap.Add("MATHEMATICAL DOUBLE STRUCK DIGIT NINE", 120801); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT ZERO", 120802); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT ONE", 120803); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT TWO", 120804); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT THREE", 120805); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT FOUR", 120806); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT FIVE", 120807); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT SIX", 120808); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT SEVEN", 120809); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT EIGHT", 120810); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF DIGIT NINE", 120811); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT ZERO", 120812); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT ONE", 120813); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT TWO", 120814); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT THREE", 120815); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT FOUR", 120816); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT FIVE", 120817); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT SIX", 120818); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT SEVEN", 120819); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT EIGHT", 120820); - _unicodeCharacterMap.Add("MATHEMATICAL SANS SERIF BOLD DIGIT NINE", 120821); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT ZERO", 120822); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT ONE", 120823); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT TWO", 120824); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT THREE", 120825); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT FOUR", 120826); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT FIVE", 120827); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT SIX", 120828); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT SEVEN", 120829); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT EIGHT", 120830); - _unicodeCharacterMap.Add("MATHEMATICAL MONOSPACE DIGIT NINE", 120831); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX", 120832); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX", 120833); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP INDEX", 120834); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL INDEX", 120835); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX", 120836); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX", 120837); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX BENT", 120838); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX BENT", 120839); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB UNDER INDEX BENT", 120840); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX RAISED KNUCKLE", 120841); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX CUPPED", 120842); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX HINGED", 120843); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX HINGED LOW", 120844); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX HINGE", 120845); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE", 120846); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX MIDDLE", 120847); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE BENT", 120848); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE RAISED KNUCKLES", 120849); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE HINGED", 120850); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX UP MIDDLE HINGED", 120851); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX HINGED MIDDLE UP", 120852); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED", 120853); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED INDEX BENT", 120854); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED MIDDLE BENT", 120855); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED CUPPED", 120856); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED HINGED", 120857); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CROSSED", 120858); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX MIDDLE CROSSED", 120859); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE BENT OVER INDEX", 120860); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX BENT OVER MIDDLE", 120861); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB", 120862); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX MIDDLE THUMB", 120863); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE STRAIGHT THUMB BENT", 120864); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE BENT THUMB STRAIGHT", 120865); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB BENT", 120866); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE", 120867); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX UP MIDDLE HINGED THUMB SIDE", 120868); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX UP MIDDLE HINGED THUMB CONJOINED", 120869); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX HINGED MIDDLE UP THUMB SIDE", 120870); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE UP SPREAD THUMB FORWARD", 120871); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB CUPPED", 120872); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB CIRCLED", 120873); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB HOOKED", 120874); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB HINGED", 120875); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT", 120876); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB SIDE", 120877); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED", 120878); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT", 120879); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB HOOKED INDEX UP", 120880); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB HOOKED MIDDLE UP", 120881); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE", 120882); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CROSSED THUMB SIDE", 120883); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB FORWARD", 120884); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD", 120885); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB CUPPED INDEX UP", 120886); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB CUPPED MIDDLE UP", 120887); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB CIRCLED INDEX UP", 120888); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB CIRCLED INDEX HINGED", 120889); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB ANGLED OUT MIDDLE UP", 120890); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB ANGLED IN MIDDLE UP", 120891); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB CIRCLED MIDDLE UP", 120892); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB CONJOINED HINGED", 120893); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB ANGLED OUT", 120894); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE THUMB ANGLED", 120895); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB ANGLED OUT INDEX UP", 120896); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED", 120897); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB ANGLED INDEX UP", 120898); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB HOOKED MIDDLE HINGED", 120899); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FOUR FINGERS", 120900); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FOUR FINGERS BENT", 120901); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FOUR FINGERS HINGED", 120902); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FOUR FINGERS CONJOINED", 120903); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FOUR FINGERS CONJOINED SPLIT", 120904); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW FOUR FINGERS CONJOINED", 120905); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST FOUR FINGERS CONJOINED BENT", 120906); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE FOUR FINGERS CONJOINED", 120907); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FIVE FINGERS SPREAD", 120908); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT HEEL FIVE FINGERS SPREAD", 120909); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FIVE FINGERS SPREAD FOUR BENT", 120910); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT HEEL FIVE FINGERS SPREAD FOUR BENT", 120911); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FIVE FINGERS SPREAD BENT", 120912); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT HEEL FIVE FINGERS SPREAD BENT", 120913); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FIVE FINGERS SPREAD THUMB FORWARD", 120914); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP FIVE FINGERS SPREAD", 120915); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP FIVE FINGERS SPREAD OPEN", 120916); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE FIVE FINGERS SPREAD OPEN", 120917); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL FIVE FINGERS SPREAD", 120918); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FIVE FINGERS SPREAD HINGED", 120919); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE", 120920); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT FIVE FINGERS SPREAD HINGED NO THUMB", 120921); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT", 120922); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT BETWEEN PALM FACINGS", 120923); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT HEEL", 120924); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT THUMB SIDE", 120925); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT HEEL THUMB SIDE", 120926); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT THUMB BENT", 120927); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT THUMB FORWARD", 120928); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT SPLIT INDEX THUMB SIDE", 120929); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT SPLIT CENTRE", 120930); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT SPLIT CENTRE THUMB SIDE", 120931); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT SPLIT CENTRE THUMB SIDE BENT", 120932); - _unicodeCharacterMap.Add("SIGNWRITING HAND FLAT SPLIT LITTLE", 120933); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW", 120934); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW THUMB SIDE", 120935); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW NO THUMB", 120936); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW THUMB FORWARD", 120937); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK CURLICUE", 120938); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK", 120939); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP OPEN", 120940); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP", 120941); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP OPEN THUMB SIDE", 120942); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP THUMB SIDE", 120943); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP OPEN NO THUMB", 120944); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP NO THUMB", 120945); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP OPEN THUMB FORWARD", 120946); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP THUMB FORWARD", 120947); - _unicodeCharacterMap.Add("SIGNWRITING HAND CURLICUE OPEN", 120948); - _unicodeCharacterMap.Add("SIGNWRITING HAND CURLICUE", 120949); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE", 120950); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL", 120951); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL THUMB SIDE", 120952); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL NO THUMB", 120953); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL THUMB FORWARD", 120954); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE OPEN", 120955); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE OPEN THUMB FORWARD", 120956); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE", 120957); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE SMALL", 120958); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE OPEN THUMB SIDE", 120959); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE THUMB SIDE", 120960); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE OPEN NO THUMB", 120961); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE NO THUMB", 120962); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE THUMB SIDE TOUCHING INDEX", 120963); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE THUMB BETWEEN MIDDLE RING", 120964); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE", 120965); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE RING", 120966); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX MIDDLE RING", 120967); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX MIDDLE RING", 120968); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX MIDDLE RING", 120969); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE LITTLE", 120970); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE RING BENT", 120971); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE RING CONJOINED", 120972); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX MIDDLE RING CONJOINED", 120973); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE DOWN", 120974); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE DOWN RIPPLE STRAIGHT", 120975); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE DOWN RIPPLE CURVED", 120976); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE DOWN OTHERS CIRCLED", 120977); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE UP", 120978); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB UNDER LITTLE UP", 120979); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE LITTLE UP", 120980); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL LITTLE UP", 120981); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE LITTLE UP", 120982); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE RAISED KNUCKLE", 120983); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE BENT", 120984); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE TOUCHES THUMB", 120985); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE THUMB", 120986); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE LITTLE THUMB", 120987); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE INDEX THUMB", 120988); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE LITTLE INDEX THUMB", 120989); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE LITTLE INDEX THUMB INDEX THUMB OUT", 120990); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE LITTLE INDEX THUMB INDEX THUMB", 120991); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST LITTLE INDEX", 120992); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE LITTLE INDEX", 120993); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE LITTLE INDEX", 120994); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE LITTLE INDEX", 120995); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE LITTLE", 120996); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX MIDDLE LITTLE", 120997); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX MIDDLE LITTLE", 120998); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE RING", 120999); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX MIDDLE LITTLE", 121000); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX MIDDLE CROSS LITTLE", 121001); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX MIDDLE CROSS LITTLE", 121002); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING DOWN", 121003); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE RING DOWN INDEX THUMB HOOK MIDDLE", 121004); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE RING DOWN MIDDLE THUMB INDEX CROSS", 121005); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING UP", 121006); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING RAISED KNUCKLE", 121007); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING LITTLE", 121008); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE RING LITTLE", 121009); - _unicodeCharacterMap.Add("SIGNWRITING HAND OVAL RING LITTLE", 121010); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE RING LITTLE", 121011); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING MIDDLE", 121012); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING MIDDLE CONJOINED", 121013); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING MIDDLE RAISED KNUCKLES", 121014); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING INDEX", 121015); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST RING THUMB", 121016); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK RING THUMB", 121017); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX RING LITTLE", 121018); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE INDEX RING LITTLE", 121019); - _unicodeCharacterMap.Add("SIGNWRITING HAND CURLICUE INDEX RING LITTLE ON", 121020); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK INDEX RING LITTLE OUT", 121021); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK INDEX RING LITTLE IN", 121022); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK INDEX RING LITTLE UNDER", 121023); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP INDEX RING LITTLE", 121024); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX RING LITTLE", 121025); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX RING LITTLE OUT", 121026); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX RING LITTLE", 121027); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE DOWN", 121028); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE MIDDLE", 121029); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE UP", 121030); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE MIDDLE UP", 121031); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE RAISED KNUCKLE", 121032); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE UP THUMB SIDE", 121033); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK MIDDLE THUMB", 121034); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE THUMB LITTLE", 121035); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE LITTLE", 121036); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST MIDDLE RING LITTLE", 121037); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE MIDDLE RING LITTLE", 121038); - _unicodeCharacterMap.Add("SIGNWRITING HAND CURLICUE MIDDLE RING LITTLE ON", 121039); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP MIDDLE RING LITTLE", 121040); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE MIDDLE RING LITTLE", 121041); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE MIDDLE RING LITTLE OUT", 121042); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE MIDDLE RING LITTLE IN", 121043); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE MIDDLE RING LITTLE", 121044); - _unicodeCharacterMap.Add("SIGNWRITING HAND CIRCLE MIDDLE RING LITTLE BENT", 121045); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW MIDDLE RING LITTLE CONJOINED", 121046); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW MIDDLE RING LITTLE CONJOINED SIDE", 121047); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK MIDDLE RING LITTLE CONJOINED OUT", 121048); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK MIDDLE RING LITTLE CONJOINED IN", 121049); - _unicodeCharacterMap.Add("SIGNWRITING HAND HOOK MIDDLE RING LITTLE CONJOINED", 121050); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX HINGED", 121051); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB SIDE", 121052); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX THUMB SIDE", 121053); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB SIDE THUMB DIAGONAL", 121054); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB SIDE THUMB CONJOINED", 121055); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB SIDE THUMB BENT", 121056); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB SIDE INDEX BENT", 121057); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB SIDE BOTH BENT", 121058); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB SIDE INDEX HINGE", 121059); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB FORWARD INDEX STRAIGHT", 121060); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB FORWARD INDEX BENT", 121061); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB HOOK", 121062); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB CURLICUE", 121063); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB CURVE THUMB INSIDE", 121064); - _unicodeCharacterMap.Add("SIGNWRITING HAND CLAW INDEX THUMB CURVE THUMB INSIDE", 121065); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB CURVE THUMB UNDER", 121066); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST INDEX THUMB CIRCLE", 121067); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP INDEX THUMB", 121068); - _unicodeCharacterMap.Add("SIGNWRITING HAND CUP INDEX THUMB OPEN", 121069); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX THUMB OPEN", 121070); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX THUMB LARGE", 121071); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX THUMB", 121072); - _unicodeCharacterMap.Add("SIGNWRITING HAND HINGE INDEX THUMB SMALL", 121073); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX THUMB OUT", 121074); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX THUMB IN", 121075); - _unicodeCharacterMap.Add("SIGNWRITING HAND ANGLE INDEX THUMB", 121076); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB", 121077); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB HEEL", 121078); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB SIDE DIAGONAL", 121079); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB SIDE CONJOINED", 121080); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB SIDE BENT", 121081); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB FORWARD", 121082); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB BETWEEN INDEX MIDDLE", 121083); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB BETWEEN MIDDLE RING", 121084); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB BETWEEN RING LITTLE", 121085); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB UNDER TWO FINGERS", 121086); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB OVER TWO FINGERS", 121087); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB UNDER THREE FINGERS", 121088); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB UNDER FOUR FINGERS", 121089); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST THUMB OVER FOUR RAISED KNUCKLES", 121090); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST", 121091); - _unicodeCharacterMap.Add("SIGNWRITING HAND FIST HEEL", 121092); - _unicodeCharacterMap.Add("SIGNWRITING TOUCH SINGLE", 121093); - _unicodeCharacterMap.Add("SIGNWRITING TOUCH MULTIPLE", 121094); - _unicodeCharacterMap.Add("SIGNWRITING TOUCH BETWEEN", 121095); - _unicodeCharacterMap.Add("SIGNWRITING GRASP SINGLE", 121096); - _unicodeCharacterMap.Add("SIGNWRITING GRASP MULTIPLE", 121097); - _unicodeCharacterMap.Add("SIGNWRITING GRASP BETWEEN", 121098); - _unicodeCharacterMap.Add("SIGNWRITING STRIKE SINGLE", 121099); - _unicodeCharacterMap.Add("SIGNWRITING STRIKE MULTIPLE", 121100); - _unicodeCharacterMap.Add("SIGNWRITING STRIKE BETWEEN", 121101); - _unicodeCharacterMap.Add("SIGNWRITING BRUSH SINGLE", 121102); - _unicodeCharacterMap.Add("SIGNWRITING BRUSH MULTIPLE", 121103); - _unicodeCharacterMap.Add("SIGNWRITING BRUSH BETWEEN", 121104); - _unicodeCharacterMap.Add("SIGNWRITING RUB SINGLE", 121105); - _unicodeCharacterMap.Add("SIGNWRITING RUB MULTIPLE", 121106); - _unicodeCharacterMap.Add("SIGNWRITING RUB BETWEEN", 121107); - _unicodeCharacterMap.Add("SIGNWRITING SURFACE SYMBOLS", 121108); - _unicodeCharacterMap.Add("SIGNWRITING SURFACE BETWEEN", 121109); - _unicodeCharacterMap.Add("SIGNWRITING SQUEEZE LARGE SINGLE", 121110); - _unicodeCharacterMap.Add("SIGNWRITING SQUEEZE SMALL SINGLE", 121111); - _unicodeCharacterMap.Add("SIGNWRITING SQUEEZE LARGE MULTIPLE", 121112); - _unicodeCharacterMap.Add("SIGNWRITING SQUEEZE SMALL MULTIPLE", 121113); - _unicodeCharacterMap.Add("SIGNWRITING SQUEEZE SEQUENTIAL", 121114); - _unicodeCharacterMap.Add("SIGNWRITING FLICK LARGE SINGLE", 121115); - _unicodeCharacterMap.Add("SIGNWRITING FLICK SMALL SINGLE", 121116); - _unicodeCharacterMap.Add("SIGNWRITING FLICK LARGE MULTIPLE", 121117); - _unicodeCharacterMap.Add("SIGNWRITING FLICK SMALL MULTIPLE", 121118); - _unicodeCharacterMap.Add("SIGNWRITING FLICK SEQUENTIAL", 121119); - _unicodeCharacterMap.Add("SIGNWRITING SQUEEZE FLICK ALTERNATING", 121120); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT HINGE UP DOWN LARGE", 121121); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT HINGE UP DOWN SMALL", 121122); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT HINGE UP SEQUENTIAL", 121123); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT HINGE DOWN SEQUENTIAL", 121124); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT HINGE UP DOWN ALTERNATING LARGE", 121125); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT HINGE UP DOWN ALTERNATING SMALL", 121126); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT HINGE SIDE TO SIDE SCISSORS", 121127); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE FINGER CONTACT", 121128); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE FINGER CONTACT", 121129); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT SMALL", 121130); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT MEDIUM", 121131); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT LARGE", 121132); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT LARGEST", 121133); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE SINGLE WRIST FLEX", 121134); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE DOUBLE STRAIGHT", 121135); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE DOUBLE WRIST FLEX", 121136); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE DOUBLE ALTERNATING", 121137); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE DOUBLE ALTERNATING WRIST FLEX", 121138); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CROSS", 121139); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE TRIPLE STRAIGHT MOVEMENT", 121140); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE TRIPLE WRIST FLEX", 121141); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE TRIPLE ALTERNATING", 121142); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE TRIPLE ALTERNATING WRIST FLEX", 121143); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE BEND SMALL", 121144); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE BEND MEDIUM", 121145); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE BEND LARGE", 121146); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CORNER SMALL", 121147); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CORNER MEDIUM", 121148); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CORNER LARGE", 121149); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CORNER ROTATION", 121150); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CHECK SMALL", 121151); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CHECK MEDIUM", 121152); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CHECK LARGE", 121153); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE BOX SMALL", 121154); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE BOX MEDIUM", 121155); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE BOX LARGE", 121156); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE ZIGZAG SMALL", 121157); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE ZIGZAG MEDIUM", 121158); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE ZIGZAG LARGE", 121159); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE PEAKS SMALL", 121160); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE PEAKS MEDIUM", 121161); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE PEAKS LARGE", 121162); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ROTATION WALLPLANE SINGLE", 121163); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ROTATION WALLPLANE DOUBLE", 121164); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ROTATION WALLPLANE ALTERNATING", 121165); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ROTATION FLOORPLANE SINGLE", 121166); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ROTATION FLOORPLANE DOUBLE", 121167); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ROTATION FLOORPLANE ALTERNATING", 121168); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE SHAKING", 121169); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ARM SPIRAL SINGLE", 121170); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ARM SPIRAL DOUBLE", 121171); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL WALLPLANE ARM SPIRAL TRIPLE", 121172); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL AWAY SMALL", 121173); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL AWAY MEDIUM", 121174); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL AWAY LARGE", 121175); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL AWAY LARGEST", 121176); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL TOWARDS SMALL", 121177); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL TOWARDS MEDIUM", 121178); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL TOWARDS LARGE", 121179); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL TOWARDS LARGEST", 121180); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY SMALL", 121181); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY MEDIUM", 121182); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY LARGE", 121183); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY LARGEST", 121184); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS SMALL", 121185); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS MEDIUM", 121186); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS LARGE", 121187); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS LARGEST", 121188); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT SMALL", 121189); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT MEDIUM", 121190); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT LARGE", 121191); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT LARGEST", 121192); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE SINGLE WRIST FLEX", 121193); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE DOUBLE STRAIGHT", 121194); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE DOUBLE WRIST FLEX", 121195); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE DOUBLE ALTERNATING", 121196); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE DOUBLE ALTERNATING WRIST FLEX", 121197); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CROSS", 121198); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE TRIPLE STRAIGHT MOVEMENT", 121199); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE TRIPLE WRIST FLEX", 121200); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE TRIPLE ALTERNATING MOVEMENT", 121201); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE TRIPLE ALTERNATING WRIST FLEX", 121202); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE BEND", 121203); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CORNER SMALL", 121204); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CORNER MEDIUM", 121205); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CORNER LARGE", 121206); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CHECK", 121207); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE BOX SMALL", 121208); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE BOX MEDIUM", 121209); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE BOX LARGE", 121210); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ZIGZAG SMALL", 121211); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ZIGZAG MEDIUM", 121212); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ZIGZAG LARGE", 121213); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE PEAKS SMALL", 121214); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE PEAKS MEDIUM", 121215); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE PEAKS LARGE", 121216); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL FLOORPLANE ROTATION FLOORPLANE SINGLE", 121217); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL FLOORPLANE ROTATION FLOORPLANE DOUBLE", 121218); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL FLOORPLANE ROTATION FLOORPLANE ALTERNATING", 121219); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL FLOORPLANE ROTATION WALLPLANE SINGLE", 121220); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL FLOORPLANE ROTATION WALLPLANE DOUBLE", 121221); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL FLOORPLANE ROTATION WALLPLANE ALTERNATING", 121222); - _unicodeCharacterMap.Add("SIGNWRITING TRAVEL FLOORPLANE SHAKING", 121223); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER SMALL", 121224); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER MEDIUM", 121225); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER LARGE", 121226); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER LARGEST", 121227); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE SMALL", 121228); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE MEDIUM", 121229); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE LARGE", 121230); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE LARGEST", 121231); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE THREE QUARTER CIRCLE SMALL", 121232); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE THREE QUARTER CIRCLE MEDIUM", 121233); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE HUMP SMALL", 121234); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE HUMP MEDIUM", 121235); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE HUMP LARGE", 121236); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE LOOP SMALL", 121237); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE LOOP MEDIUM", 121238); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE LOOP LARGE", 121239); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE LOOP SMALL DOUBLE", 121240); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE DOUBLE SMALL", 121241); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE DOUBLE MEDIUM", 121242); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE DOUBLE LARGE", 121243); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE TRIPLE SMALL", 121244); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE TRIPLE MEDIUM", 121245); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE TRIPLE LARGE", 121246); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE THEN STRAIGHT", 121247); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVED CROSS SMALL", 121248); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVED CROSS MEDIUM", 121249); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE SINGLE", 121250); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE DOUBLE", 121251); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE ALTERNATE", 121252); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE SHAKING", 121253); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE HITTING FRONT WALL", 121254); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE HUMP HITTING FRONT WALL", 121255); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE LOOP HITTING FRONT WALL", 121256); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE HITTING FRONT WALL", 121257); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE SINGLE HITTING FRONT WALL", 121258); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE DOUBLE HITTING FRONT WALL", 121259); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE ALTERNATING HITTING FRONT WALL", 121260); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE CURVE HITTING CHEST", 121261); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE HUMP HITTING CHEST", 121262); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE LOOP HITTING CHEST", 121263); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE HITTING CHEST", 121264); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE SINGLE HITTING CHEST", 121265); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE DOUBLE HITTING CHEST", 121266); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION WALLPLANE ALTERNATING HITTING CHEST", 121267); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE DIAGONAL PATH SMALL", 121268); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE DIAGONAL PATH MEDIUM", 121269); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WAVE DIAGONAL PATH LARGE", 121270); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING CEILING SMALL", 121271); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING CEILING LARGE", 121272); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE", 121273); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE", 121274); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE", 121275); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE", 121276); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING SMALL SINGLE", 121277); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING LARGE SINGLE", 121278); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE", 121279); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE", 121280); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING CEILING SMALL", 121281); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING CEILING LARGE", 121282); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE SINGLE HITTING CEILING", 121283); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE DOUBLE HITTING CEILING", 121284); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE ALTERNATING HITTING CEILING", 121285); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING FLOOR SMALL", 121286); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING FLOOR LARGE", 121287); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE", 121288); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE", 121289); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE", 121290); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE", 121291); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE", 121292); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE", 121293); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE", 121294); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE", 121295); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING FLOOR SMALL", 121296); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING FLOOR LARGE", 121297); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE SINGLE HITTING FLOOR", 121298); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE DOUBLE HITTING FLOOR", 121299); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE ALTERNATING HITTING FLOOR", 121300); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE SMALL", 121301); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE MEDIUM", 121302); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE LARGE", 121303); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE LARGEST", 121304); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE CURVE COMBINED", 121305); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE HUMP SMALL", 121306); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE LOOP SMALL", 121307); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WAVE SNAKE", 121308); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WAVE SMALL", 121309); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WAVE LARGE", 121310); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE SINGLE", 121311); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE DOUBLE", 121312); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION FLOORPLANE ALTERNATING", 121313); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE SHAKING PARALLEL", 121314); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE SMALL SINGLE", 121315); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE MEDIUM SINGLE", 121316); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE SMALL DOUBLE", 121317); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE MEDIUM DOUBLE", 121318); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE", 121319); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE", 121320); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE", 121321); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE", 121322); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE", 121323); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE", 121324); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WRIST CIRCLE FRONT SINGLE", 121325); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE WRIST CIRCLE FRONT DOUBLE", 121326); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE", 121327); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE", 121328); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE FINGER CIRCLES SINGLE", 121329); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE FINGER CIRCLES DOUBLE", 121330); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE", 121331); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE", 121332); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC ARROWHEAD SMALL", 121333); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC ARROWHEAD LARGE", 121334); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC FAST", 121335); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC SLOW", 121336); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC TENSE", 121337); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC RELAXED", 121338); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC SIMULTANEOUS", 121339); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING", 121340); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC EVERY OTHER TIME", 121341); - _unicodeCharacterMap.Add("SIGNWRITING DYNAMIC GRADUAL", 121342); - _unicodeCharacterMap.Add("SIGNWRITING HEAD", 121343); - _unicodeCharacterMap.Add("SIGNWRITING HEAD RIM", 121344); - _unicodeCharacterMap.Add("SIGNWRITING HEAD MOVEMENT WALLPLANE STRAIGHT", 121345); - _unicodeCharacterMap.Add("SIGNWRITING HEAD MOVEMENT WALLPLANE TILT", 121346); - _unicodeCharacterMap.Add("SIGNWRITING HEAD MOVEMENT FLOORPLANE STRAIGHT", 121347); - _unicodeCharacterMap.Add("SIGNWRITING HEAD MOVEMENT WALLPLANE CURVE", 121348); - _unicodeCharacterMap.Add("SIGNWRITING HEAD MOVEMENT FLOORPLANE CURVE", 121349); - _unicodeCharacterMap.Add("SIGNWRITING HEAD MOVEMENT CIRCLE", 121350); - _unicodeCharacterMap.Add("SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING", 121351); - _unicodeCharacterMap.Add("SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN", 121352); - _unicodeCharacterMap.Add("SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING", 121353); - _unicodeCharacterMap.Add("SIGNWRITING EYEBROWS STRAIGHT UP", 121354); - _unicodeCharacterMap.Add("SIGNWRITING EYEBROWS STRAIGHT NEUTRAL", 121355); - _unicodeCharacterMap.Add("SIGNWRITING EYEBROWS STRAIGHT DOWN", 121356); - _unicodeCharacterMap.Add("SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN", 121357); - _unicodeCharacterMap.Add("SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL", 121358); - _unicodeCharacterMap.Add("SIGNWRITING DREAMY EYEBROWS UP NEUTRAL", 121359); - _unicodeCharacterMap.Add("SIGNWRITING DREAMY EYEBROWS NEUTRAL UP", 121360); - _unicodeCharacterMap.Add("SIGNWRITING FOREHEAD NEUTRAL", 121361); - _unicodeCharacterMap.Add("SIGNWRITING FOREHEAD CONTACT", 121362); - _unicodeCharacterMap.Add("SIGNWRITING FOREHEAD WRINKLED", 121363); - _unicodeCharacterMap.Add("SIGNWRITING EYES OPEN", 121364); - _unicodeCharacterMap.Add("SIGNWRITING EYES SQUEEZED", 121365); - _unicodeCharacterMap.Add("SIGNWRITING EYES CLOSED", 121366); - _unicodeCharacterMap.Add("SIGNWRITING EYE BLINK SINGLE", 121367); - _unicodeCharacterMap.Add("SIGNWRITING EYE BLINK MULTIPLE", 121368); - _unicodeCharacterMap.Add("SIGNWRITING EYES HALF OPEN", 121369); - _unicodeCharacterMap.Add("SIGNWRITING EYES WIDE OPEN", 121370); - _unicodeCharacterMap.Add("SIGNWRITING EYES HALF CLOSED", 121371); - _unicodeCharacterMap.Add("SIGNWRITING EYES WIDENING MOVEMENT", 121372); - _unicodeCharacterMap.Add("SIGNWRITING EYE WINK", 121373); - _unicodeCharacterMap.Add("SIGNWRITING EYELASHES UP", 121374); - _unicodeCharacterMap.Add("SIGNWRITING EYELASHES DOWN", 121375); - _unicodeCharacterMap.Add("SIGNWRITING EYELASHES FLUTTERING", 121376); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE WALLPLANE STRAIGHT", 121377); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE WALLPLANE STRAIGHT DOUBLE", 121378); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE WALLPLANE STRAIGHT ALTERNATING", 121379); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE FLOORPLANE STRAIGHT", 121380); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE FLOORPLANE STRAIGHT DOUBLE", 121381); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE FLOORPLANE STRAIGHT ALTERNATING", 121382); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE WALLPLANE CURVED", 121383); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE FLOORPLANE CURVED", 121384); - _unicodeCharacterMap.Add("SIGNWRITING EYEGAZE WALLPLANE CIRCLING", 121385); - _unicodeCharacterMap.Add("SIGNWRITING CHEEKS PUFFED", 121386); - _unicodeCharacterMap.Add("SIGNWRITING CHEEKS NEUTRAL", 121387); - _unicodeCharacterMap.Add("SIGNWRITING CHEEKS SUCKED", 121388); - _unicodeCharacterMap.Add("SIGNWRITING TENSE CHEEKS HIGH", 121389); - _unicodeCharacterMap.Add("SIGNWRITING TENSE CHEEKS MIDDLE", 121390); - _unicodeCharacterMap.Add("SIGNWRITING TENSE CHEEKS LOW", 121391); - _unicodeCharacterMap.Add("SIGNWRITING EARS", 121392); - _unicodeCharacterMap.Add("SIGNWRITING NOSE NEUTRAL", 121393); - _unicodeCharacterMap.Add("SIGNWRITING NOSE CONTACT", 121394); - _unicodeCharacterMap.Add("SIGNWRITING NOSE WRINKLES", 121395); - _unicodeCharacterMap.Add("SIGNWRITING NOSE WIGGLES", 121396); - _unicodeCharacterMap.Add("SIGNWRITING AIR BLOWING OUT", 121397); - _unicodeCharacterMap.Add("SIGNWRITING AIR SUCKING IN", 121398); - _unicodeCharacterMap.Add("SIGNWRITING AIR BLOW SMALL ROTATIONS", 121399); - _unicodeCharacterMap.Add("SIGNWRITING AIR SUCK SMALL ROTATIONS", 121400); - _unicodeCharacterMap.Add("SIGNWRITING BREATH INHALE", 121401); - _unicodeCharacterMap.Add("SIGNWRITING BREATH EXHALE", 121402); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH CLOSED NEUTRAL", 121403); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH CLOSED FORWARD", 121404); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH CLOSED CONTACT", 121405); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH SMILE", 121406); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH SMILE WRINKLED", 121407); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH SMILE OPEN", 121408); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH FROWN", 121409); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH FROWN WRINKLED", 121410); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH FROWN OPEN", 121411); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN CIRCLE", 121412); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN FORWARD", 121413); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN WRINKLED", 121414); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN OVAL", 121415); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN OVAL WRINKLED", 121416); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN OVAL YAWN", 121417); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN RECTANGLE", 121418); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED", 121419); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH OPEN RECTANGLE YAWN", 121420); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH KISS", 121421); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH KISS FORWARD", 121422); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH KISS WRINKLED", 121423); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH TENSE", 121424); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH TENSE FORWARD", 121425); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH TENSE SUCKED", 121426); - _unicodeCharacterMap.Add("SIGNWRITING LIPS PRESSED TOGETHER", 121427); - _unicodeCharacterMap.Add("SIGNWRITING LIP LOWER OVER UPPER", 121428); - _unicodeCharacterMap.Add("SIGNWRITING LIP UPPER OVER LOWER", 121429); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH CORNERS", 121430); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH WRINKLES SINGLE", 121431); - _unicodeCharacterMap.Add("SIGNWRITING MOUTH WRINKLES DOUBLE", 121432); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE STICKING OUT FAR", 121433); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE LICKING LIPS", 121434); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE TIP BETWEEN LIPS", 121435); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH", 121436); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE INSIDE MOUTH RELAXED", 121437); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE MOVES AGAINST CHEEK", 121438); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE CENTRE STICKING OUT", 121439); - _unicodeCharacterMap.Add("SIGNWRITING TONGUE CENTRE INSIDE MOUTH", 121440); - _unicodeCharacterMap.Add("SIGNWRITING TEETH", 121441); - _unicodeCharacterMap.Add("SIGNWRITING TEETH MOVEMENT", 121442); - _unicodeCharacterMap.Add("SIGNWRITING TEETH ON TONGUE", 121443); - _unicodeCharacterMap.Add("SIGNWRITING TEETH ON TONGUE MOVEMENT", 121444); - _unicodeCharacterMap.Add("SIGNWRITING TEETH ON LIPS", 121445); - _unicodeCharacterMap.Add("SIGNWRITING TEETH ON LIPS MOVEMENT", 121446); - _unicodeCharacterMap.Add("SIGNWRITING TEETH BITE LIPS", 121447); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT WALLPLANE JAW", 121448); - _unicodeCharacterMap.Add("SIGNWRITING MOVEMENT FLOORPLANE JAW", 121449); - _unicodeCharacterMap.Add("SIGNWRITING NECK", 121450); - _unicodeCharacterMap.Add("SIGNWRITING HAIR", 121451); - _unicodeCharacterMap.Add("SIGNWRITING EXCITEMENT", 121452); - _unicodeCharacterMap.Add("SIGNWRITING SHOULDER HIP SPINE", 121453); - _unicodeCharacterMap.Add("SIGNWRITING SHOULDER HIP POSITIONS", 121454); - _unicodeCharacterMap.Add("SIGNWRITING WALLPLANE SHOULDER HIP MOVE", 121455); - _unicodeCharacterMap.Add("SIGNWRITING FLOORPLANE SHOULDER HIP MOVE", 121456); - _unicodeCharacterMap.Add("SIGNWRITING SHOULDER TILTING FROM WAIST", 121457); - _unicodeCharacterMap.Add("SIGNWRITING TORSO WALLPLANE STRAIGHT STRETCH", 121458); - _unicodeCharacterMap.Add("SIGNWRITING TORSO WALLPLANE CURVED BEND", 121459); - _unicodeCharacterMap.Add("SIGNWRITING TORSO FLOORPLANE TWISTING", 121460); - _unicodeCharacterMap.Add("SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS", 121461); - _unicodeCharacterMap.Add("SIGNWRITING LIMB COMBINATION", 121462); - _unicodeCharacterMap.Add("SIGNWRITING LIMB LENGTH 1", 121463); - _unicodeCharacterMap.Add("SIGNWRITING LIMB LENGTH 2", 121464); - _unicodeCharacterMap.Add("SIGNWRITING LIMB LENGTH 3", 121465); - _unicodeCharacterMap.Add("SIGNWRITING LIMB LENGTH 4", 121466); - _unicodeCharacterMap.Add("SIGNWRITING LIMB LENGTH 5", 121467); - _unicodeCharacterMap.Add("SIGNWRITING LIMB LENGTH 6", 121468); - _unicodeCharacterMap.Add("SIGNWRITING LIMB LENGTH 7", 121469); - _unicodeCharacterMap.Add("SIGNWRITING FINGER", 121470); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION WALLPLANE SPACE", 121471); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION FLOORPLANE SPACE", 121472); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION HEIGHT", 121473); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION WIDTH", 121474); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION DEPTH", 121475); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION HEAD NECK", 121476); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION TORSO", 121477); - _unicodeCharacterMap.Add("SIGNWRITING LOCATION LIMBS DIGITS", 121478); - _unicodeCharacterMap.Add("SIGNWRITING COMMA", 121479); - _unicodeCharacterMap.Add("SIGNWRITING FULL STOP", 121480); - _unicodeCharacterMap.Add("SIGNWRITING SEMICOLON", 121481); - _unicodeCharacterMap.Add("SIGNWRITING COLON", 121482); - _unicodeCharacterMap.Add("SIGNWRITING PARENTHESIS", 121483); - _unicodeCharacterMap.Add("SIGNWRITING FILL MODIFIER 2", 121499); - _unicodeCharacterMap.Add("SIGNWRITING FILL MODIFIER 3", 121500); - _unicodeCharacterMap.Add("SIGNWRITING FILL MODIFIER 4", 121501); - _unicodeCharacterMap.Add("SIGNWRITING FILL MODIFIER 5", 121502); - _unicodeCharacterMap.Add("SIGNWRITING FILL MODIFIER 6", 121503); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 2", 121505); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 3", 121506); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 4", 121507); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 5", 121508); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 6", 121509); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 7", 121510); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 8", 121511); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 9", 121512); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 10", 121513); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 11", 121514); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 12", 121515); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 13", 121516); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 14", 121517); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 15", 121518); - _unicodeCharacterMap.Add("SIGNWRITING ROTATION MODIFIER 16", 121519); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER AZU", 122880); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER BUKY", 122881); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER VEDE", 122882); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER GLAGOLI", 122883); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER DOBRO", 122884); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER YESTU", 122885); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER ZHIVETE", 122886); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER ZEMLJA", 122888); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER IZHE", 122889); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER INITIAL IZHE", 122890); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER I", 122891); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER DJERVI", 122892); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER KAKO", 122893); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER LJUDIJE", 122894); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER MYSLITE", 122895); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER NASHI", 122896); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER ONU", 122897); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER POKOJI", 122898); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER RITSI", 122899); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER SLOVO", 122900); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER TVRIDO", 122901); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER UKU", 122902); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER FRITU", 122903); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER HERU", 122904); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER SHTA", 122907); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER TSI", 122908); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER CHRIVI", 122909); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER SHA", 122910); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER YERU", 122911); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER YERI", 122912); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER YATI", 122913); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER YU", 122915); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER SMALL YUS", 122916); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER YO", 122918); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS", 122919); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER BIG YUS", 122920); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER IOTATED BIG YUS", 122921); - _unicodeCharacterMap.Add("COMBINING GLAGOLITIC LETTER FITA", 122922); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M001 KI", 124928); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M002 KA", 124929); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M003 KU", 124930); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M065 KEE", 124931); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M095 KE", 124932); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M076 KOO", 124933); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M048 KO", 124934); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M179 KUA", 124935); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M004 WI", 124936); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M005 WA", 124937); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M006 WU", 124938); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M126 WEE", 124939); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M118 WE", 124940); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M114 WOO", 124941); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M045 WO", 124942); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M194 WUI", 124943); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M143 WEI", 124944); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M061 WVI", 124945); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M049 WVA", 124946); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M139 WVE", 124947); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M007 MIN", 124948); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M008 MAN", 124949); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M009 MUN", 124950); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M059 MEN", 124951); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M094 MON", 124952); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M154 MUAN", 124953); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M189 MUEN", 124954); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M010 BI", 124955); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M011 BA", 124956); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M012 BU", 124957); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M150 BEE", 124958); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M097 BE", 124959); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M103 BOO", 124960); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M138 BO", 124961); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M013 I", 124962); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M014 A", 124963); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M015 U", 124964); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M163 EE", 124965); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M100 E", 124966); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M165 OO", 124967); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M147 O", 124968); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M137 EI", 124969); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M131 IN", 124970); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M135 IN", 124971); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M195 AN", 124972); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M178 EN", 124973); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M019 SI", 124974); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M020 SA", 124975); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M021 SU", 124976); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M162 SEE", 124977); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M116 SE", 124978); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M136 SOO", 124979); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M079 SO", 124980); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M196 SIA", 124981); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M025 LI", 124982); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M026 LA", 124983); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M027 LU", 124984); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M084 LEE", 124985); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M073 LE", 124986); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M054 LOO", 124987); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M153 LO", 124988); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M110 LONG LE", 124989); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M016 DI", 124990); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M017 DA", 124991); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M018 DU", 124992); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M089 DEE", 124993); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M180 DOO", 124994); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M181 DO", 124995); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M022 TI", 124996); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M023 TA", 124997); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M024 TU", 124998); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M091 TEE", 124999); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M055 TE", 125000); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M104 TOO", 125001); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M069 TO", 125002); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M028 JI", 125003); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M029 JA", 125004); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M030 JU", 125005); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M157 JEE", 125006); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M113 JE", 125007); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M160 JOO", 125008); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M063 JO", 125009); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M175 LONG JO", 125010); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M031 YI", 125011); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M032 YA", 125012); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M033 YU", 125013); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M109 YEE", 125014); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M080 YE", 125015); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M141 YOO", 125016); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M121 YO", 125017); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M034 FI", 125018); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M035 FA", 125019); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M036 FU", 125020); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M078 FEE", 125021); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M075 FE", 125022); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M133 FOO", 125023); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M088 FO", 125024); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M197 FUA", 125025); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M101 FAN", 125026); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M037 NIN", 125027); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M038 NAN", 125028); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M039 NUN", 125029); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M117 NEN", 125030); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M169 NON", 125031); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M176 HI", 125032); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M041 HA", 125033); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M186 HU", 125034); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M040 HEE", 125035); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M096 HE", 125036); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M042 HOO", 125037); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M140 HO", 125038); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M083 HEEI", 125039); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M128 HOOU", 125040); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M053 HIN", 125041); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M130 HAN", 125042); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M087 HUN", 125043); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M052 HEN", 125044); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M193 HON", 125045); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M046 HUAN", 125046); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M090 NGGI", 125047); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M043 NGGA", 125048); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M082 NGGU", 125049); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M115 NGGEE", 125050); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M146 NGGE", 125051); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M156 NGGOO", 125052); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M120 NGGO", 125053); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M159 NGGAA", 125054); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M127 NGGUA", 125055); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M086 LONG NGGE", 125056); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M106 LONG NGGOO", 125057); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M183 LONG NGGO", 125058); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M155 GI", 125059); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M111 GA", 125060); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M168 GU", 125061); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M190 GEE", 125062); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M166 GUEI", 125063); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M167 GUAN", 125064); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M184 NGEN", 125065); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M057 NGON", 125066); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M177 NGUAN", 125067); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M068 PI", 125068); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M099 PA", 125069); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M050 PU", 125070); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M081 PEE", 125071); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M051 PE", 125072); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M102 POO", 125073); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M066 PO", 125074); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M145 MBI", 125075); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M062 MBA", 125076); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M122 MBU", 125077); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M047 MBEE", 125078); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M188 MBEE", 125079); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M072 MBE", 125080); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M172 MBOO", 125081); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M174 MBO", 125082); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M187 MBUU", 125083); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M161 LONG MBE", 125084); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M105 LONG MBOO", 125085); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M142 LONG MBO", 125086); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M132 KPI", 125087); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M092 KPA", 125088); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M074 KPU", 125089); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M044 KPEE", 125090); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M108 KPE", 125091); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M112 KPOO", 125092); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M158 KPO", 125093); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M124 GBI", 125094); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M056 GBA", 125095); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M148 GBU", 125096); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M093 GBEE", 125097); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M107 GBE", 125098); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M071 GBOO", 125099); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M070 GBO", 125100); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M171 RA", 125101); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M123 NDI", 125102); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M129 NDA", 125103); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M125 NDU", 125104); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M191 NDEE", 125105); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M119 NDE", 125106); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M067 NDOO", 125107); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M064 NDO", 125108); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M152 NJA", 125109); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M192 NJU", 125110); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M149 NJEE", 125111); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M134 NJOO", 125112); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M182 VI", 125113); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M185 VA", 125114); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M151 VU", 125115); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M173 VEE", 125116); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M085 VE", 125117); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M144 VOO", 125118); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M077 VO", 125119); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M164 NYIN", 125120); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M058 NYAN", 125121); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M170 NYUN", 125122); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M098 NYEN", 125123); - _unicodeCharacterMap.Add("MENDE KIKAKUI SYLLABLE M060 NYON", 125124); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT ONE", 125127); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT TWO", 125128); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT THREE", 125129); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT FOUR", 125130); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT FIVE", 125131); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT SIX", 125132); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT SEVEN", 125133); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT EIGHT", 125134); - _unicodeCharacterMap.Add("MENDE KIKAKUI DIGIT NINE", 125135); - _unicodeCharacterMap.Add("MENDE KIKAKUI COMBINING NUMBER TEENS", 125136); - _unicodeCharacterMap.Add("MENDE KIKAKUI COMBINING NUMBER TENS", 125137); - _unicodeCharacterMap.Add("MENDE KIKAKUI COMBINING NUMBER HUNDREDS", 125138); - _unicodeCharacterMap.Add("MENDE KIKAKUI COMBINING NUMBER THOUSANDS", 125139); - _unicodeCharacterMap.Add("MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS", 125140); - _unicodeCharacterMap.Add("MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS", 125141); - _unicodeCharacterMap.Add("MENDE KIKAKUI COMBINING NUMBER MILLIONS", 125142); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER ALIF", 125184); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER DAALI", 125185); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER LAAM", 125186); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER MIIM", 125187); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER BA", 125188); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER SINNYIIYHE", 125189); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER PE", 125190); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER BHE", 125191); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER RA", 125192); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER E", 125193); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER FA", 125194); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER I", 125195); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER O", 125196); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER DHA", 125197); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER YHE", 125198); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER WAW", 125199); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER NUN", 125200); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER KAF", 125201); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER YA", 125202); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER U", 125203); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER JIIM", 125204); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER CHI", 125205); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER HA", 125206); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER QAAF", 125207); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER GA", 125208); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER NYA", 125209); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER TU", 125210); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER NHA", 125211); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER VA", 125212); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER KHA", 125213); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER GBE", 125214); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER ZAL", 125215); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER KPO", 125216); - _unicodeCharacterMap.Add("ADLAM CAPITAL LETTER SHA", 125217); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER ALIF", 125218); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER DAALI", 125219); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER LAAM", 125220); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER MIIM", 125221); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER BA", 125222); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER SINNYIIYHE", 125223); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER PE", 125224); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER BHE", 125225); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER RA", 125226); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER E", 125227); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER FA", 125228); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER I", 125229); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER O", 125230); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER DHA", 125231); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER YHE", 125232); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER WAW", 125233); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER NUN", 125234); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER KAF", 125235); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER YA", 125236); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER U", 125237); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER JIIM", 125238); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER CHI", 125239); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER HA", 125240); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER QAAF", 125241); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER GA", 125242); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER NYA", 125243); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER TU", 125244); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER NHA", 125245); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER VA", 125246); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER KHA", 125247); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER GBE", 125248); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER ZAL", 125249); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER KPO", 125250); - _unicodeCharacterMap.Add("ADLAM SMALL LETTER SHA", 125251); - _unicodeCharacterMap.Add("ADLAM ALIF LENGTHENER", 125252); - _unicodeCharacterMap.Add("ADLAM VOWEL LENGTHENER", 125253); - _unicodeCharacterMap.Add("ADLAM GEMINATION MARK", 125254); - _unicodeCharacterMap.Add("ADLAM HAMZA", 125255); - _unicodeCharacterMap.Add("ADLAM CONSONANT MODIFIER", 125256); - _unicodeCharacterMap.Add("ADLAM GEMINATE CONSONANT MODIFIER", 125257); - _unicodeCharacterMap.Add("ADLAM NUKTA", 125258); - _unicodeCharacterMap.Add("ADLAM DIGIT ZERO", 125264); - _unicodeCharacterMap.Add("ADLAM DIGIT ONE", 125265); - _unicodeCharacterMap.Add("ADLAM DIGIT TWO", 125266); - _unicodeCharacterMap.Add("ADLAM DIGIT THREE", 125267); - _unicodeCharacterMap.Add("ADLAM DIGIT FOUR", 125268); - _unicodeCharacterMap.Add("ADLAM DIGIT FIVE", 125269); - _unicodeCharacterMap.Add("ADLAM DIGIT SIX", 125270); - _unicodeCharacterMap.Add("ADLAM DIGIT SEVEN", 125271); - _unicodeCharacterMap.Add("ADLAM DIGIT EIGHT", 125272); - _unicodeCharacterMap.Add("ADLAM DIGIT NINE", 125273); - _unicodeCharacterMap.Add("ADLAM INITIAL EXCLAMATION MARK", 125278); - _unicodeCharacterMap.Add("ADLAM INITIAL QUESTION MARK", 125279); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL ALEF", 126464); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL BEH", 126465); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL JEEM", 126466); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DAL", 126467); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL WAW", 126469); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL ZAIN", 126470); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL HAH", 126471); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAH", 126472); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL YEH", 126473); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL KAF", 126474); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LAM", 126475); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL MEEM", 126476); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL NOON", 126477); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL SEEN", 126478); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL AIN", 126479); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL FEH", 126480); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL SAD", 126481); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL QAF", 126482); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL REH", 126483); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL SHEEN", 126484); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TEH", 126485); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL THEH", 126486); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL KHAH", 126487); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL THAL", 126488); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DAD", 126489); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL ZAH", 126490); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL GHAIN", 126491); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOTLESS BEH", 126492); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOTLESS NOON", 126493); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOTLESS FEH", 126494); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOTLESS QAF", 126495); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL BEH", 126497); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL JEEM", 126498); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL HEH", 126500); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL HAH", 126503); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL YEH", 126505); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL KAF", 126506); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL LAM", 126507); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL MEEM", 126508); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL NOON", 126509); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL SEEN", 126510); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL AIN", 126511); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL FEH", 126512); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL SAD", 126513); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL QAF", 126514); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL SHEEN", 126516); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL TEH", 126517); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL THEH", 126518); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL KHAH", 126519); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL DAD", 126521); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL INITIAL GHAIN", 126523); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED JEEM", 126530); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED HAH", 126535); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED YEH", 126537); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED LAM", 126539); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED NOON", 126541); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED SEEN", 126542); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED AIN", 126543); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED SAD", 126545); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED QAF", 126546); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED SHEEN", 126548); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED KHAH", 126551); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED DAD", 126553); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED GHAIN", 126555); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED DOTLESS NOON", 126557); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL TAILED DOTLESS QAF", 126559); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED BEH", 126561); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED JEEM", 126562); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED HEH", 126564); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED HAH", 126567); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED TAH", 126568); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED YEH", 126569); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED KAF", 126570); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED MEEM", 126572); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED NOON", 126573); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED SEEN", 126574); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED AIN", 126575); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED FEH", 126576); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED SAD", 126577); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED QAF", 126578); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED SHEEN", 126580); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED TEH", 126581); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED THEH", 126582); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED KHAH", 126583); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED DAD", 126585); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED ZAH", 126586); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED GHAIN", 126587); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED DOTLESS BEH", 126588); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL STRETCHED DOTLESS FEH", 126590); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED ALEF", 126592); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED BEH", 126593); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED JEEM", 126594); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED DAL", 126595); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED HEH", 126596); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED WAW", 126597); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED ZAIN", 126598); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED HAH", 126599); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED TAH", 126600); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED YEH", 126601); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED LAM", 126603); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED MEEM", 126604); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED NOON", 126605); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED SEEN", 126606); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED AIN", 126607); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED FEH", 126608); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED SAD", 126609); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED QAF", 126610); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED REH", 126611); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED SHEEN", 126612); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED TEH", 126613); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED THEH", 126614); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED KHAH", 126615); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED THAL", 126616); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED DAD", 126617); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED ZAH", 126618); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL LOOPED GHAIN", 126619); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK BEH", 126625); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK JEEM", 126626); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK DAL", 126627); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK WAW", 126629); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK ZAIN", 126630); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK HAH", 126631); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK TAH", 126632); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK YEH", 126633); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK LAM", 126635); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK MEEM", 126636); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK NOON", 126637); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK SEEN", 126638); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK AIN", 126639); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK FEH", 126640); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK SAD", 126641); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK QAF", 126642); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK REH", 126643); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK SHEEN", 126644); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK TEH", 126645); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK THEH", 126646); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK KHAH", 126647); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK THAL", 126648); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK DAD", 126649); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK ZAH", 126650); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL DOUBLE STRUCK GHAIN", 126651); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL", 126704); - _unicodeCharacterMap.Add("ARABIC MATHEMATICAL OPERATOR HAH WITH DAL", 126705); - _unicodeCharacterMap.Add("MAHJONG TILE EAST WIND", 126976); - _unicodeCharacterMap.Add("MAHJONG TILE SOUTH WIND", 126977); - _unicodeCharacterMap.Add("MAHJONG TILE WEST WIND", 126978); - _unicodeCharacterMap.Add("MAHJONG TILE NORTH WIND", 126979); - _unicodeCharacterMap.Add("MAHJONG TILE RED DRAGON", 126980); - _unicodeCharacterMap.Add("MAHJONG TILE GREEN DRAGON", 126981); - _unicodeCharacterMap.Add("MAHJONG TILE WHITE DRAGON", 126982); - _unicodeCharacterMap.Add("MAHJONG TILE ONE OF CHARACTERS", 126983); - _unicodeCharacterMap.Add("MAHJONG TILE TWO OF CHARACTERS", 126984); - _unicodeCharacterMap.Add("MAHJONG TILE THREE OF CHARACTERS", 126985); - _unicodeCharacterMap.Add("MAHJONG TILE FOUR OF CHARACTERS", 126986); - _unicodeCharacterMap.Add("MAHJONG TILE FIVE OF CHARACTERS", 126987); - _unicodeCharacterMap.Add("MAHJONG TILE SIX OF CHARACTERS", 126988); - _unicodeCharacterMap.Add("MAHJONG TILE SEVEN OF CHARACTERS", 126989); - _unicodeCharacterMap.Add("MAHJONG TILE EIGHT OF CHARACTERS", 126990); - _unicodeCharacterMap.Add("MAHJONG TILE NINE OF CHARACTERS", 126991); - _unicodeCharacterMap.Add("MAHJONG TILE ONE OF BAMBOOS", 126992); - _unicodeCharacterMap.Add("MAHJONG TILE TWO OF BAMBOOS", 126993); - _unicodeCharacterMap.Add("MAHJONG TILE THREE OF BAMBOOS", 126994); - _unicodeCharacterMap.Add("MAHJONG TILE FOUR OF BAMBOOS", 126995); - _unicodeCharacterMap.Add("MAHJONG TILE FIVE OF BAMBOOS", 126996); - _unicodeCharacterMap.Add("MAHJONG TILE SIX OF BAMBOOS", 126997); - _unicodeCharacterMap.Add("MAHJONG TILE SEVEN OF BAMBOOS", 126998); - _unicodeCharacterMap.Add("MAHJONG TILE EIGHT OF BAMBOOS", 126999); - _unicodeCharacterMap.Add("MAHJONG TILE NINE OF BAMBOOS", 127000); - _unicodeCharacterMap.Add("MAHJONG TILE ONE OF CIRCLES", 127001); - _unicodeCharacterMap.Add("MAHJONG TILE TWO OF CIRCLES", 127002); - _unicodeCharacterMap.Add("MAHJONG TILE THREE OF CIRCLES", 127003); - _unicodeCharacterMap.Add("MAHJONG TILE FOUR OF CIRCLES", 127004); - _unicodeCharacterMap.Add("MAHJONG TILE FIVE OF CIRCLES", 127005); - _unicodeCharacterMap.Add("MAHJONG TILE SIX OF CIRCLES", 127006); - _unicodeCharacterMap.Add("MAHJONG TILE SEVEN OF CIRCLES", 127007); - _unicodeCharacterMap.Add("MAHJONG TILE EIGHT OF CIRCLES", 127008); - _unicodeCharacterMap.Add("MAHJONG TILE NINE OF CIRCLES", 127009); - _unicodeCharacterMap.Add("MAHJONG TILE PLUM", 127010); - _unicodeCharacterMap.Add("MAHJONG TILE ORCHID", 127011); - _unicodeCharacterMap.Add("MAHJONG TILE BAMBOO", 127012); - _unicodeCharacterMap.Add("MAHJONG TILE CHRYSANTHEMUM", 127013); - _unicodeCharacterMap.Add("MAHJONG TILE SPRING", 127014); - _unicodeCharacterMap.Add("MAHJONG TILE SUMMER", 127015); - _unicodeCharacterMap.Add("MAHJONG TILE AUTUMN", 127016); - _unicodeCharacterMap.Add("MAHJONG TILE WINTER", 127017); - _unicodeCharacterMap.Add("MAHJONG TILE JOKER", 127018); - _unicodeCharacterMap.Add("MAHJONG TILE BACK", 127019); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL BACK", 127024); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 00 00", 127025); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 00 01", 127026); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 00 02", 127027); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 00 03", 127028); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 00 04", 127029); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 00 05", 127030); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 00 06", 127031); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 01 00", 127032); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 01 01", 127033); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 01 02", 127034); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 01 03", 127035); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 01 04", 127036); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 01 05", 127037); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 01 06", 127038); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 02 00", 127039); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 02 01", 127040); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 02 02", 127041); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 02 03", 127042); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 02 04", 127043); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 02 05", 127044); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 02 06", 127045); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 03 00", 127046); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 03 01", 127047); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 03 02", 127048); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 03 03", 127049); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 03 04", 127050); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 03 05", 127051); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 03 06", 127052); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 04 00", 127053); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 04 01", 127054); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 04 02", 127055); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 04 03", 127056); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 04 04", 127057); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 04 05", 127058); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 04 06", 127059); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 05 00", 127060); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 05 01", 127061); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 05 02", 127062); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 05 03", 127063); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 05 04", 127064); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 05 05", 127065); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 05 06", 127066); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 06 00", 127067); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 06 01", 127068); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 06 02", 127069); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 06 03", 127070); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 06 04", 127071); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 06 05", 127072); - _unicodeCharacterMap.Add("DOMINO TILE HORIZONTAL 06 06", 127073); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL BACK", 127074); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 00 00", 127075); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 00 01", 127076); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 00 02", 127077); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 00 03", 127078); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 00 04", 127079); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 00 05", 127080); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 00 06", 127081); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 01 00", 127082); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 01 01", 127083); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 01 02", 127084); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 01 03", 127085); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 01 04", 127086); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 01 05", 127087); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 01 06", 127088); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 02 00", 127089); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 02 01", 127090); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 02 02", 127091); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 02 03", 127092); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 02 04", 127093); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 02 05", 127094); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 02 06", 127095); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 03 00", 127096); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 03 01", 127097); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 03 02", 127098); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 03 03", 127099); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 03 04", 127100); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 03 05", 127101); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 03 06", 127102); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 04 00", 127103); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 04 01", 127104); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 04 02", 127105); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 04 03", 127106); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 04 04", 127107); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 04 05", 127108); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 04 06", 127109); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 05 00", 127110); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 05 01", 127111); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 05 02", 127112); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 05 03", 127113); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 05 04", 127114); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 05 05", 127115); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 05 06", 127116); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 06 00", 127117); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 06 01", 127118); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 06 02", 127119); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 06 03", 127120); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 06 04", 127121); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 06 05", 127122); - _unicodeCharacterMap.Add("DOMINO TILE VERTICAL 06 06", 127123); - _unicodeCharacterMap.Add("PLAYING CARD BACK", 127136); - _unicodeCharacterMap.Add("PLAYING CARD ACE OF SPADES", 127137); - _unicodeCharacterMap.Add("PLAYING CARD TWO OF SPADES", 127138); - _unicodeCharacterMap.Add("PLAYING CARD THREE OF SPADES", 127139); - _unicodeCharacterMap.Add("PLAYING CARD FOUR OF SPADES", 127140); - _unicodeCharacterMap.Add("PLAYING CARD FIVE OF SPADES", 127141); - _unicodeCharacterMap.Add("PLAYING CARD SIX OF SPADES", 127142); - _unicodeCharacterMap.Add("PLAYING CARD SEVEN OF SPADES", 127143); - _unicodeCharacterMap.Add("PLAYING CARD EIGHT OF SPADES", 127144); - _unicodeCharacterMap.Add("PLAYING CARD NINE OF SPADES", 127145); - _unicodeCharacterMap.Add("PLAYING CARD TEN OF SPADES", 127146); - _unicodeCharacterMap.Add("PLAYING CARD JACK OF SPADES", 127147); - _unicodeCharacterMap.Add("PLAYING CARD KNIGHT OF SPADES", 127148); - _unicodeCharacterMap.Add("PLAYING CARD QUEEN OF SPADES", 127149); - _unicodeCharacterMap.Add("PLAYING CARD KING OF SPADES", 127150); - _unicodeCharacterMap.Add("PLAYING CARD ACE OF HEARTS", 127153); - _unicodeCharacterMap.Add("PLAYING CARD TWO OF HEARTS", 127154); - _unicodeCharacterMap.Add("PLAYING CARD THREE OF HEARTS", 127155); - _unicodeCharacterMap.Add("PLAYING CARD FOUR OF HEARTS", 127156); - _unicodeCharacterMap.Add("PLAYING CARD FIVE OF HEARTS", 127157); - _unicodeCharacterMap.Add("PLAYING CARD SIX OF HEARTS", 127158); - _unicodeCharacterMap.Add("PLAYING CARD SEVEN OF HEARTS", 127159); - _unicodeCharacterMap.Add("PLAYING CARD EIGHT OF HEARTS", 127160); - _unicodeCharacterMap.Add("PLAYING CARD NINE OF HEARTS", 127161); - _unicodeCharacterMap.Add("PLAYING CARD TEN OF HEARTS", 127162); - _unicodeCharacterMap.Add("PLAYING CARD JACK OF HEARTS", 127163); - _unicodeCharacterMap.Add("PLAYING CARD KNIGHT OF HEARTS", 127164); - _unicodeCharacterMap.Add("PLAYING CARD QUEEN OF HEARTS", 127165); - _unicodeCharacterMap.Add("PLAYING CARD KING OF HEARTS", 127166); - _unicodeCharacterMap.Add("PLAYING CARD RED JOKER", 127167); - _unicodeCharacterMap.Add("PLAYING CARD ACE OF DIAMONDS", 127169); - _unicodeCharacterMap.Add("PLAYING CARD TWO OF DIAMONDS", 127170); - _unicodeCharacterMap.Add("PLAYING CARD THREE OF DIAMONDS", 127171); - _unicodeCharacterMap.Add("PLAYING CARD FOUR OF DIAMONDS", 127172); - _unicodeCharacterMap.Add("PLAYING CARD FIVE OF DIAMONDS", 127173); - _unicodeCharacterMap.Add("PLAYING CARD SIX OF DIAMONDS", 127174); - _unicodeCharacterMap.Add("PLAYING CARD SEVEN OF DIAMONDS", 127175); - _unicodeCharacterMap.Add("PLAYING CARD EIGHT OF DIAMONDS", 127176); - _unicodeCharacterMap.Add("PLAYING CARD NINE OF DIAMONDS", 127177); - _unicodeCharacterMap.Add("PLAYING CARD TEN OF DIAMONDS", 127178); - _unicodeCharacterMap.Add("PLAYING CARD JACK OF DIAMONDS", 127179); - _unicodeCharacterMap.Add("PLAYING CARD KNIGHT OF DIAMONDS", 127180); - _unicodeCharacterMap.Add("PLAYING CARD QUEEN OF DIAMONDS", 127181); - _unicodeCharacterMap.Add("PLAYING CARD KING OF DIAMONDS", 127182); - _unicodeCharacterMap.Add("PLAYING CARD BLACK JOKER", 127183); - _unicodeCharacterMap.Add("PLAYING CARD ACE OF CLUBS", 127185); - _unicodeCharacterMap.Add("PLAYING CARD TWO OF CLUBS", 127186); - _unicodeCharacterMap.Add("PLAYING CARD THREE OF CLUBS", 127187); - _unicodeCharacterMap.Add("PLAYING CARD FOUR OF CLUBS", 127188); - _unicodeCharacterMap.Add("PLAYING CARD FIVE OF CLUBS", 127189); - _unicodeCharacterMap.Add("PLAYING CARD SIX OF CLUBS", 127190); - _unicodeCharacterMap.Add("PLAYING CARD SEVEN OF CLUBS", 127191); - _unicodeCharacterMap.Add("PLAYING CARD EIGHT OF CLUBS", 127192); - _unicodeCharacterMap.Add("PLAYING CARD NINE OF CLUBS", 127193); - _unicodeCharacterMap.Add("PLAYING CARD TEN OF CLUBS", 127194); - _unicodeCharacterMap.Add("PLAYING CARD JACK OF CLUBS", 127195); - _unicodeCharacterMap.Add("PLAYING CARD KNIGHT OF CLUBS", 127196); - _unicodeCharacterMap.Add("PLAYING CARD QUEEN OF CLUBS", 127197); - _unicodeCharacterMap.Add("PLAYING CARD KING OF CLUBS", 127198); - _unicodeCharacterMap.Add("PLAYING CARD WHITE JOKER", 127199); - _unicodeCharacterMap.Add("PLAYING CARD FOOL", 127200); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 1", 127201); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 2", 127202); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 3", 127203); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 4", 127204); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 5", 127205); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 6", 127206); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 7", 127207); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 8", 127208); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 9", 127209); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 10", 127210); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 11", 127211); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 12", 127212); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 13", 127213); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 14", 127214); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 15", 127215); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 16", 127216); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 17", 127217); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 18", 127218); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 19", 127219); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 20", 127220); - _unicodeCharacterMap.Add("PLAYING CARD TRUMP 21", 127221); - _unicodeCharacterMap.Add("DIGIT ZERO FULL STOP", 127232); - _unicodeCharacterMap.Add("DIGIT ZERO COMMA", 127233); - _unicodeCharacterMap.Add("DIGIT ONE COMMA", 127234); - _unicodeCharacterMap.Add("DIGIT TWO COMMA", 127235); - _unicodeCharacterMap.Add("DIGIT THREE COMMA", 127236); - _unicodeCharacterMap.Add("DIGIT FOUR COMMA", 127237); - _unicodeCharacterMap.Add("DIGIT FIVE COMMA", 127238); - _unicodeCharacterMap.Add("DIGIT SIX COMMA", 127239); - _unicodeCharacterMap.Add("DIGIT SEVEN COMMA", 127240); - _unicodeCharacterMap.Add("DIGIT EIGHT COMMA", 127241); - _unicodeCharacterMap.Add("DIGIT NINE COMMA", 127242); - _unicodeCharacterMap.Add("DINGBAT CIRCLED SANS SERIF DIGIT ZERO", 127243); - _unicodeCharacterMap.Add("DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT ZERO", 127244); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER A", 127248); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER B", 127249); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER C", 127250); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER D", 127251); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER E", 127252); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER F", 127253); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER G", 127254); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER H", 127255); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER I", 127256); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER J", 127257); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER K", 127258); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER L", 127259); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER M", 127260); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER N", 127261); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER O", 127262); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER P", 127263); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER Q", 127264); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER R", 127265); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER S", 127266); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER T", 127267); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER U", 127268); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER V", 127269); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER W", 127270); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER X", 127271); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER Y", 127272); - _unicodeCharacterMap.Add("PARENTHESIZED LATIN CAPITAL LETTER Z", 127273); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S", 127274); - _unicodeCharacterMap.Add("CIRCLED ITALIC LATIN CAPITAL LETTER C", 127275); - _unicodeCharacterMap.Add("CIRCLED ITALIC LATIN CAPITAL LETTER R", 127276); - _unicodeCharacterMap.Add("CIRCLED CD", 127277); - _unicodeCharacterMap.Add("CIRCLED WZ", 127278); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER A", 127280); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER B", 127281); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER C", 127282); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER D", 127283); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER E", 127284); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER F", 127285); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER G", 127286); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER H", 127287); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER I", 127288); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER J", 127289); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER K", 127290); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER L", 127291); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER M", 127292); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER N", 127293); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER O", 127294); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER P", 127295); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER Q", 127296); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER R", 127297); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER S", 127298); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER T", 127299); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER U", 127300); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER V", 127301); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER W", 127302); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER X", 127303); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER Y", 127304); - _unicodeCharacterMap.Add("SQUARED LATIN CAPITAL LETTER Z", 127305); - _unicodeCharacterMap.Add("SQUARED HV", 127306); - _unicodeCharacterMap.Add("SQUARED MV", 127307); - _unicodeCharacterMap.Add("SQUARED SD", 127308); - _unicodeCharacterMap.Add("SQUARED SS", 127309); - _unicodeCharacterMap.Add("SQUARED PPV", 127310); - _unicodeCharacterMap.Add("SQUARED WC", 127311); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER A", 127312); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER B", 127313); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER C", 127314); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER D", 127315); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER E", 127316); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER F", 127317); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER G", 127318); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER H", 127319); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER I", 127320); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER J", 127321); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER K", 127322); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER L", 127323); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER M", 127324); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER N", 127325); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER O", 127326); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER P", 127327); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER Q", 127328); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER R", 127329); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER S", 127330); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER T", 127331); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER U", 127332); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER V", 127333); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER W", 127334); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER X", 127335); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER Y", 127336); - _unicodeCharacterMap.Add("NEGATIVE CIRCLED LATIN CAPITAL LETTER Z", 127337); - _unicodeCharacterMap.Add("RAISED MC SIGN", 127338); - _unicodeCharacterMap.Add("RAISED MD SIGN", 127339); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER A", 127344); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER B", 127345); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER C", 127346); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER D", 127347); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER E", 127348); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER F", 127349); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER G", 127350); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER H", 127351); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER I", 127352); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER J", 127353); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER K", 127354); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER L", 127355); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER M", 127356); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER N", 127357); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER O", 127358); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER P", 127359); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER Q", 127360); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER R", 127361); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER S", 127362); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER T", 127363); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER U", 127364); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER V", 127365); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER W", 127366); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER X", 127367); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER Y", 127368); - _unicodeCharacterMap.Add("NEGATIVE SQUARED LATIN CAPITAL LETTER Z", 127369); - _unicodeCharacterMap.Add("CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P", 127370); - _unicodeCharacterMap.Add("NEGATIVE SQUARED IC", 127371); - _unicodeCharacterMap.Add("NEGATIVE SQUARED PA", 127372); - _unicodeCharacterMap.Add("NEGATIVE SQUARED SA", 127373); - _unicodeCharacterMap.Add("NEGATIVE SQUARED AB", 127374); - _unicodeCharacterMap.Add("NEGATIVE SQUARED WC", 127375); - _unicodeCharacterMap.Add("SQUARE DJ", 127376); - _unicodeCharacterMap.Add("SQUARED CL", 127377); - _unicodeCharacterMap.Add("SQUARED COOL", 127378); - _unicodeCharacterMap.Add("SQUARED FREE", 127379); - _unicodeCharacterMap.Add("SQUARED ID", 127380); - _unicodeCharacterMap.Add("SQUARED NEW", 127381); - _unicodeCharacterMap.Add("SQUARED NG", 127382); - _unicodeCharacterMap.Add("SQUARED OK", 127383); - _unicodeCharacterMap.Add("SQUARED SOS", 127384); - _unicodeCharacterMap.Add("SQUARED UP WITH EXCLAMATION MARK", 127385); - _unicodeCharacterMap.Add("SQUARED VS", 127386); - _unicodeCharacterMap.Add("SQUARED THREE D", 127387); - _unicodeCharacterMap.Add("SQUARED SECOND SCREEN", 127388); - _unicodeCharacterMap.Add("SQUARED TWO K", 127389); - _unicodeCharacterMap.Add("SQUARED FOUR K", 127390); - _unicodeCharacterMap.Add("SQUARED EIGHT K", 127391); - _unicodeCharacterMap.Add("SQUARED FIVE POINT ONE", 127392); - _unicodeCharacterMap.Add("SQUARED SEVEN POINT ONE", 127393); - _unicodeCharacterMap.Add("SQUARED TWENTY TWO POINT TWO", 127394); - _unicodeCharacterMap.Add("SQUARED SIXTY P", 127395); - _unicodeCharacterMap.Add("SQUARED ONE HUNDRED TWENTY P", 127396); - _unicodeCharacterMap.Add("SQUARED LATIN SMALL LETTER D", 127397); - _unicodeCharacterMap.Add("SQUARED HC", 127398); - _unicodeCharacterMap.Add("SQUARED HDR", 127399); - _unicodeCharacterMap.Add("SQUARED HI RES", 127400); - _unicodeCharacterMap.Add("SQUARED LOSSLESS", 127401); - _unicodeCharacterMap.Add("SQUARED SHV", 127402); - _unicodeCharacterMap.Add("SQUARED UHD", 127403); - _unicodeCharacterMap.Add("SQUARED VOD", 127404); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER A", 127462); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER B", 127463); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER C", 127464); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER D", 127465); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER E", 127466); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER F", 127467); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER G", 127468); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER H", 127469); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER I", 127470); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER J", 127471); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER K", 127472); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER L", 127473); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER M", 127474); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER N", 127475); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER O", 127476); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER P", 127477); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER Q", 127478); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER R", 127479); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER S", 127480); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER T", 127481); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER U", 127482); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER V", 127483); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER W", 127484); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER X", 127485); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER Y", 127486); - _unicodeCharacterMap.Add("REGIONAL INDICATOR SYMBOL LETTER Z", 127487); - _unicodeCharacterMap.Add("SQUARE HIRAGANA HOKA", 127488); - _unicodeCharacterMap.Add("SQUARED KATAKANA KOKO", 127489); - _unicodeCharacterMap.Add("SQUARED KATAKANA SA", 127490); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 624B", 127504); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 5B57", 127505); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 53CC", 127506); - _unicodeCharacterMap.Add("SQUARED KATAKANA DE", 127507); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 4E8C", 127508); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 591A", 127509); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 89E3", 127510); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 5929", 127511); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 4EA4", 127512); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6620", 127513); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 7121", 127514); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6599", 127515); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 524D", 127516); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 5F8C", 127517); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 518D", 127518); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 65B0", 127519); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 521D", 127520); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 7D42", 127521); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 751F", 127522); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 8CA9", 127523); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 58F0", 127524); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 5439", 127525); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6F14", 127526); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6295", 127527); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6355", 127528); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 4E00", 127529); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 4E09", 127530); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 904A", 127531); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 5DE6", 127532); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 4E2D", 127533); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 53F3", 127534); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6307", 127535); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 8D70", 127536); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6253", 127537); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 7981", 127538); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 7A7A", 127539); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 5408", 127540); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6E80", 127541); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6709", 127542); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 6708", 127543); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 7533", 127544); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 5272", 127545); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 55B6", 127546); - _unicodeCharacterMap.Add("SQUARED CJK UNIFIED IDEOGRAPH 914D", 127547); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 672C", 127552); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 4E09", 127553); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 4E8C", 127554); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 5B89", 127555); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 70B9", 127556); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 6253", 127557); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 76D7", 127558); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 52DD", 127559); - _unicodeCharacterMap.Add("TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 6557", 127560); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH ADVANTAGE", 127568); - _unicodeCharacterMap.Add("CIRCLED IDEOGRAPH ACCEPT", 127569); - _unicodeCharacterMap.Add("CYCLONE", 127744); - _unicodeCharacterMap.Add("FOGGY", 127745); - _unicodeCharacterMap.Add("CLOSED UMBRELLA", 127746); - _unicodeCharacterMap.Add("NIGHT WITH STARS", 127747); - _unicodeCharacterMap.Add("SUNRISE OVER MOUNTAINS", 127748); - _unicodeCharacterMap.Add("SUNRISE", 127749); - _unicodeCharacterMap.Add("CITYSCAPE AT DUSK", 127750); - _unicodeCharacterMap.Add("SUNSET OVER BUILDINGS", 127751); - _unicodeCharacterMap.Add("RAINBOW", 127752); - _unicodeCharacterMap.Add("BRIDGE AT NIGHT", 127753); - _unicodeCharacterMap.Add("WATER WAVE", 127754); - _unicodeCharacterMap.Add("VOLCANO", 127755); - _unicodeCharacterMap.Add("MILKY WAY", 127756); - _unicodeCharacterMap.Add("EARTH GLOBE EUROPE AFRICA", 127757); - _unicodeCharacterMap.Add("EARTH GLOBE AMERICAS", 127758); - _unicodeCharacterMap.Add("EARTH GLOBE ASIA AUSTRALIA", 127759); - _unicodeCharacterMap.Add("GLOBE WITH MERIDIANS", 127760); - _unicodeCharacterMap.Add("NEW MOON SYMBOL", 127761); - _unicodeCharacterMap.Add("WAXING CRESCENT MOON SYMBOL", 127762); - _unicodeCharacterMap.Add("FIRST QUARTER MOON SYMBOL", 127763); - _unicodeCharacterMap.Add("WAXING GIBBOUS MOON SYMBOL", 127764); - _unicodeCharacterMap.Add("FULL MOON SYMBOL", 127765); - _unicodeCharacterMap.Add("WANING GIBBOUS MOON SYMBOL", 127766); - _unicodeCharacterMap.Add("LAST QUARTER MOON SYMBOL", 127767); - _unicodeCharacterMap.Add("WANING CRESCENT MOON SYMBOL", 127768); - _unicodeCharacterMap.Add("CRESCENT MOON", 127769); - _unicodeCharacterMap.Add("NEW MOON WITH FACE", 127770); - _unicodeCharacterMap.Add("FIRST QUARTER MOON WITH FACE", 127771); - _unicodeCharacterMap.Add("LAST QUARTER MOON WITH FACE", 127772); - _unicodeCharacterMap.Add("FULL MOON WITH FACE", 127773); - _unicodeCharacterMap.Add("SUN WITH FACE", 127774); - _unicodeCharacterMap.Add("GLOWING STAR", 127775); - _unicodeCharacterMap.Add("SHOOTING STAR", 127776); - _unicodeCharacterMap.Add("THERMOMETER", 127777); - _unicodeCharacterMap.Add("BLACK DROPLET", 127778); - _unicodeCharacterMap.Add("WHITE SUN", 127779); - _unicodeCharacterMap.Add("WHITE SUN WITH SMALL CLOUD", 127780); - _unicodeCharacterMap.Add("WHITE SUN BEHIND CLOUD", 127781); - _unicodeCharacterMap.Add("WHITE SUN BEHIND CLOUD WITH RAIN", 127782); - _unicodeCharacterMap.Add("CLOUD WITH RAIN", 127783); - _unicodeCharacterMap.Add("CLOUD WITH SNOW", 127784); - _unicodeCharacterMap.Add("CLOUD WITH LIGHTNING", 127785); - _unicodeCharacterMap.Add("CLOUD WITH TORNADO", 127786); - _unicodeCharacterMap.Add("FOG", 127787); - _unicodeCharacterMap.Add("WIND BLOWING FACE", 127788); - _unicodeCharacterMap.Add("HOT DOG", 127789); - _unicodeCharacterMap.Add("TACO", 127790); - _unicodeCharacterMap.Add("BURRITO", 127791); - _unicodeCharacterMap.Add("CHESTNUT", 127792); - _unicodeCharacterMap.Add("SEEDLING", 127793); - _unicodeCharacterMap.Add("EVERGREEN TREE", 127794); - _unicodeCharacterMap.Add("DECIDUOUS TREE", 127795); - _unicodeCharacterMap.Add("PALM TREE", 127796); - _unicodeCharacterMap.Add("CACTUS", 127797); - _unicodeCharacterMap.Add("HOT PEPPER", 127798); - _unicodeCharacterMap.Add("TULIP", 127799); - _unicodeCharacterMap.Add("CHERRY BLOSSOM", 127800); - _unicodeCharacterMap.Add("ROSE", 127801); - _unicodeCharacterMap.Add("HIBISCUS", 127802); - _unicodeCharacterMap.Add("SUNFLOWER", 127803); - _unicodeCharacterMap.Add("BLOSSOM", 127804); - _unicodeCharacterMap.Add("EAR OF MAIZE", 127805); - _unicodeCharacterMap.Add("EAR OF RICE", 127806); - _unicodeCharacterMap.Add("HERB", 127807); - _unicodeCharacterMap.Add("FOUR LEAF CLOVER", 127808); - _unicodeCharacterMap.Add("MAPLE LEAF", 127809); - _unicodeCharacterMap.Add("FALLEN LEAF", 127810); - _unicodeCharacterMap.Add("LEAF FLUTTERING IN WIND", 127811); - _unicodeCharacterMap.Add("MUSHROOM", 127812); - _unicodeCharacterMap.Add("TOMATO", 127813); - _unicodeCharacterMap.Add("AUBERGINE", 127814); - _unicodeCharacterMap.Add("GRAPES", 127815); - _unicodeCharacterMap.Add("MELON", 127816); - _unicodeCharacterMap.Add("WATERMELON", 127817); - _unicodeCharacterMap.Add("TANGERINE", 127818); - _unicodeCharacterMap.Add("LEMON", 127819); - _unicodeCharacterMap.Add("BANANA", 127820); - _unicodeCharacterMap.Add("PINEAPPLE", 127821); - _unicodeCharacterMap.Add("RED APPLE", 127822); - _unicodeCharacterMap.Add("GREEN APPLE", 127823); - _unicodeCharacterMap.Add("PEAR", 127824); - _unicodeCharacterMap.Add("PEACH", 127825); - _unicodeCharacterMap.Add("CHERRIES", 127826); - _unicodeCharacterMap.Add("STRAWBERRY", 127827); - _unicodeCharacterMap.Add("HAMBURGER", 127828); - _unicodeCharacterMap.Add("SLICE OF PIZZA", 127829); - _unicodeCharacterMap.Add("MEAT ON BONE", 127830); - _unicodeCharacterMap.Add("POULTRY LEG", 127831); - _unicodeCharacterMap.Add("RICE CRACKER", 127832); - _unicodeCharacterMap.Add("RICE BALL", 127833); - _unicodeCharacterMap.Add("COOKED RICE", 127834); - _unicodeCharacterMap.Add("CURRY AND RICE", 127835); - _unicodeCharacterMap.Add("STEAMING BOWL", 127836); - _unicodeCharacterMap.Add("SPAGHETTI", 127837); - _unicodeCharacterMap.Add("BREAD", 127838); - _unicodeCharacterMap.Add("FRENCH FRIES", 127839); - _unicodeCharacterMap.Add("ROASTED SWEET POTATO", 127840); - _unicodeCharacterMap.Add("DANGO", 127841); - _unicodeCharacterMap.Add("ODEN", 127842); - _unicodeCharacterMap.Add("SUSHI", 127843); - _unicodeCharacterMap.Add("FRIED SHRIMP", 127844); - _unicodeCharacterMap.Add("FISH CAKE WITH SWIRL DESIGN", 127845); - _unicodeCharacterMap.Add("SOFT ICE CREAM", 127846); - _unicodeCharacterMap.Add("SHAVED ICE", 127847); - _unicodeCharacterMap.Add("ICE CREAM", 127848); - _unicodeCharacterMap.Add("DOUGHNUT", 127849); - _unicodeCharacterMap.Add("COOKIE", 127850); - _unicodeCharacterMap.Add("CHOCOLATE BAR", 127851); - _unicodeCharacterMap.Add("CANDY", 127852); - _unicodeCharacterMap.Add("LOLLIPOP", 127853); - _unicodeCharacterMap.Add("CUSTARD", 127854); - _unicodeCharacterMap.Add("HONEY POT", 127855); - _unicodeCharacterMap.Add("SHORTCAKE", 127856); - _unicodeCharacterMap.Add("BENTO BOX", 127857); - _unicodeCharacterMap.Add("POT OF FOOD", 127858); - _unicodeCharacterMap.Add("COOKING", 127859); - _unicodeCharacterMap.Add("FORK AND KNIFE", 127860); - _unicodeCharacterMap.Add("TEACUP WITHOUT HANDLE", 127861); - _unicodeCharacterMap.Add("SAKE BOTTLE AND CUP", 127862); - _unicodeCharacterMap.Add("WINE GLASS", 127863); - _unicodeCharacterMap.Add("COCKTAIL GLASS", 127864); - _unicodeCharacterMap.Add("TROPICAL DRINK", 127865); - _unicodeCharacterMap.Add("BEER MUG", 127866); - _unicodeCharacterMap.Add("CLINKING BEER MUGS", 127867); - _unicodeCharacterMap.Add("BABY BOTTLE", 127868); - _unicodeCharacterMap.Add("FORK AND KNIFE WITH PLATE", 127869); - _unicodeCharacterMap.Add("BOTTLE WITH POPPING CORK", 127870); - _unicodeCharacterMap.Add("POPCORN", 127871); - _unicodeCharacterMap.Add("RIBBON", 127872); - _unicodeCharacterMap.Add("WRAPPED PRESENT", 127873); - _unicodeCharacterMap.Add("BIRTHDAY CAKE", 127874); - _unicodeCharacterMap.Add("JACK O LANTERN", 127875); - _unicodeCharacterMap.Add("CHRISTMAS TREE", 127876); - _unicodeCharacterMap.Add("FATHER CHRISTMAS", 127877); - _unicodeCharacterMap.Add("FIREWORKS", 127878); - _unicodeCharacterMap.Add("FIREWORK SPARKLER", 127879); - _unicodeCharacterMap.Add("BALLOON", 127880); - _unicodeCharacterMap.Add("PARTY POPPER", 127881); - _unicodeCharacterMap.Add("CONFETTI BALL", 127882); - _unicodeCharacterMap.Add("TANABATA TREE", 127883); - _unicodeCharacterMap.Add("CROSSED FLAGS", 127884); - _unicodeCharacterMap.Add("PINE DECORATION", 127885); - _unicodeCharacterMap.Add("JAPANESE DOLLS", 127886); - _unicodeCharacterMap.Add("CARP STREAMER", 127887); - _unicodeCharacterMap.Add("WIND CHIME", 127888); - _unicodeCharacterMap.Add("MOON VIEWING CEREMONY", 127889); - _unicodeCharacterMap.Add("SCHOOL SATCHEL", 127890); - _unicodeCharacterMap.Add("GRADUATION CAP", 127891); - _unicodeCharacterMap.Add("HEART WITH TIP ON THE LEFT", 127892); - _unicodeCharacterMap.Add("BOUQUET OF FLOWERS", 127893); - _unicodeCharacterMap.Add("MILITARY MEDAL", 127894); - _unicodeCharacterMap.Add("REMINDER RIBBON", 127895); - _unicodeCharacterMap.Add("MUSICAL KEYBOARD WITH JACKS", 127896); - _unicodeCharacterMap.Add("STUDIO MICROPHONE", 127897); - _unicodeCharacterMap.Add("LEVEL SLIDER", 127898); - _unicodeCharacterMap.Add("CONTROL KNOBS", 127899); - _unicodeCharacterMap.Add("BEAMED ASCENDING MUSICAL NOTES", 127900); - _unicodeCharacterMap.Add("BEAMED DESCENDING MUSICAL NOTES", 127901); - _unicodeCharacterMap.Add("FILM FRAMES", 127902); - _unicodeCharacterMap.Add("ADMISSION TICKETS", 127903); - _unicodeCharacterMap.Add("CAROUSEL HORSE", 127904); - _unicodeCharacterMap.Add("FERRIS WHEEL", 127905); - _unicodeCharacterMap.Add("ROLLER COASTER", 127906); - _unicodeCharacterMap.Add("FISHING POLE AND FISH", 127907); - _unicodeCharacterMap.Add("MICROPHONE", 127908); - _unicodeCharacterMap.Add("MOVIE CAMERA", 127909); - _unicodeCharacterMap.Add("CINEMA", 127910); - _unicodeCharacterMap.Add("HEADPHONE", 127911); - _unicodeCharacterMap.Add("ARTIST PALETTE", 127912); - _unicodeCharacterMap.Add("TOP HAT", 127913); - _unicodeCharacterMap.Add("CIRCUS TENT", 127914); - _unicodeCharacterMap.Add("TICKET", 127915); - _unicodeCharacterMap.Add("CLAPPER BOARD", 127916); - _unicodeCharacterMap.Add("PERFORMING ARTS", 127917); - _unicodeCharacterMap.Add("VIDEO GAME", 127918); - _unicodeCharacterMap.Add("DIRECT HIT", 127919); - _unicodeCharacterMap.Add("SLOT MACHINE", 127920); - _unicodeCharacterMap.Add("BILLIARDS", 127921); - _unicodeCharacterMap.Add("GAME DIE", 127922); - _unicodeCharacterMap.Add("BOWLING", 127923); - _unicodeCharacterMap.Add("FLOWER PLAYING CARDS", 127924); - _unicodeCharacterMap.Add("MUSICAL NOTE", 127925); - _unicodeCharacterMap.Add("MULTIPLE MUSICAL NOTES", 127926); - _unicodeCharacterMap.Add("SAXOPHONE", 127927); - _unicodeCharacterMap.Add("GUITAR", 127928); - _unicodeCharacterMap.Add("MUSICAL KEYBOARD", 127929); - _unicodeCharacterMap.Add("TRUMPET", 127930); - _unicodeCharacterMap.Add("VIOLIN", 127931); - _unicodeCharacterMap.Add("MUSICAL SCORE", 127932); - _unicodeCharacterMap.Add("RUNNING SHIRT WITH SASH", 127933); - _unicodeCharacterMap.Add("TENNIS RACQUET AND BALL", 127934); - _unicodeCharacterMap.Add("SKI AND SKI BOOT", 127935); - _unicodeCharacterMap.Add("BASKETBALL AND HOOP", 127936); - _unicodeCharacterMap.Add("CHEQUERED FLAG", 127937); - _unicodeCharacterMap.Add("SNOWBOARDER", 127938); - _unicodeCharacterMap.Add("RUNNER", 127939); - _unicodeCharacterMap.Add("SURFER", 127940); - _unicodeCharacterMap.Add("SPORTS MEDAL", 127941); - _unicodeCharacterMap.Add("TROPHY", 127942); - _unicodeCharacterMap.Add("HORSE RACING", 127943); - _unicodeCharacterMap.Add("AMERICAN FOOTBALL", 127944); - _unicodeCharacterMap.Add("RUGBY FOOTBALL", 127945); - _unicodeCharacterMap.Add("SWIMMER", 127946); - _unicodeCharacterMap.Add("WEIGHT LIFTER", 127947); - _unicodeCharacterMap.Add("GOLFER", 127948); - _unicodeCharacterMap.Add("RACING MOTORCYCLE", 127949); - _unicodeCharacterMap.Add("RACING CAR", 127950); - _unicodeCharacterMap.Add("CRICKET BAT AND BALL", 127951); - _unicodeCharacterMap.Add("VOLLEYBALL", 127952); - _unicodeCharacterMap.Add("FIELD HOCKEY STICK AND BALL", 127953); - _unicodeCharacterMap.Add("ICE HOCKEY STICK AND PUCK", 127954); - _unicodeCharacterMap.Add("TABLE TENNIS PADDLE AND BALL", 127955); - _unicodeCharacterMap.Add("SNOW CAPPED MOUNTAIN", 127956); - _unicodeCharacterMap.Add("CAMPING", 127957); - _unicodeCharacterMap.Add("BEACH WITH UMBRELLA", 127958); - _unicodeCharacterMap.Add("BUILDING CONSTRUCTION", 127959); - _unicodeCharacterMap.Add("HOUSE BUILDINGS", 127960); - _unicodeCharacterMap.Add("CITYSCAPE", 127961); - _unicodeCharacterMap.Add("DERELICT HOUSE BUILDING", 127962); - _unicodeCharacterMap.Add("CLASSICAL BUILDING", 127963); - _unicodeCharacterMap.Add("DESERT", 127964); - _unicodeCharacterMap.Add("DESERT ISLAND", 127965); - _unicodeCharacterMap.Add("NATIONAL PARK", 127966); - _unicodeCharacterMap.Add("STADIUM", 127967); - _unicodeCharacterMap.Add("HOUSE BUILDING", 127968); - _unicodeCharacterMap.Add("HOUSE WITH GARDEN", 127969); - _unicodeCharacterMap.Add("OFFICE BUILDING", 127970); - _unicodeCharacterMap.Add("JAPANESE POST OFFICE", 127971); - _unicodeCharacterMap.Add("EUROPEAN POST OFFICE", 127972); - _unicodeCharacterMap.Add("HOSPITAL", 127973); - _unicodeCharacterMap.Add("BANK", 127974); - _unicodeCharacterMap.Add("AUTOMATED TELLER MACHINE", 127975); - _unicodeCharacterMap.Add("HOTEL", 127976); - _unicodeCharacterMap.Add("LOVE HOTEL", 127977); - _unicodeCharacterMap.Add("CONVENIENCE STORE", 127978); - _unicodeCharacterMap.Add("SCHOOL", 127979); - _unicodeCharacterMap.Add("DEPARTMENT STORE", 127980); - _unicodeCharacterMap.Add("FACTORY", 127981); - _unicodeCharacterMap.Add("IZAKAYA LANTERN", 127982); - _unicodeCharacterMap.Add("JAPANESE CASTLE", 127983); - _unicodeCharacterMap.Add("EUROPEAN CASTLE", 127984); - _unicodeCharacterMap.Add("WHITE PENNANT", 127985); - _unicodeCharacterMap.Add("BLACK PENNANT", 127986); - _unicodeCharacterMap.Add("WAVING WHITE FLAG", 127987); - _unicodeCharacterMap.Add("WAVING BLACK FLAG", 127988); - _unicodeCharacterMap.Add("ROSETTE", 127989); - _unicodeCharacterMap.Add("BLACK ROSETTE", 127990); - _unicodeCharacterMap.Add("LABEL", 127991); - _unicodeCharacterMap.Add("BADMINTON RACQUET AND SHUTTLECOCK", 127992); - _unicodeCharacterMap.Add("BOW AND ARROW", 127993); - _unicodeCharacterMap.Add("AMPHORA", 127994); - _unicodeCharacterMap.Add("EMOJI MODIFIER FITZPATRICK TYPE 1 2", 127995); - _unicodeCharacterMap.Add("EMOJI MODIFIER FITZPATRICK TYPE 3", 127996); - _unicodeCharacterMap.Add("EMOJI MODIFIER FITZPATRICK TYPE 4", 127997); - _unicodeCharacterMap.Add("EMOJI MODIFIER FITZPATRICK TYPE 5", 127998); - _unicodeCharacterMap.Add("EMOJI MODIFIER FITZPATRICK TYPE 6", 127999); - _unicodeCharacterMap.Add("RAT", 128000); - _unicodeCharacterMap.Add("MOUSE", 128001); - _unicodeCharacterMap.Add("OX", 128002); - _unicodeCharacterMap.Add("WATER BUFFALO", 128003); - _unicodeCharacterMap.Add("COW", 128004); - _unicodeCharacterMap.Add("TIGER", 128005); - _unicodeCharacterMap.Add("LEOPARD", 128006); - _unicodeCharacterMap.Add("RABBIT", 128007); - _unicodeCharacterMap.Add("CAT", 128008); - _unicodeCharacterMap.Add("DRAGON", 128009); - _unicodeCharacterMap.Add("CROCODILE", 128010); - _unicodeCharacterMap.Add("WHALE", 128011); - _unicodeCharacterMap.Add("SNAIL", 128012); - _unicodeCharacterMap.Add("SNAKE", 128013); - _unicodeCharacterMap.Add("HORSE", 128014); - _unicodeCharacterMap.Add("RAM", 128015); - _unicodeCharacterMap.Add("GOAT", 128016); - _unicodeCharacterMap.Add("SHEEP", 128017); - _unicodeCharacterMap.Add("MONKEY", 128018); - _unicodeCharacterMap.Add("ROOSTER", 128019); - _unicodeCharacterMap.Add("CHICKEN", 128020); - _unicodeCharacterMap.Add("DOG", 128021); - _unicodeCharacterMap.Add("PIG", 128022); - _unicodeCharacterMap.Add("BOAR", 128023); - _unicodeCharacterMap.Add("ELEPHANT", 128024); - _unicodeCharacterMap.Add("OCTOPUS", 128025); - _unicodeCharacterMap.Add("SPIRAL SHELL", 128026); - _unicodeCharacterMap.Add("BUG", 128027); - _unicodeCharacterMap.Add("ANT", 128028); - _unicodeCharacterMap.Add("HONEYBEE", 128029); - _unicodeCharacterMap.Add("LADY BEETLE", 128030); - _unicodeCharacterMap.Add("FISH", 128031); - _unicodeCharacterMap.Add("TROPICAL FISH", 128032); - _unicodeCharacterMap.Add("BLOWFISH", 128033); - _unicodeCharacterMap.Add("TURTLE", 128034); - _unicodeCharacterMap.Add("HATCHING CHICK", 128035); - _unicodeCharacterMap.Add("BABY CHICK", 128036); - _unicodeCharacterMap.Add("FRONT FACING BABY CHICK", 128037); - _unicodeCharacterMap.Add("BIRD", 128038); - _unicodeCharacterMap.Add("PENGUIN", 128039); - _unicodeCharacterMap.Add("KOALA", 128040); - _unicodeCharacterMap.Add("POODLE", 128041); - _unicodeCharacterMap.Add("DROMEDARY CAMEL", 128042); - _unicodeCharacterMap.Add("BACTRIAN CAMEL", 128043); - _unicodeCharacterMap.Add("DOLPHIN", 128044); - _unicodeCharacterMap.Add("MOUSE FACE", 128045); - _unicodeCharacterMap.Add("COW FACE", 128046); - _unicodeCharacterMap.Add("TIGER FACE", 128047); - _unicodeCharacterMap.Add("RABBIT FACE", 128048); - _unicodeCharacterMap.Add("CAT FACE", 128049); - _unicodeCharacterMap.Add("DRAGON FACE", 128050); - _unicodeCharacterMap.Add("SPOUTING WHALE", 128051); - _unicodeCharacterMap.Add("HORSE FACE", 128052); - _unicodeCharacterMap.Add("MONKEY FACE", 128053); - _unicodeCharacterMap.Add("DOG FACE", 128054); - _unicodeCharacterMap.Add("PIG FACE", 128055); - _unicodeCharacterMap.Add("FROG FACE", 128056); - _unicodeCharacterMap.Add("HAMSTER FACE", 128057); - _unicodeCharacterMap.Add("WOLF FACE", 128058); - _unicodeCharacterMap.Add("BEAR FACE", 128059); - _unicodeCharacterMap.Add("PANDA FACE", 128060); - _unicodeCharacterMap.Add("PIG NOSE", 128061); - _unicodeCharacterMap.Add("PAW PRINTS", 128062); - _unicodeCharacterMap.Add("CHIPMUNK", 128063); - _unicodeCharacterMap.Add("EYES", 128064); - _unicodeCharacterMap.Add("EYE", 128065); - _unicodeCharacterMap.Add("EAR", 128066); - _unicodeCharacterMap.Add("NOSE", 128067); - _unicodeCharacterMap.Add("MOUTH", 128068); - _unicodeCharacterMap.Add("TONGUE", 128069); - _unicodeCharacterMap.Add("WHITE UP POINTING BACKHAND INDEX", 128070); - _unicodeCharacterMap.Add("WHITE DOWN POINTING BACKHAND INDEX", 128071); - _unicodeCharacterMap.Add("WHITE LEFT POINTING BACKHAND INDEX", 128072); - _unicodeCharacterMap.Add("WHITE RIGHT POINTING BACKHAND INDEX", 128073); - _unicodeCharacterMap.Add("FISTED HAND SIGN", 128074); - _unicodeCharacterMap.Add("WAVING HAND SIGN", 128075); - _unicodeCharacterMap.Add("OK HAND SIGN", 128076); - _unicodeCharacterMap.Add("THUMBS UP SIGN", 128077); - _unicodeCharacterMap.Add("THUMBS DOWN SIGN", 128078); - _unicodeCharacterMap.Add("CLAPPING HANDS SIGN", 128079); - _unicodeCharacterMap.Add("OPEN HANDS SIGN", 128080); - _unicodeCharacterMap.Add("CROWN", 128081); - _unicodeCharacterMap.Add("WOMANS HAT", 128082); - _unicodeCharacterMap.Add("EYEGLASSES", 128083); - _unicodeCharacterMap.Add("NECKTIE", 128084); - _unicodeCharacterMap.Add("T SHIRT", 128085); - _unicodeCharacterMap.Add("JEANS", 128086); - _unicodeCharacterMap.Add("DRESS", 128087); - _unicodeCharacterMap.Add("KIMONO", 128088); - _unicodeCharacterMap.Add("BIKINI", 128089); - _unicodeCharacterMap.Add("WOMANS CLOTHES", 128090); - _unicodeCharacterMap.Add("PURSE", 128091); - _unicodeCharacterMap.Add("HANDBAG", 128092); - _unicodeCharacterMap.Add("POUCH", 128093); - _unicodeCharacterMap.Add("MANS SHOE", 128094); - _unicodeCharacterMap.Add("ATHLETIC SHOE", 128095); - _unicodeCharacterMap.Add("HIGH HEELED SHOE", 128096); - _unicodeCharacterMap.Add("WOMANS SANDAL", 128097); - _unicodeCharacterMap.Add("WOMANS BOOTS", 128098); - _unicodeCharacterMap.Add("FOOTPRINTS", 128099); - _unicodeCharacterMap.Add("BUST IN SILHOUETTE", 128100); - _unicodeCharacterMap.Add("BUSTS IN SILHOUETTE", 128101); - _unicodeCharacterMap.Add("BOY", 128102); - _unicodeCharacterMap.Add("GIRL", 128103); - _unicodeCharacterMap.Add("MAN", 128104); - _unicodeCharacterMap.Add("WOMAN", 128105); - _unicodeCharacterMap.Add("FAMILY", 128106); - _unicodeCharacterMap.Add("MAN AND WOMAN HOLDING HANDS", 128107); - _unicodeCharacterMap.Add("TWO MEN HOLDING HANDS", 128108); - _unicodeCharacterMap.Add("TWO WOMEN HOLDING HANDS", 128109); - _unicodeCharacterMap.Add("POLICE OFFICER", 128110); - _unicodeCharacterMap.Add("WOMAN WITH BUNNY EARS", 128111); - _unicodeCharacterMap.Add("BRIDE WITH VEIL", 128112); - _unicodeCharacterMap.Add("PERSON WITH BLOND HAIR", 128113); - _unicodeCharacterMap.Add("MAN WITH GUA PI MAO", 128114); - _unicodeCharacterMap.Add("MAN WITH TURBAN", 128115); - _unicodeCharacterMap.Add("OLDER MAN", 128116); - _unicodeCharacterMap.Add("OLDER WOMAN", 128117); - _unicodeCharacterMap.Add("BABY", 128118); - _unicodeCharacterMap.Add("CONSTRUCTION WORKER", 128119); - _unicodeCharacterMap.Add("PRINCESS", 128120); - _unicodeCharacterMap.Add("JAPANESE OGRE", 128121); - _unicodeCharacterMap.Add("JAPANESE GOBLIN", 128122); - _unicodeCharacterMap.Add("GHOST", 128123); - _unicodeCharacterMap.Add("BABY ANGEL", 128124); - _unicodeCharacterMap.Add("EXTRATERRESTRIAL ALIEN", 128125); - _unicodeCharacterMap.Add("ALIEN MONSTER", 128126); - _unicodeCharacterMap.Add("IMP", 128127); - _unicodeCharacterMap.Add("SKULL", 128128); - _unicodeCharacterMap.Add("INFORMATION DESK PERSON", 128129); - _unicodeCharacterMap.Add("GUARDSMAN", 128130); - _unicodeCharacterMap.Add("DANCER", 128131); - _unicodeCharacterMap.Add("LIPSTICK", 128132); - _unicodeCharacterMap.Add("NAIL POLISH", 128133); - _unicodeCharacterMap.Add("FACE MASSAGE", 128134); - _unicodeCharacterMap.Add("HAIRCUT", 128135); - _unicodeCharacterMap.Add("BARBER POLE", 128136); - _unicodeCharacterMap.Add("SYRINGE", 128137); - _unicodeCharacterMap.Add("PILL", 128138); - _unicodeCharacterMap.Add("KISS MARK", 128139); - _unicodeCharacterMap.Add("LOVE LETTER", 128140); - _unicodeCharacterMap.Add("RING", 128141); - _unicodeCharacterMap.Add("GEM STONE", 128142); - _unicodeCharacterMap.Add("KISS", 128143); - _unicodeCharacterMap.Add("BOUQUET", 128144); - _unicodeCharacterMap.Add("COUPLE WITH HEART", 128145); - _unicodeCharacterMap.Add("WEDDING", 128146); - _unicodeCharacterMap.Add("BEATING HEART", 128147); - _unicodeCharacterMap.Add("BROKEN HEART", 128148); - _unicodeCharacterMap.Add("TWO HEARTS", 128149); - _unicodeCharacterMap.Add("SPARKLING HEART", 128150); - _unicodeCharacterMap.Add("GROWING HEART", 128151); - _unicodeCharacterMap.Add("HEART WITH ARROW", 128152); - _unicodeCharacterMap.Add("BLUE HEART", 128153); - _unicodeCharacterMap.Add("GREEN HEART", 128154); - _unicodeCharacterMap.Add("YELLOW HEART", 128155); - _unicodeCharacterMap.Add("PURPLE HEART", 128156); - _unicodeCharacterMap.Add("HEART WITH RIBBON", 128157); - _unicodeCharacterMap.Add("REVOLVING HEARTS", 128158); - _unicodeCharacterMap.Add("HEART DECORATION", 128159); - _unicodeCharacterMap.Add("DIAMOND SHAPE WITH A DOT INSIDE", 128160); - _unicodeCharacterMap.Add("ELECTRIC LIGHT BULB", 128161); - _unicodeCharacterMap.Add("ANGER SYMBOL", 128162); - _unicodeCharacterMap.Add("BOMB", 128163); - _unicodeCharacterMap.Add("SLEEPING SYMBOL", 128164); - _unicodeCharacterMap.Add("COLLISION SYMBOL", 128165); - _unicodeCharacterMap.Add("SPLASHING SWEAT SYMBOL", 128166); - _unicodeCharacterMap.Add("DROPLET", 128167); - _unicodeCharacterMap.Add("DASH SYMBOL", 128168); - _unicodeCharacterMap.Add("PILE OF POO", 128169); - _unicodeCharacterMap.Add("FLEXED BICEPS", 128170); - _unicodeCharacterMap.Add("DIZZY SYMBOL", 128171); - _unicodeCharacterMap.Add("SPEECH BALLOON", 128172); - _unicodeCharacterMap.Add("THOUGHT BALLOON", 128173); - _unicodeCharacterMap.Add("WHITE FLOWER", 128174); - _unicodeCharacterMap.Add("HUNDRED POINTS SYMBOL", 128175); - _unicodeCharacterMap.Add("MONEY BAG", 128176); - _unicodeCharacterMap.Add("CURRENCY EXCHANGE", 128177); - _unicodeCharacterMap.Add("HEAVY DOLLAR SIGN", 128178); - _unicodeCharacterMap.Add("CREDIT CARD", 128179); - _unicodeCharacterMap.Add("BANKNOTE WITH YEN SIGN", 128180); - _unicodeCharacterMap.Add("BANKNOTE WITH DOLLAR SIGN", 128181); - _unicodeCharacterMap.Add("BANKNOTE WITH EURO SIGN", 128182); - _unicodeCharacterMap.Add("BANKNOTE WITH POUND SIGN", 128183); - _unicodeCharacterMap.Add("MONEY WITH WINGS", 128184); - _unicodeCharacterMap.Add("CHART WITH UPWARDS TREND AND YEN SIGN", 128185); - _unicodeCharacterMap.Add("SEAT", 128186); - _unicodeCharacterMap.Add("PERSONAL COMPUTER", 128187); - _unicodeCharacterMap.Add("BRIEFCASE", 128188); - _unicodeCharacterMap.Add("MINIDISC", 128189); - _unicodeCharacterMap.Add("FLOPPY DISK", 128190); - _unicodeCharacterMap.Add("OPTICAL DISC", 128191); - _unicodeCharacterMap.Add("DVD", 128192); - _unicodeCharacterMap.Add("FILE FOLDER", 128193); - _unicodeCharacterMap.Add("OPEN FILE FOLDER", 128194); - _unicodeCharacterMap.Add("PAGE WITH CURL", 128195); - _unicodeCharacterMap.Add("PAGE FACING UP", 128196); - _unicodeCharacterMap.Add("CALENDAR", 128197); - _unicodeCharacterMap.Add("TEAR OFF CALENDAR", 128198); - _unicodeCharacterMap.Add("CARD INDEX", 128199); - _unicodeCharacterMap.Add("CHART WITH UPWARDS TREND", 128200); - _unicodeCharacterMap.Add("CHART WITH DOWNWARDS TREND", 128201); - _unicodeCharacterMap.Add("BAR CHART", 128202); - _unicodeCharacterMap.Add("CLIPBOARD", 128203); - _unicodeCharacterMap.Add("PUSHPIN", 128204); - _unicodeCharacterMap.Add("ROUND PUSHPIN", 128205); - _unicodeCharacterMap.Add("PAPERCLIP", 128206); - _unicodeCharacterMap.Add("STRAIGHT RULER", 128207); - _unicodeCharacterMap.Add("TRIANGULAR RULER", 128208); - _unicodeCharacterMap.Add("BOOKMARK TABS", 128209); - _unicodeCharacterMap.Add("LEDGER", 128210); - _unicodeCharacterMap.Add("NOTEBOOK", 128211); - _unicodeCharacterMap.Add("NOTEBOOK WITH DECORATIVE COVER", 128212); - _unicodeCharacterMap.Add("CLOSED BOOK", 128213); - _unicodeCharacterMap.Add("OPEN BOOK", 128214); - _unicodeCharacterMap.Add("GREEN BOOK", 128215); - _unicodeCharacterMap.Add("BLUE BOOK", 128216); - _unicodeCharacterMap.Add("ORANGE BOOK", 128217); - _unicodeCharacterMap.Add("BOOKS", 128218); - _unicodeCharacterMap.Add("NAME BADGE", 128219); - _unicodeCharacterMap.Add("SCROLL", 128220); - _unicodeCharacterMap.Add("MEMO", 128221); - _unicodeCharacterMap.Add("TELEPHONE RECEIVER", 128222); - _unicodeCharacterMap.Add("PAGER", 128223); - _unicodeCharacterMap.Add("FAX MACHINE", 128224); - _unicodeCharacterMap.Add("SATELLITE ANTENNA", 128225); - _unicodeCharacterMap.Add("PUBLIC ADDRESS LOUDSPEAKER", 128226); - _unicodeCharacterMap.Add("CHEERING MEGAPHONE", 128227); - _unicodeCharacterMap.Add("OUTBOX TRAY", 128228); - _unicodeCharacterMap.Add("INBOX TRAY", 128229); - _unicodeCharacterMap.Add("PACKAGE", 128230); - _unicodeCharacterMap.Add("E MAIL SYMBOL", 128231); - _unicodeCharacterMap.Add("INCOMING ENVELOPE", 128232); - _unicodeCharacterMap.Add("ENVELOPE WITH DOWNWARDS ARROW ABOVE", 128233); - _unicodeCharacterMap.Add("CLOSED MAILBOX WITH LOWERED FLAG", 128234); - _unicodeCharacterMap.Add("CLOSED MAILBOX WITH RAISED FLAG", 128235); - _unicodeCharacterMap.Add("OPEN MAILBOX WITH RAISED FLAG", 128236); - _unicodeCharacterMap.Add("OPEN MAILBOX WITH LOWERED FLAG", 128237); - _unicodeCharacterMap.Add("POSTBOX", 128238); - _unicodeCharacterMap.Add("POSTAL HORN", 128239); - _unicodeCharacterMap.Add("NEWSPAPER", 128240); - _unicodeCharacterMap.Add("MOBILE PHONE", 128241); - _unicodeCharacterMap.Add("MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT", 128242); - _unicodeCharacterMap.Add("VIBRATION MODE", 128243); - _unicodeCharacterMap.Add("MOBILE PHONE OFF", 128244); - _unicodeCharacterMap.Add("NO MOBILE PHONES", 128245); - _unicodeCharacterMap.Add("ANTENNA WITH BARS", 128246); - _unicodeCharacterMap.Add("CAMERA", 128247); - _unicodeCharacterMap.Add("CAMERA WITH FLASH", 128248); - _unicodeCharacterMap.Add("VIDEO CAMERA", 128249); - _unicodeCharacterMap.Add("TELEVISION", 128250); - _unicodeCharacterMap.Add("RADIO", 128251); - _unicodeCharacterMap.Add("VIDEOCASSETTE", 128252); - _unicodeCharacterMap.Add("FILM PROJECTOR", 128253); - _unicodeCharacterMap.Add("PORTABLE STEREO", 128254); - _unicodeCharacterMap.Add("PRAYER BEADS", 128255); - _unicodeCharacterMap.Add("TWISTED RIGHTWARDS ARROWS", 128256); - _unicodeCharacterMap.Add("CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS", 128257); - _unicodeCharacterMap.Add("CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY", 128258); - _unicodeCharacterMap.Add("CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS", 128259); - _unicodeCharacterMap.Add("ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS", 128260); - _unicodeCharacterMap.Add("LOW BRIGHTNESS SYMBOL", 128261); - _unicodeCharacterMap.Add("HIGH BRIGHTNESS SYMBOL", 128262); - _unicodeCharacterMap.Add("SPEAKER WITH CANCELLATION STROKE", 128263); - _unicodeCharacterMap.Add("SPEAKER", 128264); - _unicodeCharacterMap.Add("SPEAKER WITH ONE SOUND WAVE", 128265); - _unicodeCharacterMap.Add("SPEAKER WITH THREE SOUND WAVES", 128266); - _unicodeCharacterMap.Add("BATTERY", 128267); - _unicodeCharacterMap.Add("ELECTRIC PLUG", 128268); - _unicodeCharacterMap.Add("LEFT POINTING MAGNIFYING GLASS", 128269); - _unicodeCharacterMap.Add("RIGHT POINTING MAGNIFYING GLASS", 128270); - _unicodeCharacterMap.Add("LOCK WITH INK PEN", 128271); - _unicodeCharacterMap.Add("CLOSED LOCK WITH KEY", 128272); - _unicodeCharacterMap.Add("KEY", 128273); - _unicodeCharacterMap.Add("LOCK", 128274); - _unicodeCharacterMap.Add("OPEN LOCK", 128275); - _unicodeCharacterMap.Add("BELL", 128276); - _unicodeCharacterMap.Add("BELL WITH CANCELLATION STROKE", 128277); - _unicodeCharacterMap.Add("BOOKMARK", 128278); - _unicodeCharacterMap.Add("LINK SYMBOL", 128279); - _unicodeCharacterMap.Add("RADIO BUTTON", 128280); - _unicodeCharacterMap.Add("BACK WITH LEFTWARDS ARROW ABOVE", 128281); - _unicodeCharacterMap.Add("END WITH LEFTWARDS ARROW ABOVE", 128282); - _unicodeCharacterMap.Add("ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE", 128283); - _unicodeCharacterMap.Add("SOON WITH RIGHTWARDS ARROW ABOVE", 128284); - _unicodeCharacterMap.Add("TOP WITH UPWARDS ARROW ABOVE", 128285); - _unicodeCharacterMap.Add("NO ONE UNDER EIGHTEEN SYMBOL", 128286); - _unicodeCharacterMap.Add("KEYCAP TEN", 128287); - _unicodeCharacterMap.Add("INPUT SYMBOL FOR LATIN CAPITAL LETTERS", 128288); - _unicodeCharacterMap.Add("INPUT SYMBOL FOR LATIN SMALL LETTERS", 128289); - _unicodeCharacterMap.Add("INPUT SYMBOL FOR NUMBERS", 128290); - _unicodeCharacterMap.Add("INPUT SYMBOL FOR SYMBOLS", 128291); - _unicodeCharacterMap.Add("INPUT SYMBOL FOR LATIN LETTERS", 128292); - _unicodeCharacterMap.Add("FIRE", 128293); - _unicodeCharacterMap.Add("ELECTRIC TORCH", 128294); - _unicodeCharacterMap.Add("WRENCH", 128295); - _unicodeCharacterMap.Add("HAMMER", 128296); - _unicodeCharacterMap.Add("NUT AND BOLT", 128297); - _unicodeCharacterMap.Add("HOCHO", 128298); - _unicodeCharacterMap.Add("PISTOL", 128299); - _unicodeCharacterMap.Add("MICROSCOPE", 128300); - _unicodeCharacterMap.Add("TELESCOPE", 128301); - _unicodeCharacterMap.Add("CRYSTAL BALL", 128302); - _unicodeCharacterMap.Add("SIX POINTED STAR WITH MIDDLE DOT", 128303); - _unicodeCharacterMap.Add("JAPANESE SYMBOL FOR BEGINNER", 128304); - _unicodeCharacterMap.Add("TRIDENT EMBLEM", 128305); - _unicodeCharacterMap.Add("BLACK SQUARE BUTTON", 128306); - _unicodeCharacterMap.Add("WHITE SQUARE BUTTON", 128307); - _unicodeCharacterMap.Add("LARGE RED CIRCLE", 128308); - _unicodeCharacterMap.Add("LARGE BLUE CIRCLE", 128309); - _unicodeCharacterMap.Add("LARGE ORANGE DIAMOND", 128310); - _unicodeCharacterMap.Add("LARGE BLUE DIAMOND", 128311); - _unicodeCharacterMap.Add("SMALL ORANGE DIAMOND", 128312); - _unicodeCharacterMap.Add("SMALL BLUE DIAMOND", 128313); - _unicodeCharacterMap.Add("UP POINTING RED TRIANGLE", 128314); - _unicodeCharacterMap.Add("DOWN POINTING RED TRIANGLE", 128315); - _unicodeCharacterMap.Add("UP POINTING SMALL RED TRIANGLE", 128316); - _unicodeCharacterMap.Add("DOWN POINTING SMALL RED TRIANGLE", 128317); - _unicodeCharacterMap.Add("LOWER RIGHT SHADOWED WHITE CIRCLE", 128318); - _unicodeCharacterMap.Add("UPPER RIGHT SHADOWED WHITE CIRCLE", 128319); - _unicodeCharacterMap.Add("CIRCLED CROSS POMMEE", 128320); - _unicodeCharacterMap.Add("CROSS POMMEE WITH HALF CIRCLE BELOW", 128321); - _unicodeCharacterMap.Add("CROSS POMMEE", 128322); - _unicodeCharacterMap.Add("NOTCHED LEFT SEMICIRCLE WITH THREE DOTS", 128323); - _unicodeCharacterMap.Add("NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS", 128324); - _unicodeCharacterMap.Add("SYMBOL FOR MARKS CHAPTER", 128325); - _unicodeCharacterMap.Add("WHITE LATIN CROSS", 128326); - _unicodeCharacterMap.Add("HEAVY LATIN CROSS", 128327); - _unicodeCharacterMap.Add("CELTIC CROSS", 128328); - _unicodeCharacterMap.Add("OM SYMBOL", 128329); - _unicodeCharacterMap.Add("DOVE OF PEACE", 128330); - _unicodeCharacterMap.Add("KAABA", 128331); - _unicodeCharacterMap.Add("MOSQUE", 128332); - _unicodeCharacterMap.Add("SYNAGOGUE", 128333); - _unicodeCharacterMap.Add("MENORAH WITH NINE BRANCHES", 128334); - _unicodeCharacterMap.Add("BOWL OF HYGIEIA", 128335); - _unicodeCharacterMap.Add("CLOCK FACE ONE OCLOCK", 128336); - _unicodeCharacterMap.Add("CLOCK FACE TWO OCLOCK", 128337); - _unicodeCharacterMap.Add("CLOCK FACE THREE OCLOCK", 128338); - _unicodeCharacterMap.Add("CLOCK FACE FOUR OCLOCK", 128339); - _unicodeCharacterMap.Add("CLOCK FACE FIVE OCLOCK", 128340); - _unicodeCharacterMap.Add("CLOCK FACE SIX OCLOCK", 128341); - _unicodeCharacterMap.Add("CLOCK FACE SEVEN OCLOCK", 128342); - _unicodeCharacterMap.Add("CLOCK FACE EIGHT OCLOCK", 128343); - _unicodeCharacterMap.Add("CLOCK FACE NINE OCLOCK", 128344); - _unicodeCharacterMap.Add("CLOCK FACE TEN OCLOCK", 128345); - _unicodeCharacterMap.Add("CLOCK FACE ELEVEN OCLOCK", 128346); - _unicodeCharacterMap.Add("CLOCK FACE TWELVE OCLOCK", 128347); - _unicodeCharacterMap.Add("CLOCK FACE ONE THIRTY", 128348); - _unicodeCharacterMap.Add("CLOCK FACE TWO THIRTY", 128349); - _unicodeCharacterMap.Add("CLOCK FACE THREE THIRTY", 128350); - _unicodeCharacterMap.Add("CLOCK FACE FOUR THIRTY", 128351); - _unicodeCharacterMap.Add("CLOCK FACE FIVE THIRTY", 128352); - _unicodeCharacterMap.Add("CLOCK FACE SIX THIRTY", 128353); - _unicodeCharacterMap.Add("CLOCK FACE SEVEN THIRTY", 128354); - _unicodeCharacterMap.Add("CLOCK FACE EIGHT THIRTY", 128355); - _unicodeCharacterMap.Add("CLOCK FACE NINE THIRTY", 128356); - _unicodeCharacterMap.Add("CLOCK FACE TEN THIRTY", 128357); - _unicodeCharacterMap.Add("CLOCK FACE ELEVEN THIRTY", 128358); - _unicodeCharacterMap.Add("CLOCK FACE TWELVE THIRTY", 128359); - _unicodeCharacterMap.Add("RIGHT SPEAKER", 128360); - _unicodeCharacterMap.Add("RIGHT SPEAKER WITH ONE SOUND WAVE", 128361); - _unicodeCharacterMap.Add("RIGHT SPEAKER WITH THREE SOUND WAVES", 128362); - _unicodeCharacterMap.Add("BULLHORN", 128363); - _unicodeCharacterMap.Add("BULLHORN WITH SOUND WAVES", 128364); - _unicodeCharacterMap.Add("RINGING BELL", 128365); - _unicodeCharacterMap.Add("BOOK", 128366); - _unicodeCharacterMap.Add("CANDLE", 128367); - _unicodeCharacterMap.Add("MANTELPIECE CLOCK", 128368); - _unicodeCharacterMap.Add("BLACK SKULL AND CROSSBONES", 128369); - _unicodeCharacterMap.Add("NO PIRACY", 128370); - _unicodeCharacterMap.Add("HOLE", 128371); - _unicodeCharacterMap.Add("MAN IN BUSINESS SUIT LEVITATING", 128372); - _unicodeCharacterMap.Add("SLEUTH OR SPY", 128373); - _unicodeCharacterMap.Add("DARK SUNGLASSES", 128374); - _unicodeCharacterMap.Add("SPIDER", 128375); - _unicodeCharacterMap.Add("SPIDER WEB", 128376); - _unicodeCharacterMap.Add("JOYSTICK", 128377); - _unicodeCharacterMap.Add("MAN DANCING", 128378); - _unicodeCharacterMap.Add("LEFT HAND TELEPHONE RECEIVER", 128379); - _unicodeCharacterMap.Add("TELEPHONE RECEIVER WITH PAGE", 128380); - _unicodeCharacterMap.Add("RIGHT HAND TELEPHONE RECEIVER", 128381); - _unicodeCharacterMap.Add("WHITE TOUCHTONE TELEPHONE", 128382); - _unicodeCharacterMap.Add("BLACK TOUCHTONE TELEPHONE", 128383); - _unicodeCharacterMap.Add("TELEPHONE ON TOP OF MODEM", 128384); - _unicodeCharacterMap.Add("CLAMSHELL MOBILE PHONE", 128385); - _unicodeCharacterMap.Add("BACK OF ENVELOPE", 128386); - _unicodeCharacterMap.Add("STAMPED ENVELOPE", 128387); - _unicodeCharacterMap.Add("ENVELOPE WITH LIGHTNING", 128388); - _unicodeCharacterMap.Add("FLYING ENVELOPE", 128389); - _unicodeCharacterMap.Add("PEN OVER STAMPED ENVELOPE", 128390); - _unicodeCharacterMap.Add("LINKED PAPERCLIPS", 128391); - _unicodeCharacterMap.Add("BLACK PUSHPIN", 128392); - _unicodeCharacterMap.Add("LOWER LEFT PENCIL", 128393); - _unicodeCharacterMap.Add("LOWER LEFT BALLPOINT PEN", 128394); - _unicodeCharacterMap.Add("LOWER LEFT FOUNTAIN PEN", 128395); - _unicodeCharacterMap.Add("LOWER LEFT PAINTBRUSH", 128396); - _unicodeCharacterMap.Add("LOWER LEFT CRAYON", 128397); - _unicodeCharacterMap.Add("LEFT WRITING HAND", 128398); - _unicodeCharacterMap.Add("TURNED OK HAND SIGN", 128399); - _unicodeCharacterMap.Add("RAISED HAND WITH FINGERS SPLAYED", 128400); - _unicodeCharacterMap.Add("REVERSED RAISED HAND WITH FINGERS SPLAYED", 128401); - _unicodeCharacterMap.Add("REVERSED THUMBS UP SIGN", 128402); - _unicodeCharacterMap.Add("REVERSED THUMBS DOWN SIGN", 128403); - _unicodeCharacterMap.Add("REVERSED VICTORY HAND", 128404); - _unicodeCharacterMap.Add("REVERSED HAND WITH MIDDLE FINGER EXTENDED", 128405); - _unicodeCharacterMap.Add("RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS", 128406); - _unicodeCharacterMap.Add("WHITE DOWN POINTING LEFT HAND INDEX", 128407); - _unicodeCharacterMap.Add("SIDEWAYS WHITE LEFT POINTING INDEX", 128408); - _unicodeCharacterMap.Add("SIDEWAYS WHITE RIGHT POINTING INDEX", 128409); - _unicodeCharacterMap.Add("SIDEWAYS BLACK LEFT POINTING INDEX", 128410); - _unicodeCharacterMap.Add("SIDEWAYS BLACK RIGHT POINTING INDEX", 128411); - _unicodeCharacterMap.Add("BLACK LEFT POINTING BACKHAND INDEX", 128412); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING BACKHAND INDEX", 128413); - _unicodeCharacterMap.Add("SIDEWAYS WHITE UP POINTING INDEX", 128414); - _unicodeCharacterMap.Add("SIDEWAYS WHITE DOWN POINTING INDEX", 128415); - _unicodeCharacterMap.Add("SIDEWAYS BLACK UP POINTING INDEX", 128416); - _unicodeCharacterMap.Add("SIDEWAYS BLACK DOWN POINTING INDEX", 128417); - _unicodeCharacterMap.Add("BLACK UP POINTING BACKHAND INDEX", 128418); - _unicodeCharacterMap.Add("BLACK DOWN POINTING BACKHAND INDEX", 128419); - _unicodeCharacterMap.Add("BLACK HEART", 128420); - _unicodeCharacterMap.Add("DESKTOP COMPUTER", 128421); - _unicodeCharacterMap.Add("KEYBOARD AND MOUSE", 128422); - _unicodeCharacterMap.Add("THREE NETWORKED COMPUTERS", 128423); - _unicodeCharacterMap.Add("PRINTER", 128424); - _unicodeCharacterMap.Add("POCKET CALCULATOR", 128425); - _unicodeCharacterMap.Add("BLACK HARD SHELL FLOPPY DISK", 128426); - _unicodeCharacterMap.Add("WHITE HARD SHELL FLOPPY DISK", 128427); - _unicodeCharacterMap.Add("SOFT SHELL FLOPPY DISK", 128428); - _unicodeCharacterMap.Add("TAPE CARTRIDGE", 128429); - _unicodeCharacterMap.Add("WIRED KEYBOARD", 128430); - _unicodeCharacterMap.Add("ONE BUTTON MOUSE", 128431); - _unicodeCharacterMap.Add("TWO BUTTON MOUSE", 128432); - _unicodeCharacterMap.Add("THREE BUTTON MOUSE", 128433); - _unicodeCharacterMap.Add("TRACKBALL", 128434); - _unicodeCharacterMap.Add("OLD PERSONAL COMPUTER", 128435); - _unicodeCharacterMap.Add("HARD DISK", 128436); - _unicodeCharacterMap.Add("SCREEN", 128437); - _unicodeCharacterMap.Add("PRINTER ICON", 128438); - _unicodeCharacterMap.Add("FAX ICON", 128439); - _unicodeCharacterMap.Add("OPTICAL DISC ICON", 128440); - _unicodeCharacterMap.Add("DOCUMENT WITH TEXT", 128441); - _unicodeCharacterMap.Add("DOCUMENT WITH TEXT AND PICTURE", 128442); - _unicodeCharacterMap.Add("DOCUMENT WITH PICTURE", 128443); - _unicodeCharacterMap.Add("FRAME WITH PICTURE", 128444); - _unicodeCharacterMap.Add("FRAME WITH TILES", 128445); - _unicodeCharacterMap.Add("FRAME WITH AN X", 128446); - _unicodeCharacterMap.Add("BLACK FOLDER", 128447); - _unicodeCharacterMap.Add("FOLDER", 128448); - _unicodeCharacterMap.Add("OPEN FOLDER", 128449); - _unicodeCharacterMap.Add("CARD INDEX DIVIDERS", 128450); - _unicodeCharacterMap.Add("CARD FILE BOX", 128451); - _unicodeCharacterMap.Add("FILE CABINET", 128452); - _unicodeCharacterMap.Add("EMPTY NOTE", 128453); - _unicodeCharacterMap.Add("EMPTY NOTE PAGE", 128454); - _unicodeCharacterMap.Add("EMPTY NOTE PAD", 128455); - _unicodeCharacterMap.Add("NOTE", 128456); - _unicodeCharacterMap.Add("NOTE PAGE", 128457); - _unicodeCharacterMap.Add("NOTE PAD", 128458); - _unicodeCharacterMap.Add("EMPTY DOCUMENT", 128459); - _unicodeCharacterMap.Add("EMPTY PAGE", 128460); - _unicodeCharacterMap.Add("EMPTY PAGES", 128461); - _unicodeCharacterMap.Add("DOCUMENT", 128462); - _unicodeCharacterMap.Add("PAGE", 128463); - _unicodeCharacterMap.Add("PAGES", 128464); - _unicodeCharacterMap.Add("WASTEBASKET", 128465); - _unicodeCharacterMap.Add("SPIRAL NOTE PAD", 128466); - _unicodeCharacterMap.Add("SPIRAL CALENDAR PAD", 128467); - _unicodeCharacterMap.Add("DESKTOP WINDOW", 128468); - _unicodeCharacterMap.Add("MINIMIZE", 128469); - _unicodeCharacterMap.Add("MAXIMIZE", 128470); - _unicodeCharacterMap.Add("OVERLAP", 128471); - _unicodeCharacterMap.Add("CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS", 128472); - _unicodeCharacterMap.Add("CANCELLATION X", 128473); - _unicodeCharacterMap.Add("INCREASE FONT SIZE SYMBOL", 128474); - _unicodeCharacterMap.Add("DECREASE FONT SIZE SYMBOL", 128475); - _unicodeCharacterMap.Add("COMPRESSION", 128476); - _unicodeCharacterMap.Add("OLD KEY", 128477); - _unicodeCharacterMap.Add("ROLLED UP NEWSPAPER", 128478); - _unicodeCharacterMap.Add("PAGE WITH CIRCLED TEXT", 128479); - _unicodeCharacterMap.Add("STOCK CHART", 128480); - _unicodeCharacterMap.Add("DAGGER KNIFE", 128481); - _unicodeCharacterMap.Add("LIPS", 128482); - _unicodeCharacterMap.Add("SPEAKING HEAD IN SILHOUETTE", 128483); - _unicodeCharacterMap.Add("THREE RAYS ABOVE", 128484); - _unicodeCharacterMap.Add("THREE RAYS BELOW", 128485); - _unicodeCharacterMap.Add("THREE RAYS LEFT", 128486); - _unicodeCharacterMap.Add("THREE RAYS RIGHT", 128487); - _unicodeCharacterMap.Add("LEFT SPEECH BUBBLE", 128488); - _unicodeCharacterMap.Add("RIGHT SPEECH BUBBLE", 128489); - _unicodeCharacterMap.Add("TWO SPEECH BUBBLES", 128490); - _unicodeCharacterMap.Add("THREE SPEECH BUBBLES", 128491); - _unicodeCharacterMap.Add("LEFT THOUGHT BUBBLE", 128492); - _unicodeCharacterMap.Add("RIGHT THOUGHT BUBBLE", 128493); - _unicodeCharacterMap.Add("LEFT ANGER BUBBLE", 128494); - _unicodeCharacterMap.Add("RIGHT ANGER BUBBLE", 128495); - _unicodeCharacterMap.Add("MOOD BUBBLE", 128496); - _unicodeCharacterMap.Add("LIGHTNING MOOD BUBBLE", 128497); - _unicodeCharacterMap.Add("LIGHTNING MOOD", 128498); - _unicodeCharacterMap.Add("BALLOT BOX WITH BALLOT", 128499); - _unicodeCharacterMap.Add("BALLOT SCRIPT X", 128500); - _unicodeCharacterMap.Add("BALLOT BOX WITH SCRIPT X", 128501); - _unicodeCharacterMap.Add("BALLOT BOLD SCRIPT X", 128502); - _unicodeCharacterMap.Add("BALLOT BOX WITH BOLD SCRIPT X", 128503); - _unicodeCharacterMap.Add("LIGHT CHECK MARK", 128504); - _unicodeCharacterMap.Add("BALLOT BOX WITH BOLD CHECK", 128505); - _unicodeCharacterMap.Add("WORLD MAP", 128506); - _unicodeCharacterMap.Add("MOUNT FUJI", 128507); - _unicodeCharacterMap.Add("TOKYO TOWER", 128508); - _unicodeCharacterMap.Add("STATUE OF LIBERTY", 128509); - _unicodeCharacterMap.Add("SILHOUETTE OF JAPAN", 128510); - _unicodeCharacterMap.Add("MOYAI", 128511); - _unicodeCharacterMap.Add("GRINNING FACE", 128512); - _unicodeCharacterMap.Add("GRINNING FACE WITH SMILING EYES", 128513); - _unicodeCharacterMap.Add("FACE WITH TEARS OF JOY", 128514); - _unicodeCharacterMap.Add("SMILING FACE WITH OPEN MOUTH", 128515); - _unicodeCharacterMap.Add("SMILING FACE WITH OPEN MOUTH AND SMILING EYES", 128516); - _unicodeCharacterMap.Add("SMILING FACE WITH OPEN MOUTH AND COLD SWEAT", 128517); - _unicodeCharacterMap.Add("SMILING FACE WITH OPEN MOUTH AND TIGHTLY CLOSED EYES", 128518); - _unicodeCharacterMap.Add("SMILING FACE WITH HALO", 128519); - _unicodeCharacterMap.Add("SMILING FACE WITH HORNS", 128520); - _unicodeCharacterMap.Add("WINKING FACE", 128521); - _unicodeCharacterMap.Add("SMILING FACE WITH SMILING EYES", 128522); - _unicodeCharacterMap.Add("FACE SAVOURING DELICIOUS FOOD", 128523); - _unicodeCharacterMap.Add("RELIEVED FACE", 128524); - _unicodeCharacterMap.Add("SMILING FACE WITH HEART SHAPED EYES", 128525); - _unicodeCharacterMap.Add("SMILING FACE WITH SUNGLASSES", 128526); - _unicodeCharacterMap.Add("SMIRKING FACE", 128527); - _unicodeCharacterMap.Add("NEUTRAL FACE", 128528); - _unicodeCharacterMap.Add("EXPRESSIONLESS FACE", 128529); - _unicodeCharacterMap.Add("UNAMUSED FACE", 128530); - _unicodeCharacterMap.Add("FACE WITH COLD SWEAT", 128531); - _unicodeCharacterMap.Add("PENSIVE FACE", 128532); - _unicodeCharacterMap.Add("CONFUSED FACE", 128533); - _unicodeCharacterMap.Add("CONFOUNDED FACE", 128534); - _unicodeCharacterMap.Add("KISSING FACE", 128535); - _unicodeCharacterMap.Add("FACE THROWING A KISS", 128536); - _unicodeCharacterMap.Add("KISSING FACE WITH SMILING EYES", 128537); - _unicodeCharacterMap.Add("KISSING FACE WITH CLOSED EYES", 128538); - _unicodeCharacterMap.Add("FACE WITH STUCK OUT TONGUE", 128539); - _unicodeCharacterMap.Add("FACE WITH STUCK OUT TONGUE AND WINKING EYE", 128540); - _unicodeCharacterMap.Add("FACE WITH STUCK OUT TONGUE AND TIGHTLY CLOSED EYES", 128541); - _unicodeCharacterMap.Add("DISAPPOINTED FACE", 128542); - _unicodeCharacterMap.Add("WORRIED FACE", 128543); - _unicodeCharacterMap.Add("ANGRY FACE", 128544); - _unicodeCharacterMap.Add("POUTING FACE", 128545); - _unicodeCharacterMap.Add("CRYING FACE", 128546); - _unicodeCharacterMap.Add("PERSEVERING FACE", 128547); - _unicodeCharacterMap.Add("FACE WITH LOOK OF TRIUMPH", 128548); - _unicodeCharacterMap.Add("DISAPPOINTED BUT RELIEVED FACE", 128549); - _unicodeCharacterMap.Add("FROWNING FACE WITH OPEN MOUTH", 128550); - _unicodeCharacterMap.Add("ANGUISHED FACE", 128551); - _unicodeCharacterMap.Add("FEARFUL FACE", 128552); - _unicodeCharacterMap.Add("WEARY FACE", 128553); - _unicodeCharacterMap.Add("SLEEPY FACE", 128554); - _unicodeCharacterMap.Add("TIRED FACE", 128555); - _unicodeCharacterMap.Add("GRIMACING FACE", 128556); - _unicodeCharacterMap.Add("LOUDLY CRYING FACE", 128557); - _unicodeCharacterMap.Add("FACE WITH OPEN MOUTH", 128558); - _unicodeCharacterMap.Add("HUSHED FACE", 128559); - _unicodeCharacterMap.Add("FACE WITH OPEN MOUTH AND COLD SWEAT", 128560); - _unicodeCharacterMap.Add("FACE SCREAMING IN FEAR", 128561); - _unicodeCharacterMap.Add("ASTONISHED FACE", 128562); - _unicodeCharacterMap.Add("FLUSHED FACE", 128563); - _unicodeCharacterMap.Add("SLEEPING FACE", 128564); - _unicodeCharacterMap.Add("DIZZY FACE", 128565); - _unicodeCharacterMap.Add("FACE WITHOUT MOUTH", 128566); - _unicodeCharacterMap.Add("FACE WITH MEDICAL MASK", 128567); - _unicodeCharacterMap.Add("GRINNING CAT FACE WITH SMILING EYES", 128568); - _unicodeCharacterMap.Add("CAT FACE WITH TEARS OF JOY", 128569); - _unicodeCharacterMap.Add("SMILING CAT FACE WITH OPEN MOUTH", 128570); - _unicodeCharacterMap.Add("SMILING CAT FACE WITH HEART SHAPED EYES", 128571); - _unicodeCharacterMap.Add("CAT FACE WITH WRY SMILE", 128572); - _unicodeCharacterMap.Add("KISSING CAT FACE WITH CLOSED EYES", 128573); - _unicodeCharacterMap.Add("POUTING CAT FACE", 128574); - _unicodeCharacterMap.Add("CRYING CAT FACE", 128575); - _unicodeCharacterMap.Add("WEARY CAT FACE", 128576); - _unicodeCharacterMap.Add("SLIGHTLY FROWNING FACE", 128577); - _unicodeCharacterMap.Add("SLIGHTLY SMILING FACE", 128578); - _unicodeCharacterMap.Add("UPSIDE DOWN FACE", 128579); - _unicodeCharacterMap.Add("FACE WITH ROLLING EYES", 128580); - _unicodeCharacterMap.Add("FACE WITH NO GOOD GESTURE", 128581); - _unicodeCharacterMap.Add("FACE WITH OK GESTURE", 128582); - _unicodeCharacterMap.Add("PERSON BOWING DEEPLY", 128583); - _unicodeCharacterMap.Add("SEE NO EVIL MONKEY", 128584); - _unicodeCharacterMap.Add("HEAR NO EVIL MONKEY", 128585); - _unicodeCharacterMap.Add("SPEAK NO EVIL MONKEY", 128586); - _unicodeCharacterMap.Add("HAPPY PERSON RAISING ONE HAND", 128587); - _unicodeCharacterMap.Add("PERSON RAISING BOTH HANDS IN CELEBRATION", 128588); - _unicodeCharacterMap.Add("PERSON FROWNING", 128589); - _unicodeCharacterMap.Add("PERSON WITH POUTING FACE", 128590); - _unicodeCharacterMap.Add("PERSON WITH FOLDED HANDS", 128591); - _unicodeCharacterMap.Add("NORTH WEST POINTING LEAF", 128592); - _unicodeCharacterMap.Add("SOUTH WEST POINTING LEAF", 128593); - _unicodeCharacterMap.Add("NORTH EAST POINTING LEAF", 128594); - _unicodeCharacterMap.Add("SOUTH EAST POINTING LEAF", 128595); - _unicodeCharacterMap.Add("TURNED NORTH WEST POINTING LEAF", 128596); - _unicodeCharacterMap.Add("TURNED SOUTH WEST POINTING LEAF", 128597); - _unicodeCharacterMap.Add("TURNED NORTH EAST POINTING LEAF", 128598); - _unicodeCharacterMap.Add("TURNED SOUTH EAST POINTING LEAF", 128599); - _unicodeCharacterMap.Add("NORTH WEST POINTING VINE LEAF", 128600); - _unicodeCharacterMap.Add("SOUTH WEST POINTING VINE LEAF", 128601); - _unicodeCharacterMap.Add("NORTH EAST POINTING VINE LEAF", 128602); - _unicodeCharacterMap.Add("SOUTH EAST POINTING VINE LEAF", 128603); - _unicodeCharacterMap.Add("HEAVY NORTH WEST POINTING VINE LEAF", 128604); - _unicodeCharacterMap.Add("HEAVY SOUTH WEST POINTING VINE LEAF", 128605); - _unicodeCharacterMap.Add("HEAVY NORTH EAST POINTING VINE LEAF", 128606); - _unicodeCharacterMap.Add("HEAVY SOUTH EAST POINTING VINE LEAF", 128607); - _unicodeCharacterMap.Add("NORTH WEST POINTING BUD", 128608); - _unicodeCharacterMap.Add("SOUTH WEST POINTING BUD", 128609); - _unicodeCharacterMap.Add("NORTH EAST POINTING BUD", 128610); - _unicodeCharacterMap.Add("SOUTH EAST POINTING BUD", 128611); - _unicodeCharacterMap.Add("HEAVY NORTH WEST POINTING BUD", 128612); - _unicodeCharacterMap.Add("HEAVY SOUTH WEST POINTING BUD", 128613); - _unicodeCharacterMap.Add("HEAVY NORTH EAST POINTING BUD", 128614); - _unicodeCharacterMap.Add("HEAVY SOUTH EAST POINTING BUD", 128615); - _unicodeCharacterMap.Add("HOLLOW QUILT SQUARE ORNAMENT", 128616); - _unicodeCharacterMap.Add("HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE", 128617); - _unicodeCharacterMap.Add("SOLID QUILT SQUARE ORNAMENT", 128618); - _unicodeCharacterMap.Add("SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE", 128619); - _unicodeCharacterMap.Add("LEFTWARDS ROCKET", 128620); - _unicodeCharacterMap.Add("UPWARDS ROCKET", 128621); - _unicodeCharacterMap.Add("RIGHTWARDS ROCKET", 128622); - _unicodeCharacterMap.Add("DOWNWARDS ROCKET", 128623); - _unicodeCharacterMap.Add("SCRIPT LIGATURE ET ORNAMENT", 128624); - _unicodeCharacterMap.Add("HEAVY SCRIPT LIGATURE ET ORNAMENT", 128625); - _unicodeCharacterMap.Add("LIGATURE OPEN ET ORNAMENT", 128626); - _unicodeCharacterMap.Add("HEAVY LIGATURE OPEN ET ORNAMENT", 128627); - _unicodeCharacterMap.Add("HEAVY AMPERSAND ORNAMENT", 128628); - _unicodeCharacterMap.Add("SWASH AMPERSAND ORNAMENT", 128629); - _unicodeCharacterMap.Add("SANS SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT", 128630); - _unicodeCharacterMap.Add("SANS SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT", 128631); - _unicodeCharacterMap.Add("SANS SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT", 128632); - _unicodeCharacterMap.Add("HEAVY INTERROBANG ORNAMENT", 128633); - _unicodeCharacterMap.Add("SANS SERIF INTERROBANG ORNAMENT", 128634); - _unicodeCharacterMap.Add("HEAVY SANS SERIF INTERROBANG ORNAMENT", 128635); - _unicodeCharacterMap.Add("VERY HEAVY SOLIDUS", 128636); - _unicodeCharacterMap.Add("VERY HEAVY REVERSE SOLIDUS", 128637); - _unicodeCharacterMap.Add("CHECKER BOARD", 128638); - _unicodeCharacterMap.Add("REVERSE CHECKER BOARD", 128639); - _unicodeCharacterMap.Add("ROCKET", 128640); - _unicodeCharacterMap.Add("HELICOPTER", 128641); - _unicodeCharacterMap.Add("STEAM LOCOMOTIVE", 128642); - _unicodeCharacterMap.Add("RAILWAY CAR", 128643); - _unicodeCharacterMap.Add("HIGH SPEED TRAIN", 128644); - _unicodeCharacterMap.Add("HIGH SPEED TRAIN WITH BULLET NOSE", 128645); - _unicodeCharacterMap.Add("TRAIN", 128646); - _unicodeCharacterMap.Add("METRO", 128647); - _unicodeCharacterMap.Add("LIGHT RAIL", 128648); - _unicodeCharacterMap.Add("STATION", 128649); - _unicodeCharacterMap.Add("TRAM", 128650); - _unicodeCharacterMap.Add("TRAM CAR", 128651); - _unicodeCharacterMap.Add("BUS", 128652); - _unicodeCharacterMap.Add("ONCOMING BUS", 128653); - _unicodeCharacterMap.Add("TROLLEYBUS", 128654); - _unicodeCharacterMap.Add("BUS STOP", 128655); - _unicodeCharacterMap.Add("MINIBUS", 128656); - _unicodeCharacterMap.Add("AMBULANCE", 128657); - _unicodeCharacterMap.Add("FIRE ENGINE", 128658); - _unicodeCharacterMap.Add("POLICE CAR", 128659); - _unicodeCharacterMap.Add("ONCOMING POLICE CAR", 128660); - _unicodeCharacterMap.Add("TAXI", 128661); - _unicodeCharacterMap.Add("ONCOMING TAXI", 128662); - _unicodeCharacterMap.Add("AUTOMOBILE", 128663); - _unicodeCharacterMap.Add("ONCOMING AUTOMOBILE", 128664); - _unicodeCharacterMap.Add("RECREATIONAL VEHICLE", 128665); - _unicodeCharacterMap.Add("DELIVERY TRUCK", 128666); - _unicodeCharacterMap.Add("ARTICULATED LORRY", 128667); - _unicodeCharacterMap.Add("TRACTOR", 128668); - _unicodeCharacterMap.Add("MONORAIL", 128669); - _unicodeCharacterMap.Add("MOUNTAIN RAILWAY", 128670); - _unicodeCharacterMap.Add("SUSPENSION RAILWAY", 128671); - _unicodeCharacterMap.Add("MOUNTAIN CABLEWAY", 128672); - _unicodeCharacterMap.Add("AERIAL TRAMWAY", 128673); - _unicodeCharacterMap.Add("SHIP", 128674); - _unicodeCharacterMap.Add("ROWBOAT", 128675); - _unicodeCharacterMap.Add("SPEEDBOAT", 128676); - _unicodeCharacterMap.Add("HORIZONTAL TRAFFIC LIGHT", 128677); - _unicodeCharacterMap.Add("VERTICAL TRAFFIC LIGHT", 128678); - _unicodeCharacterMap.Add("CONSTRUCTION SIGN", 128679); - _unicodeCharacterMap.Add("POLICE CARS REVOLVING LIGHT", 128680); - _unicodeCharacterMap.Add("TRIANGULAR FLAG ON POST", 128681); - _unicodeCharacterMap.Add("DOOR", 128682); - _unicodeCharacterMap.Add("NO ENTRY SIGN", 128683); - _unicodeCharacterMap.Add("SMOKING SYMBOL", 128684); - _unicodeCharacterMap.Add("NO SMOKING SYMBOL", 128685); - _unicodeCharacterMap.Add("PUT LITTER IN ITS PLACE SYMBOL", 128686); - _unicodeCharacterMap.Add("DO NOT LITTER SYMBOL", 128687); - _unicodeCharacterMap.Add("POTABLE WATER SYMBOL", 128688); - _unicodeCharacterMap.Add("NON POTABLE WATER SYMBOL", 128689); - _unicodeCharacterMap.Add("BICYCLE", 128690); - _unicodeCharacterMap.Add("NO BICYCLES", 128691); - _unicodeCharacterMap.Add("BICYCLIST", 128692); - _unicodeCharacterMap.Add("MOUNTAIN BICYCLIST", 128693); - _unicodeCharacterMap.Add("PEDESTRIAN", 128694); - _unicodeCharacterMap.Add("NO PEDESTRIANS", 128695); - _unicodeCharacterMap.Add("CHILDREN CROSSING", 128696); - _unicodeCharacterMap.Add("MENS SYMBOL", 128697); - _unicodeCharacterMap.Add("WOMENS SYMBOL", 128698); - _unicodeCharacterMap.Add("RESTROOM", 128699); - _unicodeCharacterMap.Add("BABY SYMBOL", 128700); - _unicodeCharacterMap.Add("TOILET", 128701); - _unicodeCharacterMap.Add("WATER CLOSET", 128702); - _unicodeCharacterMap.Add("SHOWER", 128703); - _unicodeCharacterMap.Add("BATH", 128704); - _unicodeCharacterMap.Add("BATHTUB", 128705); - _unicodeCharacterMap.Add("PASSPORT CONTROL", 128706); - _unicodeCharacterMap.Add("CUSTOMS", 128707); - _unicodeCharacterMap.Add("BAGGAGE CLAIM", 128708); - _unicodeCharacterMap.Add("LEFT LUGGAGE", 128709); - _unicodeCharacterMap.Add("TRIANGLE WITH ROUNDED CORNERS", 128710); - _unicodeCharacterMap.Add("PROHIBITED SIGN", 128711); - _unicodeCharacterMap.Add("CIRCLED INFORMATION SOURCE", 128712); - _unicodeCharacterMap.Add("BOYS SYMBOL", 128713); - _unicodeCharacterMap.Add("GIRLS SYMBOL", 128714); - _unicodeCharacterMap.Add("COUCH AND LAMP", 128715); - _unicodeCharacterMap.Add("SLEEPING ACCOMMODATION", 128716); - _unicodeCharacterMap.Add("SHOPPING BAGS", 128717); - _unicodeCharacterMap.Add("BELLHOP BELL", 128718); - _unicodeCharacterMap.Add("BED", 128719); - _unicodeCharacterMap.Add("PLACE OF WORSHIP", 128720); - _unicodeCharacterMap.Add("OCTAGONAL SIGN", 128721); - _unicodeCharacterMap.Add("SHOPPING TROLLEY", 128722); - _unicodeCharacterMap.Add("HAMMER AND WRENCH", 128736); - _unicodeCharacterMap.Add("SHIELD", 128737); - _unicodeCharacterMap.Add("OIL DRUM", 128738); - _unicodeCharacterMap.Add("MOTORWAY", 128739); - _unicodeCharacterMap.Add("RAILWAY TRACK", 128740); - _unicodeCharacterMap.Add("MOTOR BOAT", 128741); - _unicodeCharacterMap.Add("UP POINTING MILITARY AIRPLANE", 128742); - _unicodeCharacterMap.Add("UP POINTING AIRPLANE", 128743); - _unicodeCharacterMap.Add("UP POINTING SMALL AIRPLANE", 128744); - _unicodeCharacterMap.Add("SMALL AIRPLANE", 128745); - _unicodeCharacterMap.Add("NORTHEAST POINTING AIRPLANE", 128746); - _unicodeCharacterMap.Add("AIRPLANE DEPARTURE", 128747); - _unicodeCharacterMap.Add("AIRPLANE ARRIVING", 128748); - _unicodeCharacterMap.Add("SATELLITE", 128752); - _unicodeCharacterMap.Add("ONCOMING FIRE ENGINE", 128753); - _unicodeCharacterMap.Add("DIESEL LOCOMOTIVE", 128754); - _unicodeCharacterMap.Add("PASSENGER SHIP", 128755); - _unicodeCharacterMap.Add("SCOOTER", 128756); - _unicodeCharacterMap.Add("MOTOR SCOOTER", 128757); - _unicodeCharacterMap.Add("CANOE", 128758); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR QUINTESSENCE", 128768); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AIR", 128769); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR FIRE", 128770); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR EARTH", 128771); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR WATER", 128772); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AQUAFORTIS", 128773); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AQUA REGIA", 128774); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AQUA REGIA 2", 128775); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AQUA VITAE", 128776); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AQUA VITAE 2", 128777); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR VINEGAR", 128778); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR VINEGAR 2", 128779); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR VINEGAR 3", 128780); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SULFUR", 128781); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR", 128782); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BLACK SULFUR", 128783); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE", 128784); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE 2", 128785); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE 3", 128786); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CINNABAR", 128787); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SALT", 128788); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR NITRE", 128789); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR VITRIOL", 128790); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR VITRIOL 2", 128791); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ROCK SALT", 128792); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ROCK SALT 2", 128793); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR GOLD", 128794); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SILVER", 128795); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR IRON ORE", 128796); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR IRON ORE 2", 128797); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CROCUS OF IRON", 128798); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REGULUS OF IRON", 128799); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR COPPER ORE", 128800); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR IRON COPPER ORE", 128801); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER", 128802); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CROCUS OF COPPER", 128803); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CROCUS OF COPPER 2", 128804); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE", 128805); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE", 128806); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER", 128807); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR VERDIGRIS", 128808); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR TIN ORE", 128809); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR LEAD ORE", 128810); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ANTIMONY ORE", 128811); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY", 128812); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY", 128813); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY", 128814); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY", 128815); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY", 128816); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY 2", 128817); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REGULUS", 128818); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REGULUS 2", 128819); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REGULUS 3", 128820); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REGULUS 4", 128821); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ALKALI", 128822); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ALKALI 2", 128823); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR MARCASITE", 128824); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SAL AMMONIAC", 128825); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ARSENIC", 128826); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REALGAR", 128827); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR REALGAR 2", 128828); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AURIPIGMENT", 128829); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BISMUTH ORE", 128830); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR TARTAR", 128831); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR TARTAR 2", 128832); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR QUICK LIME", 128833); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BORAX", 128834); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BORAX 2", 128835); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BORAX 3", 128836); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ALUM", 128837); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR OIL", 128838); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SPIRIT", 128839); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR TINCTURE", 128840); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR GUM", 128841); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR WAX", 128842); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR POWDER", 128843); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CALX", 128844); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR TUTTY", 128845); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CAPUT MORTUUM", 128846); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE", 128847); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CADUCEUS", 128848); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR TRIDENT", 128849); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR STARRED TRIDENT", 128850); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR LODESTONE", 128851); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SOAP", 128852); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR URINE", 128853); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR HORSE DUNG", 128854); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ASHES", 128855); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR POT ASHES", 128856); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BRICK", 128857); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR POWDERED BRICK", 128858); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR AMALGAM", 128859); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM", 128860); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM 2", 128861); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR SUBLIMATION", 128862); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR PRECIPITATE", 128863); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR DISTILL", 128864); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR DISSOLVE", 128865); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR DISSOLVE 2", 128866); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR PURIFY", 128867); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR PUTREFACTION", 128868); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CRUCIBLE", 128869); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CRUCIBLE 2", 128870); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CRUCIBLE 3", 128871); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CRUCIBLE 4", 128872); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR CRUCIBLE 5", 128873); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR ALEMBIC", 128874); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BATH OF MARY", 128875); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR BATH OF VAPOURS", 128876); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR RETORT", 128877); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR HOUR", 128878); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR NIGHT", 128879); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR DAY NIGHT", 128880); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR MONTH", 128881); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR HALF DRAM", 128882); - _unicodeCharacterMap.Add("ALCHEMICAL SYMBOL FOR HALF OUNCE", 128883); - _unicodeCharacterMap.Add("BLACK LEFT POINTING ISOSCELES RIGHT TRIANGLE", 128896); - _unicodeCharacterMap.Add("BLACK UP POINTING ISOSCELES RIGHT TRIANGLE", 128897); - _unicodeCharacterMap.Add("BLACK RIGHT POINTING ISOSCELES RIGHT TRIANGLE", 128898); - _unicodeCharacterMap.Add("BLACK DOWN POINTING ISOSCELES RIGHT TRIANGLE", 128899); - _unicodeCharacterMap.Add("BLACK SLIGHTLY SMALL CIRCLE", 128900); - _unicodeCharacterMap.Add("MEDIUM BOLD WHITE CIRCLE", 128901); - _unicodeCharacterMap.Add("BOLD WHITE CIRCLE", 128902); - _unicodeCharacterMap.Add("HEAVY WHITE CIRCLE", 128903); - _unicodeCharacterMap.Add("VERY HEAVY WHITE CIRCLE", 128904); - _unicodeCharacterMap.Add("EXTREMELY HEAVY WHITE CIRCLE", 128905); - _unicodeCharacterMap.Add("WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE", 128906); - _unicodeCharacterMap.Add("ROUND TARGET", 128907); - _unicodeCharacterMap.Add("BLACK TINY SQUARE", 128908); - _unicodeCharacterMap.Add("BLACK SLIGHTLY SMALL SQUARE", 128909); - _unicodeCharacterMap.Add("LIGHT WHITE SQUARE", 128910); - _unicodeCharacterMap.Add("MEDIUM WHITE SQUARE", 128911); - _unicodeCharacterMap.Add("BOLD WHITE SQUARE", 128912); - _unicodeCharacterMap.Add("HEAVY WHITE SQUARE", 128913); - _unicodeCharacterMap.Add("VERY HEAVY WHITE SQUARE", 128914); - _unicodeCharacterMap.Add("EXTREMELY HEAVY WHITE SQUARE", 128915); - _unicodeCharacterMap.Add("WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE", 128916); - _unicodeCharacterMap.Add("WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE", 128917); - _unicodeCharacterMap.Add("SQUARE TARGET", 128918); - _unicodeCharacterMap.Add("BLACK TINY DIAMOND", 128919); - _unicodeCharacterMap.Add("BLACK VERY SMALL DIAMOND", 128920); - _unicodeCharacterMap.Add("BLACK MEDIUM SMALL DIAMOND", 128921); - _unicodeCharacterMap.Add("WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND", 128922); - _unicodeCharacterMap.Add("WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND", 128923); - _unicodeCharacterMap.Add("DIAMOND TARGET", 128924); - _unicodeCharacterMap.Add("BLACK TINY LOZENGE", 128925); - _unicodeCharacterMap.Add("BLACK VERY SMALL LOZENGE", 128926); - _unicodeCharacterMap.Add("BLACK MEDIUM SMALL LOZENGE", 128927); - _unicodeCharacterMap.Add("WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE", 128928); - _unicodeCharacterMap.Add("THIN GREEK CROSS", 128929); - _unicodeCharacterMap.Add("LIGHT GREEK CROSS", 128930); - _unicodeCharacterMap.Add("MEDIUM GREEK CROSS", 128931); - _unicodeCharacterMap.Add("BOLD GREEK CROSS", 128932); - _unicodeCharacterMap.Add("VERY BOLD GREEK CROSS", 128933); - _unicodeCharacterMap.Add("VERY HEAVY GREEK CROSS", 128934); - _unicodeCharacterMap.Add("EXTREMELY HEAVY GREEK CROSS", 128935); - _unicodeCharacterMap.Add("THIN SALTIRE", 128936); - _unicodeCharacterMap.Add("LIGHT SALTIRE", 128937); - _unicodeCharacterMap.Add("MEDIUM SALTIRE", 128938); - _unicodeCharacterMap.Add("BOLD SALTIRE", 128939); - _unicodeCharacterMap.Add("HEAVY SALTIRE", 128940); - _unicodeCharacterMap.Add("VERY HEAVY SALTIRE", 128941); - _unicodeCharacterMap.Add("EXTREMELY HEAVY SALTIRE", 128942); - _unicodeCharacterMap.Add("LIGHT FIVE SPOKED ASTERISK", 128943); - _unicodeCharacterMap.Add("MEDIUM FIVE SPOKED ASTERISK", 128944); - _unicodeCharacterMap.Add("BOLD FIVE SPOKED ASTERISK", 128945); - _unicodeCharacterMap.Add("HEAVY FIVE SPOKED ASTERISK", 128946); - _unicodeCharacterMap.Add("VERY HEAVY FIVE SPOKED ASTERISK", 128947); - _unicodeCharacterMap.Add("EXTREMELY HEAVY FIVE SPOKED ASTERISK", 128948); - _unicodeCharacterMap.Add("LIGHT SIX SPOKED ASTERISK", 128949); - _unicodeCharacterMap.Add("MEDIUM SIX SPOKED ASTERISK", 128950); - _unicodeCharacterMap.Add("BOLD SIX SPOKED ASTERISK", 128951); - _unicodeCharacterMap.Add("HEAVY SIX SPOKED ASTERISK", 128952); - _unicodeCharacterMap.Add("VERY HEAVY SIX SPOKED ASTERISK", 128953); - _unicodeCharacterMap.Add("EXTREMELY HEAVY SIX SPOKED ASTERISK", 128954); - _unicodeCharacterMap.Add("LIGHT EIGHT SPOKED ASTERISK", 128955); - _unicodeCharacterMap.Add("MEDIUM EIGHT SPOKED ASTERISK", 128956); - _unicodeCharacterMap.Add("BOLD EIGHT SPOKED ASTERISK", 128957); - _unicodeCharacterMap.Add("HEAVY EIGHT SPOKED ASTERISK", 128958); - _unicodeCharacterMap.Add("VERY HEAVY EIGHT SPOKED ASTERISK", 128959); - _unicodeCharacterMap.Add("LIGHT THREE POINTED BLACK STAR", 128960); - _unicodeCharacterMap.Add("MEDIUM THREE POINTED BLACK STAR", 128961); - _unicodeCharacterMap.Add("THREE POINTED BLACK STAR", 128962); - _unicodeCharacterMap.Add("MEDIUM THREE POINTED PINWHEEL STAR", 128963); - _unicodeCharacterMap.Add("LIGHT FOUR POINTED BLACK STAR", 128964); - _unicodeCharacterMap.Add("MEDIUM FOUR POINTED BLACK STAR", 128965); - _unicodeCharacterMap.Add("FOUR POINTED BLACK STAR", 128966); - _unicodeCharacterMap.Add("MEDIUM FOUR POINTED PINWHEEL STAR", 128967); - _unicodeCharacterMap.Add("REVERSE LIGHT FOUR POINTED PINWHEEL STAR", 128968); - _unicodeCharacterMap.Add("LIGHT FIVE POINTED BLACK STAR", 128969); - _unicodeCharacterMap.Add("HEAVY FIVE POINTED BLACK STAR", 128970); - _unicodeCharacterMap.Add("MEDIUM SIX POINTED BLACK STAR", 128971); - _unicodeCharacterMap.Add("HEAVY SIX POINTED BLACK STAR", 128972); - _unicodeCharacterMap.Add("SIX POINTED PINWHEEL STAR", 128973); - _unicodeCharacterMap.Add("MEDIUM EIGHT POINTED BLACK STAR", 128974); - _unicodeCharacterMap.Add("HEAVY EIGHT POINTED BLACK STAR", 128975); - _unicodeCharacterMap.Add("VERY HEAVY EIGHT POINTED BLACK STAR", 128976); - _unicodeCharacterMap.Add("HEAVY EIGHT POINTED PINWHEEL STAR", 128977); - _unicodeCharacterMap.Add("LIGHT TWELVE POINTED BLACK STAR", 128978); - _unicodeCharacterMap.Add("HEAVY TWELVE POINTED BLACK STAR", 128979); - _unicodeCharacterMap.Add("HEAVY TWELVE POINTED PINWHEEL STAR", 128980); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", 129024); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", 129025); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", 129026); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD", 129027); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", 129028); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", 129029); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", 129030); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD", 129031); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", 129032); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", 129033); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", 129034); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD", 129035); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", 129040); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", 129041); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", 129042); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD", 129043); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129044); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129045); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129046); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129047); - _unicodeCharacterMap.Add("HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129048); - _unicodeCharacterMap.Add("HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129049); - _unicodeCharacterMap.Add("HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129050); - _unicodeCharacterMap.Add("HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD", 129051); - _unicodeCharacterMap.Add("HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", 129052); - _unicodeCharacterMap.Add("HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", 129053); - _unicodeCharacterMap.Add("HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", 129054); - _unicodeCharacterMap.Add("HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD", 129055); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT", 129056); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT", 129057); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT", 129058); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT", 129059); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT", 129060); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT", 129061); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT", 129062); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT", 129063); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT", 129064); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT", 129065); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT", 129066); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT", 129067); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT", 129068); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT", 129069); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT", 129070); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT", 129071); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT", 129072); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT", 129073); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT", 129074); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT", 129075); - _unicodeCharacterMap.Add("LEFTWARDS FINGER POST ARROW", 129076); - _unicodeCharacterMap.Add("UPWARDS FINGER POST ARROW", 129077); - _unicodeCharacterMap.Add("RIGHTWARDS FINGER POST ARROW", 129078); - _unicodeCharacterMap.Add("DOWNWARDS FINGER POST ARROW", 129079); - _unicodeCharacterMap.Add("LEFTWARDS SQUARED ARROW", 129080); - _unicodeCharacterMap.Add("UPWARDS SQUARED ARROW", 129081); - _unicodeCharacterMap.Add("RIGHTWARDS SQUARED ARROW", 129082); - _unicodeCharacterMap.Add("DOWNWARDS SQUARED ARROW", 129083); - _unicodeCharacterMap.Add("LEFTWARDS COMPRESSED ARROW", 129084); - _unicodeCharacterMap.Add("UPWARDS COMPRESSED ARROW", 129085); - _unicodeCharacterMap.Add("RIGHTWARDS COMPRESSED ARROW", 129086); - _unicodeCharacterMap.Add("DOWNWARDS COMPRESSED ARROW", 129087); - _unicodeCharacterMap.Add("LEFTWARDS HEAVY COMPRESSED ARROW", 129088); - _unicodeCharacterMap.Add("UPWARDS HEAVY COMPRESSED ARROW", 129089); - _unicodeCharacterMap.Add("RIGHTWARDS HEAVY COMPRESSED ARROW", 129090); - _unicodeCharacterMap.Add("DOWNWARDS HEAVY COMPRESSED ARROW", 129091); - _unicodeCharacterMap.Add("LEFTWARDS HEAVY ARROW", 129092); - _unicodeCharacterMap.Add("UPWARDS HEAVY ARROW", 129093); - _unicodeCharacterMap.Add("RIGHTWARDS HEAVY ARROW", 129094); - _unicodeCharacterMap.Add("DOWNWARDS HEAVY ARROW", 129095); - _unicodeCharacterMap.Add("LEFTWARDS SANS SERIF ARROW", 129104); - _unicodeCharacterMap.Add("UPWARDS SANS SERIF ARROW", 129105); - _unicodeCharacterMap.Add("RIGHTWARDS SANS SERIF ARROW", 129106); - _unicodeCharacterMap.Add("DOWNWARDS SANS SERIF ARROW", 129107); - _unicodeCharacterMap.Add("NORTH WEST SANS SERIF ARROW", 129108); - _unicodeCharacterMap.Add("NORTH EAST SANS SERIF ARROW", 129109); - _unicodeCharacterMap.Add("SOUTH EAST SANS SERIF ARROW", 129110); - _unicodeCharacterMap.Add("SOUTH WEST SANS SERIF ARROW", 129111); - _unicodeCharacterMap.Add("LEFT RIGHT SANS SERIF ARROW", 129112); - _unicodeCharacterMap.Add("UP DOWN SANS SERIF ARROW", 129113); - _unicodeCharacterMap.Add("WIDE HEADED LEFTWARDS LIGHT BARB ARROW", 129120); - _unicodeCharacterMap.Add("WIDE HEADED UPWARDS LIGHT BARB ARROW", 129121); - _unicodeCharacterMap.Add("WIDE HEADED RIGHTWARDS LIGHT BARB ARROW", 129122); - _unicodeCharacterMap.Add("WIDE HEADED DOWNWARDS LIGHT BARB ARROW", 129123); - _unicodeCharacterMap.Add("WIDE HEADED NORTH WEST LIGHT BARB ARROW", 129124); - _unicodeCharacterMap.Add("WIDE HEADED NORTH EAST LIGHT BARB ARROW", 129125); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH EAST LIGHT BARB ARROW", 129126); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH WEST LIGHT BARB ARROW", 129127); - _unicodeCharacterMap.Add("WIDE HEADED LEFTWARDS BARB ARROW", 129128); - _unicodeCharacterMap.Add("WIDE HEADED UPWARDS BARB ARROW", 129129); - _unicodeCharacterMap.Add("WIDE HEADED RIGHTWARDS BARB ARROW", 129130); - _unicodeCharacterMap.Add("WIDE HEADED DOWNWARDS BARB ARROW", 129131); - _unicodeCharacterMap.Add("WIDE HEADED NORTH WEST BARB ARROW", 129132); - _unicodeCharacterMap.Add("WIDE HEADED NORTH EAST BARB ARROW", 129133); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH EAST BARB ARROW", 129134); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH WEST BARB ARROW", 129135); - _unicodeCharacterMap.Add("WIDE HEADED LEFTWARDS MEDIUM BARB ARROW", 129136); - _unicodeCharacterMap.Add("WIDE HEADED UPWARDS MEDIUM BARB ARROW", 129137); - _unicodeCharacterMap.Add("WIDE HEADED RIGHTWARDS MEDIUM BARB ARROW", 129138); - _unicodeCharacterMap.Add("WIDE HEADED DOWNWARDS MEDIUM BARB ARROW", 129139); - _unicodeCharacterMap.Add("WIDE HEADED NORTH WEST MEDIUM BARB ARROW", 129140); - _unicodeCharacterMap.Add("WIDE HEADED NORTH EAST MEDIUM BARB ARROW", 129141); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH EAST MEDIUM BARB ARROW", 129142); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH WEST MEDIUM BARB ARROW", 129143); - _unicodeCharacterMap.Add("WIDE HEADED LEFTWARDS HEAVY BARB ARROW", 129144); - _unicodeCharacterMap.Add("WIDE HEADED UPWARDS HEAVY BARB ARROW", 129145); - _unicodeCharacterMap.Add("WIDE HEADED RIGHTWARDS HEAVY BARB ARROW", 129146); - _unicodeCharacterMap.Add("WIDE HEADED DOWNWARDS HEAVY BARB ARROW", 129147); - _unicodeCharacterMap.Add("WIDE HEADED NORTH WEST HEAVY BARB ARROW", 129148); - _unicodeCharacterMap.Add("WIDE HEADED NORTH EAST HEAVY BARB ARROW", 129149); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH EAST HEAVY BARB ARROW", 129150); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH WEST HEAVY BARB ARROW", 129151); - _unicodeCharacterMap.Add("WIDE HEADED LEFTWARDS VERY HEAVY BARB ARROW", 129152); - _unicodeCharacterMap.Add("WIDE HEADED UPWARDS VERY HEAVY BARB ARROW", 129153); - _unicodeCharacterMap.Add("WIDE HEADED RIGHTWARDS VERY HEAVY BARB ARROW", 129154); - _unicodeCharacterMap.Add("WIDE HEADED DOWNWARDS VERY HEAVY BARB ARROW", 129155); - _unicodeCharacterMap.Add("WIDE HEADED NORTH WEST VERY HEAVY BARB ARROW", 129156); - _unicodeCharacterMap.Add("WIDE HEADED NORTH EAST VERY HEAVY BARB ARROW", 129157); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH EAST VERY HEAVY BARB ARROW", 129158); - _unicodeCharacterMap.Add("WIDE HEADED SOUTH WEST VERY HEAVY BARB ARROW", 129159); - _unicodeCharacterMap.Add("LEFTWARDS TRIANGLE ARROWHEAD", 129168); - _unicodeCharacterMap.Add("UPWARDS TRIANGLE ARROWHEAD", 129169); - _unicodeCharacterMap.Add("RIGHTWARDS TRIANGLE ARROWHEAD", 129170); - _unicodeCharacterMap.Add("DOWNWARDS TRIANGLE ARROWHEAD", 129171); - _unicodeCharacterMap.Add("LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", 129172); - _unicodeCharacterMap.Add("UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", 129173); - _unicodeCharacterMap.Add("RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", 129174); - _unicodeCharacterMap.Add("DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD", 129175); - _unicodeCharacterMap.Add("LEFTWARDS ARROW WITH NOTCHED TAIL", 129176); - _unicodeCharacterMap.Add("UPWARDS ARROW WITH NOTCHED TAIL", 129177); - _unicodeCharacterMap.Add("RIGHTWARDS ARROW WITH NOTCHED TAIL", 129178); - _unicodeCharacterMap.Add("DOWNWARDS ARROW WITH NOTCHED TAIL", 129179); - _unicodeCharacterMap.Add("HEAVY ARROW SHAFT WIDTH ONE", 129180); - _unicodeCharacterMap.Add("HEAVY ARROW SHAFT WIDTH TWO THIRDS", 129181); - _unicodeCharacterMap.Add("HEAVY ARROW SHAFT WIDTH ONE HALF", 129182); - _unicodeCharacterMap.Add("HEAVY ARROW SHAFT WIDTH ONE THIRD", 129183); - _unicodeCharacterMap.Add("LEFTWARDS BOTTOM SHADED WHITE ARROW", 129184); - _unicodeCharacterMap.Add("RIGHTWARDS BOTTOM SHADED WHITE ARROW", 129185); - _unicodeCharacterMap.Add("LEFTWARDS TOP SHADED WHITE ARROW", 129186); - _unicodeCharacterMap.Add("RIGHTWARDS TOP SHADED WHITE ARROW", 129187); - _unicodeCharacterMap.Add("LEFTWARDS LEFT SHADED WHITE ARROW", 129188); - _unicodeCharacterMap.Add("RIGHTWARDS RIGHT SHADED WHITE ARROW", 129189); - _unicodeCharacterMap.Add("LEFTWARDS RIGHT SHADED WHITE ARROW", 129190); - _unicodeCharacterMap.Add("RIGHTWARDS LEFT SHADED WHITE ARROW", 129191); - _unicodeCharacterMap.Add("LEFTWARDS BACK TILTED SHADOWED WHITE ARROW", 129192); - _unicodeCharacterMap.Add("RIGHTWARDS BACK TILTED SHADOWED WHITE ARROW", 129193); - _unicodeCharacterMap.Add("LEFTWARDS FRONT TILTED SHADOWED WHITE ARROW", 129194); - _unicodeCharacterMap.Add("RIGHTWARDS FRONT TILTED SHADOWED WHITE ARROW", 129195); - _unicodeCharacterMap.Add("WHITE ARROW SHAFT WIDTH ONE", 129196); - _unicodeCharacterMap.Add("WHITE ARROW SHAFT WIDTH TWO THIRDS", 129197); - _unicodeCharacterMap.Add("ZIPPER MOUTH FACE", 129296); - _unicodeCharacterMap.Add("MONEY MOUTH FACE", 129297); - _unicodeCharacterMap.Add("FACE WITH THERMOMETER", 129298); - _unicodeCharacterMap.Add("NERD FACE", 129299); - _unicodeCharacterMap.Add("THINKING FACE", 129300); - _unicodeCharacterMap.Add("FACE WITH HEAD BANDAGE", 129301); - _unicodeCharacterMap.Add("ROBOT FACE", 129302); - _unicodeCharacterMap.Add("HUGGING FACE", 129303); - _unicodeCharacterMap.Add("SIGN OF THE HORNS", 129304); - _unicodeCharacterMap.Add("CALL ME HAND", 129305); - _unicodeCharacterMap.Add("RAISED BACK OF HAND", 129306); - _unicodeCharacterMap.Add("LEFT FACING FIST", 129307); - _unicodeCharacterMap.Add("RIGHT FACING FIST", 129308); - _unicodeCharacterMap.Add("HANDSHAKE", 129309); - _unicodeCharacterMap.Add("HAND WITH INDEX AND MIDDLE FINGERS CROSSED", 129310); - _unicodeCharacterMap.Add("FACE WITH COWBOY HAT", 129312); - _unicodeCharacterMap.Add("CLOWN FACE", 129313); - _unicodeCharacterMap.Add("NAUSEATED FACE", 129314); - _unicodeCharacterMap.Add("ROLLING ON THE FLOOR LAUGHING", 129315); - _unicodeCharacterMap.Add("DROOLING FACE", 129316); - _unicodeCharacterMap.Add("LYING FACE", 129317); - _unicodeCharacterMap.Add("FACE PALM", 129318); - _unicodeCharacterMap.Add("SNEEZING FACE", 129319); - _unicodeCharacterMap.Add("PREGNANT WOMAN", 129328); - _unicodeCharacterMap.Add("SELFIE", 129331); - _unicodeCharacterMap.Add("PRINCE", 129332); - _unicodeCharacterMap.Add("MAN IN TUXEDO", 129333); - _unicodeCharacterMap.Add("MOTHER CHRISTMAS", 129334); - _unicodeCharacterMap.Add("SHRUG", 129335); - _unicodeCharacterMap.Add("PERSON DOING CARTWHEEL", 129336); - _unicodeCharacterMap.Add("JUGGLING", 129337); - _unicodeCharacterMap.Add("FENCER", 129338); - _unicodeCharacterMap.Add("MODERN PENTATHLON", 129339); - _unicodeCharacterMap.Add("WRESTLERS", 129340); - _unicodeCharacterMap.Add("WATER POLO", 129341); - _unicodeCharacterMap.Add("HANDBALL", 129342); - _unicodeCharacterMap.Add("WILTED FLOWER", 129344); - _unicodeCharacterMap.Add("DRUM WITH DRUMSTICKS", 129345); - _unicodeCharacterMap.Add("CLINKING GLASSES", 129346); - _unicodeCharacterMap.Add("TUMBLER GLASS", 129347); - _unicodeCharacterMap.Add("SPOON", 129348); - _unicodeCharacterMap.Add("GOAL NET", 129349); - _unicodeCharacterMap.Add("RIFLE", 129350); - _unicodeCharacterMap.Add("FIRST PLACE MEDAL", 129351); - _unicodeCharacterMap.Add("SECOND PLACE MEDAL", 129352); - _unicodeCharacterMap.Add("THIRD PLACE MEDAL", 129353); - _unicodeCharacterMap.Add("BOXING GLOVE", 129354); - _unicodeCharacterMap.Add("MARTIAL ARTS UNIFORM", 129355); - _unicodeCharacterMap.Add("CROISSANT", 129360); - _unicodeCharacterMap.Add("AVOCADO", 129361); - _unicodeCharacterMap.Add("CUCUMBER", 129362); - _unicodeCharacterMap.Add("BACON", 129363); - _unicodeCharacterMap.Add("POTATO", 129364); - _unicodeCharacterMap.Add("CARROT", 129365); - _unicodeCharacterMap.Add("BAGUETTE BREAD", 129366); - _unicodeCharacterMap.Add("GREEN SALAD", 129367); - _unicodeCharacterMap.Add("SHALLOW PAN OF FOOD", 129368); - _unicodeCharacterMap.Add("STUFFED FLATBREAD", 129369); - _unicodeCharacterMap.Add("EGG", 129370); - _unicodeCharacterMap.Add("GLASS OF MILK", 129371); - _unicodeCharacterMap.Add("PEANUTS", 129372); - _unicodeCharacterMap.Add("KIWIFRUIT", 129373); - _unicodeCharacterMap.Add("PANCAKES", 129374); - _unicodeCharacterMap.Add("CRAB", 129408); - _unicodeCharacterMap.Add("LION FACE", 129409); - _unicodeCharacterMap.Add("SCORPION", 129410); - _unicodeCharacterMap.Add("TURKEY", 129411); - _unicodeCharacterMap.Add("UNICORN FACE", 129412); - _unicodeCharacterMap.Add("EAGLE", 129413); - _unicodeCharacterMap.Add("DUCK", 129414); - _unicodeCharacterMap.Add("BAT", 129415); - _unicodeCharacterMap.Add("SHARK", 129416); - _unicodeCharacterMap.Add("OWL", 129417); - _unicodeCharacterMap.Add("FOX FACE", 129418); - _unicodeCharacterMap.Add("BUTTERFLY", 129419); - _unicodeCharacterMap.Add("DEER", 129420); - _unicodeCharacterMap.Add("GORILLA", 129421); - _unicodeCharacterMap.Add("LIZARD", 129422); - _unicodeCharacterMap.Add("RHINOCEROS", 129423); - _unicodeCharacterMap.Add("SHRIMP", 129424); - _unicodeCharacterMap.Add("SQUID", 129425); - _unicodeCharacterMap.Add("CHEESE WEDGE", 129472); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F800", 194560); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F801", 194561); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F802", 194562); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F803", 194563); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F804", 194564); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F805", 194565); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F806", 194566); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F807", 194567); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F808", 194568); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F809", 194569); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F80A", 194570); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F80B", 194571); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F80C", 194572); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F80D", 194573); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F80E", 194574); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F80F", 194575); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F810", 194576); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F811", 194577); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F812", 194578); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F813", 194579); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F814", 194580); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F815", 194581); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F816", 194582); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F817", 194583); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F818", 194584); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F819", 194585); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F81A", 194586); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F81B", 194587); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F81C", 194588); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F81D", 194589); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F81E", 194590); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F81F", 194591); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F820", 194592); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F821", 194593); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F822", 194594); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F823", 194595); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F824", 194596); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F825", 194597); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F826", 194598); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F827", 194599); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F828", 194600); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F829", 194601); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F82A", 194602); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F82B", 194603); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F82C", 194604); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F82D", 194605); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F82E", 194606); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F82F", 194607); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F830", 194608); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F831", 194609); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F832", 194610); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F833", 194611); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F834", 194612); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F835", 194613); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F836", 194614); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F837", 194615); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F838", 194616); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F839", 194617); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F83A", 194618); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F83B", 194619); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F83C", 194620); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F83D", 194621); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F83E", 194622); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F83F", 194623); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F840", 194624); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F841", 194625); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F842", 194626); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F843", 194627); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F844", 194628); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F845", 194629); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F846", 194630); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F847", 194631); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F848", 194632); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F849", 194633); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F84A", 194634); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F84B", 194635); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F84C", 194636); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F84D", 194637); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F84E", 194638); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F84F", 194639); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F850", 194640); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F851", 194641); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F852", 194642); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F853", 194643); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F854", 194644); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F855", 194645); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F856", 194646); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F857", 194647); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F858", 194648); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F859", 194649); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F85A", 194650); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F85B", 194651); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F85C", 194652); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F85D", 194653); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F85E", 194654); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F85F", 194655); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F860", 194656); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F861", 194657); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F862", 194658); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F863", 194659); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F864", 194660); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F865", 194661); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F866", 194662); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F867", 194663); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F868", 194664); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F869", 194665); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F86A", 194666); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F86B", 194667); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F86C", 194668); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F86D", 194669); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F86E", 194670); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F86F", 194671); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F870", 194672); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F871", 194673); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F872", 194674); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F873", 194675); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F874", 194676); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F875", 194677); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F876", 194678); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F877", 194679); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F878", 194680); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F879", 194681); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F87A", 194682); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F87B", 194683); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F87C", 194684); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F87D", 194685); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F87E", 194686); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F87F", 194687); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F880", 194688); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F881", 194689); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F882", 194690); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F883", 194691); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F884", 194692); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F885", 194693); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F886", 194694); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F887", 194695); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F888", 194696); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F889", 194697); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F88A", 194698); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F88B", 194699); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F88C", 194700); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F88D", 194701); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F88E", 194702); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F88F", 194703); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F890", 194704); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F891", 194705); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F892", 194706); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F893", 194707); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F894", 194708); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F895", 194709); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F896", 194710); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F897", 194711); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F898", 194712); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F899", 194713); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F89A", 194714); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F89B", 194715); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F89C", 194716); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F89D", 194717); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F89E", 194718); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F89F", 194719); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A0", 194720); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A1", 194721); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A2", 194722); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A3", 194723); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A4", 194724); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A5", 194725); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A6", 194726); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A7", 194727); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A8", 194728); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8A9", 194729); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8AA", 194730); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8AB", 194731); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8AC", 194732); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8AD", 194733); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8AE", 194734); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8AF", 194735); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B0", 194736); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B1", 194737); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B2", 194738); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B3", 194739); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B4", 194740); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B5", 194741); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B6", 194742); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B7", 194743); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B8", 194744); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8B9", 194745); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8BA", 194746); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8BB", 194747); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8BC", 194748); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8BD", 194749); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8BE", 194750); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8BF", 194751); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C0", 194752); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C1", 194753); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C2", 194754); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C3", 194755); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C4", 194756); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C5", 194757); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C6", 194758); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C7", 194759); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C8", 194760); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8C9", 194761); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8CA", 194762); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8CB", 194763); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8CC", 194764); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8CD", 194765); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8CE", 194766); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8CF", 194767); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D0", 194768); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D1", 194769); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D2", 194770); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D3", 194771); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D4", 194772); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D5", 194773); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D6", 194774); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D7", 194775); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D8", 194776); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8D9", 194777); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8DA", 194778); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8DB", 194779); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8DC", 194780); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8DD", 194781); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8DE", 194782); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8DF", 194783); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E0", 194784); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E1", 194785); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E2", 194786); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E3", 194787); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E4", 194788); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E5", 194789); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E6", 194790); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E7", 194791); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E8", 194792); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8E9", 194793); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8EA", 194794); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8EB", 194795); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8EC", 194796); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8ED", 194797); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8EE", 194798); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8EF", 194799); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F0", 194800); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F1", 194801); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F2", 194802); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F3", 194803); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F4", 194804); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F5", 194805); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F6", 194806); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F7", 194807); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F8", 194808); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8F9", 194809); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8FA", 194810); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8FB", 194811); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8FC", 194812); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8FD", 194813); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8FE", 194814); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F8FF", 194815); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F900", 194816); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F901", 194817); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F902", 194818); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F903", 194819); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F904", 194820); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F905", 194821); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F906", 194822); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F907", 194823); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F908", 194824); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F909", 194825); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F90A", 194826); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F90B", 194827); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F90C", 194828); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F90D", 194829); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F90E", 194830); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F90F", 194831); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F910", 194832); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F911", 194833); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F912", 194834); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F913", 194835); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F914", 194836); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F915", 194837); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F916", 194838); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F917", 194839); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F918", 194840); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F919", 194841); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F91A", 194842); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F91B", 194843); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F91C", 194844); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F91D", 194845); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F91E", 194846); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F91F", 194847); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F920", 194848); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F921", 194849); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F922", 194850); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F923", 194851); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F924", 194852); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F925", 194853); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F926", 194854); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F927", 194855); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F928", 194856); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F929", 194857); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F92A", 194858); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F92B", 194859); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F92C", 194860); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F92D", 194861); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F92E", 194862); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F92F", 194863); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F930", 194864); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F931", 194865); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F932", 194866); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F933", 194867); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F934", 194868); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F935", 194869); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F936", 194870); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F937", 194871); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F938", 194872); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F939", 194873); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F93A", 194874); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F93B", 194875); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F93C", 194876); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F93D", 194877); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F93E", 194878); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F93F", 194879); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F940", 194880); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F941", 194881); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F942", 194882); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F943", 194883); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F944", 194884); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F945", 194885); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F946", 194886); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F947", 194887); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F948", 194888); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F949", 194889); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F94A", 194890); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F94B", 194891); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F94C", 194892); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F94D", 194893); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F94E", 194894); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F94F", 194895); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F950", 194896); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F951", 194897); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F952", 194898); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F953", 194899); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F954", 194900); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F955", 194901); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F956", 194902); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F957", 194903); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F958", 194904); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F959", 194905); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F95A", 194906); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F95B", 194907); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F95C", 194908); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F95D", 194909); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F95E", 194910); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F95F", 194911); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F960", 194912); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F961", 194913); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F962", 194914); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F963", 194915); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F964", 194916); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F965", 194917); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F966", 194918); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F967", 194919); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F968", 194920); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F969", 194921); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F96A", 194922); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F96B", 194923); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F96C", 194924); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F96D", 194925); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F96E", 194926); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F96F", 194927); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F970", 194928); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F971", 194929); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F972", 194930); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F973", 194931); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F974", 194932); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F975", 194933); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F976", 194934); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F977", 194935); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F978", 194936); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F979", 194937); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F97A", 194938); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F97B", 194939); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F97C", 194940); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F97D", 194941); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F97E", 194942); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F97F", 194943); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F980", 194944); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F981", 194945); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F982", 194946); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F983", 194947); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F984", 194948); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F985", 194949); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F986", 194950); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F987", 194951); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F988", 194952); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F989", 194953); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F98A", 194954); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F98B", 194955); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F98C", 194956); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F98D", 194957); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F98E", 194958); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F98F", 194959); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F990", 194960); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F991", 194961); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F992", 194962); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F993", 194963); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F994", 194964); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F995", 194965); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F996", 194966); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F997", 194967); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F998", 194968); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F999", 194969); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F99A", 194970); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F99B", 194971); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F99C", 194972); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F99D", 194973); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F99E", 194974); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F99F", 194975); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A0", 194976); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A1", 194977); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A2", 194978); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A3", 194979); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A4", 194980); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A5", 194981); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A6", 194982); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A7", 194983); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A8", 194984); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9A9", 194985); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9AA", 194986); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9AB", 194987); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9AC", 194988); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9AD", 194989); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9AE", 194990); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9AF", 194991); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B0", 194992); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B1", 194993); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B2", 194994); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B3", 194995); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B4", 194996); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B5", 194997); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B6", 194998); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B7", 194999); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B8", 195000); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9B9", 195001); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9BA", 195002); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9BB", 195003); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9BC", 195004); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9BD", 195005); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9BE", 195006); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9BF", 195007); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C0", 195008); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C1", 195009); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C2", 195010); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C3", 195011); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C4", 195012); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C5", 195013); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C6", 195014); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C7", 195015); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C8", 195016); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9C9", 195017); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9CA", 195018); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9CB", 195019); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9CC", 195020); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9CD", 195021); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9CE", 195022); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9CF", 195023); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D0", 195024); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D1", 195025); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D2", 195026); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D3", 195027); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D4", 195028); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D5", 195029); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D6", 195030); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D7", 195031); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D8", 195032); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9D9", 195033); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9DA", 195034); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9DB", 195035); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9DC", 195036); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9DD", 195037); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9DE", 195038); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9DF", 195039); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E0", 195040); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E1", 195041); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E2", 195042); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E3", 195043); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E4", 195044); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E5", 195045); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E6", 195046); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E7", 195047); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E8", 195048); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9E9", 195049); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9EA", 195050); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9EB", 195051); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9EC", 195052); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9ED", 195053); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9EE", 195054); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9EF", 195055); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F0", 195056); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F1", 195057); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F2", 195058); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F3", 195059); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F4", 195060); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F5", 195061); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F6", 195062); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F7", 195063); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F8", 195064); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9F9", 195065); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9FA", 195066); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9FB", 195067); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9FC", 195068); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9FD", 195069); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9FE", 195070); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2F9FF", 195071); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA00", 195072); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA01", 195073); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA02", 195074); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA03", 195075); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA04", 195076); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA05", 195077); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA06", 195078); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA07", 195079); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA08", 195080); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA09", 195081); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA0A", 195082); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA0B", 195083); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA0C", 195084); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA0D", 195085); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA0E", 195086); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA0F", 195087); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA10", 195088); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA11", 195089); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA12", 195090); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA13", 195091); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA14", 195092); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA15", 195093); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA16", 195094); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA17", 195095); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA18", 195096); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA19", 195097); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA1A", 195098); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA1B", 195099); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA1C", 195100); - _unicodeCharacterMap.Add("CJK COMPATIBILITY IDEOGRAPH 2FA1D", 195101); - _unicodeCharacterMap.Add("LANGUAGE TAG", 917505); - _unicodeCharacterMap.Add("TAG SPACE", 917536); - _unicodeCharacterMap.Add("TAG EXCLAMATION MARK", 917537); - _unicodeCharacterMap.Add("TAG QUOTATION MARK", 917538); - _unicodeCharacterMap.Add("TAG NUMBER SIGN", 917539); - _unicodeCharacterMap.Add("TAG DOLLAR SIGN", 917540); - _unicodeCharacterMap.Add("TAG PERCENT SIGN", 917541); - _unicodeCharacterMap.Add("TAG AMPERSAND", 917542); - _unicodeCharacterMap.Add("TAG APOSTROPHE", 917543); - _unicodeCharacterMap.Add("TAG LEFT PARENTHESIS", 917544); - _unicodeCharacterMap.Add("TAG RIGHT PARENTHESIS", 917545); - _unicodeCharacterMap.Add("TAG ASTERISK", 917546); - _unicodeCharacterMap.Add("TAG PLUS SIGN", 917547); - _unicodeCharacterMap.Add("TAG COMMA", 917548); - _unicodeCharacterMap.Add("TAG HYPHEN MINUS", 917549); - _unicodeCharacterMap.Add("TAG FULL STOP", 917550); - _unicodeCharacterMap.Add("TAG SOLIDUS", 917551); - _unicodeCharacterMap.Add("TAG DIGIT ZERO", 917552); - _unicodeCharacterMap.Add("TAG DIGIT ONE", 917553); - _unicodeCharacterMap.Add("TAG DIGIT TWO", 917554); - _unicodeCharacterMap.Add("TAG DIGIT THREE", 917555); - _unicodeCharacterMap.Add("TAG DIGIT FOUR", 917556); - _unicodeCharacterMap.Add("TAG DIGIT FIVE", 917557); - _unicodeCharacterMap.Add("TAG DIGIT SIX", 917558); - _unicodeCharacterMap.Add("TAG DIGIT SEVEN", 917559); - _unicodeCharacterMap.Add("TAG DIGIT EIGHT", 917560); - _unicodeCharacterMap.Add("TAG DIGIT NINE", 917561); - _unicodeCharacterMap.Add("TAG COLON", 917562); - _unicodeCharacterMap.Add("TAG SEMICOLON", 917563); - _unicodeCharacterMap.Add("TAG LESS THAN SIGN", 917564); - _unicodeCharacterMap.Add("TAG EQUALS SIGN", 917565); - _unicodeCharacterMap.Add("TAG GREATER THAN SIGN", 917566); - _unicodeCharacterMap.Add("TAG QUESTION MARK", 917567); - _unicodeCharacterMap.Add("TAG COMMERCIAL AT", 917568); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER A", 917569); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER B", 917570); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER C", 917571); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER D", 917572); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER E", 917573); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER F", 917574); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER G", 917575); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER H", 917576); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER I", 917577); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER J", 917578); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER K", 917579); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER L", 917580); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER M", 917581); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER N", 917582); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER O", 917583); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER P", 917584); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER Q", 917585); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER R", 917586); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER S", 917587); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER T", 917588); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER U", 917589); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER V", 917590); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER W", 917591); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER X", 917592); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER Y", 917593); - _unicodeCharacterMap.Add("TAG LATIN CAPITAL LETTER Z", 917594); - _unicodeCharacterMap.Add("TAG LEFT SQUARE BRACKET", 917595); - _unicodeCharacterMap.Add("TAG REVERSE SOLIDUS", 917596); - _unicodeCharacterMap.Add("TAG RIGHT SQUARE BRACKET", 917597); - _unicodeCharacterMap.Add("TAG CIRCUMFLEX ACCENT", 917598); - _unicodeCharacterMap.Add("TAG LOW LINE", 917599); - _unicodeCharacterMap.Add("TAG GRAVE ACCENT", 917600); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER A", 917601); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER B", 917602); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER C", 917603); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER D", 917604); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER E", 917605); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER F", 917606); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER G", 917607); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER H", 917608); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER I", 917609); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER J", 917610); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER K", 917611); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER L", 917612); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER M", 917613); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER N", 917614); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER O", 917615); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER P", 917616); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER Q", 917617); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER R", 917618); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER S", 917619); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER T", 917620); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER U", 917621); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER V", 917622); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER W", 917623); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER X", 917624); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER Y", 917625); - _unicodeCharacterMap.Add("TAG LATIN SMALL LETTER Z", 917626); - _unicodeCharacterMap.Add("TAG LEFT CURLY BRACKET", 917627); - _unicodeCharacterMap.Add("TAG VERTICAL LINE", 917628); - _unicodeCharacterMap.Add("TAG RIGHT CURLY BRACKET", 917629); - _unicodeCharacterMap.Add("TAG TILDE", 917630); - _unicodeCharacterMap.Add("CANCEL TAG", 917631); - _unicodeCharacterMap.Add("VARIATION SELECTOR 17", 917760); - _unicodeCharacterMap.Add("VARIATION SELECTOR 18", 917761); - _unicodeCharacterMap.Add("VARIATION SELECTOR 19", 917762); - _unicodeCharacterMap.Add("VARIATION SELECTOR 20", 917763); - _unicodeCharacterMap.Add("VARIATION SELECTOR 21", 917764); - _unicodeCharacterMap.Add("VARIATION SELECTOR 22", 917765); - _unicodeCharacterMap.Add("VARIATION SELECTOR 23", 917766); - _unicodeCharacterMap.Add("VARIATION SELECTOR 24", 917767); - _unicodeCharacterMap.Add("VARIATION SELECTOR 25", 917768); - _unicodeCharacterMap.Add("VARIATION SELECTOR 26", 917769); - _unicodeCharacterMap.Add("VARIATION SELECTOR 27", 917770); - _unicodeCharacterMap.Add("VARIATION SELECTOR 28", 917771); - _unicodeCharacterMap.Add("VARIATION SELECTOR 29", 917772); - _unicodeCharacterMap.Add("VARIATION SELECTOR 30", 917773); - _unicodeCharacterMap.Add("VARIATION SELECTOR 31", 917774); - _unicodeCharacterMap.Add("VARIATION SELECTOR 32", 917775); - _unicodeCharacterMap.Add("VARIATION SELECTOR 33", 917776); - _unicodeCharacterMap.Add("VARIATION SELECTOR 34", 917777); - _unicodeCharacterMap.Add("VARIATION SELECTOR 35", 917778); - _unicodeCharacterMap.Add("VARIATION SELECTOR 36", 917779); - _unicodeCharacterMap.Add("VARIATION SELECTOR 37", 917780); - _unicodeCharacterMap.Add("VARIATION SELECTOR 38", 917781); - _unicodeCharacterMap.Add("VARIATION SELECTOR 39", 917782); - _unicodeCharacterMap.Add("VARIATION SELECTOR 40", 917783); - _unicodeCharacterMap.Add("VARIATION SELECTOR 41", 917784); - _unicodeCharacterMap.Add("VARIATION SELECTOR 42", 917785); - _unicodeCharacterMap.Add("VARIATION SELECTOR 43", 917786); - _unicodeCharacterMap.Add("VARIATION SELECTOR 44", 917787); - _unicodeCharacterMap.Add("VARIATION SELECTOR 45", 917788); - _unicodeCharacterMap.Add("VARIATION SELECTOR 46", 917789); - _unicodeCharacterMap.Add("VARIATION SELECTOR 47", 917790); - _unicodeCharacterMap.Add("VARIATION SELECTOR 48", 917791); - _unicodeCharacterMap.Add("VARIATION SELECTOR 49", 917792); - _unicodeCharacterMap.Add("VARIATION SELECTOR 50", 917793); - _unicodeCharacterMap.Add("VARIATION SELECTOR 51", 917794); - _unicodeCharacterMap.Add("VARIATION SELECTOR 52", 917795); - _unicodeCharacterMap.Add("VARIATION SELECTOR 53", 917796); - _unicodeCharacterMap.Add("VARIATION SELECTOR 54", 917797); - _unicodeCharacterMap.Add("VARIATION SELECTOR 55", 917798); - _unicodeCharacterMap.Add("VARIATION SELECTOR 56", 917799); - _unicodeCharacterMap.Add("VARIATION SELECTOR 57", 917800); - _unicodeCharacterMap.Add("VARIATION SELECTOR 58", 917801); - _unicodeCharacterMap.Add("VARIATION SELECTOR 59", 917802); - _unicodeCharacterMap.Add("VARIATION SELECTOR 60", 917803); - _unicodeCharacterMap.Add("VARIATION SELECTOR 61", 917804); - _unicodeCharacterMap.Add("VARIATION SELECTOR 62", 917805); - _unicodeCharacterMap.Add("VARIATION SELECTOR 63", 917806); - _unicodeCharacterMap.Add("VARIATION SELECTOR 64", 917807); - _unicodeCharacterMap.Add("VARIATION SELECTOR 65", 917808); - _unicodeCharacterMap.Add("VARIATION SELECTOR 66", 917809); - _unicodeCharacterMap.Add("VARIATION SELECTOR 67", 917810); - _unicodeCharacterMap.Add("VARIATION SELECTOR 68", 917811); - _unicodeCharacterMap.Add("VARIATION SELECTOR 69", 917812); - _unicodeCharacterMap.Add("VARIATION SELECTOR 70", 917813); - _unicodeCharacterMap.Add("VARIATION SELECTOR 71", 917814); - _unicodeCharacterMap.Add("VARIATION SELECTOR 72", 917815); - _unicodeCharacterMap.Add("VARIATION SELECTOR 73", 917816); - _unicodeCharacterMap.Add("VARIATION SELECTOR 74", 917817); - _unicodeCharacterMap.Add("VARIATION SELECTOR 75", 917818); - _unicodeCharacterMap.Add("VARIATION SELECTOR 76", 917819); - _unicodeCharacterMap.Add("VARIATION SELECTOR 77", 917820); - _unicodeCharacterMap.Add("VARIATION SELECTOR 78", 917821); - _unicodeCharacterMap.Add("VARIATION SELECTOR 79", 917822); - _unicodeCharacterMap.Add("VARIATION SELECTOR 80", 917823); - _unicodeCharacterMap.Add("VARIATION SELECTOR 81", 917824); - _unicodeCharacterMap.Add("VARIATION SELECTOR 82", 917825); - _unicodeCharacterMap.Add("VARIATION SELECTOR 83", 917826); - _unicodeCharacterMap.Add("VARIATION SELECTOR 84", 917827); - _unicodeCharacterMap.Add("VARIATION SELECTOR 85", 917828); - _unicodeCharacterMap.Add("VARIATION SELECTOR 86", 917829); - _unicodeCharacterMap.Add("VARIATION SELECTOR 87", 917830); - _unicodeCharacterMap.Add("VARIATION SELECTOR 88", 917831); - _unicodeCharacterMap.Add("VARIATION SELECTOR 89", 917832); - _unicodeCharacterMap.Add("VARIATION SELECTOR 90", 917833); - _unicodeCharacterMap.Add("VARIATION SELECTOR 91", 917834); - _unicodeCharacterMap.Add("VARIATION SELECTOR 92", 917835); - _unicodeCharacterMap.Add("VARIATION SELECTOR 93", 917836); - _unicodeCharacterMap.Add("VARIATION SELECTOR 94", 917837); - _unicodeCharacterMap.Add("VARIATION SELECTOR 95", 917838); - _unicodeCharacterMap.Add("VARIATION SELECTOR 96", 917839); - _unicodeCharacterMap.Add("VARIATION SELECTOR 97", 917840); - _unicodeCharacterMap.Add("VARIATION SELECTOR 98", 917841); - _unicodeCharacterMap.Add("VARIATION SELECTOR 99", 917842); - _unicodeCharacterMap.Add("VARIATION SELECTOR 100", 917843); - _unicodeCharacterMap.Add("VARIATION SELECTOR 101", 917844); - _unicodeCharacterMap.Add("VARIATION SELECTOR 102", 917845); - _unicodeCharacterMap.Add("VARIATION SELECTOR 103", 917846); - _unicodeCharacterMap.Add("VARIATION SELECTOR 104", 917847); - _unicodeCharacterMap.Add("VARIATION SELECTOR 105", 917848); - _unicodeCharacterMap.Add("VARIATION SELECTOR 106", 917849); - _unicodeCharacterMap.Add("VARIATION SELECTOR 107", 917850); - _unicodeCharacterMap.Add("VARIATION SELECTOR 108", 917851); - _unicodeCharacterMap.Add("VARIATION SELECTOR 109", 917852); - _unicodeCharacterMap.Add("VARIATION SELECTOR 110", 917853); - _unicodeCharacterMap.Add("VARIATION SELECTOR 111", 917854); - _unicodeCharacterMap.Add("VARIATION SELECTOR 112", 917855); - _unicodeCharacterMap.Add("VARIATION SELECTOR 113", 917856); - _unicodeCharacterMap.Add("VARIATION SELECTOR 114", 917857); - _unicodeCharacterMap.Add("VARIATION SELECTOR 115", 917858); - _unicodeCharacterMap.Add("VARIATION SELECTOR 116", 917859); - _unicodeCharacterMap.Add("VARIATION SELECTOR 117", 917860); - _unicodeCharacterMap.Add("VARIATION SELECTOR 118", 917861); - _unicodeCharacterMap.Add("VARIATION SELECTOR 119", 917862); - _unicodeCharacterMap.Add("VARIATION SELECTOR 120", 917863); - _unicodeCharacterMap.Add("VARIATION SELECTOR 121", 917864); - _unicodeCharacterMap.Add("VARIATION SELECTOR 122", 917865); - _unicodeCharacterMap.Add("VARIATION SELECTOR 123", 917866); - _unicodeCharacterMap.Add("VARIATION SELECTOR 124", 917867); - _unicodeCharacterMap.Add("VARIATION SELECTOR 125", 917868); - _unicodeCharacterMap.Add("VARIATION SELECTOR 126", 917869); - _unicodeCharacterMap.Add("VARIATION SELECTOR 127", 917870); - _unicodeCharacterMap.Add("VARIATION SELECTOR 128", 917871); - _unicodeCharacterMap.Add("VARIATION SELECTOR 129", 917872); - _unicodeCharacterMap.Add("VARIATION SELECTOR 130", 917873); - _unicodeCharacterMap.Add("VARIATION SELECTOR 131", 917874); - _unicodeCharacterMap.Add("VARIATION SELECTOR 132", 917875); - _unicodeCharacterMap.Add("VARIATION SELECTOR 133", 917876); - _unicodeCharacterMap.Add("VARIATION SELECTOR 134", 917877); - _unicodeCharacterMap.Add("VARIATION SELECTOR 135", 917878); - _unicodeCharacterMap.Add("VARIATION SELECTOR 136", 917879); - _unicodeCharacterMap.Add("VARIATION SELECTOR 137", 917880); - _unicodeCharacterMap.Add("VARIATION SELECTOR 138", 917881); - _unicodeCharacterMap.Add("VARIATION SELECTOR 139", 917882); - _unicodeCharacterMap.Add("VARIATION SELECTOR 140", 917883); - _unicodeCharacterMap.Add("VARIATION SELECTOR 141", 917884); - _unicodeCharacterMap.Add("VARIATION SELECTOR 142", 917885); - _unicodeCharacterMap.Add("VARIATION SELECTOR 143", 917886); - _unicodeCharacterMap.Add("VARIATION SELECTOR 144", 917887); - _unicodeCharacterMap.Add("VARIATION SELECTOR 145", 917888); - _unicodeCharacterMap.Add("VARIATION SELECTOR 146", 917889); - _unicodeCharacterMap.Add("VARIATION SELECTOR 147", 917890); - _unicodeCharacterMap.Add("VARIATION SELECTOR 148", 917891); - _unicodeCharacterMap.Add("VARIATION SELECTOR 149", 917892); - _unicodeCharacterMap.Add("VARIATION SELECTOR 150", 917893); - _unicodeCharacterMap.Add("VARIATION SELECTOR 151", 917894); - _unicodeCharacterMap.Add("VARIATION SELECTOR 152", 917895); - _unicodeCharacterMap.Add("VARIATION SELECTOR 153", 917896); - _unicodeCharacterMap.Add("VARIATION SELECTOR 154", 917897); - _unicodeCharacterMap.Add("VARIATION SELECTOR 155", 917898); - _unicodeCharacterMap.Add("VARIATION SELECTOR 156", 917899); - _unicodeCharacterMap.Add("VARIATION SELECTOR 157", 917900); - _unicodeCharacterMap.Add("VARIATION SELECTOR 158", 917901); - _unicodeCharacterMap.Add("VARIATION SELECTOR 159", 917902); - _unicodeCharacterMap.Add("VARIATION SELECTOR 160", 917903); - _unicodeCharacterMap.Add("VARIATION SELECTOR 161", 917904); - _unicodeCharacterMap.Add("VARIATION SELECTOR 162", 917905); - _unicodeCharacterMap.Add("VARIATION SELECTOR 163", 917906); - _unicodeCharacterMap.Add("VARIATION SELECTOR 164", 917907); - _unicodeCharacterMap.Add("VARIATION SELECTOR 165", 917908); - _unicodeCharacterMap.Add("VARIATION SELECTOR 166", 917909); - _unicodeCharacterMap.Add("VARIATION SELECTOR 167", 917910); - _unicodeCharacterMap.Add("VARIATION SELECTOR 168", 917911); - _unicodeCharacterMap.Add("VARIATION SELECTOR 169", 917912); - _unicodeCharacterMap.Add("VARIATION SELECTOR 170", 917913); - _unicodeCharacterMap.Add("VARIATION SELECTOR 171", 917914); - _unicodeCharacterMap.Add("VARIATION SELECTOR 172", 917915); - _unicodeCharacterMap.Add("VARIATION SELECTOR 173", 917916); - _unicodeCharacterMap.Add("VARIATION SELECTOR 174", 917917); - _unicodeCharacterMap.Add("VARIATION SELECTOR 175", 917918); - _unicodeCharacterMap.Add("VARIATION SELECTOR 176", 917919); - _unicodeCharacterMap.Add("VARIATION SELECTOR 177", 917920); - _unicodeCharacterMap.Add("VARIATION SELECTOR 178", 917921); - _unicodeCharacterMap.Add("VARIATION SELECTOR 179", 917922); - _unicodeCharacterMap.Add("VARIATION SELECTOR 180", 917923); - _unicodeCharacterMap.Add("VARIATION SELECTOR 181", 917924); - _unicodeCharacterMap.Add("VARIATION SELECTOR 182", 917925); - _unicodeCharacterMap.Add("VARIATION SELECTOR 183", 917926); - _unicodeCharacterMap.Add("VARIATION SELECTOR 184", 917927); - _unicodeCharacterMap.Add("VARIATION SELECTOR 185", 917928); - _unicodeCharacterMap.Add("VARIATION SELECTOR 186", 917929); - _unicodeCharacterMap.Add("VARIATION SELECTOR 187", 917930); - _unicodeCharacterMap.Add("VARIATION SELECTOR 188", 917931); - _unicodeCharacterMap.Add("VARIATION SELECTOR 189", 917932); - _unicodeCharacterMap.Add("VARIATION SELECTOR 190", 917933); - _unicodeCharacterMap.Add("VARIATION SELECTOR 191", 917934); - _unicodeCharacterMap.Add("VARIATION SELECTOR 192", 917935); - _unicodeCharacterMap.Add("VARIATION SELECTOR 193", 917936); - _unicodeCharacterMap.Add("VARIATION SELECTOR 194", 917937); - _unicodeCharacterMap.Add("VARIATION SELECTOR 195", 917938); - _unicodeCharacterMap.Add("VARIATION SELECTOR 196", 917939); - _unicodeCharacterMap.Add("VARIATION SELECTOR 197", 917940); - _unicodeCharacterMap.Add("VARIATION SELECTOR 198", 917941); - _unicodeCharacterMap.Add("VARIATION SELECTOR 199", 917942); - _unicodeCharacterMap.Add("VARIATION SELECTOR 200", 917943); - _unicodeCharacterMap.Add("VARIATION SELECTOR 201", 917944); - _unicodeCharacterMap.Add("VARIATION SELECTOR 202", 917945); - _unicodeCharacterMap.Add("VARIATION SELECTOR 203", 917946); - _unicodeCharacterMap.Add("VARIATION SELECTOR 204", 917947); - _unicodeCharacterMap.Add("VARIATION SELECTOR 205", 917948); - _unicodeCharacterMap.Add("VARIATION SELECTOR 206", 917949); - _unicodeCharacterMap.Add("VARIATION SELECTOR 207", 917950); - _unicodeCharacterMap.Add("VARIATION SELECTOR 208", 917951); - _unicodeCharacterMap.Add("VARIATION SELECTOR 209", 917952); - _unicodeCharacterMap.Add("VARIATION SELECTOR 210", 917953); - _unicodeCharacterMap.Add("VARIATION SELECTOR 211", 917954); - _unicodeCharacterMap.Add("VARIATION SELECTOR 212", 917955); - _unicodeCharacterMap.Add("VARIATION SELECTOR 213", 917956); - _unicodeCharacterMap.Add("VARIATION SELECTOR 214", 917957); - _unicodeCharacterMap.Add("VARIATION SELECTOR 215", 917958); - _unicodeCharacterMap.Add("VARIATION SELECTOR 216", 917959); - _unicodeCharacterMap.Add("VARIATION SELECTOR 217", 917960); - _unicodeCharacterMap.Add("VARIATION SELECTOR 218", 917961); - _unicodeCharacterMap.Add("VARIATION SELECTOR 219", 917962); - _unicodeCharacterMap.Add("VARIATION SELECTOR 220", 917963); - _unicodeCharacterMap.Add("VARIATION SELECTOR 221", 917964); - _unicodeCharacterMap.Add("VARIATION SELECTOR 222", 917965); - _unicodeCharacterMap.Add("VARIATION SELECTOR 223", 917966); - _unicodeCharacterMap.Add("VARIATION SELECTOR 224", 917967); - _unicodeCharacterMap.Add("VARIATION SELECTOR 225", 917968); - _unicodeCharacterMap.Add("VARIATION SELECTOR 226", 917969); - _unicodeCharacterMap.Add("VARIATION SELECTOR 227", 917970); - _unicodeCharacterMap.Add("VARIATION SELECTOR 228", 917971); - _unicodeCharacterMap.Add("VARIATION SELECTOR 229", 917972); - _unicodeCharacterMap.Add("VARIATION SELECTOR 230", 917973); - _unicodeCharacterMap.Add("VARIATION SELECTOR 231", 917974); - _unicodeCharacterMap.Add("VARIATION SELECTOR 232", 917975); - _unicodeCharacterMap.Add("VARIATION SELECTOR 233", 917976); - _unicodeCharacterMap.Add("VARIATION SELECTOR 234", 917977); - _unicodeCharacterMap.Add("VARIATION SELECTOR 235", 917978); - _unicodeCharacterMap.Add("VARIATION SELECTOR 236", 917979); - _unicodeCharacterMap.Add("VARIATION SELECTOR 237", 917980); - _unicodeCharacterMap.Add("VARIATION SELECTOR 238", 917981); - _unicodeCharacterMap.Add("VARIATION SELECTOR 239", 917982); - _unicodeCharacterMap.Add("VARIATION SELECTOR 240", 917983); - _unicodeCharacterMap.Add("VARIATION SELECTOR 241", 917984); - _unicodeCharacterMap.Add("VARIATION SELECTOR 242", 917985); - _unicodeCharacterMap.Add("VARIATION SELECTOR 243", 917986); - _unicodeCharacterMap.Add("VARIATION SELECTOR 244", 917987); - _unicodeCharacterMap.Add("VARIATION SELECTOR 245", 917988); - _unicodeCharacterMap.Add("VARIATION SELECTOR 246", 917989); - _unicodeCharacterMap.Add("VARIATION SELECTOR 247", 917990); - _unicodeCharacterMap.Add("VARIATION SELECTOR 248", 917991); - _unicodeCharacterMap.Add("VARIATION SELECTOR 249", 917992); - _unicodeCharacterMap.Add("VARIATION SELECTOR 250", 917993); - _unicodeCharacterMap.Add("VARIATION SELECTOR 251", 917994); - _unicodeCharacterMap.Add("VARIATION SELECTOR 252", 917995); - _unicodeCharacterMap.Add("VARIATION SELECTOR 253", 917996); - _unicodeCharacterMap.Add("VARIATION SELECTOR 254", 917997); - _unicodeCharacterMap.Add("VARIATION SELECTOR 255", 917998); - _unicodeCharacterMap.Add("VARIATION SELECTOR 256", 917999); + _unicodeCharacterMap = new Dictionary(); + var ass = Assembly.GetExecutingAssembly(); + using (var stream = ass.GetManifestResourceStream("Rant.Core.Formatting.unicode_code_points.dat")) + using(var reader = new StreamReader(stream)) + { + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + if (String.IsNullOrWhiteSpace(line)) continue; + var entry = line.Split(','); + _unicodeCharacterMap[entry[0].Trim()] = Convert.ToUInt32(entry[1].Trim()); + } + } } public static string GetByName(string name) { if (name == null) throw new ArgumentNullException(nameof(name)); - uint codePoint; - string result; - if (!_unicodeCharacterMap.TryGetValue(name, out codePoint)) - { - var sb = new StringBuilder(); - bool space = false; - for (int i = 0; i < name.Length; i++) - { - if (Char.IsLetterOrDigit(name[i])) - { - if (space) - { - space = false; - if (sb.Length > 0) sb.Append(' '); - } - sb.Append(Char.ToUpper(name[i])); - continue; - } - - space = true; - } - - if (!_unicodeCharacterMap.TryGetValue(sb.ToString(), out codePoint)) - return String.Empty; - } - - if (_cache.TryGetValue(codePoint, out result)) return result; + if (!_unicodeCharacterMap.TryGetValue(name, out uint codePoint)) + { + var sb = new StringBuilder(); + bool space = false; + foreach (char t in name) + { + if (Char.IsLetterOrDigit(t)) + { + if (space) + { + space = false; + if (sb.Length > 0) sb.Append(' '); + } + sb.Append(Char.ToUpper(t)); + continue; + } + + space = true; + } + + if (!_unicodeCharacterMap.TryGetValue(sb.ToString(), out codePoint)) + return String.Empty; + } + + if (_cache.TryGetValue(codePoint, out string result)) return result; const uint minSurrogateCodePoint = 0x10000; const uint lowSurrogateMask = 0x3ff; diff --git a/Rant/Core/Formatting/unicode_code_points.dat b/Rant/Core/Formatting/unicode_code_points.dat new file mode 100644 index 0000000..8b14051 --- /dev/null +++ b/Rant/Core/Formatting/unicode_code_points.dat @@ -0,0 +1,30570 @@ +NULL, 0 +START OF HEADING, 1 +START OF TEXT, 2 +END OF TEXT, 3 +END OF TRANSMISSION, 4 +ENQUIRY, 5 +ACKNOWLEDGE, 6 +BEL, 7 +BACKSPACE, 8 +CHARACTER TABULATION, 9 +LINE FEED, 10 +LINE TABULATION, 11 +FORM FEED, 12 +CARRIAGE RETURN, 13 +SHIFT OUT, 14 +SHIFT IN, 15 +DATA LINK ESCAPE, 16 +DEVICE CONTROL ONE, 17 +DEVICE CONTROL TWO, 18 +DEVICE CONTROL THREE, 19 +DEVICE CONTROL FOUR, 20 +NEGATIVE ACKNOWLEDGE, 21 +SYNCHRONOUS IDLE, 22 +END OF TRANSMISSION BLOCK, 23 +CANCEL, 24 +END OF MEDIUM, 25 +SUBSTITUTE, 26 +ESCAPE, 27 +INFORMATION SEPARATOR FOUR, 28 +INFORMATION SEPARATOR THREE, 29 +INFORMATION SEPARATOR TWO, 30 +INFORMATION SEPARATOR ONE, 31 +SPACE, 32 +EXCLAMATION MARK, 33 +QUOTATION MARK, 34 +NUMBER SIGN, 35 +DOLLAR SIGN, 36 +PERCENT SIGN, 37 +AMPERSAND, 38 +APOSTROPHE, 39 +LEFT PARENTHESIS, 40 +RIGHT PARENTHESIS, 41 +ASTERISK, 42 +PLUS SIGN, 43 +COMMA, 44 +HYPHEN MINUS, 45 +FULL STOP, 46 +SOLIDUS, 47 +DIGIT ZERO, 48 +DIGIT ONE, 49 +DIGIT TWO, 50 +DIGIT THREE, 51 +DIGIT FOUR, 52 +DIGIT FIVE, 53 +DIGIT SIX, 54 +DIGIT SEVEN, 55 +DIGIT EIGHT, 56 +DIGIT NINE, 57 +COLON, 58 +SEMICOLON, 59 +LESS THAN SIGN, 60 +EQUALS SIGN, 61 +GREATER THAN SIGN, 62 +QUESTION MARK, 63 +COMMERCIAL AT, 64 +LATIN CAPITAL LETTER A, 65 +LATIN CAPITAL LETTER B, 66 +LATIN CAPITAL LETTER C, 67 +LATIN CAPITAL LETTER D, 68 +LATIN CAPITAL LETTER E, 69 +LATIN CAPITAL LETTER F, 70 +LATIN CAPITAL LETTER G, 71 +LATIN CAPITAL LETTER H, 72 +LATIN CAPITAL LETTER I, 73 +LATIN CAPITAL LETTER J, 74 +LATIN CAPITAL LETTER K, 75 +LATIN CAPITAL LETTER L, 76 +LATIN CAPITAL LETTER M, 77 +LATIN CAPITAL LETTER N, 78 +LATIN CAPITAL LETTER O, 79 +LATIN CAPITAL LETTER P, 80 +LATIN CAPITAL LETTER Q, 81 +LATIN CAPITAL LETTER R, 82 +LATIN CAPITAL LETTER S, 83 +LATIN CAPITAL LETTER T, 84 +LATIN CAPITAL LETTER U, 85 +LATIN CAPITAL LETTER V, 86 +LATIN CAPITAL LETTER W, 87 +LATIN CAPITAL LETTER X, 88 +LATIN CAPITAL LETTER Y, 89 +LATIN CAPITAL LETTER Z, 90 +LEFT SQUARE BRACKET, 91 +REVERSE SOLIDUS, 92 +RIGHT SQUARE BRACKET, 93 +CIRCUMFLEX ACCENT, 94 +LOW LINE, 95 +GRAVE ACCENT, 96 +LATIN SMALL LETTER A, 97 +LATIN SMALL LETTER B, 98 +LATIN SMALL LETTER C, 99 +LATIN SMALL LETTER D, 100 +LATIN SMALL LETTER E, 101 +LATIN SMALL LETTER F, 102 +LATIN SMALL LETTER G, 103 +LATIN SMALL LETTER H, 104 +LATIN SMALL LETTER I, 105 +LATIN SMALL LETTER J, 106 +LATIN SMALL LETTER K, 107 +LATIN SMALL LETTER L, 108 +LATIN SMALL LETTER M, 109 +LATIN SMALL LETTER N, 110 +LATIN SMALL LETTER O, 111 +LATIN SMALL LETTER P, 112 +LATIN SMALL LETTER Q, 113 +LATIN SMALL LETTER R, 114 +LATIN SMALL LETTER S, 115 +LATIN SMALL LETTER T, 116 +LATIN SMALL LETTER U, 117 +LATIN SMALL LETTER V, 118 +LATIN SMALL LETTER W, 119 +LATIN SMALL LETTER X, 120 +LATIN SMALL LETTER Y, 121 +LATIN SMALL LETTER Z, 122 +LEFT CURLY BRACKET, 123 +VERTICAL LINE, 124 +RIGHT CURLY BRACKET, 125 +TILDE, 126 +DELETE, 127 +PADDING CHARACTER, 128 +HIGH OCTET PRESET, 129 +BREAK PERMITTED HERE, 130 +NO BREAK HERE, 131 +INDEX, 132 +NEXT LINE, 133 +START OF SELECTED AREA, 134 +END OF SELECTED AREA, 135 +CHARACTER TABULATION SET, 136 +HORIZONTAL TABULATION SET, 136 +CHARACTER TABULATION WITH JUSTIFICATION, 137 +HORIZONTAL TABULATION WITH JUSTIFICATION, 137 +LINE TABULATION SET, 138 +VERTICAL TABULATION SET, 138 +PARTIAL LINE FORWARD, 139 +PARTIAL LINE DOWN, 139 +PARTIAL LINE BACKWARD, 140 +PARTIAL LINE UP, 140 +REVERSE LINE FEED, 141 +REVERSE INDEX, 141 +SINGLE SHIFT TWO, 142 +SINGLE SHIFT THREE, 143 +DEVICE CONTROL STRING, 144 +PRIVATE USE ONE, 145 +PRIVATE USE TWO, 146 +SET TRANSMIT STATE, 147 +CANCEL CHARACTER, 148 +MESSAGE WAITING, 149 +START OF GUARDED AREA, 150 +END OF GUARDED AREA, 151 +START OF STRING, 152 +SINGLE GRAPHIC CHARACTER INTRODUCER, 153 +SINGLE CHARACTER INTRODUCER, 154 +CONTROL SEQUENCE INTRODUCER, 155 +STRING TERMINATOR, 156 +OPERATING SYSTEM COMMAND, 157 +PRIVACY MESSAGE, 158 +APPLICATION PROGRAM COMMAND, 159 +NO BREAK SPACE, 160 +INVERTED EXCLAMATION MARK, 161 +CENT SIGN, 162 +POUND SIGN, 163 +CURRENCY SIGN, 164 +YEN SIGN, 165 +BROKEN BAR, 166 +SECTION SIGN, 167 +DIAERESIS, 168 +COPYRIGHT SIGN, 169 +FEMININE ORDINAL INDICATOR, 170 +LEFT POINTING DOUBLE ANGLE QUOTATION MARK, 171 +NOT SIGN, 172 +SOFT HYPHEN, 173 +REGISTERED SIGN, 174 +MACRON, 175 +DEGREE SIGN, 176 +PLUS MINUS SIGN, 177 +SUPERSCRIPT TWO, 178 +SUPERSCRIPT THREE, 179 +ACUTE ACCENT, 180 +MICRO SIGN, 181 +PILCROW SIGN, 182 +MIDDLE DOT, 183 +CEDILLA, 184 +SUPERSCRIPT ONE, 185 +MASCULINE ORDINAL INDICATOR, 186 +RIGHT POINTING DOUBLE ANGLE QUOTATION MARK, 187 +VULGAR FRACTION ONE QUARTER, 188 +VULGAR FRACTION ONE HALF, 189 +VULGAR FRACTION THREE QUARTERS, 190 +INVERTED QUESTION MARK, 191 +LATIN CAPITAL LETTER A WITH GRAVE, 192 +LATIN CAPITAL LETTER A WITH ACUTE, 193 +LATIN CAPITAL LETTER A WITH CIRCUMFLEX, 194 +LATIN CAPITAL LETTER A WITH TILDE, 195 +LATIN CAPITAL LETTER A WITH DIAERESIS, 196 +LATIN CAPITAL LETTER A WITH RING ABOVE, 197 +LATIN CAPITAL LETTER AE, 198 +LATIN CAPITAL LETTER C WITH CEDILLA, 199 +LATIN CAPITAL LETTER E WITH GRAVE, 200 +LATIN CAPITAL LETTER E WITH ACUTE, 201 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX, 202 +LATIN CAPITAL LETTER E WITH DIAERESIS, 203 +LATIN CAPITAL LETTER I WITH GRAVE, 204 +LATIN CAPITAL LETTER I WITH ACUTE, 205 +LATIN CAPITAL LETTER I WITH CIRCUMFLEX, 206 +LATIN CAPITAL LETTER I WITH DIAERESIS, 207 +LATIN CAPITAL LETTER ETH, 208 +LATIN CAPITAL LETTER N WITH TILDE, 209 +LATIN CAPITAL LETTER O WITH GRAVE, 210 +LATIN CAPITAL LETTER O WITH ACUTE, 211 +LATIN CAPITAL LETTER O WITH CIRCUMFLEX, 212 +LATIN CAPITAL LETTER O WITH TILDE, 213 +LATIN CAPITAL LETTER O WITH DIAERESIS, 214 +MULTIPLICATION SIGN, 215 +LATIN CAPITAL LETTER O WITH STROKE, 216 +LATIN CAPITAL LETTER U WITH GRAVE, 217 +LATIN CAPITAL LETTER U WITH ACUTE, 218 +LATIN CAPITAL LETTER U WITH CIRCUMFLEX, 219 +LATIN CAPITAL LETTER U WITH DIAERESIS, 220 +LATIN CAPITAL LETTER Y WITH ACUTE, 221 +LATIN CAPITAL LETTER THORN, 222 +LATIN SMALL LETTER SHARP S, 223 +LATIN SMALL LETTER A WITH GRAVE, 224 +LATIN SMALL LETTER A WITH ACUTE, 225 +LATIN SMALL LETTER A WITH CIRCUMFLEX, 226 +LATIN SMALL LETTER A WITH TILDE, 227 +LATIN SMALL LETTER A WITH DIAERESIS, 228 +LATIN SMALL LETTER A WITH RING ABOVE, 229 +LATIN SMALL LETTER AE, 230 +LATIN SMALL LETTER C WITH CEDILLA, 231 +LATIN SMALL LETTER E WITH GRAVE, 232 +LATIN SMALL LETTER E WITH ACUTE, 233 +LATIN SMALL LETTER E WITH CIRCUMFLEX, 234 +LATIN SMALL LETTER E WITH DIAERESIS, 235 +LATIN SMALL LETTER I WITH GRAVE, 236 +LATIN SMALL LETTER I WITH ACUTE, 237 +LATIN SMALL LETTER I WITH CIRCUMFLEX, 238 +LATIN SMALL LETTER I WITH DIAERESIS, 239 +LATIN SMALL LETTER ETH, 240 +LATIN SMALL LETTER N WITH TILDE, 241 +LATIN SMALL LETTER O WITH GRAVE, 242 +LATIN SMALL LETTER O WITH ACUTE, 243 +LATIN SMALL LETTER O WITH CIRCUMFLEX, 244 +LATIN SMALL LETTER O WITH TILDE, 245 +LATIN SMALL LETTER O WITH DIAERESIS, 246 +DIVISION SIGN, 247 +LATIN SMALL LETTER O WITH STROKE, 248 +LATIN SMALL LETTER U WITH GRAVE, 249 +LATIN SMALL LETTER U WITH ACUTE, 250 +LATIN SMALL LETTER U WITH CIRCUMFLEX, 251 +LATIN SMALL LETTER U WITH DIAERESIS, 252 +LATIN SMALL LETTER Y WITH ACUTE, 253 +LATIN SMALL LETTER THORN, 254 +LATIN SMALL LETTER Y WITH DIAERESIS, 255 +LATIN CAPITAL LETTER A WITH MACRON, 256 +LATIN SMALL LETTER A WITH MACRON, 257 +LATIN CAPITAL LETTER A WITH BREVE, 258 +LATIN SMALL LETTER A WITH BREVE, 259 +LATIN CAPITAL LETTER A WITH OGONEK, 260 +LATIN SMALL LETTER A WITH OGONEK, 261 +LATIN CAPITAL LETTER C WITH ACUTE, 262 +LATIN SMALL LETTER C WITH ACUTE, 263 +LATIN CAPITAL LETTER C WITH CIRCUMFLEX, 264 +LATIN SMALL LETTER C WITH CIRCUMFLEX, 265 +LATIN CAPITAL LETTER C WITH DOT ABOVE, 266 +LATIN SMALL LETTER C WITH DOT ABOVE, 267 +LATIN CAPITAL LETTER C WITH CARON, 268 +LATIN SMALL LETTER C WITH CARON, 269 +LATIN CAPITAL LETTER D WITH CARON, 270 +LATIN SMALL LETTER D WITH CARON, 271 +LATIN CAPITAL LETTER D WITH STROKE, 272 +LATIN SMALL LETTER D WITH STROKE, 273 +LATIN CAPITAL LETTER E WITH MACRON, 274 +LATIN SMALL LETTER E WITH MACRON, 275 +LATIN CAPITAL LETTER E WITH BREVE, 276 +LATIN SMALL LETTER E WITH BREVE, 277 +LATIN CAPITAL LETTER E WITH DOT ABOVE, 278 +LATIN SMALL LETTER E WITH DOT ABOVE, 279 +LATIN CAPITAL LETTER E WITH OGONEK, 280 +LATIN SMALL LETTER E WITH OGONEK, 281 +LATIN CAPITAL LETTER E WITH CARON, 282 +LATIN SMALL LETTER E WITH CARON, 283 +LATIN CAPITAL LETTER G WITH CIRCUMFLEX, 284 +LATIN SMALL LETTER G WITH CIRCUMFLEX, 285 +LATIN CAPITAL LETTER G WITH BREVE, 286 +LATIN SMALL LETTER G WITH BREVE, 287 +LATIN CAPITAL LETTER G WITH DOT ABOVE, 288 +LATIN SMALL LETTER G WITH DOT ABOVE, 289 +LATIN CAPITAL LETTER G WITH CEDILLA, 290 +LATIN SMALL LETTER G WITH CEDILLA, 291 +LATIN CAPITAL LETTER H WITH CIRCUMFLEX, 292 +LATIN SMALL LETTER H WITH CIRCUMFLEX, 293 +LATIN CAPITAL LETTER H WITH STROKE, 294 +LATIN SMALL LETTER H WITH STROKE, 295 +LATIN CAPITAL LETTER I WITH TILDE, 296 +LATIN SMALL LETTER I WITH TILDE, 297 +LATIN CAPITAL LETTER I WITH MACRON, 298 +LATIN SMALL LETTER I WITH MACRON, 299 +LATIN CAPITAL LETTER I WITH BREVE, 300 +LATIN SMALL LETTER I WITH BREVE, 301 +LATIN CAPITAL LETTER I WITH OGONEK, 302 +LATIN SMALL LETTER I WITH OGONEK, 303 +LATIN CAPITAL LETTER I WITH DOT ABOVE, 304 +LATIN SMALL LETTER DOTLESS I, 305 +LATIN CAPITAL LIGATURE IJ, 306 +LATIN SMALL LIGATURE IJ, 307 +LATIN CAPITAL LETTER J WITH CIRCUMFLEX, 308 +LATIN SMALL LETTER J WITH CIRCUMFLEX, 309 +LATIN CAPITAL LETTER K WITH CEDILLA, 310 +LATIN SMALL LETTER K WITH CEDILLA, 311 +LATIN SMALL LETTER KRA, 312 +LATIN CAPITAL LETTER L WITH ACUTE, 313 +LATIN SMALL LETTER L WITH ACUTE, 314 +LATIN CAPITAL LETTER L WITH CEDILLA, 315 +LATIN SMALL LETTER L WITH CEDILLA, 316 +LATIN CAPITAL LETTER L WITH CARON, 317 +LATIN SMALL LETTER L WITH CARON, 318 +LATIN CAPITAL LETTER L WITH MIDDLE DOT, 319 +LATIN SMALL LETTER L WITH MIDDLE DOT, 320 +LATIN CAPITAL LETTER L WITH STROKE, 321 +LATIN SMALL LETTER L WITH STROKE, 322 +LATIN CAPITAL LETTER N WITH ACUTE, 323 +LATIN SMALL LETTER N WITH ACUTE, 324 +LATIN CAPITAL LETTER N WITH CEDILLA, 325 +LATIN SMALL LETTER N WITH CEDILLA, 326 +LATIN CAPITAL LETTER N WITH CARON, 327 +LATIN SMALL LETTER N WITH CARON, 328 +LATIN SMALL LETTER N PRECEDED BY APOSTROPHE, 329 +LATIN CAPITAL LETTER ENG, 330 +LATIN SMALL LETTER ENG, 331 +LATIN CAPITAL LETTER O WITH MACRON, 332 +LATIN SMALL LETTER O WITH MACRON, 333 +LATIN CAPITAL LETTER O WITH BREVE, 334 +LATIN SMALL LETTER O WITH BREVE, 335 +LATIN CAPITAL LETTER O WITH DOUBLE ACUTE, 336 +LATIN SMALL LETTER O WITH DOUBLE ACUTE, 337 +LATIN CAPITAL LIGATURE OE, 338 +LATIN SMALL LIGATURE OE, 339 +LATIN CAPITAL LETTER R WITH ACUTE, 340 +LATIN SMALL LETTER R WITH ACUTE, 341 +LATIN CAPITAL LETTER R WITH CEDILLA, 342 +LATIN SMALL LETTER R WITH CEDILLA, 343 +LATIN CAPITAL LETTER R WITH CARON, 344 +LATIN SMALL LETTER R WITH CARON, 345 +LATIN CAPITAL LETTER S WITH ACUTE, 346 +LATIN SMALL LETTER S WITH ACUTE, 347 +LATIN CAPITAL LETTER S WITH CIRCUMFLEX, 348 +LATIN SMALL LETTER S WITH CIRCUMFLEX, 349 +LATIN CAPITAL LETTER S WITH CEDILLA, 350 +LATIN SMALL LETTER S WITH CEDILLA, 351 +LATIN CAPITAL LETTER S WITH CARON, 352 +LATIN SMALL LETTER S WITH CARON, 353 +LATIN CAPITAL LETTER T WITH CEDILLA, 354 +LATIN SMALL LETTER T WITH CEDILLA, 355 +LATIN CAPITAL LETTER T WITH CARON, 356 +LATIN SMALL LETTER T WITH CARON, 357 +LATIN CAPITAL LETTER T WITH STROKE, 358 +LATIN SMALL LETTER T WITH STROKE, 359 +LATIN CAPITAL LETTER U WITH TILDE, 360 +LATIN SMALL LETTER U WITH TILDE, 361 +LATIN CAPITAL LETTER U WITH MACRON, 362 +LATIN SMALL LETTER U WITH MACRON, 363 +LATIN CAPITAL LETTER U WITH BREVE, 364 +LATIN SMALL LETTER U WITH BREVE, 365 +LATIN CAPITAL LETTER U WITH RING ABOVE, 366 +LATIN SMALL LETTER U WITH RING ABOVE, 367 +LATIN CAPITAL LETTER U WITH DOUBLE ACUTE, 368 +LATIN SMALL LETTER U WITH DOUBLE ACUTE, 369 +LATIN CAPITAL LETTER U WITH OGONEK, 370 +LATIN SMALL LETTER U WITH OGONEK, 371 +LATIN CAPITAL LETTER W WITH CIRCUMFLEX, 372 +LATIN SMALL LETTER W WITH CIRCUMFLEX, 373 +LATIN CAPITAL LETTER Y WITH CIRCUMFLEX, 374 +LATIN SMALL LETTER Y WITH CIRCUMFLEX, 375 +LATIN CAPITAL LETTER Y WITH DIAERESIS, 376 +LATIN CAPITAL LETTER Z WITH ACUTE, 377 +LATIN SMALL LETTER Z WITH ACUTE, 378 +LATIN CAPITAL LETTER Z WITH DOT ABOVE, 379 +LATIN SMALL LETTER Z WITH DOT ABOVE, 380 +LATIN CAPITAL LETTER Z WITH CARON, 381 +LATIN SMALL LETTER Z WITH CARON, 382 +LATIN SMALL LETTER LONG S, 383 +LATIN SMALL LETTER B WITH STROKE, 384 +LATIN CAPITAL LETTER B WITH HOOK, 385 +LATIN CAPITAL LETTER B WITH TOPBAR, 386 +LATIN SMALL LETTER B WITH TOPBAR, 387 +LATIN CAPITAL LETTER TONE SIX, 388 +LATIN SMALL LETTER TONE SIX, 389 +LATIN CAPITAL LETTER OPEN O, 390 +LATIN CAPITAL LETTER C WITH HOOK, 391 +LATIN SMALL LETTER C WITH HOOK, 392 +LATIN CAPITAL LETTER AFRICAN D, 393 +LATIN CAPITAL LETTER D WITH HOOK, 394 +LATIN CAPITAL LETTER D WITH TOPBAR, 395 +LATIN SMALL LETTER D WITH TOPBAR, 396 +LATIN SMALL LETTER TURNED DELTA, 397 +LATIN CAPITAL LETTER REVERSED E, 398 +LATIN CAPITAL LETTER SCHWA, 399 +LATIN CAPITAL LETTER OPEN E, 400 +LATIN CAPITAL LETTER F WITH HOOK, 401 +LATIN SMALL LETTER F WITH HOOK, 402 +LATIN CAPITAL LETTER G WITH HOOK, 403 +LATIN CAPITAL LETTER GAMMA, 404 +LATIN SMALL LETTER HV, 405 +LATIN CAPITAL LETTER IOTA, 406 +LATIN CAPITAL LETTER I WITH STROKE, 407 +LATIN CAPITAL LETTER K WITH HOOK, 408 +LATIN SMALL LETTER K WITH HOOK, 409 +LATIN SMALL LETTER L WITH BAR, 410 +LATIN SMALL LETTER LAMBDA WITH STROKE, 411 +LATIN CAPITAL LETTER TURNED M, 412 +LATIN CAPITAL LETTER N WITH LEFT HOOK, 413 +LATIN SMALL LETTER N WITH LONG RIGHT LEG, 414 +LATIN CAPITAL LETTER O WITH MIDDLE TILDE, 415 +LATIN CAPITAL LETTER O WITH HORN, 416 +LATIN SMALL LETTER O WITH HORN, 417 +LATIN CAPITAL LETTER OI, 418 +LATIN SMALL LETTER OI, 419 +LATIN CAPITAL LETTER P WITH HOOK, 420 +LATIN SMALL LETTER P WITH HOOK, 421 +LATIN LETTER YR, 422 +LATIN CAPITAL LETTER TONE TWO, 423 +LATIN SMALL LETTER TONE TWO, 424 +LATIN CAPITAL LETTER ESH, 425 +LATIN LETTER REVERSED ESH LOOP, 426 +LATIN SMALL LETTER T WITH PALATAL HOOK, 427 +LATIN CAPITAL LETTER T WITH HOOK, 428 +LATIN SMALL LETTER T WITH HOOK, 429 +LATIN CAPITAL LETTER T WITH RETROFLEX HOOK, 430 +LATIN CAPITAL LETTER U WITH HORN, 431 +LATIN SMALL LETTER U WITH HORN, 432 +LATIN CAPITAL LETTER UPSILON, 433 +LATIN CAPITAL LETTER V WITH HOOK, 434 +LATIN CAPITAL LETTER Y WITH HOOK, 435 +LATIN SMALL LETTER Y WITH HOOK, 436 +LATIN CAPITAL LETTER Z WITH STROKE, 437 +LATIN SMALL LETTER Z WITH STROKE, 438 +LATIN CAPITAL LETTER EZH, 439 +LATIN CAPITAL LETTER EZH REVERSED, 440 +LATIN SMALL LETTER EZH REVERSED, 441 +LATIN SMALL LETTER EZH WITH TAIL, 442 +LATIN LETTER TWO WITH STROKE, 443 +LATIN CAPITAL LETTER TONE FIVE, 444 +LATIN SMALL LETTER TONE FIVE, 445 +LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE, 446 +LATIN LETTER WYNN, 447 +LATIN LETTER DENTAL CLICK, 448 +LATIN LETTER LATERAL CLICK, 449 +LATIN LETTER ALVEOLAR CLICK, 450 +LATIN LETTER RETROFLEX CLICK, 451 +LATIN CAPITAL LETTER DZ WITH CARON, 452 +LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON, 453 +LATIN SMALL LETTER DZ WITH CARON, 454 +LATIN CAPITAL LETTER LJ, 455 +LATIN CAPITAL LETTER L WITH SMALL LETTER J, 456 +LATIN SMALL LETTER LJ, 457 +LATIN CAPITAL LETTER NJ, 458 +LATIN CAPITAL LETTER N WITH SMALL LETTER J, 459 +LATIN SMALL LETTER NJ, 460 +LATIN CAPITAL LETTER A WITH CARON, 461 +LATIN SMALL LETTER A WITH CARON, 462 +LATIN CAPITAL LETTER I WITH CARON, 463 +LATIN SMALL LETTER I WITH CARON, 464 +LATIN CAPITAL LETTER O WITH CARON, 465 +LATIN SMALL LETTER O WITH CARON, 466 +LATIN CAPITAL LETTER U WITH CARON, 467 +LATIN SMALL LETTER U WITH CARON, 468 +LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON, 469 +LATIN SMALL LETTER U WITH DIAERESIS AND MACRON, 470 +LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE, 471 +LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE, 472 +LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON, 473 +LATIN SMALL LETTER U WITH DIAERESIS AND CARON, 474 +LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE, 475 +LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE, 476 +LATIN SMALL LETTER TURNED E, 477 +LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON, 478 +LATIN SMALL LETTER A WITH DIAERESIS AND MACRON, 479 +LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON, 480 +LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON, 481 +LATIN CAPITAL LETTER AE WITH MACRON, 482 +LATIN SMALL LETTER AE WITH MACRON, 483 +LATIN CAPITAL LETTER G WITH STROKE, 484 +LATIN SMALL LETTER G WITH STROKE, 485 +LATIN CAPITAL LETTER G WITH CARON, 486 +LATIN SMALL LETTER G WITH CARON, 487 +LATIN CAPITAL LETTER K WITH CARON, 488 +LATIN SMALL LETTER K WITH CARON, 489 +LATIN CAPITAL LETTER O WITH OGONEK, 490 +LATIN SMALL LETTER O WITH OGONEK, 491 +LATIN CAPITAL LETTER O WITH OGONEK AND MACRON, 492 +LATIN SMALL LETTER O WITH OGONEK AND MACRON, 493 +LATIN CAPITAL LETTER EZH WITH CARON, 494 +LATIN SMALL LETTER EZH WITH CARON, 495 +LATIN SMALL LETTER J WITH CARON, 496 +LATIN CAPITAL LETTER DZ, 497 +LATIN CAPITAL LETTER D WITH SMALL LETTER Z, 498 +LATIN SMALL LETTER DZ, 499 +LATIN CAPITAL LETTER G WITH ACUTE, 500 +LATIN SMALL LETTER G WITH ACUTE, 501 +LATIN CAPITAL LETTER HWAIR, 502 +LATIN CAPITAL LETTER WYNN, 503 +LATIN CAPITAL LETTER N WITH GRAVE, 504 +LATIN SMALL LETTER N WITH GRAVE, 505 +LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE, 506 +LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE, 507 +LATIN CAPITAL LETTER AE WITH ACUTE, 508 +LATIN SMALL LETTER AE WITH ACUTE, 509 +LATIN CAPITAL LETTER O WITH STROKE AND ACUTE, 510 +LATIN SMALL LETTER O WITH STROKE AND ACUTE, 511 +LATIN CAPITAL LETTER A WITH DOUBLE GRAVE, 512 +LATIN SMALL LETTER A WITH DOUBLE GRAVE, 513 +LATIN CAPITAL LETTER A WITH INVERTED BREVE, 514 +LATIN SMALL LETTER A WITH INVERTED BREVE, 515 +LATIN CAPITAL LETTER E WITH DOUBLE GRAVE, 516 +LATIN SMALL LETTER E WITH DOUBLE GRAVE, 517 +LATIN CAPITAL LETTER E WITH INVERTED BREVE, 518 +LATIN SMALL LETTER E WITH INVERTED BREVE, 519 +LATIN CAPITAL LETTER I WITH DOUBLE GRAVE, 520 +LATIN SMALL LETTER I WITH DOUBLE GRAVE, 521 +LATIN CAPITAL LETTER I WITH INVERTED BREVE, 522 +LATIN SMALL LETTER I WITH INVERTED BREVE, 523 +LATIN CAPITAL LETTER O WITH DOUBLE GRAVE, 524 +LATIN SMALL LETTER O WITH DOUBLE GRAVE, 525 +LATIN CAPITAL LETTER O WITH INVERTED BREVE, 526 +LATIN SMALL LETTER O WITH INVERTED BREVE, 527 +LATIN CAPITAL LETTER R WITH DOUBLE GRAVE, 528 +LATIN SMALL LETTER R WITH DOUBLE GRAVE, 529 +LATIN CAPITAL LETTER R WITH INVERTED BREVE, 530 +LATIN SMALL LETTER R WITH INVERTED BREVE, 531 +LATIN CAPITAL LETTER U WITH DOUBLE GRAVE, 532 +LATIN SMALL LETTER U WITH DOUBLE GRAVE, 533 +LATIN CAPITAL LETTER U WITH INVERTED BREVE, 534 +LATIN SMALL LETTER U WITH INVERTED BREVE, 535 +LATIN CAPITAL LETTER S WITH COMMA BELOW, 536 +LATIN SMALL LETTER S WITH COMMA BELOW, 537 +LATIN CAPITAL LETTER T WITH COMMA BELOW, 538 +LATIN SMALL LETTER T WITH COMMA BELOW, 539 +LATIN CAPITAL LETTER YOGH, 540 +LATIN SMALL LETTER YOGH, 541 +LATIN CAPITAL LETTER H WITH CARON, 542 +LATIN SMALL LETTER H WITH CARON, 543 +LATIN CAPITAL LETTER N WITH LONG RIGHT LEG, 544 +LATIN SMALL LETTER D WITH CURL, 545 +LATIN CAPITAL LETTER OU, 546 +LATIN SMALL LETTER OU, 547 +LATIN CAPITAL LETTER Z WITH HOOK, 548 +LATIN SMALL LETTER Z WITH HOOK, 549 +LATIN CAPITAL LETTER A WITH DOT ABOVE, 550 +LATIN SMALL LETTER A WITH DOT ABOVE, 551 +LATIN CAPITAL LETTER E WITH CEDILLA, 552 +LATIN SMALL LETTER E WITH CEDILLA, 553 +LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON, 554 +LATIN SMALL LETTER O WITH DIAERESIS AND MACRON, 555 +LATIN CAPITAL LETTER O WITH TILDE AND MACRON, 556 +LATIN SMALL LETTER O WITH TILDE AND MACRON, 557 +LATIN CAPITAL LETTER O WITH DOT ABOVE, 558 +LATIN SMALL LETTER O WITH DOT ABOVE, 559 +LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON, 560 +LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON, 561 +LATIN CAPITAL LETTER Y WITH MACRON, 562 +LATIN SMALL LETTER Y WITH MACRON, 563 +LATIN SMALL LETTER L WITH CURL, 564 +LATIN SMALL LETTER N WITH CURL, 565 +LATIN SMALL LETTER T WITH CURL, 566 +LATIN SMALL LETTER DOTLESS J, 567 +LATIN SMALL LETTER DB DIGRAPH, 568 +LATIN SMALL LETTER QP DIGRAPH, 569 +LATIN CAPITAL LETTER A WITH STROKE, 570 +LATIN CAPITAL LETTER C WITH STROKE, 571 +LATIN SMALL LETTER C WITH STROKE, 572 +LATIN CAPITAL LETTER L WITH BAR, 573 +LATIN CAPITAL LETTER T WITH DIAGONAL STROKE, 574 +LATIN SMALL LETTER S WITH SWASH TAIL, 575 +LATIN SMALL LETTER Z WITH SWASH TAIL, 576 +LATIN CAPITAL LETTER GLOTTAL STOP, 577 +LATIN SMALL LETTER GLOTTAL STOP, 578 +LATIN CAPITAL LETTER B WITH STROKE, 579 +LATIN CAPITAL LETTER U BAR, 580 +LATIN CAPITAL LETTER TURNED V, 581 +LATIN CAPITAL LETTER E WITH STROKE, 582 +LATIN SMALL LETTER E WITH STROKE, 583 +LATIN CAPITAL LETTER J WITH STROKE, 584 +LATIN SMALL LETTER J WITH STROKE, 585 +LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL, 586 +LATIN SMALL LETTER Q WITH HOOK TAIL, 587 +LATIN CAPITAL LETTER R WITH STROKE, 588 +LATIN SMALL LETTER R WITH STROKE, 589 +LATIN CAPITAL LETTER Y WITH STROKE, 590 +LATIN SMALL LETTER Y WITH STROKE, 591 +LATIN SMALL LETTER TURNED A, 592 +LATIN SMALL LETTER ALPHA, 593 +LATIN SMALL LETTER TURNED ALPHA, 594 +LATIN SMALL LETTER B WITH HOOK, 595 +LATIN SMALL LETTER OPEN O, 596 +LATIN SMALL LETTER C WITH CURL, 597 +LATIN SMALL LETTER D WITH TAIL, 598 +LATIN SMALL LETTER D WITH HOOK, 599 +LATIN SMALL LETTER REVERSED E, 600 +LATIN SMALL LETTER SCHWA, 601 +LATIN SMALL LETTER SCHWA WITH HOOK, 602 +LATIN SMALL LETTER OPEN E, 603 +LATIN SMALL LETTER REVERSED OPEN E, 604 +LATIN SMALL LETTER REVERSED OPEN E WITH HOOK, 605 +LATIN SMALL LETTER CLOSED REVERSED OPEN E, 606 +LATIN SMALL LETTER DOTLESS J WITH STROKE, 607 +LATIN SMALL LETTER G WITH HOOK, 608 +LATIN SMALL LETTER SCRIPT G, 609 +LATIN LETTER SMALL CAPITAL G, 610 +LATIN SMALL LETTER GAMMA, 611 +LATIN SMALL LETTER RAMS HORN, 612 +LATIN SMALL LETTER TURNED H, 613 +LATIN SMALL LETTER H WITH HOOK, 614 +LATIN SMALL LETTER HENG WITH HOOK, 615 +LATIN SMALL LETTER I WITH STROKE, 616 +LATIN SMALL LETTER IOTA, 617 +LATIN LETTER SMALL CAPITAL I, 618 +LATIN SMALL LETTER L WITH MIDDLE TILDE, 619 +LATIN SMALL LETTER L WITH BELT, 620 +LATIN SMALL LETTER L WITH RETROFLEX HOOK, 621 +LATIN SMALL LETTER LEZH, 622 +LATIN SMALL LETTER TURNED M, 623 +LATIN SMALL LETTER TURNED M WITH LONG LEG, 624 +LATIN SMALL LETTER M WITH HOOK, 625 +LATIN SMALL LETTER N WITH LEFT HOOK, 626 +LATIN SMALL LETTER N WITH RETROFLEX HOOK, 627 +LATIN LETTER SMALL CAPITAL N, 628 +LATIN SMALL LETTER BARRED O, 629 +LATIN LETTER SMALL CAPITAL OE, 630 +LATIN SMALL LETTER CLOSED OMEGA, 631 +LATIN SMALL LETTER PHI, 632 +LATIN SMALL LETTER TURNED R, 633 +LATIN SMALL LETTER TURNED R WITH LONG LEG, 634 +LATIN SMALL LETTER TURNED R WITH HOOK, 635 +LATIN SMALL LETTER R WITH LONG LEG, 636 +LATIN SMALL LETTER R WITH TAIL, 637 +LATIN SMALL LETTER R WITH FISHHOOK, 638 +LATIN SMALL LETTER REVERSED R WITH FISHHOOK, 639 +LATIN LETTER SMALL CAPITAL R, 640 +LATIN LETTER SMALL CAPITAL INVERTED R, 641 +LATIN SMALL LETTER S WITH HOOK, 642 +LATIN SMALL LETTER ESH, 643 +LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK, 644 +LATIN SMALL LETTER SQUAT REVERSED ESH, 645 +LATIN SMALL LETTER ESH WITH CURL, 646 +LATIN SMALL LETTER TURNED T, 647 +LATIN SMALL LETTER T WITH RETROFLEX HOOK, 648 +LATIN SMALL LETTER U BAR, 649 +LATIN SMALL LETTER UPSILON, 650 +LATIN SMALL LETTER V WITH HOOK, 651 +LATIN SMALL LETTER TURNED V, 652 +LATIN SMALL LETTER TURNED W, 653 +LATIN SMALL LETTER TURNED Y, 654 +LATIN LETTER SMALL CAPITAL Y, 655 +LATIN SMALL LETTER Z WITH RETROFLEX HOOK, 656 +LATIN SMALL LETTER Z WITH CURL, 657 +LATIN SMALL LETTER EZH, 658 +LATIN SMALL LETTER EZH WITH CURL, 659 +LATIN LETTER GLOTTAL STOP, 660 +LATIN LETTER PHARYNGEAL VOICED FRICATIVE, 661 +LATIN LETTER INVERTED GLOTTAL STOP, 662 +LATIN LETTER STRETCHED C, 663 +LATIN LETTER BILABIAL CLICK, 664 +LATIN LETTER SMALL CAPITAL B, 665 +LATIN SMALL LETTER CLOSED OPEN E, 666 +LATIN LETTER SMALL CAPITAL G WITH HOOK, 667 +LATIN LETTER SMALL CAPITAL H, 668 +LATIN SMALL LETTER J WITH CROSSED TAIL, 669 +LATIN SMALL LETTER TURNED K, 670 +LATIN LETTER SMALL CAPITAL L, 671 +LATIN SMALL LETTER Q WITH HOOK, 672 +LATIN LETTER GLOTTAL STOP WITH STROKE, 673 +LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE, 674 +LATIN SMALL LETTER DZ DIGRAPH, 675 +LATIN SMALL LETTER DEZH DIGRAPH, 676 +LATIN SMALL LETTER DZ DIGRAPH WITH CURL, 677 +LATIN SMALL LETTER TS DIGRAPH, 678 +LATIN SMALL LETTER TESH DIGRAPH, 679 +LATIN SMALL LETTER TC DIGRAPH WITH CURL, 680 +LATIN SMALL LETTER FENG DIGRAPH, 681 +LATIN SMALL LETTER LS DIGRAPH, 682 +LATIN SMALL LETTER LZ DIGRAPH, 683 +LATIN LETTER BILABIAL PERCUSSIVE, 684 +LATIN LETTER BIDENTAL PERCUSSIVE, 685 +LATIN SMALL LETTER TURNED H WITH FISHHOOK, 686 +LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL, 687 +MODIFIER LETTER SMALL H, 688 +MODIFIER LETTER SMALL H WITH HOOK, 689 +MODIFIER LETTER SMALL J, 690 +MODIFIER LETTER SMALL R, 691 +MODIFIER LETTER SMALL TURNED R, 692 +MODIFIER LETTER SMALL TURNED R WITH HOOK, 693 +MODIFIER LETTER SMALL CAPITAL INVERTED R, 694 +MODIFIER LETTER SMALL W, 695 +MODIFIER LETTER SMALL Y, 696 +MODIFIER LETTER PRIME, 697 +MODIFIER LETTER DOUBLE PRIME, 698 +MODIFIER LETTER TURNED COMMA, 699 +MODIFIER LETTER APOSTROPHE, 700 +MODIFIER LETTER REVERSED COMMA, 701 +MODIFIER LETTER RIGHT HALF RING, 702 +MODIFIER LETTER LEFT HALF RING, 703 +MODIFIER LETTER GLOTTAL STOP, 704 +MODIFIER LETTER REVERSED GLOTTAL STOP, 705 +MODIFIER LETTER LEFT ARROWHEAD, 706 +MODIFIER LETTER RIGHT ARROWHEAD, 707 +MODIFIER LETTER UP ARROWHEAD, 708 +MODIFIER LETTER DOWN ARROWHEAD, 709 +MODIFIER LETTER CIRCUMFLEX ACCENT, 710 +CARON, 711 +MODIFIER LETTER VERTICAL LINE, 712 +MODIFIER LETTER MACRON, 713 +MODIFIER LETTER ACUTE ACCENT, 714 +MODIFIER LETTER GRAVE ACCENT, 715 +MODIFIER LETTER LOW VERTICAL LINE, 716 +MODIFIER LETTER LOW MACRON, 717 +MODIFIER LETTER LOW GRAVE ACCENT, 718 +MODIFIER LETTER LOW ACUTE ACCENT, 719 +MODIFIER LETTER TRIANGULAR COLON, 720 +MODIFIER LETTER HALF TRIANGULAR COLON, 721 +MODIFIER LETTER CENTRED RIGHT HALF RING, 722 +MODIFIER LETTER CENTRED LEFT HALF RING, 723 +MODIFIER LETTER UP TACK, 724 +MODIFIER LETTER DOWN TACK, 725 +MODIFIER LETTER PLUS SIGN, 726 +MODIFIER LETTER MINUS SIGN, 727 +BREVE, 728 +DOT ABOVE, 729 +RING ABOVE, 730 +OGONEK, 731 +SMALL TILDE, 732 +DOUBLE ACUTE ACCENT, 733 +MODIFIER LETTER RHOTIC HOOK, 734 +MODIFIER LETTER CROSS ACCENT, 735 +MODIFIER LETTER SMALL GAMMA, 736 +MODIFIER LETTER SMALL L, 737 +MODIFIER LETTER SMALL S, 738 +MODIFIER LETTER SMALL X, 739 +MODIFIER LETTER SMALL REVERSED GLOTTAL STOP, 740 +MODIFIER LETTER EXTRA HIGH TONE BAR, 741 +MODIFIER LETTER HIGH TONE BAR, 742 +MODIFIER LETTER MID TONE BAR, 743 +MODIFIER LETTER LOW TONE BAR, 744 +MODIFIER LETTER EXTRA LOW TONE BAR, 745 +MODIFIER LETTER YIN DEPARTING TONE MARK, 746 +MODIFIER LETTER YANG DEPARTING TONE MARK, 747 +MODIFIER LETTER VOICING, 748 +MODIFIER LETTER UNASPIRATED, 749 +MODIFIER LETTER DOUBLE APOSTROPHE, 750 +MODIFIER LETTER LOW DOWN ARROWHEAD, 751 +MODIFIER LETTER LOW UP ARROWHEAD, 752 +MODIFIER LETTER LOW LEFT ARROWHEAD, 753 +MODIFIER LETTER LOW RIGHT ARROWHEAD, 754 +MODIFIER LETTER LOW RING, 755 +MODIFIER LETTER MIDDLE GRAVE ACCENT, 756 +MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT, 757 +MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT, 758 +MODIFIER LETTER LOW TILDE, 759 +MODIFIER LETTER RAISED COLON, 760 +MODIFIER LETTER BEGIN HIGH TONE, 761 +MODIFIER LETTER END HIGH TONE, 762 +MODIFIER LETTER BEGIN LOW TONE, 763 +MODIFIER LETTER END LOW TONE, 764 +MODIFIER LETTER SHELF, 765 +MODIFIER LETTER OPEN SHELF, 766 +MODIFIER LETTER LOW LEFT ARROW, 767 +COMBINING GRAVE ACCENT, 768 +COMBINING ACUTE ACCENT, 769 +COMBINING CIRCUMFLEX ACCENT, 770 +COMBINING TILDE, 771 +COMBINING MACRON, 772 +COMBINING OVERLINE, 773 +COMBINING BREVE, 774 +COMBINING DOT ABOVE, 775 +COMBINING DIAERESIS, 776 +COMBINING HOOK ABOVE, 777 +COMBINING RING ABOVE, 778 +COMBINING DOUBLE ACUTE ACCENT, 779 +COMBINING CARON, 780 +COMBINING VERTICAL LINE ABOVE, 781 +COMBINING DOUBLE VERTICAL LINE ABOVE, 782 +COMBINING DOUBLE GRAVE ACCENT, 783 +COMBINING CANDRABINDU, 784 +COMBINING INVERTED BREVE, 785 +COMBINING TURNED COMMA ABOVE, 786 +COMBINING COMMA ABOVE, 787 +COMBINING REVERSED COMMA ABOVE, 788 +COMBINING COMMA ABOVE RIGHT, 789 +COMBINING GRAVE ACCENT BELOW, 790 +COMBINING ACUTE ACCENT BELOW, 791 +COMBINING LEFT TACK BELOW, 792 +COMBINING RIGHT TACK BELOW, 793 +COMBINING LEFT ANGLE ABOVE, 794 +COMBINING HORN, 795 +COMBINING LEFT HALF RING BELOW, 796 +COMBINING UP TACK BELOW, 797 +COMBINING DOWN TACK BELOW, 798 +COMBINING PLUS SIGN BELOW, 799 +COMBINING MINUS SIGN BELOW, 800 +COMBINING PALATALIZED HOOK BELOW, 801 +COMBINING RETROFLEX HOOK BELOW, 802 +COMBINING DOT BELOW, 803 +COMBINING DIAERESIS BELOW, 804 +COMBINING RING BELOW, 805 +COMBINING COMMA BELOW, 806 +COMBINING CEDILLA, 807 +COMBINING OGONEK, 808 +COMBINING VERTICAL LINE BELOW, 809 +COMBINING BRIDGE BELOW, 810 +COMBINING INVERTED DOUBLE ARCH BELOW, 811 +COMBINING CARON BELOW, 812 +COMBINING CIRCUMFLEX ACCENT BELOW, 813 +COMBINING BREVE BELOW, 814 +COMBINING INVERTED BREVE BELOW, 815 +COMBINING TILDE BELOW, 816 +COMBINING MACRON BELOW, 817 +COMBINING LOW LINE, 818 +COMBINING DOUBLE LOW LINE, 819 +COMBINING TILDE OVERLAY, 820 +COMBINING SHORT STROKE OVERLAY, 821 +COMBINING LONG STROKE OVERLAY, 822 +COMBINING SHORT SOLIDUS OVERLAY, 823 +COMBINING LONG SOLIDUS OVERLAY, 824 +COMBINING RIGHT HALF RING BELOW, 825 +COMBINING INVERTED BRIDGE BELOW, 826 +COMBINING SQUARE BELOW, 827 +COMBINING SEAGULL BELOW, 828 +COMBINING X ABOVE, 829 +COMBINING VERTICAL TILDE, 830 +COMBINING DOUBLE OVERLINE, 831 +COMBINING GRAVE TONE MARK, 832 +COMBINING ACUTE TONE MARK, 833 +COMBINING GREEK PERISPOMENI, 834 +COMBINING GREEK KORONIS, 835 +COMBINING GREEK DIALYTIKA TONOS, 836 +COMBINING GREEK YPOGEGRAMMENI, 837 +COMBINING BRIDGE ABOVE, 838 +COMBINING EQUALS SIGN BELOW, 839 +COMBINING DOUBLE VERTICAL LINE BELOW, 840 +COMBINING LEFT ANGLE BELOW, 841 +COMBINING NOT TILDE ABOVE, 842 +COMBINING HOMOTHETIC ABOVE, 843 +COMBINING ALMOST EQUAL TO ABOVE, 844 +COMBINING LEFT RIGHT ARROW BELOW, 845 +COMBINING UPWARDS ARROW BELOW, 846 +COMBINING GRAPHEME JOINER, 847 +COMBINING RIGHT ARROWHEAD ABOVE, 848 +COMBINING LEFT HALF RING ABOVE, 849 +COMBINING FERMATA, 850 +COMBINING X BELOW, 851 +COMBINING LEFT ARROWHEAD BELOW, 852 +COMBINING RIGHT ARROWHEAD BELOW, 853 +COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW, 854 +COMBINING RIGHT HALF RING ABOVE, 855 +COMBINING DOT ABOVE RIGHT, 856 +COMBINING ASTERISK BELOW, 857 +COMBINING DOUBLE RING BELOW, 858 +COMBINING ZIGZAG ABOVE, 859 +COMBINING DOUBLE BREVE BELOW, 860 +COMBINING DOUBLE BREVE, 861 +COMBINING DOUBLE MACRON, 862 +COMBINING DOUBLE MACRON BELOW, 863 +COMBINING DOUBLE TILDE, 864 +COMBINING DOUBLE INVERTED BREVE, 865 +COMBINING DOUBLE RIGHTWARDS ARROW BELOW, 866 +COMBINING LATIN SMALL LETTER A, 867 +COMBINING LATIN SMALL LETTER E, 868 +COMBINING LATIN SMALL LETTER I, 869 +COMBINING LATIN SMALL LETTER O, 870 +COMBINING LATIN SMALL LETTER U, 871 +COMBINING LATIN SMALL LETTER C, 872 +COMBINING LATIN SMALL LETTER D, 873 +COMBINING LATIN SMALL LETTER H, 874 +COMBINING LATIN SMALL LETTER M, 875 +COMBINING LATIN SMALL LETTER R, 876 +COMBINING LATIN SMALL LETTER T, 877 +COMBINING LATIN SMALL LETTER V, 878 +COMBINING LATIN SMALL LETTER X, 879 +GREEK CAPITAL LETTER HETA, 880 +GREEK SMALL LETTER HETA, 881 +GREEK CAPITAL LETTER ARCHAIC SAMPI, 882 +GREEK SMALL LETTER ARCHAIC SAMPI, 883 +GREEK NUMERAL SIGN, 884 +GREEK LOWER NUMERAL SIGN, 885 +GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA, 886 +GREEK SMALL LETTER PAMPHYLIAN DIGAMMA, 887 +GREEK YPOGEGRAMMENI, 890 +GREEK SMALL REVERSED LUNATE SIGMA SYMBOL, 891 +GREEK SMALL DOTTED LUNATE SIGMA SYMBOL, 892 +GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL, 893 +GREEK QUESTION MARK, 894 +GREEK CAPITAL LETTER YOT, 895 +GREEK TONOS, 900 +GREEK DIALYTIKA TONOS, 901 +GREEK CAPITAL LETTER ALPHA WITH TONOS, 902 +GREEK ANO TELEIA, 903 +GREEK CAPITAL LETTER EPSILON WITH TONOS, 904 +GREEK CAPITAL LETTER ETA WITH TONOS, 905 +GREEK CAPITAL LETTER IOTA WITH TONOS, 906 +GREEK CAPITAL LETTER OMICRON WITH TONOS, 908 +GREEK CAPITAL LETTER UPSILON WITH TONOS, 910 +GREEK CAPITAL LETTER OMEGA WITH TONOS, 911 +GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS, 912 +GREEK CAPITAL LETTER ALPHA, 913 +GREEK CAPITAL LETTER BETA, 914 +GREEK CAPITAL LETTER GAMMA, 915 +GREEK CAPITAL LETTER DELTA, 916 +GREEK CAPITAL LETTER EPSILON, 917 +GREEK CAPITAL LETTER ZETA, 918 +GREEK CAPITAL LETTER ETA, 919 +GREEK CAPITAL LETTER THETA, 920 +GREEK CAPITAL LETTER IOTA, 921 +GREEK CAPITAL LETTER KAPPA, 922 +GREEK CAPITAL LETTER LAMDA, 923 +GREEK CAPITAL LETTER MU, 924 +GREEK CAPITAL LETTER NU, 925 +GREEK CAPITAL LETTER XI, 926 +GREEK CAPITAL LETTER OMICRON, 927 +GREEK CAPITAL LETTER PI, 928 +GREEK CAPITAL LETTER RHO, 929 +GREEK CAPITAL LETTER SIGMA, 931 +GREEK CAPITAL LETTER TAU, 932 +GREEK CAPITAL LETTER UPSILON, 933 +GREEK CAPITAL LETTER PHI, 934 +GREEK CAPITAL LETTER CHI, 935 +GREEK CAPITAL LETTER PSI, 936 +GREEK CAPITAL LETTER OMEGA, 937 +GREEK CAPITAL LETTER IOTA WITH DIALYTIKA, 938 +GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA, 939 +GREEK SMALL LETTER ALPHA WITH TONOS, 940 +GREEK SMALL LETTER EPSILON WITH TONOS, 941 +GREEK SMALL LETTER ETA WITH TONOS, 942 +GREEK SMALL LETTER IOTA WITH TONOS, 943 +GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS, 944 +GREEK SMALL LETTER ALPHA, 945 +GREEK SMALL LETTER BETA, 946 +GREEK SMALL LETTER GAMMA, 947 +GREEK SMALL LETTER DELTA, 948 +GREEK SMALL LETTER EPSILON, 949 +GREEK SMALL LETTER ZETA, 950 +GREEK SMALL LETTER ETA, 951 +GREEK SMALL LETTER THETA, 952 +GREEK SMALL LETTER IOTA, 953 +GREEK SMALL LETTER KAPPA, 954 +GREEK SMALL LETTER LAMDA, 955 +GREEK SMALL LETTER MU, 956 +GREEK SMALL LETTER NU, 957 +GREEK SMALL LETTER XI, 958 +GREEK SMALL LETTER OMICRON, 959 +GREEK SMALL LETTER PI, 960 +GREEK SMALL LETTER RHO, 961 +GREEK SMALL LETTER FINAL SIGMA, 962 +GREEK SMALL LETTER SIGMA, 963 +GREEK SMALL LETTER TAU, 964 +GREEK SMALL LETTER UPSILON, 965 +GREEK SMALL LETTER PHI, 966 +GREEK SMALL LETTER CHI, 967 +GREEK SMALL LETTER PSI, 968 +GREEK SMALL LETTER OMEGA, 969 +GREEK SMALL LETTER IOTA WITH DIALYTIKA, 970 +GREEK SMALL LETTER UPSILON WITH DIALYTIKA, 971 +GREEK SMALL LETTER OMICRON WITH TONOS, 972 +GREEK SMALL LETTER UPSILON WITH TONOS, 973 +GREEK SMALL LETTER OMEGA WITH TONOS, 974 +GREEK CAPITAL KAI SYMBOL, 975 +GREEK BETA SYMBOL, 976 +GREEK THETA SYMBOL, 977 +GREEK UPSILON WITH HOOK SYMBOL, 978 +GREEK UPSILON WITH ACUTE AND HOOK SYMBOL, 979 +GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL, 980 +GREEK PHI SYMBOL, 981 +GREEK PI SYMBOL, 982 +GREEK KAI SYMBOL, 983 +GREEK LETTER ARCHAIC KOPPA, 984 +GREEK SMALL LETTER ARCHAIC KOPPA, 985 +GREEK LETTER STIGMA, 986 +GREEK SMALL LETTER STIGMA, 987 +GREEK LETTER DIGAMMA, 988 +GREEK SMALL LETTER DIGAMMA, 989 +GREEK LETTER KOPPA, 990 +GREEK SMALL LETTER KOPPA, 991 +GREEK LETTER SAMPI, 992 +GREEK SMALL LETTER SAMPI, 993 +COPTIC CAPITAL LETTER SHEI, 994 +COPTIC SMALL LETTER SHEI, 995 +COPTIC CAPITAL LETTER FEI, 996 +COPTIC SMALL LETTER FEI, 997 +COPTIC CAPITAL LETTER KHEI, 998 +COPTIC SMALL LETTER KHEI, 999 +COPTIC CAPITAL LETTER HORI, 1000 +COPTIC SMALL LETTER HORI, 1001 +COPTIC CAPITAL LETTER GANGIA, 1002 +COPTIC SMALL LETTER GANGIA, 1003 +COPTIC CAPITAL LETTER SHIMA, 1004 +COPTIC SMALL LETTER SHIMA, 1005 +COPTIC CAPITAL LETTER DEI, 1006 +COPTIC SMALL LETTER DEI, 1007 +GREEK KAPPA SYMBOL, 1008 +GREEK RHO SYMBOL, 1009 +GREEK LUNATE SIGMA SYMBOL, 1010 +GREEK LETTER YOT, 1011 +GREEK CAPITAL THETA SYMBOL, 1012 +GREEK LUNATE EPSILON SYMBOL, 1013 +GREEK REVERSED LUNATE EPSILON SYMBOL, 1014 +GREEK CAPITAL LETTER SHO, 1015 +GREEK SMALL LETTER SHO, 1016 +GREEK CAPITAL LUNATE SIGMA SYMBOL, 1017 +GREEK CAPITAL LETTER SAN, 1018 +GREEK SMALL LETTER SAN, 1019 +GREEK RHO WITH STROKE SYMBOL, 1020 +GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL, 1021 +GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL, 1022 +GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL, 1023 +CYRILLIC CAPITAL LETTER IE WITH GRAVE, 1024 +CYRILLIC CAPITAL LETTER IO, 1025 +CYRILLIC CAPITAL LETTER DJE, 1026 +CYRILLIC CAPITAL LETTER GJE, 1027 +CYRILLIC CAPITAL LETTER UKRAINIAN IE, 1028 +CYRILLIC CAPITAL LETTER DZE, 1029 +CYRILLIC CAPITAL LETTER BYELORUSSIAN UKRAINIAN I, 1030 +CYRILLIC CAPITAL LETTER YI, 1031 +CYRILLIC CAPITAL LETTER JE, 1032 +CYRILLIC CAPITAL LETTER LJE, 1033 +CYRILLIC CAPITAL LETTER NJE, 1034 +CYRILLIC CAPITAL LETTER TSHE, 1035 +CYRILLIC CAPITAL LETTER KJE, 1036 +CYRILLIC CAPITAL LETTER I WITH GRAVE, 1037 +CYRILLIC CAPITAL LETTER SHORT U, 1038 +CYRILLIC CAPITAL LETTER DZHE, 1039 +CYRILLIC CAPITAL LETTER A, 1040 +CYRILLIC CAPITAL LETTER BE, 1041 +CYRILLIC CAPITAL LETTER VE, 1042 +CYRILLIC CAPITAL LETTER GHE, 1043 +CYRILLIC CAPITAL LETTER DE, 1044 +CYRILLIC CAPITAL LETTER IE, 1045 +CYRILLIC CAPITAL LETTER ZHE, 1046 +CYRILLIC CAPITAL LETTER ZE, 1047 +CYRILLIC CAPITAL LETTER I, 1048 +CYRILLIC CAPITAL LETTER SHORT I, 1049 +CYRILLIC CAPITAL LETTER KA, 1050 +CYRILLIC CAPITAL LETTER EL, 1051 +CYRILLIC CAPITAL LETTER EM, 1052 +CYRILLIC CAPITAL LETTER EN, 1053 +CYRILLIC CAPITAL LETTER O, 1054 +CYRILLIC CAPITAL LETTER PE, 1055 +CYRILLIC CAPITAL LETTER ER, 1056 +CYRILLIC CAPITAL LETTER ES, 1057 +CYRILLIC CAPITAL LETTER TE, 1058 +CYRILLIC CAPITAL LETTER U, 1059 +CYRILLIC CAPITAL LETTER EF, 1060 +CYRILLIC CAPITAL LETTER HA, 1061 +CYRILLIC CAPITAL LETTER TSE, 1062 +CYRILLIC CAPITAL LETTER CHE, 1063 +CYRILLIC CAPITAL LETTER SHA, 1064 +CYRILLIC CAPITAL LETTER SHCHA, 1065 +CYRILLIC CAPITAL LETTER HARD SIGN, 1066 +CYRILLIC CAPITAL LETTER YERU, 1067 +CYRILLIC CAPITAL LETTER SOFT SIGN, 1068 +CYRILLIC CAPITAL LETTER E, 1069 +CYRILLIC CAPITAL LETTER YU, 1070 +CYRILLIC CAPITAL LETTER YA, 1071 +CYRILLIC SMALL LETTER A, 1072 +CYRILLIC SMALL LETTER BE, 1073 +CYRILLIC SMALL LETTER VE, 1074 +CYRILLIC SMALL LETTER GHE, 1075 +CYRILLIC SMALL LETTER DE, 1076 +CYRILLIC SMALL LETTER IE, 1077 +CYRILLIC SMALL LETTER ZHE, 1078 +CYRILLIC SMALL LETTER ZE, 1079 +CYRILLIC SMALL LETTER I, 1080 +CYRILLIC SMALL LETTER SHORT I, 1081 +CYRILLIC SMALL LETTER KA, 1082 +CYRILLIC SMALL LETTER EL, 1083 +CYRILLIC SMALL LETTER EM, 1084 +CYRILLIC SMALL LETTER EN, 1085 +CYRILLIC SMALL LETTER O, 1086 +CYRILLIC SMALL LETTER PE, 1087 +CYRILLIC SMALL LETTER ER, 1088 +CYRILLIC SMALL LETTER ES, 1089 +CYRILLIC SMALL LETTER TE, 1090 +CYRILLIC SMALL LETTER U, 1091 +CYRILLIC SMALL LETTER EF, 1092 +CYRILLIC SMALL LETTER HA, 1093 +CYRILLIC SMALL LETTER TSE, 1094 +CYRILLIC SMALL LETTER CHE, 1095 +CYRILLIC SMALL LETTER SHA, 1096 +CYRILLIC SMALL LETTER SHCHA, 1097 +CYRILLIC SMALL LETTER HARD SIGN, 1098 +CYRILLIC SMALL LETTER YERU, 1099 +CYRILLIC SMALL LETTER SOFT SIGN, 1100 +CYRILLIC SMALL LETTER E, 1101 +CYRILLIC SMALL LETTER YU, 1102 +CYRILLIC SMALL LETTER YA, 1103 +CYRILLIC SMALL LETTER IE WITH GRAVE, 1104 +CYRILLIC SMALL LETTER IO, 1105 +CYRILLIC SMALL LETTER DJE, 1106 +CYRILLIC SMALL LETTER GJE, 1107 +CYRILLIC SMALL LETTER UKRAINIAN IE, 1108 +CYRILLIC SMALL LETTER DZE, 1109 +CYRILLIC SMALL LETTER BYELORUSSIAN UKRAINIAN I, 1110 +CYRILLIC SMALL LETTER YI, 1111 +CYRILLIC SMALL LETTER JE, 1112 +CYRILLIC SMALL LETTER LJE, 1113 +CYRILLIC SMALL LETTER NJE, 1114 +CYRILLIC SMALL LETTER TSHE, 1115 +CYRILLIC SMALL LETTER KJE, 1116 +CYRILLIC SMALL LETTER I WITH GRAVE, 1117 +CYRILLIC SMALL LETTER SHORT U, 1118 +CYRILLIC SMALL LETTER DZHE, 1119 +CYRILLIC CAPITAL LETTER OMEGA, 1120 +CYRILLIC SMALL LETTER OMEGA, 1121 +CYRILLIC CAPITAL LETTER YAT, 1122 +CYRILLIC SMALL LETTER YAT, 1123 +CYRILLIC CAPITAL LETTER IOTIFIED E, 1124 +CYRILLIC SMALL LETTER IOTIFIED E, 1125 +CYRILLIC CAPITAL LETTER LITTLE YUS, 1126 +CYRILLIC SMALL LETTER LITTLE YUS, 1127 +CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS, 1128 +CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS, 1129 +CYRILLIC CAPITAL LETTER BIG YUS, 1130 +CYRILLIC SMALL LETTER BIG YUS, 1131 +CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS, 1132 +CYRILLIC SMALL LETTER IOTIFIED BIG YUS, 1133 +CYRILLIC CAPITAL LETTER KSI, 1134 +CYRILLIC SMALL LETTER KSI, 1135 +CYRILLIC CAPITAL LETTER PSI, 1136 +CYRILLIC SMALL LETTER PSI, 1137 +CYRILLIC CAPITAL LETTER FITA, 1138 +CYRILLIC SMALL LETTER FITA, 1139 +CYRILLIC CAPITAL LETTER IZHITSA, 1140 +CYRILLIC SMALL LETTER IZHITSA, 1141 +CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT, 1142 +CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT, 1143 +CYRILLIC CAPITAL LETTER UK, 1144 +CYRILLIC SMALL LETTER UK, 1145 +CYRILLIC CAPITAL LETTER ROUND OMEGA, 1146 +CYRILLIC SMALL LETTER ROUND OMEGA, 1147 +CYRILLIC CAPITAL LETTER OMEGA WITH TITLO, 1148 +CYRILLIC SMALL LETTER OMEGA WITH TITLO, 1149 +CYRILLIC CAPITAL LETTER OT, 1150 +CYRILLIC SMALL LETTER OT, 1151 +CYRILLIC CAPITAL LETTER KOPPA, 1152 +CYRILLIC SMALL LETTER KOPPA, 1153 +CYRILLIC THOUSANDS SIGN, 1154 +COMBINING CYRILLIC TITLO, 1155 +COMBINING CYRILLIC PALATALIZATION, 1156 +COMBINING CYRILLIC DASIA PNEUMATA, 1157 +COMBINING CYRILLIC PSILI PNEUMATA, 1158 +COMBINING CYRILLIC POKRYTIE, 1159 +COMBINING CYRILLIC HUNDRED THOUSANDS SIGN, 1160 +COMBINING CYRILLIC MILLIONS SIGN, 1161 +CYRILLIC CAPITAL LETTER SHORT I WITH TAIL, 1162 +CYRILLIC SMALL LETTER SHORT I WITH TAIL, 1163 +CYRILLIC CAPITAL LETTER SEMISOFT SIGN, 1164 +CYRILLIC SMALL LETTER SEMISOFT SIGN, 1165 +CYRILLIC CAPITAL LETTER ER WITH TICK, 1166 +CYRILLIC SMALL LETTER ER WITH TICK, 1167 +CYRILLIC CAPITAL LETTER GHE WITH UPTURN, 1168 +CYRILLIC SMALL LETTER GHE WITH UPTURN, 1169 +CYRILLIC CAPITAL LETTER GHE WITH STROKE, 1170 +CYRILLIC SMALL LETTER GHE WITH STROKE, 1171 +CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK, 1172 +CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK, 1173 +CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER, 1174 +CYRILLIC SMALL LETTER ZHE WITH DESCENDER, 1175 +CYRILLIC CAPITAL LETTER ZE WITH DESCENDER, 1176 +CYRILLIC SMALL LETTER ZE WITH DESCENDER, 1177 +CYRILLIC CAPITAL LETTER KA WITH DESCENDER, 1178 +CYRILLIC SMALL LETTER KA WITH DESCENDER, 1179 +CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE, 1180 +CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE, 1181 +CYRILLIC CAPITAL LETTER KA WITH STROKE, 1182 +CYRILLIC SMALL LETTER KA WITH STROKE, 1183 +CYRILLIC CAPITAL LETTER BASHKIR KA, 1184 +CYRILLIC SMALL LETTER BASHKIR KA, 1185 +CYRILLIC CAPITAL LETTER EN WITH DESCENDER, 1186 +CYRILLIC SMALL LETTER EN WITH DESCENDER, 1187 +CYRILLIC CAPITAL LIGATURE EN GHE, 1188 +CYRILLIC SMALL LIGATURE EN GHE, 1189 +CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK, 1190 +CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK, 1191 +CYRILLIC CAPITAL LETTER ABKHASIAN HA, 1192 +CYRILLIC SMALL LETTER ABKHASIAN HA, 1193 +CYRILLIC CAPITAL LETTER ES WITH DESCENDER, 1194 +CYRILLIC SMALL LETTER ES WITH DESCENDER, 1195 +CYRILLIC CAPITAL LETTER TE WITH DESCENDER, 1196 +CYRILLIC SMALL LETTER TE WITH DESCENDER, 1197 +CYRILLIC CAPITAL LETTER STRAIGHT U, 1198 +CYRILLIC SMALL LETTER STRAIGHT U, 1199 +CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE, 1200 +CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE, 1201 +CYRILLIC CAPITAL LETTER HA WITH DESCENDER, 1202 +CYRILLIC SMALL LETTER HA WITH DESCENDER, 1203 +CYRILLIC CAPITAL LIGATURE TE TSE, 1204 +CYRILLIC SMALL LIGATURE TE TSE, 1205 +CYRILLIC CAPITAL LETTER CHE WITH DESCENDER, 1206 +CYRILLIC SMALL LETTER CHE WITH DESCENDER, 1207 +CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE, 1208 +CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE, 1209 +CYRILLIC CAPITAL LETTER SHHA, 1210 +CYRILLIC SMALL LETTER SHHA, 1211 +CYRILLIC CAPITAL LETTER ABKHASIAN CHE, 1212 +CYRILLIC SMALL LETTER ABKHASIAN CHE, 1213 +CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER, 1214 +CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER, 1215 +CYRILLIC LETTER PALOCHKA, 1216 +CYRILLIC CAPITAL LETTER ZHE WITH BREVE, 1217 +CYRILLIC SMALL LETTER ZHE WITH BREVE, 1218 +CYRILLIC CAPITAL LETTER KA WITH HOOK, 1219 +CYRILLIC SMALL LETTER KA WITH HOOK, 1220 +CYRILLIC CAPITAL LETTER EL WITH TAIL, 1221 +CYRILLIC SMALL LETTER EL WITH TAIL, 1222 +CYRILLIC CAPITAL LETTER EN WITH HOOK, 1223 +CYRILLIC SMALL LETTER EN WITH HOOK, 1224 +CYRILLIC CAPITAL LETTER EN WITH TAIL, 1225 +CYRILLIC SMALL LETTER EN WITH TAIL, 1226 +CYRILLIC CAPITAL LETTER KHAKASSIAN CHE, 1227 +CYRILLIC SMALL LETTER KHAKASSIAN CHE, 1228 +CYRILLIC CAPITAL LETTER EM WITH TAIL, 1229 +CYRILLIC SMALL LETTER EM WITH TAIL, 1230 +CYRILLIC SMALL LETTER PALOCHKA, 1231 +CYRILLIC CAPITAL LETTER A WITH BREVE, 1232 +CYRILLIC SMALL LETTER A WITH BREVE, 1233 +CYRILLIC CAPITAL LETTER A WITH DIAERESIS, 1234 +CYRILLIC SMALL LETTER A WITH DIAERESIS, 1235 +CYRILLIC CAPITAL LIGATURE A IE, 1236 +CYRILLIC SMALL LIGATURE A IE, 1237 +CYRILLIC CAPITAL LETTER IE WITH BREVE, 1238 +CYRILLIC SMALL LETTER IE WITH BREVE, 1239 +CYRILLIC CAPITAL LETTER SCHWA, 1240 +CYRILLIC SMALL LETTER SCHWA, 1241 +CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS, 1242 +CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS, 1243 +CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS, 1244 +CYRILLIC SMALL LETTER ZHE WITH DIAERESIS, 1245 +CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS, 1246 +CYRILLIC SMALL LETTER ZE WITH DIAERESIS, 1247 +CYRILLIC CAPITAL LETTER ABKHASIAN DZE, 1248 +CYRILLIC SMALL LETTER ABKHASIAN DZE, 1249 +CYRILLIC CAPITAL LETTER I WITH MACRON, 1250 +CYRILLIC SMALL LETTER I WITH MACRON, 1251 +CYRILLIC CAPITAL LETTER I WITH DIAERESIS, 1252 +CYRILLIC SMALL LETTER I WITH DIAERESIS, 1253 +CYRILLIC CAPITAL LETTER O WITH DIAERESIS, 1254 +CYRILLIC SMALL LETTER O WITH DIAERESIS, 1255 +CYRILLIC CAPITAL LETTER BARRED O, 1256 +CYRILLIC SMALL LETTER BARRED O, 1257 +CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS, 1258 +CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS, 1259 +CYRILLIC CAPITAL LETTER E WITH DIAERESIS, 1260 +CYRILLIC SMALL LETTER E WITH DIAERESIS, 1261 +CYRILLIC CAPITAL LETTER U WITH MACRON, 1262 +CYRILLIC SMALL LETTER U WITH MACRON, 1263 +CYRILLIC CAPITAL LETTER U WITH DIAERESIS, 1264 +CYRILLIC SMALL LETTER U WITH DIAERESIS, 1265 +CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE, 1266 +CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE, 1267 +CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS, 1268 +CYRILLIC SMALL LETTER CHE WITH DIAERESIS, 1269 +CYRILLIC CAPITAL LETTER GHE WITH DESCENDER, 1270 +CYRILLIC SMALL LETTER GHE WITH DESCENDER, 1271 +CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS, 1272 +CYRILLIC SMALL LETTER YERU WITH DIAERESIS, 1273 +CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK, 1274 +CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK, 1275 +CYRILLIC CAPITAL LETTER HA WITH HOOK, 1276 +CYRILLIC SMALL LETTER HA WITH HOOK, 1277 +CYRILLIC CAPITAL LETTER HA WITH STROKE, 1278 +CYRILLIC SMALL LETTER HA WITH STROKE, 1279 +CYRILLIC CAPITAL LETTER KOMI DE, 1280 +CYRILLIC SMALL LETTER KOMI DE, 1281 +CYRILLIC CAPITAL LETTER KOMI DJE, 1282 +CYRILLIC SMALL LETTER KOMI DJE, 1283 +CYRILLIC CAPITAL LETTER KOMI ZJE, 1284 +CYRILLIC SMALL LETTER KOMI ZJE, 1285 +CYRILLIC CAPITAL LETTER KOMI DZJE, 1286 +CYRILLIC SMALL LETTER KOMI DZJE, 1287 +CYRILLIC CAPITAL LETTER KOMI LJE, 1288 +CYRILLIC SMALL LETTER KOMI LJE, 1289 +CYRILLIC CAPITAL LETTER KOMI NJE, 1290 +CYRILLIC SMALL LETTER KOMI NJE, 1291 +CYRILLIC CAPITAL LETTER KOMI SJE, 1292 +CYRILLIC SMALL LETTER KOMI SJE, 1293 +CYRILLIC CAPITAL LETTER KOMI TJE, 1294 +CYRILLIC SMALL LETTER KOMI TJE, 1295 +CYRILLIC CAPITAL LETTER REVERSED ZE, 1296 +CYRILLIC SMALL LETTER REVERSED ZE, 1297 +CYRILLIC CAPITAL LETTER EL WITH HOOK, 1298 +CYRILLIC SMALL LETTER EL WITH HOOK, 1299 +CYRILLIC CAPITAL LETTER LHA, 1300 +CYRILLIC SMALL LETTER LHA, 1301 +CYRILLIC CAPITAL LETTER RHA, 1302 +CYRILLIC SMALL LETTER RHA, 1303 +CYRILLIC CAPITAL LETTER YAE, 1304 +CYRILLIC SMALL LETTER YAE, 1305 +CYRILLIC CAPITAL LETTER QA, 1306 +CYRILLIC SMALL LETTER QA, 1307 +CYRILLIC CAPITAL LETTER WE, 1308 +CYRILLIC SMALL LETTER WE, 1309 +CYRILLIC CAPITAL LETTER ALEUT KA, 1310 +CYRILLIC SMALL LETTER ALEUT KA, 1311 +CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK, 1312 +CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK, 1313 +CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK, 1314 +CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK, 1315 +CYRILLIC CAPITAL LETTER PE WITH DESCENDER, 1316 +CYRILLIC SMALL LETTER PE WITH DESCENDER, 1317 +CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER, 1318 +CYRILLIC SMALL LETTER SHHA WITH DESCENDER, 1319 +CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK, 1320 +CYRILLIC SMALL LETTER EN WITH LEFT HOOK, 1321 +CYRILLIC CAPITAL LETTER DZZHE, 1322 +CYRILLIC SMALL LETTER DZZHE, 1323 +CYRILLIC CAPITAL LETTER DCHE, 1324 +CYRILLIC SMALL LETTER DCHE, 1325 +CYRILLIC CAPITAL LETTER EL WITH DESCENDER, 1326 +CYRILLIC SMALL LETTER EL WITH DESCENDER, 1327 +ARMENIAN CAPITAL LETTER AYB, 1329 +ARMENIAN CAPITAL LETTER BEN, 1330 +ARMENIAN CAPITAL LETTER GIM, 1331 +ARMENIAN CAPITAL LETTER DA, 1332 +ARMENIAN CAPITAL LETTER ECH, 1333 +ARMENIAN CAPITAL LETTER ZA, 1334 +ARMENIAN CAPITAL LETTER EH, 1335 +ARMENIAN CAPITAL LETTER ET, 1336 +ARMENIAN CAPITAL LETTER TO, 1337 +ARMENIAN CAPITAL LETTER ZHE, 1338 +ARMENIAN CAPITAL LETTER INI, 1339 +ARMENIAN CAPITAL LETTER LIWN, 1340 +ARMENIAN CAPITAL LETTER XEH, 1341 +ARMENIAN CAPITAL LETTER CA, 1342 +ARMENIAN CAPITAL LETTER KEN, 1343 +ARMENIAN CAPITAL LETTER HO, 1344 +ARMENIAN CAPITAL LETTER JA, 1345 +ARMENIAN CAPITAL LETTER GHAD, 1346 +ARMENIAN CAPITAL LETTER CHEH, 1347 +ARMENIAN CAPITAL LETTER MEN, 1348 +ARMENIAN CAPITAL LETTER YI, 1349 +ARMENIAN CAPITAL LETTER NOW, 1350 +ARMENIAN CAPITAL LETTER SHA, 1351 +ARMENIAN CAPITAL LETTER VO, 1352 +ARMENIAN CAPITAL LETTER CHA, 1353 +ARMENIAN CAPITAL LETTER PEH, 1354 +ARMENIAN CAPITAL LETTER JHEH, 1355 +ARMENIAN CAPITAL LETTER RA, 1356 +ARMENIAN CAPITAL LETTER SEH, 1357 +ARMENIAN CAPITAL LETTER VEW, 1358 +ARMENIAN CAPITAL LETTER TIWN, 1359 +ARMENIAN CAPITAL LETTER REH, 1360 +ARMENIAN CAPITAL LETTER CO, 1361 +ARMENIAN CAPITAL LETTER YIWN, 1362 +ARMENIAN CAPITAL LETTER PIWR, 1363 +ARMENIAN CAPITAL LETTER KEH, 1364 +ARMENIAN CAPITAL LETTER OH, 1365 +ARMENIAN CAPITAL LETTER FEH, 1366 +ARMENIAN MODIFIER LETTER LEFT HALF RING, 1369 +ARMENIAN APOSTROPHE, 1370 +ARMENIAN EMPHASIS MARK, 1371 +ARMENIAN EXCLAMATION MARK, 1372 +ARMENIAN COMMA, 1373 +ARMENIAN QUESTION MARK, 1374 +ARMENIAN ABBREVIATION MARK, 1375 +ARMENIAN SMALL LETTER AYB, 1377 +ARMENIAN SMALL LETTER BEN, 1378 +ARMENIAN SMALL LETTER GIM, 1379 +ARMENIAN SMALL LETTER DA, 1380 +ARMENIAN SMALL LETTER ECH, 1381 +ARMENIAN SMALL LETTER ZA, 1382 +ARMENIAN SMALL LETTER EH, 1383 +ARMENIAN SMALL LETTER ET, 1384 +ARMENIAN SMALL LETTER TO, 1385 +ARMENIAN SMALL LETTER ZHE, 1386 +ARMENIAN SMALL LETTER INI, 1387 +ARMENIAN SMALL LETTER LIWN, 1388 +ARMENIAN SMALL LETTER XEH, 1389 +ARMENIAN SMALL LETTER CA, 1390 +ARMENIAN SMALL LETTER KEN, 1391 +ARMENIAN SMALL LETTER HO, 1392 +ARMENIAN SMALL LETTER JA, 1393 +ARMENIAN SMALL LETTER GHAD, 1394 +ARMENIAN SMALL LETTER CHEH, 1395 +ARMENIAN SMALL LETTER MEN, 1396 +ARMENIAN SMALL LETTER YI, 1397 +ARMENIAN SMALL LETTER NOW, 1398 +ARMENIAN SMALL LETTER SHA, 1399 +ARMENIAN SMALL LETTER VO, 1400 +ARMENIAN SMALL LETTER CHA, 1401 +ARMENIAN SMALL LETTER PEH, 1402 +ARMENIAN SMALL LETTER JHEH, 1403 +ARMENIAN SMALL LETTER RA, 1404 +ARMENIAN SMALL LETTER SEH, 1405 +ARMENIAN SMALL LETTER VEW, 1406 +ARMENIAN SMALL LETTER TIWN, 1407 +ARMENIAN SMALL LETTER REH, 1408 +ARMENIAN SMALL LETTER CO, 1409 +ARMENIAN SMALL LETTER YIWN, 1410 +ARMENIAN SMALL LETTER PIWR, 1411 +ARMENIAN SMALL LETTER KEH, 1412 +ARMENIAN SMALL LETTER OH, 1413 +ARMENIAN SMALL LETTER FEH, 1414 +ARMENIAN SMALL LIGATURE ECH YIWN, 1415 +ARMENIAN FULL STOP, 1417 +ARMENIAN HYPHEN, 1418 +RIGHT FACING ARMENIAN ETERNITY SIGN, 1421 +LEFT FACING ARMENIAN ETERNITY SIGN, 1422 +ARMENIAN DRAM SIGN, 1423 +HEBREW ACCENT ETNAHTA, 1425 +HEBREW ACCENT SEGOL, 1426 +HEBREW ACCENT SHALSHELET, 1427 +HEBREW ACCENT ZAQEF QATAN, 1428 +HEBREW ACCENT ZAQEF GADOL, 1429 +HEBREW ACCENT TIPEHA, 1430 +HEBREW ACCENT REVIA, 1431 +HEBREW ACCENT ZARQA, 1432 +HEBREW ACCENT PASHTA, 1433 +HEBREW ACCENT YETIV, 1434 +HEBREW ACCENT TEVIR, 1435 +HEBREW ACCENT GERESH, 1436 +HEBREW ACCENT GERESH MUQDAM, 1437 +HEBREW ACCENT GERSHAYIM, 1438 +HEBREW ACCENT QARNEY PARA, 1439 +HEBREW ACCENT TELISHA GEDOLA, 1440 +HEBREW ACCENT PAZER, 1441 +HEBREW ACCENT ATNAH HAFUKH, 1442 +HEBREW ACCENT MUNAH, 1443 +HEBREW ACCENT MAHAPAKH, 1444 +HEBREW ACCENT MERKHA, 1445 +HEBREW ACCENT MERKHA KEFULA, 1446 +HEBREW ACCENT DARGA, 1447 +HEBREW ACCENT QADMA, 1448 +HEBREW ACCENT TELISHA QETANA, 1449 +HEBREW ACCENT YERAH BEN YOMO, 1450 +HEBREW ACCENT OLE, 1451 +HEBREW ACCENT ILUY, 1452 +HEBREW ACCENT DEHI, 1453 +HEBREW ACCENT ZINOR, 1454 +HEBREW MARK MASORA CIRCLE, 1455 +HEBREW POINT SHEVA, 1456 +HEBREW POINT HATAF SEGOL, 1457 +HEBREW POINT HATAF PATAH, 1458 +HEBREW POINT HATAF QAMATS, 1459 +HEBREW POINT HIRIQ, 1460 +HEBREW POINT TSERE, 1461 +HEBREW POINT SEGOL, 1462 +HEBREW POINT PATAH, 1463 +HEBREW POINT QAMATS, 1464 +HEBREW POINT HOLAM, 1465 +HEBREW POINT HOLAM HASER FOR VAV, 1466 +HEBREW POINT QUBUTS, 1467 +HEBREW POINT DAGESH OR MAPIQ, 1468 +HEBREW POINT METEG, 1469 +HEBREW PUNCTUATION MAQAF, 1470 +HEBREW POINT RAFE, 1471 +HEBREW PUNCTUATION PASEQ, 1472 +HEBREW POINT SHIN DOT, 1473 +HEBREW POINT SIN DOT, 1474 +HEBREW PUNCTUATION SOF PASUQ, 1475 +HEBREW MARK UPPER DOT, 1476 +HEBREW MARK LOWER DOT, 1477 +HEBREW PUNCTUATION NUN HAFUKHA, 1478 +HEBREW POINT QAMATS QATAN, 1479 +HEBREW LETTER ALEF, 1488 +HEBREW LETTER BET, 1489 +HEBREW LETTER GIMEL, 1490 +HEBREW LETTER DALET, 1491 +HEBREW LETTER HE, 1492 +HEBREW LETTER VAV, 1493 +HEBREW LETTER ZAYIN, 1494 +HEBREW LETTER HET, 1495 +HEBREW LETTER TET, 1496 +HEBREW LETTER YOD, 1497 +HEBREW LETTER FINAL KAF, 1498 +HEBREW LETTER KAF, 1499 +HEBREW LETTER LAMED, 1500 +HEBREW LETTER FINAL MEM, 1501 +HEBREW LETTER MEM, 1502 +HEBREW LETTER FINAL NUN, 1503 +HEBREW LETTER NUN, 1504 +HEBREW LETTER SAMEKH, 1505 +HEBREW LETTER AYIN, 1506 +HEBREW LETTER FINAL PE, 1507 +HEBREW LETTER PE, 1508 +HEBREW LETTER FINAL TSADI, 1509 +HEBREW LETTER TSADI, 1510 +HEBREW LETTER QOF, 1511 +HEBREW LETTER RESH, 1512 +HEBREW LETTER SHIN, 1513 +HEBREW LETTER TAV, 1514 +HEBREW LIGATURE YIDDISH DOUBLE VAV, 1520 +HEBREW LIGATURE YIDDISH VAV YOD, 1521 +HEBREW LIGATURE YIDDISH DOUBLE YOD, 1522 +HEBREW PUNCTUATION GERESH, 1523 +HEBREW PUNCTUATION GERSHAYIM, 1524 +ARABIC NUMBER SIGN, 1536 +ARABIC SIGN SANAH, 1537 +ARABIC FOOTNOTE MARKER, 1538 +ARABIC SIGN SAFHA, 1539 +ARABIC SIGN SAMVAT, 1540 +ARABIC NUMBER MARK ABOVE, 1541 +ARABIC INDIC CUBE ROOT, 1542 +ARABIC INDIC FOURTH ROOT, 1543 +ARABIC RAY, 1544 +ARABIC INDIC PER MILLE SIGN, 1545 +ARABIC INDIC PER TEN THOUSAND SIGN, 1546 +AFGHANI SIGN, 1547 +ARABIC COMMA, 1548 +ARABIC DATE SEPARATOR, 1549 +ARABIC POETIC VERSE SIGN, 1550 +ARABIC SIGN MISRA, 1551 +ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM, 1552 +ARABIC SIGN ALAYHE ASSALLAM, 1553 +ARABIC SIGN RAHMATULLAH ALAYHE, 1554 +ARABIC SIGN RADI ALLAHOU ANHU, 1555 +ARABIC SIGN TAKHALLUS, 1556 +ARABIC SMALL HIGH TAH, 1557 +ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH, 1558 +ARABIC SMALL HIGH ZAIN, 1559 +ARABIC SMALL FATHA, 1560 +ARABIC SMALL DAMMA, 1561 +ARABIC SMALL KASRA, 1562 +ARABIC SEMICOLON, 1563 +ARABIC LETTER MARK, 1564 +ARABIC TRIPLE DOT PUNCTUATION MARK, 1566 +ARABIC QUESTION MARK, 1567 +ARABIC LETTER KASHMIRI YEH, 1568 +ARABIC LETTER HAMZA, 1569 +ARABIC LETTER ALEF WITH MADDA ABOVE, 1570 +ARABIC LETTER ALEF WITH HAMZA ABOVE, 1571 +ARABIC LETTER WAW WITH HAMZA ABOVE, 1572 +ARABIC LETTER ALEF WITH HAMZA BELOW, 1573 +ARABIC LETTER YEH WITH HAMZA ABOVE, 1574 +ARABIC LETTER ALEF, 1575 +ARABIC LETTER BEH, 1576 +ARABIC LETTER TEH MARBUTA, 1577 +ARABIC LETTER TEH, 1578 +ARABIC LETTER THEH, 1579 +ARABIC LETTER JEEM, 1580 +ARABIC LETTER HAH, 1581 +ARABIC LETTER KHAH, 1582 +ARABIC LETTER DAL, 1583 +ARABIC LETTER THAL, 1584 +ARABIC LETTER REH, 1585 +ARABIC LETTER ZAIN, 1586 +ARABIC LETTER SEEN, 1587 +ARABIC LETTER SHEEN, 1588 +ARABIC LETTER SAD, 1589 +ARABIC LETTER DAD, 1590 +ARABIC LETTER TAH, 1591 +ARABIC LETTER ZAH, 1592 +ARABIC LETTER AIN, 1593 +ARABIC LETTER GHAIN, 1594 +ARABIC LETTER KEHEH WITH TWO DOTS ABOVE, 1595 +ARABIC LETTER KEHEH WITH THREE DOTS BELOW, 1596 +ARABIC LETTER FARSI YEH WITH INVERTED V, 1597 +ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE, 1598 +ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE, 1599 +ARABIC TATWEEL, 1600 +ARABIC LETTER FEH, 1601 +ARABIC LETTER QAF, 1602 +ARABIC LETTER KAF, 1603 +ARABIC LETTER LAM, 1604 +ARABIC LETTER MEEM, 1605 +ARABIC LETTER NOON, 1606 +ARABIC LETTER HEH, 1607 +ARABIC LETTER WAW, 1608 +ARABIC LETTER ALEF MAKSURA, 1609 +ARABIC LETTER YEH, 1610 +ARABIC FATHATAN, 1611 +ARABIC DAMMATAN, 1612 +ARABIC KASRATAN, 1613 +ARABIC FATHA, 1614 +ARABIC DAMMA, 1615 +ARABIC KASRA, 1616 +ARABIC SHADDA, 1617 +ARABIC SUKUN, 1618 +ARABIC MADDAH ABOVE, 1619 +ARABIC HAMZA ABOVE, 1620 +ARABIC HAMZA BELOW, 1621 +ARABIC SUBSCRIPT ALEF, 1622 +ARABIC INVERTED DAMMA, 1623 +ARABIC MARK NOON GHUNNA, 1624 +ARABIC ZWARAKAY, 1625 +ARABIC VOWEL SIGN SMALL V ABOVE, 1626 +ARABIC VOWEL SIGN INVERTED SMALL V ABOVE, 1627 +ARABIC VOWEL SIGN DOT BELOW, 1628 +ARABIC REVERSED DAMMA, 1629 +ARABIC FATHA WITH TWO DOTS, 1630 +ARABIC WAVY HAMZA BELOW, 1631 +ARABIC INDIC DIGIT ZERO, 1632 +ARABIC INDIC DIGIT ONE, 1633 +ARABIC INDIC DIGIT TWO, 1634 +ARABIC INDIC DIGIT THREE, 1635 +ARABIC INDIC DIGIT FOUR, 1636 +ARABIC INDIC DIGIT FIVE, 1637 +ARABIC INDIC DIGIT SIX, 1638 +ARABIC INDIC DIGIT SEVEN, 1639 +ARABIC INDIC DIGIT EIGHT, 1640 +ARABIC INDIC DIGIT NINE, 1641 +ARABIC PERCENT SIGN, 1642 +ARABIC DECIMAL SEPARATOR, 1643 +ARABIC THOUSANDS SEPARATOR, 1644 +ARABIC FIVE POINTED STAR, 1645 +ARABIC LETTER DOTLESS BEH, 1646 +ARABIC LETTER DOTLESS QAF, 1647 +ARABIC LETTER SUPERSCRIPT ALEF, 1648 +ARABIC LETTER ALEF WASLA, 1649 +ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE, 1650 +ARABIC LETTER ALEF WITH WAVY HAMZA BELOW, 1651 +ARABIC LETTER HIGH HAMZA, 1652 +ARABIC LETTER HIGH HAMZA ALEF, 1653 +ARABIC LETTER HIGH HAMZA WAW, 1654 +ARABIC LETTER U WITH HAMZA ABOVE, 1655 +ARABIC LETTER HIGH HAMZA YEH, 1656 +ARABIC LETTER TTEH, 1657 +ARABIC LETTER TTEHEH, 1658 +ARABIC LETTER BEEH, 1659 +ARABIC LETTER TEH WITH RING, 1660 +ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS, 1661 +ARABIC LETTER PEH, 1662 +ARABIC LETTER TEHEH, 1663 +ARABIC LETTER BEHEH, 1664 +ARABIC LETTER HAH WITH HAMZA ABOVE, 1665 +ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE, 1666 +ARABIC LETTER NYEH, 1667 +ARABIC LETTER DYEH, 1668 +ARABIC LETTER HAH WITH THREE DOTS ABOVE, 1669 +ARABIC LETTER TCHEH, 1670 +ARABIC LETTER TCHEHEH, 1671 +ARABIC LETTER DDAL, 1672 +ARABIC LETTER DAL WITH RING, 1673 +ARABIC LETTER DAL WITH DOT BELOW, 1674 +ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH, 1675 +ARABIC LETTER DAHAL, 1676 +ARABIC LETTER DDAHAL, 1677 +ARABIC LETTER DUL, 1678 +ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS, 1679 +ARABIC LETTER DAL WITH FOUR DOTS ABOVE, 1680 +ARABIC LETTER RREH, 1681 +ARABIC LETTER REH WITH SMALL V, 1682 +ARABIC LETTER REH WITH RING, 1683 +ARABIC LETTER REH WITH DOT BELOW, 1684 +ARABIC LETTER REH WITH SMALL V BELOW, 1685 +ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE, 1686 +ARABIC LETTER REH WITH TWO DOTS ABOVE, 1687 +ARABIC LETTER JEH, 1688 +ARABIC LETTER REH WITH FOUR DOTS ABOVE, 1689 +ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE, 1690 +ARABIC LETTER SEEN WITH THREE DOTS BELOW, 1691 +ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE, 1692 +ARABIC LETTER SAD WITH TWO DOTS BELOW, 1693 +ARABIC LETTER SAD WITH THREE DOTS ABOVE, 1694 +ARABIC LETTER TAH WITH THREE DOTS ABOVE, 1695 +ARABIC LETTER AIN WITH THREE DOTS ABOVE, 1696 +ARABIC LETTER DOTLESS FEH, 1697 +ARABIC LETTER FEH WITH DOT MOVED BELOW, 1698 +ARABIC LETTER FEH WITH DOT BELOW, 1699 +ARABIC LETTER VEH, 1700 +ARABIC LETTER FEH WITH THREE DOTS BELOW, 1701 +ARABIC LETTER PEHEH, 1702 +ARABIC LETTER QAF WITH DOT ABOVE, 1703 +ARABIC LETTER QAF WITH THREE DOTS ABOVE, 1704 +ARABIC LETTER KEHEH, 1705 +ARABIC LETTER SWASH KAF, 1706 +ARABIC LETTER KAF WITH RING, 1707 +ARABIC LETTER KAF WITH DOT ABOVE, 1708 +ARABIC LETTER NG, 1709 +ARABIC LETTER KAF WITH THREE DOTS BELOW, 1710 +ARABIC LETTER GAF, 1711 +ARABIC LETTER GAF WITH RING, 1712 +ARABIC LETTER NGOEH, 1713 +ARABIC LETTER GAF WITH TWO DOTS BELOW, 1714 +ARABIC LETTER GUEH, 1715 +ARABIC LETTER GAF WITH THREE DOTS ABOVE, 1716 +ARABIC LETTER LAM WITH SMALL V, 1717 +ARABIC LETTER LAM WITH DOT ABOVE, 1718 +ARABIC LETTER LAM WITH THREE DOTS ABOVE, 1719 +ARABIC LETTER LAM WITH THREE DOTS BELOW, 1720 +ARABIC LETTER NOON WITH DOT BELOW, 1721 +ARABIC LETTER NOON GHUNNA, 1722 +ARABIC LETTER RNOON, 1723 +ARABIC LETTER NOON WITH RING, 1724 +ARABIC LETTER NOON WITH THREE DOTS ABOVE, 1725 +ARABIC LETTER HEH DOACHASHMEE, 1726 +ARABIC LETTER TCHEH WITH DOT ABOVE, 1727 +ARABIC LETTER HEH WITH YEH ABOVE, 1728 +ARABIC LETTER HEH GOAL, 1729 +ARABIC LETTER HEH GOAL WITH HAMZA ABOVE, 1730 +ARABIC LETTER TEH MARBUTA GOAL, 1731 +ARABIC LETTER WAW WITH RING, 1732 +ARABIC LETTER KIRGHIZ OE, 1733 +ARABIC LETTER OE, 1734 +ARABIC LETTER U, 1735 +ARABIC LETTER YU, 1736 +ARABIC LETTER KIRGHIZ YU, 1737 +ARABIC LETTER WAW WITH TWO DOTS ABOVE, 1738 +ARABIC LETTER VE, 1739 +ARABIC LETTER FARSI YEH, 1740 +ARABIC LETTER YEH WITH TAIL, 1741 +ARABIC LETTER YEH WITH SMALL V, 1742 +ARABIC LETTER WAW WITH DOT ABOVE, 1743 +ARABIC LETTER E, 1744 +ARABIC LETTER YEH WITH THREE DOTS BELOW, 1745 +ARABIC LETTER YEH BARREE, 1746 +ARABIC LETTER YEH BARREE WITH HAMZA ABOVE, 1747 +ARABIC FULL STOP, 1748 +ARABIC LETTER AE, 1749 +ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA, 1750 +ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA, 1751 +ARABIC SMALL HIGH MEEM INITIAL FORM, 1752 +ARABIC SMALL HIGH LAM ALEF, 1753 +ARABIC SMALL HIGH JEEM, 1754 +ARABIC SMALL HIGH THREE DOTS, 1755 +ARABIC SMALL HIGH SEEN, 1756 +ARABIC END OF AYAH, 1757 +ARABIC START OF RUB EL HIZB, 1758 +ARABIC SMALL HIGH ROUNDED ZERO, 1759 +ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO, 1760 +ARABIC SMALL HIGH DOTLESS HEAD OF KHAH, 1761 +ARABIC SMALL HIGH MEEM ISOLATED FORM, 1762 +ARABIC SMALL LOW SEEN, 1763 +ARABIC SMALL HIGH MADDA, 1764 +ARABIC SMALL WAW, 1765 +ARABIC SMALL YEH, 1766 +ARABIC SMALL HIGH YEH, 1767 +ARABIC SMALL HIGH NOON, 1768 +ARABIC PLACE OF SAJDAH, 1769 +ARABIC EMPTY CENTRE LOW STOP, 1770 +ARABIC EMPTY CENTRE HIGH STOP, 1771 +ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE, 1772 +ARABIC SMALL LOW MEEM, 1773 +ARABIC LETTER DAL WITH INVERTED V, 1774 +ARABIC LETTER REH WITH INVERTED V, 1775 +EXTENDED ARABIC INDIC DIGIT ZERO, 1776 +EXTENDED ARABIC INDIC DIGIT ONE, 1777 +EXTENDED ARABIC INDIC DIGIT TWO, 1778 +EXTENDED ARABIC INDIC DIGIT THREE, 1779 +EXTENDED ARABIC INDIC DIGIT FOUR, 1780 +EXTENDED ARABIC INDIC DIGIT FIVE, 1781 +EXTENDED ARABIC INDIC DIGIT SIX, 1782 +EXTENDED ARABIC INDIC DIGIT SEVEN, 1783 +EXTENDED ARABIC INDIC DIGIT EIGHT, 1784 +EXTENDED ARABIC INDIC DIGIT NINE, 1785 +ARABIC LETTER SHEEN WITH DOT BELOW, 1786 +ARABIC LETTER DAD WITH DOT BELOW, 1787 +ARABIC LETTER GHAIN WITH DOT BELOW, 1788 +ARABIC SIGN SINDHI AMPERSAND, 1789 +ARABIC SIGN SINDHI POSTPOSITION MEN, 1790 +ARABIC LETTER HEH WITH INVERTED V, 1791 +SYRIAC END OF PARAGRAPH, 1792 +SYRIAC SUPRALINEAR FULL STOP, 1793 +SYRIAC SUBLINEAR FULL STOP, 1794 +SYRIAC SUPRALINEAR COLON, 1795 +SYRIAC SUBLINEAR COLON, 1796 +SYRIAC HORIZONTAL COLON, 1797 +SYRIAC COLON SKEWED LEFT, 1798 +SYRIAC COLON SKEWED RIGHT, 1799 +SYRIAC SUPRALINEAR COLON SKEWED LEFT, 1800 +SYRIAC SUBLINEAR COLON SKEWED RIGHT, 1801 +SYRIAC CONTRACTION, 1802 +SYRIAC HARKLEAN OBELUS, 1803 +SYRIAC HARKLEAN METOBELUS, 1804 +SYRIAC HARKLEAN ASTERISCUS, 1805 +SYRIAC ABBREVIATION MARK, 1807 +SYRIAC LETTER ALAPH, 1808 +SYRIAC LETTER SUPERSCRIPT ALAPH, 1809 +SYRIAC LETTER BETH, 1810 +SYRIAC LETTER GAMAL, 1811 +SYRIAC LETTER GAMAL GARSHUNI, 1812 +SYRIAC LETTER DALATH, 1813 +SYRIAC LETTER DOTLESS DALATH RISH, 1814 +SYRIAC LETTER HE, 1815 +SYRIAC LETTER WAW, 1816 +SYRIAC LETTER ZAIN, 1817 +SYRIAC LETTER HETH, 1818 +SYRIAC LETTER TETH, 1819 +SYRIAC LETTER TETH GARSHUNI, 1820 +SYRIAC LETTER YUDH, 1821 +SYRIAC LETTER YUDH HE, 1822 +SYRIAC LETTER KAPH, 1823 +SYRIAC LETTER LAMADH, 1824 +SYRIAC LETTER MIM, 1825 +SYRIAC LETTER NUN, 1826 +SYRIAC LETTER SEMKATH, 1827 +SYRIAC LETTER FINAL SEMKATH, 1828 +SYRIAC LETTER E, 1829 +SYRIAC LETTER PE, 1830 +SYRIAC LETTER REVERSED PE, 1831 +SYRIAC LETTER SADHE, 1832 +SYRIAC LETTER QAPH, 1833 +SYRIAC LETTER RISH, 1834 +SYRIAC LETTER SHIN, 1835 +SYRIAC LETTER TAW, 1836 +SYRIAC LETTER PERSIAN BHETH, 1837 +SYRIAC LETTER PERSIAN GHAMAL, 1838 +SYRIAC LETTER PERSIAN DHALATH, 1839 +SYRIAC PTHAHA ABOVE, 1840 +SYRIAC PTHAHA BELOW, 1841 +SYRIAC PTHAHA DOTTED, 1842 +SYRIAC ZQAPHA ABOVE, 1843 +SYRIAC ZQAPHA BELOW, 1844 +SYRIAC ZQAPHA DOTTED, 1845 +SYRIAC RBASA ABOVE, 1846 +SYRIAC RBASA BELOW, 1847 +SYRIAC DOTTED ZLAMA HORIZONTAL, 1848 +SYRIAC DOTTED ZLAMA ANGULAR, 1849 +SYRIAC HBASA ABOVE, 1850 +SYRIAC HBASA BELOW, 1851 +SYRIAC HBASA ESASA DOTTED, 1852 +SYRIAC ESASA ABOVE, 1853 +SYRIAC ESASA BELOW, 1854 +SYRIAC RWAHA, 1855 +SYRIAC FEMININE DOT, 1856 +SYRIAC QUSHSHAYA, 1857 +SYRIAC RUKKAKHA, 1858 +SYRIAC TWO VERTICAL DOTS ABOVE, 1859 +SYRIAC TWO VERTICAL DOTS BELOW, 1860 +SYRIAC THREE DOTS ABOVE, 1861 +SYRIAC THREE DOTS BELOW, 1862 +SYRIAC OBLIQUE LINE ABOVE, 1863 +SYRIAC OBLIQUE LINE BELOW, 1864 +SYRIAC MUSIC, 1865 +SYRIAC BARREKH, 1866 +SYRIAC LETTER SOGDIAN ZHAIN, 1869 +SYRIAC LETTER SOGDIAN KHAPH, 1870 +SYRIAC LETTER SOGDIAN FE, 1871 +ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW, 1872 +ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE, 1873 +ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW, 1874 +ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE, 1875 +ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE, 1876 +ARABIC LETTER BEH WITH INVERTED SMALL V BELOW, 1877 +ARABIC LETTER BEH WITH SMALL V, 1878 +ARABIC LETTER HAH WITH TWO DOTS ABOVE, 1879 +ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW, 1880 +ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH, 1881 +ARABIC LETTER DAL WITH INVERTED SMALL V BELOW, 1882 +ARABIC LETTER REH WITH STROKE, 1883 +ARABIC LETTER SEEN WITH FOUR DOTS ABOVE, 1884 +ARABIC LETTER AIN WITH TWO DOTS ABOVE, 1885 +ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE, 1886 +ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE, 1887 +ARABIC LETTER FEH WITH TWO DOTS BELOW, 1888 +ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW, 1889 +ARABIC LETTER KEHEH WITH DOT ABOVE, 1890 +ARABIC LETTER KEHEH WITH THREE DOTS ABOVE, 1891 +ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW, 1892 +ARABIC LETTER MEEM WITH DOT ABOVE, 1893 +ARABIC LETTER MEEM WITH DOT BELOW, 1894 +ARABIC LETTER NOON WITH TWO DOTS BELOW, 1895 +ARABIC LETTER NOON WITH SMALL TAH, 1896 +ARABIC LETTER NOON WITH SMALL V, 1897 +ARABIC LETTER LAM WITH BAR, 1898 +ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE, 1899 +ARABIC LETTER REH WITH HAMZA ABOVE, 1900 +ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE, 1901 +ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW, 1902 +ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS, 1903 +ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS, 1904 +ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS, 1905 +ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE, 1906 +ARABIC LETTER ALEF WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE, 1907 +ARABIC LETTER ALEF WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE, 1908 +ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE, 1909 +ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE, 1910 +ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC INDIC DIGIT FOUR BELOW, 1911 +ARABIC LETTER WAW WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE, 1912 +ARABIC LETTER WAW WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE, 1913 +ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC INDIC DIGIT TWO ABOVE, 1914 +ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC INDIC DIGIT THREE ABOVE, 1915 +ARABIC LETTER HAH WITH EXTENDED ARABIC INDIC DIGIT FOUR BELOW, 1916 +ARABIC LETTER SEEN WITH EXTENDED ARABIC INDIC DIGIT FOUR ABOVE, 1917 +ARABIC LETTER SEEN WITH INVERTED V, 1918 +ARABIC LETTER KAF WITH TWO DOTS ABOVE, 1919 +THAANA LETTER HAA, 1920 +THAANA LETTER SHAVIYANI, 1921 +THAANA LETTER NOONU, 1922 +THAANA LETTER RAA, 1923 +THAANA LETTER BAA, 1924 +THAANA LETTER LHAVIYANI, 1925 +THAANA LETTER KAAFU, 1926 +THAANA LETTER ALIFU, 1927 +THAANA LETTER VAAVU, 1928 +THAANA LETTER MEEMU, 1929 +THAANA LETTER FAAFU, 1930 +THAANA LETTER DHAALU, 1931 +THAANA LETTER THAA, 1932 +THAANA LETTER LAAMU, 1933 +THAANA LETTER GAAFU, 1934 +THAANA LETTER GNAVIYANI, 1935 +THAANA LETTER SEENU, 1936 +THAANA LETTER DAVIYANI, 1937 +THAANA LETTER ZAVIYANI, 1938 +THAANA LETTER TAVIYANI, 1939 +THAANA LETTER YAA, 1940 +THAANA LETTER PAVIYANI, 1941 +THAANA LETTER JAVIYANI, 1942 +THAANA LETTER CHAVIYANI, 1943 +THAANA LETTER TTAA, 1944 +THAANA LETTER HHAA, 1945 +THAANA LETTER KHAA, 1946 +THAANA LETTER THAALU, 1947 +THAANA LETTER ZAA, 1948 +THAANA LETTER SHEENU, 1949 +THAANA LETTER SAADHU, 1950 +THAANA LETTER DAADHU, 1951 +THAANA LETTER TO, 1952 +THAANA LETTER ZO, 1953 +THAANA LETTER AINU, 1954 +THAANA LETTER GHAINU, 1955 +THAANA LETTER QAAFU, 1956 +THAANA LETTER WAAVU, 1957 +THAANA ABAFILI, 1958 +THAANA AABAAFILI, 1959 +THAANA IBIFILI, 1960 +THAANA EEBEEFILI, 1961 +THAANA UBUFILI, 1962 +THAANA OOBOOFILI, 1963 +THAANA EBEFILI, 1964 +THAANA EYBEYFILI, 1965 +THAANA OBOFILI, 1966 +THAANA OABOAFILI, 1967 +THAANA SUKUN, 1968 +THAANA LETTER NAA, 1969 +NKO DIGIT ZERO, 1984 +NKO DIGIT ONE, 1985 +NKO DIGIT TWO, 1986 +NKO DIGIT THREE, 1987 +NKO DIGIT FOUR, 1988 +NKO DIGIT FIVE, 1989 +NKO DIGIT SIX, 1990 +NKO DIGIT SEVEN, 1991 +NKO DIGIT EIGHT, 1992 +NKO DIGIT NINE, 1993 +NKO LETTER A, 1994 +NKO LETTER EE, 1995 +NKO LETTER I, 1996 +NKO LETTER E, 1997 +NKO LETTER U, 1998 +NKO LETTER OO, 1999 +NKO LETTER O, 2000 +NKO LETTER DAGBASINNA, 2001 +NKO LETTER N, 2002 +NKO LETTER BA, 2003 +NKO LETTER PA, 2004 +NKO LETTER TA, 2005 +NKO LETTER JA, 2006 +NKO LETTER CHA, 2007 +NKO LETTER DA, 2008 +NKO LETTER RA, 2009 +NKO LETTER RRA, 2010 +NKO LETTER SA, 2011 +NKO LETTER GBA, 2012 +NKO LETTER FA, 2013 +NKO LETTER KA, 2014 +NKO LETTER LA, 2015 +NKO LETTER NA WOLOSO, 2016 +NKO LETTER MA, 2017 +NKO LETTER NYA, 2018 +NKO LETTER NA, 2019 +NKO LETTER HA, 2020 +NKO LETTER WA, 2021 +NKO LETTER YA, 2022 +NKO LETTER NYA WOLOSO, 2023 +NKO LETTER JONA JA, 2024 +NKO LETTER JONA CHA, 2025 +NKO LETTER JONA RA, 2026 +NKO COMBINING SHORT HIGH TONE, 2027 +NKO COMBINING SHORT LOW TONE, 2028 +NKO COMBINING SHORT RISING TONE, 2029 +NKO COMBINING LONG DESCENDING TONE, 2030 +NKO COMBINING LONG HIGH TONE, 2031 +NKO COMBINING LONG LOW TONE, 2032 +NKO COMBINING LONG RISING TONE, 2033 +NKO COMBINING NASALIZATION MARK, 2034 +NKO COMBINING DOUBLE DOT ABOVE, 2035 +NKO HIGH TONE APOSTROPHE, 2036 +NKO LOW TONE APOSTROPHE, 2037 +NKO SYMBOL OO DENNEN, 2038 +NKO SYMBOL GBAKURUNEN, 2039 +NKO COMMA, 2040 +NKO EXCLAMATION MARK, 2041 +NKO LAJANYALAN, 2042 +SAMARITAN LETTER ALAF, 2048 +SAMARITAN LETTER BIT, 2049 +SAMARITAN LETTER GAMAN, 2050 +SAMARITAN LETTER DALAT, 2051 +SAMARITAN LETTER IY, 2052 +SAMARITAN LETTER BAA, 2053 +SAMARITAN LETTER ZEN, 2054 +SAMARITAN LETTER IT, 2055 +SAMARITAN LETTER TIT, 2056 +SAMARITAN LETTER YUT, 2057 +SAMARITAN LETTER KAAF, 2058 +SAMARITAN LETTER LABAT, 2059 +SAMARITAN LETTER MIM, 2060 +SAMARITAN LETTER NUN, 2061 +SAMARITAN LETTER SINGAAT, 2062 +SAMARITAN LETTER IN, 2063 +SAMARITAN LETTER FI, 2064 +SAMARITAN LETTER TSAADIY, 2065 +SAMARITAN LETTER QUF, 2066 +SAMARITAN LETTER RISH, 2067 +SAMARITAN LETTER SHAN, 2068 +SAMARITAN LETTER TAAF, 2069 +SAMARITAN MARK IN, 2070 +SAMARITAN MARK IN ALAF, 2071 +SAMARITAN MARK OCCLUSION, 2072 +SAMARITAN MARK DAGESH, 2073 +SAMARITAN MODIFIER LETTER EPENTHETIC YUT, 2074 +SAMARITAN MARK EPENTHETIC YUT, 2075 +SAMARITAN VOWEL SIGN LONG E, 2076 +SAMARITAN VOWEL SIGN E, 2077 +SAMARITAN VOWEL SIGN OVERLONG AA, 2078 +SAMARITAN VOWEL SIGN LONG AA, 2079 +SAMARITAN VOWEL SIGN AA, 2080 +SAMARITAN VOWEL SIGN OVERLONG A, 2081 +SAMARITAN VOWEL SIGN LONG A, 2082 +SAMARITAN VOWEL SIGN A, 2083 +SAMARITAN MODIFIER LETTER SHORT A, 2084 +SAMARITAN VOWEL SIGN SHORT A, 2085 +SAMARITAN VOWEL SIGN LONG U, 2086 +SAMARITAN VOWEL SIGN U, 2087 +SAMARITAN MODIFIER LETTER I, 2088 +SAMARITAN VOWEL SIGN LONG I, 2089 +SAMARITAN VOWEL SIGN I, 2090 +SAMARITAN VOWEL SIGN O, 2091 +SAMARITAN VOWEL SIGN SUKUN, 2092 +SAMARITAN MARK NEQUDAA, 2093 +SAMARITAN PUNCTUATION NEQUDAA, 2096 +SAMARITAN PUNCTUATION AFSAAQ, 2097 +SAMARITAN PUNCTUATION ANGED, 2098 +SAMARITAN PUNCTUATION BAU, 2099 +SAMARITAN PUNCTUATION ATMAAU, 2100 +SAMARITAN PUNCTUATION SHIYYAALAA, 2101 +SAMARITAN ABBREVIATION MARK, 2102 +SAMARITAN PUNCTUATION MELODIC QITSA, 2103 +SAMARITAN PUNCTUATION ZIQAA, 2104 +SAMARITAN PUNCTUATION QITSA, 2105 +SAMARITAN PUNCTUATION ZAEF, 2106 +SAMARITAN PUNCTUATION TURU, 2107 +SAMARITAN PUNCTUATION ARKAANU, 2108 +SAMARITAN PUNCTUATION SOF MASHFAAT, 2109 +SAMARITAN PUNCTUATION ANNAAU, 2110 +MANDAIC LETTER HALQA, 2112 +MANDAIC LETTER AB, 2113 +MANDAIC LETTER AG, 2114 +MANDAIC LETTER AD, 2115 +MANDAIC LETTER AH, 2116 +MANDAIC LETTER USHENNA, 2117 +MANDAIC LETTER AZ, 2118 +MANDAIC LETTER IT, 2119 +MANDAIC LETTER ATT, 2120 +MANDAIC LETTER AKSA, 2121 +MANDAIC LETTER AK, 2122 +MANDAIC LETTER AL, 2123 +MANDAIC LETTER AM, 2124 +MANDAIC LETTER AN, 2125 +MANDAIC LETTER AS, 2126 +MANDAIC LETTER IN, 2127 +MANDAIC LETTER AP, 2128 +MANDAIC LETTER ASZ, 2129 +MANDAIC LETTER AQ, 2130 +MANDAIC LETTER AR, 2131 +MANDAIC LETTER ASH, 2132 +MANDAIC LETTER AT, 2133 +MANDAIC LETTER DUSHENNA, 2134 +MANDAIC LETTER KAD, 2135 +MANDAIC LETTER AIN, 2136 +MANDAIC AFFRICATION MARK, 2137 +MANDAIC VOCALIZATION MARK, 2138 +MANDAIC GEMINATION MARK, 2139 +MANDAIC PUNCTUATION, 2142 +ARABIC LETTER BEH WITH SMALL V BELOW, 2208 +ARABIC LETTER BEH WITH HAMZA ABOVE, 2209 +ARABIC LETTER JEEM WITH TWO DOTS ABOVE, 2210 +ARABIC LETTER TAH WITH TWO DOTS ABOVE, 2211 +ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE, 2212 +ARABIC LETTER QAF WITH DOT BELOW, 2213 +ARABIC LETTER LAM WITH DOUBLE BAR, 2214 +ARABIC LETTER MEEM WITH THREE DOTS ABOVE, 2215 +ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE, 2216 +ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE, 2217 +ARABIC LETTER REH WITH LOOP, 2218 +ARABIC LETTER WAW WITH DOT WITHIN, 2219 +ARABIC LETTER ROHINGYA YEH, 2220 +ARABIC LETTER LOW ALEF, 2221 +ARABIC LETTER DAL WITH THREE DOTS BELOW, 2222 +ARABIC LETTER SAD WITH THREE DOTS BELOW, 2223 +ARABIC LETTER GAF WITH INVERTED STROKE, 2224 +ARABIC LETTER STRAIGHT WAW, 2225 +ARABIC LETTER ZAIN WITH INVERTED V ABOVE, 2226 +ARABIC LETTER AIN WITH THREE DOTS BELOW, 2227 +ARABIC LETTER KAF WITH DOT BELOW, 2228 +ARABIC LETTER BEH WITH SMALL MEEM ABOVE, 2230 +ARABIC LETTER PEH WITH SMALL MEEM ABOVE, 2231 +ARABIC LETTER TEH WITH SMALL TEH ABOVE, 2232 +ARABIC LETTER REH WITH SMALL NOON ABOVE, 2233 +ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE, 2234 +ARABIC LETTER AFRICAN FEH, 2235 +ARABIC LETTER AFRICAN QAF, 2236 +ARABIC LETTER AFRICAN NOON, 2237 +ARABIC SMALL HIGH WORD AR RUB, 2260 +ARABIC SMALL HIGH SAD, 2261 +ARABIC SMALL HIGH AIN, 2262 +ARABIC SMALL HIGH QAF, 2263 +ARABIC SMALL HIGH NOON WITH KASRA, 2264 +ARABIC SMALL LOW NOON WITH KASRA, 2265 +ARABIC SMALL HIGH WORD ATH THALATHA, 2266 +ARABIC SMALL HIGH WORD AS SAJDA, 2267 +ARABIC SMALL HIGH WORD AN NISF, 2268 +ARABIC SMALL HIGH WORD SAKTA, 2269 +ARABIC SMALL HIGH WORD QIF, 2270 +ARABIC SMALL HIGH WORD WAQFA, 2271 +ARABIC SMALL HIGH FOOTNOTE MARKER, 2272 +ARABIC SMALL HIGH SIGN SAFHA, 2273 +ARABIC DISPUTED END OF AYAH, 2274 +ARABIC TURNED DAMMA BELOW, 2275 +ARABIC CURLY FATHA, 2276 +ARABIC CURLY DAMMA, 2277 +ARABIC CURLY KASRA, 2278 +ARABIC CURLY FATHATAN, 2279 +ARABIC CURLY DAMMATAN, 2280 +ARABIC CURLY KASRATAN, 2281 +ARABIC TONE ONE DOT ABOVE, 2282 +ARABIC TONE TWO DOTS ABOVE, 2283 +ARABIC TONE LOOP ABOVE, 2284 +ARABIC TONE ONE DOT BELOW, 2285 +ARABIC TONE TWO DOTS BELOW, 2286 +ARABIC TONE LOOP BELOW, 2287 +ARABIC OPEN FATHATAN, 2288 +ARABIC OPEN DAMMATAN, 2289 +ARABIC OPEN KASRATAN, 2290 +ARABIC SMALL HIGH WAW, 2291 +ARABIC FATHA WITH RING, 2292 +ARABIC FATHA WITH DOT ABOVE, 2293 +ARABIC KASRA WITH DOT BELOW, 2294 +ARABIC LEFT ARROWHEAD ABOVE, 2295 +ARABIC RIGHT ARROWHEAD ABOVE, 2296 +ARABIC LEFT ARROWHEAD BELOW, 2297 +ARABIC RIGHT ARROWHEAD BELOW, 2298 +ARABIC DOUBLE RIGHT ARROWHEAD ABOVE, 2299 +ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT, 2300 +ARABIC RIGHT ARROWHEAD ABOVE WITH DOT, 2301 +ARABIC DAMMA WITH DOT, 2302 +ARABIC MARK SIDEWAYS NOON GHUNNA, 2303 +DEVANAGARI SIGN INVERTED CANDRABINDU, 2304 +DEVANAGARI SIGN CANDRABINDU, 2305 +DEVANAGARI SIGN ANUSVARA, 2306 +DEVANAGARI SIGN VISARGA, 2307 +DEVANAGARI LETTER SHORT A, 2308 +DEVANAGARI LETTER A, 2309 +DEVANAGARI LETTER AA, 2310 +DEVANAGARI LETTER I, 2311 +DEVANAGARI LETTER II, 2312 +DEVANAGARI LETTER U, 2313 +DEVANAGARI LETTER UU, 2314 +DEVANAGARI LETTER VOCALIC R, 2315 +DEVANAGARI LETTER VOCALIC L, 2316 +DEVANAGARI LETTER CANDRA E, 2317 +DEVANAGARI LETTER SHORT E, 2318 +DEVANAGARI LETTER E, 2319 +DEVANAGARI LETTER AI, 2320 +DEVANAGARI LETTER CANDRA O, 2321 +DEVANAGARI LETTER SHORT O, 2322 +DEVANAGARI LETTER O, 2323 +DEVANAGARI LETTER AU, 2324 +DEVANAGARI LETTER KA, 2325 +DEVANAGARI LETTER KHA, 2326 +DEVANAGARI LETTER GA, 2327 +DEVANAGARI LETTER GHA, 2328 +DEVANAGARI LETTER NGA, 2329 +DEVANAGARI LETTER CA, 2330 +DEVANAGARI LETTER CHA, 2331 +DEVANAGARI LETTER JA, 2332 +DEVANAGARI LETTER JHA, 2333 +DEVANAGARI LETTER NYA, 2334 +DEVANAGARI LETTER TTA, 2335 +DEVANAGARI LETTER TTHA, 2336 +DEVANAGARI LETTER DDA, 2337 +DEVANAGARI LETTER DDHA, 2338 +DEVANAGARI LETTER NNA, 2339 +DEVANAGARI LETTER TA, 2340 +DEVANAGARI LETTER THA, 2341 +DEVANAGARI LETTER DA, 2342 +DEVANAGARI LETTER DHA, 2343 +DEVANAGARI LETTER NA, 2344 +DEVANAGARI LETTER NNNA, 2345 +DEVANAGARI LETTER PA, 2346 +DEVANAGARI LETTER PHA, 2347 +DEVANAGARI LETTER BA, 2348 +DEVANAGARI LETTER BHA, 2349 +DEVANAGARI LETTER MA, 2350 +DEVANAGARI LETTER YA, 2351 +DEVANAGARI LETTER RA, 2352 +DEVANAGARI LETTER RRA, 2353 +DEVANAGARI LETTER LA, 2354 +DEVANAGARI LETTER LLA, 2355 +DEVANAGARI LETTER LLLA, 2356 +DEVANAGARI LETTER VA, 2357 +DEVANAGARI LETTER SHA, 2358 +DEVANAGARI LETTER SSA, 2359 +DEVANAGARI LETTER SA, 2360 +DEVANAGARI LETTER HA, 2361 +DEVANAGARI VOWEL SIGN OE, 2362 +DEVANAGARI VOWEL SIGN OOE, 2363 +DEVANAGARI SIGN NUKTA, 2364 +DEVANAGARI SIGN AVAGRAHA, 2365 +DEVANAGARI VOWEL SIGN AA, 2366 +DEVANAGARI VOWEL SIGN I, 2367 +DEVANAGARI VOWEL SIGN II, 2368 +DEVANAGARI VOWEL SIGN U, 2369 +DEVANAGARI VOWEL SIGN UU, 2370 +DEVANAGARI VOWEL SIGN VOCALIC R, 2371 +DEVANAGARI VOWEL SIGN VOCALIC RR, 2372 +DEVANAGARI VOWEL SIGN CANDRA E, 2373 +DEVANAGARI VOWEL SIGN SHORT E, 2374 +DEVANAGARI VOWEL SIGN E, 2375 +DEVANAGARI VOWEL SIGN AI, 2376 +DEVANAGARI VOWEL SIGN CANDRA O, 2377 +DEVANAGARI VOWEL SIGN SHORT O, 2378 +DEVANAGARI VOWEL SIGN O, 2379 +DEVANAGARI VOWEL SIGN AU, 2380 +DEVANAGARI SIGN VIRAMA, 2381 +DEVANAGARI VOWEL SIGN PRISHTHAMATRA E, 2382 +DEVANAGARI VOWEL SIGN AW, 2383 +DEVANAGARI OM, 2384 +DEVANAGARI STRESS SIGN UDATTA, 2385 +DEVANAGARI STRESS SIGN ANUDATTA, 2386 +DEVANAGARI GRAVE ACCENT, 2387 +DEVANAGARI ACUTE ACCENT, 2388 +DEVANAGARI VOWEL SIGN CANDRA LONG E, 2389 +DEVANAGARI VOWEL SIGN UE, 2390 +DEVANAGARI VOWEL SIGN UUE, 2391 +DEVANAGARI LETTER QA, 2392 +DEVANAGARI LETTER KHHA, 2393 +DEVANAGARI LETTER GHHA, 2394 +DEVANAGARI LETTER ZA, 2395 +DEVANAGARI LETTER DDDHA, 2396 +DEVANAGARI LETTER RHA, 2397 +DEVANAGARI LETTER FA, 2398 +DEVANAGARI LETTER YYA, 2399 +DEVANAGARI LETTER VOCALIC RR, 2400 +DEVANAGARI LETTER VOCALIC LL, 2401 +DEVANAGARI VOWEL SIGN VOCALIC L, 2402 +DEVANAGARI VOWEL SIGN VOCALIC LL, 2403 +DEVANAGARI DANDA, 2404 +DEVANAGARI DOUBLE DANDA, 2405 +DEVANAGARI DIGIT ZERO, 2406 +DEVANAGARI DIGIT ONE, 2407 +DEVANAGARI DIGIT TWO, 2408 +DEVANAGARI DIGIT THREE, 2409 +DEVANAGARI DIGIT FOUR, 2410 +DEVANAGARI DIGIT FIVE, 2411 +DEVANAGARI DIGIT SIX, 2412 +DEVANAGARI DIGIT SEVEN, 2413 +DEVANAGARI DIGIT EIGHT, 2414 +DEVANAGARI DIGIT NINE, 2415 +DEVANAGARI ABBREVIATION SIGN, 2416 +DEVANAGARI SIGN HIGH SPACING DOT, 2417 +DEVANAGARI LETTER CANDRA A, 2418 +DEVANAGARI LETTER OE, 2419 +DEVANAGARI LETTER OOE, 2420 +DEVANAGARI LETTER AW, 2421 +DEVANAGARI LETTER UE, 2422 +DEVANAGARI LETTER UUE, 2423 +DEVANAGARI LETTER MARWARI DDA, 2424 +DEVANAGARI LETTER ZHA, 2425 +DEVANAGARI LETTER HEAVY YA, 2426 +DEVANAGARI LETTER GGA, 2427 +DEVANAGARI LETTER JJA, 2428 +DEVANAGARI LETTER GLOTTAL STOP, 2429 +DEVANAGARI LETTER DDDA, 2430 +DEVANAGARI LETTER BBA, 2431 +BENGALI ANJI, 2432 +BENGALI SIGN CANDRABINDU, 2433 +BENGALI SIGN ANUSVARA, 2434 +BENGALI SIGN VISARGA, 2435 +BENGALI LETTER A, 2437 +BENGALI LETTER AA, 2438 +BENGALI LETTER I, 2439 +BENGALI LETTER II, 2440 +BENGALI LETTER U, 2441 +BENGALI LETTER UU, 2442 +BENGALI LETTER VOCALIC R, 2443 +BENGALI LETTER VOCALIC L, 2444 +BENGALI LETTER E, 2447 +BENGALI LETTER AI, 2448 +BENGALI LETTER O, 2451 +BENGALI LETTER AU, 2452 +BENGALI LETTER KA, 2453 +BENGALI LETTER KHA, 2454 +BENGALI LETTER GA, 2455 +BENGALI LETTER GHA, 2456 +BENGALI LETTER NGA, 2457 +BENGALI LETTER CA, 2458 +BENGALI LETTER CHA, 2459 +BENGALI LETTER JA, 2460 +BENGALI LETTER JHA, 2461 +BENGALI LETTER NYA, 2462 +BENGALI LETTER TTA, 2463 +BENGALI LETTER TTHA, 2464 +BENGALI LETTER DDA, 2465 +BENGALI LETTER DDHA, 2466 +BENGALI LETTER NNA, 2467 +BENGALI LETTER TA, 2468 +BENGALI LETTER THA, 2469 +BENGALI LETTER DA, 2470 +BENGALI LETTER DHA, 2471 +BENGALI LETTER NA, 2472 +BENGALI LETTER PA, 2474 +BENGALI LETTER PHA, 2475 +BENGALI LETTER BA, 2476 +BENGALI LETTER BHA, 2477 +BENGALI LETTER MA, 2478 +BENGALI LETTER YA, 2479 +BENGALI LETTER RA, 2480 +BENGALI LETTER LA, 2482 +BENGALI LETTER SHA, 2486 +BENGALI LETTER SSA, 2487 +BENGALI LETTER SA, 2488 +BENGALI LETTER HA, 2489 +BENGALI SIGN NUKTA, 2492 +BENGALI SIGN AVAGRAHA, 2493 +BENGALI VOWEL SIGN AA, 2494 +BENGALI VOWEL SIGN I, 2495 +BENGALI VOWEL SIGN II, 2496 +BENGALI VOWEL SIGN U, 2497 +BENGALI VOWEL SIGN UU, 2498 +BENGALI VOWEL SIGN VOCALIC R, 2499 +BENGALI VOWEL SIGN VOCALIC RR, 2500 +BENGALI VOWEL SIGN E, 2503 +BENGALI VOWEL SIGN AI, 2504 +BENGALI VOWEL SIGN O, 2507 +BENGALI VOWEL SIGN AU, 2508 +BENGALI SIGN VIRAMA, 2509 +BENGALI LETTER KHANDA TA, 2510 +BENGALI AU LENGTH MARK, 2519 +BENGALI LETTER RRA, 2524 +BENGALI LETTER RHA, 2525 +BENGALI LETTER YYA, 2527 +BENGALI LETTER VOCALIC RR, 2528 +BENGALI LETTER VOCALIC LL, 2529 +BENGALI VOWEL SIGN VOCALIC L, 2530 +BENGALI VOWEL SIGN VOCALIC LL, 2531 +BENGALI DIGIT ZERO, 2534 +BENGALI DIGIT ONE, 2535 +BENGALI DIGIT TWO, 2536 +BENGALI DIGIT THREE, 2537 +BENGALI DIGIT FOUR, 2538 +BENGALI DIGIT FIVE, 2539 +BENGALI DIGIT SIX, 2540 +BENGALI DIGIT SEVEN, 2541 +BENGALI DIGIT EIGHT, 2542 +BENGALI DIGIT NINE, 2543 +BENGALI LETTER RA WITH MIDDLE DIAGONAL, 2544 +BENGALI LETTER RA WITH LOWER DIAGONAL, 2545 +BENGALI RUPEE MARK, 2546 +BENGALI RUPEE SIGN, 2547 +BENGALI CURRENCY NUMERATOR ONE, 2548 +BENGALI CURRENCY NUMERATOR TWO, 2549 +BENGALI CURRENCY NUMERATOR THREE, 2550 +BENGALI CURRENCY NUMERATOR FOUR, 2551 +BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR, 2552 +BENGALI CURRENCY DENOMINATOR SIXTEEN, 2553 +BENGALI ISSHAR, 2554 +BENGALI GANDA MARK, 2555 +GURMUKHI SIGN ADAK BINDI, 2561 +GURMUKHI SIGN BINDI, 2562 +GURMUKHI SIGN VISARGA, 2563 +GURMUKHI LETTER A, 2565 +GURMUKHI LETTER AA, 2566 +GURMUKHI LETTER I, 2567 +GURMUKHI LETTER II, 2568 +GURMUKHI LETTER U, 2569 +GURMUKHI LETTER UU, 2570 +GURMUKHI LETTER EE, 2575 +GURMUKHI LETTER AI, 2576 +GURMUKHI LETTER OO, 2579 +GURMUKHI LETTER AU, 2580 +GURMUKHI LETTER KA, 2581 +GURMUKHI LETTER KHA, 2582 +GURMUKHI LETTER GA, 2583 +GURMUKHI LETTER GHA, 2584 +GURMUKHI LETTER NGA, 2585 +GURMUKHI LETTER CA, 2586 +GURMUKHI LETTER CHA, 2587 +GURMUKHI LETTER JA, 2588 +GURMUKHI LETTER JHA, 2589 +GURMUKHI LETTER NYA, 2590 +GURMUKHI LETTER TTA, 2591 +GURMUKHI LETTER TTHA, 2592 +GURMUKHI LETTER DDA, 2593 +GURMUKHI LETTER DDHA, 2594 +GURMUKHI LETTER NNA, 2595 +GURMUKHI LETTER TA, 2596 +GURMUKHI LETTER THA, 2597 +GURMUKHI LETTER DA, 2598 +GURMUKHI LETTER DHA, 2599 +GURMUKHI LETTER NA, 2600 +GURMUKHI LETTER PA, 2602 +GURMUKHI LETTER PHA, 2603 +GURMUKHI LETTER BA, 2604 +GURMUKHI LETTER BHA, 2605 +GURMUKHI LETTER MA, 2606 +GURMUKHI LETTER YA, 2607 +GURMUKHI LETTER RA, 2608 +GURMUKHI LETTER LA, 2610 +GURMUKHI LETTER LLA, 2611 +GURMUKHI LETTER VA, 2613 +GURMUKHI LETTER SHA, 2614 +GURMUKHI LETTER SA, 2616 +GURMUKHI LETTER HA, 2617 +GURMUKHI SIGN NUKTA, 2620 +GURMUKHI VOWEL SIGN AA, 2622 +GURMUKHI VOWEL SIGN I, 2623 +GURMUKHI VOWEL SIGN II, 2624 +GURMUKHI VOWEL SIGN U, 2625 +GURMUKHI VOWEL SIGN UU, 2626 +GURMUKHI VOWEL SIGN EE, 2631 +GURMUKHI VOWEL SIGN AI, 2632 +GURMUKHI VOWEL SIGN OO, 2635 +GURMUKHI VOWEL SIGN AU, 2636 +GURMUKHI SIGN VIRAMA, 2637 +GURMUKHI SIGN UDAAT, 2641 +GURMUKHI LETTER KHHA, 2649 +GURMUKHI LETTER GHHA, 2650 +GURMUKHI LETTER ZA, 2651 +GURMUKHI LETTER RRA, 2652 +GURMUKHI LETTER FA, 2654 +GURMUKHI DIGIT ZERO, 2662 +GURMUKHI DIGIT ONE, 2663 +GURMUKHI DIGIT TWO, 2664 +GURMUKHI DIGIT THREE, 2665 +GURMUKHI DIGIT FOUR, 2666 +GURMUKHI DIGIT FIVE, 2667 +GURMUKHI DIGIT SIX, 2668 +GURMUKHI DIGIT SEVEN, 2669 +GURMUKHI DIGIT EIGHT, 2670 +GURMUKHI DIGIT NINE, 2671 +GURMUKHI TIPPI, 2672 +GURMUKHI ADDAK, 2673 +GURMUKHI IRI, 2674 +GURMUKHI URA, 2675 +GURMUKHI EK ONKAR, 2676 +GURMUKHI SIGN YAKASH, 2677 +GUJARATI SIGN CANDRABINDU, 2689 +GUJARATI SIGN ANUSVARA, 2690 +GUJARATI SIGN VISARGA, 2691 +GUJARATI LETTER A, 2693 +GUJARATI LETTER AA, 2694 +GUJARATI LETTER I, 2695 +GUJARATI LETTER II, 2696 +GUJARATI LETTER U, 2697 +GUJARATI LETTER UU, 2698 +GUJARATI LETTER VOCALIC R, 2699 +GUJARATI LETTER VOCALIC L, 2700 +GUJARATI VOWEL CANDRA E, 2701 +GUJARATI LETTER E, 2703 +GUJARATI LETTER AI, 2704 +GUJARATI VOWEL CANDRA O, 2705 +GUJARATI LETTER O, 2707 +GUJARATI LETTER AU, 2708 +GUJARATI LETTER KA, 2709 +GUJARATI LETTER KHA, 2710 +GUJARATI LETTER GA, 2711 +GUJARATI LETTER GHA, 2712 +GUJARATI LETTER NGA, 2713 +GUJARATI LETTER CA, 2714 +GUJARATI LETTER CHA, 2715 +GUJARATI LETTER JA, 2716 +GUJARATI LETTER JHA, 2717 +GUJARATI LETTER NYA, 2718 +GUJARATI LETTER TTA, 2719 +GUJARATI LETTER TTHA, 2720 +GUJARATI LETTER DDA, 2721 +GUJARATI LETTER DDHA, 2722 +GUJARATI LETTER NNA, 2723 +GUJARATI LETTER TA, 2724 +GUJARATI LETTER THA, 2725 +GUJARATI LETTER DA, 2726 +GUJARATI LETTER DHA, 2727 +GUJARATI LETTER NA, 2728 +GUJARATI LETTER PA, 2730 +GUJARATI LETTER PHA, 2731 +GUJARATI LETTER BA, 2732 +GUJARATI LETTER BHA, 2733 +GUJARATI LETTER MA, 2734 +GUJARATI LETTER YA, 2735 +GUJARATI LETTER RA, 2736 +GUJARATI LETTER LA, 2738 +GUJARATI LETTER LLA, 2739 +GUJARATI LETTER VA, 2741 +GUJARATI LETTER SHA, 2742 +GUJARATI LETTER SSA, 2743 +GUJARATI LETTER SA, 2744 +GUJARATI LETTER HA, 2745 +GUJARATI SIGN NUKTA, 2748 +GUJARATI SIGN AVAGRAHA, 2749 +GUJARATI VOWEL SIGN AA, 2750 +GUJARATI VOWEL SIGN I, 2751 +GUJARATI VOWEL SIGN II, 2752 +GUJARATI VOWEL SIGN U, 2753 +GUJARATI VOWEL SIGN UU, 2754 +GUJARATI VOWEL SIGN VOCALIC R, 2755 +GUJARATI VOWEL SIGN VOCALIC RR, 2756 +GUJARATI VOWEL SIGN CANDRA E, 2757 +GUJARATI VOWEL SIGN E, 2759 +GUJARATI VOWEL SIGN AI, 2760 +GUJARATI VOWEL SIGN CANDRA O, 2761 +GUJARATI VOWEL SIGN O, 2763 +GUJARATI VOWEL SIGN AU, 2764 +GUJARATI SIGN VIRAMA, 2765 +GUJARATI OM, 2768 +GUJARATI LETTER VOCALIC RR, 2784 +GUJARATI LETTER VOCALIC LL, 2785 +GUJARATI VOWEL SIGN VOCALIC L, 2786 +GUJARATI VOWEL SIGN VOCALIC LL, 2787 +GUJARATI DIGIT ZERO, 2790 +GUJARATI DIGIT ONE, 2791 +GUJARATI DIGIT TWO, 2792 +GUJARATI DIGIT THREE, 2793 +GUJARATI DIGIT FOUR, 2794 +GUJARATI DIGIT FIVE, 2795 +GUJARATI DIGIT SIX, 2796 +GUJARATI DIGIT SEVEN, 2797 +GUJARATI DIGIT EIGHT, 2798 +GUJARATI DIGIT NINE, 2799 +GUJARATI ABBREVIATION SIGN, 2800 +GUJARATI RUPEE SIGN, 2801 +GUJARATI LETTER ZHA, 2809 +ORIYA SIGN CANDRABINDU, 2817 +ORIYA SIGN ANUSVARA, 2818 +ORIYA SIGN VISARGA, 2819 +ORIYA LETTER A, 2821 +ORIYA LETTER AA, 2822 +ORIYA LETTER I, 2823 +ORIYA LETTER II, 2824 +ORIYA LETTER U, 2825 +ORIYA LETTER UU, 2826 +ORIYA LETTER VOCALIC R, 2827 +ORIYA LETTER VOCALIC L, 2828 +ORIYA LETTER E, 2831 +ORIYA LETTER AI, 2832 +ORIYA LETTER O, 2835 +ORIYA LETTER AU, 2836 +ORIYA LETTER KA, 2837 +ORIYA LETTER KHA, 2838 +ORIYA LETTER GA, 2839 +ORIYA LETTER GHA, 2840 +ORIYA LETTER NGA, 2841 +ORIYA LETTER CA, 2842 +ORIYA LETTER CHA, 2843 +ORIYA LETTER JA, 2844 +ORIYA LETTER JHA, 2845 +ORIYA LETTER NYA, 2846 +ORIYA LETTER TTA, 2847 +ORIYA LETTER TTHA, 2848 +ORIYA LETTER DDA, 2849 +ORIYA LETTER DDHA, 2850 +ORIYA LETTER NNA, 2851 +ORIYA LETTER TA, 2852 +ORIYA LETTER THA, 2853 +ORIYA LETTER DA, 2854 +ORIYA LETTER DHA, 2855 +ORIYA LETTER NA, 2856 +ORIYA LETTER PA, 2858 +ORIYA LETTER PHA, 2859 +ORIYA LETTER BA, 2860 +ORIYA LETTER BHA, 2861 +ORIYA LETTER MA, 2862 +ORIYA LETTER YA, 2863 +ORIYA LETTER RA, 2864 +ORIYA LETTER LA, 2866 +ORIYA LETTER LLA, 2867 +ORIYA LETTER VA, 2869 +ORIYA LETTER SHA, 2870 +ORIYA LETTER SSA, 2871 +ORIYA LETTER SA, 2872 +ORIYA LETTER HA, 2873 +ORIYA SIGN NUKTA, 2876 +ORIYA SIGN AVAGRAHA, 2877 +ORIYA VOWEL SIGN AA, 2878 +ORIYA VOWEL SIGN I, 2879 +ORIYA VOWEL SIGN II, 2880 +ORIYA VOWEL SIGN U, 2881 +ORIYA VOWEL SIGN UU, 2882 +ORIYA VOWEL SIGN VOCALIC R, 2883 +ORIYA VOWEL SIGN VOCALIC RR, 2884 +ORIYA VOWEL SIGN E, 2887 +ORIYA VOWEL SIGN AI, 2888 +ORIYA VOWEL SIGN O, 2891 +ORIYA VOWEL SIGN AU, 2892 +ORIYA SIGN VIRAMA, 2893 +ORIYA AI LENGTH MARK, 2902 +ORIYA AU LENGTH MARK, 2903 +ORIYA LETTER RRA, 2908 +ORIYA LETTER RHA, 2909 +ORIYA LETTER YYA, 2911 +ORIYA LETTER VOCALIC RR, 2912 +ORIYA LETTER VOCALIC LL, 2913 +ORIYA VOWEL SIGN VOCALIC L, 2914 +ORIYA VOWEL SIGN VOCALIC LL, 2915 +ORIYA DIGIT ZERO, 2918 +ORIYA DIGIT ONE, 2919 +ORIYA DIGIT TWO, 2920 +ORIYA DIGIT THREE, 2921 +ORIYA DIGIT FOUR, 2922 +ORIYA DIGIT FIVE, 2923 +ORIYA DIGIT SIX, 2924 +ORIYA DIGIT SEVEN, 2925 +ORIYA DIGIT EIGHT, 2926 +ORIYA DIGIT NINE, 2927 +ORIYA ISSHAR, 2928 +ORIYA LETTER WA, 2929 +ORIYA FRACTION ONE QUARTER, 2930 +ORIYA FRACTION ONE HALF, 2931 +ORIYA FRACTION THREE QUARTERS, 2932 +ORIYA FRACTION ONE SIXTEENTH, 2933 +ORIYA FRACTION ONE EIGHTH, 2934 +ORIYA FRACTION THREE SIXTEENTHS, 2935 +TAMIL SIGN ANUSVARA, 2946 +TAMIL SIGN VISARGA, 2947 +TAMIL LETTER A, 2949 +TAMIL LETTER AA, 2950 +TAMIL LETTER I, 2951 +TAMIL LETTER II, 2952 +TAMIL LETTER U, 2953 +TAMIL LETTER UU, 2954 +TAMIL LETTER E, 2958 +TAMIL LETTER EE, 2959 +TAMIL LETTER AI, 2960 +TAMIL LETTER O, 2962 +TAMIL LETTER OO, 2963 +TAMIL LETTER AU, 2964 +TAMIL LETTER KA, 2965 +TAMIL LETTER NGA, 2969 +TAMIL LETTER CA, 2970 +TAMIL LETTER JA, 2972 +TAMIL LETTER NYA, 2974 +TAMIL LETTER TTA, 2975 +TAMIL LETTER NNA, 2979 +TAMIL LETTER TA, 2980 +TAMIL LETTER NA, 2984 +TAMIL LETTER NNNA, 2985 +TAMIL LETTER PA, 2986 +TAMIL LETTER MA, 2990 +TAMIL LETTER YA, 2991 +TAMIL LETTER RA, 2992 +TAMIL LETTER RRA, 2993 +TAMIL LETTER LA, 2994 +TAMIL LETTER LLA, 2995 +TAMIL LETTER LLLA, 2996 +TAMIL LETTER VA, 2997 +TAMIL LETTER SHA, 2998 +TAMIL LETTER SSA, 2999 +TAMIL LETTER SA, 3000 +TAMIL LETTER HA, 3001 +TAMIL VOWEL SIGN AA, 3006 +TAMIL VOWEL SIGN I, 3007 +TAMIL VOWEL SIGN II, 3008 +TAMIL VOWEL SIGN U, 3009 +TAMIL VOWEL SIGN UU, 3010 +TAMIL VOWEL SIGN E, 3014 +TAMIL VOWEL SIGN EE, 3015 +TAMIL VOWEL SIGN AI, 3016 +TAMIL VOWEL SIGN O, 3018 +TAMIL VOWEL SIGN OO, 3019 +TAMIL VOWEL SIGN AU, 3020 +TAMIL SIGN VIRAMA, 3021 +TAMIL OM, 3024 +TAMIL AU LENGTH MARK, 3031 +TAMIL DIGIT ZERO, 3046 +TAMIL DIGIT ONE, 3047 +TAMIL DIGIT TWO, 3048 +TAMIL DIGIT THREE, 3049 +TAMIL DIGIT FOUR, 3050 +TAMIL DIGIT FIVE, 3051 +TAMIL DIGIT SIX, 3052 +TAMIL DIGIT SEVEN, 3053 +TAMIL DIGIT EIGHT, 3054 +TAMIL DIGIT NINE, 3055 +TAMIL NUMBER TEN, 3056 +TAMIL NUMBER ONE HUNDRED, 3057 +TAMIL NUMBER ONE THOUSAND, 3058 +TAMIL DAY SIGN, 3059 +TAMIL MONTH SIGN, 3060 +TAMIL YEAR SIGN, 3061 +TAMIL DEBIT SIGN, 3062 +TAMIL CREDIT SIGN, 3063 +TAMIL AS ABOVE SIGN, 3064 +TAMIL RUPEE SIGN, 3065 +TAMIL NUMBER SIGN, 3066 +TELUGU SIGN COMBINING CANDRABINDU ABOVE, 3072 +TELUGU SIGN CANDRABINDU, 3073 +TELUGU SIGN ANUSVARA, 3074 +TELUGU SIGN VISARGA, 3075 +TELUGU LETTER A, 3077 +TELUGU LETTER AA, 3078 +TELUGU LETTER I, 3079 +TELUGU LETTER II, 3080 +TELUGU LETTER U, 3081 +TELUGU LETTER UU, 3082 +TELUGU LETTER VOCALIC R, 3083 +TELUGU LETTER VOCALIC L, 3084 +TELUGU LETTER E, 3086 +TELUGU LETTER EE, 3087 +TELUGU LETTER AI, 3088 +TELUGU LETTER O, 3090 +TELUGU LETTER OO, 3091 +TELUGU LETTER AU, 3092 +TELUGU LETTER KA, 3093 +TELUGU LETTER KHA, 3094 +TELUGU LETTER GA, 3095 +TELUGU LETTER GHA, 3096 +TELUGU LETTER NGA, 3097 +TELUGU LETTER CA, 3098 +TELUGU LETTER CHA, 3099 +TELUGU LETTER JA, 3100 +TELUGU LETTER JHA, 3101 +TELUGU LETTER NYA, 3102 +TELUGU LETTER TTA, 3103 +TELUGU LETTER TTHA, 3104 +TELUGU LETTER DDA, 3105 +TELUGU LETTER DDHA, 3106 +TELUGU LETTER NNA, 3107 +TELUGU LETTER TA, 3108 +TELUGU LETTER THA, 3109 +TELUGU LETTER DA, 3110 +TELUGU LETTER DHA, 3111 +TELUGU LETTER NA, 3112 +TELUGU LETTER PA, 3114 +TELUGU LETTER PHA, 3115 +TELUGU LETTER BA, 3116 +TELUGU LETTER BHA, 3117 +TELUGU LETTER MA, 3118 +TELUGU LETTER YA, 3119 +TELUGU LETTER RA, 3120 +TELUGU LETTER RRA, 3121 +TELUGU LETTER LA, 3122 +TELUGU LETTER LLA, 3123 +TELUGU LETTER LLLA, 3124 +TELUGU LETTER VA, 3125 +TELUGU LETTER SHA, 3126 +TELUGU LETTER SSA, 3127 +TELUGU LETTER SA, 3128 +TELUGU LETTER HA, 3129 +TELUGU SIGN AVAGRAHA, 3133 +TELUGU VOWEL SIGN AA, 3134 +TELUGU VOWEL SIGN I, 3135 +TELUGU VOWEL SIGN II, 3136 +TELUGU VOWEL SIGN U, 3137 +TELUGU VOWEL SIGN UU, 3138 +TELUGU VOWEL SIGN VOCALIC R, 3139 +TELUGU VOWEL SIGN VOCALIC RR, 3140 +TELUGU VOWEL SIGN E, 3142 +TELUGU VOWEL SIGN EE, 3143 +TELUGU VOWEL SIGN AI, 3144 +TELUGU VOWEL SIGN O, 3146 +TELUGU VOWEL SIGN OO, 3147 +TELUGU VOWEL SIGN AU, 3148 +TELUGU SIGN VIRAMA, 3149 +TELUGU LENGTH MARK, 3157 +TELUGU AI LENGTH MARK, 3158 +TELUGU LETTER TSA, 3160 +TELUGU LETTER DZA, 3161 +TELUGU LETTER RRRA, 3162 +TELUGU LETTER VOCALIC RR, 3168 +TELUGU LETTER VOCALIC LL, 3169 +TELUGU VOWEL SIGN VOCALIC L, 3170 +TELUGU VOWEL SIGN VOCALIC LL, 3171 +TELUGU DIGIT ZERO, 3174 +TELUGU DIGIT ONE, 3175 +TELUGU DIGIT TWO, 3176 +TELUGU DIGIT THREE, 3177 +TELUGU DIGIT FOUR, 3178 +TELUGU DIGIT FIVE, 3179 +TELUGU DIGIT SIX, 3180 +TELUGU DIGIT SEVEN, 3181 +TELUGU DIGIT EIGHT, 3182 +TELUGU DIGIT NINE, 3183 +TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR, 3192 +TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR, 3193 +TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR, 3194 +TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR, 3195 +TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR, 3196 +TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR, 3197 +TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR, 3198 +TELUGU SIGN TUUMU, 3199 +KANNADA SIGN SPACING CANDRABINDU, 3200 +KANNADA SIGN CANDRABINDU, 3201 +KANNADA SIGN ANUSVARA, 3202 +KANNADA SIGN VISARGA, 3203 +KANNADA LETTER A, 3205 +KANNADA LETTER AA, 3206 +KANNADA LETTER I, 3207 +KANNADA LETTER II, 3208 +KANNADA LETTER U, 3209 +KANNADA LETTER UU, 3210 +KANNADA LETTER VOCALIC R, 3211 +KANNADA LETTER VOCALIC L, 3212 +KANNADA LETTER E, 3214 +KANNADA LETTER EE, 3215 +KANNADA LETTER AI, 3216 +KANNADA LETTER O, 3218 +KANNADA LETTER OO, 3219 +KANNADA LETTER AU, 3220 +KANNADA LETTER KA, 3221 +KANNADA LETTER KHA, 3222 +KANNADA LETTER GA, 3223 +KANNADA LETTER GHA, 3224 +KANNADA LETTER NGA, 3225 +KANNADA LETTER CA, 3226 +KANNADA LETTER CHA, 3227 +KANNADA LETTER JA, 3228 +KANNADA LETTER JHA, 3229 +KANNADA LETTER NYA, 3230 +KANNADA LETTER TTA, 3231 +KANNADA LETTER TTHA, 3232 +KANNADA LETTER DDA, 3233 +KANNADA LETTER DDHA, 3234 +KANNADA LETTER NNA, 3235 +KANNADA LETTER TA, 3236 +KANNADA LETTER THA, 3237 +KANNADA LETTER DA, 3238 +KANNADA LETTER DHA, 3239 +KANNADA LETTER NA, 3240 +KANNADA LETTER PA, 3242 +KANNADA LETTER PHA, 3243 +KANNADA LETTER BA, 3244 +KANNADA LETTER BHA, 3245 +KANNADA LETTER MA, 3246 +KANNADA LETTER YA, 3247 +KANNADA LETTER RA, 3248 +KANNADA LETTER RRA, 3249 +KANNADA LETTER LA, 3250 +KANNADA LETTER LLA, 3251 +KANNADA LETTER VA, 3253 +KANNADA LETTER SHA, 3254 +KANNADA LETTER SSA, 3255 +KANNADA LETTER SA, 3256 +KANNADA LETTER HA, 3257 +KANNADA SIGN NUKTA, 3260 +KANNADA SIGN AVAGRAHA, 3261 +KANNADA VOWEL SIGN AA, 3262 +KANNADA VOWEL SIGN I, 3263 +KANNADA VOWEL SIGN II, 3264 +KANNADA VOWEL SIGN U, 3265 +KANNADA VOWEL SIGN UU, 3266 +KANNADA VOWEL SIGN VOCALIC R, 3267 +KANNADA VOWEL SIGN VOCALIC RR, 3268 +KANNADA VOWEL SIGN E, 3270 +KANNADA VOWEL SIGN EE, 3271 +KANNADA VOWEL SIGN AI, 3272 +KANNADA VOWEL SIGN O, 3274 +KANNADA VOWEL SIGN OO, 3275 +KANNADA VOWEL SIGN AU, 3276 +KANNADA SIGN VIRAMA, 3277 +KANNADA LENGTH MARK, 3285 +KANNADA AI LENGTH MARK, 3286 +KANNADA LETTER FA, 3294 +KANNADA LETTER VOCALIC RR, 3296 +KANNADA LETTER VOCALIC LL, 3297 +KANNADA VOWEL SIGN VOCALIC L, 3298 +KANNADA VOWEL SIGN VOCALIC LL, 3299 +KANNADA DIGIT ZERO, 3302 +KANNADA DIGIT ONE, 3303 +KANNADA DIGIT TWO, 3304 +KANNADA DIGIT THREE, 3305 +KANNADA DIGIT FOUR, 3306 +KANNADA DIGIT FIVE, 3307 +KANNADA DIGIT SIX, 3308 +KANNADA DIGIT SEVEN, 3309 +KANNADA DIGIT EIGHT, 3310 +KANNADA DIGIT NINE, 3311 +KANNADA SIGN JIHVAMULIYA, 3313 +KANNADA SIGN UPADHMANIYA, 3314 +MALAYALAM SIGN CANDRABINDU, 3329 +MALAYALAM SIGN ANUSVARA, 3330 +MALAYALAM SIGN VISARGA, 3331 +MALAYALAM LETTER A, 3333 +MALAYALAM LETTER AA, 3334 +MALAYALAM LETTER I, 3335 +MALAYALAM LETTER II, 3336 +MALAYALAM LETTER U, 3337 +MALAYALAM LETTER UU, 3338 +MALAYALAM LETTER VOCALIC R, 3339 +MALAYALAM LETTER VOCALIC L, 3340 +MALAYALAM LETTER E, 3342 +MALAYALAM LETTER EE, 3343 +MALAYALAM LETTER AI, 3344 +MALAYALAM LETTER O, 3346 +MALAYALAM LETTER OO, 3347 +MALAYALAM LETTER AU, 3348 +MALAYALAM LETTER KA, 3349 +MALAYALAM LETTER KHA, 3350 +MALAYALAM LETTER GA, 3351 +MALAYALAM LETTER GHA, 3352 +MALAYALAM LETTER NGA, 3353 +MALAYALAM LETTER CA, 3354 +MALAYALAM LETTER CHA, 3355 +MALAYALAM LETTER JA, 3356 +MALAYALAM LETTER JHA, 3357 +MALAYALAM LETTER NYA, 3358 +MALAYALAM LETTER TTA, 3359 +MALAYALAM LETTER TTHA, 3360 +MALAYALAM LETTER DDA, 3361 +MALAYALAM LETTER DDHA, 3362 +MALAYALAM LETTER NNA, 3363 +MALAYALAM LETTER TA, 3364 +MALAYALAM LETTER THA, 3365 +MALAYALAM LETTER DA, 3366 +MALAYALAM LETTER DHA, 3367 +MALAYALAM LETTER NA, 3368 +MALAYALAM LETTER NNNA, 3369 +MALAYALAM LETTER PA, 3370 +MALAYALAM LETTER PHA, 3371 +MALAYALAM LETTER BA, 3372 +MALAYALAM LETTER BHA, 3373 +MALAYALAM LETTER MA, 3374 +MALAYALAM LETTER YA, 3375 +MALAYALAM LETTER RA, 3376 +MALAYALAM LETTER RRA, 3377 +MALAYALAM LETTER LA, 3378 +MALAYALAM LETTER LLA, 3379 +MALAYALAM LETTER LLLA, 3380 +MALAYALAM LETTER VA, 3381 +MALAYALAM LETTER SHA, 3382 +MALAYALAM LETTER SSA, 3383 +MALAYALAM LETTER SA, 3384 +MALAYALAM LETTER HA, 3385 +MALAYALAM LETTER TTTA, 3386 +MALAYALAM SIGN AVAGRAHA, 3389 +MALAYALAM VOWEL SIGN AA, 3390 +MALAYALAM VOWEL SIGN I, 3391 +MALAYALAM VOWEL SIGN II, 3392 +MALAYALAM VOWEL SIGN U, 3393 +MALAYALAM VOWEL SIGN UU, 3394 +MALAYALAM VOWEL SIGN VOCALIC R, 3395 +MALAYALAM VOWEL SIGN VOCALIC RR, 3396 +MALAYALAM VOWEL SIGN E, 3398 +MALAYALAM VOWEL SIGN EE, 3399 +MALAYALAM VOWEL SIGN AI, 3400 +MALAYALAM VOWEL SIGN O, 3402 +MALAYALAM VOWEL SIGN OO, 3403 +MALAYALAM VOWEL SIGN AU, 3404 +MALAYALAM SIGN VIRAMA, 3405 +MALAYALAM LETTER DOT REPH, 3406 +MALAYALAM SIGN PARA, 3407 +MALAYALAM LETTER CHILLU M, 3412 +MALAYALAM LETTER CHILLU Y, 3413 +MALAYALAM LETTER CHILLU LLL, 3414 +MALAYALAM AU LENGTH MARK, 3415 +MALAYALAM FRACTION ONE ONE HUNDRED AND SIXTIETH, 3416 +MALAYALAM FRACTION ONE FORTIETH, 3417 +MALAYALAM FRACTION THREE EIGHTIETHS, 3418 +MALAYALAM FRACTION ONE TWENTIETH, 3419 +MALAYALAM FRACTION ONE TENTH, 3420 +MALAYALAM FRACTION THREE TWENTIETHS, 3421 +MALAYALAM FRACTION ONE FIFTH, 3422 +MALAYALAM LETTER ARCHAIC II, 3423 +MALAYALAM LETTER VOCALIC RR, 3424 +MALAYALAM LETTER VOCALIC LL, 3425 +MALAYALAM VOWEL SIGN VOCALIC L, 3426 +MALAYALAM VOWEL SIGN VOCALIC LL, 3427 +MALAYALAM DIGIT ZERO, 3430 +MALAYALAM DIGIT ONE, 3431 +MALAYALAM DIGIT TWO, 3432 +MALAYALAM DIGIT THREE, 3433 +MALAYALAM DIGIT FOUR, 3434 +MALAYALAM DIGIT FIVE, 3435 +MALAYALAM DIGIT SIX, 3436 +MALAYALAM DIGIT SEVEN, 3437 +MALAYALAM DIGIT EIGHT, 3438 +MALAYALAM DIGIT NINE, 3439 +MALAYALAM NUMBER TEN, 3440 +MALAYALAM NUMBER ONE HUNDRED, 3441 +MALAYALAM NUMBER ONE THOUSAND, 3442 +MALAYALAM FRACTION ONE QUARTER, 3443 +MALAYALAM FRACTION ONE HALF, 3444 +MALAYALAM FRACTION THREE QUARTERS, 3445 +MALAYALAM FRACTION ONE SIXTEENTH, 3446 +MALAYALAM FRACTION ONE EIGHTH, 3447 +MALAYALAM FRACTION THREE SIXTEENTHS, 3448 +MALAYALAM DATE MARK, 3449 +MALAYALAM LETTER CHILLU NN, 3450 +MALAYALAM LETTER CHILLU N, 3451 +MALAYALAM LETTER CHILLU RR, 3452 +MALAYALAM LETTER CHILLU L, 3453 +MALAYALAM LETTER CHILLU LL, 3454 +MALAYALAM LETTER CHILLU K, 3455 +SINHALA SIGN ANUSVARAYA, 3458 +SINHALA SIGN VISARGAYA, 3459 +SINHALA LETTER AYANNA, 3461 +SINHALA LETTER AAYANNA, 3462 +SINHALA LETTER AEYANNA, 3463 +SINHALA LETTER AEEYANNA, 3464 +SINHALA LETTER IYANNA, 3465 +SINHALA LETTER IIYANNA, 3466 +SINHALA LETTER UYANNA, 3467 +SINHALA LETTER UUYANNA, 3468 +SINHALA LETTER IRUYANNA, 3469 +SINHALA LETTER IRUUYANNA, 3470 +SINHALA LETTER ILUYANNA, 3471 +SINHALA LETTER ILUUYANNA, 3472 +SINHALA LETTER EYANNA, 3473 +SINHALA LETTER EEYANNA, 3474 +SINHALA LETTER AIYANNA, 3475 +SINHALA LETTER OYANNA, 3476 +SINHALA LETTER OOYANNA, 3477 +SINHALA LETTER AUYANNA, 3478 +SINHALA LETTER ALPAPRAANA KAYANNA, 3482 +SINHALA LETTER MAHAAPRAANA KAYANNA, 3483 +SINHALA LETTER ALPAPRAANA GAYANNA, 3484 +SINHALA LETTER MAHAAPRAANA GAYANNA, 3485 +SINHALA LETTER KANTAJA NAASIKYAYA, 3486 +SINHALA LETTER SANYAKA GAYANNA, 3487 +SINHALA LETTER ALPAPRAANA CAYANNA, 3488 +SINHALA LETTER MAHAAPRAANA CAYANNA, 3489 +SINHALA LETTER ALPAPRAANA JAYANNA, 3490 +SINHALA LETTER MAHAAPRAANA JAYANNA, 3491 +SINHALA LETTER TAALUJA NAASIKYAYA, 3492 +SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA, 3493 +SINHALA LETTER SANYAKA JAYANNA, 3494 +SINHALA LETTER ALPAPRAANA TTAYANNA, 3495 +SINHALA LETTER MAHAAPRAANA TTAYANNA, 3496 +SINHALA LETTER ALPAPRAANA DDAYANNA, 3497 +SINHALA LETTER MAHAAPRAANA DDAYANNA, 3498 +SINHALA LETTER MUURDHAJA NAYANNA, 3499 +SINHALA LETTER SANYAKA DDAYANNA, 3500 +SINHALA LETTER ALPAPRAANA TAYANNA, 3501 +SINHALA LETTER MAHAAPRAANA TAYANNA, 3502 +SINHALA LETTER ALPAPRAANA DAYANNA, 3503 +SINHALA LETTER MAHAAPRAANA DAYANNA, 3504 +SINHALA LETTER DANTAJA NAYANNA, 3505 +SINHALA LETTER SANYAKA DAYANNA, 3507 +SINHALA LETTER ALPAPRAANA PAYANNA, 3508 +SINHALA LETTER MAHAAPRAANA PAYANNA, 3509 +SINHALA LETTER ALPAPRAANA BAYANNA, 3510 +SINHALA LETTER MAHAAPRAANA BAYANNA, 3511 +SINHALA LETTER MAYANNA, 3512 +SINHALA LETTER AMBA BAYANNA, 3513 +SINHALA LETTER YAYANNA, 3514 +SINHALA LETTER RAYANNA, 3515 +SINHALA LETTER DANTAJA LAYANNA, 3517 +SINHALA LETTER VAYANNA, 3520 +SINHALA LETTER TAALUJA SAYANNA, 3521 +SINHALA LETTER MUURDHAJA SAYANNA, 3522 +SINHALA LETTER DANTAJA SAYANNA, 3523 +SINHALA LETTER HAYANNA, 3524 +SINHALA LETTER MUURDHAJA LAYANNA, 3525 +SINHALA LETTER FAYANNA, 3526 +SINHALA SIGN AL LAKUNA, 3530 +SINHALA VOWEL SIGN AELA PILLA, 3535 +SINHALA VOWEL SIGN KETTI AEDA PILLA, 3536 +SINHALA VOWEL SIGN DIGA AEDA PILLA, 3537 +SINHALA VOWEL SIGN KETTI IS PILLA, 3538 +SINHALA VOWEL SIGN DIGA IS PILLA, 3539 +SINHALA VOWEL SIGN KETTI PAA PILLA, 3540 +SINHALA VOWEL SIGN DIGA PAA PILLA, 3542 +SINHALA VOWEL SIGN GAETTA PILLA, 3544 +SINHALA VOWEL SIGN KOMBUVA, 3545 +SINHALA VOWEL SIGN DIGA KOMBUVA, 3546 +SINHALA VOWEL SIGN KOMBU DEKA, 3547 +SINHALA VOWEL SIGN KOMBUVA HAA AELA PILLA, 3548 +SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA PILLA, 3549 +SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA, 3550 +SINHALA VOWEL SIGN GAYANUKITTA, 3551 +SINHALA LITH DIGIT ZERO, 3558 +SINHALA LITH DIGIT ONE, 3559 +SINHALA LITH DIGIT TWO, 3560 +SINHALA LITH DIGIT THREE, 3561 +SINHALA LITH DIGIT FOUR, 3562 +SINHALA LITH DIGIT FIVE, 3563 +SINHALA LITH DIGIT SIX, 3564 +SINHALA LITH DIGIT SEVEN, 3565 +SINHALA LITH DIGIT EIGHT, 3566 +SINHALA LITH DIGIT NINE, 3567 +SINHALA VOWEL SIGN DIGA GAETTA PILLA, 3570 +SINHALA VOWEL SIGN DIGA GAYANUKITTA, 3571 +SINHALA PUNCTUATION KUNDDALIYA, 3572 +THAI CHARACTER KO KAI, 3585 +THAI CHARACTER KHO KHAI, 3586 +THAI CHARACTER KHO KHUAT, 3587 +THAI CHARACTER KHO KHWAI, 3588 +THAI CHARACTER KHO KHON, 3589 +THAI CHARACTER KHO RAKHANG, 3590 +THAI CHARACTER NGO NGU, 3591 +THAI CHARACTER CHO CHAN, 3592 +THAI CHARACTER CHO CHING, 3593 +THAI CHARACTER CHO CHANG, 3594 +THAI CHARACTER SO SO, 3595 +THAI CHARACTER CHO CHOE, 3596 +THAI CHARACTER YO YING, 3597 +THAI CHARACTER DO CHADA, 3598 +THAI CHARACTER TO PATAK, 3599 +THAI CHARACTER THO THAN, 3600 +THAI CHARACTER THO NANGMONTHO, 3601 +THAI CHARACTER THO PHUTHAO, 3602 +THAI CHARACTER NO NEN, 3603 +THAI CHARACTER DO DEK, 3604 +THAI CHARACTER TO TAO, 3605 +THAI CHARACTER THO THUNG, 3606 +THAI CHARACTER THO THAHAN, 3607 +THAI CHARACTER THO THONG, 3608 +THAI CHARACTER NO NU, 3609 +THAI CHARACTER BO BAIMAI, 3610 +THAI CHARACTER PO PLA, 3611 +THAI CHARACTER PHO PHUNG, 3612 +THAI CHARACTER FO FA, 3613 +THAI CHARACTER PHO PHAN, 3614 +THAI CHARACTER FO FAN, 3615 +THAI CHARACTER PHO SAMPHAO, 3616 +THAI CHARACTER MO MA, 3617 +THAI CHARACTER YO YAK, 3618 +THAI CHARACTER RO RUA, 3619 +THAI CHARACTER RU, 3620 +THAI CHARACTER LO LING, 3621 +THAI CHARACTER LU, 3622 +THAI CHARACTER WO WAEN, 3623 +THAI CHARACTER SO SALA, 3624 +THAI CHARACTER SO RUSI, 3625 +THAI CHARACTER SO SUA, 3626 +THAI CHARACTER HO HIP, 3627 +THAI CHARACTER LO CHULA, 3628 +THAI CHARACTER O ANG, 3629 +THAI CHARACTER HO NOKHUK, 3630 +THAI CHARACTER PAIYANNOI, 3631 +THAI CHARACTER SARA A, 3632 +THAI CHARACTER MAI HAN AKAT, 3633 +THAI CHARACTER SARA AA, 3634 +THAI CHARACTER SARA AM, 3635 +THAI CHARACTER SARA I, 3636 +THAI CHARACTER SARA II, 3637 +THAI CHARACTER SARA UE, 3638 +THAI CHARACTER SARA UEE, 3639 +THAI CHARACTER SARA U, 3640 +THAI CHARACTER SARA UU, 3641 +THAI CHARACTER PHINTHU, 3642 +THAI CURRENCY SYMBOL BAHT, 3647 +THAI CHARACTER SARA E, 3648 +THAI CHARACTER SARA AE, 3649 +THAI CHARACTER SARA O, 3650 +THAI CHARACTER SARA AI MAIMUAN, 3651 +THAI CHARACTER SARA AI MAIMALAI, 3652 +THAI CHARACTER LAKKHANGYAO, 3653 +THAI CHARACTER MAIYAMOK, 3654 +THAI CHARACTER MAITAIKHU, 3655 +THAI CHARACTER MAI EK, 3656 +THAI CHARACTER MAI THO, 3657 +THAI CHARACTER MAI TRI, 3658 +THAI CHARACTER MAI CHATTAWA, 3659 +THAI CHARACTER THANTHAKHAT, 3660 +THAI CHARACTER NIKHAHIT, 3661 +THAI CHARACTER YAMAKKAN, 3662 +THAI CHARACTER FONGMAN, 3663 +THAI DIGIT ZERO, 3664 +THAI DIGIT ONE, 3665 +THAI DIGIT TWO, 3666 +THAI DIGIT THREE, 3667 +THAI DIGIT FOUR, 3668 +THAI DIGIT FIVE, 3669 +THAI DIGIT SIX, 3670 +THAI DIGIT SEVEN, 3671 +THAI DIGIT EIGHT, 3672 +THAI DIGIT NINE, 3673 +THAI CHARACTER ANGKHANKHU, 3674 +THAI CHARACTER KHOMUT, 3675 +LAO LETTER KO, 3713 +LAO LETTER KHO SUNG, 3714 +LAO LETTER KHO TAM, 3716 +LAO LETTER NGO, 3719 +LAO LETTER CO, 3720 +LAO LETTER SO TAM, 3722 +LAO LETTER NYO, 3725 +LAO LETTER DO, 3732 +LAO LETTER TO, 3733 +LAO LETTER THO SUNG, 3734 +LAO LETTER THO TAM, 3735 +LAO LETTER NO, 3737 +LAO LETTER BO, 3738 +LAO LETTER PO, 3739 +LAO LETTER PHO SUNG, 3740 +LAO LETTER FO TAM, 3741 +LAO LETTER PHO TAM, 3742 +LAO LETTER FO SUNG, 3743 +LAO LETTER MO, 3745 +LAO LETTER YO, 3746 +LAO LETTER LO LING, 3747 +LAO LETTER LO LOOT, 3749 +LAO LETTER WO, 3751 +LAO LETTER SO SUNG, 3754 +LAO LETTER HO SUNG, 3755 +LAO LETTER O, 3757 +LAO LETTER HO TAM, 3758 +LAO ELLIPSIS, 3759 +LAO VOWEL SIGN A, 3760 +LAO VOWEL SIGN MAI KAN, 3761 +LAO VOWEL SIGN AA, 3762 +LAO VOWEL SIGN AM, 3763 +LAO VOWEL SIGN I, 3764 +LAO VOWEL SIGN II, 3765 +LAO VOWEL SIGN Y, 3766 +LAO VOWEL SIGN YY, 3767 +LAO VOWEL SIGN U, 3768 +LAO VOWEL SIGN UU, 3769 +LAO VOWEL SIGN MAI KON, 3771 +LAO SEMIVOWEL SIGN LO, 3772 +LAO SEMIVOWEL SIGN NYO, 3773 +LAO VOWEL SIGN E, 3776 +LAO VOWEL SIGN EI, 3777 +LAO VOWEL SIGN O, 3778 +LAO VOWEL SIGN AY, 3779 +LAO VOWEL SIGN AI, 3780 +LAO KO LA, 3782 +LAO TONE MAI EK, 3784 +LAO TONE MAI THO, 3785 +LAO TONE MAI TI, 3786 +LAO TONE MAI CATAWA, 3787 +LAO CANCELLATION MARK, 3788 +LAO NIGGAHITA, 3789 +LAO DIGIT ZERO, 3792 +LAO DIGIT ONE, 3793 +LAO DIGIT TWO, 3794 +LAO DIGIT THREE, 3795 +LAO DIGIT FOUR, 3796 +LAO DIGIT FIVE, 3797 +LAO DIGIT SIX, 3798 +LAO DIGIT SEVEN, 3799 +LAO DIGIT EIGHT, 3800 +LAO DIGIT NINE, 3801 +LAO HO NO, 3804 +LAO HO MO, 3805 +LAO LETTER KHMU GO, 3806 +LAO LETTER KHMU NYO, 3807 +TIBETAN SYLLABLE OM, 3840 +TIBETAN MARK GTER YIG MGO TRUNCATED A, 3841 +TIBETAN MARK GTER YIG MGO UM RNAM BCAD MA, 3842 +TIBETAN MARK GTER YIG MGO UM GTER TSHEG MA, 3843 +TIBETAN MARK INITIAL YIG MGO MDUN MA, 3844 +TIBETAN MARK CLOSING YIG MGO SGAB MA, 3845 +TIBETAN MARK CARET YIG MGO PHUR SHAD MA, 3846 +TIBETAN MARK YIG MGO TSHEG SHAD MA, 3847 +TIBETAN MARK SBRUL SHAD, 3848 +TIBETAN MARK BSKUR YIG MGO, 3849 +TIBETAN MARK BKA SHOG YIG MGO, 3850 +TIBETAN MARK INTERSYLLABIC TSHEG, 3851 +TIBETAN MARK DELIMITER TSHEG BSTAR, 3852 +TIBETAN MARK SHAD, 3853 +TIBETAN MARK NYIS SHAD, 3854 +TIBETAN MARK TSHEG SHAD, 3855 +TIBETAN MARK NYIS TSHEG SHAD, 3856 +TIBETAN MARK RIN CHEN SPUNGS SHAD, 3857 +TIBETAN MARK RGYA GRAM SHAD, 3858 +TIBETAN MARK CARET DZUD RTAGS ME LONG CAN, 3859 +TIBETAN MARK GTER TSHEG, 3860 +TIBETAN LOGOTYPE SIGN CHAD RTAGS, 3861 +TIBETAN LOGOTYPE SIGN LHAG RTAGS, 3862 +TIBETAN ASTROLOGICAL SIGN SGRA GCAN CHAR RTAGS, 3863 +TIBETAN ASTROLOGICAL SIGN KHYUD PA, 3864 +TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, 3865 +TIBETAN SIGN RDEL DKAR GCIG, 3866 +TIBETAN SIGN RDEL DKAR GNYIS, 3867 +TIBETAN SIGN RDEL DKAR GSUM, 3868 +TIBETAN SIGN RDEL NAG GCIG, 3869 +TIBETAN SIGN RDEL NAG GNYIS, 3870 +TIBETAN SIGN RDEL DKAR RDEL NAG, 3871 +TIBETAN DIGIT ZERO, 3872 +TIBETAN DIGIT ONE, 3873 +TIBETAN DIGIT TWO, 3874 +TIBETAN DIGIT THREE, 3875 +TIBETAN DIGIT FOUR, 3876 +TIBETAN DIGIT FIVE, 3877 +TIBETAN DIGIT SIX, 3878 +TIBETAN DIGIT SEVEN, 3879 +TIBETAN DIGIT EIGHT, 3880 +TIBETAN DIGIT NINE, 3881 +TIBETAN DIGIT HALF ONE, 3882 +TIBETAN DIGIT HALF TWO, 3883 +TIBETAN DIGIT HALF THREE, 3884 +TIBETAN DIGIT HALF FOUR, 3885 +TIBETAN DIGIT HALF FIVE, 3886 +TIBETAN DIGIT HALF SIX, 3887 +TIBETAN DIGIT HALF SEVEN, 3888 +TIBETAN DIGIT HALF EIGHT, 3889 +TIBETAN DIGIT HALF NINE, 3890 +TIBETAN DIGIT HALF ZERO, 3891 +TIBETAN MARK BSDUS RTAGS, 3892 +TIBETAN MARK NGAS BZUNG NYI ZLA, 3893 +TIBETAN MARK CARET DZUD RTAGS BZHI MIG CAN, 3894 +TIBETAN MARK NGAS BZUNG SGOR RTAGS, 3895 +TIBETAN MARK CHE MGO, 3896 +TIBETAN MARK TSA PHRU, 3897 +TIBETAN MARK GUG RTAGS GYON, 3898 +TIBETAN MARK GUG RTAGS GYAS, 3899 +TIBETAN MARK ANG KHANG GYON, 3900 +TIBETAN MARK ANG KHANG GYAS, 3901 +TIBETAN SIGN YAR TSHES, 3902 +TIBETAN SIGN MAR TSHES, 3903 +TIBETAN LETTER KA, 3904 +TIBETAN LETTER KHA, 3905 +TIBETAN LETTER GA, 3906 +TIBETAN LETTER GHA, 3907 +TIBETAN LETTER NGA, 3908 +TIBETAN LETTER CA, 3909 +TIBETAN LETTER CHA, 3910 +TIBETAN LETTER JA, 3911 +TIBETAN LETTER NYA, 3913 +TIBETAN LETTER TTA, 3914 +TIBETAN LETTER TTHA, 3915 +TIBETAN LETTER DDA, 3916 +TIBETAN LETTER DDHA, 3917 +TIBETAN LETTER NNA, 3918 +TIBETAN LETTER TA, 3919 +TIBETAN LETTER THA, 3920 +TIBETAN LETTER DA, 3921 +TIBETAN LETTER DHA, 3922 +TIBETAN LETTER NA, 3923 +TIBETAN LETTER PA, 3924 +TIBETAN LETTER PHA, 3925 +TIBETAN LETTER BA, 3926 +TIBETAN LETTER BHA, 3927 +TIBETAN LETTER MA, 3928 +TIBETAN LETTER TSA, 3929 +TIBETAN LETTER TSHA, 3930 +TIBETAN LETTER DZA, 3931 +TIBETAN LETTER DZHA, 3932 +TIBETAN LETTER WA, 3933 +TIBETAN LETTER ZHA, 3934 +TIBETAN LETTER ZA, 3935 +TIBETAN LETTER A, 3936 +TIBETAN LETTER YA, 3937 +TIBETAN LETTER RA, 3938 +TIBETAN LETTER LA, 3939 +TIBETAN LETTER SHA, 3940 +TIBETAN LETTER SSA, 3941 +TIBETAN LETTER SA, 3942 +TIBETAN LETTER HA, 3943 +TIBETAN LETTER A, 3944 +TIBETAN LETTER KSSA, 3945 +TIBETAN LETTER FIXED FORM RA, 3946 +TIBETAN LETTER KKA, 3947 +TIBETAN LETTER RRA, 3948 +TIBETAN VOWEL SIGN AA, 3953 +TIBETAN VOWEL SIGN I, 3954 +TIBETAN VOWEL SIGN II, 3955 +TIBETAN VOWEL SIGN U, 3956 +TIBETAN VOWEL SIGN UU, 3957 +TIBETAN VOWEL SIGN VOCALIC R, 3958 +TIBETAN VOWEL SIGN VOCALIC RR, 3959 +TIBETAN VOWEL SIGN VOCALIC L, 3960 +TIBETAN VOWEL SIGN VOCALIC LL, 3961 +TIBETAN VOWEL SIGN E, 3962 +TIBETAN VOWEL SIGN EE, 3963 +TIBETAN VOWEL SIGN O, 3964 +TIBETAN VOWEL SIGN OO, 3965 +TIBETAN SIGN RJES SU NGA RO, 3966 +TIBETAN SIGN RNAM BCAD, 3967 +TIBETAN VOWEL SIGN REVERSED I, 3968 +TIBETAN VOWEL SIGN REVERSED II, 3969 +TIBETAN SIGN NYI ZLA NAA DA, 3970 +TIBETAN SIGN SNA LDAN, 3971 +TIBETAN MARK HALANTA, 3972 +TIBETAN MARK PALUTA, 3973 +TIBETAN SIGN LCI RTAGS, 3974 +TIBETAN SIGN YANG RTAGS, 3975 +TIBETAN SIGN LCE TSA CAN, 3976 +TIBETAN SIGN MCHU CAN, 3977 +TIBETAN SIGN GRU CAN RGYINGS, 3978 +TIBETAN SIGN GRU MED RGYINGS, 3979 +TIBETAN SIGN INVERTED MCHU CAN, 3980 +TIBETAN SUBJOINED SIGN LCE TSA CAN, 3981 +TIBETAN SUBJOINED SIGN MCHU CAN, 3982 +TIBETAN SUBJOINED SIGN INVERTED MCHU CAN, 3983 +TIBETAN SUBJOINED LETTER KA, 3984 +TIBETAN SUBJOINED LETTER KHA, 3985 +TIBETAN SUBJOINED LETTER GA, 3986 +TIBETAN SUBJOINED LETTER GHA, 3987 +TIBETAN SUBJOINED LETTER NGA, 3988 +TIBETAN SUBJOINED LETTER CA, 3989 +TIBETAN SUBJOINED LETTER CHA, 3990 +TIBETAN SUBJOINED LETTER JA, 3991 +TIBETAN SUBJOINED LETTER NYA, 3993 +TIBETAN SUBJOINED LETTER TTA, 3994 +TIBETAN SUBJOINED LETTER TTHA, 3995 +TIBETAN SUBJOINED LETTER DDA, 3996 +TIBETAN SUBJOINED LETTER DDHA, 3997 +TIBETAN SUBJOINED LETTER NNA, 3998 +TIBETAN SUBJOINED LETTER TA, 3999 +TIBETAN SUBJOINED LETTER THA, 4000 +TIBETAN SUBJOINED LETTER DA, 4001 +TIBETAN SUBJOINED LETTER DHA, 4002 +TIBETAN SUBJOINED LETTER NA, 4003 +TIBETAN SUBJOINED LETTER PA, 4004 +TIBETAN SUBJOINED LETTER PHA, 4005 +TIBETAN SUBJOINED LETTER BA, 4006 +TIBETAN SUBJOINED LETTER BHA, 4007 +TIBETAN SUBJOINED LETTER MA, 4008 +TIBETAN SUBJOINED LETTER TSA, 4009 +TIBETAN SUBJOINED LETTER TSHA, 4010 +TIBETAN SUBJOINED LETTER DZA, 4011 +TIBETAN SUBJOINED LETTER DZHA, 4012 +TIBETAN SUBJOINED LETTER WA, 4013 +TIBETAN SUBJOINED LETTER ZHA, 4014 +TIBETAN SUBJOINED LETTER ZA, 4015 +TIBETAN SUBJOINED LETTER A, 4016 +TIBETAN SUBJOINED LETTER YA, 4017 +TIBETAN SUBJOINED LETTER RA, 4018 +TIBETAN SUBJOINED LETTER LA, 4019 +TIBETAN SUBJOINED LETTER SHA, 4020 +TIBETAN SUBJOINED LETTER SSA, 4021 +TIBETAN SUBJOINED LETTER SA, 4022 +TIBETAN SUBJOINED LETTER HA, 4023 +TIBETAN SUBJOINED LETTER A, 4024 +TIBETAN SUBJOINED LETTER KSSA, 4025 +TIBETAN SUBJOINED LETTER FIXED FORM WA, 4026 +TIBETAN SUBJOINED LETTER FIXED FORM YA, 4027 +TIBETAN SUBJOINED LETTER FIXED FORM RA, 4028 +TIBETAN KU RU KHA, 4030 +TIBETAN KU RU KHA BZHI MIG CAN, 4031 +TIBETAN CANTILLATION SIGN HEAVY BEAT, 4032 +TIBETAN CANTILLATION SIGN LIGHT BEAT, 4033 +TIBETAN CANTILLATION SIGN CANG TE U, 4034 +TIBETAN CANTILLATION SIGN SBUB CHAL, 4035 +TIBETAN SYMBOL DRIL BU, 4036 +TIBETAN SYMBOL RDO RJE, 4037 +TIBETAN SYMBOL PADMA GDAN, 4038 +TIBETAN SYMBOL RDO RJE RGYA GRAM, 4039 +TIBETAN SYMBOL PHUR PA, 4040 +TIBETAN SYMBOL NOR BU, 4041 +TIBETAN SYMBOL NOR BU NYIS KHYIL, 4042 +TIBETAN SYMBOL NOR BU GSUM KHYIL, 4043 +TIBETAN SYMBOL NOR BU BZHI KHYIL, 4044 +TIBETAN SIGN RDEL NAG RDEL DKAR, 4046 +TIBETAN SIGN RDEL NAG GSUM, 4047 +TIBETAN MARK BSKA SHOG GI MGO RGYAN, 4048 +TIBETAN MARK MNYAM YIG GI MGO RGYAN, 4049 +TIBETAN MARK NYIS TSHEG, 4050 +TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA, 4051 +TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA, 4052 +RIGHT FACING SVASTI SIGN, 4053 +LEFT FACING SVASTI SIGN, 4054 +RIGHT FACING SVASTI SIGN WITH DOTS, 4055 +LEFT FACING SVASTI SIGN WITH DOTS, 4056 +TIBETAN MARK LEADING MCHAN RTAGS, 4057 +TIBETAN MARK TRAILING MCHAN RTAGS, 4058 +MYANMAR LETTER KA, 4096 +MYANMAR LETTER KHA, 4097 +MYANMAR LETTER GA, 4098 +MYANMAR LETTER GHA, 4099 +MYANMAR LETTER NGA, 4100 +MYANMAR LETTER CA, 4101 +MYANMAR LETTER CHA, 4102 +MYANMAR LETTER JA, 4103 +MYANMAR LETTER JHA, 4104 +MYANMAR LETTER NYA, 4105 +MYANMAR LETTER NNYA, 4106 +MYANMAR LETTER TTA, 4107 +MYANMAR LETTER TTHA, 4108 +MYANMAR LETTER DDA, 4109 +MYANMAR LETTER DDHA, 4110 +MYANMAR LETTER NNA, 4111 +MYANMAR LETTER TA, 4112 +MYANMAR LETTER THA, 4113 +MYANMAR LETTER DA, 4114 +MYANMAR LETTER DHA, 4115 +MYANMAR LETTER NA, 4116 +MYANMAR LETTER PA, 4117 +MYANMAR LETTER PHA, 4118 +MYANMAR LETTER BA, 4119 +MYANMAR LETTER BHA, 4120 +MYANMAR LETTER MA, 4121 +MYANMAR LETTER YA, 4122 +MYANMAR LETTER RA, 4123 +MYANMAR LETTER LA, 4124 +MYANMAR LETTER WA, 4125 +MYANMAR LETTER SA, 4126 +MYANMAR LETTER HA, 4127 +MYANMAR LETTER LLA, 4128 +MYANMAR LETTER A, 4129 +MYANMAR LETTER SHAN A, 4130 +MYANMAR LETTER I, 4131 +MYANMAR LETTER II, 4132 +MYANMAR LETTER U, 4133 +MYANMAR LETTER UU, 4134 +MYANMAR LETTER E, 4135 +MYANMAR LETTER MON E, 4136 +MYANMAR LETTER O, 4137 +MYANMAR LETTER AU, 4138 +MYANMAR VOWEL SIGN TALL AA, 4139 +MYANMAR VOWEL SIGN AA, 4140 +MYANMAR VOWEL SIGN I, 4141 +MYANMAR VOWEL SIGN II, 4142 +MYANMAR VOWEL SIGN U, 4143 +MYANMAR VOWEL SIGN UU, 4144 +MYANMAR VOWEL SIGN E, 4145 +MYANMAR VOWEL SIGN AI, 4146 +MYANMAR VOWEL SIGN MON II, 4147 +MYANMAR VOWEL SIGN MON O, 4148 +MYANMAR VOWEL SIGN E ABOVE, 4149 +MYANMAR SIGN ANUSVARA, 4150 +MYANMAR SIGN DOT BELOW, 4151 +MYANMAR SIGN VISARGA, 4152 +MYANMAR SIGN VIRAMA, 4153 +MYANMAR SIGN ASAT, 4154 +MYANMAR CONSONANT SIGN MEDIAL YA, 4155 +MYANMAR CONSONANT SIGN MEDIAL RA, 4156 +MYANMAR CONSONANT SIGN MEDIAL WA, 4157 +MYANMAR CONSONANT SIGN MEDIAL HA, 4158 +MYANMAR LETTER GREAT SA, 4159 +MYANMAR DIGIT ZERO, 4160 +MYANMAR DIGIT ONE, 4161 +MYANMAR DIGIT TWO, 4162 +MYANMAR DIGIT THREE, 4163 +MYANMAR DIGIT FOUR, 4164 +MYANMAR DIGIT FIVE, 4165 +MYANMAR DIGIT SIX, 4166 +MYANMAR DIGIT SEVEN, 4167 +MYANMAR DIGIT EIGHT, 4168 +MYANMAR DIGIT NINE, 4169 +MYANMAR SIGN LITTLE SECTION, 4170 +MYANMAR SIGN SECTION, 4171 +MYANMAR SYMBOL LOCATIVE, 4172 +MYANMAR SYMBOL COMPLETED, 4173 +MYANMAR SYMBOL AFOREMENTIONED, 4174 +MYANMAR SYMBOL GENITIVE, 4175 +MYANMAR LETTER SHA, 4176 +MYANMAR LETTER SSA, 4177 +MYANMAR LETTER VOCALIC R, 4178 +MYANMAR LETTER VOCALIC RR, 4179 +MYANMAR LETTER VOCALIC L, 4180 +MYANMAR LETTER VOCALIC LL, 4181 +MYANMAR VOWEL SIGN VOCALIC R, 4182 +MYANMAR VOWEL SIGN VOCALIC RR, 4183 +MYANMAR VOWEL SIGN VOCALIC L, 4184 +MYANMAR VOWEL SIGN VOCALIC LL, 4185 +MYANMAR LETTER MON NGA, 4186 +MYANMAR LETTER MON JHA, 4187 +MYANMAR LETTER MON BBA, 4188 +MYANMAR LETTER MON BBE, 4189 +MYANMAR CONSONANT SIGN MON MEDIAL NA, 4190 +MYANMAR CONSONANT SIGN MON MEDIAL MA, 4191 +MYANMAR CONSONANT SIGN MON MEDIAL LA, 4192 +MYANMAR LETTER SGAW KAREN SHA, 4193 +MYANMAR VOWEL SIGN SGAW KAREN EU, 4194 +MYANMAR TONE MARK SGAW KAREN HATHI, 4195 +MYANMAR TONE MARK SGAW KAREN KE PHO, 4196 +MYANMAR LETTER WESTERN PWO KAREN THA, 4197 +MYANMAR LETTER WESTERN PWO KAREN PWA, 4198 +MYANMAR VOWEL SIGN WESTERN PWO KAREN EU, 4199 +MYANMAR VOWEL SIGN WESTERN PWO KAREN UE, 4200 +MYANMAR SIGN WESTERN PWO KAREN TONE 1, 4201 +MYANMAR SIGN WESTERN PWO KAREN TONE 2, 4202 +MYANMAR SIGN WESTERN PWO KAREN TONE 3, 4203 +MYANMAR SIGN WESTERN PWO KAREN TONE 4, 4204 +MYANMAR SIGN WESTERN PWO KAREN TONE 5, 4205 +MYANMAR LETTER EASTERN PWO KAREN NNA, 4206 +MYANMAR LETTER EASTERN PWO KAREN YWA, 4207 +MYANMAR LETTER EASTERN PWO KAREN GHWA, 4208 +MYANMAR VOWEL SIGN GEBA KAREN I, 4209 +MYANMAR VOWEL SIGN KAYAH OE, 4210 +MYANMAR VOWEL SIGN KAYAH U, 4211 +MYANMAR VOWEL SIGN KAYAH EE, 4212 +MYANMAR LETTER SHAN KA, 4213 +MYANMAR LETTER SHAN KHA, 4214 +MYANMAR LETTER SHAN GA, 4215 +MYANMAR LETTER SHAN CA, 4216 +MYANMAR LETTER SHAN ZA, 4217 +MYANMAR LETTER SHAN NYA, 4218 +MYANMAR LETTER SHAN DA, 4219 +MYANMAR LETTER SHAN NA, 4220 +MYANMAR LETTER SHAN PHA, 4221 +MYANMAR LETTER SHAN FA, 4222 +MYANMAR LETTER SHAN BA, 4223 +MYANMAR LETTER SHAN THA, 4224 +MYANMAR LETTER SHAN HA, 4225 +MYANMAR CONSONANT SIGN SHAN MEDIAL WA, 4226 +MYANMAR VOWEL SIGN SHAN AA, 4227 +MYANMAR VOWEL SIGN SHAN E, 4228 +MYANMAR VOWEL SIGN SHAN E ABOVE, 4229 +MYANMAR VOWEL SIGN SHAN FINAL Y, 4230 +MYANMAR SIGN SHAN TONE 2, 4231 +MYANMAR SIGN SHAN TONE 3, 4232 +MYANMAR SIGN SHAN TONE 5, 4233 +MYANMAR SIGN SHAN TONE 6, 4234 +MYANMAR SIGN SHAN COUNCIL TONE 2, 4235 +MYANMAR SIGN SHAN COUNCIL TONE 3, 4236 +MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE, 4237 +MYANMAR LETTER RUMAI PALAUNG FA, 4238 +MYANMAR SIGN RUMAI PALAUNG TONE 5, 4239 +MYANMAR SHAN DIGIT ZERO, 4240 +MYANMAR SHAN DIGIT ONE, 4241 +MYANMAR SHAN DIGIT TWO, 4242 +MYANMAR SHAN DIGIT THREE, 4243 +MYANMAR SHAN DIGIT FOUR, 4244 +MYANMAR SHAN DIGIT FIVE, 4245 +MYANMAR SHAN DIGIT SIX, 4246 +MYANMAR SHAN DIGIT SEVEN, 4247 +MYANMAR SHAN DIGIT EIGHT, 4248 +MYANMAR SHAN DIGIT NINE, 4249 +MYANMAR SIGN KHAMTI TONE 1, 4250 +MYANMAR SIGN KHAMTI TONE 3, 4251 +MYANMAR VOWEL SIGN AITON A, 4252 +MYANMAR VOWEL SIGN AITON AI, 4253 +MYANMAR SYMBOL SHAN ONE, 4254 +MYANMAR SYMBOL SHAN EXCLAMATION, 4255 +GEORGIAN CAPITAL LETTER AN, 4256 +GEORGIAN CAPITAL LETTER BAN, 4257 +GEORGIAN CAPITAL LETTER GAN, 4258 +GEORGIAN CAPITAL LETTER DON, 4259 +GEORGIAN CAPITAL LETTER EN, 4260 +GEORGIAN CAPITAL LETTER VIN, 4261 +GEORGIAN CAPITAL LETTER ZEN, 4262 +GEORGIAN CAPITAL LETTER TAN, 4263 +GEORGIAN CAPITAL LETTER IN, 4264 +GEORGIAN CAPITAL LETTER KAN, 4265 +GEORGIAN CAPITAL LETTER LAS, 4266 +GEORGIAN CAPITAL LETTER MAN, 4267 +GEORGIAN CAPITAL LETTER NAR, 4268 +GEORGIAN CAPITAL LETTER ON, 4269 +GEORGIAN CAPITAL LETTER PAR, 4270 +GEORGIAN CAPITAL LETTER ZHAR, 4271 +GEORGIAN CAPITAL LETTER RAE, 4272 +GEORGIAN CAPITAL LETTER SAN, 4273 +GEORGIAN CAPITAL LETTER TAR, 4274 +GEORGIAN CAPITAL LETTER UN, 4275 +GEORGIAN CAPITAL LETTER PHAR, 4276 +GEORGIAN CAPITAL LETTER KHAR, 4277 +GEORGIAN CAPITAL LETTER GHAN, 4278 +GEORGIAN CAPITAL LETTER QAR, 4279 +GEORGIAN CAPITAL LETTER SHIN, 4280 +GEORGIAN CAPITAL LETTER CHIN, 4281 +GEORGIAN CAPITAL LETTER CAN, 4282 +GEORGIAN CAPITAL LETTER JIL, 4283 +GEORGIAN CAPITAL LETTER CIL, 4284 +GEORGIAN CAPITAL LETTER CHAR, 4285 +GEORGIAN CAPITAL LETTER XAN, 4286 +GEORGIAN CAPITAL LETTER JHAN, 4287 +GEORGIAN CAPITAL LETTER HAE, 4288 +GEORGIAN CAPITAL LETTER HE, 4289 +GEORGIAN CAPITAL LETTER HIE, 4290 +GEORGIAN CAPITAL LETTER WE, 4291 +GEORGIAN CAPITAL LETTER HAR, 4292 +GEORGIAN CAPITAL LETTER HOE, 4293 +GEORGIAN CAPITAL LETTER YN, 4295 +GEORGIAN CAPITAL LETTER AEN, 4301 +GEORGIAN LETTER AN, 4304 +GEORGIAN LETTER BAN, 4305 +GEORGIAN LETTER GAN, 4306 +GEORGIAN LETTER DON, 4307 +GEORGIAN LETTER EN, 4308 +GEORGIAN LETTER VIN, 4309 +GEORGIAN LETTER ZEN, 4310 +GEORGIAN LETTER TAN, 4311 +GEORGIAN LETTER IN, 4312 +GEORGIAN LETTER KAN, 4313 +GEORGIAN LETTER LAS, 4314 +GEORGIAN LETTER MAN, 4315 +GEORGIAN LETTER NAR, 4316 +GEORGIAN LETTER ON, 4317 +GEORGIAN LETTER PAR, 4318 +GEORGIAN LETTER ZHAR, 4319 +GEORGIAN LETTER RAE, 4320 +GEORGIAN LETTER SAN, 4321 +GEORGIAN LETTER TAR, 4322 +GEORGIAN LETTER UN, 4323 +GEORGIAN LETTER PHAR, 4324 +GEORGIAN LETTER KHAR, 4325 +GEORGIAN LETTER GHAN, 4326 +GEORGIAN LETTER QAR, 4327 +GEORGIAN LETTER SHIN, 4328 +GEORGIAN LETTER CHIN, 4329 +GEORGIAN LETTER CAN, 4330 +GEORGIAN LETTER JIL, 4331 +GEORGIAN LETTER CIL, 4332 +GEORGIAN LETTER CHAR, 4333 +GEORGIAN LETTER XAN, 4334 +GEORGIAN LETTER JHAN, 4335 +GEORGIAN LETTER HAE, 4336 +GEORGIAN LETTER HE, 4337 +GEORGIAN LETTER HIE, 4338 +GEORGIAN LETTER WE, 4339 +GEORGIAN LETTER HAR, 4340 +GEORGIAN LETTER HOE, 4341 +GEORGIAN LETTER FI, 4342 +GEORGIAN LETTER YN, 4343 +GEORGIAN LETTER ELIFI, 4344 +GEORGIAN LETTER TURNED GAN, 4345 +GEORGIAN LETTER AIN, 4346 +GEORGIAN PARAGRAPH SEPARATOR, 4347 +MODIFIER LETTER GEORGIAN NAR, 4348 +GEORGIAN LETTER AEN, 4349 +GEORGIAN LETTER HARD SIGN, 4350 +GEORGIAN LETTER LABIAL SIGN, 4351 +HANGUL CHOSEONG KIYEOK, 4352 +HANGUL CHOSEONG SSANGKIYEOK, 4353 +HANGUL CHOSEONG NIEUN, 4354 +HANGUL CHOSEONG TIKEUT, 4355 +HANGUL CHOSEONG SSANGTIKEUT, 4356 +HANGUL CHOSEONG RIEUL, 4357 +HANGUL CHOSEONG MIEUM, 4358 +HANGUL CHOSEONG PIEUP, 4359 +HANGUL CHOSEONG SSANGPIEUP, 4360 +HANGUL CHOSEONG SIOS, 4361 +HANGUL CHOSEONG SSANGSIOS, 4362 +HANGUL CHOSEONG IEUNG, 4363 +HANGUL CHOSEONG CIEUC, 4364 +HANGUL CHOSEONG SSANGCIEUC, 4365 +HANGUL CHOSEONG CHIEUCH, 4366 +HANGUL CHOSEONG KHIEUKH, 4367 +HANGUL CHOSEONG THIEUTH, 4368 +HANGUL CHOSEONG PHIEUPH, 4369 +HANGUL CHOSEONG HIEUH, 4370 +HANGUL CHOSEONG NIEUN KIYEOK, 4371 +HANGUL CHOSEONG SSANGNIEUN, 4372 +HANGUL CHOSEONG NIEUN TIKEUT, 4373 +HANGUL CHOSEONG NIEUN PIEUP, 4374 +HANGUL CHOSEONG TIKEUT KIYEOK, 4375 +HANGUL CHOSEONG RIEUL NIEUN, 4376 +HANGUL CHOSEONG SSANGRIEUL, 4377 +HANGUL CHOSEONG RIEUL HIEUH, 4378 +HANGUL CHOSEONG KAPYEOUNRIEUL, 4379 +HANGUL CHOSEONG MIEUM PIEUP, 4380 +HANGUL CHOSEONG KAPYEOUNMIEUM, 4381 +HANGUL CHOSEONG PIEUP KIYEOK, 4382 +HANGUL CHOSEONG PIEUP NIEUN, 4383 +HANGUL CHOSEONG PIEUP TIKEUT, 4384 +HANGUL CHOSEONG PIEUP SIOS, 4385 +HANGUL CHOSEONG PIEUP SIOS KIYEOK, 4386 +HANGUL CHOSEONG PIEUP SIOS TIKEUT, 4387 +HANGUL CHOSEONG PIEUP SIOS PIEUP, 4388 +HANGUL CHOSEONG PIEUP SSANGSIOS, 4389 +HANGUL CHOSEONG PIEUP SIOS CIEUC, 4390 +HANGUL CHOSEONG PIEUP CIEUC, 4391 +HANGUL CHOSEONG PIEUP CHIEUCH, 4392 +HANGUL CHOSEONG PIEUP THIEUTH, 4393 +HANGUL CHOSEONG PIEUP PHIEUPH, 4394 +HANGUL CHOSEONG KAPYEOUNPIEUP, 4395 +HANGUL CHOSEONG KAPYEOUNSSANGPIEUP, 4396 +HANGUL CHOSEONG SIOS KIYEOK, 4397 +HANGUL CHOSEONG SIOS NIEUN, 4398 +HANGUL CHOSEONG SIOS TIKEUT, 4399 +HANGUL CHOSEONG SIOS RIEUL, 4400 +HANGUL CHOSEONG SIOS MIEUM, 4401 +HANGUL CHOSEONG SIOS PIEUP, 4402 +HANGUL CHOSEONG SIOS PIEUP KIYEOK, 4403 +HANGUL CHOSEONG SIOS SSANGSIOS, 4404 +HANGUL CHOSEONG SIOS IEUNG, 4405 +HANGUL CHOSEONG SIOS CIEUC, 4406 +HANGUL CHOSEONG SIOS CHIEUCH, 4407 +HANGUL CHOSEONG SIOS KHIEUKH, 4408 +HANGUL CHOSEONG SIOS THIEUTH, 4409 +HANGUL CHOSEONG SIOS PHIEUPH, 4410 +HANGUL CHOSEONG SIOS HIEUH, 4411 +HANGUL CHOSEONG CHITUEUMSIOS, 4412 +HANGUL CHOSEONG CHITUEUMSSANGSIOS, 4413 +HANGUL CHOSEONG CEONGCHIEUMSIOS, 4414 +HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS, 4415 +HANGUL CHOSEONG PANSIOS, 4416 +HANGUL CHOSEONG IEUNG KIYEOK, 4417 +HANGUL CHOSEONG IEUNG TIKEUT, 4418 +HANGUL CHOSEONG IEUNG MIEUM, 4419 +HANGUL CHOSEONG IEUNG PIEUP, 4420 +HANGUL CHOSEONG IEUNG SIOS, 4421 +HANGUL CHOSEONG IEUNG PANSIOS, 4422 +HANGUL CHOSEONG SSANGIEUNG, 4423 +HANGUL CHOSEONG IEUNG CIEUC, 4424 +HANGUL CHOSEONG IEUNG CHIEUCH, 4425 +HANGUL CHOSEONG IEUNG THIEUTH, 4426 +HANGUL CHOSEONG IEUNG PHIEUPH, 4427 +HANGUL CHOSEONG YESIEUNG, 4428 +HANGUL CHOSEONG CIEUC IEUNG, 4429 +HANGUL CHOSEONG CHITUEUMCIEUC, 4430 +HANGUL CHOSEONG CHITUEUMSSANGCIEUC, 4431 +HANGUL CHOSEONG CEONGCHIEUMCIEUC, 4432 +HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC, 4433 +HANGUL CHOSEONG CHIEUCH KHIEUKH, 4434 +HANGUL CHOSEONG CHIEUCH HIEUH, 4435 +HANGUL CHOSEONG CHITUEUMCHIEUCH, 4436 +HANGUL CHOSEONG CEONGCHIEUMCHIEUCH, 4437 +HANGUL CHOSEONG PHIEUPH PIEUP, 4438 +HANGUL CHOSEONG KAPYEOUNPHIEUPH, 4439 +HANGUL CHOSEONG SSANGHIEUH, 4440 +HANGUL CHOSEONG YEORINHIEUH, 4441 +HANGUL CHOSEONG KIYEOK TIKEUT, 4442 +HANGUL CHOSEONG NIEUN SIOS, 4443 +HANGUL CHOSEONG NIEUN CIEUC, 4444 +HANGUL CHOSEONG NIEUN HIEUH, 4445 +HANGUL CHOSEONG TIKEUT RIEUL, 4446 +HANGUL CHOSEONG FILLER, 4447 +HANGUL JUNGSEONG FILLER, 4448 +HANGUL JUNGSEONG A, 4449 +HANGUL JUNGSEONG AE, 4450 +HANGUL JUNGSEONG YA, 4451 +HANGUL JUNGSEONG YAE, 4452 +HANGUL JUNGSEONG EO, 4453 +HANGUL JUNGSEONG E, 4454 +HANGUL JUNGSEONG YEO, 4455 +HANGUL JUNGSEONG YE, 4456 +HANGUL JUNGSEONG O, 4457 +HANGUL JUNGSEONG WA, 4458 +HANGUL JUNGSEONG WAE, 4459 +HANGUL JUNGSEONG OE, 4460 +HANGUL JUNGSEONG YO, 4461 +HANGUL JUNGSEONG U, 4462 +HANGUL JUNGSEONG WEO, 4463 +HANGUL JUNGSEONG WE, 4464 +HANGUL JUNGSEONG WI, 4465 +HANGUL JUNGSEONG YU, 4466 +HANGUL JUNGSEONG EU, 4467 +HANGUL JUNGSEONG YI, 4468 +HANGUL JUNGSEONG I, 4469 +HANGUL JUNGSEONG A O, 4470 +HANGUL JUNGSEONG A U, 4471 +HANGUL JUNGSEONG YA O, 4472 +HANGUL JUNGSEONG YA YO, 4473 +HANGUL JUNGSEONG EO O, 4474 +HANGUL JUNGSEONG EO U, 4475 +HANGUL JUNGSEONG EO EU, 4476 +HANGUL JUNGSEONG YEO O, 4477 +HANGUL JUNGSEONG YEO U, 4478 +HANGUL JUNGSEONG O EO, 4479 +HANGUL JUNGSEONG O E, 4480 +HANGUL JUNGSEONG O YE, 4481 +HANGUL JUNGSEONG O O, 4482 +HANGUL JUNGSEONG O U, 4483 +HANGUL JUNGSEONG YO YA, 4484 +HANGUL JUNGSEONG YO YAE, 4485 +HANGUL JUNGSEONG YO YEO, 4486 +HANGUL JUNGSEONG YO O, 4487 +HANGUL JUNGSEONG YO I, 4488 +HANGUL JUNGSEONG U A, 4489 +HANGUL JUNGSEONG U AE, 4490 +HANGUL JUNGSEONG U EO EU, 4491 +HANGUL JUNGSEONG U YE, 4492 +HANGUL JUNGSEONG U U, 4493 +HANGUL JUNGSEONG YU A, 4494 +HANGUL JUNGSEONG YU EO, 4495 +HANGUL JUNGSEONG YU E, 4496 +HANGUL JUNGSEONG YU YEO, 4497 +HANGUL JUNGSEONG YU YE, 4498 +HANGUL JUNGSEONG YU U, 4499 +HANGUL JUNGSEONG YU I, 4500 +HANGUL JUNGSEONG EU U, 4501 +HANGUL JUNGSEONG EU EU, 4502 +HANGUL JUNGSEONG YI U, 4503 +HANGUL JUNGSEONG I A, 4504 +HANGUL JUNGSEONG I YA, 4505 +HANGUL JUNGSEONG I O, 4506 +HANGUL JUNGSEONG I U, 4507 +HANGUL JUNGSEONG I EU, 4508 +HANGUL JUNGSEONG I ARAEA, 4509 +HANGUL JUNGSEONG ARAEA, 4510 +HANGUL JUNGSEONG ARAEA EO, 4511 +HANGUL JUNGSEONG ARAEA U, 4512 +HANGUL JUNGSEONG ARAEA I, 4513 +HANGUL JUNGSEONG SSANGARAEA, 4514 +HANGUL JUNGSEONG A EU, 4515 +HANGUL JUNGSEONG YA U, 4516 +HANGUL JUNGSEONG YEO YA, 4517 +HANGUL JUNGSEONG O YA, 4518 +HANGUL JUNGSEONG O YAE, 4519 +HANGUL JONGSEONG KIYEOK, 4520 +HANGUL JONGSEONG SSANGKIYEOK, 4521 +HANGUL JONGSEONG KIYEOK SIOS, 4522 +HANGUL JONGSEONG NIEUN, 4523 +HANGUL JONGSEONG NIEUN CIEUC, 4524 +HANGUL JONGSEONG NIEUN HIEUH, 4525 +HANGUL JONGSEONG TIKEUT, 4526 +HANGUL JONGSEONG RIEUL, 4527 +HANGUL JONGSEONG RIEUL KIYEOK, 4528 +HANGUL JONGSEONG RIEUL MIEUM, 4529 +HANGUL JONGSEONG RIEUL PIEUP, 4530 +HANGUL JONGSEONG RIEUL SIOS, 4531 +HANGUL JONGSEONG RIEUL THIEUTH, 4532 +HANGUL JONGSEONG RIEUL PHIEUPH, 4533 +HANGUL JONGSEONG RIEUL HIEUH, 4534 +HANGUL JONGSEONG MIEUM, 4535 +HANGUL JONGSEONG PIEUP, 4536 +HANGUL JONGSEONG PIEUP SIOS, 4537 +HANGUL JONGSEONG SIOS, 4538 +HANGUL JONGSEONG SSANGSIOS, 4539 +HANGUL JONGSEONG IEUNG, 4540 +HANGUL JONGSEONG CIEUC, 4541 +HANGUL JONGSEONG CHIEUCH, 4542 +HANGUL JONGSEONG KHIEUKH, 4543 +HANGUL JONGSEONG THIEUTH, 4544 +HANGUL JONGSEONG PHIEUPH, 4545 +HANGUL JONGSEONG HIEUH, 4546 +HANGUL JONGSEONG KIYEOK RIEUL, 4547 +HANGUL JONGSEONG KIYEOK SIOS KIYEOK, 4548 +HANGUL JONGSEONG NIEUN KIYEOK, 4549 +HANGUL JONGSEONG NIEUN TIKEUT, 4550 +HANGUL JONGSEONG NIEUN SIOS, 4551 +HANGUL JONGSEONG NIEUN PANSIOS, 4552 +HANGUL JONGSEONG NIEUN THIEUTH, 4553 +HANGUL JONGSEONG TIKEUT KIYEOK, 4554 +HANGUL JONGSEONG TIKEUT RIEUL, 4555 +HANGUL JONGSEONG RIEUL KIYEOK SIOS, 4556 +HANGUL JONGSEONG RIEUL NIEUN, 4557 +HANGUL JONGSEONG RIEUL TIKEUT, 4558 +HANGUL JONGSEONG RIEUL TIKEUT HIEUH, 4559 +HANGUL JONGSEONG SSANGRIEUL, 4560 +HANGUL JONGSEONG RIEUL MIEUM KIYEOK, 4561 +HANGUL JONGSEONG RIEUL MIEUM SIOS, 4562 +HANGUL JONGSEONG RIEUL PIEUP SIOS, 4563 +HANGUL JONGSEONG RIEUL PIEUP HIEUH, 4564 +HANGUL JONGSEONG RIEUL KAPYEOUNPIEUP, 4565 +HANGUL JONGSEONG RIEUL SSANGSIOS, 4566 +HANGUL JONGSEONG RIEUL PANSIOS, 4567 +HANGUL JONGSEONG RIEUL KHIEUKH, 4568 +HANGUL JONGSEONG RIEUL YEORINHIEUH, 4569 +HANGUL JONGSEONG MIEUM KIYEOK, 4570 +HANGUL JONGSEONG MIEUM RIEUL, 4571 +HANGUL JONGSEONG MIEUM PIEUP, 4572 +HANGUL JONGSEONG MIEUM SIOS, 4573 +HANGUL JONGSEONG MIEUM SSANGSIOS, 4574 +HANGUL JONGSEONG MIEUM PANSIOS, 4575 +HANGUL JONGSEONG MIEUM CHIEUCH, 4576 +HANGUL JONGSEONG MIEUM HIEUH, 4577 +HANGUL JONGSEONG KAPYEOUNMIEUM, 4578 +HANGUL JONGSEONG PIEUP RIEUL, 4579 +HANGUL JONGSEONG PIEUP PHIEUPH, 4580 +HANGUL JONGSEONG PIEUP HIEUH, 4581 +HANGUL JONGSEONG KAPYEOUNPIEUP, 4582 +HANGUL JONGSEONG SIOS KIYEOK, 4583 +HANGUL JONGSEONG SIOS TIKEUT, 4584 +HANGUL JONGSEONG SIOS RIEUL, 4585 +HANGUL JONGSEONG SIOS PIEUP, 4586 +HANGUL JONGSEONG PANSIOS, 4587 +HANGUL JONGSEONG IEUNG KIYEOK, 4588 +HANGUL JONGSEONG IEUNG SSANGKIYEOK, 4589 +HANGUL JONGSEONG SSANGIEUNG, 4590 +HANGUL JONGSEONG IEUNG KHIEUKH, 4591 +HANGUL JONGSEONG YESIEUNG, 4592 +HANGUL JONGSEONG YESIEUNG SIOS, 4593 +HANGUL JONGSEONG YESIEUNG PANSIOS, 4594 +HANGUL JONGSEONG PHIEUPH PIEUP, 4595 +HANGUL JONGSEONG KAPYEOUNPHIEUPH, 4596 +HANGUL JONGSEONG HIEUH NIEUN, 4597 +HANGUL JONGSEONG HIEUH RIEUL, 4598 +HANGUL JONGSEONG HIEUH MIEUM, 4599 +HANGUL JONGSEONG HIEUH PIEUP, 4600 +HANGUL JONGSEONG YEORINHIEUH, 4601 +HANGUL JONGSEONG KIYEOK NIEUN, 4602 +HANGUL JONGSEONG KIYEOK PIEUP, 4603 +HANGUL JONGSEONG KIYEOK CHIEUCH, 4604 +HANGUL JONGSEONG KIYEOK KHIEUKH, 4605 +HANGUL JONGSEONG KIYEOK HIEUH, 4606 +HANGUL JONGSEONG SSANGNIEUN, 4607 +ETHIOPIC SYLLABLE HA, 4608 +ETHIOPIC SYLLABLE HU, 4609 +ETHIOPIC SYLLABLE HI, 4610 +ETHIOPIC SYLLABLE HAA, 4611 +ETHIOPIC SYLLABLE HEE, 4612 +ETHIOPIC SYLLABLE HE, 4613 +ETHIOPIC SYLLABLE HO, 4614 +ETHIOPIC SYLLABLE HOA, 4615 +ETHIOPIC SYLLABLE LA, 4616 +ETHIOPIC SYLLABLE LU, 4617 +ETHIOPIC SYLLABLE LI, 4618 +ETHIOPIC SYLLABLE LAA, 4619 +ETHIOPIC SYLLABLE LEE, 4620 +ETHIOPIC SYLLABLE LE, 4621 +ETHIOPIC SYLLABLE LO, 4622 +ETHIOPIC SYLLABLE LWA, 4623 +ETHIOPIC SYLLABLE HHA, 4624 +ETHIOPIC SYLLABLE HHU, 4625 +ETHIOPIC SYLLABLE HHI, 4626 +ETHIOPIC SYLLABLE HHAA, 4627 +ETHIOPIC SYLLABLE HHEE, 4628 +ETHIOPIC SYLLABLE HHE, 4629 +ETHIOPIC SYLLABLE HHO, 4630 +ETHIOPIC SYLLABLE HHWA, 4631 +ETHIOPIC SYLLABLE MA, 4632 +ETHIOPIC SYLLABLE MU, 4633 +ETHIOPIC SYLLABLE MI, 4634 +ETHIOPIC SYLLABLE MAA, 4635 +ETHIOPIC SYLLABLE MEE, 4636 +ETHIOPIC SYLLABLE ME, 4637 +ETHIOPIC SYLLABLE MO, 4638 +ETHIOPIC SYLLABLE MWA, 4639 +ETHIOPIC SYLLABLE SZA, 4640 +ETHIOPIC SYLLABLE SZU, 4641 +ETHIOPIC SYLLABLE SZI, 4642 +ETHIOPIC SYLLABLE SZAA, 4643 +ETHIOPIC SYLLABLE SZEE, 4644 +ETHIOPIC SYLLABLE SZE, 4645 +ETHIOPIC SYLLABLE SZO, 4646 +ETHIOPIC SYLLABLE SZWA, 4647 +ETHIOPIC SYLLABLE RA, 4648 +ETHIOPIC SYLLABLE RU, 4649 +ETHIOPIC SYLLABLE RI, 4650 +ETHIOPIC SYLLABLE RAA, 4651 +ETHIOPIC SYLLABLE REE, 4652 +ETHIOPIC SYLLABLE RE, 4653 +ETHIOPIC SYLLABLE RO, 4654 +ETHIOPIC SYLLABLE RWA, 4655 +ETHIOPIC SYLLABLE SA, 4656 +ETHIOPIC SYLLABLE SU, 4657 +ETHIOPIC SYLLABLE SI, 4658 +ETHIOPIC SYLLABLE SAA, 4659 +ETHIOPIC SYLLABLE SEE, 4660 +ETHIOPIC SYLLABLE SE, 4661 +ETHIOPIC SYLLABLE SO, 4662 +ETHIOPIC SYLLABLE SWA, 4663 +ETHIOPIC SYLLABLE SHA, 4664 +ETHIOPIC SYLLABLE SHU, 4665 +ETHIOPIC SYLLABLE SHI, 4666 +ETHIOPIC SYLLABLE SHAA, 4667 +ETHIOPIC SYLLABLE SHEE, 4668 +ETHIOPIC SYLLABLE SHE, 4669 +ETHIOPIC SYLLABLE SHO, 4670 +ETHIOPIC SYLLABLE SHWA, 4671 +ETHIOPIC SYLLABLE QA, 4672 +ETHIOPIC SYLLABLE QU, 4673 +ETHIOPIC SYLLABLE QI, 4674 +ETHIOPIC SYLLABLE QAA, 4675 +ETHIOPIC SYLLABLE QEE, 4676 +ETHIOPIC SYLLABLE QE, 4677 +ETHIOPIC SYLLABLE QO, 4678 +ETHIOPIC SYLLABLE QOA, 4679 +ETHIOPIC SYLLABLE QWA, 4680 +ETHIOPIC SYLLABLE QWI, 4682 +ETHIOPIC SYLLABLE QWAA, 4683 +ETHIOPIC SYLLABLE QWEE, 4684 +ETHIOPIC SYLLABLE QWE, 4685 +ETHIOPIC SYLLABLE QHA, 4688 +ETHIOPIC SYLLABLE QHU, 4689 +ETHIOPIC SYLLABLE QHI, 4690 +ETHIOPIC SYLLABLE QHAA, 4691 +ETHIOPIC SYLLABLE QHEE, 4692 +ETHIOPIC SYLLABLE QHE, 4693 +ETHIOPIC SYLLABLE QHO, 4694 +ETHIOPIC SYLLABLE QHWA, 4696 +ETHIOPIC SYLLABLE QHWI, 4698 +ETHIOPIC SYLLABLE QHWAA, 4699 +ETHIOPIC SYLLABLE QHWEE, 4700 +ETHIOPIC SYLLABLE QHWE, 4701 +ETHIOPIC SYLLABLE BA, 4704 +ETHIOPIC SYLLABLE BU, 4705 +ETHIOPIC SYLLABLE BI, 4706 +ETHIOPIC SYLLABLE BAA, 4707 +ETHIOPIC SYLLABLE BEE, 4708 +ETHIOPIC SYLLABLE BE, 4709 +ETHIOPIC SYLLABLE BO, 4710 +ETHIOPIC SYLLABLE BWA, 4711 +ETHIOPIC SYLLABLE VA, 4712 +ETHIOPIC SYLLABLE VU, 4713 +ETHIOPIC SYLLABLE VI, 4714 +ETHIOPIC SYLLABLE VAA, 4715 +ETHIOPIC SYLLABLE VEE, 4716 +ETHIOPIC SYLLABLE VE, 4717 +ETHIOPIC SYLLABLE VO, 4718 +ETHIOPIC SYLLABLE VWA, 4719 +ETHIOPIC SYLLABLE TA, 4720 +ETHIOPIC SYLLABLE TU, 4721 +ETHIOPIC SYLLABLE TI, 4722 +ETHIOPIC SYLLABLE TAA, 4723 +ETHIOPIC SYLLABLE TEE, 4724 +ETHIOPIC SYLLABLE TE, 4725 +ETHIOPIC SYLLABLE TO, 4726 +ETHIOPIC SYLLABLE TWA, 4727 +ETHIOPIC SYLLABLE CA, 4728 +ETHIOPIC SYLLABLE CU, 4729 +ETHIOPIC SYLLABLE CI, 4730 +ETHIOPIC SYLLABLE CAA, 4731 +ETHIOPIC SYLLABLE CEE, 4732 +ETHIOPIC SYLLABLE CE, 4733 +ETHIOPIC SYLLABLE CO, 4734 +ETHIOPIC SYLLABLE CWA, 4735 +ETHIOPIC SYLLABLE XA, 4736 +ETHIOPIC SYLLABLE XU, 4737 +ETHIOPIC SYLLABLE XI, 4738 +ETHIOPIC SYLLABLE XAA, 4739 +ETHIOPIC SYLLABLE XEE, 4740 +ETHIOPIC SYLLABLE XE, 4741 +ETHIOPIC SYLLABLE XO, 4742 +ETHIOPIC SYLLABLE XOA, 4743 +ETHIOPIC SYLLABLE XWA, 4744 +ETHIOPIC SYLLABLE XWI, 4746 +ETHIOPIC SYLLABLE XWAA, 4747 +ETHIOPIC SYLLABLE XWEE, 4748 +ETHIOPIC SYLLABLE XWE, 4749 +ETHIOPIC SYLLABLE NA, 4752 +ETHIOPIC SYLLABLE NU, 4753 +ETHIOPIC SYLLABLE NI, 4754 +ETHIOPIC SYLLABLE NAA, 4755 +ETHIOPIC SYLLABLE NEE, 4756 +ETHIOPIC SYLLABLE NE, 4757 +ETHIOPIC SYLLABLE NO, 4758 +ETHIOPIC SYLLABLE NWA, 4759 +ETHIOPIC SYLLABLE NYA, 4760 +ETHIOPIC SYLLABLE NYU, 4761 +ETHIOPIC SYLLABLE NYI, 4762 +ETHIOPIC SYLLABLE NYAA, 4763 +ETHIOPIC SYLLABLE NYEE, 4764 +ETHIOPIC SYLLABLE NYE, 4765 +ETHIOPIC SYLLABLE NYO, 4766 +ETHIOPIC SYLLABLE NYWA, 4767 +ETHIOPIC SYLLABLE GLOTTAL A, 4768 +ETHIOPIC SYLLABLE GLOTTAL U, 4769 +ETHIOPIC SYLLABLE GLOTTAL I, 4770 +ETHIOPIC SYLLABLE GLOTTAL AA, 4771 +ETHIOPIC SYLLABLE GLOTTAL EE, 4772 +ETHIOPIC SYLLABLE GLOTTAL E, 4773 +ETHIOPIC SYLLABLE GLOTTAL O, 4774 +ETHIOPIC SYLLABLE GLOTTAL WA, 4775 +ETHIOPIC SYLLABLE KA, 4776 +ETHIOPIC SYLLABLE KU, 4777 +ETHIOPIC SYLLABLE KI, 4778 +ETHIOPIC SYLLABLE KAA, 4779 +ETHIOPIC SYLLABLE KEE, 4780 +ETHIOPIC SYLLABLE KE, 4781 +ETHIOPIC SYLLABLE KO, 4782 +ETHIOPIC SYLLABLE KOA, 4783 +ETHIOPIC SYLLABLE KWA, 4784 +ETHIOPIC SYLLABLE KWI, 4786 +ETHIOPIC SYLLABLE KWAA, 4787 +ETHIOPIC SYLLABLE KWEE, 4788 +ETHIOPIC SYLLABLE KWE, 4789 +ETHIOPIC SYLLABLE KXA, 4792 +ETHIOPIC SYLLABLE KXU, 4793 +ETHIOPIC SYLLABLE KXI, 4794 +ETHIOPIC SYLLABLE KXAA, 4795 +ETHIOPIC SYLLABLE KXEE, 4796 +ETHIOPIC SYLLABLE KXE, 4797 +ETHIOPIC SYLLABLE KXO, 4798 +ETHIOPIC SYLLABLE KXWA, 4800 +ETHIOPIC SYLLABLE KXWI, 4802 +ETHIOPIC SYLLABLE KXWAA, 4803 +ETHIOPIC SYLLABLE KXWEE, 4804 +ETHIOPIC SYLLABLE KXWE, 4805 +ETHIOPIC SYLLABLE WA, 4808 +ETHIOPIC SYLLABLE WU, 4809 +ETHIOPIC SYLLABLE WI, 4810 +ETHIOPIC SYLLABLE WAA, 4811 +ETHIOPIC SYLLABLE WEE, 4812 +ETHIOPIC SYLLABLE WE, 4813 +ETHIOPIC SYLLABLE WO, 4814 +ETHIOPIC SYLLABLE WOA, 4815 +ETHIOPIC SYLLABLE PHARYNGEAL A, 4816 +ETHIOPIC SYLLABLE PHARYNGEAL U, 4817 +ETHIOPIC SYLLABLE PHARYNGEAL I, 4818 +ETHIOPIC SYLLABLE PHARYNGEAL AA, 4819 +ETHIOPIC SYLLABLE PHARYNGEAL EE, 4820 +ETHIOPIC SYLLABLE PHARYNGEAL E, 4821 +ETHIOPIC SYLLABLE PHARYNGEAL O, 4822 +ETHIOPIC SYLLABLE ZA, 4824 +ETHIOPIC SYLLABLE ZU, 4825 +ETHIOPIC SYLLABLE ZI, 4826 +ETHIOPIC SYLLABLE ZAA, 4827 +ETHIOPIC SYLLABLE ZEE, 4828 +ETHIOPIC SYLLABLE ZE, 4829 +ETHIOPIC SYLLABLE ZO, 4830 +ETHIOPIC SYLLABLE ZWA, 4831 +ETHIOPIC SYLLABLE ZHA, 4832 +ETHIOPIC SYLLABLE ZHU, 4833 +ETHIOPIC SYLLABLE ZHI, 4834 +ETHIOPIC SYLLABLE ZHAA, 4835 +ETHIOPIC SYLLABLE ZHEE, 4836 +ETHIOPIC SYLLABLE ZHE, 4837 +ETHIOPIC SYLLABLE ZHO, 4838 +ETHIOPIC SYLLABLE ZHWA, 4839 +ETHIOPIC SYLLABLE YA, 4840 +ETHIOPIC SYLLABLE YU, 4841 +ETHIOPIC SYLLABLE YI, 4842 +ETHIOPIC SYLLABLE YAA, 4843 +ETHIOPIC SYLLABLE YEE, 4844 +ETHIOPIC SYLLABLE YE, 4845 +ETHIOPIC SYLLABLE YO, 4846 +ETHIOPIC SYLLABLE YOA, 4847 +ETHIOPIC SYLLABLE DA, 4848 +ETHIOPIC SYLLABLE DU, 4849 +ETHIOPIC SYLLABLE DI, 4850 +ETHIOPIC SYLLABLE DAA, 4851 +ETHIOPIC SYLLABLE DEE, 4852 +ETHIOPIC SYLLABLE DE, 4853 +ETHIOPIC SYLLABLE DO, 4854 +ETHIOPIC SYLLABLE DWA, 4855 +ETHIOPIC SYLLABLE DDA, 4856 +ETHIOPIC SYLLABLE DDU, 4857 +ETHIOPIC SYLLABLE DDI, 4858 +ETHIOPIC SYLLABLE DDAA, 4859 +ETHIOPIC SYLLABLE DDEE, 4860 +ETHIOPIC SYLLABLE DDE, 4861 +ETHIOPIC SYLLABLE DDO, 4862 +ETHIOPIC SYLLABLE DDWA, 4863 +ETHIOPIC SYLLABLE JA, 4864 +ETHIOPIC SYLLABLE JU, 4865 +ETHIOPIC SYLLABLE JI, 4866 +ETHIOPIC SYLLABLE JAA, 4867 +ETHIOPIC SYLLABLE JEE, 4868 +ETHIOPIC SYLLABLE JE, 4869 +ETHIOPIC SYLLABLE JO, 4870 +ETHIOPIC SYLLABLE JWA, 4871 +ETHIOPIC SYLLABLE GA, 4872 +ETHIOPIC SYLLABLE GU, 4873 +ETHIOPIC SYLLABLE GI, 4874 +ETHIOPIC SYLLABLE GAA, 4875 +ETHIOPIC SYLLABLE GEE, 4876 +ETHIOPIC SYLLABLE GE, 4877 +ETHIOPIC SYLLABLE GO, 4878 +ETHIOPIC SYLLABLE GOA, 4879 +ETHIOPIC SYLLABLE GWA, 4880 +ETHIOPIC SYLLABLE GWI, 4882 +ETHIOPIC SYLLABLE GWAA, 4883 +ETHIOPIC SYLLABLE GWEE, 4884 +ETHIOPIC SYLLABLE GWE, 4885 +ETHIOPIC SYLLABLE GGA, 4888 +ETHIOPIC SYLLABLE GGU, 4889 +ETHIOPIC SYLLABLE GGI, 4890 +ETHIOPIC SYLLABLE GGAA, 4891 +ETHIOPIC SYLLABLE GGEE, 4892 +ETHIOPIC SYLLABLE GGE, 4893 +ETHIOPIC SYLLABLE GGO, 4894 +ETHIOPIC SYLLABLE GGWAA, 4895 +ETHIOPIC SYLLABLE THA, 4896 +ETHIOPIC SYLLABLE THU, 4897 +ETHIOPIC SYLLABLE THI, 4898 +ETHIOPIC SYLLABLE THAA, 4899 +ETHIOPIC SYLLABLE THEE, 4900 +ETHIOPIC SYLLABLE THE, 4901 +ETHIOPIC SYLLABLE THO, 4902 +ETHIOPIC SYLLABLE THWA, 4903 +ETHIOPIC SYLLABLE CHA, 4904 +ETHIOPIC SYLLABLE CHU, 4905 +ETHIOPIC SYLLABLE CHI, 4906 +ETHIOPIC SYLLABLE CHAA, 4907 +ETHIOPIC SYLLABLE CHEE, 4908 +ETHIOPIC SYLLABLE CHE, 4909 +ETHIOPIC SYLLABLE CHO, 4910 +ETHIOPIC SYLLABLE CHWA, 4911 +ETHIOPIC SYLLABLE PHA, 4912 +ETHIOPIC SYLLABLE PHU, 4913 +ETHIOPIC SYLLABLE PHI, 4914 +ETHIOPIC SYLLABLE PHAA, 4915 +ETHIOPIC SYLLABLE PHEE, 4916 +ETHIOPIC SYLLABLE PHE, 4917 +ETHIOPIC SYLLABLE PHO, 4918 +ETHIOPIC SYLLABLE PHWA, 4919 +ETHIOPIC SYLLABLE TSA, 4920 +ETHIOPIC SYLLABLE TSU, 4921 +ETHIOPIC SYLLABLE TSI, 4922 +ETHIOPIC SYLLABLE TSAA, 4923 +ETHIOPIC SYLLABLE TSEE, 4924 +ETHIOPIC SYLLABLE TSE, 4925 +ETHIOPIC SYLLABLE TSO, 4926 +ETHIOPIC SYLLABLE TSWA, 4927 +ETHIOPIC SYLLABLE TZA, 4928 +ETHIOPIC SYLLABLE TZU, 4929 +ETHIOPIC SYLLABLE TZI, 4930 +ETHIOPIC SYLLABLE TZAA, 4931 +ETHIOPIC SYLLABLE TZEE, 4932 +ETHIOPIC SYLLABLE TZE, 4933 +ETHIOPIC SYLLABLE TZO, 4934 +ETHIOPIC SYLLABLE TZOA, 4935 +ETHIOPIC SYLLABLE FA, 4936 +ETHIOPIC SYLLABLE FU, 4937 +ETHIOPIC SYLLABLE FI, 4938 +ETHIOPIC SYLLABLE FAA, 4939 +ETHIOPIC SYLLABLE FEE, 4940 +ETHIOPIC SYLLABLE FE, 4941 +ETHIOPIC SYLLABLE FO, 4942 +ETHIOPIC SYLLABLE FWA, 4943 +ETHIOPIC SYLLABLE PA, 4944 +ETHIOPIC SYLLABLE PU, 4945 +ETHIOPIC SYLLABLE PI, 4946 +ETHIOPIC SYLLABLE PAA, 4947 +ETHIOPIC SYLLABLE PEE, 4948 +ETHIOPIC SYLLABLE PE, 4949 +ETHIOPIC SYLLABLE PO, 4950 +ETHIOPIC SYLLABLE PWA, 4951 +ETHIOPIC SYLLABLE RYA, 4952 +ETHIOPIC SYLLABLE MYA, 4953 +ETHIOPIC SYLLABLE FYA, 4954 +ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK, 4957 +ETHIOPIC COMBINING VOWEL LENGTH MARK, 4958 +ETHIOPIC COMBINING GEMINATION MARK, 4959 +ETHIOPIC SECTION MARK, 4960 +ETHIOPIC WORDSPACE, 4961 +ETHIOPIC FULL STOP, 4962 +ETHIOPIC COMMA, 4963 +ETHIOPIC SEMICOLON, 4964 +ETHIOPIC COLON, 4965 +ETHIOPIC PREFACE COLON, 4966 +ETHIOPIC QUESTION MARK, 4967 +ETHIOPIC PARAGRAPH SEPARATOR, 4968 +ETHIOPIC DIGIT ONE, 4969 +ETHIOPIC DIGIT TWO, 4970 +ETHIOPIC DIGIT THREE, 4971 +ETHIOPIC DIGIT FOUR, 4972 +ETHIOPIC DIGIT FIVE, 4973 +ETHIOPIC DIGIT SIX, 4974 +ETHIOPIC DIGIT SEVEN, 4975 +ETHIOPIC DIGIT EIGHT, 4976 +ETHIOPIC DIGIT NINE, 4977 +ETHIOPIC NUMBER TEN, 4978 +ETHIOPIC NUMBER TWENTY, 4979 +ETHIOPIC NUMBER THIRTY, 4980 +ETHIOPIC NUMBER FORTY, 4981 +ETHIOPIC NUMBER FIFTY, 4982 +ETHIOPIC NUMBER SIXTY, 4983 +ETHIOPIC NUMBER SEVENTY, 4984 +ETHIOPIC NUMBER EIGHTY, 4985 +ETHIOPIC NUMBER NINETY, 4986 +ETHIOPIC NUMBER HUNDRED, 4987 +ETHIOPIC NUMBER TEN THOUSAND, 4988 +ETHIOPIC SYLLABLE SEBATBEIT MWA, 4992 +ETHIOPIC SYLLABLE MWI, 4993 +ETHIOPIC SYLLABLE MWEE, 4994 +ETHIOPIC SYLLABLE MWE, 4995 +ETHIOPIC SYLLABLE SEBATBEIT BWA, 4996 +ETHIOPIC SYLLABLE BWI, 4997 +ETHIOPIC SYLLABLE BWEE, 4998 +ETHIOPIC SYLLABLE BWE, 4999 +ETHIOPIC SYLLABLE SEBATBEIT FWA, 5000 +ETHIOPIC SYLLABLE FWI, 5001 +ETHIOPIC SYLLABLE FWEE, 5002 +ETHIOPIC SYLLABLE FWE, 5003 +ETHIOPIC SYLLABLE SEBATBEIT PWA, 5004 +ETHIOPIC SYLLABLE PWI, 5005 +ETHIOPIC SYLLABLE PWEE, 5006 +ETHIOPIC SYLLABLE PWE, 5007 +ETHIOPIC TONAL MARK YIZET, 5008 +ETHIOPIC TONAL MARK DERET, 5009 +ETHIOPIC TONAL MARK RIKRIK, 5010 +ETHIOPIC TONAL MARK SHORT RIKRIK, 5011 +ETHIOPIC TONAL MARK DIFAT, 5012 +ETHIOPIC TONAL MARK KENAT, 5013 +ETHIOPIC TONAL MARK CHIRET, 5014 +ETHIOPIC TONAL MARK HIDET, 5015 +ETHIOPIC TONAL MARK DERET HIDET, 5016 +ETHIOPIC TONAL MARK KURT, 5017 +CHEROKEE LETTER A, 5024 +CHEROKEE LETTER E, 5025 +CHEROKEE LETTER I, 5026 +CHEROKEE LETTER O, 5027 +CHEROKEE LETTER U, 5028 +CHEROKEE LETTER V, 5029 +CHEROKEE LETTER GA, 5030 +CHEROKEE LETTER KA, 5031 +CHEROKEE LETTER GE, 5032 +CHEROKEE LETTER GI, 5033 +CHEROKEE LETTER GO, 5034 +CHEROKEE LETTER GU, 5035 +CHEROKEE LETTER GV, 5036 +CHEROKEE LETTER HA, 5037 +CHEROKEE LETTER HE, 5038 +CHEROKEE LETTER HI, 5039 +CHEROKEE LETTER HO, 5040 +CHEROKEE LETTER HU, 5041 +CHEROKEE LETTER HV, 5042 +CHEROKEE LETTER LA, 5043 +CHEROKEE LETTER LE, 5044 +CHEROKEE LETTER LI, 5045 +CHEROKEE LETTER LO, 5046 +CHEROKEE LETTER LU, 5047 +CHEROKEE LETTER LV, 5048 +CHEROKEE LETTER MA, 5049 +CHEROKEE LETTER ME, 5050 +CHEROKEE LETTER MI, 5051 +CHEROKEE LETTER MO, 5052 +CHEROKEE LETTER MU, 5053 +CHEROKEE LETTER NA, 5054 +CHEROKEE LETTER HNA, 5055 +CHEROKEE LETTER NAH, 5056 +CHEROKEE LETTER NE, 5057 +CHEROKEE LETTER NI, 5058 +CHEROKEE LETTER NO, 5059 +CHEROKEE LETTER NU, 5060 +CHEROKEE LETTER NV, 5061 +CHEROKEE LETTER QUA, 5062 +CHEROKEE LETTER QUE, 5063 +CHEROKEE LETTER QUI, 5064 +CHEROKEE LETTER QUO, 5065 +CHEROKEE LETTER QUU, 5066 +CHEROKEE LETTER QUV, 5067 +CHEROKEE LETTER SA, 5068 +CHEROKEE LETTER S, 5069 +CHEROKEE LETTER SE, 5070 +CHEROKEE LETTER SI, 5071 +CHEROKEE LETTER SO, 5072 +CHEROKEE LETTER SU, 5073 +CHEROKEE LETTER SV, 5074 +CHEROKEE LETTER DA, 5075 +CHEROKEE LETTER TA, 5076 +CHEROKEE LETTER DE, 5077 +CHEROKEE LETTER TE, 5078 +CHEROKEE LETTER DI, 5079 +CHEROKEE LETTER TI, 5080 +CHEROKEE LETTER DO, 5081 +CHEROKEE LETTER DU, 5082 +CHEROKEE LETTER DV, 5083 +CHEROKEE LETTER DLA, 5084 +CHEROKEE LETTER TLA, 5085 +CHEROKEE LETTER TLE, 5086 +CHEROKEE LETTER TLI, 5087 +CHEROKEE LETTER TLO, 5088 +CHEROKEE LETTER TLU, 5089 +CHEROKEE LETTER TLV, 5090 +CHEROKEE LETTER TSA, 5091 +CHEROKEE LETTER TSE, 5092 +CHEROKEE LETTER TSI, 5093 +CHEROKEE LETTER TSO, 5094 +CHEROKEE LETTER TSU, 5095 +CHEROKEE LETTER TSV, 5096 +CHEROKEE LETTER WA, 5097 +CHEROKEE LETTER WE, 5098 +CHEROKEE LETTER WI, 5099 +CHEROKEE LETTER WO, 5100 +CHEROKEE LETTER WU, 5101 +CHEROKEE LETTER WV, 5102 +CHEROKEE LETTER YA, 5103 +CHEROKEE LETTER YE, 5104 +CHEROKEE LETTER YI, 5105 +CHEROKEE LETTER YO, 5106 +CHEROKEE LETTER YU, 5107 +CHEROKEE LETTER YV, 5108 +CHEROKEE LETTER MV, 5109 +CHEROKEE SMALL LETTER YE, 5112 +CHEROKEE SMALL LETTER YI, 5113 +CHEROKEE SMALL LETTER YO, 5114 +CHEROKEE SMALL LETTER YU, 5115 +CHEROKEE SMALL LETTER YV, 5116 +CHEROKEE SMALL LETTER MV, 5117 +CANADIAN SYLLABICS HYPHEN, 5120 +CANADIAN SYLLABICS E, 5121 +CANADIAN SYLLABICS AAI, 5122 +CANADIAN SYLLABICS I, 5123 +CANADIAN SYLLABICS II, 5124 +CANADIAN SYLLABICS O, 5125 +CANADIAN SYLLABICS OO, 5126 +CANADIAN SYLLABICS Y CREE OO, 5127 +CANADIAN SYLLABICS CARRIER EE, 5128 +CANADIAN SYLLABICS CARRIER I, 5129 +CANADIAN SYLLABICS A, 5130 +CANADIAN SYLLABICS AA, 5131 +CANADIAN SYLLABICS WE, 5132 +CANADIAN SYLLABICS WEST CREE WE, 5133 +CANADIAN SYLLABICS WI, 5134 +CANADIAN SYLLABICS WEST CREE WI, 5135 +CANADIAN SYLLABICS WII, 5136 +CANADIAN SYLLABICS WEST CREE WII, 5137 +CANADIAN SYLLABICS WO, 5138 +CANADIAN SYLLABICS WEST CREE WO, 5139 +CANADIAN SYLLABICS WOO, 5140 +CANADIAN SYLLABICS WEST CREE WOO, 5141 +CANADIAN SYLLABICS NASKAPI WOO, 5142 +CANADIAN SYLLABICS WA, 5143 +CANADIAN SYLLABICS WEST CREE WA, 5144 +CANADIAN SYLLABICS WAA, 5145 +CANADIAN SYLLABICS WEST CREE WAA, 5146 +CANADIAN SYLLABICS NASKAPI WAA, 5147 +CANADIAN SYLLABICS AI, 5148 +CANADIAN SYLLABICS Y CREE W, 5149 +CANADIAN SYLLABICS GLOTTAL STOP, 5150 +CANADIAN SYLLABICS FINAL ACUTE, 5151 +CANADIAN SYLLABICS FINAL GRAVE, 5152 +CANADIAN SYLLABICS FINAL BOTTOM HALF RING, 5153 +CANADIAN SYLLABICS FINAL TOP HALF RING, 5154 +CANADIAN SYLLABICS FINAL RIGHT HALF RING, 5155 +CANADIAN SYLLABICS FINAL RING, 5156 +CANADIAN SYLLABICS FINAL DOUBLE ACUTE, 5157 +CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES, 5158 +CANADIAN SYLLABICS FINAL MIDDLE DOT, 5159 +CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE, 5160 +CANADIAN SYLLABICS FINAL PLUS, 5161 +CANADIAN SYLLABICS FINAL DOWN TACK, 5162 +CANADIAN SYLLABICS EN, 5163 +CANADIAN SYLLABICS IN, 5164 +CANADIAN SYLLABICS ON, 5165 +CANADIAN SYLLABICS AN, 5166 +CANADIAN SYLLABICS PE, 5167 +CANADIAN SYLLABICS PAAI, 5168 +CANADIAN SYLLABICS PI, 5169 +CANADIAN SYLLABICS PII, 5170 +CANADIAN SYLLABICS PO, 5171 +CANADIAN SYLLABICS POO, 5172 +CANADIAN SYLLABICS Y CREE POO, 5173 +CANADIAN SYLLABICS CARRIER HEE, 5174 +CANADIAN SYLLABICS CARRIER HI, 5175 +CANADIAN SYLLABICS PA, 5176 +CANADIAN SYLLABICS PAA, 5177 +CANADIAN SYLLABICS PWE, 5178 +CANADIAN SYLLABICS WEST CREE PWE, 5179 +CANADIAN SYLLABICS PWI, 5180 +CANADIAN SYLLABICS WEST CREE PWI, 5181 +CANADIAN SYLLABICS PWII, 5182 +CANADIAN SYLLABICS WEST CREE PWII, 5183 +CANADIAN SYLLABICS PWO, 5184 +CANADIAN SYLLABICS WEST CREE PWO, 5185 +CANADIAN SYLLABICS PWOO, 5186 +CANADIAN SYLLABICS WEST CREE PWOO, 5187 +CANADIAN SYLLABICS PWA, 5188 +CANADIAN SYLLABICS WEST CREE PWA, 5189 +CANADIAN SYLLABICS PWAA, 5190 +CANADIAN SYLLABICS WEST CREE PWAA, 5191 +CANADIAN SYLLABICS Y CREE PWAA, 5192 +CANADIAN SYLLABICS P, 5193 +CANADIAN SYLLABICS WEST CREE P, 5194 +CANADIAN SYLLABICS CARRIER H, 5195 +CANADIAN SYLLABICS TE, 5196 +CANADIAN SYLLABICS TAAI, 5197 +CANADIAN SYLLABICS TI, 5198 +CANADIAN SYLLABICS TII, 5199 +CANADIAN SYLLABICS TO, 5200 +CANADIAN SYLLABICS TOO, 5201 +CANADIAN SYLLABICS Y CREE TOO, 5202 +CANADIAN SYLLABICS CARRIER DEE, 5203 +CANADIAN SYLLABICS CARRIER DI, 5204 +CANADIAN SYLLABICS TA, 5205 +CANADIAN SYLLABICS TAA, 5206 +CANADIAN SYLLABICS TWE, 5207 +CANADIAN SYLLABICS WEST CREE TWE, 5208 +CANADIAN SYLLABICS TWI, 5209 +CANADIAN SYLLABICS WEST CREE TWI, 5210 +CANADIAN SYLLABICS TWII, 5211 +CANADIAN SYLLABICS WEST CREE TWII, 5212 +CANADIAN SYLLABICS TWO, 5213 +CANADIAN SYLLABICS WEST CREE TWO, 5214 +CANADIAN SYLLABICS TWOO, 5215 +CANADIAN SYLLABICS WEST CREE TWOO, 5216 +CANADIAN SYLLABICS TWA, 5217 +CANADIAN SYLLABICS WEST CREE TWA, 5218 +CANADIAN SYLLABICS TWAA, 5219 +CANADIAN SYLLABICS WEST CREE TWAA, 5220 +CANADIAN SYLLABICS NASKAPI TWAA, 5221 +CANADIAN SYLLABICS T, 5222 +CANADIAN SYLLABICS TTE, 5223 +CANADIAN SYLLABICS TTI, 5224 +CANADIAN SYLLABICS TTO, 5225 +CANADIAN SYLLABICS TTA, 5226 +CANADIAN SYLLABICS KE, 5227 +CANADIAN SYLLABICS KAAI, 5228 +CANADIAN SYLLABICS KI, 5229 +CANADIAN SYLLABICS KII, 5230 +CANADIAN SYLLABICS KO, 5231 +CANADIAN SYLLABICS KOO, 5232 +CANADIAN SYLLABICS Y CREE KOO, 5233 +CANADIAN SYLLABICS KA, 5234 +CANADIAN SYLLABICS KAA, 5235 +CANADIAN SYLLABICS KWE, 5236 +CANADIAN SYLLABICS WEST CREE KWE, 5237 +CANADIAN SYLLABICS KWI, 5238 +CANADIAN SYLLABICS WEST CREE KWI, 5239 +CANADIAN SYLLABICS KWII, 5240 +CANADIAN SYLLABICS WEST CREE KWII, 5241 +CANADIAN SYLLABICS KWO, 5242 +CANADIAN SYLLABICS WEST CREE KWO, 5243 +CANADIAN SYLLABICS KWOO, 5244 +CANADIAN SYLLABICS WEST CREE KWOO, 5245 +CANADIAN SYLLABICS KWA, 5246 +CANADIAN SYLLABICS WEST CREE KWA, 5247 +CANADIAN SYLLABICS KWAA, 5248 +CANADIAN SYLLABICS WEST CREE KWAA, 5249 +CANADIAN SYLLABICS NASKAPI KWAA, 5250 +CANADIAN SYLLABICS K, 5251 +CANADIAN SYLLABICS KW, 5252 +CANADIAN SYLLABICS SOUTH SLAVEY KEH, 5253 +CANADIAN SYLLABICS SOUTH SLAVEY KIH, 5254 +CANADIAN SYLLABICS SOUTH SLAVEY KOH, 5255 +CANADIAN SYLLABICS SOUTH SLAVEY KAH, 5256 +CANADIAN SYLLABICS CE, 5257 +CANADIAN SYLLABICS CAAI, 5258 +CANADIAN SYLLABICS CI, 5259 +CANADIAN SYLLABICS CII, 5260 +CANADIAN SYLLABICS CO, 5261 +CANADIAN SYLLABICS COO, 5262 +CANADIAN SYLLABICS Y CREE COO, 5263 +CANADIAN SYLLABICS CA, 5264 +CANADIAN SYLLABICS CAA, 5265 +CANADIAN SYLLABICS CWE, 5266 +CANADIAN SYLLABICS WEST CREE CWE, 5267 +CANADIAN SYLLABICS CWI, 5268 +CANADIAN SYLLABICS WEST CREE CWI, 5269 +CANADIAN SYLLABICS CWII, 5270 +CANADIAN SYLLABICS WEST CREE CWII, 5271 +CANADIAN SYLLABICS CWO, 5272 +CANADIAN SYLLABICS WEST CREE CWO, 5273 +CANADIAN SYLLABICS CWOO, 5274 +CANADIAN SYLLABICS WEST CREE CWOO, 5275 +CANADIAN SYLLABICS CWA, 5276 +CANADIAN SYLLABICS WEST CREE CWA, 5277 +CANADIAN SYLLABICS CWAA, 5278 +CANADIAN SYLLABICS WEST CREE CWAA, 5279 +CANADIAN SYLLABICS NASKAPI CWAA, 5280 +CANADIAN SYLLABICS C, 5281 +CANADIAN SYLLABICS SAYISI TH, 5282 +CANADIAN SYLLABICS ME, 5283 +CANADIAN SYLLABICS MAAI, 5284 +CANADIAN SYLLABICS MI, 5285 +CANADIAN SYLLABICS MII, 5286 +CANADIAN SYLLABICS MO, 5287 +CANADIAN SYLLABICS MOO, 5288 +CANADIAN SYLLABICS Y CREE MOO, 5289 +CANADIAN SYLLABICS MA, 5290 +CANADIAN SYLLABICS MAA, 5291 +CANADIAN SYLLABICS MWE, 5292 +CANADIAN SYLLABICS WEST CREE MWE, 5293 +CANADIAN SYLLABICS MWI, 5294 +CANADIAN SYLLABICS WEST CREE MWI, 5295 +CANADIAN SYLLABICS MWII, 5296 +CANADIAN SYLLABICS WEST CREE MWII, 5297 +CANADIAN SYLLABICS MWO, 5298 +CANADIAN SYLLABICS WEST CREE MWO, 5299 +CANADIAN SYLLABICS MWOO, 5300 +CANADIAN SYLLABICS WEST CREE MWOO, 5301 +CANADIAN SYLLABICS MWA, 5302 +CANADIAN SYLLABICS WEST CREE MWA, 5303 +CANADIAN SYLLABICS MWAA, 5304 +CANADIAN SYLLABICS WEST CREE MWAA, 5305 +CANADIAN SYLLABICS NASKAPI MWAA, 5306 +CANADIAN SYLLABICS M, 5307 +CANADIAN SYLLABICS WEST CREE M, 5308 +CANADIAN SYLLABICS MH, 5309 +CANADIAN SYLLABICS ATHAPASCAN M, 5310 +CANADIAN SYLLABICS SAYISI M, 5311 +CANADIAN SYLLABICS NE, 5312 +CANADIAN SYLLABICS NAAI, 5313 +CANADIAN SYLLABICS NI, 5314 +CANADIAN SYLLABICS NII, 5315 +CANADIAN SYLLABICS NO, 5316 +CANADIAN SYLLABICS NOO, 5317 +CANADIAN SYLLABICS Y CREE NOO, 5318 +CANADIAN SYLLABICS NA, 5319 +CANADIAN SYLLABICS NAA, 5320 +CANADIAN SYLLABICS NWE, 5321 +CANADIAN SYLLABICS WEST CREE NWE, 5322 +CANADIAN SYLLABICS NWA, 5323 +CANADIAN SYLLABICS WEST CREE NWA, 5324 +CANADIAN SYLLABICS NWAA, 5325 +CANADIAN SYLLABICS WEST CREE NWAA, 5326 +CANADIAN SYLLABICS NASKAPI NWAA, 5327 +CANADIAN SYLLABICS N, 5328 +CANADIAN SYLLABICS CARRIER NG, 5329 +CANADIAN SYLLABICS NH, 5330 +CANADIAN SYLLABICS LE, 5331 +CANADIAN SYLLABICS LAAI, 5332 +CANADIAN SYLLABICS LI, 5333 +CANADIAN SYLLABICS LII, 5334 +CANADIAN SYLLABICS LO, 5335 +CANADIAN SYLLABICS LOO, 5336 +CANADIAN SYLLABICS Y CREE LOO, 5337 +CANADIAN SYLLABICS LA, 5338 +CANADIAN SYLLABICS LAA, 5339 +CANADIAN SYLLABICS LWE, 5340 +CANADIAN SYLLABICS WEST CREE LWE, 5341 +CANADIAN SYLLABICS LWI, 5342 +CANADIAN SYLLABICS WEST CREE LWI, 5343 +CANADIAN SYLLABICS LWII, 5344 +CANADIAN SYLLABICS WEST CREE LWII, 5345 +CANADIAN SYLLABICS LWO, 5346 +CANADIAN SYLLABICS WEST CREE LWO, 5347 +CANADIAN SYLLABICS LWOO, 5348 +CANADIAN SYLLABICS WEST CREE LWOO, 5349 +CANADIAN SYLLABICS LWA, 5350 +CANADIAN SYLLABICS WEST CREE LWA, 5351 +CANADIAN SYLLABICS LWAA, 5352 +CANADIAN SYLLABICS WEST CREE LWAA, 5353 +CANADIAN SYLLABICS L, 5354 +CANADIAN SYLLABICS WEST CREE L, 5355 +CANADIAN SYLLABICS MEDIAL L, 5356 +CANADIAN SYLLABICS SE, 5357 +CANADIAN SYLLABICS SAAI, 5358 +CANADIAN SYLLABICS SI, 5359 +CANADIAN SYLLABICS SII, 5360 +CANADIAN SYLLABICS SO, 5361 +CANADIAN SYLLABICS SOO, 5362 +CANADIAN SYLLABICS Y CREE SOO, 5363 +CANADIAN SYLLABICS SA, 5364 +CANADIAN SYLLABICS SAA, 5365 +CANADIAN SYLLABICS SWE, 5366 +CANADIAN SYLLABICS WEST CREE SWE, 5367 +CANADIAN SYLLABICS SWI, 5368 +CANADIAN SYLLABICS WEST CREE SWI, 5369 +CANADIAN SYLLABICS SWII, 5370 +CANADIAN SYLLABICS WEST CREE SWII, 5371 +CANADIAN SYLLABICS SWO, 5372 +CANADIAN SYLLABICS WEST CREE SWO, 5373 +CANADIAN SYLLABICS SWOO, 5374 +CANADIAN SYLLABICS WEST CREE SWOO, 5375 +CANADIAN SYLLABICS SWA, 5376 +CANADIAN SYLLABICS WEST CREE SWA, 5377 +CANADIAN SYLLABICS SWAA, 5378 +CANADIAN SYLLABICS WEST CREE SWAA, 5379 +CANADIAN SYLLABICS NASKAPI SWAA, 5380 +CANADIAN SYLLABICS S, 5381 +CANADIAN SYLLABICS ATHAPASCAN S, 5382 +CANADIAN SYLLABICS SW, 5383 +CANADIAN SYLLABICS BLACKFOOT S, 5384 +CANADIAN SYLLABICS MOOSE CREE SK, 5385 +CANADIAN SYLLABICS NASKAPI SKW, 5386 +CANADIAN SYLLABICS NASKAPI S W, 5387 +CANADIAN SYLLABICS NASKAPI SPWA, 5388 +CANADIAN SYLLABICS NASKAPI STWA, 5389 +CANADIAN SYLLABICS NASKAPI SKWA, 5390 +CANADIAN SYLLABICS NASKAPI SCWA, 5391 +CANADIAN SYLLABICS SHE, 5392 +CANADIAN SYLLABICS SHI, 5393 +CANADIAN SYLLABICS SHII, 5394 +CANADIAN SYLLABICS SHO, 5395 +CANADIAN SYLLABICS SHOO, 5396 +CANADIAN SYLLABICS SHA, 5397 +CANADIAN SYLLABICS SHAA, 5398 +CANADIAN SYLLABICS SHWE, 5399 +CANADIAN SYLLABICS WEST CREE SHWE, 5400 +CANADIAN SYLLABICS SHWI, 5401 +CANADIAN SYLLABICS WEST CREE SHWI, 5402 +CANADIAN SYLLABICS SHWII, 5403 +CANADIAN SYLLABICS WEST CREE SHWII, 5404 +CANADIAN SYLLABICS SHWO, 5405 +CANADIAN SYLLABICS WEST CREE SHWO, 5406 +CANADIAN SYLLABICS SHWOO, 5407 +CANADIAN SYLLABICS WEST CREE SHWOO, 5408 +CANADIAN SYLLABICS SHWA, 5409 +CANADIAN SYLLABICS WEST CREE SHWA, 5410 +CANADIAN SYLLABICS SHWAA, 5411 +CANADIAN SYLLABICS WEST CREE SHWAA, 5412 +CANADIAN SYLLABICS SH, 5413 +CANADIAN SYLLABICS YE, 5414 +CANADIAN SYLLABICS YAAI, 5415 +CANADIAN SYLLABICS YI, 5416 +CANADIAN SYLLABICS YII, 5417 +CANADIAN SYLLABICS YO, 5418 +CANADIAN SYLLABICS YOO, 5419 +CANADIAN SYLLABICS Y CREE YOO, 5420 +CANADIAN SYLLABICS YA, 5421 +CANADIAN SYLLABICS YAA, 5422 +CANADIAN SYLLABICS YWE, 5423 +CANADIAN SYLLABICS WEST CREE YWE, 5424 +CANADIAN SYLLABICS YWI, 5425 +CANADIAN SYLLABICS WEST CREE YWI, 5426 +CANADIAN SYLLABICS YWII, 5427 +CANADIAN SYLLABICS WEST CREE YWII, 5428 +CANADIAN SYLLABICS YWO, 5429 +CANADIAN SYLLABICS WEST CREE YWO, 5430 +CANADIAN SYLLABICS YWOO, 5431 +CANADIAN SYLLABICS WEST CREE YWOO, 5432 +CANADIAN SYLLABICS YWA, 5433 +CANADIAN SYLLABICS WEST CREE YWA, 5434 +CANADIAN SYLLABICS YWAA, 5435 +CANADIAN SYLLABICS WEST CREE YWAA, 5436 +CANADIAN SYLLABICS NASKAPI YWAA, 5437 +CANADIAN SYLLABICS Y, 5438 +CANADIAN SYLLABICS BIBLE CREE Y, 5439 +CANADIAN SYLLABICS WEST CREE Y, 5440 +CANADIAN SYLLABICS SAYISI YI, 5441 +CANADIAN SYLLABICS RE, 5442 +CANADIAN SYLLABICS R CREE RE, 5443 +CANADIAN SYLLABICS WEST CREE LE, 5444 +CANADIAN SYLLABICS RAAI, 5445 +CANADIAN SYLLABICS RI, 5446 +CANADIAN SYLLABICS RII, 5447 +CANADIAN SYLLABICS RO, 5448 +CANADIAN SYLLABICS ROO, 5449 +CANADIAN SYLLABICS WEST CREE LO, 5450 +CANADIAN SYLLABICS RA, 5451 +CANADIAN SYLLABICS RAA, 5452 +CANADIAN SYLLABICS WEST CREE LA, 5453 +CANADIAN SYLLABICS RWAA, 5454 +CANADIAN SYLLABICS WEST CREE RWAA, 5455 +CANADIAN SYLLABICS R, 5456 +CANADIAN SYLLABICS WEST CREE R, 5457 +CANADIAN SYLLABICS MEDIAL R, 5458 +CANADIAN SYLLABICS FE, 5459 +CANADIAN SYLLABICS FAAI, 5460 +CANADIAN SYLLABICS FI, 5461 +CANADIAN SYLLABICS FII, 5462 +CANADIAN SYLLABICS FO, 5463 +CANADIAN SYLLABICS FOO, 5464 +CANADIAN SYLLABICS FA, 5465 +CANADIAN SYLLABICS FAA, 5466 +CANADIAN SYLLABICS FWAA, 5467 +CANADIAN SYLLABICS WEST CREE FWAA, 5468 +CANADIAN SYLLABICS F, 5469 +CANADIAN SYLLABICS THE, 5470 +CANADIAN SYLLABICS N CREE THE, 5471 +CANADIAN SYLLABICS THI, 5472 +CANADIAN SYLLABICS N CREE THI, 5473 +CANADIAN SYLLABICS THII, 5474 +CANADIAN SYLLABICS N CREE THII, 5475 +CANADIAN SYLLABICS THO, 5476 +CANADIAN SYLLABICS THOO, 5477 +CANADIAN SYLLABICS THA, 5478 +CANADIAN SYLLABICS THAA, 5479 +CANADIAN SYLLABICS THWAA, 5480 +CANADIAN SYLLABICS WEST CREE THWAA, 5481 +CANADIAN SYLLABICS TH, 5482 +CANADIAN SYLLABICS TTHE, 5483 +CANADIAN SYLLABICS TTHI, 5484 +CANADIAN SYLLABICS TTHO, 5485 +CANADIAN SYLLABICS TTHA, 5486 +CANADIAN SYLLABICS TTH, 5487 +CANADIAN SYLLABICS TYE, 5488 +CANADIAN SYLLABICS TYI, 5489 +CANADIAN SYLLABICS TYO, 5490 +CANADIAN SYLLABICS TYA, 5491 +CANADIAN SYLLABICS NUNAVIK HE, 5492 +CANADIAN SYLLABICS NUNAVIK HI, 5493 +CANADIAN SYLLABICS NUNAVIK HII, 5494 +CANADIAN SYLLABICS NUNAVIK HO, 5495 +CANADIAN SYLLABICS NUNAVIK HOO, 5496 +CANADIAN SYLLABICS NUNAVIK HA, 5497 +CANADIAN SYLLABICS NUNAVIK HAA, 5498 +CANADIAN SYLLABICS NUNAVIK H, 5499 +CANADIAN SYLLABICS NUNAVUT H, 5500 +CANADIAN SYLLABICS HK, 5501 +CANADIAN SYLLABICS QAAI, 5502 +CANADIAN SYLLABICS QI, 5503 +CANADIAN SYLLABICS QII, 5504 +CANADIAN SYLLABICS QO, 5505 +CANADIAN SYLLABICS QOO, 5506 +CANADIAN SYLLABICS QA, 5507 +CANADIAN SYLLABICS QAA, 5508 +CANADIAN SYLLABICS Q, 5509 +CANADIAN SYLLABICS TLHE, 5510 +CANADIAN SYLLABICS TLHI, 5511 +CANADIAN SYLLABICS TLHO, 5512 +CANADIAN SYLLABICS TLHA, 5513 +CANADIAN SYLLABICS WEST CREE RE, 5514 +CANADIAN SYLLABICS WEST CREE RI, 5515 +CANADIAN SYLLABICS WEST CREE RO, 5516 +CANADIAN SYLLABICS WEST CREE RA, 5517 +CANADIAN SYLLABICS NGAAI, 5518 +CANADIAN SYLLABICS NGI, 5519 +CANADIAN SYLLABICS NGII, 5520 +CANADIAN SYLLABICS NGO, 5521 +CANADIAN SYLLABICS NGOO, 5522 +CANADIAN SYLLABICS NGA, 5523 +CANADIAN SYLLABICS NGAA, 5524 +CANADIAN SYLLABICS NG, 5525 +CANADIAN SYLLABICS NNG, 5526 +CANADIAN SYLLABICS SAYISI SHE, 5527 +CANADIAN SYLLABICS SAYISI SHI, 5528 +CANADIAN SYLLABICS SAYISI SHO, 5529 +CANADIAN SYLLABICS SAYISI SHA, 5530 +CANADIAN SYLLABICS WOODS CREE THE, 5531 +CANADIAN SYLLABICS WOODS CREE THI, 5532 +CANADIAN SYLLABICS WOODS CREE THO, 5533 +CANADIAN SYLLABICS WOODS CREE THA, 5534 +CANADIAN SYLLABICS WOODS CREE TH, 5535 +CANADIAN SYLLABICS LHI, 5536 +CANADIAN SYLLABICS LHII, 5537 +CANADIAN SYLLABICS LHO, 5538 +CANADIAN SYLLABICS LHOO, 5539 +CANADIAN SYLLABICS LHA, 5540 +CANADIAN SYLLABICS LHAA, 5541 +CANADIAN SYLLABICS LH, 5542 +CANADIAN SYLLABICS TH CREE THE, 5543 +CANADIAN SYLLABICS TH CREE THI, 5544 +CANADIAN SYLLABICS TH CREE THII, 5545 +CANADIAN SYLLABICS TH CREE THO, 5546 +CANADIAN SYLLABICS TH CREE THOO, 5547 +CANADIAN SYLLABICS TH CREE THA, 5548 +CANADIAN SYLLABICS TH CREE THAA, 5549 +CANADIAN SYLLABICS TH CREE TH, 5550 +CANADIAN SYLLABICS AIVILIK B, 5551 +CANADIAN SYLLABICS BLACKFOOT E, 5552 +CANADIAN SYLLABICS BLACKFOOT I, 5553 +CANADIAN SYLLABICS BLACKFOOT O, 5554 +CANADIAN SYLLABICS BLACKFOOT A, 5555 +CANADIAN SYLLABICS BLACKFOOT WE, 5556 +CANADIAN SYLLABICS BLACKFOOT WI, 5557 +CANADIAN SYLLABICS BLACKFOOT WO, 5558 +CANADIAN SYLLABICS BLACKFOOT WA, 5559 +CANADIAN SYLLABICS BLACKFOOT NE, 5560 +CANADIAN SYLLABICS BLACKFOOT NI, 5561 +CANADIAN SYLLABICS BLACKFOOT NO, 5562 +CANADIAN SYLLABICS BLACKFOOT NA, 5563 +CANADIAN SYLLABICS BLACKFOOT KE, 5564 +CANADIAN SYLLABICS BLACKFOOT KI, 5565 +CANADIAN SYLLABICS BLACKFOOT KO, 5566 +CANADIAN SYLLABICS BLACKFOOT KA, 5567 +CANADIAN SYLLABICS SAYISI HE, 5568 +CANADIAN SYLLABICS SAYISI HI, 5569 +CANADIAN SYLLABICS SAYISI HO, 5570 +CANADIAN SYLLABICS SAYISI HA, 5571 +CANADIAN SYLLABICS CARRIER GHU, 5572 +CANADIAN SYLLABICS CARRIER GHO, 5573 +CANADIAN SYLLABICS CARRIER GHE, 5574 +CANADIAN SYLLABICS CARRIER GHEE, 5575 +CANADIAN SYLLABICS CARRIER GHI, 5576 +CANADIAN SYLLABICS CARRIER GHA, 5577 +CANADIAN SYLLABICS CARRIER RU, 5578 +CANADIAN SYLLABICS CARRIER RO, 5579 +CANADIAN SYLLABICS CARRIER RE, 5580 +CANADIAN SYLLABICS CARRIER REE, 5581 +CANADIAN SYLLABICS CARRIER RI, 5582 +CANADIAN SYLLABICS CARRIER RA, 5583 +CANADIAN SYLLABICS CARRIER WU, 5584 +CANADIAN SYLLABICS CARRIER WO, 5585 +CANADIAN SYLLABICS CARRIER WE, 5586 +CANADIAN SYLLABICS CARRIER WEE, 5587 +CANADIAN SYLLABICS CARRIER WI, 5588 +CANADIAN SYLLABICS CARRIER WA, 5589 +CANADIAN SYLLABICS CARRIER HWU, 5590 +CANADIAN SYLLABICS CARRIER HWO, 5591 +CANADIAN SYLLABICS CARRIER HWE, 5592 +CANADIAN SYLLABICS CARRIER HWEE, 5593 +CANADIAN SYLLABICS CARRIER HWI, 5594 +CANADIAN SYLLABICS CARRIER HWA, 5595 +CANADIAN SYLLABICS CARRIER THU, 5596 +CANADIAN SYLLABICS CARRIER THO, 5597 +CANADIAN SYLLABICS CARRIER THE, 5598 +CANADIAN SYLLABICS CARRIER THEE, 5599 +CANADIAN SYLLABICS CARRIER THI, 5600 +CANADIAN SYLLABICS CARRIER THA, 5601 +CANADIAN SYLLABICS CARRIER TTU, 5602 +CANADIAN SYLLABICS CARRIER TTO, 5603 +CANADIAN SYLLABICS CARRIER TTE, 5604 +CANADIAN SYLLABICS CARRIER TTEE, 5605 +CANADIAN SYLLABICS CARRIER TTI, 5606 +CANADIAN SYLLABICS CARRIER TTA, 5607 +CANADIAN SYLLABICS CARRIER PU, 5608 +CANADIAN SYLLABICS CARRIER PO, 5609 +CANADIAN SYLLABICS CARRIER PE, 5610 +CANADIAN SYLLABICS CARRIER PEE, 5611 +CANADIAN SYLLABICS CARRIER PI, 5612 +CANADIAN SYLLABICS CARRIER PA, 5613 +CANADIAN SYLLABICS CARRIER P, 5614 +CANADIAN SYLLABICS CARRIER GU, 5615 +CANADIAN SYLLABICS CARRIER GO, 5616 +CANADIAN SYLLABICS CARRIER GE, 5617 +CANADIAN SYLLABICS CARRIER GEE, 5618 +CANADIAN SYLLABICS CARRIER GI, 5619 +CANADIAN SYLLABICS CARRIER GA, 5620 +CANADIAN SYLLABICS CARRIER KHU, 5621 +CANADIAN SYLLABICS CARRIER KHO, 5622 +CANADIAN SYLLABICS CARRIER KHE, 5623 +CANADIAN SYLLABICS CARRIER KHEE, 5624 +CANADIAN SYLLABICS CARRIER KHI, 5625 +CANADIAN SYLLABICS CARRIER KHA, 5626 +CANADIAN SYLLABICS CARRIER KKU, 5627 +CANADIAN SYLLABICS CARRIER KKO, 5628 +CANADIAN SYLLABICS CARRIER KKE, 5629 +CANADIAN SYLLABICS CARRIER KKEE, 5630 +CANADIAN SYLLABICS CARRIER KKI, 5631 +CANADIAN SYLLABICS CARRIER KKA, 5632 +CANADIAN SYLLABICS CARRIER KK, 5633 +CANADIAN SYLLABICS CARRIER NU, 5634 +CANADIAN SYLLABICS CARRIER NO, 5635 +CANADIAN SYLLABICS CARRIER NE, 5636 +CANADIAN SYLLABICS CARRIER NEE, 5637 +CANADIAN SYLLABICS CARRIER NI, 5638 +CANADIAN SYLLABICS CARRIER NA, 5639 +CANADIAN SYLLABICS CARRIER MU, 5640 +CANADIAN SYLLABICS CARRIER MO, 5641 +CANADIAN SYLLABICS CARRIER ME, 5642 +CANADIAN SYLLABICS CARRIER MEE, 5643 +CANADIAN SYLLABICS CARRIER MI, 5644 +CANADIAN SYLLABICS CARRIER MA, 5645 +CANADIAN SYLLABICS CARRIER YU, 5646 +CANADIAN SYLLABICS CARRIER YO, 5647 +CANADIAN SYLLABICS CARRIER YE, 5648 +CANADIAN SYLLABICS CARRIER YEE, 5649 +CANADIAN SYLLABICS CARRIER YI, 5650 +CANADIAN SYLLABICS CARRIER YA, 5651 +CANADIAN SYLLABICS CARRIER JU, 5652 +CANADIAN SYLLABICS SAYISI JU, 5653 +CANADIAN SYLLABICS CARRIER JO, 5654 +CANADIAN SYLLABICS CARRIER JE, 5655 +CANADIAN SYLLABICS CARRIER JEE, 5656 +CANADIAN SYLLABICS CARRIER JI, 5657 +CANADIAN SYLLABICS SAYISI JI, 5658 +CANADIAN SYLLABICS CARRIER JA, 5659 +CANADIAN SYLLABICS CARRIER JJU, 5660 +CANADIAN SYLLABICS CARRIER JJO, 5661 +CANADIAN SYLLABICS CARRIER JJE, 5662 +CANADIAN SYLLABICS CARRIER JJEE, 5663 +CANADIAN SYLLABICS CARRIER JJI, 5664 +CANADIAN SYLLABICS CARRIER JJA, 5665 +CANADIAN SYLLABICS CARRIER LU, 5666 +CANADIAN SYLLABICS CARRIER LO, 5667 +CANADIAN SYLLABICS CARRIER LE, 5668 +CANADIAN SYLLABICS CARRIER LEE, 5669 +CANADIAN SYLLABICS CARRIER LI, 5670 +CANADIAN SYLLABICS CARRIER LA, 5671 +CANADIAN SYLLABICS CARRIER DLU, 5672 +CANADIAN SYLLABICS CARRIER DLO, 5673 +CANADIAN SYLLABICS CARRIER DLE, 5674 +CANADIAN SYLLABICS CARRIER DLEE, 5675 +CANADIAN SYLLABICS CARRIER DLI, 5676 +CANADIAN SYLLABICS CARRIER DLA, 5677 +CANADIAN SYLLABICS CARRIER LHU, 5678 +CANADIAN SYLLABICS CARRIER LHO, 5679 +CANADIAN SYLLABICS CARRIER LHE, 5680 +CANADIAN SYLLABICS CARRIER LHEE, 5681 +CANADIAN SYLLABICS CARRIER LHI, 5682 +CANADIAN SYLLABICS CARRIER LHA, 5683 +CANADIAN SYLLABICS CARRIER TLHU, 5684 +CANADIAN SYLLABICS CARRIER TLHO, 5685 +CANADIAN SYLLABICS CARRIER TLHE, 5686 +CANADIAN SYLLABICS CARRIER TLHEE, 5687 +CANADIAN SYLLABICS CARRIER TLHI, 5688 +CANADIAN SYLLABICS CARRIER TLHA, 5689 +CANADIAN SYLLABICS CARRIER TLU, 5690 +CANADIAN SYLLABICS CARRIER TLO, 5691 +CANADIAN SYLLABICS CARRIER TLE, 5692 +CANADIAN SYLLABICS CARRIER TLEE, 5693 +CANADIAN SYLLABICS CARRIER TLI, 5694 +CANADIAN SYLLABICS CARRIER TLA, 5695 +CANADIAN SYLLABICS CARRIER ZU, 5696 +CANADIAN SYLLABICS CARRIER ZO, 5697 +CANADIAN SYLLABICS CARRIER ZE, 5698 +CANADIAN SYLLABICS CARRIER ZEE, 5699 +CANADIAN SYLLABICS CARRIER ZI, 5700 +CANADIAN SYLLABICS CARRIER ZA, 5701 +CANADIAN SYLLABICS CARRIER Z, 5702 +CANADIAN SYLLABICS CARRIER INITIAL Z, 5703 +CANADIAN SYLLABICS CARRIER DZU, 5704 +CANADIAN SYLLABICS CARRIER DZO, 5705 +CANADIAN SYLLABICS CARRIER DZE, 5706 +CANADIAN SYLLABICS CARRIER DZEE, 5707 +CANADIAN SYLLABICS CARRIER DZI, 5708 +CANADIAN SYLLABICS CARRIER DZA, 5709 +CANADIAN SYLLABICS CARRIER SU, 5710 +CANADIAN SYLLABICS CARRIER SO, 5711 +CANADIAN SYLLABICS CARRIER SE, 5712 +CANADIAN SYLLABICS CARRIER SEE, 5713 +CANADIAN SYLLABICS CARRIER SI, 5714 +CANADIAN SYLLABICS CARRIER SA, 5715 +CANADIAN SYLLABICS CARRIER SHU, 5716 +CANADIAN SYLLABICS CARRIER SHO, 5717 +CANADIAN SYLLABICS CARRIER SHE, 5718 +CANADIAN SYLLABICS CARRIER SHEE, 5719 +CANADIAN SYLLABICS CARRIER SHI, 5720 +CANADIAN SYLLABICS CARRIER SHA, 5721 +CANADIAN SYLLABICS CARRIER SH, 5722 +CANADIAN SYLLABICS CARRIER TSU, 5723 +CANADIAN SYLLABICS CARRIER TSO, 5724 +CANADIAN SYLLABICS CARRIER TSE, 5725 +CANADIAN SYLLABICS CARRIER TSEE, 5726 +CANADIAN SYLLABICS CARRIER TSI, 5727 +CANADIAN SYLLABICS CARRIER TSA, 5728 +CANADIAN SYLLABICS CARRIER CHU, 5729 +CANADIAN SYLLABICS CARRIER CHO, 5730 +CANADIAN SYLLABICS CARRIER CHE, 5731 +CANADIAN SYLLABICS CARRIER CHEE, 5732 +CANADIAN SYLLABICS CARRIER CHI, 5733 +CANADIAN SYLLABICS CARRIER CHA, 5734 +CANADIAN SYLLABICS CARRIER TTSU, 5735 +CANADIAN SYLLABICS CARRIER TTSO, 5736 +CANADIAN SYLLABICS CARRIER TTSE, 5737 +CANADIAN SYLLABICS CARRIER TTSEE, 5738 +CANADIAN SYLLABICS CARRIER TTSI, 5739 +CANADIAN SYLLABICS CARRIER TTSA, 5740 +CANADIAN SYLLABICS CHI SIGN, 5741 +CANADIAN SYLLABICS FULL STOP, 5742 +CANADIAN SYLLABICS QAI, 5743 +CANADIAN SYLLABICS NGAI, 5744 +CANADIAN SYLLABICS NNGI, 5745 +CANADIAN SYLLABICS NNGII, 5746 +CANADIAN SYLLABICS NNGO, 5747 +CANADIAN SYLLABICS NNGOO, 5748 +CANADIAN SYLLABICS NNGA, 5749 +CANADIAN SYLLABICS NNGAA, 5750 +CANADIAN SYLLABICS WOODS CREE THWEE, 5751 +CANADIAN SYLLABICS WOODS CREE THWI, 5752 +CANADIAN SYLLABICS WOODS CREE THWII, 5753 +CANADIAN SYLLABICS WOODS CREE THWO, 5754 +CANADIAN SYLLABICS WOODS CREE THWOO, 5755 +CANADIAN SYLLABICS WOODS CREE THWA, 5756 +CANADIAN SYLLABICS WOODS CREE THWAA, 5757 +CANADIAN SYLLABICS WOODS CREE FINAL TH, 5758 +CANADIAN SYLLABICS BLACKFOOT W, 5759 +OGHAM SPACE MARK, 5760 +OGHAM LETTER BEITH, 5761 +OGHAM LETTER LUIS, 5762 +OGHAM LETTER FEARN, 5763 +OGHAM LETTER SAIL, 5764 +OGHAM LETTER NION, 5765 +OGHAM LETTER UATH, 5766 +OGHAM LETTER DAIR, 5767 +OGHAM LETTER TINNE, 5768 +OGHAM LETTER COLL, 5769 +OGHAM LETTER CEIRT, 5770 +OGHAM LETTER MUIN, 5771 +OGHAM LETTER GORT, 5772 +OGHAM LETTER NGEADAL, 5773 +OGHAM LETTER STRAIF, 5774 +OGHAM LETTER RUIS, 5775 +OGHAM LETTER AILM, 5776 +OGHAM LETTER ONN, 5777 +OGHAM LETTER UR, 5778 +OGHAM LETTER EADHADH, 5779 +OGHAM LETTER IODHADH, 5780 +OGHAM LETTER EABHADH, 5781 +OGHAM LETTER OR, 5782 +OGHAM LETTER UILLEANN, 5783 +OGHAM LETTER IFIN, 5784 +OGHAM LETTER EAMHANCHOLL, 5785 +OGHAM LETTER PEITH, 5786 +OGHAM FEATHER MARK, 5787 +OGHAM REVERSED FEATHER MARK, 5788 +RUNIC LETTER FEHU FEOH FE F, 5792 +RUNIC LETTER V, 5793 +RUNIC LETTER URUZ UR U, 5794 +RUNIC LETTER YR, 5795 +RUNIC LETTER Y, 5796 +RUNIC LETTER W, 5797 +RUNIC LETTER THURISAZ THURS THORN, 5798 +RUNIC LETTER ETH, 5799 +RUNIC LETTER ANSUZ A, 5800 +RUNIC LETTER OS O, 5801 +RUNIC LETTER AC A, 5802 +RUNIC LETTER AESC, 5803 +RUNIC LETTER LONG BRANCH OSS O, 5804 +RUNIC LETTER SHORT TWIG OSS O, 5805 +RUNIC LETTER O, 5806 +RUNIC LETTER OE, 5807 +RUNIC LETTER ON, 5808 +RUNIC LETTER RAIDO RAD REID R, 5809 +RUNIC LETTER KAUNA, 5810 +RUNIC LETTER CEN, 5811 +RUNIC LETTER KAUN K, 5812 +RUNIC LETTER G, 5813 +RUNIC LETTER ENG, 5814 +RUNIC LETTER GEBO GYFU G, 5815 +RUNIC LETTER GAR, 5816 +RUNIC LETTER WUNJO WYNN W, 5817 +RUNIC LETTER HAGLAZ H, 5818 +RUNIC LETTER HAEGL H, 5819 +RUNIC LETTER LONG BRANCH HAGALL H, 5820 +RUNIC LETTER SHORT TWIG HAGALL H, 5821 +RUNIC LETTER NAUDIZ NYD NAUD N, 5822 +RUNIC LETTER SHORT TWIG NAUD N, 5823 +RUNIC LETTER DOTTED N, 5824 +RUNIC LETTER ISAZ IS ISS I, 5825 +RUNIC LETTER E, 5826 +RUNIC LETTER JERAN J, 5827 +RUNIC LETTER GER, 5828 +RUNIC LETTER LONG BRANCH AR AE, 5829 +RUNIC LETTER SHORT TWIG AR A, 5830 +RUNIC LETTER IWAZ EOH, 5831 +RUNIC LETTER PERTHO PEORTH P, 5832 +RUNIC LETTER ALGIZ EOLHX, 5833 +RUNIC LETTER SOWILO S, 5834 +RUNIC LETTER SIGEL LONG BRANCH SOL S, 5835 +RUNIC LETTER SHORT TWIG SOL S, 5836 +RUNIC LETTER C, 5837 +RUNIC LETTER Z, 5838 +RUNIC LETTER TIWAZ TIR TYR T, 5839 +RUNIC LETTER SHORT TWIG TYR T, 5840 +RUNIC LETTER D, 5841 +RUNIC LETTER BERKANAN BEORC BJARKAN B, 5842 +RUNIC LETTER SHORT TWIG BJARKAN B, 5843 +RUNIC LETTER DOTTED P, 5844 +RUNIC LETTER OPEN P, 5845 +RUNIC LETTER EHWAZ EH E, 5846 +RUNIC LETTER MANNAZ MAN M, 5847 +RUNIC LETTER LONG BRANCH MADR M, 5848 +RUNIC LETTER SHORT TWIG MADR M, 5849 +RUNIC LETTER LAUKAZ LAGU LOGR L, 5850 +RUNIC LETTER DOTTED L, 5851 +RUNIC LETTER INGWAZ, 5852 +RUNIC LETTER ING, 5853 +RUNIC LETTER DAGAZ DAEG D, 5854 +RUNIC LETTER OTHALAN ETHEL O, 5855 +RUNIC LETTER EAR, 5856 +RUNIC LETTER IOR, 5857 +RUNIC LETTER CWEORTH, 5858 +RUNIC LETTER CALC, 5859 +RUNIC LETTER CEALC, 5860 +RUNIC LETTER STAN, 5861 +RUNIC LETTER LONG BRANCH YR, 5862 +RUNIC LETTER SHORT TWIG YR, 5863 +RUNIC LETTER ICELANDIC YR, 5864 +RUNIC LETTER Q, 5865 +RUNIC LETTER X, 5866 +RUNIC SINGLE PUNCTUATION, 5867 +RUNIC MULTIPLE PUNCTUATION, 5868 +RUNIC CROSS PUNCTUATION, 5869 +RUNIC ARLAUG SYMBOL, 5870 +RUNIC TVIMADUR SYMBOL, 5871 +RUNIC BELGTHOR SYMBOL, 5872 +RUNIC LETTER K, 5873 +RUNIC LETTER SH, 5874 +RUNIC LETTER OO, 5875 +RUNIC LETTER FRANKS CASKET OS, 5876 +RUNIC LETTER FRANKS CASKET IS, 5877 +RUNIC LETTER FRANKS CASKET EH, 5878 +RUNIC LETTER FRANKS CASKET AC, 5879 +RUNIC LETTER FRANKS CASKET AESC, 5880 +TAGALOG LETTER A, 5888 +TAGALOG LETTER I, 5889 +TAGALOG LETTER U, 5890 +TAGALOG LETTER KA, 5891 +TAGALOG LETTER GA, 5892 +TAGALOG LETTER NGA, 5893 +TAGALOG LETTER TA, 5894 +TAGALOG LETTER DA, 5895 +TAGALOG LETTER NA, 5896 +TAGALOG LETTER PA, 5897 +TAGALOG LETTER BA, 5898 +TAGALOG LETTER MA, 5899 +TAGALOG LETTER YA, 5900 +TAGALOG LETTER LA, 5902 +TAGALOG LETTER WA, 5903 +TAGALOG LETTER SA, 5904 +TAGALOG LETTER HA, 5905 +TAGALOG VOWEL SIGN I, 5906 +TAGALOG VOWEL SIGN U, 5907 +TAGALOG SIGN VIRAMA, 5908 +HANUNOO LETTER A, 5920 +HANUNOO LETTER I, 5921 +HANUNOO LETTER U, 5922 +HANUNOO LETTER KA, 5923 +HANUNOO LETTER GA, 5924 +HANUNOO LETTER NGA, 5925 +HANUNOO LETTER TA, 5926 +HANUNOO LETTER DA, 5927 +HANUNOO LETTER NA, 5928 +HANUNOO LETTER PA, 5929 +HANUNOO LETTER BA, 5930 +HANUNOO LETTER MA, 5931 +HANUNOO LETTER YA, 5932 +HANUNOO LETTER RA, 5933 +HANUNOO LETTER LA, 5934 +HANUNOO LETTER WA, 5935 +HANUNOO LETTER SA, 5936 +HANUNOO LETTER HA, 5937 +HANUNOO VOWEL SIGN I, 5938 +HANUNOO VOWEL SIGN U, 5939 +HANUNOO SIGN PAMUDPOD, 5940 +PHILIPPINE SINGLE PUNCTUATION, 5941 +PHILIPPINE DOUBLE PUNCTUATION, 5942 +BUHID LETTER A, 5952 +BUHID LETTER I, 5953 +BUHID LETTER U, 5954 +BUHID LETTER KA, 5955 +BUHID LETTER GA, 5956 +BUHID LETTER NGA, 5957 +BUHID LETTER TA, 5958 +BUHID LETTER DA, 5959 +BUHID LETTER NA, 5960 +BUHID LETTER PA, 5961 +BUHID LETTER BA, 5962 +BUHID LETTER MA, 5963 +BUHID LETTER YA, 5964 +BUHID LETTER RA, 5965 +BUHID LETTER LA, 5966 +BUHID LETTER WA, 5967 +BUHID LETTER SA, 5968 +BUHID LETTER HA, 5969 +BUHID VOWEL SIGN I, 5970 +BUHID VOWEL SIGN U, 5971 +TAGBANWA LETTER A, 5984 +TAGBANWA LETTER I, 5985 +TAGBANWA LETTER U, 5986 +TAGBANWA LETTER KA, 5987 +TAGBANWA LETTER GA, 5988 +TAGBANWA LETTER NGA, 5989 +TAGBANWA LETTER TA, 5990 +TAGBANWA LETTER DA, 5991 +TAGBANWA LETTER NA, 5992 +TAGBANWA LETTER PA, 5993 +TAGBANWA LETTER BA, 5994 +TAGBANWA LETTER MA, 5995 +TAGBANWA LETTER YA, 5996 +TAGBANWA LETTER LA, 5998 +TAGBANWA LETTER WA, 5999 +TAGBANWA LETTER SA, 6000 +TAGBANWA VOWEL SIGN I, 6002 +TAGBANWA VOWEL SIGN U, 6003 +KHMER LETTER KA, 6016 +KHMER LETTER KHA, 6017 +KHMER LETTER KO, 6018 +KHMER LETTER KHO, 6019 +KHMER LETTER NGO, 6020 +KHMER LETTER CA, 6021 +KHMER LETTER CHA, 6022 +KHMER LETTER CO, 6023 +KHMER LETTER CHO, 6024 +KHMER LETTER NYO, 6025 +KHMER LETTER DA, 6026 +KHMER LETTER TTHA, 6027 +KHMER LETTER DO, 6028 +KHMER LETTER TTHO, 6029 +KHMER LETTER NNO, 6030 +KHMER LETTER TA, 6031 +KHMER LETTER THA, 6032 +KHMER LETTER TO, 6033 +KHMER LETTER THO, 6034 +KHMER LETTER NO, 6035 +KHMER LETTER BA, 6036 +KHMER LETTER PHA, 6037 +KHMER LETTER PO, 6038 +KHMER LETTER PHO, 6039 +KHMER LETTER MO, 6040 +KHMER LETTER YO, 6041 +KHMER LETTER RO, 6042 +KHMER LETTER LO, 6043 +KHMER LETTER VO, 6044 +KHMER LETTER SHA, 6045 +KHMER LETTER SSO, 6046 +KHMER LETTER SA, 6047 +KHMER LETTER HA, 6048 +KHMER LETTER LA, 6049 +KHMER LETTER QA, 6050 +KHMER INDEPENDENT VOWEL QAQ, 6051 +KHMER INDEPENDENT VOWEL QAA, 6052 +KHMER INDEPENDENT VOWEL QI, 6053 +KHMER INDEPENDENT VOWEL QII, 6054 +KHMER INDEPENDENT VOWEL QU, 6055 +KHMER INDEPENDENT VOWEL QUK, 6056 +KHMER INDEPENDENT VOWEL QUU, 6057 +KHMER INDEPENDENT VOWEL QUUV, 6058 +KHMER INDEPENDENT VOWEL RY, 6059 +KHMER INDEPENDENT VOWEL RYY, 6060 +KHMER INDEPENDENT VOWEL LY, 6061 +KHMER INDEPENDENT VOWEL LYY, 6062 +KHMER INDEPENDENT VOWEL QE, 6063 +KHMER INDEPENDENT VOWEL QAI, 6064 +KHMER INDEPENDENT VOWEL QOO TYPE ONE, 6065 +KHMER INDEPENDENT VOWEL QOO TYPE TWO, 6066 +KHMER INDEPENDENT VOWEL QAU, 6067 +KHMER VOWEL INHERENT AQ, 6068 +KHMER VOWEL INHERENT AA, 6069 +KHMER VOWEL SIGN AA, 6070 +KHMER VOWEL SIGN I, 6071 +KHMER VOWEL SIGN II, 6072 +KHMER VOWEL SIGN Y, 6073 +KHMER VOWEL SIGN YY, 6074 +KHMER VOWEL SIGN U, 6075 +KHMER VOWEL SIGN UU, 6076 +KHMER VOWEL SIGN UA, 6077 +KHMER VOWEL SIGN OE, 6078 +KHMER VOWEL SIGN YA, 6079 +KHMER VOWEL SIGN IE, 6080 +KHMER VOWEL SIGN E, 6081 +KHMER VOWEL SIGN AE, 6082 +KHMER VOWEL SIGN AI, 6083 +KHMER VOWEL SIGN OO, 6084 +KHMER VOWEL SIGN AU, 6085 +KHMER SIGN NIKAHIT, 6086 +KHMER SIGN REAHMUK, 6087 +KHMER SIGN YUUKALEAPINTU, 6088 +KHMER SIGN MUUSIKATOAN, 6089 +KHMER SIGN TRIISAP, 6090 +KHMER SIGN BANTOC, 6091 +KHMER SIGN ROBAT, 6092 +KHMER SIGN TOANDAKHIAT, 6093 +KHMER SIGN KAKABAT, 6094 +KHMER SIGN AHSDA, 6095 +KHMER SIGN SAMYOK SANNYA, 6096 +KHMER SIGN VIRIAM, 6097 +KHMER SIGN COENG, 6098 +KHMER SIGN BATHAMASAT, 6099 +KHMER SIGN KHAN, 6100 +KHMER SIGN BARIYOOSAN, 6101 +KHMER SIGN CAMNUC PII KUUH, 6102 +KHMER SIGN LEK TOO, 6103 +KHMER SIGN BEYYAL, 6104 +KHMER SIGN PHNAEK MUAN, 6105 +KHMER SIGN KOOMUUT, 6106 +KHMER CURRENCY SYMBOL RIEL, 6107 +KHMER SIGN AVAKRAHASANYA, 6108 +KHMER SIGN ATTHACAN, 6109 +KHMER DIGIT ZERO, 6112 +KHMER DIGIT ONE, 6113 +KHMER DIGIT TWO, 6114 +KHMER DIGIT THREE, 6115 +KHMER DIGIT FOUR, 6116 +KHMER DIGIT FIVE, 6117 +KHMER DIGIT SIX, 6118 +KHMER DIGIT SEVEN, 6119 +KHMER DIGIT EIGHT, 6120 +KHMER DIGIT NINE, 6121 +KHMER SYMBOL LEK ATTAK SON, 6128 +KHMER SYMBOL LEK ATTAK MUOY, 6129 +KHMER SYMBOL LEK ATTAK PII, 6130 +KHMER SYMBOL LEK ATTAK BEI, 6131 +KHMER SYMBOL LEK ATTAK BUON, 6132 +KHMER SYMBOL LEK ATTAK PRAM, 6133 +KHMER SYMBOL LEK ATTAK PRAM MUOY, 6134 +KHMER SYMBOL LEK ATTAK PRAM PII, 6135 +KHMER SYMBOL LEK ATTAK PRAM BEI, 6136 +KHMER SYMBOL LEK ATTAK PRAM BUON, 6137 +MONGOLIAN BIRGA, 6144 +MONGOLIAN ELLIPSIS, 6145 +MONGOLIAN COMMA, 6146 +MONGOLIAN FULL STOP, 6147 +MONGOLIAN COLON, 6148 +MONGOLIAN FOUR DOTS, 6149 +MONGOLIAN TODO SOFT HYPHEN, 6150 +MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER, 6151 +MONGOLIAN MANCHU COMMA, 6152 +MONGOLIAN MANCHU FULL STOP, 6153 +MONGOLIAN NIRUGU, 6154 +MONGOLIAN FREE VARIATION SELECTOR ONE, 6155 +MONGOLIAN FREE VARIATION SELECTOR TWO, 6156 +MONGOLIAN FREE VARIATION SELECTOR THREE, 6157 +MONGOLIAN VOWEL SEPARATOR, 6158 +MONGOLIAN DIGIT ZERO, 6160 +MONGOLIAN DIGIT ONE, 6161 +MONGOLIAN DIGIT TWO, 6162 +MONGOLIAN DIGIT THREE, 6163 +MONGOLIAN DIGIT FOUR, 6164 +MONGOLIAN DIGIT FIVE, 6165 +MONGOLIAN DIGIT SIX, 6166 +MONGOLIAN DIGIT SEVEN, 6167 +MONGOLIAN DIGIT EIGHT, 6168 +MONGOLIAN DIGIT NINE, 6169 +MONGOLIAN LETTER A, 6176 +MONGOLIAN LETTER E, 6177 +MONGOLIAN LETTER I, 6178 +MONGOLIAN LETTER O, 6179 +MONGOLIAN LETTER U, 6180 +MONGOLIAN LETTER OE, 6181 +MONGOLIAN LETTER UE, 6182 +MONGOLIAN LETTER EE, 6183 +MONGOLIAN LETTER NA, 6184 +MONGOLIAN LETTER ANG, 6185 +MONGOLIAN LETTER BA, 6186 +MONGOLIAN LETTER PA, 6187 +MONGOLIAN LETTER QA, 6188 +MONGOLIAN LETTER GA, 6189 +MONGOLIAN LETTER MA, 6190 +MONGOLIAN LETTER LA, 6191 +MONGOLIAN LETTER SA, 6192 +MONGOLIAN LETTER SHA, 6193 +MONGOLIAN LETTER TA, 6194 +MONGOLIAN LETTER DA, 6195 +MONGOLIAN LETTER CHA, 6196 +MONGOLIAN LETTER JA, 6197 +MONGOLIAN LETTER YA, 6198 +MONGOLIAN LETTER RA, 6199 +MONGOLIAN LETTER WA, 6200 +MONGOLIAN LETTER FA, 6201 +MONGOLIAN LETTER KA, 6202 +MONGOLIAN LETTER KHA, 6203 +MONGOLIAN LETTER TSA, 6204 +MONGOLIAN LETTER ZA, 6205 +MONGOLIAN LETTER HAA, 6206 +MONGOLIAN LETTER ZRA, 6207 +MONGOLIAN LETTER LHA, 6208 +MONGOLIAN LETTER ZHI, 6209 +MONGOLIAN LETTER CHI, 6210 +MONGOLIAN LETTER TODO LONG VOWEL SIGN, 6211 +MONGOLIAN LETTER TODO E, 6212 +MONGOLIAN LETTER TODO I, 6213 +MONGOLIAN LETTER TODO O, 6214 +MONGOLIAN LETTER TODO U, 6215 +MONGOLIAN LETTER TODO OE, 6216 +MONGOLIAN LETTER TODO UE, 6217 +MONGOLIAN LETTER TODO ANG, 6218 +MONGOLIAN LETTER TODO BA, 6219 +MONGOLIAN LETTER TODO PA, 6220 +MONGOLIAN LETTER TODO QA, 6221 +MONGOLIAN LETTER TODO GA, 6222 +MONGOLIAN LETTER TODO MA, 6223 +MONGOLIAN LETTER TODO TA, 6224 +MONGOLIAN LETTER TODO DA, 6225 +MONGOLIAN LETTER TODO CHA, 6226 +MONGOLIAN LETTER TODO JA, 6227 +MONGOLIAN LETTER TODO TSA, 6228 +MONGOLIAN LETTER TODO YA, 6229 +MONGOLIAN LETTER TODO WA, 6230 +MONGOLIAN LETTER TODO KA, 6231 +MONGOLIAN LETTER TODO GAA, 6232 +MONGOLIAN LETTER TODO HAA, 6233 +MONGOLIAN LETTER TODO JIA, 6234 +MONGOLIAN LETTER TODO NIA, 6235 +MONGOLIAN LETTER TODO DZA, 6236 +MONGOLIAN LETTER SIBE E, 6237 +MONGOLIAN LETTER SIBE I, 6238 +MONGOLIAN LETTER SIBE IY, 6239 +MONGOLIAN LETTER SIBE UE, 6240 +MONGOLIAN LETTER SIBE U, 6241 +MONGOLIAN LETTER SIBE ANG, 6242 +MONGOLIAN LETTER SIBE KA, 6243 +MONGOLIAN LETTER SIBE GA, 6244 +MONGOLIAN LETTER SIBE HA, 6245 +MONGOLIAN LETTER SIBE PA, 6246 +MONGOLIAN LETTER SIBE SHA, 6247 +MONGOLIAN LETTER SIBE TA, 6248 +MONGOLIAN LETTER SIBE DA, 6249 +MONGOLIAN LETTER SIBE JA, 6250 +MONGOLIAN LETTER SIBE FA, 6251 +MONGOLIAN LETTER SIBE GAA, 6252 +MONGOLIAN LETTER SIBE HAA, 6253 +MONGOLIAN LETTER SIBE TSA, 6254 +MONGOLIAN LETTER SIBE ZA, 6255 +MONGOLIAN LETTER SIBE RAA, 6256 +MONGOLIAN LETTER SIBE CHA, 6257 +MONGOLIAN LETTER SIBE ZHA, 6258 +MONGOLIAN LETTER MANCHU I, 6259 +MONGOLIAN LETTER MANCHU KA, 6260 +MONGOLIAN LETTER MANCHU RA, 6261 +MONGOLIAN LETTER MANCHU FA, 6262 +MONGOLIAN LETTER MANCHU ZHA, 6263 +MONGOLIAN LETTER ALI GALI ANUSVARA ONE, 6272 +MONGOLIAN LETTER ALI GALI VISARGA ONE, 6273 +MONGOLIAN LETTER ALI GALI DAMARU, 6274 +MONGOLIAN LETTER ALI GALI UBADAMA, 6275 +MONGOLIAN LETTER ALI GALI INVERTED UBADAMA, 6276 +MONGOLIAN LETTER ALI GALI BALUDA, 6277 +MONGOLIAN LETTER ALI GALI THREE BALUDA, 6278 +MONGOLIAN LETTER ALI GALI A, 6279 +MONGOLIAN LETTER ALI GALI I, 6280 +MONGOLIAN LETTER ALI GALI KA, 6281 +MONGOLIAN LETTER ALI GALI NGA, 6282 +MONGOLIAN LETTER ALI GALI CA, 6283 +MONGOLIAN LETTER ALI GALI TTA, 6284 +MONGOLIAN LETTER ALI GALI TTHA, 6285 +MONGOLIAN LETTER ALI GALI DDA, 6286 +MONGOLIAN LETTER ALI GALI NNA, 6287 +MONGOLIAN LETTER ALI GALI TA, 6288 +MONGOLIAN LETTER ALI GALI DA, 6289 +MONGOLIAN LETTER ALI GALI PA, 6290 +MONGOLIAN LETTER ALI GALI PHA, 6291 +MONGOLIAN LETTER ALI GALI SSA, 6292 +MONGOLIAN LETTER ALI GALI ZHA, 6293 +MONGOLIAN LETTER ALI GALI ZA, 6294 +MONGOLIAN LETTER ALI GALI AH, 6295 +MONGOLIAN LETTER TODO ALI GALI TA, 6296 +MONGOLIAN LETTER TODO ALI GALI ZHA, 6297 +MONGOLIAN LETTER MANCHU ALI GALI GHA, 6298 +MONGOLIAN LETTER MANCHU ALI GALI NGA, 6299 +MONGOLIAN LETTER MANCHU ALI GALI CA, 6300 +MONGOLIAN LETTER MANCHU ALI GALI JHA, 6301 +MONGOLIAN LETTER MANCHU ALI GALI TTA, 6302 +MONGOLIAN LETTER MANCHU ALI GALI DDHA, 6303 +MONGOLIAN LETTER MANCHU ALI GALI TA, 6304 +MONGOLIAN LETTER MANCHU ALI GALI DHA, 6305 +MONGOLIAN LETTER MANCHU ALI GALI SSA, 6306 +MONGOLIAN LETTER MANCHU ALI GALI CYA, 6307 +MONGOLIAN LETTER MANCHU ALI GALI ZHA, 6308 +MONGOLIAN LETTER MANCHU ALI GALI ZA, 6309 +MONGOLIAN LETTER ALI GALI HALF U, 6310 +MONGOLIAN LETTER ALI GALI HALF YA, 6311 +MONGOLIAN LETTER MANCHU ALI GALI BHA, 6312 +MONGOLIAN LETTER ALI GALI DAGALGA, 6313 +MONGOLIAN LETTER MANCHU ALI GALI LHA, 6314 +CANADIAN SYLLABICS OY, 6320 +CANADIAN SYLLABICS AY, 6321 +CANADIAN SYLLABICS AAY, 6322 +CANADIAN SYLLABICS WAY, 6323 +CANADIAN SYLLABICS POY, 6324 +CANADIAN SYLLABICS PAY, 6325 +CANADIAN SYLLABICS PWOY, 6326 +CANADIAN SYLLABICS TAY, 6327 +CANADIAN SYLLABICS KAY, 6328 +CANADIAN SYLLABICS KWAY, 6329 +CANADIAN SYLLABICS MAY, 6330 +CANADIAN SYLLABICS NOY, 6331 +CANADIAN SYLLABICS NAY, 6332 +CANADIAN SYLLABICS LAY, 6333 +CANADIAN SYLLABICS SOY, 6334 +CANADIAN SYLLABICS SAY, 6335 +CANADIAN SYLLABICS SHOY, 6336 +CANADIAN SYLLABICS SHAY, 6337 +CANADIAN SYLLABICS SHWOY, 6338 +CANADIAN SYLLABICS YOY, 6339 +CANADIAN SYLLABICS YAY, 6340 +CANADIAN SYLLABICS RAY, 6341 +CANADIAN SYLLABICS NWI, 6342 +CANADIAN SYLLABICS OJIBWAY NWI, 6343 +CANADIAN SYLLABICS NWII, 6344 +CANADIAN SYLLABICS OJIBWAY NWII, 6345 +CANADIAN SYLLABICS NWO, 6346 +CANADIAN SYLLABICS OJIBWAY NWO, 6347 +CANADIAN SYLLABICS NWOO, 6348 +CANADIAN SYLLABICS OJIBWAY NWOO, 6349 +CANADIAN SYLLABICS RWEE, 6350 +CANADIAN SYLLABICS RWI, 6351 +CANADIAN SYLLABICS RWII, 6352 +CANADIAN SYLLABICS RWO, 6353 +CANADIAN SYLLABICS RWOO, 6354 +CANADIAN SYLLABICS RWA, 6355 +CANADIAN SYLLABICS OJIBWAY P, 6356 +CANADIAN SYLLABICS OJIBWAY T, 6357 +CANADIAN SYLLABICS OJIBWAY K, 6358 +CANADIAN SYLLABICS OJIBWAY C, 6359 +CANADIAN SYLLABICS OJIBWAY M, 6360 +CANADIAN SYLLABICS OJIBWAY N, 6361 +CANADIAN SYLLABICS OJIBWAY S, 6362 +CANADIAN SYLLABICS OJIBWAY SH, 6363 +CANADIAN SYLLABICS EASTERN W, 6364 +CANADIAN SYLLABICS WESTERN W, 6365 +CANADIAN SYLLABICS FINAL SMALL RING, 6366 +CANADIAN SYLLABICS FINAL RAISED DOT, 6367 +CANADIAN SYLLABICS R CREE RWE, 6368 +CANADIAN SYLLABICS WEST CREE LOO, 6369 +CANADIAN SYLLABICS WEST CREE LAA, 6370 +CANADIAN SYLLABICS THWE, 6371 +CANADIAN SYLLABICS THWA, 6372 +CANADIAN SYLLABICS TTHWE, 6373 +CANADIAN SYLLABICS TTHOO, 6374 +CANADIAN SYLLABICS TTHAA, 6375 +CANADIAN SYLLABICS TLHWE, 6376 +CANADIAN SYLLABICS TLHOO, 6377 +CANADIAN SYLLABICS SAYISI SHWE, 6378 +CANADIAN SYLLABICS SAYISI SHOO, 6379 +CANADIAN SYLLABICS SAYISI HOO, 6380 +CANADIAN SYLLABICS CARRIER GWU, 6381 +CANADIAN SYLLABICS CARRIER DENE GEE, 6382 +CANADIAN SYLLABICS CARRIER GAA, 6383 +CANADIAN SYLLABICS CARRIER GWA, 6384 +CANADIAN SYLLABICS SAYISI JUU, 6385 +CANADIAN SYLLABICS CARRIER JWA, 6386 +CANADIAN SYLLABICS BEAVER DENE L, 6387 +CANADIAN SYLLABICS BEAVER DENE R, 6388 +CANADIAN SYLLABICS CARRIER DENTAL S, 6389 +LIMBU VOWEL CARRIER LETTER, 6400 +LIMBU LETTER KA, 6401 +LIMBU LETTER KHA, 6402 +LIMBU LETTER GA, 6403 +LIMBU LETTER GHA, 6404 +LIMBU LETTER NGA, 6405 +LIMBU LETTER CA, 6406 +LIMBU LETTER CHA, 6407 +LIMBU LETTER JA, 6408 +LIMBU LETTER JHA, 6409 +LIMBU LETTER YAN, 6410 +LIMBU LETTER TA, 6411 +LIMBU LETTER THA, 6412 +LIMBU LETTER DA, 6413 +LIMBU LETTER DHA, 6414 +LIMBU LETTER NA, 6415 +LIMBU LETTER PA, 6416 +LIMBU LETTER PHA, 6417 +LIMBU LETTER BA, 6418 +LIMBU LETTER BHA, 6419 +LIMBU LETTER MA, 6420 +LIMBU LETTER YA, 6421 +LIMBU LETTER RA, 6422 +LIMBU LETTER LA, 6423 +LIMBU LETTER WA, 6424 +LIMBU LETTER SHA, 6425 +LIMBU LETTER SSA, 6426 +LIMBU LETTER SA, 6427 +LIMBU LETTER HA, 6428 +LIMBU LETTER GYAN, 6429 +LIMBU LETTER TRA, 6430 +LIMBU VOWEL SIGN A, 6432 +LIMBU VOWEL SIGN I, 6433 +LIMBU VOWEL SIGN U, 6434 +LIMBU VOWEL SIGN EE, 6435 +LIMBU VOWEL SIGN AI, 6436 +LIMBU VOWEL SIGN OO, 6437 +LIMBU VOWEL SIGN AU, 6438 +LIMBU VOWEL SIGN E, 6439 +LIMBU VOWEL SIGN O, 6440 +LIMBU SUBJOINED LETTER YA, 6441 +LIMBU SUBJOINED LETTER RA, 6442 +LIMBU SUBJOINED LETTER WA, 6443 +LIMBU SMALL LETTER KA, 6448 +LIMBU SMALL LETTER NGA, 6449 +LIMBU SMALL LETTER ANUSVARA, 6450 +LIMBU SMALL LETTER TA, 6451 +LIMBU SMALL LETTER NA, 6452 +LIMBU SMALL LETTER PA, 6453 +LIMBU SMALL LETTER MA, 6454 +LIMBU SMALL LETTER RA, 6455 +LIMBU SMALL LETTER LA, 6456 +LIMBU SIGN MUKPHRENG, 6457 +LIMBU SIGN KEMPHRENG, 6458 +LIMBU SIGN SA I, 6459 +LIMBU SIGN LOO, 6464 +LIMBU EXCLAMATION MARK, 6468 +LIMBU QUESTION MARK, 6469 +LIMBU DIGIT ZERO, 6470 +LIMBU DIGIT ONE, 6471 +LIMBU DIGIT TWO, 6472 +LIMBU DIGIT THREE, 6473 +LIMBU DIGIT FOUR, 6474 +LIMBU DIGIT FIVE, 6475 +LIMBU DIGIT SIX, 6476 +LIMBU DIGIT SEVEN, 6477 +LIMBU DIGIT EIGHT, 6478 +LIMBU DIGIT NINE, 6479 +TAI LE LETTER KA, 6480 +TAI LE LETTER XA, 6481 +TAI LE LETTER NGA, 6482 +TAI LE LETTER TSA, 6483 +TAI LE LETTER SA, 6484 +TAI LE LETTER YA, 6485 +TAI LE LETTER TA, 6486 +TAI LE LETTER THA, 6487 +TAI LE LETTER LA, 6488 +TAI LE LETTER PA, 6489 +TAI LE LETTER PHA, 6490 +TAI LE LETTER MA, 6491 +TAI LE LETTER FA, 6492 +TAI LE LETTER VA, 6493 +TAI LE LETTER HA, 6494 +TAI LE LETTER QA, 6495 +TAI LE LETTER KHA, 6496 +TAI LE LETTER TSHA, 6497 +TAI LE LETTER NA, 6498 +TAI LE LETTER A, 6499 +TAI LE LETTER I, 6500 +TAI LE LETTER EE, 6501 +TAI LE LETTER EH, 6502 +TAI LE LETTER U, 6503 +TAI LE LETTER OO, 6504 +TAI LE LETTER O, 6505 +TAI LE LETTER UE, 6506 +TAI LE LETTER E, 6507 +TAI LE LETTER AUE, 6508 +TAI LE LETTER AI, 6509 +TAI LE LETTER TONE 2, 6512 +TAI LE LETTER TONE 3, 6513 +TAI LE LETTER TONE 4, 6514 +TAI LE LETTER TONE 5, 6515 +TAI LE LETTER TONE 6, 6516 +NEW TAI LUE LETTER HIGH QA, 6528 +NEW TAI LUE LETTER LOW QA, 6529 +NEW TAI LUE LETTER HIGH KA, 6530 +NEW TAI LUE LETTER HIGH XA, 6531 +NEW TAI LUE LETTER HIGH NGA, 6532 +NEW TAI LUE LETTER LOW KA, 6533 +NEW TAI LUE LETTER LOW XA, 6534 +NEW TAI LUE LETTER LOW NGA, 6535 +NEW TAI LUE LETTER HIGH TSA, 6536 +NEW TAI LUE LETTER HIGH SA, 6537 +NEW TAI LUE LETTER HIGH YA, 6538 +NEW TAI LUE LETTER LOW TSA, 6539 +NEW TAI LUE LETTER LOW SA, 6540 +NEW TAI LUE LETTER LOW YA, 6541 +NEW TAI LUE LETTER HIGH TA, 6542 +NEW TAI LUE LETTER HIGH THA, 6543 +NEW TAI LUE LETTER HIGH NA, 6544 +NEW TAI LUE LETTER LOW TA, 6545 +NEW TAI LUE LETTER LOW THA, 6546 +NEW TAI LUE LETTER LOW NA, 6547 +NEW TAI LUE LETTER HIGH PA, 6548 +NEW TAI LUE LETTER HIGH PHA, 6549 +NEW TAI LUE LETTER HIGH MA, 6550 +NEW TAI LUE LETTER LOW PA, 6551 +NEW TAI LUE LETTER LOW PHA, 6552 +NEW TAI LUE LETTER LOW MA, 6553 +NEW TAI LUE LETTER HIGH FA, 6554 +NEW TAI LUE LETTER HIGH VA, 6555 +NEW TAI LUE LETTER HIGH LA, 6556 +NEW TAI LUE LETTER LOW FA, 6557 +NEW TAI LUE LETTER LOW VA, 6558 +NEW TAI LUE LETTER LOW LA, 6559 +NEW TAI LUE LETTER HIGH HA, 6560 +NEW TAI LUE LETTER HIGH DA, 6561 +NEW TAI LUE LETTER HIGH BA, 6562 +NEW TAI LUE LETTER LOW HA, 6563 +NEW TAI LUE LETTER LOW DA, 6564 +NEW TAI LUE LETTER LOW BA, 6565 +NEW TAI LUE LETTER HIGH KVA, 6566 +NEW TAI LUE LETTER HIGH XVA, 6567 +NEW TAI LUE LETTER LOW KVA, 6568 +NEW TAI LUE LETTER LOW XVA, 6569 +NEW TAI LUE LETTER HIGH SUA, 6570 +NEW TAI LUE LETTER LOW SUA, 6571 +NEW TAI LUE VOWEL SIGN VOWEL SHORTENER, 6576 +NEW TAI LUE VOWEL SIGN AA, 6577 +NEW TAI LUE VOWEL SIGN II, 6578 +NEW TAI LUE VOWEL SIGN U, 6579 +NEW TAI LUE VOWEL SIGN UU, 6580 +NEW TAI LUE VOWEL SIGN E, 6581 +NEW TAI LUE VOWEL SIGN AE, 6582 +NEW TAI LUE VOWEL SIGN O, 6583 +NEW TAI LUE VOWEL SIGN OA, 6584 +NEW TAI LUE VOWEL SIGN UE, 6585 +NEW TAI LUE VOWEL SIGN AY, 6586 +NEW TAI LUE VOWEL SIGN AAY, 6587 +NEW TAI LUE VOWEL SIGN UY, 6588 +NEW TAI LUE VOWEL SIGN OY, 6589 +NEW TAI LUE VOWEL SIGN OAY, 6590 +NEW TAI LUE VOWEL SIGN UEY, 6591 +NEW TAI LUE VOWEL SIGN IY, 6592 +NEW TAI LUE LETTER FINAL V, 6593 +NEW TAI LUE LETTER FINAL NG, 6594 +NEW TAI LUE LETTER FINAL N, 6595 +NEW TAI LUE LETTER FINAL M, 6596 +NEW TAI LUE LETTER FINAL K, 6597 +NEW TAI LUE LETTER FINAL D, 6598 +NEW TAI LUE LETTER FINAL B, 6599 +NEW TAI LUE TONE MARK 1, 6600 +NEW TAI LUE TONE MARK 2, 6601 +NEW TAI LUE DIGIT ZERO, 6608 +NEW TAI LUE DIGIT ONE, 6609 +NEW TAI LUE DIGIT TWO, 6610 +NEW TAI LUE DIGIT THREE, 6611 +NEW TAI LUE DIGIT FOUR, 6612 +NEW TAI LUE DIGIT FIVE, 6613 +NEW TAI LUE DIGIT SIX, 6614 +NEW TAI LUE DIGIT SEVEN, 6615 +NEW TAI LUE DIGIT EIGHT, 6616 +NEW TAI LUE DIGIT NINE, 6617 +NEW TAI LUE THAM DIGIT ONE, 6618 +NEW TAI LUE SIGN LAE, 6622 +NEW TAI LUE SIGN LAEV, 6623 +KHMER SYMBOL PATHAMASAT, 6624 +KHMER SYMBOL MUOY KOET, 6625 +KHMER SYMBOL PII KOET, 6626 +KHMER SYMBOL BEI KOET, 6627 +KHMER SYMBOL BUON KOET, 6628 +KHMER SYMBOL PRAM KOET, 6629 +KHMER SYMBOL PRAM MUOY KOET, 6630 +KHMER SYMBOL PRAM PII KOET, 6631 +KHMER SYMBOL PRAM BEI KOET, 6632 +KHMER SYMBOL PRAM BUON KOET, 6633 +KHMER SYMBOL DAP KOET, 6634 +KHMER SYMBOL DAP MUOY KOET, 6635 +KHMER SYMBOL DAP PII KOET, 6636 +KHMER SYMBOL DAP BEI KOET, 6637 +KHMER SYMBOL DAP BUON KOET, 6638 +KHMER SYMBOL DAP PRAM KOET, 6639 +KHMER SYMBOL TUTEYASAT, 6640 +KHMER SYMBOL MUOY ROC, 6641 +KHMER SYMBOL PII ROC, 6642 +KHMER SYMBOL BEI ROC, 6643 +KHMER SYMBOL BUON ROC, 6644 +KHMER SYMBOL PRAM ROC, 6645 +KHMER SYMBOL PRAM MUOY ROC, 6646 +KHMER SYMBOL PRAM PII ROC, 6647 +KHMER SYMBOL PRAM BEI ROC, 6648 +KHMER SYMBOL PRAM BUON ROC, 6649 +KHMER SYMBOL DAP ROC, 6650 +KHMER SYMBOL DAP MUOY ROC, 6651 +KHMER SYMBOL DAP PII ROC, 6652 +KHMER SYMBOL DAP BEI ROC, 6653 +KHMER SYMBOL DAP BUON ROC, 6654 +KHMER SYMBOL DAP PRAM ROC, 6655 +BUGINESE LETTER KA, 6656 +BUGINESE LETTER GA, 6657 +BUGINESE LETTER NGA, 6658 +BUGINESE LETTER NGKA, 6659 +BUGINESE LETTER PA, 6660 +BUGINESE LETTER BA, 6661 +BUGINESE LETTER MA, 6662 +BUGINESE LETTER MPA, 6663 +BUGINESE LETTER TA, 6664 +BUGINESE LETTER DA, 6665 +BUGINESE LETTER NA, 6666 +BUGINESE LETTER NRA, 6667 +BUGINESE LETTER CA, 6668 +BUGINESE LETTER JA, 6669 +BUGINESE LETTER NYA, 6670 +BUGINESE LETTER NYCA, 6671 +BUGINESE LETTER YA, 6672 +BUGINESE LETTER RA, 6673 +BUGINESE LETTER LA, 6674 +BUGINESE LETTER VA, 6675 +BUGINESE LETTER SA, 6676 +BUGINESE LETTER A, 6677 +BUGINESE LETTER HA, 6678 +BUGINESE VOWEL SIGN I, 6679 +BUGINESE VOWEL SIGN U, 6680 +BUGINESE VOWEL SIGN E, 6681 +BUGINESE VOWEL SIGN O, 6682 +BUGINESE VOWEL SIGN AE, 6683 +BUGINESE PALLAWA, 6686 +BUGINESE END OF SECTION, 6687 +TAI THAM LETTER HIGH KA, 6688 +TAI THAM LETTER HIGH KHA, 6689 +TAI THAM LETTER HIGH KXA, 6690 +TAI THAM LETTER LOW KA, 6691 +TAI THAM LETTER LOW KXA, 6692 +TAI THAM LETTER LOW KHA, 6693 +TAI THAM LETTER NGA, 6694 +TAI THAM LETTER HIGH CA, 6695 +TAI THAM LETTER HIGH CHA, 6696 +TAI THAM LETTER LOW CA, 6697 +TAI THAM LETTER LOW SA, 6698 +TAI THAM LETTER LOW CHA, 6699 +TAI THAM LETTER NYA, 6700 +TAI THAM LETTER RATA, 6701 +TAI THAM LETTER HIGH RATHA, 6702 +TAI THAM LETTER DA, 6703 +TAI THAM LETTER LOW RATHA, 6704 +TAI THAM LETTER RANA, 6705 +TAI THAM LETTER HIGH TA, 6706 +TAI THAM LETTER HIGH THA, 6707 +TAI THAM LETTER LOW TA, 6708 +TAI THAM LETTER LOW THA, 6709 +TAI THAM LETTER NA, 6710 +TAI THAM LETTER BA, 6711 +TAI THAM LETTER HIGH PA, 6712 +TAI THAM LETTER HIGH PHA, 6713 +TAI THAM LETTER HIGH FA, 6714 +TAI THAM LETTER LOW PA, 6715 +TAI THAM LETTER LOW FA, 6716 +TAI THAM LETTER LOW PHA, 6717 +TAI THAM LETTER MA, 6718 +TAI THAM LETTER LOW YA, 6719 +TAI THAM LETTER HIGH YA, 6720 +TAI THAM LETTER RA, 6721 +TAI THAM LETTER RUE, 6722 +TAI THAM LETTER LA, 6723 +TAI THAM LETTER LUE, 6724 +TAI THAM LETTER WA, 6725 +TAI THAM LETTER HIGH SHA, 6726 +TAI THAM LETTER HIGH SSA, 6727 +TAI THAM LETTER HIGH SA, 6728 +TAI THAM LETTER HIGH HA, 6729 +TAI THAM LETTER LLA, 6730 +TAI THAM LETTER A, 6731 +TAI THAM LETTER LOW HA, 6732 +TAI THAM LETTER I, 6733 +TAI THAM LETTER II, 6734 +TAI THAM LETTER U, 6735 +TAI THAM LETTER UU, 6736 +TAI THAM LETTER EE, 6737 +TAI THAM LETTER OO, 6738 +TAI THAM LETTER LAE, 6739 +TAI THAM LETTER GREAT SA, 6740 +TAI THAM CONSONANT SIGN MEDIAL RA, 6741 +TAI THAM CONSONANT SIGN MEDIAL LA, 6742 +TAI THAM CONSONANT SIGN LA TANG LAI, 6743 +TAI THAM SIGN MAI KANG LAI, 6744 +TAI THAM CONSONANT SIGN FINAL NGA, 6745 +TAI THAM CONSONANT SIGN LOW PA, 6746 +TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA, 6747 +TAI THAM CONSONANT SIGN MA, 6748 +TAI THAM CONSONANT SIGN BA, 6749 +TAI THAM CONSONANT SIGN SA, 6750 +TAI THAM SIGN SAKOT, 6752 +TAI THAM VOWEL SIGN A, 6753 +TAI THAM VOWEL SIGN MAI SAT, 6754 +TAI THAM VOWEL SIGN AA, 6755 +TAI THAM VOWEL SIGN TALL AA, 6756 +TAI THAM VOWEL SIGN I, 6757 +TAI THAM VOWEL SIGN II, 6758 +TAI THAM VOWEL SIGN UE, 6759 +TAI THAM VOWEL SIGN UUE, 6760 +TAI THAM VOWEL SIGN U, 6761 +TAI THAM VOWEL SIGN UU, 6762 +TAI THAM VOWEL SIGN O, 6763 +TAI THAM VOWEL SIGN OA BELOW, 6764 +TAI THAM VOWEL SIGN OY, 6765 +TAI THAM VOWEL SIGN E, 6766 +TAI THAM VOWEL SIGN AE, 6767 +TAI THAM VOWEL SIGN OO, 6768 +TAI THAM VOWEL SIGN AI, 6769 +TAI THAM VOWEL SIGN THAM AI, 6770 +TAI THAM VOWEL SIGN OA ABOVE, 6771 +TAI THAM SIGN MAI KANG, 6772 +TAI THAM SIGN TONE 1, 6773 +TAI THAM SIGN TONE 2, 6774 +TAI THAM SIGN KHUEN TONE 3, 6775 +TAI THAM SIGN KHUEN TONE 4, 6776 +TAI THAM SIGN KHUEN TONE 5, 6777 +TAI THAM SIGN RA HAAM, 6778 +TAI THAM SIGN MAI SAM, 6779 +TAI THAM SIGN KHUEN LUE KARAN, 6780 +TAI THAM COMBINING CRYPTOGRAMMIC DOT, 6783 +TAI THAM HORA DIGIT ZERO, 6784 +TAI THAM HORA DIGIT ONE, 6785 +TAI THAM HORA DIGIT TWO, 6786 +TAI THAM HORA DIGIT THREE, 6787 +TAI THAM HORA DIGIT FOUR, 6788 +TAI THAM HORA DIGIT FIVE, 6789 +TAI THAM HORA DIGIT SIX, 6790 +TAI THAM HORA DIGIT SEVEN, 6791 +TAI THAM HORA DIGIT EIGHT, 6792 +TAI THAM HORA DIGIT NINE, 6793 +TAI THAM THAM DIGIT ZERO, 6800 +TAI THAM THAM DIGIT ONE, 6801 +TAI THAM THAM DIGIT TWO, 6802 +TAI THAM THAM DIGIT THREE, 6803 +TAI THAM THAM DIGIT FOUR, 6804 +TAI THAM THAM DIGIT FIVE, 6805 +TAI THAM THAM DIGIT SIX, 6806 +TAI THAM THAM DIGIT SEVEN, 6807 +TAI THAM THAM DIGIT EIGHT, 6808 +TAI THAM THAM DIGIT NINE, 6809 +TAI THAM SIGN WIANG, 6816 +TAI THAM SIGN WIANGWAAK, 6817 +TAI THAM SIGN SAWAN, 6818 +TAI THAM SIGN KEOW, 6819 +TAI THAM SIGN HOY, 6820 +TAI THAM SIGN DOKMAI, 6821 +TAI THAM SIGN REVERSED ROTATED RANA, 6822 +TAI THAM SIGN MAI YAMOK, 6823 +TAI THAM SIGN KAAN, 6824 +TAI THAM SIGN KAANKUU, 6825 +TAI THAM SIGN SATKAAN, 6826 +TAI THAM SIGN SATKAANKUU, 6827 +TAI THAM SIGN HANG, 6828 +TAI THAM SIGN CAANG, 6829 +COMBINING DOUBLED CIRCUMFLEX ACCENT, 6832 +COMBINING DIAERESIS RING, 6833 +COMBINING INFINITY, 6834 +COMBINING DOWNWARDS ARROW, 6835 +COMBINING TRIPLE DOT, 6836 +COMBINING X X BELOW, 6837 +COMBINING WIGGLY LINE BELOW, 6838 +COMBINING OPEN MARK BELOW, 6839 +COMBINING DOUBLE OPEN MARK BELOW, 6840 +COMBINING LIGHT CENTRALIZATION STROKE BELOW, 6841 +COMBINING STRONG CENTRALIZATION STROKE BELOW, 6842 +COMBINING PARENTHESES ABOVE, 6843 +COMBINING DOUBLE PARENTHESES ABOVE, 6844 +COMBINING PARENTHESES BELOW, 6845 +COMBINING PARENTHESES OVERLAY, 6846 +BALINESE SIGN ULU RICEM, 6912 +BALINESE SIGN ULU CANDRA, 6913 +BALINESE SIGN CECEK, 6914 +BALINESE SIGN SURANG, 6915 +BALINESE SIGN BISAH, 6916 +BALINESE LETTER AKARA, 6917 +BALINESE LETTER AKARA TEDUNG, 6918 +BALINESE LETTER IKARA, 6919 +BALINESE LETTER IKARA TEDUNG, 6920 +BALINESE LETTER UKARA, 6921 +BALINESE LETTER UKARA TEDUNG, 6922 +BALINESE LETTER RA REPA, 6923 +BALINESE LETTER RA REPA TEDUNG, 6924 +BALINESE LETTER LA LENGA, 6925 +BALINESE LETTER LA LENGA TEDUNG, 6926 +BALINESE LETTER EKARA, 6927 +BALINESE LETTER AIKARA, 6928 +BALINESE LETTER OKARA, 6929 +BALINESE LETTER OKARA TEDUNG, 6930 +BALINESE LETTER KA, 6931 +BALINESE LETTER KA MAHAPRANA, 6932 +BALINESE LETTER GA, 6933 +BALINESE LETTER GA GORA, 6934 +BALINESE LETTER NGA, 6935 +BALINESE LETTER CA, 6936 +BALINESE LETTER CA LACA, 6937 +BALINESE LETTER JA, 6938 +BALINESE LETTER JA JERA, 6939 +BALINESE LETTER NYA, 6940 +BALINESE LETTER TA LATIK, 6941 +BALINESE LETTER TA MURDA MAHAPRANA, 6942 +BALINESE LETTER DA MURDA ALPAPRANA, 6943 +BALINESE LETTER DA MURDA MAHAPRANA, 6944 +BALINESE LETTER NA RAMBAT, 6945 +BALINESE LETTER TA, 6946 +BALINESE LETTER TA TAWA, 6947 +BALINESE LETTER DA, 6948 +BALINESE LETTER DA MADU, 6949 +BALINESE LETTER NA, 6950 +BALINESE LETTER PA, 6951 +BALINESE LETTER PA KAPAL, 6952 +BALINESE LETTER BA, 6953 +BALINESE LETTER BA KEMBANG, 6954 +BALINESE LETTER MA, 6955 +BALINESE LETTER YA, 6956 +BALINESE LETTER RA, 6957 +BALINESE LETTER LA, 6958 +BALINESE LETTER WA, 6959 +BALINESE LETTER SA SAGA, 6960 +BALINESE LETTER SA SAPA, 6961 +BALINESE LETTER SA, 6962 +BALINESE LETTER HA, 6963 +BALINESE SIGN REREKAN, 6964 +BALINESE VOWEL SIGN TEDUNG, 6965 +BALINESE VOWEL SIGN ULU, 6966 +BALINESE VOWEL SIGN ULU SARI, 6967 +BALINESE VOWEL SIGN SUKU, 6968 +BALINESE VOWEL SIGN SUKU ILUT, 6969 +BALINESE VOWEL SIGN RA REPA, 6970 +BALINESE VOWEL SIGN RA REPA TEDUNG, 6971 +BALINESE VOWEL SIGN LA LENGA, 6972 +BALINESE VOWEL SIGN LA LENGA TEDUNG, 6973 +BALINESE VOWEL SIGN TALING, 6974 +BALINESE VOWEL SIGN TALING REPA, 6975 +BALINESE VOWEL SIGN TALING TEDUNG, 6976 +BALINESE VOWEL SIGN TALING REPA TEDUNG, 6977 +BALINESE VOWEL SIGN PEPET, 6978 +BALINESE VOWEL SIGN PEPET TEDUNG, 6979 +BALINESE ADEG ADEG, 6980 +BALINESE LETTER KAF SASAK, 6981 +BALINESE LETTER KHOT SASAK, 6982 +BALINESE LETTER TZIR SASAK, 6983 +BALINESE LETTER EF SASAK, 6984 +BALINESE LETTER VE SASAK, 6985 +BALINESE LETTER ZAL SASAK, 6986 +BALINESE LETTER ASYURA SASAK, 6987 +BALINESE DIGIT ZERO, 6992 +BALINESE DIGIT ONE, 6993 +BALINESE DIGIT TWO, 6994 +BALINESE DIGIT THREE, 6995 +BALINESE DIGIT FOUR, 6996 +BALINESE DIGIT FIVE, 6997 +BALINESE DIGIT SIX, 6998 +BALINESE DIGIT SEVEN, 6999 +BALINESE DIGIT EIGHT, 7000 +BALINESE DIGIT NINE, 7001 +BALINESE PANTI, 7002 +BALINESE PAMADA, 7003 +BALINESE WINDU, 7004 +BALINESE CARIK PAMUNGKAH, 7005 +BALINESE CARIK SIKI, 7006 +BALINESE CARIK PAREREN, 7007 +BALINESE PAMENENG, 7008 +BALINESE MUSICAL SYMBOL DONG, 7009 +BALINESE MUSICAL SYMBOL DENG, 7010 +BALINESE MUSICAL SYMBOL DUNG, 7011 +BALINESE MUSICAL SYMBOL DANG, 7012 +BALINESE MUSICAL SYMBOL DANG SURANG, 7013 +BALINESE MUSICAL SYMBOL DING, 7014 +BALINESE MUSICAL SYMBOL DAENG, 7015 +BALINESE MUSICAL SYMBOL DEUNG, 7016 +BALINESE MUSICAL SYMBOL DAING, 7017 +BALINESE MUSICAL SYMBOL DANG GEDE, 7018 +BALINESE MUSICAL SYMBOL COMBINING TEGEH, 7019 +BALINESE MUSICAL SYMBOL COMBINING ENDEP, 7020 +BALINESE MUSICAL SYMBOL COMBINING KEMPUL, 7021 +BALINESE MUSICAL SYMBOL COMBINING KEMPLI, 7022 +BALINESE MUSICAL SYMBOL COMBINING JEGOGAN, 7023 +BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN, 7024 +BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN, 7025 +BALINESE MUSICAL SYMBOL COMBINING BENDE, 7026 +BALINESE MUSICAL SYMBOL COMBINING GONG, 7027 +BALINESE MUSICAL SYMBOL RIGHT HAND OPEN DUG, 7028 +BALINESE MUSICAL SYMBOL RIGHT HAND OPEN DAG, 7029 +BALINESE MUSICAL SYMBOL RIGHT HAND CLOSED TUK, 7030 +BALINESE MUSICAL SYMBOL RIGHT HAND CLOSED TAK, 7031 +BALINESE MUSICAL SYMBOL LEFT HAND OPEN PANG, 7032 +BALINESE MUSICAL SYMBOL LEFT HAND OPEN PUNG, 7033 +BALINESE MUSICAL SYMBOL LEFT HAND CLOSED PLAK, 7034 +BALINESE MUSICAL SYMBOL LEFT HAND CLOSED PLUK, 7035 +BALINESE MUSICAL SYMBOL LEFT HAND OPEN PING, 7036 +SUNDANESE SIGN PANYECEK, 7040 +SUNDANESE SIGN PANGLAYAR, 7041 +SUNDANESE SIGN PANGWISAD, 7042 +SUNDANESE LETTER A, 7043 +SUNDANESE LETTER I, 7044 +SUNDANESE LETTER U, 7045 +SUNDANESE LETTER AE, 7046 +SUNDANESE LETTER O, 7047 +SUNDANESE LETTER E, 7048 +SUNDANESE LETTER EU, 7049 +SUNDANESE LETTER KA, 7050 +SUNDANESE LETTER QA, 7051 +SUNDANESE LETTER GA, 7052 +SUNDANESE LETTER NGA, 7053 +SUNDANESE LETTER CA, 7054 +SUNDANESE LETTER JA, 7055 +SUNDANESE LETTER ZA, 7056 +SUNDANESE LETTER NYA, 7057 +SUNDANESE LETTER TA, 7058 +SUNDANESE LETTER DA, 7059 +SUNDANESE LETTER NA, 7060 +SUNDANESE LETTER PA, 7061 +SUNDANESE LETTER FA, 7062 +SUNDANESE LETTER VA, 7063 +SUNDANESE LETTER BA, 7064 +SUNDANESE LETTER MA, 7065 +SUNDANESE LETTER YA, 7066 +SUNDANESE LETTER RA, 7067 +SUNDANESE LETTER LA, 7068 +SUNDANESE LETTER WA, 7069 +SUNDANESE LETTER SA, 7070 +SUNDANESE LETTER XA, 7071 +SUNDANESE LETTER HA, 7072 +SUNDANESE CONSONANT SIGN PAMINGKAL, 7073 +SUNDANESE CONSONANT SIGN PANYAKRA, 7074 +SUNDANESE CONSONANT SIGN PANYIKU, 7075 +SUNDANESE VOWEL SIGN PANGHULU, 7076 +SUNDANESE VOWEL SIGN PANYUKU, 7077 +SUNDANESE VOWEL SIGN PANAELAENG, 7078 +SUNDANESE VOWEL SIGN PANOLONG, 7079 +SUNDANESE VOWEL SIGN PAMEPET, 7080 +SUNDANESE VOWEL SIGN PANEULEUNG, 7081 +SUNDANESE SIGN PAMAAEH, 7082 +SUNDANESE SIGN VIRAMA, 7083 +SUNDANESE CONSONANT SIGN PASANGAN MA, 7084 +SUNDANESE CONSONANT SIGN PASANGAN WA, 7085 +SUNDANESE LETTER KHA, 7086 +SUNDANESE LETTER SYA, 7087 +SUNDANESE DIGIT ZERO, 7088 +SUNDANESE DIGIT ONE, 7089 +SUNDANESE DIGIT TWO, 7090 +SUNDANESE DIGIT THREE, 7091 +SUNDANESE DIGIT FOUR, 7092 +SUNDANESE DIGIT FIVE, 7093 +SUNDANESE DIGIT SIX, 7094 +SUNDANESE DIGIT SEVEN, 7095 +SUNDANESE DIGIT EIGHT, 7096 +SUNDANESE DIGIT NINE, 7097 +SUNDANESE AVAGRAHA, 7098 +SUNDANESE LETTER REU, 7099 +SUNDANESE LETTER LEU, 7100 +SUNDANESE LETTER BHA, 7101 +SUNDANESE LETTER FINAL K, 7102 +SUNDANESE LETTER FINAL M, 7103 +BATAK LETTER A, 7104 +BATAK LETTER SIMALUNGUN A, 7105 +BATAK LETTER HA, 7106 +BATAK LETTER SIMALUNGUN HA, 7107 +BATAK LETTER MANDAILING HA, 7108 +BATAK LETTER BA, 7109 +BATAK LETTER KARO BA, 7110 +BATAK LETTER PA, 7111 +BATAK LETTER SIMALUNGUN PA, 7112 +BATAK LETTER NA, 7113 +BATAK LETTER MANDAILING NA, 7114 +BATAK LETTER WA, 7115 +BATAK LETTER SIMALUNGUN WA, 7116 +BATAK LETTER PAKPAK WA, 7117 +BATAK LETTER GA, 7118 +BATAK LETTER SIMALUNGUN GA, 7119 +BATAK LETTER JA, 7120 +BATAK LETTER DA, 7121 +BATAK LETTER RA, 7122 +BATAK LETTER SIMALUNGUN RA, 7123 +BATAK LETTER MA, 7124 +BATAK LETTER SIMALUNGUN MA, 7125 +BATAK LETTER SOUTHERN TA, 7126 +BATAK LETTER NORTHERN TA, 7127 +BATAK LETTER SA, 7128 +BATAK LETTER SIMALUNGUN SA, 7129 +BATAK LETTER MANDAILING SA, 7130 +BATAK LETTER YA, 7131 +BATAK LETTER SIMALUNGUN YA, 7132 +BATAK LETTER NGA, 7133 +BATAK LETTER LA, 7134 +BATAK LETTER SIMALUNGUN LA, 7135 +BATAK LETTER NYA, 7136 +BATAK LETTER CA, 7137 +BATAK LETTER NDA, 7138 +BATAK LETTER MBA, 7139 +BATAK LETTER I, 7140 +BATAK LETTER U, 7141 +BATAK SIGN TOMPI, 7142 +BATAK VOWEL SIGN E, 7143 +BATAK VOWEL SIGN PAKPAK E, 7144 +BATAK VOWEL SIGN EE, 7145 +BATAK VOWEL SIGN I, 7146 +BATAK VOWEL SIGN KARO I, 7147 +BATAK VOWEL SIGN O, 7148 +BATAK VOWEL SIGN KARO O, 7149 +BATAK VOWEL SIGN U, 7150 +BATAK VOWEL SIGN U FOR SIMALUNGUN SA, 7151 +BATAK CONSONANT SIGN NG, 7152 +BATAK CONSONANT SIGN H, 7153 +BATAK PANGOLAT, 7154 +BATAK PANONGONAN, 7155 +BATAK SYMBOL BINDU NA METEK, 7164 +BATAK SYMBOL BINDU PINARBORAS, 7165 +BATAK SYMBOL BINDU JUDUL, 7166 +BATAK SYMBOL BINDU PANGOLAT, 7167 +LEPCHA LETTER KA, 7168 +LEPCHA LETTER KLA, 7169 +LEPCHA LETTER KHA, 7170 +LEPCHA LETTER GA, 7171 +LEPCHA LETTER GLA, 7172 +LEPCHA LETTER NGA, 7173 +LEPCHA LETTER CA, 7174 +LEPCHA LETTER CHA, 7175 +LEPCHA LETTER JA, 7176 +LEPCHA LETTER NYA, 7177 +LEPCHA LETTER TA, 7178 +LEPCHA LETTER THA, 7179 +LEPCHA LETTER DA, 7180 +LEPCHA LETTER NA, 7181 +LEPCHA LETTER PA, 7182 +LEPCHA LETTER PLA, 7183 +LEPCHA LETTER PHA, 7184 +LEPCHA LETTER FA, 7185 +LEPCHA LETTER FLA, 7186 +LEPCHA LETTER BA, 7187 +LEPCHA LETTER BLA, 7188 +LEPCHA LETTER MA, 7189 +LEPCHA LETTER MLA, 7190 +LEPCHA LETTER TSA, 7191 +LEPCHA LETTER TSHA, 7192 +LEPCHA LETTER DZA, 7193 +LEPCHA LETTER YA, 7194 +LEPCHA LETTER RA, 7195 +LEPCHA LETTER LA, 7196 +LEPCHA LETTER HA, 7197 +LEPCHA LETTER HLA, 7198 +LEPCHA LETTER VA, 7199 +LEPCHA LETTER SA, 7200 +LEPCHA LETTER SHA, 7201 +LEPCHA LETTER WA, 7202 +LEPCHA LETTER A, 7203 +LEPCHA SUBJOINED LETTER YA, 7204 +LEPCHA SUBJOINED LETTER RA, 7205 +LEPCHA VOWEL SIGN AA, 7206 +LEPCHA VOWEL SIGN I, 7207 +LEPCHA VOWEL SIGN O, 7208 +LEPCHA VOWEL SIGN OO, 7209 +LEPCHA VOWEL SIGN U, 7210 +LEPCHA VOWEL SIGN UU, 7211 +LEPCHA VOWEL SIGN E, 7212 +LEPCHA CONSONANT SIGN K, 7213 +LEPCHA CONSONANT SIGN M, 7214 +LEPCHA CONSONANT SIGN L, 7215 +LEPCHA CONSONANT SIGN N, 7216 +LEPCHA CONSONANT SIGN P, 7217 +LEPCHA CONSONANT SIGN R, 7218 +LEPCHA CONSONANT SIGN T, 7219 +LEPCHA CONSONANT SIGN NYIN DO, 7220 +LEPCHA CONSONANT SIGN KANG, 7221 +LEPCHA SIGN RAN, 7222 +LEPCHA SIGN NUKTA, 7223 +LEPCHA PUNCTUATION TA ROL, 7227 +LEPCHA PUNCTUATION NYET THYOOM TA ROL, 7228 +LEPCHA PUNCTUATION CER WA, 7229 +LEPCHA PUNCTUATION TSHOOK CER WA, 7230 +LEPCHA PUNCTUATION TSHOOK, 7231 +LEPCHA DIGIT ZERO, 7232 +LEPCHA DIGIT ONE, 7233 +LEPCHA DIGIT TWO, 7234 +LEPCHA DIGIT THREE, 7235 +LEPCHA DIGIT FOUR, 7236 +LEPCHA DIGIT FIVE, 7237 +LEPCHA DIGIT SIX, 7238 +LEPCHA DIGIT SEVEN, 7239 +LEPCHA DIGIT EIGHT, 7240 +LEPCHA DIGIT NINE, 7241 +LEPCHA LETTER TTA, 7245 +LEPCHA LETTER TTHA, 7246 +LEPCHA LETTER DDA, 7247 +OL CHIKI DIGIT ZERO, 7248 +OL CHIKI DIGIT ONE, 7249 +OL CHIKI DIGIT TWO, 7250 +OL CHIKI DIGIT THREE, 7251 +OL CHIKI DIGIT FOUR, 7252 +OL CHIKI DIGIT FIVE, 7253 +OL CHIKI DIGIT SIX, 7254 +OL CHIKI DIGIT SEVEN, 7255 +OL CHIKI DIGIT EIGHT, 7256 +OL CHIKI DIGIT NINE, 7257 +OL CHIKI LETTER LA, 7258 +OL CHIKI LETTER AT, 7259 +OL CHIKI LETTER AG, 7260 +OL CHIKI LETTER ANG, 7261 +OL CHIKI LETTER AL, 7262 +OL CHIKI LETTER LAA, 7263 +OL CHIKI LETTER AAK, 7264 +OL CHIKI LETTER AAJ, 7265 +OL CHIKI LETTER AAM, 7266 +OL CHIKI LETTER AAW, 7267 +OL CHIKI LETTER LI, 7268 +OL CHIKI LETTER IS, 7269 +OL CHIKI LETTER IH, 7270 +OL CHIKI LETTER INY, 7271 +OL CHIKI LETTER IR, 7272 +OL CHIKI LETTER LU, 7273 +OL CHIKI LETTER UC, 7274 +OL CHIKI LETTER UD, 7275 +OL CHIKI LETTER UNN, 7276 +OL CHIKI LETTER UY, 7277 +OL CHIKI LETTER LE, 7278 +OL CHIKI LETTER EP, 7279 +OL CHIKI LETTER EDD, 7280 +OL CHIKI LETTER EN, 7281 +OL CHIKI LETTER ERR, 7282 +OL CHIKI LETTER LO, 7283 +OL CHIKI LETTER OTT, 7284 +OL CHIKI LETTER OB, 7285 +OL CHIKI LETTER OV, 7286 +OL CHIKI LETTER OH, 7287 +OL CHIKI MU TTUDDAG, 7288 +OL CHIKI GAAHLAA TTUDDAAG, 7289 +OL CHIKI MU GAAHLAA TTUDDAAG, 7290 +OL CHIKI RELAA, 7291 +OL CHIKI PHAARKAA, 7292 +OL CHIKI AHAD, 7293 +OL CHIKI PUNCTUATION MUCAAD, 7294 +OL CHIKI PUNCTUATION DOUBLE MUCAAD, 7295 +CYRILLIC SMALL LETTER ROUNDED VE, 7296 +CYRILLIC SMALL LETTER LONG LEGGED DE, 7297 +CYRILLIC SMALL LETTER NARROW O, 7298 +CYRILLIC SMALL LETTER WIDE ES, 7299 +CYRILLIC SMALL LETTER TALL TE, 7300 +CYRILLIC SMALL LETTER THREE LEGGED TE, 7301 +CYRILLIC SMALL LETTER TALL HARD SIGN, 7302 +CYRILLIC SMALL LETTER TALL YAT, 7303 +CYRILLIC SMALL LETTER UNBLENDED UK, 7304 +SUNDANESE PUNCTUATION BINDU SURYA, 7360 +SUNDANESE PUNCTUATION BINDU PANGLONG, 7361 +SUNDANESE PUNCTUATION BINDU PURNAMA, 7362 +SUNDANESE PUNCTUATION BINDU CAKRA, 7363 +SUNDANESE PUNCTUATION BINDU LEU SATANGA, 7364 +SUNDANESE PUNCTUATION BINDU KA SATANGA, 7365 +SUNDANESE PUNCTUATION BINDU DA SATANGA, 7366 +SUNDANESE PUNCTUATION BINDU BA SATANGA, 7367 +VEDIC TONE KARSHANA, 7376 +VEDIC TONE SHARA, 7377 +VEDIC TONE PRENKHA, 7378 +VEDIC SIGN NIHSHVASA, 7379 +VEDIC SIGN YAJURVEDIC MIDLINE SVARITA, 7380 +VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA, 7381 +VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA, 7382 +VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA, 7383 +VEDIC TONE CANDRA BELOW, 7384 +VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER, 7385 +VEDIC TONE DOUBLE SVARITA, 7386 +VEDIC TONE TRIPLE SVARITA, 7387 +VEDIC TONE KATHAKA ANUDATTA, 7388 +VEDIC TONE DOT BELOW, 7389 +VEDIC TONE TWO DOTS BELOW, 7390 +VEDIC TONE THREE DOTS BELOW, 7391 +VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA, 7392 +VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA, 7393 +VEDIC SIGN VISARGA SVARITA, 7394 +VEDIC SIGN VISARGA UDATTA, 7395 +VEDIC SIGN REVERSED VISARGA UDATTA, 7396 +VEDIC SIGN VISARGA ANUDATTA, 7397 +VEDIC SIGN REVERSED VISARGA ANUDATTA, 7398 +VEDIC SIGN VISARGA UDATTA WITH TAIL, 7399 +VEDIC SIGN VISARGA ANUDATTA WITH TAIL, 7400 +VEDIC SIGN ANUSVARA ANTARGOMUKHA, 7401 +VEDIC SIGN ANUSVARA BAHIRGOMUKHA, 7402 +VEDIC SIGN ANUSVARA VAMAGOMUKHA, 7403 +VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL, 7404 +VEDIC SIGN TIRYAK, 7405 +VEDIC SIGN HEXIFORM LONG ANUSVARA, 7406 +VEDIC SIGN LONG ANUSVARA, 7407 +VEDIC SIGN RTHANG LONG ANUSVARA, 7408 +VEDIC SIGN ANUSVARA UBHAYATO MUKHA, 7409 +VEDIC SIGN ARDHAVISARGA, 7410 +VEDIC SIGN ROTATED ARDHAVISARGA, 7411 +VEDIC TONE CANDRA ABOVE, 7412 +VEDIC SIGN JIHVAMULIYA, 7413 +VEDIC SIGN UPADHMANIYA, 7414 +VEDIC TONE RING ABOVE, 7416 +VEDIC TONE DOUBLE RING ABOVE, 7417 +LATIN LETTER SMALL CAPITAL A, 7424 +LATIN LETTER SMALL CAPITAL AE, 7425 +LATIN SMALL LETTER TURNED AE, 7426 +LATIN LETTER SMALL CAPITAL BARRED B, 7427 +LATIN LETTER SMALL CAPITAL C, 7428 +LATIN LETTER SMALL CAPITAL D, 7429 +LATIN LETTER SMALL CAPITAL ETH, 7430 +LATIN LETTER SMALL CAPITAL E, 7431 +LATIN SMALL LETTER TURNED OPEN E, 7432 +LATIN SMALL LETTER TURNED I, 7433 +LATIN LETTER SMALL CAPITAL J, 7434 +LATIN LETTER SMALL CAPITAL K, 7435 +LATIN LETTER SMALL CAPITAL L WITH STROKE, 7436 +LATIN LETTER SMALL CAPITAL M, 7437 +LATIN LETTER SMALL CAPITAL REVERSED N, 7438 +LATIN LETTER SMALL CAPITAL O, 7439 +LATIN LETTER SMALL CAPITAL OPEN O, 7440 +LATIN SMALL LETTER SIDEWAYS O, 7441 +LATIN SMALL LETTER SIDEWAYS OPEN O, 7442 +LATIN SMALL LETTER SIDEWAYS O WITH STROKE, 7443 +LATIN SMALL LETTER TURNED OE, 7444 +LATIN LETTER SMALL CAPITAL OU, 7445 +LATIN SMALL LETTER TOP HALF O, 7446 +LATIN SMALL LETTER BOTTOM HALF O, 7447 +LATIN LETTER SMALL CAPITAL P, 7448 +LATIN LETTER SMALL CAPITAL REVERSED R, 7449 +LATIN LETTER SMALL CAPITAL TURNED R, 7450 +LATIN LETTER SMALL CAPITAL T, 7451 +LATIN LETTER SMALL CAPITAL U, 7452 +LATIN SMALL LETTER SIDEWAYS U, 7453 +LATIN SMALL LETTER SIDEWAYS DIAERESIZED U, 7454 +LATIN SMALL LETTER SIDEWAYS TURNED M, 7455 +LATIN LETTER SMALL CAPITAL V, 7456 +LATIN LETTER SMALL CAPITAL W, 7457 +LATIN LETTER SMALL CAPITAL Z, 7458 +LATIN LETTER SMALL CAPITAL EZH, 7459 +LATIN LETTER VOICED LARYNGEAL SPIRANT, 7460 +LATIN LETTER AIN, 7461 +GREEK LETTER SMALL CAPITAL GAMMA, 7462 +GREEK LETTER SMALL CAPITAL LAMDA, 7463 +GREEK LETTER SMALL CAPITAL PI, 7464 +GREEK LETTER SMALL CAPITAL RHO, 7465 +GREEK LETTER SMALL CAPITAL PSI, 7466 +CYRILLIC LETTER SMALL CAPITAL EL, 7467 +MODIFIER LETTER CAPITAL A, 7468 +MODIFIER LETTER CAPITAL AE, 7469 +MODIFIER LETTER CAPITAL B, 7470 +MODIFIER LETTER CAPITAL BARRED B, 7471 +MODIFIER LETTER CAPITAL D, 7472 +MODIFIER LETTER CAPITAL E, 7473 +MODIFIER LETTER CAPITAL REVERSED E, 7474 +MODIFIER LETTER CAPITAL G, 7475 +MODIFIER LETTER CAPITAL H, 7476 +MODIFIER LETTER CAPITAL I, 7477 +MODIFIER LETTER CAPITAL J, 7478 +MODIFIER LETTER CAPITAL K, 7479 +MODIFIER LETTER CAPITAL L, 7480 +MODIFIER LETTER CAPITAL M, 7481 +MODIFIER LETTER CAPITAL N, 7482 +MODIFIER LETTER CAPITAL REVERSED N, 7483 +MODIFIER LETTER CAPITAL O, 7484 +MODIFIER LETTER CAPITAL OU, 7485 +MODIFIER LETTER CAPITAL P, 7486 +MODIFIER LETTER CAPITAL R, 7487 +MODIFIER LETTER CAPITAL T, 7488 +MODIFIER LETTER CAPITAL U, 7489 +MODIFIER LETTER CAPITAL W, 7490 +MODIFIER LETTER SMALL A, 7491 +MODIFIER LETTER SMALL TURNED A, 7492 +MODIFIER LETTER SMALL ALPHA, 7493 +MODIFIER LETTER SMALL TURNED AE, 7494 +MODIFIER LETTER SMALL B, 7495 +MODIFIER LETTER SMALL D, 7496 +MODIFIER LETTER SMALL E, 7497 +MODIFIER LETTER SMALL SCHWA, 7498 +MODIFIER LETTER SMALL OPEN E, 7499 +MODIFIER LETTER SMALL TURNED OPEN E, 7500 +MODIFIER LETTER SMALL G, 7501 +MODIFIER LETTER SMALL TURNED I, 7502 +MODIFIER LETTER SMALL K, 7503 +MODIFIER LETTER SMALL M, 7504 +MODIFIER LETTER SMALL ENG, 7505 +MODIFIER LETTER SMALL O, 7506 +MODIFIER LETTER SMALL OPEN O, 7507 +MODIFIER LETTER SMALL TOP HALF O, 7508 +MODIFIER LETTER SMALL BOTTOM HALF O, 7509 +MODIFIER LETTER SMALL P, 7510 +MODIFIER LETTER SMALL T, 7511 +MODIFIER LETTER SMALL U, 7512 +MODIFIER LETTER SMALL SIDEWAYS U, 7513 +MODIFIER LETTER SMALL TURNED M, 7514 +MODIFIER LETTER SMALL V, 7515 +MODIFIER LETTER SMALL AIN, 7516 +MODIFIER LETTER SMALL BETA, 7517 +MODIFIER LETTER SMALL GREEK GAMMA, 7518 +MODIFIER LETTER SMALL DELTA, 7519 +MODIFIER LETTER SMALL GREEK PHI, 7520 +MODIFIER LETTER SMALL CHI, 7521 +LATIN SUBSCRIPT SMALL LETTER I, 7522 +LATIN SUBSCRIPT SMALL LETTER R, 7523 +LATIN SUBSCRIPT SMALL LETTER U, 7524 +LATIN SUBSCRIPT SMALL LETTER V, 7525 +GREEK SUBSCRIPT SMALL LETTER BETA, 7526 +GREEK SUBSCRIPT SMALL LETTER GAMMA, 7527 +GREEK SUBSCRIPT SMALL LETTER RHO, 7528 +GREEK SUBSCRIPT SMALL LETTER PHI, 7529 +GREEK SUBSCRIPT SMALL LETTER CHI, 7530 +LATIN SMALL LETTER UE, 7531 +LATIN SMALL LETTER B WITH MIDDLE TILDE, 7532 +LATIN SMALL LETTER D WITH MIDDLE TILDE, 7533 +LATIN SMALL LETTER F WITH MIDDLE TILDE, 7534 +LATIN SMALL LETTER M WITH MIDDLE TILDE, 7535 +LATIN SMALL LETTER N WITH MIDDLE TILDE, 7536 +LATIN SMALL LETTER P WITH MIDDLE TILDE, 7537 +LATIN SMALL LETTER R WITH MIDDLE TILDE, 7538 +LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE, 7539 +LATIN SMALL LETTER S WITH MIDDLE TILDE, 7540 +LATIN SMALL LETTER T WITH MIDDLE TILDE, 7541 +LATIN SMALL LETTER Z WITH MIDDLE TILDE, 7542 +LATIN SMALL LETTER TURNED G, 7543 +MODIFIER LETTER CYRILLIC EN, 7544 +LATIN SMALL LETTER INSULAR G, 7545 +LATIN SMALL LETTER TH WITH STRIKETHROUGH, 7546 +LATIN SMALL CAPITAL LETTER I WITH STROKE, 7547 +LATIN SMALL LETTER IOTA WITH STROKE, 7548 +LATIN SMALL LETTER P WITH STROKE, 7549 +LATIN SMALL CAPITAL LETTER U WITH STROKE, 7550 +LATIN SMALL LETTER UPSILON WITH STROKE, 7551 +LATIN SMALL LETTER B WITH PALATAL HOOK, 7552 +LATIN SMALL LETTER D WITH PALATAL HOOK, 7553 +LATIN SMALL LETTER F WITH PALATAL HOOK, 7554 +LATIN SMALL LETTER G WITH PALATAL HOOK, 7555 +LATIN SMALL LETTER K WITH PALATAL HOOK, 7556 +LATIN SMALL LETTER L WITH PALATAL HOOK, 7557 +LATIN SMALL LETTER M WITH PALATAL HOOK, 7558 +LATIN SMALL LETTER N WITH PALATAL HOOK, 7559 +LATIN SMALL LETTER P WITH PALATAL HOOK, 7560 +LATIN SMALL LETTER R WITH PALATAL HOOK, 7561 +LATIN SMALL LETTER S WITH PALATAL HOOK, 7562 +LATIN SMALL LETTER ESH WITH PALATAL HOOK, 7563 +LATIN SMALL LETTER V WITH PALATAL HOOK, 7564 +LATIN SMALL LETTER X WITH PALATAL HOOK, 7565 +LATIN SMALL LETTER Z WITH PALATAL HOOK, 7566 +LATIN SMALL LETTER A WITH RETROFLEX HOOK, 7567 +LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK, 7568 +LATIN SMALL LETTER D WITH HOOK AND TAIL, 7569 +LATIN SMALL LETTER E WITH RETROFLEX HOOK, 7570 +LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK, 7571 +LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK, 7572 +LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK, 7573 +LATIN SMALL LETTER I WITH RETROFLEX HOOK, 7574 +LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK, 7575 +LATIN SMALL LETTER ESH WITH RETROFLEX HOOK, 7576 +LATIN SMALL LETTER U WITH RETROFLEX HOOK, 7577 +LATIN SMALL LETTER EZH WITH RETROFLEX HOOK, 7578 +MODIFIER LETTER SMALL TURNED ALPHA, 7579 +MODIFIER LETTER SMALL C, 7580 +MODIFIER LETTER SMALL C WITH CURL, 7581 +MODIFIER LETTER SMALL ETH, 7582 +MODIFIER LETTER SMALL REVERSED OPEN E, 7583 +MODIFIER LETTER SMALL F, 7584 +MODIFIER LETTER SMALL DOTLESS J WITH STROKE, 7585 +MODIFIER LETTER SMALL SCRIPT G, 7586 +MODIFIER LETTER SMALL TURNED H, 7587 +MODIFIER LETTER SMALL I WITH STROKE, 7588 +MODIFIER LETTER SMALL IOTA, 7589 +MODIFIER LETTER SMALL CAPITAL I, 7590 +MODIFIER LETTER SMALL CAPITAL I WITH STROKE, 7591 +MODIFIER LETTER SMALL J WITH CROSSED TAIL, 7592 +MODIFIER LETTER SMALL L WITH RETROFLEX HOOK, 7593 +MODIFIER LETTER SMALL L WITH PALATAL HOOK, 7594 +MODIFIER LETTER SMALL CAPITAL L, 7595 +MODIFIER LETTER SMALL M WITH HOOK, 7596 +MODIFIER LETTER SMALL TURNED M WITH LONG LEG, 7597 +MODIFIER LETTER SMALL N WITH LEFT HOOK, 7598 +MODIFIER LETTER SMALL N WITH RETROFLEX HOOK, 7599 +MODIFIER LETTER SMALL CAPITAL N, 7600 +MODIFIER LETTER SMALL BARRED O, 7601 +MODIFIER LETTER SMALL PHI, 7602 +MODIFIER LETTER SMALL S WITH HOOK, 7603 +MODIFIER LETTER SMALL ESH, 7604 +MODIFIER LETTER SMALL T WITH PALATAL HOOK, 7605 +MODIFIER LETTER SMALL U BAR, 7606 +MODIFIER LETTER SMALL UPSILON, 7607 +MODIFIER LETTER SMALL CAPITAL U, 7608 +MODIFIER LETTER SMALL V WITH HOOK, 7609 +MODIFIER LETTER SMALL TURNED V, 7610 +MODIFIER LETTER SMALL Z, 7611 +MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK, 7612 +MODIFIER LETTER SMALL Z WITH CURL, 7613 +MODIFIER LETTER SMALL EZH, 7614 +MODIFIER LETTER SMALL THETA, 7615 +COMBINING DOTTED GRAVE ACCENT, 7616 +COMBINING DOTTED ACUTE ACCENT, 7617 +COMBINING SNAKE BELOW, 7618 +COMBINING SUSPENSION MARK, 7619 +COMBINING MACRON ACUTE, 7620 +COMBINING GRAVE MACRON, 7621 +COMBINING MACRON GRAVE, 7622 +COMBINING ACUTE MACRON, 7623 +COMBINING GRAVE ACUTE GRAVE, 7624 +COMBINING ACUTE GRAVE ACUTE, 7625 +COMBINING LATIN SMALL LETTER R BELOW, 7626 +COMBINING BREVE MACRON, 7627 +COMBINING MACRON BREVE, 7628 +COMBINING DOUBLE CIRCUMFLEX ABOVE, 7629 +COMBINING OGONEK ABOVE, 7630 +COMBINING ZIGZAG BELOW, 7631 +COMBINING IS BELOW, 7632 +COMBINING UR ABOVE, 7633 +COMBINING US ABOVE, 7634 +COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE, 7635 +COMBINING LATIN SMALL LETTER AE, 7636 +COMBINING LATIN SMALL LETTER AO, 7637 +COMBINING LATIN SMALL LETTER AV, 7638 +COMBINING LATIN SMALL LETTER C CEDILLA, 7639 +COMBINING LATIN SMALL LETTER INSULAR D, 7640 +COMBINING LATIN SMALL LETTER ETH, 7641 +COMBINING LATIN SMALL LETTER G, 7642 +COMBINING LATIN LETTER SMALL CAPITAL G, 7643 +COMBINING LATIN SMALL LETTER K, 7644 +COMBINING LATIN SMALL LETTER L, 7645 +COMBINING LATIN LETTER SMALL CAPITAL L, 7646 +COMBINING LATIN LETTER SMALL CAPITAL M, 7647 +COMBINING LATIN SMALL LETTER N, 7648 +COMBINING LATIN LETTER SMALL CAPITAL N, 7649 +COMBINING LATIN LETTER SMALL CAPITAL R, 7650 +COMBINING LATIN SMALL LETTER R ROTUNDA, 7651 +COMBINING LATIN SMALL LETTER S, 7652 +COMBINING LATIN SMALL LETTER LONG S, 7653 +COMBINING LATIN SMALL LETTER Z, 7654 +COMBINING LATIN SMALL LETTER ALPHA, 7655 +COMBINING LATIN SMALL LETTER B, 7656 +COMBINING LATIN SMALL LETTER BETA, 7657 +COMBINING LATIN SMALL LETTER SCHWA, 7658 +COMBINING LATIN SMALL LETTER F, 7659 +COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE, 7660 +COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE, 7661 +COMBINING LATIN SMALL LETTER P, 7662 +COMBINING LATIN SMALL LETTER ESH, 7663 +COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE, 7664 +COMBINING LATIN SMALL LETTER W, 7665 +COMBINING LATIN SMALL LETTER A WITH DIAERESIS, 7666 +COMBINING LATIN SMALL LETTER O WITH DIAERESIS, 7667 +COMBINING LATIN SMALL LETTER U WITH DIAERESIS, 7668 +COMBINING UP TACK ABOVE, 7669 +COMBINING DELETION MARK, 7675 +COMBINING DOUBLE INVERTED BREVE BELOW, 7676 +COMBINING ALMOST EQUAL TO BELOW, 7677 +COMBINING LEFT ARROWHEAD ABOVE, 7678 +COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW, 7679 +LATIN CAPITAL LETTER A WITH RING BELOW, 7680 +LATIN SMALL LETTER A WITH RING BELOW, 7681 +LATIN CAPITAL LETTER B WITH DOT ABOVE, 7682 +LATIN SMALL LETTER B WITH DOT ABOVE, 7683 +LATIN CAPITAL LETTER B WITH DOT BELOW, 7684 +LATIN SMALL LETTER B WITH DOT BELOW, 7685 +LATIN CAPITAL LETTER B WITH LINE BELOW, 7686 +LATIN SMALL LETTER B WITH LINE BELOW, 7687 +LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE, 7688 +LATIN SMALL LETTER C WITH CEDILLA AND ACUTE, 7689 +LATIN CAPITAL LETTER D WITH DOT ABOVE, 7690 +LATIN SMALL LETTER D WITH DOT ABOVE, 7691 +LATIN CAPITAL LETTER D WITH DOT BELOW, 7692 +LATIN SMALL LETTER D WITH DOT BELOW, 7693 +LATIN CAPITAL LETTER D WITH LINE BELOW, 7694 +LATIN SMALL LETTER D WITH LINE BELOW, 7695 +LATIN CAPITAL LETTER D WITH CEDILLA, 7696 +LATIN SMALL LETTER D WITH CEDILLA, 7697 +LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW, 7698 +LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW, 7699 +LATIN CAPITAL LETTER E WITH MACRON AND GRAVE, 7700 +LATIN SMALL LETTER E WITH MACRON AND GRAVE, 7701 +LATIN CAPITAL LETTER E WITH MACRON AND ACUTE, 7702 +LATIN SMALL LETTER E WITH MACRON AND ACUTE, 7703 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW, 7704 +LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW, 7705 +LATIN CAPITAL LETTER E WITH TILDE BELOW, 7706 +LATIN SMALL LETTER E WITH TILDE BELOW, 7707 +LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE, 7708 +LATIN SMALL LETTER E WITH CEDILLA AND BREVE, 7709 +LATIN CAPITAL LETTER F WITH DOT ABOVE, 7710 +LATIN SMALL LETTER F WITH DOT ABOVE, 7711 +LATIN CAPITAL LETTER G WITH MACRON, 7712 +LATIN SMALL LETTER G WITH MACRON, 7713 +LATIN CAPITAL LETTER H WITH DOT ABOVE, 7714 +LATIN SMALL LETTER H WITH DOT ABOVE, 7715 +LATIN CAPITAL LETTER H WITH DOT BELOW, 7716 +LATIN SMALL LETTER H WITH DOT BELOW, 7717 +LATIN CAPITAL LETTER H WITH DIAERESIS, 7718 +LATIN SMALL LETTER H WITH DIAERESIS, 7719 +LATIN CAPITAL LETTER H WITH CEDILLA, 7720 +LATIN SMALL LETTER H WITH CEDILLA, 7721 +LATIN CAPITAL LETTER H WITH BREVE BELOW, 7722 +LATIN SMALL LETTER H WITH BREVE BELOW, 7723 +LATIN CAPITAL LETTER I WITH TILDE BELOW, 7724 +LATIN SMALL LETTER I WITH TILDE BELOW, 7725 +LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE, 7726 +LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE, 7727 +LATIN CAPITAL LETTER K WITH ACUTE, 7728 +LATIN SMALL LETTER K WITH ACUTE, 7729 +LATIN CAPITAL LETTER K WITH DOT BELOW, 7730 +LATIN SMALL LETTER K WITH DOT BELOW, 7731 +LATIN CAPITAL LETTER K WITH LINE BELOW, 7732 +LATIN SMALL LETTER K WITH LINE BELOW, 7733 +LATIN CAPITAL LETTER L WITH DOT BELOW, 7734 +LATIN SMALL LETTER L WITH DOT BELOW, 7735 +LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON, 7736 +LATIN SMALL LETTER L WITH DOT BELOW AND MACRON, 7737 +LATIN CAPITAL LETTER L WITH LINE BELOW, 7738 +LATIN SMALL LETTER L WITH LINE BELOW, 7739 +LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW, 7740 +LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW, 7741 +LATIN CAPITAL LETTER M WITH ACUTE, 7742 +LATIN SMALL LETTER M WITH ACUTE, 7743 +LATIN CAPITAL LETTER M WITH DOT ABOVE, 7744 +LATIN SMALL LETTER M WITH DOT ABOVE, 7745 +LATIN CAPITAL LETTER M WITH DOT BELOW, 7746 +LATIN SMALL LETTER M WITH DOT BELOW, 7747 +LATIN CAPITAL LETTER N WITH DOT ABOVE, 7748 +LATIN SMALL LETTER N WITH DOT ABOVE, 7749 +LATIN CAPITAL LETTER N WITH DOT BELOW, 7750 +LATIN SMALL LETTER N WITH DOT BELOW, 7751 +LATIN CAPITAL LETTER N WITH LINE BELOW, 7752 +LATIN SMALL LETTER N WITH LINE BELOW, 7753 +LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW, 7754 +LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW, 7755 +LATIN CAPITAL LETTER O WITH TILDE AND ACUTE, 7756 +LATIN SMALL LETTER O WITH TILDE AND ACUTE, 7757 +LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS, 7758 +LATIN SMALL LETTER O WITH TILDE AND DIAERESIS, 7759 +LATIN CAPITAL LETTER O WITH MACRON AND GRAVE, 7760 +LATIN SMALL LETTER O WITH MACRON AND GRAVE, 7761 +LATIN CAPITAL LETTER O WITH MACRON AND ACUTE, 7762 +LATIN SMALL LETTER O WITH MACRON AND ACUTE, 7763 +LATIN CAPITAL LETTER P WITH ACUTE, 7764 +LATIN SMALL LETTER P WITH ACUTE, 7765 +LATIN CAPITAL LETTER P WITH DOT ABOVE, 7766 +LATIN SMALL LETTER P WITH DOT ABOVE, 7767 +LATIN CAPITAL LETTER R WITH DOT ABOVE, 7768 +LATIN SMALL LETTER R WITH DOT ABOVE, 7769 +LATIN CAPITAL LETTER R WITH DOT BELOW, 7770 +LATIN SMALL LETTER R WITH DOT BELOW, 7771 +LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON, 7772 +LATIN SMALL LETTER R WITH DOT BELOW AND MACRON, 7773 +LATIN CAPITAL LETTER R WITH LINE BELOW, 7774 +LATIN SMALL LETTER R WITH LINE BELOW, 7775 +LATIN CAPITAL LETTER S WITH DOT ABOVE, 7776 +LATIN SMALL LETTER S WITH DOT ABOVE, 7777 +LATIN CAPITAL LETTER S WITH DOT BELOW, 7778 +LATIN SMALL LETTER S WITH DOT BELOW, 7779 +LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE, 7780 +LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE, 7781 +LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE, 7782 +LATIN SMALL LETTER S WITH CARON AND DOT ABOVE, 7783 +LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE, 7784 +LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE, 7785 +LATIN CAPITAL LETTER T WITH DOT ABOVE, 7786 +LATIN SMALL LETTER T WITH DOT ABOVE, 7787 +LATIN CAPITAL LETTER T WITH DOT BELOW, 7788 +LATIN SMALL LETTER T WITH DOT BELOW, 7789 +LATIN CAPITAL LETTER T WITH LINE BELOW, 7790 +LATIN SMALL LETTER T WITH LINE BELOW, 7791 +LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW, 7792 +LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW, 7793 +LATIN CAPITAL LETTER U WITH DIAERESIS BELOW, 7794 +LATIN SMALL LETTER U WITH DIAERESIS BELOW, 7795 +LATIN CAPITAL LETTER U WITH TILDE BELOW, 7796 +LATIN SMALL LETTER U WITH TILDE BELOW, 7797 +LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW, 7798 +LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW, 7799 +LATIN CAPITAL LETTER U WITH TILDE AND ACUTE, 7800 +LATIN SMALL LETTER U WITH TILDE AND ACUTE, 7801 +LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS, 7802 +LATIN SMALL LETTER U WITH MACRON AND DIAERESIS, 7803 +LATIN CAPITAL LETTER V WITH TILDE, 7804 +LATIN SMALL LETTER V WITH TILDE, 7805 +LATIN CAPITAL LETTER V WITH DOT BELOW, 7806 +LATIN SMALL LETTER V WITH DOT BELOW, 7807 +LATIN CAPITAL LETTER W WITH GRAVE, 7808 +LATIN SMALL LETTER W WITH GRAVE, 7809 +LATIN CAPITAL LETTER W WITH ACUTE, 7810 +LATIN SMALL LETTER W WITH ACUTE, 7811 +LATIN CAPITAL LETTER W WITH DIAERESIS, 7812 +LATIN SMALL LETTER W WITH DIAERESIS, 7813 +LATIN CAPITAL LETTER W WITH DOT ABOVE, 7814 +LATIN SMALL LETTER W WITH DOT ABOVE, 7815 +LATIN CAPITAL LETTER W WITH DOT BELOW, 7816 +LATIN SMALL LETTER W WITH DOT BELOW, 7817 +LATIN CAPITAL LETTER X WITH DOT ABOVE, 7818 +LATIN SMALL LETTER X WITH DOT ABOVE, 7819 +LATIN CAPITAL LETTER X WITH DIAERESIS, 7820 +LATIN SMALL LETTER X WITH DIAERESIS, 7821 +LATIN CAPITAL LETTER Y WITH DOT ABOVE, 7822 +LATIN SMALL LETTER Y WITH DOT ABOVE, 7823 +LATIN CAPITAL LETTER Z WITH CIRCUMFLEX, 7824 +LATIN SMALL LETTER Z WITH CIRCUMFLEX, 7825 +LATIN CAPITAL LETTER Z WITH DOT BELOW, 7826 +LATIN SMALL LETTER Z WITH DOT BELOW, 7827 +LATIN CAPITAL LETTER Z WITH LINE BELOW, 7828 +LATIN SMALL LETTER Z WITH LINE BELOW, 7829 +LATIN SMALL LETTER H WITH LINE BELOW, 7830 +LATIN SMALL LETTER T WITH DIAERESIS, 7831 +LATIN SMALL LETTER W WITH RING ABOVE, 7832 +LATIN SMALL LETTER Y WITH RING ABOVE, 7833 +LATIN SMALL LETTER A WITH RIGHT HALF RING, 7834 +LATIN SMALL LETTER LONG S WITH DOT ABOVE, 7835 +LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE, 7836 +LATIN SMALL LETTER LONG S WITH HIGH STROKE, 7837 +LATIN CAPITAL LETTER SHARP S, 7838 +LATIN SMALL LETTER DELTA, 7839 +LATIN CAPITAL LETTER A WITH DOT BELOW, 7840 +LATIN SMALL LETTER A WITH DOT BELOW, 7841 +LATIN CAPITAL LETTER A WITH HOOK ABOVE, 7842 +LATIN SMALL LETTER A WITH HOOK ABOVE, 7843 +LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE, 7844 +LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE, 7845 +LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE, 7846 +LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE, 7847 +LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, 7848 +LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE, 7849 +LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE, 7850 +LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE, 7851 +LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW, 7852 +LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW, 7853 +LATIN CAPITAL LETTER A WITH BREVE AND ACUTE, 7854 +LATIN SMALL LETTER A WITH BREVE AND ACUTE, 7855 +LATIN CAPITAL LETTER A WITH BREVE AND GRAVE, 7856 +LATIN SMALL LETTER A WITH BREVE AND GRAVE, 7857 +LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE, 7858 +LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE, 7859 +LATIN CAPITAL LETTER A WITH BREVE AND TILDE, 7860 +LATIN SMALL LETTER A WITH BREVE AND TILDE, 7861 +LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW, 7862 +LATIN SMALL LETTER A WITH BREVE AND DOT BELOW, 7863 +LATIN CAPITAL LETTER E WITH DOT BELOW, 7864 +LATIN SMALL LETTER E WITH DOT BELOW, 7865 +LATIN CAPITAL LETTER E WITH HOOK ABOVE, 7866 +LATIN SMALL LETTER E WITH HOOK ABOVE, 7867 +LATIN CAPITAL LETTER E WITH TILDE, 7868 +LATIN SMALL LETTER E WITH TILDE, 7869 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE, 7870 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE, 7871 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE, 7872 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE, 7873 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, 7874 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE, 7875 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE, 7876 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE, 7877 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW, 7878 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW, 7879 +LATIN CAPITAL LETTER I WITH HOOK ABOVE, 7880 +LATIN SMALL LETTER I WITH HOOK ABOVE, 7881 +LATIN CAPITAL LETTER I WITH DOT BELOW, 7882 +LATIN SMALL LETTER I WITH DOT BELOW, 7883 +LATIN CAPITAL LETTER O WITH DOT BELOW, 7884 +LATIN SMALL LETTER O WITH DOT BELOW, 7885 +LATIN CAPITAL LETTER O WITH HOOK ABOVE, 7886 +LATIN SMALL LETTER O WITH HOOK ABOVE, 7887 +LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE, 7888 +LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE, 7889 +LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE, 7890 +LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE, 7891 +LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, 7892 +LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE, 7893 +LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE, 7894 +LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE, 7895 +LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW, 7896 +LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW, 7897 +LATIN CAPITAL LETTER O WITH HORN AND ACUTE, 7898 +LATIN SMALL LETTER O WITH HORN AND ACUTE, 7899 +LATIN CAPITAL LETTER O WITH HORN AND GRAVE, 7900 +LATIN SMALL LETTER O WITH HORN AND GRAVE, 7901 +LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE, 7902 +LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE, 7903 +LATIN CAPITAL LETTER O WITH HORN AND TILDE, 7904 +LATIN SMALL LETTER O WITH HORN AND TILDE, 7905 +LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW, 7906 +LATIN SMALL LETTER O WITH HORN AND DOT BELOW, 7907 +LATIN CAPITAL LETTER U WITH DOT BELOW, 7908 +LATIN SMALL LETTER U WITH DOT BELOW, 7909 +LATIN CAPITAL LETTER U WITH HOOK ABOVE, 7910 +LATIN SMALL LETTER U WITH HOOK ABOVE, 7911 +LATIN CAPITAL LETTER U WITH HORN AND ACUTE, 7912 +LATIN SMALL LETTER U WITH HORN AND ACUTE, 7913 +LATIN CAPITAL LETTER U WITH HORN AND GRAVE, 7914 +LATIN SMALL LETTER U WITH HORN AND GRAVE, 7915 +LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE, 7916 +LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE, 7917 +LATIN CAPITAL LETTER U WITH HORN AND TILDE, 7918 +LATIN SMALL LETTER U WITH HORN AND TILDE, 7919 +LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW, 7920 +LATIN SMALL LETTER U WITH HORN AND DOT BELOW, 7921 +LATIN CAPITAL LETTER Y WITH GRAVE, 7922 +LATIN SMALL LETTER Y WITH GRAVE, 7923 +LATIN CAPITAL LETTER Y WITH DOT BELOW, 7924 +LATIN SMALL LETTER Y WITH DOT BELOW, 7925 +LATIN CAPITAL LETTER Y WITH HOOK ABOVE, 7926 +LATIN SMALL LETTER Y WITH HOOK ABOVE, 7927 +LATIN CAPITAL LETTER Y WITH TILDE, 7928 +LATIN SMALL LETTER Y WITH TILDE, 7929 +LATIN CAPITAL LETTER MIDDLE WELSH LL, 7930 +LATIN SMALL LETTER MIDDLE WELSH LL, 7931 +LATIN CAPITAL LETTER MIDDLE WELSH V, 7932 +LATIN SMALL LETTER MIDDLE WELSH V, 7933 +LATIN CAPITAL LETTER Y WITH LOOP, 7934 +LATIN SMALL LETTER Y WITH LOOP, 7935 +GREEK SMALL LETTER ALPHA WITH PSILI, 7936 +GREEK SMALL LETTER ALPHA WITH DASIA, 7937 +GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA, 7938 +GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA, 7939 +GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA, 7940 +GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA, 7941 +GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI, 7942 +GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI, 7943 +GREEK CAPITAL LETTER ALPHA WITH PSILI, 7944 +GREEK CAPITAL LETTER ALPHA WITH DASIA, 7945 +GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA, 7946 +GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA, 7947 +GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA, 7948 +GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA, 7949 +GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI, 7950 +GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI, 7951 +GREEK SMALL LETTER EPSILON WITH PSILI, 7952 +GREEK SMALL LETTER EPSILON WITH DASIA, 7953 +GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA, 7954 +GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA, 7955 +GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA, 7956 +GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA, 7957 +GREEK CAPITAL LETTER EPSILON WITH PSILI, 7960 +GREEK CAPITAL LETTER EPSILON WITH DASIA, 7961 +GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA, 7962 +GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA, 7963 +GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA, 7964 +GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA, 7965 +GREEK SMALL LETTER ETA WITH PSILI, 7968 +GREEK SMALL LETTER ETA WITH DASIA, 7969 +GREEK SMALL LETTER ETA WITH PSILI AND VARIA, 7970 +GREEK SMALL LETTER ETA WITH DASIA AND VARIA, 7971 +GREEK SMALL LETTER ETA WITH PSILI AND OXIA, 7972 +GREEK SMALL LETTER ETA WITH DASIA AND OXIA, 7973 +GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI, 7974 +GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI, 7975 +GREEK CAPITAL LETTER ETA WITH PSILI, 7976 +GREEK CAPITAL LETTER ETA WITH DASIA, 7977 +GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA, 7978 +GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA, 7979 +GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA, 7980 +GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA, 7981 +GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI, 7982 +GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI, 7983 +GREEK SMALL LETTER IOTA WITH PSILI, 7984 +GREEK SMALL LETTER IOTA WITH DASIA, 7985 +GREEK SMALL LETTER IOTA WITH PSILI AND VARIA, 7986 +GREEK SMALL LETTER IOTA WITH DASIA AND VARIA, 7987 +GREEK SMALL LETTER IOTA WITH PSILI AND OXIA, 7988 +GREEK SMALL LETTER IOTA WITH DASIA AND OXIA, 7989 +GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI, 7990 +GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI, 7991 +GREEK CAPITAL LETTER IOTA WITH PSILI, 7992 +GREEK CAPITAL LETTER IOTA WITH DASIA, 7993 +GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA, 7994 +GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA, 7995 +GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA, 7996 +GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA, 7997 +GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI, 7998 +GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI, 7999 +GREEK SMALL LETTER OMICRON WITH PSILI, 8000 +GREEK SMALL LETTER OMICRON WITH DASIA, 8001 +GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA, 8002 +GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA, 8003 +GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA, 8004 +GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA, 8005 +GREEK CAPITAL LETTER OMICRON WITH PSILI, 8008 +GREEK CAPITAL LETTER OMICRON WITH DASIA, 8009 +GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA, 8010 +GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA, 8011 +GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA, 8012 +GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA, 8013 +GREEK SMALL LETTER UPSILON WITH PSILI, 8016 +GREEK SMALL LETTER UPSILON WITH DASIA, 8017 +GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA, 8018 +GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA, 8019 +GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA, 8020 +GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA, 8021 +GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI, 8022 +GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI, 8023 +GREEK CAPITAL LETTER UPSILON WITH DASIA, 8025 +GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA, 8027 +GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA, 8029 +GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI, 8031 +GREEK SMALL LETTER OMEGA WITH PSILI, 8032 +GREEK SMALL LETTER OMEGA WITH DASIA, 8033 +GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA, 8034 +GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA, 8035 +GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA, 8036 +GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA, 8037 +GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI, 8038 +GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI, 8039 +GREEK CAPITAL LETTER OMEGA WITH PSILI, 8040 +GREEK CAPITAL LETTER OMEGA WITH DASIA, 8041 +GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA, 8042 +GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA, 8043 +GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA, 8044 +GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA, 8045 +GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI, 8046 +GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI, 8047 +GREEK SMALL LETTER ALPHA WITH VARIA, 8048 +GREEK SMALL LETTER ALPHA WITH OXIA, 8049 +GREEK SMALL LETTER EPSILON WITH VARIA, 8050 +GREEK SMALL LETTER EPSILON WITH OXIA, 8051 +GREEK SMALL LETTER ETA WITH VARIA, 8052 +GREEK SMALL LETTER ETA WITH OXIA, 8053 +GREEK SMALL LETTER IOTA WITH VARIA, 8054 +GREEK SMALL LETTER IOTA WITH OXIA, 8055 +GREEK SMALL LETTER OMICRON WITH VARIA, 8056 +GREEK SMALL LETTER OMICRON WITH OXIA, 8057 +GREEK SMALL LETTER UPSILON WITH VARIA, 8058 +GREEK SMALL LETTER UPSILON WITH OXIA, 8059 +GREEK SMALL LETTER OMEGA WITH VARIA, 8060 +GREEK SMALL LETTER OMEGA WITH OXIA, 8061 +GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI, 8064 +GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI, 8065 +GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI, 8066 +GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI, 8067 +GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI, 8068 +GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI, 8069 +GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, 8070 +GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, 8071 +GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI, 8072 +GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI, 8073 +GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI, 8074 +GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI, 8075 +GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI, 8076 +GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI, 8077 +GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, 8078 +GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, 8079 +GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI, 8080 +GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI, 8081 +GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI, 8082 +GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI, 8083 +GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI, 8084 +GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI, 8085 +GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, 8086 +GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, 8087 +GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI, 8088 +GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI, 8089 +GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI, 8090 +GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI, 8091 +GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI, 8092 +GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI, 8093 +GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, 8094 +GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, 8095 +GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI, 8096 +GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI, 8097 +GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI, 8098 +GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI, 8099 +GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI, 8100 +GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI, 8101 +GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI, 8102 +GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI, 8103 +GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI, 8104 +GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI, 8105 +GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI, 8106 +GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI, 8107 +GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI, 8108 +GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI, 8109 +GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI, 8110 +GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI, 8111 +GREEK SMALL LETTER ALPHA WITH VRACHY, 8112 +GREEK SMALL LETTER ALPHA WITH MACRON, 8113 +GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI, 8114 +GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI, 8115 +GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI, 8116 +GREEK SMALL LETTER ALPHA WITH PERISPOMENI, 8118 +GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI, 8119 +GREEK CAPITAL LETTER ALPHA WITH VRACHY, 8120 +GREEK CAPITAL LETTER ALPHA WITH MACRON, 8121 +GREEK CAPITAL LETTER ALPHA WITH VARIA, 8122 +GREEK CAPITAL LETTER ALPHA WITH OXIA, 8123 +GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI, 8124 +GREEK KORONIS, 8125 +GREEK PROSGEGRAMMENI, 8126 +GREEK PSILI, 8127 +GREEK PERISPOMENI, 8128 +GREEK DIALYTIKA AND PERISPOMENI, 8129 +GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI, 8130 +GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI, 8131 +GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI, 8132 +GREEK SMALL LETTER ETA WITH PERISPOMENI, 8134 +GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI, 8135 +GREEK CAPITAL LETTER EPSILON WITH VARIA, 8136 +GREEK CAPITAL LETTER EPSILON WITH OXIA, 8137 +GREEK CAPITAL LETTER ETA WITH VARIA, 8138 +GREEK CAPITAL LETTER ETA WITH OXIA, 8139 +GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI, 8140 +GREEK PSILI AND VARIA, 8141 +GREEK PSILI AND OXIA, 8142 +GREEK PSILI AND PERISPOMENI, 8143 +GREEK SMALL LETTER IOTA WITH VRACHY, 8144 +GREEK SMALL LETTER IOTA WITH MACRON, 8145 +GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA, 8146 +GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA, 8147 +GREEK SMALL LETTER IOTA WITH PERISPOMENI, 8150 +GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI, 8151 +GREEK CAPITAL LETTER IOTA WITH VRACHY, 8152 +GREEK CAPITAL LETTER IOTA WITH MACRON, 8153 +GREEK CAPITAL LETTER IOTA WITH VARIA, 8154 +GREEK CAPITAL LETTER IOTA WITH OXIA, 8155 +GREEK DASIA AND VARIA, 8157 +GREEK DASIA AND OXIA, 8158 +GREEK DASIA AND PERISPOMENI, 8159 +GREEK SMALL LETTER UPSILON WITH VRACHY, 8160 +GREEK SMALL LETTER UPSILON WITH MACRON, 8161 +GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA, 8162 +GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA, 8163 +GREEK SMALL LETTER RHO WITH PSILI, 8164 +GREEK SMALL LETTER RHO WITH DASIA, 8165 +GREEK SMALL LETTER UPSILON WITH PERISPOMENI, 8166 +GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI, 8167 +GREEK CAPITAL LETTER UPSILON WITH VRACHY, 8168 +GREEK CAPITAL LETTER UPSILON WITH MACRON, 8169 +GREEK CAPITAL LETTER UPSILON WITH VARIA, 8170 +GREEK CAPITAL LETTER UPSILON WITH OXIA, 8171 +GREEK CAPITAL LETTER RHO WITH DASIA, 8172 +GREEK DIALYTIKA AND VARIA, 8173 +GREEK DIALYTIKA AND OXIA, 8174 +GREEK VARIA, 8175 +GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI, 8178 +GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI, 8179 +GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI, 8180 +GREEK SMALL LETTER OMEGA WITH PERISPOMENI, 8182 +GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI, 8183 +GREEK CAPITAL LETTER OMICRON WITH VARIA, 8184 +GREEK CAPITAL LETTER OMICRON WITH OXIA, 8185 +GREEK CAPITAL LETTER OMEGA WITH VARIA, 8186 +GREEK CAPITAL LETTER OMEGA WITH OXIA, 8187 +GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI, 8188 +GREEK OXIA, 8189 +GREEK DASIA, 8190 +EN QUAD, 8192 +EM QUAD, 8193 +EN SPACE, 8194 +EM SPACE, 8195 +THREE PER EM SPACE, 8196 +FOUR PER EM SPACE, 8197 +SIX PER EM SPACE, 8198 +FIGURE SPACE, 8199 +PUNCTUATION SPACE, 8200 +THIN SPACE, 8201 +HAIR SPACE, 8202 +ZERO WIDTH SPACE, 8203 +ZERO WIDTH NON JOINER, 8204 +ZERO WIDTH JOINER, 8205 +LEFT TO RIGHT MARK, 8206 +RIGHT TO LEFT MARK, 8207 +HYPHEN, 8208 +NON BREAKING HYPHEN, 8209 +FIGURE DASH, 8210 +EN DASH, 8211 +EM DASH, 8212 +HORIZONTAL BAR, 8213 +DOUBLE VERTICAL LINE, 8214 +DOUBLE LOW LINE, 8215 +LEFT SINGLE QUOTATION MARK, 8216 +RIGHT SINGLE QUOTATION MARK, 8217 +SINGLE LOW 9 QUOTATION MARK, 8218 +SINGLE HIGH REVERSED 9 QUOTATION MARK, 8219 +LEFT DOUBLE QUOTATION MARK, 8220 +RIGHT DOUBLE QUOTATION MARK, 8221 +DOUBLE LOW 9 QUOTATION MARK, 8222 +DOUBLE HIGH REVERSED 9 QUOTATION MARK, 8223 +DAGGER, 8224 +DOUBLE DAGGER, 8225 +BULLET, 8226 +TRIANGULAR BULLET, 8227 +ONE DOT LEADER, 8228 +TWO DOT LEADER, 8229 +HORIZONTAL ELLIPSIS, 8230 +HYPHENATION POINT, 8231 +LINE SEPARATOR, 8232 +PARAGRAPH SEPARATOR, 8233 +LEFT TO RIGHT EMBEDDING, 8234 +RIGHT TO LEFT EMBEDDING, 8235 +POP DIRECTIONAL FORMATTING, 8236 +LEFT TO RIGHT OVERRIDE, 8237 +RIGHT TO LEFT OVERRIDE, 8238 +NARROW NO BREAK SPACE, 8239 +PER MILLE SIGN, 8240 +PER TEN THOUSAND SIGN, 8241 +PRIME, 8242 +DOUBLE PRIME, 8243 +TRIPLE PRIME, 8244 +REVERSED PRIME, 8245 +REVERSED DOUBLE PRIME, 8246 +REVERSED TRIPLE PRIME, 8247 +CARET, 8248 +SINGLE LEFT POINTING ANGLE QUOTATION MARK, 8249 +SINGLE RIGHT POINTING ANGLE QUOTATION MARK, 8250 +REFERENCE MARK, 8251 +DOUBLE EXCLAMATION MARK, 8252 +INTERROBANG, 8253 +OVERLINE, 8254 +UNDERTIE, 8255 +CHARACTER TIE, 8256 +CARET INSERTION POINT, 8257 +ASTERISM, 8258 +HYPHEN BULLET, 8259 +FRACTION SLASH, 8260 +LEFT SQUARE BRACKET WITH QUILL, 8261 +RIGHT SQUARE BRACKET WITH QUILL, 8262 +DOUBLE QUESTION MARK, 8263 +QUESTION EXCLAMATION MARK, 8264 +EXCLAMATION QUESTION MARK, 8265 +TIRONIAN SIGN ET, 8266 +REVERSED PILCROW SIGN, 8267 +BLACK LEFTWARDS BULLET, 8268 +BLACK RIGHTWARDS BULLET, 8269 +LOW ASTERISK, 8270 +REVERSED SEMICOLON, 8271 +CLOSE UP, 8272 +TWO ASTERISKS ALIGNED VERTICALLY, 8273 +COMMERCIAL MINUS SIGN, 8274 +SWUNG DASH, 8275 +INVERTED UNDERTIE, 8276 +FLOWER PUNCTUATION MARK, 8277 +THREE DOT PUNCTUATION, 8278 +QUADRUPLE PRIME, 8279 +FOUR DOT PUNCTUATION, 8280 +FIVE DOT PUNCTUATION, 8281 +TWO DOT PUNCTUATION, 8282 +FOUR DOT MARK, 8283 +DOTTED CROSS, 8284 +TRICOLON, 8285 +VERTICAL FOUR DOTS, 8286 +MEDIUM MATHEMATICAL SPACE, 8287 +WORD JOINER, 8288 +FUNCTION APPLICATION, 8289 +INVISIBLE TIMES, 8290 +INVISIBLE SEPARATOR, 8291 +INVISIBLE PLUS, 8292 +LEFT TO RIGHT ISOLATE, 8294 +RIGHT TO LEFT ISOLATE, 8295 +FIRST STRONG ISOLATE, 8296 +POP DIRECTIONAL ISOLATE, 8297 +INHIBIT SYMMETRIC SWAPPING, 8298 +ACTIVATE SYMMETRIC SWAPPING, 8299 +INHIBIT ARABIC FORM SHAPING, 8300 +ACTIVATE ARABIC FORM SHAPING, 8301 +NATIONAL DIGIT SHAPES, 8302 +NOMINAL DIGIT SHAPES, 8303 +SUPERSCRIPT ZERO, 8304 +SUPERSCRIPT LATIN SMALL LETTER I, 8305 +SUPERSCRIPT FOUR, 8308 +SUPERSCRIPT FIVE, 8309 +SUPERSCRIPT SIX, 8310 +SUPERSCRIPT SEVEN, 8311 +SUPERSCRIPT EIGHT, 8312 +SUPERSCRIPT NINE, 8313 +SUPERSCRIPT PLUS SIGN, 8314 +SUPERSCRIPT MINUS, 8315 +SUPERSCRIPT EQUALS SIGN, 8316 +SUPERSCRIPT LEFT PARENTHESIS, 8317 +SUPERSCRIPT RIGHT PARENTHESIS, 8318 +SUPERSCRIPT LATIN SMALL LETTER N, 8319 +SUBSCRIPT ZERO, 8320 +SUBSCRIPT ONE, 8321 +SUBSCRIPT TWO, 8322 +SUBSCRIPT THREE, 8323 +SUBSCRIPT FOUR, 8324 +SUBSCRIPT FIVE, 8325 +SUBSCRIPT SIX, 8326 +SUBSCRIPT SEVEN, 8327 +SUBSCRIPT EIGHT, 8328 +SUBSCRIPT NINE, 8329 +SUBSCRIPT PLUS SIGN, 8330 +SUBSCRIPT MINUS, 8331 +SUBSCRIPT EQUALS SIGN, 8332 +SUBSCRIPT LEFT PARENTHESIS, 8333 +SUBSCRIPT RIGHT PARENTHESIS, 8334 +LATIN SUBSCRIPT SMALL LETTER A, 8336 +LATIN SUBSCRIPT SMALL LETTER E, 8337 +LATIN SUBSCRIPT SMALL LETTER O, 8338 +LATIN SUBSCRIPT SMALL LETTER X, 8339 +LATIN SUBSCRIPT SMALL LETTER SCHWA, 8340 +LATIN SUBSCRIPT SMALL LETTER H, 8341 +LATIN SUBSCRIPT SMALL LETTER K, 8342 +LATIN SUBSCRIPT SMALL LETTER L, 8343 +LATIN SUBSCRIPT SMALL LETTER M, 8344 +LATIN SUBSCRIPT SMALL LETTER N, 8345 +LATIN SUBSCRIPT SMALL LETTER P, 8346 +LATIN SUBSCRIPT SMALL LETTER S, 8347 +LATIN SUBSCRIPT SMALL LETTER T, 8348 +EURO CURRENCY SIGN, 8352 +COLON SIGN, 8353 +CRUZEIRO SIGN, 8354 +FRENCH FRANC SIGN, 8355 +LIRA SIGN, 8356 +MILL SIGN, 8357 +NAIRA SIGN, 8358 +PESETA SIGN, 8359 +RUPEE SIGN, 8360 +WON SIGN, 8361 +NEW SHEQEL SIGN, 8362 +DONG SIGN, 8363 +EURO SIGN, 8364 +KIP SIGN, 8365 +TUGRIK SIGN, 8366 +DRACHMA SIGN, 8367 +GERMAN PENNY SIGN, 8368 +PESO SIGN, 8369 +GUARANI SIGN, 8370 +AUSTRAL SIGN, 8371 +HRYVNIA SIGN, 8372 +CEDI SIGN, 8373 +LIVRE TOURNOIS SIGN, 8374 +SPESMILO SIGN, 8375 +TENGE SIGN, 8376 +INDIAN RUPEE SIGN, 8377 +TURKISH LIRA SIGN, 8378 +NORDIC MARK SIGN, 8379 +MANAT SIGN, 8380 +RUBLE SIGN, 8381 +LARI SIGN, 8382 +COMBINING LEFT HARPOON ABOVE, 8400 +COMBINING RIGHT HARPOON ABOVE, 8401 +COMBINING LONG VERTICAL LINE OVERLAY, 8402 +COMBINING SHORT VERTICAL LINE OVERLAY, 8403 +COMBINING ANTICLOCKWISE ARROW ABOVE, 8404 +COMBINING CLOCKWISE ARROW ABOVE, 8405 +COMBINING LEFT ARROW ABOVE, 8406 +COMBINING RIGHT ARROW ABOVE, 8407 +COMBINING RING OVERLAY, 8408 +COMBINING CLOCKWISE RING OVERLAY, 8409 +COMBINING ANTICLOCKWISE RING OVERLAY, 8410 +COMBINING THREE DOTS ABOVE, 8411 +COMBINING FOUR DOTS ABOVE, 8412 +COMBINING ENCLOSING CIRCLE, 8413 +COMBINING ENCLOSING SQUARE, 8414 +COMBINING ENCLOSING DIAMOND, 8415 +COMBINING ENCLOSING CIRCLE BACKSLASH, 8416 +COMBINING LEFT RIGHT ARROW ABOVE, 8417 +COMBINING ENCLOSING SCREEN, 8418 +COMBINING ENCLOSING KEYCAP, 8419 +COMBINING ENCLOSING UPWARD POINTING TRIANGLE, 8420 +COMBINING REVERSE SOLIDUS OVERLAY, 8421 +COMBINING DOUBLE VERTICAL STROKE OVERLAY, 8422 +COMBINING ANNUITY SYMBOL, 8423 +COMBINING TRIPLE UNDERDOT, 8424 +COMBINING WIDE BRIDGE ABOVE, 8425 +COMBINING LEFTWARDS ARROW OVERLAY, 8426 +COMBINING LONG DOUBLE SOLIDUS OVERLAY, 8427 +COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS, 8428 +COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS, 8429 +COMBINING LEFT ARROW BELOW, 8430 +COMBINING RIGHT ARROW BELOW, 8431 +COMBINING ASTERISK ABOVE, 8432 +ACCOUNT OF, 8448 +ADDRESSED TO THE SUBJECT, 8449 +DOUBLE STRUCK CAPITAL C, 8450 +DEGREE CELSIUS, 8451 +CENTRE LINE SYMBOL, 8452 +CARE OF, 8453 +CADA UNA, 8454 +EULER CONSTANT, 8455 +SCRUPLE, 8456 +DEGREE FAHRENHEIT, 8457 +SCRIPT SMALL G, 8458 +SCRIPT CAPITAL H, 8459 +BLACK LETTER CAPITAL H, 8460 +DOUBLE STRUCK CAPITAL H, 8461 +PLANCK CONSTANT, 8462 +PLANCK CONSTANT OVER TWO PI, 8463 +SCRIPT CAPITAL I, 8464 +BLACK LETTER CAPITAL I, 8465 +SCRIPT CAPITAL L, 8466 +SCRIPT SMALL L, 8467 +L B BAR SYMBOL, 8468 +DOUBLE STRUCK CAPITAL N, 8469 +NUMERO SIGN, 8470 +SOUND RECORDING COPYRIGHT, 8471 +SCRIPT CAPITAL P, 8472 +DOUBLE STRUCK CAPITAL P, 8473 +DOUBLE STRUCK CAPITAL Q, 8474 +SCRIPT CAPITAL R, 8475 +BLACK LETTER CAPITAL R, 8476 +DOUBLE STRUCK CAPITAL R, 8477 +PRESCRIPTION TAKE, 8478 +RESPONSE, 8479 +SERVICE MARK, 8480 +TELEPHONE SIGN, 8481 +TRADE MARK SIGN, 8482 +VERSICLE, 8483 +DOUBLE STRUCK CAPITAL Z, 8484 +OUNCE SIGN, 8485 +OHM SIGN, 8486 +INVERTED OHM SIGN, 8487 +BLACK LETTER CAPITAL Z, 8488 +TURNED GREEK SMALL LETTER IOTA, 8489 +KELVIN SIGN, 8490 +ANGSTROM SIGN, 8491 +SCRIPT CAPITAL B, 8492 +BLACK LETTER CAPITAL C, 8493 +ESTIMATED SYMBOL, 8494 +SCRIPT SMALL E, 8495 +SCRIPT CAPITAL E, 8496 +SCRIPT CAPITAL F, 8497 +TURNED CAPITAL F, 8498 +SCRIPT CAPITAL M, 8499 +SCRIPT SMALL O, 8500 +ALEF SYMBOL, 8501 +BET SYMBOL, 8502 +GIMEL SYMBOL, 8503 +DALET SYMBOL, 8504 +INFORMATION SOURCE, 8505 +ROTATED CAPITAL Q, 8506 +FACSIMILE SIGN, 8507 +DOUBLE STRUCK SMALL PI, 8508 +DOUBLE STRUCK SMALL GAMMA, 8509 +DOUBLE STRUCK CAPITAL GAMMA, 8510 +DOUBLE STRUCK CAPITAL PI, 8511 +DOUBLE STRUCK N ARY SUMMATION, 8512 +TURNED SANS SERIF CAPITAL G, 8513 +TURNED SANS SERIF CAPITAL L, 8514 +REVERSED SANS SERIF CAPITAL L, 8515 +TURNED SANS SERIF CAPITAL Y, 8516 +DOUBLE STRUCK ITALIC CAPITAL D, 8517 +DOUBLE STRUCK ITALIC SMALL D, 8518 +DOUBLE STRUCK ITALIC SMALL E, 8519 +DOUBLE STRUCK ITALIC SMALL I, 8520 +DOUBLE STRUCK ITALIC SMALL J, 8521 +PROPERTY LINE, 8522 +TURNED AMPERSAND, 8523 +PER SIGN, 8524 +AKTIESELSKAB, 8525 +TURNED SMALL F, 8526 +SYMBOL FOR SAMARITAN SOURCE, 8527 +VULGAR FRACTION ONE SEVENTH, 8528 +VULGAR FRACTION ONE NINTH, 8529 +VULGAR FRACTION ONE TENTH, 8530 +VULGAR FRACTION ONE THIRD, 8531 +VULGAR FRACTION TWO THIRDS, 8532 +VULGAR FRACTION ONE FIFTH, 8533 +VULGAR FRACTION TWO FIFTHS, 8534 +VULGAR FRACTION THREE FIFTHS, 8535 +VULGAR FRACTION FOUR FIFTHS, 8536 +VULGAR FRACTION ONE SIXTH, 8537 +VULGAR FRACTION FIVE SIXTHS, 8538 +VULGAR FRACTION ONE EIGHTH, 8539 +VULGAR FRACTION THREE EIGHTHS, 8540 +VULGAR FRACTION FIVE EIGHTHS, 8541 +VULGAR FRACTION SEVEN EIGHTHS, 8542 +FRACTION NUMERATOR ONE, 8543 +ROMAN NUMERAL ONE, 8544 +ROMAN NUMERAL TWO, 8545 +ROMAN NUMERAL THREE, 8546 +ROMAN NUMERAL FOUR, 8547 +ROMAN NUMERAL FIVE, 8548 +ROMAN NUMERAL SIX, 8549 +ROMAN NUMERAL SEVEN, 8550 +ROMAN NUMERAL EIGHT, 8551 +ROMAN NUMERAL NINE, 8552 +ROMAN NUMERAL TEN, 8553 +ROMAN NUMERAL ELEVEN, 8554 +ROMAN NUMERAL TWELVE, 8555 +ROMAN NUMERAL FIFTY, 8556 +ROMAN NUMERAL ONE HUNDRED, 8557 +ROMAN NUMERAL FIVE HUNDRED, 8558 +ROMAN NUMERAL ONE THOUSAND, 8559 +SMALL ROMAN NUMERAL ONE, 8560 +SMALL ROMAN NUMERAL TWO, 8561 +SMALL ROMAN NUMERAL THREE, 8562 +SMALL ROMAN NUMERAL FOUR, 8563 +SMALL ROMAN NUMERAL FIVE, 8564 +SMALL ROMAN NUMERAL SIX, 8565 +SMALL ROMAN NUMERAL SEVEN, 8566 +SMALL ROMAN NUMERAL EIGHT, 8567 +SMALL ROMAN NUMERAL NINE, 8568 +SMALL ROMAN NUMERAL TEN, 8569 +SMALL ROMAN NUMERAL ELEVEN, 8570 +SMALL ROMAN NUMERAL TWELVE, 8571 +SMALL ROMAN NUMERAL FIFTY, 8572 +SMALL ROMAN NUMERAL ONE HUNDRED, 8573 +SMALL ROMAN NUMERAL FIVE HUNDRED, 8574 +SMALL ROMAN NUMERAL ONE THOUSAND, 8575 +ROMAN NUMERAL ONE THOUSAND C D, 8576 +ROMAN NUMERAL FIVE THOUSAND, 8577 +ROMAN NUMERAL TEN THOUSAND, 8578 +ROMAN NUMERAL REVERSED ONE HUNDRED, 8579 +LATIN SMALL LETTER REVERSED C, 8580 +ROMAN NUMERAL SIX LATE FORM, 8581 +ROMAN NUMERAL FIFTY EARLY FORM, 8582 +ROMAN NUMERAL FIFTY THOUSAND, 8583 +ROMAN NUMERAL ONE HUNDRED THOUSAND, 8584 +VULGAR FRACTION ZERO THIRDS, 8585 +TURNED DIGIT TWO, 8586 +TURNED DIGIT THREE, 8587 +LEFTWARDS ARROW, 8592 +UPWARDS ARROW, 8593 +RIGHTWARDS ARROW, 8594 +DOWNWARDS ARROW, 8595 +LEFT RIGHT ARROW, 8596 +UP DOWN ARROW, 8597 +NORTH WEST ARROW, 8598 +NORTH EAST ARROW, 8599 +SOUTH EAST ARROW, 8600 +SOUTH WEST ARROW, 8601 +LEFTWARDS ARROW WITH STROKE, 8602 +RIGHTWARDS ARROW WITH STROKE, 8603 +LEFTWARDS WAVE ARROW, 8604 +RIGHTWARDS WAVE ARROW, 8605 +LEFTWARDS TWO HEADED ARROW, 8606 +UPWARDS TWO HEADED ARROW, 8607 +RIGHTWARDS TWO HEADED ARROW, 8608 +DOWNWARDS TWO HEADED ARROW, 8609 +LEFTWARDS ARROW WITH TAIL, 8610 +RIGHTWARDS ARROW WITH TAIL, 8611 +LEFTWARDS ARROW FROM BAR, 8612 +UPWARDS ARROW FROM BAR, 8613 +RIGHTWARDS ARROW FROM BAR, 8614 +DOWNWARDS ARROW FROM BAR, 8615 +UP DOWN ARROW WITH BASE, 8616 +LEFTWARDS ARROW WITH HOOK, 8617 +RIGHTWARDS ARROW WITH HOOK, 8618 +LEFTWARDS ARROW WITH LOOP, 8619 +RIGHTWARDS ARROW WITH LOOP, 8620 +LEFT RIGHT WAVE ARROW, 8621 +LEFT RIGHT ARROW WITH STROKE, 8622 +DOWNWARDS ZIGZAG ARROW, 8623 +UPWARDS ARROW WITH TIP LEFTWARDS, 8624 +UPWARDS ARROW WITH TIP RIGHTWARDS, 8625 +DOWNWARDS ARROW WITH TIP LEFTWARDS, 8626 +DOWNWARDS ARROW WITH TIP RIGHTWARDS, 8627 +RIGHTWARDS ARROW WITH CORNER DOWNWARDS, 8628 +DOWNWARDS ARROW WITH CORNER LEFTWARDS, 8629 +ANTICLOCKWISE TOP SEMICIRCLE ARROW, 8630 +CLOCKWISE TOP SEMICIRCLE ARROW, 8631 +NORTH WEST ARROW TO LONG BAR, 8632 +LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR, 8633 +ANTICLOCKWISE OPEN CIRCLE ARROW, 8634 +CLOCKWISE OPEN CIRCLE ARROW, 8635 +LEFTWARDS HARPOON WITH BARB UPWARDS, 8636 +LEFTWARDS HARPOON WITH BARB DOWNWARDS, 8637 +UPWARDS HARPOON WITH BARB RIGHTWARDS, 8638 +UPWARDS HARPOON WITH BARB LEFTWARDS, 8639 +RIGHTWARDS HARPOON WITH BARB UPWARDS, 8640 +RIGHTWARDS HARPOON WITH BARB DOWNWARDS, 8641 +DOWNWARDS HARPOON WITH BARB RIGHTWARDS, 8642 +DOWNWARDS HARPOON WITH BARB LEFTWARDS, 8643 +RIGHTWARDS ARROW OVER LEFTWARDS ARROW, 8644 +UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW, 8645 +LEFTWARDS ARROW OVER RIGHTWARDS ARROW, 8646 +LEFTWARDS PAIRED ARROWS, 8647 +UPWARDS PAIRED ARROWS, 8648 +RIGHTWARDS PAIRED ARROWS, 8649 +DOWNWARDS PAIRED ARROWS, 8650 +LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON, 8651 +RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON, 8652 +LEFTWARDS DOUBLE ARROW WITH STROKE, 8653 +LEFT RIGHT DOUBLE ARROW WITH STROKE, 8654 +RIGHTWARDS DOUBLE ARROW WITH STROKE, 8655 +LEFTWARDS DOUBLE ARROW, 8656 +UPWARDS DOUBLE ARROW, 8657 +RIGHTWARDS DOUBLE ARROW, 8658 +DOWNWARDS DOUBLE ARROW, 8659 +LEFT RIGHT DOUBLE ARROW, 8660 +UP DOWN DOUBLE ARROW, 8661 +NORTH WEST DOUBLE ARROW, 8662 +NORTH EAST DOUBLE ARROW, 8663 +SOUTH EAST DOUBLE ARROW, 8664 +SOUTH WEST DOUBLE ARROW, 8665 +LEFTWARDS TRIPLE ARROW, 8666 +RIGHTWARDS TRIPLE ARROW, 8667 +LEFTWARDS SQUIGGLE ARROW, 8668 +RIGHTWARDS SQUIGGLE ARROW, 8669 +UPWARDS ARROW WITH DOUBLE STROKE, 8670 +DOWNWARDS ARROW WITH DOUBLE STROKE, 8671 +LEFTWARDS DASHED ARROW, 8672 +UPWARDS DASHED ARROW, 8673 +RIGHTWARDS DASHED ARROW, 8674 +DOWNWARDS DASHED ARROW, 8675 +LEFTWARDS ARROW TO BAR, 8676 +RIGHTWARDS ARROW TO BAR, 8677 +LEFTWARDS WHITE ARROW, 8678 +UPWARDS WHITE ARROW, 8679 +RIGHTWARDS WHITE ARROW, 8680 +DOWNWARDS WHITE ARROW, 8681 +UPWARDS WHITE ARROW FROM BAR, 8682 +UPWARDS WHITE ARROW ON PEDESTAL, 8683 +UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR, 8684 +UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR, 8685 +UPWARDS WHITE DOUBLE ARROW, 8686 +UPWARDS WHITE DOUBLE ARROW ON PEDESTAL, 8687 +RIGHTWARDS WHITE ARROW FROM WALL, 8688 +NORTH WEST ARROW TO CORNER, 8689 +SOUTH EAST ARROW TO CORNER, 8690 +UP DOWN WHITE ARROW, 8691 +RIGHT ARROW WITH SMALL CIRCLE, 8692 +DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW, 8693 +THREE RIGHTWARDS ARROWS, 8694 +LEFTWARDS ARROW WITH VERTICAL STROKE, 8695 +RIGHTWARDS ARROW WITH VERTICAL STROKE, 8696 +LEFT RIGHT ARROW WITH VERTICAL STROKE, 8697 +LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE, 8698 +RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE, 8699 +LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE, 8700 +LEFTWARDS OPEN HEADED ARROW, 8701 +RIGHTWARDS OPEN HEADED ARROW, 8702 +LEFT RIGHT OPEN HEADED ARROW, 8703 +FOR ALL, 8704 +COMPLEMENT, 8705 +PARTIAL DIFFERENTIAL, 8706 +THERE EXISTS, 8707 +THERE DOES NOT EXIST, 8708 +EMPTY SET, 8709 +INCREMENT, 8710 +NABLA, 8711 +ELEMENT OF, 8712 +NOT AN ELEMENT OF, 8713 +SMALL ELEMENT OF, 8714 +CONTAINS AS MEMBER, 8715 +DOES NOT CONTAIN AS MEMBER, 8716 +SMALL CONTAINS AS MEMBER, 8717 +END OF PROOF, 8718 +N ARY PRODUCT, 8719 +N ARY COPRODUCT, 8720 +N ARY SUMMATION, 8721 +MINUS SIGN, 8722 +MINUS OR PLUS SIGN, 8723 +DOT PLUS, 8724 +DIVISION SLASH, 8725 +SET MINUS, 8726 +ASTERISK OPERATOR, 8727 +RING OPERATOR, 8728 +BULLET OPERATOR, 8729 +SQUARE ROOT, 8730 +CUBE ROOT, 8731 +FOURTH ROOT, 8732 +PROPORTIONAL TO, 8733 +INFINITY, 8734 +RIGHT ANGLE, 8735 +ANGLE, 8736 +MEASURED ANGLE, 8737 +SPHERICAL ANGLE, 8738 +DIVIDES, 8739 +DOES NOT DIVIDE, 8740 +PARALLEL TO, 8741 +NOT PARALLEL TO, 8742 +LOGICAL AND, 8743 +LOGICAL OR, 8744 +INTERSECTION, 8745 +UNION, 8746 +INTEGRAL, 8747 +DOUBLE INTEGRAL, 8748 +TRIPLE INTEGRAL, 8749 +CONTOUR INTEGRAL, 8750 +SURFACE INTEGRAL, 8751 +VOLUME INTEGRAL, 8752 +CLOCKWISE INTEGRAL, 8753 +CLOCKWISE CONTOUR INTEGRAL, 8754 +ANTICLOCKWISE CONTOUR INTEGRAL, 8755 +THEREFORE, 8756 +BECAUSE, 8757 +RATIO, 8758 +PROPORTION, 8759 +DOT MINUS, 8760 +EXCESS, 8761 +GEOMETRIC PROPORTION, 8762 +HOMOTHETIC, 8763 +TILDE OPERATOR, 8764 +REVERSED TILDE, 8765 +INVERTED LAZY S, 8766 +SINE WAVE, 8767 +WREATH PRODUCT, 8768 +NOT TILDE, 8769 +MINUS TILDE, 8770 +ASYMPTOTICALLY EQUAL TO, 8771 +NOT ASYMPTOTICALLY EQUAL TO, 8772 +APPROXIMATELY EQUAL TO, 8773 +APPROXIMATELY BUT NOT ACTUALLY EQUAL TO, 8774 +NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO, 8775 +ALMOST EQUAL TO, 8776 +NOT ALMOST EQUAL TO, 8777 +ALMOST EQUAL OR EQUAL TO, 8778 +TRIPLE TILDE, 8779 +ALL EQUAL TO, 8780 +EQUIVALENT TO, 8781 +GEOMETRICALLY EQUIVALENT TO, 8782 +DIFFERENCE BETWEEN, 8783 +APPROACHES THE LIMIT, 8784 +GEOMETRICALLY EQUAL TO, 8785 +APPROXIMATELY EQUAL TO OR THE IMAGE OF, 8786 +IMAGE OF OR APPROXIMATELY EQUAL TO, 8787 +COLON EQUALS, 8788 +EQUALS COLON, 8789 +RING IN EQUAL TO, 8790 +RING EQUAL TO, 8791 +CORRESPONDS TO, 8792 +ESTIMATES, 8793 +EQUIANGULAR TO, 8794 +STAR EQUALS, 8795 +DELTA EQUAL TO, 8796 +EQUAL TO BY DEFINITION, 8797 +MEASURED BY, 8798 +QUESTIONED EQUAL TO, 8799 +NOT EQUAL TO, 8800 +IDENTICAL TO, 8801 +NOT IDENTICAL TO, 8802 +STRICTLY EQUIVALENT TO, 8803 +LESS THAN OR EQUAL TO, 8804 +GREATER THAN OR EQUAL TO, 8805 +LESS THAN OVER EQUAL TO, 8806 +GREATER THAN OVER EQUAL TO, 8807 +LESS THAN BUT NOT EQUAL TO, 8808 +GREATER THAN BUT NOT EQUAL TO, 8809 +MUCH LESS THAN, 8810 +MUCH GREATER THAN, 8811 +BETWEEN, 8812 +NOT EQUIVALENT TO, 8813 +NOT LESS THAN, 8814 +NOT GREATER THAN, 8815 +NEITHER LESS THAN NOR EQUAL TO, 8816 +NEITHER GREATER THAN NOR EQUAL TO, 8817 +LESS THAN OR EQUIVALENT TO, 8818 +GREATER THAN OR EQUIVALENT TO, 8819 +NEITHER LESS THAN NOR EQUIVALENT TO, 8820 +NEITHER GREATER THAN NOR EQUIVALENT TO, 8821 +LESS THAN OR GREATER THAN, 8822 +GREATER THAN OR LESS THAN, 8823 +NEITHER LESS THAN NOR GREATER THAN, 8824 +NEITHER GREATER THAN NOR LESS THAN, 8825 +PRECEDES, 8826 +SUCCEEDS, 8827 +PRECEDES OR EQUAL TO, 8828 +SUCCEEDS OR EQUAL TO, 8829 +PRECEDES OR EQUIVALENT TO, 8830 +SUCCEEDS OR EQUIVALENT TO, 8831 +DOES NOT PRECEDE, 8832 +DOES NOT SUCCEED, 8833 +SUBSET OF, 8834 +SUPERSET OF, 8835 +NOT A SUBSET OF, 8836 +NOT A SUPERSET OF, 8837 +SUBSET OF OR EQUAL TO, 8838 +SUPERSET OF OR EQUAL TO, 8839 +NEITHER A SUBSET OF NOR EQUAL TO, 8840 +NEITHER A SUPERSET OF NOR EQUAL TO, 8841 +SUBSET OF WITH NOT EQUAL TO, 8842 +SUPERSET OF WITH NOT EQUAL TO, 8843 +MULTISET, 8844 +MULTISET MULTIPLICATION, 8845 +MULTISET UNION, 8846 +SQUARE IMAGE OF, 8847 +SQUARE ORIGINAL OF, 8848 +SQUARE IMAGE OF OR EQUAL TO, 8849 +SQUARE ORIGINAL OF OR EQUAL TO, 8850 +SQUARE CAP, 8851 +SQUARE CUP, 8852 +CIRCLED PLUS, 8853 +CIRCLED MINUS, 8854 +CIRCLED TIMES, 8855 +CIRCLED DIVISION SLASH, 8856 +CIRCLED DOT OPERATOR, 8857 +CIRCLED RING OPERATOR, 8858 +CIRCLED ASTERISK OPERATOR, 8859 +CIRCLED EQUALS, 8860 +CIRCLED DASH, 8861 +SQUARED PLUS, 8862 +SQUARED MINUS, 8863 +SQUARED TIMES, 8864 +SQUARED DOT OPERATOR, 8865 +RIGHT TACK, 8866 +LEFT TACK, 8867 +DOWN TACK, 8868 +UP TACK, 8869 +ASSERTION, 8870 +MODELS, 8871 +TRUE, 8872 +FORCES, 8873 +TRIPLE VERTICAL BAR RIGHT TURNSTILE, 8874 +DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE, 8875 +DOES NOT PROVE, 8876 +NOT TRUE, 8877 +DOES NOT FORCE, 8878 +NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE, 8879 +PRECEDES UNDER RELATION, 8880 +SUCCEEDS UNDER RELATION, 8881 +NORMAL SUBGROUP OF, 8882 +CONTAINS AS NORMAL SUBGROUP, 8883 +NORMAL SUBGROUP OF OR EQUAL TO, 8884 +CONTAINS AS NORMAL SUBGROUP OR EQUAL TO, 8885 +ORIGINAL OF, 8886 +IMAGE OF, 8887 +MULTIMAP, 8888 +HERMITIAN CONJUGATE MATRIX, 8889 +INTERCALATE, 8890 +XOR, 8891 +NAND, 8892 +NOR, 8893 +RIGHT ANGLE WITH ARC, 8894 +RIGHT TRIANGLE, 8895 +N ARY LOGICAL AND, 8896 +N ARY LOGICAL OR, 8897 +N ARY INTERSECTION, 8898 +N ARY UNION, 8899 +DIAMOND OPERATOR, 8900 +DOT OPERATOR, 8901 +STAR OPERATOR, 8902 +DIVISION TIMES, 8903 +BOWTIE, 8904 +LEFT NORMAL FACTOR SEMIDIRECT PRODUCT, 8905 +RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT, 8906 +LEFT SEMIDIRECT PRODUCT, 8907 +RIGHT SEMIDIRECT PRODUCT, 8908 +REVERSED TILDE EQUALS, 8909 +CURLY LOGICAL OR, 8910 +CURLY LOGICAL AND, 8911 +DOUBLE SUBSET, 8912 +DOUBLE SUPERSET, 8913 +DOUBLE INTERSECTION, 8914 +DOUBLE UNION, 8915 +PITCHFORK, 8916 +EQUAL AND PARALLEL TO, 8917 +LESS THAN WITH DOT, 8918 +GREATER THAN WITH DOT, 8919 +VERY MUCH LESS THAN, 8920 +VERY MUCH GREATER THAN, 8921 +LESS THAN EQUAL TO OR GREATER THAN, 8922 +GREATER THAN EQUAL TO OR LESS THAN, 8923 +EQUAL TO OR LESS THAN, 8924 +EQUAL TO OR GREATER THAN, 8925 +EQUAL TO OR PRECEDES, 8926 +EQUAL TO OR SUCCEEDS, 8927 +DOES NOT PRECEDE OR EQUAL, 8928 +DOES NOT SUCCEED OR EQUAL, 8929 +NOT SQUARE IMAGE OF OR EQUAL TO, 8930 +NOT SQUARE ORIGINAL OF OR EQUAL TO, 8931 +SQUARE IMAGE OF OR NOT EQUAL TO, 8932 +SQUARE ORIGINAL OF OR NOT EQUAL TO, 8933 +LESS THAN BUT NOT EQUIVALENT TO, 8934 +GREATER THAN BUT NOT EQUIVALENT TO, 8935 +PRECEDES BUT NOT EQUIVALENT TO, 8936 +SUCCEEDS BUT NOT EQUIVALENT TO, 8937 +NOT NORMAL SUBGROUP OF, 8938 +DOES NOT CONTAIN AS NORMAL SUBGROUP, 8939 +NOT NORMAL SUBGROUP OF OR EQUAL TO, 8940 +DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL, 8941 +VERTICAL ELLIPSIS, 8942 +MIDLINE HORIZONTAL ELLIPSIS, 8943 +UP RIGHT DIAGONAL ELLIPSIS, 8944 +DOWN RIGHT DIAGONAL ELLIPSIS, 8945 +ELEMENT OF WITH LONG HORIZONTAL STROKE, 8946 +ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, 8947 +SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, 8948 +ELEMENT OF WITH DOT ABOVE, 8949 +ELEMENT OF WITH OVERBAR, 8950 +SMALL ELEMENT OF WITH OVERBAR, 8951 +ELEMENT OF WITH UNDERBAR, 8952 +ELEMENT OF WITH TWO HORIZONTAL STROKES, 8953 +CONTAINS WITH LONG HORIZONTAL STROKE, 8954 +CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, 8955 +SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, 8956 +CONTAINS WITH OVERBAR, 8957 +SMALL CONTAINS WITH OVERBAR, 8958 +Z NOTATION BAG MEMBERSHIP, 8959 +DIAMETER SIGN, 8960 +ELECTRIC ARROW, 8961 +HOUSE, 8962 +UP ARROWHEAD, 8963 +DOWN ARROWHEAD, 8964 +PROJECTIVE, 8965 +PERSPECTIVE, 8966 +WAVY LINE, 8967 +LEFT CEILING, 8968 +RIGHT CEILING, 8969 +LEFT FLOOR, 8970 +RIGHT FLOOR, 8971 +BOTTOM RIGHT CROP, 8972 +BOTTOM LEFT CROP, 8973 +TOP RIGHT CROP, 8974 +TOP LEFT CROP, 8975 +REVERSED NOT SIGN, 8976 +SQUARE LOZENGE, 8977 +ARC, 8978 +SEGMENT, 8979 +SECTOR, 8980 +TELEPHONE RECORDER, 8981 +POSITION INDICATOR, 8982 +VIEWDATA SQUARE, 8983 +PLACE OF INTEREST SIGN, 8984 +TURNED NOT SIGN, 8985 +WATCH, 8986 +HOURGLASS, 8987 +TOP LEFT CORNER, 8988 +TOP RIGHT CORNER, 8989 +BOTTOM LEFT CORNER, 8990 +BOTTOM RIGHT CORNER, 8991 +TOP HALF INTEGRAL, 8992 +BOTTOM HALF INTEGRAL, 8993 +FROWN, 8994 +SMILE, 8995 +UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS, 8996 +OPTION KEY, 8997 +ERASE TO THE RIGHT, 8998 +X IN A RECTANGLE BOX, 8999 +KEYBOARD, 9000 +LEFT POINTING ANGLE BRACKET, 9001 +RIGHT POINTING ANGLE BRACKET, 9002 +ERASE TO THE LEFT, 9003 +BENZENE RING, 9004 +CYLINDRICITY, 9005 +ALL AROUND PROFILE, 9006 +SYMMETRY, 9007 +TOTAL RUNOUT, 9008 +DIMENSION ORIGIN, 9009 +CONICAL TAPER, 9010 +SLOPE, 9011 +COUNTERBORE, 9012 +COUNTERSINK, 9013 +APL FUNCTIONAL SYMBOL I BEAM, 9014 +APL FUNCTIONAL SYMBOL SQUISH QUAD, 9015 +APL FUNCTIONAL SYMBOL QUAD EQUAL, 9016 +APL FUNCTIONAL SYMBOL QUAD DIVIDE, 9017 +APL FUNCTIONAL SYMBOL QUAD DIAMOND, 9018 +APL FUNCTIONAL SYMBOL QUAD JOT, 9019 +APL FUNCTIONAL SYMBOL QUAD CIRCLE, 9020 +APL FUNCTIONAL SYMBOL CIRCLE STILE, 9021 +APL FUNCTIONAL SYMBOL CIRCLE JOT, 9022 +APL FUNCTIONAL SYMBOL SLASH BAR, 9023 +APL FUNCTIONAL SYMBOL BACKSLASH BAR, 9024 +APL FUNCTIONAL SYMBOL QUAD SLASH, 9025 +APL FUNCTIONAL SYMBOL QUAD BACKSLASH, 9026 +APL FUNCTIONAL SYMBOL QUAD LESS THAN, 9027 +APL FUNCTIONAL SYMBOL QUAD GREATER THAN, 9028 +APL FUNCTIONAL SYMBOL LEFTWARDS VANE, 9029 +APL FUNCTIONAL SYMBOL RIGHTWARDS VANE, 9030 +APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW, 9031 +APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW, 9032 +APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH, 9033 +APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR, 9034 +APL FUNCTIONAL SYMBOL DELTA STILE, 9035 +APL FUNCTIONAL SYMBOL QUAD DOWN CARET, 9036 +APL FUNCTIONAL SYMBOL QUAD DELTA, 9037 +APL FUNCTIONAL SYMBOL DOWN TACK JOT, 9038 +APL FUNCTIONAL SYMBOL UPWARDS VANE, 9039 +APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW, 9040 +APL FUNCTIONAL SYMBOL UP TACK OVERBAR, 9041 +APL FUNCTIONAL SYMBOL DEL STILE, 9042 +APL FUNCTIONAL SYMBOL QUAD UP CARET, 9043 +APL FUNCTIONAL SYMBOL QUAD DEL, 9044 +APL FUNCTIONAL SYMBOL UP TACK JOT, 9045 +APL FUNCTIONAL SYMBOL DOWNWARDS VANE, 9046 +APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW, 9047 +APL FUNCTIONAL SYMBOL QUOTE UNDERBAR, 9048 +APL FUNCTIONAL SYMBOL DELTA UNDERBAR, 9049 +APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR, 9050 +APL FUNCTIONAL SYMBOL JOT UNDERBAR, 9051 +APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR, 9052 +APL FUNCTIONAL SYMBOL UP SHOE JOT, 9053 +APL FUNCTIONAL SYMBOL QUOTE QUAD, 9054 +APL FUNCTIONAL SYMBOL CIRCLE STAR, 9055 +APL FUNCTIONAL SYMBOL QUAD COLON, 9056 +APL FUNCTIONAL SYMBOL UP TACK DIAERESIS, 9057 +APL FUNCTIONAL SYMBOL DEL DIAERESIS, 9058 +APL FUNCTIONAL SYMBOL STAR DIAERESIS, 9059 +APL FUNCTIONAL SYMBOL JOT DIAERESIS, 9060 +APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS, 9061 +APL FUNCTIONAL SYMBOL DOWN SHOE STILE, 9062 +APL FUNCTIONAL SYMBOL LEFT SHOE STILE, 9063 +APL FUNCTIONAL SYMBOL TILDE DIAERESIS, 9064 +APL FUNCTIONAL SYMBOL GREATER THAN DIAERESIS, 9065 +APL FUNCTIONAL SYMBOL COMMA BAR, 9066 +APL FUNCTIONAL SYMBOL DEL TILDE, 9067 +APL FUNCTIONAL SYMBOL ZILDE, 9068 +APL FUNCTIONAL SYMBOL STILE TILDE, 9069 +APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR, 9070 +APL FUNCTIONAL SYMBOL QUAD NOT EQUAL, 9071 +APL FUNCTIONAL SYMBOL QUAD QUESTION, 9072 +APL FUNCTIONAL SYMBOL DOWN CARET TILDE, 9073 +APL FUNCTIONAL SYMBOL UP CARET TILDE, 9074 +APL FUNCTIONAL SYMBOL IOTA, 9075 +APL FUNCTIONAL SYMBOL RHO, 9076 +APL FUNCTIONAL SYMBOL OMEGA, 9077 +APL FUNCTIONAL SYMBOL ALPHA UNDERBAR, 9078 +APL FUNCTIONAL SYMBOL EPSILON UNDERBAR, 9079 +APL FUNCTIONAL SYMBOL IOTA UNDERBAR, 9080 +APL FUNCTIONAL SYMBOL OMEGA UNDERBAR, 9081 +APL FUNCTIONAL SYMBOL ALPHA, 9082 +NOT CHECK MARK, 9083 +RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW, 9084 +SHOULDERED OPEN BOX, 9085 +BELL SYMBOL, 9086 +VERTICAL LINE WITH MIDDLE DOT, 9087 +INSERTION SYMBOL, 9088 +CONTINUOUS UNDERLINE SYMBOL, 9089 +DISCONTINUOUS UNDERLINE SYMBOL, 9090 +EMPHASIS SYMBOL, 9091 +COMPOSITION SYMBOL, 9092 +WHITE SQUARE WITH CENTRE VERTICAL LINE, 9093 +ENTER SYMBOL, 9094 +ALTERNATIVE KEY SYMBOL, 9095 +HELM SYMBOL, 9096 +CIRCLED HORIZONTAL BAR WITH NOTCH, 9097 +CIRCLED TRIANGLE DOWN, 9098 +BROKEN CIRCLE WITH NORTHWEST ARROW, 9099 +UNDO SYMBOL, 9100 +MONOSTABLE SYMBOL, 9101 +HYSTERESIS SYMBOL, 9102 +OPEN CIRCUIT OUTPUT H TYPE SYMBOL, 9103 +OPEN CIRCUIT OUTPUT L TYPE SYMBOL, 9104 +PASSIVE PULL DOWN OUTPUT SYMBOL, 9105 +PASSIVE PULL UP OUTPUT SYMBOL, 9106 +DIRECT CURRENT SYMBOL FORM TWO, 9107 +SOFTWARE FUNCTION SYMBOL, 9108 +APL FUNCTIONAL SYMBOL QUAD, 9109 +DECIMAL SEPARATOR KEY SYMBOL, 9110 +PREVIOUS PAGE, 9111 +NEXT PAGE, 9112 +PRINT SCREEN SYMBOL, 9113 +CLEAR SCREEN SYMBOL, 9114 +LEFT PARENTHESIS UPPER HOOK, 9115 +LEFT PARENTHESIS EXTENSION, 9116 +LEFT PARENTHESIS LOWER HOOK, 9117 +RIGHT PARENTHESIS UPPER HOOK, 9118 +RIGHT PARENTHESIS EXTENSION, 9119 +RIGHT PARENTHESIS LOWER HOOK, 9120 +LEFT SQUARE BRACKET UPPER CORNER, 9121 +LEFT SQUARE BRACKET EXTENSION, 9122 +LEFT SQUARE BRACKET LOWER CORNER, 9123 +RIGHT SQUARE BRACKET UPPER CORNER, 9124 +RIGHT SQUARE BRACKET EXTENSION, 9125 +RIGHT SQUARE BRACKET LOWER CORNER, 9126 +LEFT CURLY BRACKET UPPER HOOK, 9127 +LEFT CURLY BRACKET MIDDLE PIECE, 9128 +LEFT CURLY BRACKET LOWER HOOK, 9129 +CURLY BRACKET EXTENSION, 9130 +RIGHT CURLY BRACKET UPPER HOOK, 9131 +RIGHT CURLY BRACKET MIDDLE PIECE, 9132 +RIGHT CURLY BRACKET LOWER HOOK, 9133 +INTEGRAL EXTENSION, 9134 +HORIZONTAL LINE EXTENSION, 9135 +UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION, 9136 +UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION, 9137 +SUMMATION TOP, 9138 +SUMMATION BOTTOM, 9139 +TOP SQUARE BRACKET, 9140 +BOTTOM SQUARE BRACKET, 9141 +BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET, 9142 +RADICAL SYMBOL BOTTOM, 9143 +LEFT VERTICAL BOX LINE, 9144 +RIGHT VERTICAL BOX LINE, 9145 +HORIZONTAL SCAN LINE 1, 9146 +HORIZONTAL SCAN LINE 3, 9147 +HORIZONTAL SCAN LINE 7, 9148 +HORIZONTAL SCAN LINE 9, 9149 +DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT, 9150 +DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT, 9151 +DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE, 9152 +DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE, 9153 +DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE, 9154 +DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE, 9155 +DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE, 9156 +DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE, 9157 +DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE, 9158 +DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE, 9159 +DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE, 9160 +DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL, 9161 +DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL, 9162 +DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT, 9163 +DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT, 9164 +SQUARE FOOT, 9165 +RETURN SYMBOL, 9166 +EJECT SYMBOL, 9167 +VERTICAL LINE EXTENSION, 9168 +METRICAL BREVE, 9169 +METRICAL LONG OVER SHORT, 9170 +METRICAL SHORT OVER LONG, 9171 +METRICAL LONG OVER TWO SHORTS, 9172 +METRICAL TWO SHORTS OVER LONG, 9173 +METRICAL TWO SHORTS JOINED, 9174 +METRICAL TRISEME, 9175 +METRICAL TETRASEME, 9176 +METRICAL PENTASEME, 9177 +EARTH GROUND, 9178 +FUSE, 9179 +TOP PARENTHESIS, 9180 +BOTTOM PARENTHESIS, 9181 +TOP CURLY BRACKET, 9182 +BOTTOM CURLY BRACKET, 9183 +TOP TORTOISE SHELL BRACKET, 9184 +BOTTOM TORTOISE SHELL BRACKET, 9185 +WHITE TRAPEZIUM, 9186 +BENZENE RING WITH CIRCLE, 9187 +STRAIGHTNESS, 9188 +FLATNESS, 9189 +AC CURRENT, 9190 +ELECTRICAL INTERSECTION, 9191 +DECIMAL EXPONENT SYMBOL, 9192 +BLACK RIGHT POINTING DOUBLE TRIANGLE, 9193 +BLACK LEFT POINTING DOUBLE TRIANGLE, 9194 +BLACK UP POINTING DOUBLE TRIANGLE, 9195 +BLACK DOWN POINTING DOUBLE TRIANGLE, 9196 +BLACK RIGHT POINTING DOUBLE TRIANGLE WITH VERTICAL BAR, 9197 +BLACK LEFT POINTING DOUBLE TRIANGLE WITH VERTICAL BAR, 9198 +BLACK RIGHT POINTING TRIANGLE WITH DOUBLE VERTICAL BAR, 9199 +ALARM CLOCK, 9200 +STOPWATCH, 9201 +TIMER CLOCK, 9202 +HOURGLASS WITH FLOWING SAND, 9203 +BLACK MEDIUM LEFT POINTING TRIANGLE, 9204 +BLACK MEDIUM RIGHT POINTING TRIANGLE, 9205 +BLACK MEDIUM UP POINTING TRIANGLE, 9206 +BLACK MEDIUM DOWN POINTING TRIANGLE, 9207 +DOUBLE VERTICAL BAR, 9208 +BLACK SQUARE FOR STOP, 9209 +BLACK CIRCLE FOR RECORD, 9210 +POWER SYMBOL, 9211 +POWER ON OFF SYMBOL, 9212 +POWER ON SYMBOL, 9213 +POWER SLEEP SYMBOL, 9214 +SYMBOL FOR NULL, 9216 +SYMBOL FOR START OF HEADING, 9217 +SYMBOL FOR START OF TEXT, 9218 +SYMBOL FOR END OF TEXT, 9219 +SYMBOL FOR END OF TRANSMISSION, 9220 +SYMBOL FOR ENQUIRY, 9221 +SYMBOL FOR ACKNOWLEDGE, 9222 +SYMBOL FOR BELL, 9223 +SYMBOL FOR BACKSPACE, 9224 +SYMBOL FOR HORIZONTAL TABULATION, 9225 +SYMBOL FOR LINE FEED, 9226 +SYMBOL FOR VERTICAL TABULATION, 9227 +SYMBOL FOR FORM FEED, 9228 +SYMBOL FOR CARRIAGE RETURN, 9229 +SYMBOL FOR SHIFT OUT, 9230 +SYMBOL FOR SHIFT IN, 9231 +SYMBOL FOR DATA LINK ESCAPE, 9232 +SYMBOL FOR DEVICE CONTROL ONE, 9233 +SYMBOL FOR DEVICE CONTROL TWO, 9234 +SYMBOL FOR DEVICE CONTROL THREE, 9235 +SYMBOL FOR DEVICE CONTROL FOUR, 9236 +SYMBOL FOR NEGATIVE ACKNOWLEDGE, 9237 +SYMBOL FOR SYNCHRONOUS IDLE, 9238 +SYMBOL FOR END OF TRANSMISSION BLOCK, 9239 +SYMBOL FOR CANCEL, 9240 +SYMBOL FOR END OF MEDIUM, 9241 +SYMBOL FOR SUBSTITUTE, 9242 +SYMBOL FOR ESCAPE, 9243 +SYMBOL FOR FILE SEPARATOR, 9244 +SYMBOL FOR GROUP SEPARATOR, 9245 +SYMBOL FOR RECORD SEPARATOR, 9246 +SYMBOL FOR UNIT SEPARATOR, 9247 +SYMBOL FOR SPACE, 9248 +SYMBOL FOR DELETE, 9249 +BLANK SYMBOL, 9250 +OPEN BOX, 9251 +SYMBOL FOR NEWLINE, 9252 +SYMBOL FOR DELETE FORM TWO, 9253 +SYMBOL FOR SUBSTITUTE FORM TWO, 9254 +OCR HOOK, 9280 +OCR CHAIR, 9281 +OCR FORK, 9282 +OCR INVERTED FORK, 9283 +OCR BELT BUCKLE, 9284 +OCR BOW TIE, 9285 +OCR BRANCH BANK IDENTIFICATION, 9286 +OCR AMOUNT OF CHECK, 9287 +OCR DASH, 9288 +OCR CUSTOMER ACCOUNT NUMBER, 9289 +OCR DOUBLE BACKSLASH, 9290 +CIRCLED DIGIT ONE, 9312 +CIRCLED DIGIT TWO, 9313 +CIRCLED DIGIT THREE, 9314 +CIRCLED DIGIT FOUR, 9315 +CIRCLED DIGIT FIVE, 9316 +CIRCLED DIGIT SIX, 9317 +CIRCLED DIGIT SEVEN, 9318 +CIRCLED DIGIT EIGHT, 9319 +CIRCLED DIGIT NINE, 9320 +CIRCLED NUMBER TEN, 9321 +CIRCLED NUMBER ELEVEN, 9322 +CIRCLED NUMBER TWELVE, 9323 +CIRCLED NUMBER THIRTEEN, 9324 +CIRCLED NUMBER FOURTEEN, 9325 +CIRCLED NUMBER FIFTEEN, 9326 +CIRCLED NUMBER SIXTEEN, 9327 +CIRCLED NUMBER SEVENTEEN, 9328 +CIRCLED NUMBER EIGHTEEN, 9329 +CIRCLED NUMBER NINETEEN, 9330 +CIRCLED NUMBER TWENTY, 9331 +PARENTHESIZED DIGIT ONE, 9332 +PARENTHESIZED DIGIT TWO, 9333 +PARENTHESIZED DIGIT THREE, 9334 +PARENTHESIZED DIGIT FOUR, 9335 +PARENTHESIZED DIGIT FIVE, 9336 +PARENTHESIZED DIGIT SIX, 9337 +PARENTHESIZED DIGIT SEVEN, 9338 +PARENTHESIZED DIGIT EIGHT, 9339 +PARENTHESIZED DIGIT NINE, 9340 +PARENTHESIZED NUMBER TEN, 9341 +PARENTHESIZED NUMBER ELEVEN, 9342 +PARENTHESIZED NUMBER TWELVE, 9343 +PARENTHESIZED NUMBER THIRTEEN, 9344 +PARENTHESIZED NUMBER FOURTEEN, 9345 +PARENTHESIZED NUMBER FIFTEEN, 9346 +PARENTHESIZED NUMBER SIXTEEN, 9347 +PARENTHESIZED NUMBER SEVENTEEN, 9348 +PARENTHESIZED NUMBER EIGHTEEN, 9349 +PARENTHESIZED NUMBER NINETEEN, 9350 +PARENTHESIZED NUMBER TWENTY, 9351 +DIGIT ONE FULL STOP, 9352 +DIGIT TWO FULL STOP, 9353 +DIGIT THREE FULL STOP, 9354 +DIGIT FOUR FULL STOP, 9355 +DIGIT FIVE FULL STOP, 9356 +DIGIT SIX FULL STOP, 9357 +DIGIT SEVEN FULL STOP, 9358 +DIGIT EIGHT FULL STOP, 9359 +DIGIT NINE FULL STOP, 9360 +NUMBER TEN FULL STOP, 9361 +NUMBER ELEVEN FULL STOP, 9362 +NUMBER TWELVE FULL STOP, 9363 +NUMBER THIRTEEN FULL STOP, 9364 +NUMBER FOURTEEN FULL STOP, 9365 +NUMBER FIFTEEN FULL STOP, 9366 +NUMBER SIXTEEN FULL STOP, 9367 +NUMBER SEVENTEEN FULL STOP, 9368 +NUMBER EIGHTEEN FULL STOP, 9369 +NUMBER NINETEEN FULL STOP, 9370 +NUMBER TWENTY FULL STOP, 9371 +PARENTHESIZED LATIN SMALL LETTER A, 9372 +PARENTHESIZED LATIN SMALL LETTER B, 9373 +PARENTHESIZED LATIN SMALL LETTER C, 9374 +PARENTHESIZED LATIN SMALL LETTER D, 9375 +PARENTHESIZED LATIN SMALL LETTER E, 9376 +PARENTHESIZED LATIN SMALL LETTER F, 9377 +PARENTHESIZED LATIN SMALL LETTER G, 9378 +PARENTHESIZED LATIN SMALL LETTER H, 9379 +PARENTHESIZED LATIN SMALL LETTER I, 9380 +PARENTHESIZED LATIN SMALL LETTER J, 9381 +PARENTHESIZED LATIN SMALL LETTER K, 9382 +PARENTHESIZED LATIN SMALL LETTER L, 9383 +PARENTHESIZED LATIN SMALL LETTER M, 9384 +PARENTHESIZED LATIN SMALL LETTER N, 9385 +PARENTHESIZED LATIN SMALL LETTER O, 9386 +PARENTHESIZED LATIN SMALL LETTER P, 9387 +PARENTHESIZED LATIN SMALL LETTER Q, 9388 +PARENTHESIZED LATIN SMALL LETTER R, 9389 +PARENTHESIZED LATIN SMALL LETTER S, 9390 +PARENTHESIZED LATIN SMALL LETTER T, 9391 +PARENTHESIZED LATIN SMALL LETTER U, 9392 +PARENTHESIZED LATIN SMALL LETTER V, 9393 +PARENTHESIZED LATIN SMALL LETTER W, 9394 +PARENTHESIZED LATIN SMALL LETTER X, 9395 +PARENTHESIZED LATIN SMALL LETTER Y, 9396 +PARENTHESIZED LATIN SMALL LETTER Z, 9397 +CIRCLED LATIN CAPITAL LETTER A, 9398 +CIRCLED LATIN CAPITAL LETTER B, 9399 +CIRCLED LATIN CAPITAL LETTER C, 9400 +CIRCLED LATIN CAPITAL LETTER D, 9401 +CIRCLED LATIN CAPITAL LETTER E, 9402 +CIRCLED LATIN CAPITAL LETTER F, 9403 +CIRCLED LATIN CAPITAL LETTER G, 9404 +CIRCLED LATIN CAPITAL LETTER H, 9405 +CIRCLED LATIN CAPITAL LETTER I, 9406 +CIRCLED LATIN CAPITAL LETTER J, 9407 +CIRCLED LATIN CAPITAL LETTER K, 9408 +CIRCLED LATIN CAPITAL LETTER L, 9409 +CIRCLED LATIN CAPITAL LETTER M, 9410 +CIRCLED LATIN CAPITAL LETTER N, 9411 +CIRCLED LATIN CAPITAL LETTER O, 9412 +CIRCLED LATIN CAPITAL LETTER P, 9413 +CIRCLED LATIN CAPITAL LETTER Q, 9414 +CIRCLED LATIN CAPITAL LETTER R, 9415 +CIRCLED LATIN CAPITAL LETTER S, 9416 +CIRCLED LATIN CAPITAL LETTER T, 9417 +CIRCLED LATIN CAPITAL LETTER U, 9418 +CIRCLED LATIN CAPITAL LETTER V, 9419 +CIRCLED LATIN CAPITAL LETTER W, 9420 +CIRCLED LATIN CAPITAL LETTER X, 9421 +CIRCLED LATIN CAPITAL LETTER Y, 9422 +CIRCLED LATIN CAPITAL LETTER Z, 9423 +CIRCLED LATIN SMALL LETTER A, 9424 +CIRCLED LATIN SMALL LETTER B, 9425 +CIRCLED LATIN SMALL LETTER C, 9426 +CIRCLED LATIN SMALL LETTER D, 9427 +CIRCLED LATIN SMALL LETTER E, 9428 +CIRCLED LATIN SMALL LETTER F, 9429 +CIRCLED LATIN SMALL LETTER G, 9430 +CIRCLED LATIN SMALL LETTER H, 9431 +CIRCLED LATIN SMALL LETTER I, 9432 +CIRCLED LATIN SMALL LETTER J, 9433 +CIRCLED LATIN SMALL LETTER K, 9434 +CIRCLED LATIN SMALL LETTER L, 9435 +CIRCLED LATIN SMALL LETTER M, 9436 +CIRCLED LATIN SMALL LETTER N, 9437 +CIRCLED LATIN SMALL LETTER O, 9438 +CIRCLED LATIN SMALL LETTER P, 9439 +CIRCLED LATIN SMALL LETTER Q, 9440 +CIRCLED LATIN SMALL LETTER R, 9441 +CIRCLED LATIN SMALL LETTER S, 9442 +CIRCLED LATIN SMALL LETTER T, 9443 +CIRCLED LATIN SMALL LETTER U, 9444 +CIRCLED LATIN SMALL LETTER V, 9445 +CIRCLED LATIN SMALL LETTER W, 9446 +CIRCLED LATIN SMALL LETTER X, 9447 +CIRCLED LATIN SMALL LETTER Y, 9448 +CIRCLED LATIN SMALL LETTER Z, 9449 +CIRCLED DIGIT ZERO, 9450 +NEGATIVE CIRCLED NUMBER ELEVEN, 9451 +NEGATIVE CIRCLED NUMBER TWELVE, 9452 +NEGATIVE CIRCLED NUMBER THIRTEEN, 9453 +NEGATIVE CIRCLED NUMBER FOURTEEN, 9454 +NEGATIVE CIRCLED NUMBER FIFTEEN, 9455 +NEGATIVE CIRCLED NUMBER SIXTEEN, 9456 +NEGATIVE CIRCLED NUMBER SEVENTEEN, 9457 +NEGATIVE CIRCLED NUMBER EIGHTEEN, 9458 +NEGATIVE CIRCLED NUMBER NINETEEN, 9459 +NEGATIVE CIRCLED NUMBER TWENTY, 9460 +DOUBLE CIRCLED DIGIT ONE, 9461 +DOUBLE CIRCLED DIGIT TWO, 9462 +DOUBLE CIRCLED DIGIT THREE, 9463 +DOUBLE CIRCLED DIGIT FOUR, 9464 +DOUBLE CIRCLED DIGIT FIVE, 9465 +DOUBLE CIRCLED DIGIT SIX, 9466 +DOUBLE CIRCLED DIGIT SEVEN, 9467 +DOUBLE CIRCLED DIGIT EIGHT, 9468 +DOUBLE CIRCLED DIGIT NINE, 9469 +DOUBLE CIRCLED NUMBER TEN, 9470 +NEGATIVE CIRCLED DIGIT ZERO, 9471 +BOX DRAWINGS LIGHT HORIZONTAL, 9472 +BOX DRAWINGS HEAVY HORIZONTAL, 9473 +BOX DRAWINGS LIGHT VERTICAL, 9474 +BOX DRAWINGS HEAVY VERTICAL, 9475 +BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL, 9476 +BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL, 9477 +BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL, 9478 +BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL, 9479 +BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL, 9480 +BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL, 9481 +BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL, 9482 +BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL, 9483 +BOX DRAWINGS LIGHT DOWN AND RIGHT, 9484 +BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY, 9485 +BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT, 9486 +BOX DRAWINGS HEAVY DOWN AND RIGHT, 9487 +BOX DRAWINGS LIGHT DOWN AND LEFT, 9488 +BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY, 9489 +BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT, 9490 +BOX DRAWINGS HEAVY DOWN AND LEFT, 9491 +BOX DRAWINGS LIGHT UP AND RIGHT, 9492 +BOX DRAWINGS UP LIGHT AND RIGHT HEAVY, 9493 +BOX DRAWINGS UP HEAVY AND RIGHT LIGHT, 9494 +BOX DRAWINGS HEAVY UP AND RIGHT, 9495 +BOX DRAWINGS LIGHT UP AND LEFT, 9496 +BOX DRAWINGS UP LIGHT AND LEFT HEAVY, 9497 +BOX DRAWINGS UP HEAVY AND LEFT LIGHT, 9498 +BOX DRAWINGS HEAVY UP AND LEFT, 9499 +BOX DRAWINGS LIGHT VERTICAL AND RIGHT, 9500 +BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY, 9501 +BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT, 9502 +BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT, 9503 +BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT, 9504 +BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY, 9505 +BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY, 9506 +BOX DRAWINGS HEAVY VERTICAL AND RIGHT, 9507 +BOX DRAWINGS LIGHT VERTICAL AND LEFT, 9508 +BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY, 9509 +BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT, 9510 +BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT, 9511 +BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT, 9512 +BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY, 9513 +BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY, 9514 +BOX DRAWINGS HEAVY VERTICAL AND LEFT, 9515 +BOX DRAWINGS LIGHT DOWN AND HORIZONTAL, 9516 +BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT, 9517 +BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT, 9518 +BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY, 9519 +BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT, 9520 +BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY, 9521 +BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY, 9522 +BOX DRAWINGS HEAVY DOWN AND HORIZONTAL, 9523 +BOX DRAWINGS LIGHT UP AND HORIZONTAL, 9524 +BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT, 9525 +BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT, 9526 +BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY, 9527 +BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT, 9528 +BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY, 9529 +BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY, 9530 +BOX DRAWINGS HEAVY UP AND HORIZONTAL, 9531 +BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL, 9532 +BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT, 9533 +BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT, 9534 +BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY, 9535 +BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT, 9536 +BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT, 9537 +BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT, 9538 +BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT, 9539 +BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT, 9540 +BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT, 9541 +BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT, 9542 +BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY, 9543 +BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY, 9544 +BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY, 9545 +BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY, 9546 +BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL, 9547 +BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL, 9548 +BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL, 9549 +BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL, 9550 +BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL, 9551 +BOX DRAWINGS DOUBLE HORIZONTAL, 9552 +BOX DRAWINGS DOUBLE VERTICAL, 9553 +BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE, 9554 +BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE, 9555 +BOX DRAWINGS DOUBLE DOWN AND RIGHT, 9556 +BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE, 9557 +BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE, 9558 +BOX DRAWINGS DOUBLE DOWN AND LEFT, 9559 +BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE, 9560 +BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE, 9561 +BOX DRAWINGS DOUBLE UP AND RIGHT, 9562 +BOX DRAWINGS UP SINGLE AND LEFT DOUBLE, 9563 +BOX DRAWINGS UP DOUBLE AND LEFT SINGLE, 9564 +BOX DRAWINGS DOUBLE UP AND LEFT, 9565 +BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE, 9566 +BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE, 9567 +BOX DRAWINGS DOUBLE VERTICAL AND RIGHT, 9568 +BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE, 9569 +BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE, 9570 +BOX DRAWINGS DOUBLE VERTICAL AND LEFT, 9571 +BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE, 9572 +BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE, 9573 +BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL, 9574 +BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE, 9575 +BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE, 9576 +BOX DRAWINGS DOUBLE UP AND HORIZONTAL, 9577 +BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE, 9578 +BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE, 9579 +BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL, 9580 +BOX DRAWINGS LIGHT ARC DOWN AND RIGHT, 9581 +BOX DRAWINGS LIGHT ARC DOWN AND LEFT, 9582 +BOX DRAWINGS LIGHT ARC UP AND LEFT, 9583 +BOX DRAWINGS LIGHT ARC UP AND RIGHT, 9584 +BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT, 9585 +BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT, 9586 +BOX DRAWINGS LIGHT DIAGONAL CROSS, 9587 +BOX DRAWINGS LIGHT LEFT, 9588 +BOX DRAWINGS LIGHT UP, 9589 +BOX DRAWINGS LIGHT RIGHT, 9590 +BOX DRAWINGS LIGHT DOWN, 9591 +BOX DRAWINGS HEAVY LEFT, 9592 +BOX DRAWINGS HEAVY UP, 9593 +BOX DRAWINGS HEAVY RIGHT, 9594 +BOX DRAWINGS HEAVY DOWN, 9595 +BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT, 9596 +BOX DRAWINGS LIGHT UP AND HEAVY DOWN, 9597 +BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT, 9598 +BOX DRAWINGS HEAVY UP AND LIGHT DOWN, 9599 +UPPER HALF BLOCK, 9600 +LOWER ONE EIGHTH BLOCK, 9601 +LOWER ONE QUARTER BLOCK, 9602 +LOWER THREE EIGHTHS BLOCK, 9603 +LOWER HALF BLOCK, 9604 +LOWER FIVE EIGHTHS BLOCK, 9605 +LOWER THREE QUARTERS BLOCK, 9606 +LOWER SEVEN EIGHTHS BLOCK, 9607 +FULL BLOCK, 9608 +LEFT SEVEN EIGHTHS BLOCK, 9609 +LEFT THREE QUARTERS BLOCK, 9610 +LEFT FIVE EIGHTHS BLOCK, 9611 +LEFT HALF BLOCK, 9612 +LEFT THREE EIGHTHS BLOCK, 9613 +LEFT ONE QUARTER BLOCK, 9614 +LEFT ONE EIGHTH BLOCK, 9615 +RIGHT HALF BLOCK, 9616 +LIGHT SHADE, 9617 +MEDIUM SHADE, 9618 +DARK SHADE, 9619 +UPPER ONE EIGHTH BLOCK, 9620 +RIGHT ONE EIGHTH BLOCK, 9621 +QUADRANT LOWER LEFT, 9622 +QUADRANT LOWER RIGHT, 9623 +QUADRANT UPPER LEFT, 9624 +QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT, 9625 +QUADRANT UPPER LEFT AND LOWER RIGHT, 9626 +QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT, 9627 +QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT, 9628 +QUADRANT UPPER RIGHT, 9629 +QUADRANT UPPER RIGHT AND LOWER LEFT, 9630 +QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT, 9631 +BLACK SQUARE, 9632 +WHITE SQUARE, 9633 +WHITE SQUARE WITH ROUNDED CORNERS, 9634 +WHITE SQUARE CONTAINING BLACK SMALL SQUARE, 9635 +SQUARE WITH HORIZONTAL FILL, 9636 +SQUARE WITH VERTICAL FILL, 9637 +SQUARE WITH ORTHOGONAL CROSSHATCH FILL, 9638 +SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL, 9639 +SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL, 9640 +SQUARE WITH DIAGONAL CROSSHATCH FILL, 9641 +BLACK SMALL SQUARE, 9642 +WHITE SMALL SQUARE, 9643 +BLACK RECTANGLE, 9644 +WHITE RECTANGLE, 9645 +BLACK VERTICAL RECTANGLE, 9646 +WHITE VERTICAL RECTANGLE, 9647 +BLACK PARALLELOGRAM, 9648 +WHITE PARALLELOGRAM, 9649 +BLACK UP POINTING TRIANGLE, 9650 +WHITE UP POINTING TRIANGLE, 9651 +BLACK UP POINTING SMALL TRIANGLE, 9652 +WHITE UP POINTING SMALL TRIANGLE, 9653 +BLACK RIGHT POINTING TRIANGLE, 9654 +WHITE RIGHT POINTING TRIANGLE, 9655 +BLACK RIGHT POINTING SMALL TRIANGLE, 9656 +WHITE RIGHT POINTING SMALL TRIANGLE, 9657 +BLACK RIGHT POINTING POINTER, 9658 +WHITE RIGHT POINTING POINTER, 9659 +BLACK DOWN POINTING TRIANGLE, 9660 +WHITE DOWN POINTING TRIANGLE, 9661 +BLACK DOWN POINTING SMALL TRIANGLE, 9662 +WHITE DOWN POINTING SMALL TRIANGLE, 9663 +BLACK LEFT POINTING TRIANGLE, 9664 +WHITE LEFT POINTING TRIANGLE, 9665 +BLACK LEFT POINTING SMALL TRIANGLE, 9666 +WHITE LEFT POINTING SMALL TRIANGLE, 9667 +BLACK LEFT POINTING POINTER, 9668 +WHITE LEFT POINTING POINTER, 9669 +BLACK DIAMOND, 9670 +WHITE DIAMOND, 9671 +WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND, 9672 +FISHEYE, 9673 +LOZENGE, 9674 +WHITE CIRCLE, 9675 +DOTTED CIRCLE, 9676 +CIRCLE WITH VERTICAL FILL, 9677 +BULLSEYE, 9678 +BLACK CIRCLE, 9679 +CIRCLE WITH LEFT HALF BLACK, 9680 +CIRCLE WITH RIGHT HALF BLACK, 9681 +CIRCLE WITH LOWER HALF BLACK, 9682 +CIRCLE WITH UPPER HALF BLACK, 9683 +CIRCLE WITH UPPER RIGHT QUADRANT BLACK, 9684 +CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK, 9685 +LEFT HALF BLACK CIRCLE, 9686 +RIGHT HALF BLACK CIRCLE, 9687 +INVERSE BULLET, 9688 +INVERSE WHITE CIRCLE, 9689 +UPPER HALF INVERSE WHITE CIRCLE, 9690 +LOWER HALF INVERSE WHITE CIRCLE, 9691 +UPPER LEFT QUADRANT CIRCULAR ARC, 9692 +UPPER RIGHT QUADRANT CIRCULAR ARC, 9693 +LOWER RIGHT QUADRANT CIRCULAR ARC, 9694 +LOWER LEFT QUADRANT CIRCULAR ARC, 9695 +UPPER HALF CIRCLE, 9696 +LOWER HALF CIRCLE, 9697 +BLACK LOWER RIGHT TRIANGLE, 9698 +BLACK LOWER LEFT TRIANGLE, 9699 +BLACK UPPER LEFT TRIANGLE, 9700 +BLACK UPPER RIGHT TRIANGLE, 9701 +WHITE BULLET, 9702 +SQUARE WITH LEFT HALF BLACK, 9703 +SQUARE WITH RIGHT HALF BLACK, 9704 +SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK, 9705 +SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK, 9706 +WHITE SQUARE WITH VERTICAL BISECTING LINE, 9707 +WHITE UP POINTING TRIANGLE WITH DOT, 9708 +UP POINTING TRIANGLE WITH LEFT HALF BLACK, 9709 +UP POINTING TRIANGLE WITH RIGHT HALF BLACK, 9710 +LARGE CIRCLE, 9711 +WHITE SQUARE WITH UPPER LEFT QUADRANT, 9712 +WHITE SQUARE WITH LOWER LEFT QUADRANT, 9713 +WHITE SQUARE WITH LOWER RIGHT QUADRANT, 9714 +WHITE SQUARE WITH UPPER RIGHT QUADRANT, 9715 +WHITE CIRCLE WITH UPPER LEFT QUADRANT, 9716 +WHITE CIRCLE WITH LOWER LEFT QUADRANT, 9717 +WHITE CIRCLE WITH LOWER RIGHT QUADRANT, 9718 +WHITE CIRCLE WITH UPPER RIGHT QUADRANT, 9719 +UPPER LEFT TRIANGLE, 9720 +UPPER RIGHT TRIANGLE, 9721 +LOWER LEFT TRIANGLE, 9722 +WHITE MEDIUM SQUARE, 9723 +BLACK MEDIUM SQUARE, 9724 +WHITE MEDIUM SMALL SQUARE, 9725 +BLACK MEDIUM SMALL SQUARE, 9726 +LOWER RIGHT TRIANGLE, 9727 +BLACK SUN WITH RAYS, 9728 +CLOUD, 9729 +UMBRELLA, 9730 +SNOWMAN, 9731 +COMET, 9732 +BLACK STAR, 9733 +WHITE STAR, 9734 +LIGHTNING, 9735 +THUNDERSTORM, 9736 +SUN, 9737 +ASCENDING NODE, 9738 +DESCENDING NODE, 9739 +CONJUNCTION, 9740 +OPPOSITION, 9741 +BLACK TELEPHONE, 9742 +WHITE TELEPHONE, 9743 +BALLOT BOX, 9744 +BALLOT BOX WITH CHECK, 9745 +BALLOT BOX WITH X, 9746 +SALTIRE, 9747 +UMBRELLA WITH RAIN DROPS, 9748 +HOT BEVERAGE, 9749 +WHITE SHOGI PIECE, 9750 +BLACK SHOGI PIECE, 9751 +SHAMROCK, 9752 +REVERSED ROTATED FLORAL HEART BULLET, 9753 +BLACK LEFT POINTING INDEX, 9754 +BLACK RIGHT POINTING INDEX, 9755 +WHITE LEFT POINTING INDEX, 9756 +WHITE UP POINTING INDEX, 9757 +WHITE RIGHT POINTING INDEX, 9758 +WHITE DOWN POINTING INDEX, 9759 +SKULL AND CROSSBONES, 9760 +CAUTION SIGN, 9761 +RADIOACTIVE SIGN, 9762 +BIOHAZARD SIGN, 9763 +CADUCEUS, 9764 +ANKH, 9765 +ORTHODOX CROSS, 9766 +CHI RHO, 9767 +CROSS OF LORRAINE, 9768 +CROSS OF JERUSALEM, 9769 +STAR AND CRESCENT, 9770 +FARSI SYMBOL, 9771 +ADI SHAKTI, 9772 +HAMMER AND SICKLE, 9773 +PEACE SYMBOL, 9774 +YIN YANG, 9775 +TRIGRAM FOR HEAVEN, 9776 +TRIGRAM FOR LAKE, 9777 +TRIGRAM FOR FIRE, 9778 +TRIGRAM FOR THUNDER, 9779 +TRIGRAM FOR WIND, 9780 +TRIGRAM FOR WATER, 9781 +TRIGRAM FOR MOUNTAIN, 9782 +TRIGRAM FOR EARTH, 9783 +WHEEL OF DHARMA, 9784 +WHITE FROWNING FACE, 9785 +WHITE SMILING FACE, 9786 +BLACK SMILING FACE, 9787 +WHITE SUN WITH RAYS, 9788 +FIRST QUARTER MOON, 9789 +LAST QUARTER MOON, 9790 +MERCURY, 9791 +FEMALE SIGN, 9792 +EARTH, 9793 +MALE SIGN, 9794 +JUPITER, 9795 +SATURN, 9796 +URANUS, 9797 +NEPTUNE, 9798 +PLUTO, 9799 +ARIES, 9800 +TAURUS, 9801 +GEMINI, 9802 +CANCER, 9803 +LEO, 9804 +VIRGO, 9805 +LIBRA, 9806 +SCORPIUS, 9807 +SAGITTARIUS, 9808 +CAPRICORN, 9809 +AQUARIUS, 9810 +PISCES, 9811 +WHITE CHESS KING, 9812 +WHITE CHESS QUEEN, 9813 +WHITE CHESS ROOK, 9814 +WHITE CHESS BISHOP, 9815 +WHITE CHESS KNIGHT, 9816 +WHITE CHESS PAWN, 9817 +BLACK CHESS KING, 9818 +BLACK CHESS QUEEN, 9819 +BLACK CHESS ROOK, 9820 +BLACK CHESS BISHOP, 9821 +BLACK CHESS KNIGHT, 9822 +BLACK CHESS PAWN, 9823 +BLACK SPADE SUIT, 9824 +WHITE HEART SUIT, 9825 +WHITE DIAMOND SUIT, 9826 +BLACK CLUB SUIT, 9827 +WHITE SPADE SUIT, 9828 +BLACK HEART SUIT, 9829 +BLACK DIAMOND SUIT, 9830 +WHITE CLUB SUIT, 9831 +HOT SPRINGS, 9832 +QUARTER NOTE, 9833 +EIGHTH NOTE, 9834 +BEAMED EIGHTH NOTES, 9835 +BEAMED SIXTEENTH NOTES, 9836 +MUSIC FLAT SIGN, 9837 +MUSIC NATURAL SIGN, 9838 +MUSIC SHARP SIGN, 9839 +WEST SYRIAC CROSS, 9840 +EAST SYRIAC CROSS, 9841 +UNIVERSAL RECYCLING SYMBOL, 9842 +RECYCLING SYMBOL FOR TYPE 1 PLASTICS, 9843 +RECYCLING SYMBOL FOR TYPE 2 PLASTICS, 9844 +RECYCLING SYMBOL FOR TYPE 3 PLASTICS, 9845 +RECYCLING SYMBOL FOR TYPE 4 PLASTICS, 9846 +RECYCLING SYMBOL FOR TYPE 5 PLASTICS, 9847 +RECYCLING SYMBOL FOR TYPE 6 PLASTICS, 9848 +RECYCLING SYMBOL FOR TYPE 7 PLASTICS, 9849 +RECYCLING SYMBOL FOR GENERIC MATERIALS, 9850 +BLACK UNIVERSAL RECYCLING SYMBOL, 9851 +RECYCLED PAPER SYMBOL, 9852 +PARTIALLY RECYCLED PAPER SYMBOL, 9853 +PERMANENT PAPER SIGN, 9854 +WHEELCHAIR SYMBOL, 9855 +DIE FACE 1, 9856 +DIE FACE 2, 9857 +DIE FACE 3, 9858 +DIE FACE 4, 9859 +DIE FACE 5, 9860 +DIE FACE 6, 9861 +WHITE CIRCLE WITH DOT RIGHT, 9862 +WHITE CIRCLE WITH TWO DOTS, 9863 +BLACK CIRCLE WITH WHITE DOT RIGHT, 9864 +BLACK CIRCLE WITH TWO WHITE DOTS, 9865 +MONOGRAM FOR YANG, 9866 +MONOGRAM FOR YIN, 9867 +DIGRAM FOR GREATER YANG, 9868 +DIGRAM FOR LESSER YIN, 9869 +DIGRAM FOR LESSER YANG, 9870 +DIGRAM FOR GREATER YIN, 9871 +WHITE FLAG, 9872 +BLACK FLAG, 9873 +HAMMER AND PICK, 9874 +ANCHOR, 9875 +CROSSED SWORDS, 9876 +STAFF OF AESCULAPIUS, 9877 +SCALES, 9878 +ALEMBIC, 9879 +FLOWER, 9880 +GEAR, 9881 +STAFF OF HERMES, 9882 +ATOM SYMBOL, 9883 +FLEUR DE LIS, 9884 +OUTLINED WHITE STAR, 9885 +THREE LINES CONVERGING RIGHT, 9886 +THREE LINES CONVERGING LEFT, 9887 +WARNING SIGN, 9888 +HIGH VOLTAGE SIGN, 9889 +DOUBLED FEMALE SIGN, 9890 +DOUBLED MALE SIGN, 9891 +INTERLOCKED FEMALE AND MALE SIGN, 9892 +MALE AND FEMALE SIGN, 9893 +MALE WITH STROKE SIGN, 9894 +MALE WITH STROKE AND MALE AND FEMALE SIGN, 9895 +VERTICAL MALE WITH STROKE SIGN, 9896 +HORIZONTAL MALE WITH STROKE SIGN, 9897 +MEDIUM WHITE CIRCLE, 9898 +MEDIUM BLACK CIRCLE, 9899 +MEDIUM SMALL WHITE CIRCLE, 9900 +MARRIAGE SYMBOL, 9901 +DIVORCE SYMBOL, 9902 +UNMARRIED PARTNERSHIP SYMBOL, 9903 +COFFIN, 9904 +FUNERAL URN, 9905 +NEUTER, 9906 +CERES, 9907 +PALLAS, 9908 +JUNO, 9909 +VESTA, 9910 +CHIRON, 9911 +BLACK MOON LILITH, 9912 +SEXTILE, 9913 +SEMISEXTILE, 9914 +QUINCUNX, 9915 +SESQUIQUADRATE, 9916 +SOCCER BALL, 9917 +BASEBALL, 9918 +SQUARED KEY, 9919 +WHITE DRAUGHTS MAN, 9920 +WHITE DRAUGHTS KING, 9921 +BLACK DRAUGHTS MAN, 9922 +BLACK DRAUGHTS KING, 9923 +SNOWMAN WITHOUT SNOW, 9924 +SUN BEHIND CLOUD, 9925 +RAIN, 9926 +BLACK SNOWMAN, 9927 +THUNDER CLOUD AND RAIN, 9928 +TURNED WHITE SHOGI PIECE, 9929 +TURNED BLACK SHOGI PIECE, 9930 +WHITE DIAMOND IN SQUARE, 9931 +CROSSING LANES, 9932 +DISABLED CAR, 9933 +OPHIUCHUS, 9934 +PICK, 9935 +CAR SLIDING, 9936 +HELMET WITH WHITE CROSS, 9937 +CIRCLED CROSSING LANES, 9938 +CHAINS, 9939 +NO ENTRY, 9940 +ALTERNATE ONE WAY LEFT WAY TRAFFIC, 9941 +BLACK TWO WAY LEFT WAY TRAFFIC, 9942 +WHITE TWO WAY LEFT WAY TRAFFIC, 9943 +BLACK LEFT LANE MERGE, 9944 +WHITE LEFT LANE MERGE, 9945 +DRIVE SLOW SIGN, 9946 +HEAVY WHITE DOWN POINTING TRIANGLE, 9947 +LEFT CLOSED ENTRY, 9948 +SQUARED SALTIRE, 9949 +FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE, 9950 +BLACK TRUCK, 9951 +RESTRICTED LEFT ENTRY 1, 9952 +RESTRICTED LEFT ENTRY 2, 9953 +ASTRONOMICAL SYMBOL FOR URANUS, 9954 +HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE, 9955 +PENTAGRAM, 9956 +RIGHT HANDED INTERLACED PENTAGRAM, 9957 +LEFT HANDED INTERLACED PENTAGRAM, 9958 +INVERTED PENTAGRAM, 9959 +BLACK CROSS ON SHIELD, 9960 +SHINTO SHRINE, 9961 +CHURCH, 9962 +CASTLE, 9963 +HISTORIC SITE, 9964 +GEAR WITHOUT HUB, 9965 +GEAR WITH HANDLES, 9966 +MAP SYMBOL FOR LIGHTHOUSE, 9967 +MOUNTAIN, 9968 +UMBRELLA ON GROUND, 9969 +FOUNTAIN, 9970 +FLAG IN HOLE, 9971 +FERRY, 9972 +SAILBOAT, 9973 +SQUARE FOUR CORNERS, 9974 +SKIER, 9975 +ICE SKATE, 9976 +PERSON WITH BALL, 9977 +TENT, 9978 +JAPANESE BANK SYMBOL, 9979 +HEADSTONE GRAVEYARD SYMBOL, 9980 +FUEL PUMP, 9981 +CUP ON BLACK SQUARE, 9982 +WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE, 9983 +BLACK SAFETY SCISSORS, 9984 +UPPER BLADE SCISSORS, 9985 +BLACK SCISSORS, 9986 +LOWER BLADE SCISSORS, 9987 +WHITE SCISSORS, 9988 +WHITE HEAVY CHECK MARK, 9989 +TELEPHONE LOCATION SIGN, 9990 +TAPE DRIVE, 9991 +AIRPLANE, 9992 +ENVELOPE, 9993 +RAISED FIST, 9994 +RAISED HAND, 9995 +VICTORY HAND, 9996 +WRITING HAND, 9997 +LOWER RIGHT PENCIL, 9998 +PENCIL, 9999 +UPPER RIGHT PENCIL, 10000 +WHITE NIB, 10001 +BLACK NIB, 10002 +CHECK MARK, 10003 +HEAVY CHECK MARK, 10004 +MULTIPLICATION X, 10005 +HEAVY MULTIPLICATION X, 10006 +BALLOT X, 10007 +HEAVY BALLOT X, 10008 +OUTLINED GREEK CROSS, 10009 +HEAVY GREEK CROSS, 10010 +OPEN CENTRE CROSS, 10011 +HEAVY OPEN CENTRE CROSS, 10012 +LATIN CROSS, 10013 +SHADOWED WHITE LATIN CROSS, 10014 +OUTLINED LATIN CROSS, 10015 +MALTESE CROSS, 10016 +STAR OF DAVID, 10017 +FOUR TEARDROP SPOKED ASTERISK, 10018 +FOUR BALLOON SPOKED ASTERISK, 10019 +HEAVY FOUR BALLOON SPOKED ASTERISK, 10020 +FOUR CLUB SPOKED ASTERISK, 10021 +BLACK FOUR POINTED STAR, 10022 +WHITE FOUR POINTED STAR, 10023 +SPARKLES, 10024 +STRESS OUTLINED WHITE STAR, 10025 +CIRCLED WHITE STAR, 10026 +OPEN CENTRE BLACK STAR, 10027 +BLACK CENTRE WHITE STAR, 10028 +OUTLINED BLACK STAR, 10029 +HEAVY OUTLINED BLACK STAR, 10030 +PINWHEEL STAR, 10031 +SHADOWED WHITE STAR, 10032 +HEAVY ASTERISK, 10033 +OPEN CENTRE ASTERISK, 10034 +EIGHT SPOKED ASTERISK, 10035 +EIGHT POINTED BLACK STAR, 10036 +EIGHT POINTED PINWHEEL STAR, 10037 +SIX POINTED BLACK STAR, 10038 +EIGHT POINTED RECTILINEAR BLACK STAR, 10039 +HEAVY EIGHT POINTED RECTILINEAR BLACK STAR, 10040 +TWELVE POINTED BLACK STAR, 10041 +SIXTEEN POINTED ASTERISK, 10042 +TEARDROP SPOKED ASTERISK, 10043 +OPEN CENTRE TEARDROP SPOKED ASTERISK, 10044 +HEAVY TEARDROP SPOKED ASTERISK, 10045 +SIX PETALLED BLACK AND WHITE FLORETTE, 10046 +BLACK FLORETTE, 10047 +WHITE FLORETTE, 10048 +EIGHT PETALLED OUTLINED BLACK FLORETTE, 10049 +CIRCLED OPEN CENTRE EIGHT POINTED STAR, 10050 +HEAVY TEARDROP SPOKED PINWHEEL ASTERISK, 10051 +SNOWFLAKE, 10052 +TIGHT TRIFOLIATE SNOWFLAKE, 10053 +HEAVY CHEVRON SNOWFLAKE, 10054 +SPARKLE, 10055 +HEAVY SPARKLE, 10056 +BALLOON SPOKED ASTERISK, 10057 +EIGHT TEARDROP SPOKED PROPELLER ASTERISK, 10058 +HEAVY EIGHT TEARDROP SPOKED PROPELLER ASTERISK, 10059 +CROSS MARK, 10060 +SHADOWED WHITE CIRCLE, 10061 +NEGATIVE SQUARED CROSS MARK, 10062 +LOWER RIGHT DROP SHADOWED WHITE SQUARE, 10063 +UPPER RIGHT DROP SHADOWED WHITE SQUARE, 10064 +LOWER RIGHT SHADOWED WHITE SQUARE, 10065 +UPPER RIGHT SHADOWED WHITE SQUARE, 10066 +BLACK QUESTION MARK ORNAMENT, 10067 +WHITE QUESTION MARK ORNAMENT, 10068 +WHITE EXCLAMATION MARK ORNAMENT, 10069 +BLACK DIAMOND MINUS WHITE X, 10070 +HEAVY EXCLAMATION MARK SYMBOL, 10071 +LIGHT VERTICAL BAR, 10072 +MEDIUM VERTICAL BAR, 10073 +HEAVY VERTICAL BAR, 10074 +HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT, 10075 +HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT, 10076 +HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT, 10077 +HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT, 10078 +HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT, 10079 +HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT, 10080 +CURVED STEM PARAGRAPH SIGN ORNAMENT, 10081 +HEAVY EXCLAMATION MARK ORNAMENT, 10082 +HEAVY HEART EXCLAMATION MARK ORNAMENT, 10083 +HEAVY BLACK HEART, 10084 +ROTATED HEAVY BLACK HEART BULLET, 10085 +FLORAL HEART, 10086 +ROTATED FLORAL HEART BULLET, 10087 +MEDIUM LEFT PARENTHESIS ORNAMENT, 10088 +MEDIUM RIGHT PARENTHESIS ORNAMENT, 10089 +MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT, 10090 +MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT, 10091 +MEDIUM LEFT POINTING ANGLE BRACKET ORNAMENT, 10092 +MEDIUM RIGHT POINTING ANGLE BRACKET ORNAMENT, 10093 +HEAVY LEFT POINTING ANGLE QUOTATION MARK ORNAMENT, 10094 +HEAVY RIGHT POINTING ANGLE QUOTATION MARK ORNAMENT, 10095 +HEAVY LEFT POINTING ANGLE BRACKET ORNAMENT, 10096 +HEAVY RIGHT POINTING ANGLE BRACKET ORNAMENT, 10097 +LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT, 10098 +LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT, 10099 +MEDIUM LEFT CURLY BRACKET ORNAMENT, 10100 +MEDIUM RIGHT CURLY BRACKET ORNAMENT, 10101 +DINGBAT NEGATIVE CIRCLED DIGIT ONE, 10102 +DINGBAT NEGATIVE CIRCLED DIGIT TWO, 10103 +DINGBAT NEGATIVE CIRCLED DIGIT THREE, 10104 +DINGBAT NEGATIVE CIRCLED DIGIT FOUR, 10105 +DINGBAT NEGATIVE CIRCLED DIGIT FIVE, 10106 +DINGBAT NEGATIVE CIRCLED DIGIT SIX, 10107 +DINGBAT NEGATIVE CIRCLED DIGIT SEVEN, 10108 +DINGBAT NEGATIVE CIRCLED DIGIT EIGHT, 10109 +DINGBAT NEGATIVE CIRCLED DIGIT NINE, 10110 +DINGBAT NEGATIVE CIRCLED NUMBER TEN, 10111 +DINGBAT CIRCLED SANS SERIF DIGIT ONE, 10112 +DINGBAT CIRCLED SANS SERIF DIGIT TWO, 10113 +DINGBAT CIRCLED SANS SERIF DIGIT THREE, 10114 +DINGBAT CIRCLED SANS SERIF DIGIT FOUR, 10115 +DINGBAT CIRCLED SANS SERIF DIGIT FIVE, 10116 +DINGBAT CIRCLED SANS SERIF DIGIT SIX, 10117 +DINGBAT CIRCLED SANS SERIF DIGIT SEVEN, 10118 +DINGBAT CIRCLED SANS SERIF DIGIT EIGHT, 10119 +DINGBAT CIRCLED SANS SERIF DIGIT NINE, 10120 +DINGBAT CIRCLED SANS SERIF NUMBER TEN, 10121 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT ONE, 10122 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT TWO, 10123 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT THREE, 10124 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT FOUR, 10125 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT FIVE, 10126 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT SIX, 10127 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT SEVEN, 10128 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT EIGHT, 10129 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT NINE, 10130 +DINGBAT NEGATIVE CIRCLED SANS SERIF NUMBER TEN, 10131 +HEAVY WIDE HEADED RIGHTWARDS ARROW, 10132 +HEAVY PLUS SIGN, 10133 +HEAVY MINUS SIGN, 10134 +HEAVY DIVISION SIGN, 10135 +HEAVY SOUTH EAST ARROW, 10136 +HEAVY RIGHTWARDS ARROW, 10137 +HEAVY NORTH EAST ARROW, 10138 +DRAFTING POINT RIGHTWARDS ARROW, 10139 +HEAVY ROUND TIPPED RIGHTWARDS ARROW, 10140 +TRIANGLE HEADED RIGHTWARDS ARROW, 10141 +HEAVY TRIANGLE HEADED RIGHTWARDS ARROW, 10142 +DASHED TRIANGLE HEADED RIGHTWARDS ARROW, 10143 +HEAVY DASHED TRIANGLE HEADED RIGHTWARDS ARROW, 10144 +BLACK RIGHTWARDS ARROW, 10145 +THREE D TOP LIGHTED RIGHTWARDS ARROWHEAD, 10146 +THREE D BOTTOM LIGHTED RIGHTWARDS ARROWHEAD, 10147 +BLACK RIGHTWARDS ARROWHEAD, 10148 +HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW, 10149 +HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW, 10150 +SQUAT BLACK RIGHTWARDS ARROW, 10151 +HEAVY CONCAVE POINTED BLACK RIGHTWARDS ARROW, 10152 +RIGHT SHADED WHITE RIGHTWARDS ARROW, 10153 +LEFT SHADED WHITE RIGHTWARDS ARROW, 10154 +BACK TILTED SHADOWED WHITE RIGHTWARDS ARROW, 10155 +FRONT TILTED SHADOWED WHITE RIGHTWARDS ARROW, 10156 +HEAVY LOWER RIGHT SHADOWED WHITE RIGHTWARDS ARROW, 10157 +HEAVY UPPER RIGHT SHADOWED WHITE RIGHTWARDS ARROW, 10158 +NOTCHED LOWER RIGHT SHADOWED WHITE RIGHTWARDS ARROW, 10159 +CURLY LOOP, 10160 +NOTCHED UPPER RIGHT SHADOWED WHITE RIGHTWARDS ARROW, 10161 +CIRCLED HEAVY WHITE RIGHTWARDS ARROW, 10162 +WHITE FEATHERED RIGHTWARDS ARROW, 10163 +BLACK FEATHERED SOUTH EAST ARROW, 10164 +BLACK FEATHERED RIGHTWARDS ARROW, 10165 +BLACK FEATHERED NORTH EAST ARROW, 10166 +HEAVY BLACK FEATHERED SOUTH EAST ARROW, 10167 +HEAVY BLACK FEATHERED RIGHTWARDS ARROW, 10168 +HEAVY BLACK FEATHERED NORTH EAST ARROW, 10169 +TEARDROP BARBED RIGHTWARDS ARROW, 10170 +HEAVY TEARDROP SHANKED RIGHTWARDS ARROW, 10171 +WEDGE TAILED RIGHTWARDS ARROW, 10172 +HEAVY WEDGE TAILED RIGHTWARDS ARROW, 10173 +OPEN OUTLINED RIGHTWARDS ARROW, 10174 +DOUBLE CURLY LOOP, 10175 +THREE DIMENSIONAL ANGLE, 10176 +WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE, 10177 +PERPENDICULAR, 10178 +OPEN SUBSET, 10179 +OPEN SUPERSET, 10180 +LEFT S SHAPED BAG DELIMITER, 10181 +RIGHT S SHAPED BAG DELIMITER, 10182 +OR WITH DOT INSIDE, 10183 +REVERSE SOLIDUS PRECEDING SUBSET, 10184 +SUPERSET PRECEDING SOLIDUS, 10185 +VERTICAL BAR WITH HORIZONTAL STROKE, 10186 +MATHEMATICAL RISING DIAGONAL, 10187 +LONG DIVISION, 10188 +MATHEMATICAL FALLING DIAGONAL, 10189 +SQUARED LOGICAL AND, 10190 +SQUARED LOGICAL OR, 10191 +WHITE DIAMOND WITH CENTRED DOT, 10192 +AND WITH DOT, 10193 +ELEMENT OF OPENING UPWARDS, 10194 +LOWER RIGHT CORNER WITH DOT, 10195 +UPPER LEFT CORNER WITH DOT, 10196 +LEFT OUTER JOIN, 10197 +RIGHT OUTER JOIN, 10198 +FULL OUTER JOIN, 10199 +LARGE UP TACK, 10200 +LARGE DOWN TACK, 10201 +LEFT AND RIGHT DOUBLE TURNSTILE, 10202 +LEFT AND RIGHT TACK, 10203 +LEFT MULTIMAP, 10204 +LONG RIGHT TACK, 10205 +LONG LEFT TACK, 10206 +UP TACK WITH CIRCLE ABOVE, 10207 +LOZENGE DIVIDED BY HORIZONTAL RULE, 10208 +WHITE CONCAVE SIDED DIAMOND, 10209 +WHITE CONCAVE SIDED DIAMOND WITH LEFTWARDS TICK, 10210 +WHITE CONCAVE SIDED DIAMOND WITH RIGHTWARDS TICK, 10211 +WHITE SQUARE WITH LEFTWARDS TICK, 10212 +WHITE SQUARE WITH RIGHTWARDS TICK, 10213 +MATHEMATICAL LEFT WHITE SQUARE BRACKET, 10214 +MATHEMATICAL RIGHT WHITE SQUARE BRACKET, 10215 +MATHEMATICAL LEFT ANGLE BRACKET, 10216 +MATHEMATICAL RIGHT ANGLE BRACKET, 10217 +MATHEMATICAL LEFT DOUBLE ANGLE BRACKET, 10218 +MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET, 10219 +MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET, 10220 +MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET, 10221 +MATHEMATICAL LEFT FLATTENED PARENTHESIS, 10222 +MATHEMATICAL RIGHT FLATTENED PARENTHESIS, 10223 +UPWARDS QUADRUPLE ARROW, 10224 +DOWNWARDS QUADRUPLE ARROW, 10225 +ANTICLOCKWISE GAPPED CIRCLE ARROW, 10226 +CLOCKWISE GAPPED CIRCLE ARROW, 10227 +RIGHT ARROW WITH CIRCLED PLUS, 10228 +LONG LEFTWARDS ARROW, 10229 +LONG RIGHTWARDS ARROW, 10230 +LONG LEFT RIGHT ARROW, 10231 +LONG LEFTWARDS DOUBLE ARROW, 10232 +LONG RIGHTWARDS DOUBLE ARROW, 10233 +LONG LEFT RIGHT DOUBLE ARROW, 10234 +LONG LEFTWARDS ARROW FROM BAR, 10235 +LONG RIGHTWARDS ARROW FROM BAR, 10236 +LONG LEFTWARDS DOUBLE ARROW FROM BAR, 10237 +LONG RIGHTWARDS DOUBLE ARROW FROM BAR, 10238 +LONG RIGHTWARDS SQUIGGLE ARROW, 10239 +BRAILLE PATTERN BLANK, 10240 +BRAILLE PATTERN DOTS 1, 10241 +BRAILLE PATTERN DOTS 2, 10242 +BRAILLE PATTERN DOTS 12, 10243 +BRAILLE PATTERN DOTS 3, 10244 +BRAILLE PATTERN DOTS 13, 10245 +BRAILLE PATTERN DOTS 23, 10246 +BRAILLE PATTERN DOTS 123, 10247 +BRAILLE PATTERN DOTS 4, 10248 +BRAILLE PATTERN DOTS 14, 10249 +BRAILLE PATTERN DOTS 24, 10250 +BRAILLE PATTERN DOTS 124, 10251 +BRAILLE PATTERN DOTS 34, 10252 +BRAILLE PATTERN DOTS 134, 10253 +BRAILLE PATTERN DOTS 234, 10254 +BRAILLE PATTERN DOTS 1234, 10255 +BRAILLE PATTERN DOTS 5, 10256 +BRAILLE PATTERN DOTS 15, 10257 +BRAILLE PATTERN DOTS 25, 10258 +BRAILLE PATTERN DOTS 125, 10259 +BRAILLE PATTERN DOTS 35, 10260 +BRAILLE PATTERN DOTS 135, 10261 +BRAILLE PATTERN DOTS 235, 10262 +BRAILLE PATTERN DOTS 1235, 10263 +BRAILLE PATTERN DOTS 45, 10264 +BRAILLE PATTERN DOTS 145, 10265 +BRAILLE PATTERN DOTS 245, 10266 +BRAILLE PATTERN DOTS 1245, 10267 +BRAILLE PATTERN DOTS 345, 10268 +BRAILLE PATTERN DOTS 1345, 10269 +BRAILLE PATTERN DOTS 2345, 10270 +BRAILLE PATTERN DOTS 12345, 10271 +BRAILLE PATTERN DOTS 6, 10272 +BRAILLE PATTERN DOTS 16, 10273 +BRAILLE PATTERN DOTS 26, 10274 +BRAILLE PATTERN DOTS 126, 10275 +BRAILLE PATTERN DOTS 36, 10276 +BRAILLE PATTERN DOTS 136, 10277 +BRAILLE PATTERN DOTS 236, 10278 +BRAILLE PATTERN DOTS 1236, 10279 +BRAILLE PATTERN DOTS 46, 10280 +BRAILLE PATTERN DOTS 146, 10281 +BRAILLE PATTERN DOTS 246, 10282 +BRAILLE PATTERN DOTS 1246, 10283 +BRAILLE PATTERN DOTS 346, 10284 +BRAILLE PATTERN DOTS 1346, 10285 +BRAILLE PATTERN DOTS 2346, 10286 +BRAILLE PATTERN DOTS 12346, 10287 +BRAILLE PATTERN DOTS 56, 10288 +BRAILLE PATTERN DOTS 156, 10289 +BRAILLE PATTERN DOTS 256, 10290 +BRAILLE PATTERN DOTS 1256, 10291 +BRAILLE PATTERN DOTS 356, 10292 +BRAILLE PATTERN DOTS 1356, 10293 +BRAILLE PATTERN DOTS 2356, 10294 +BRAILLE PATTERN DOTS 12356, 10295 +BRAILLE PATTERN DOTS 456, 10296 +BRAILLE PATTERN DOTS 1456, 10297 +BRAILLE PATTERN DOTS 2456, 10298 +BRAILLE PATTERN DOTS 12456, 10299 +BRAILLE PATTERN DOTS 3456, 10300 +BRAILLE PATTERN DOTS 13456, 10301 +BRAILLE PATTERN DOTS 23456, 10302 +BRAILLE PATTERN DOTS 123456, 10303 +BRAILLE PATTERN DOTS 7, 10304 +BRAILLE PATTERN DOTS 17, 10305 +BRAILLE PATTERN DOTS 27, 10306 +BRAILLE PATTERN DOTS 127, 10307 +BRAILLE PATTERN DOTS 37, 10308 +BRAILLE PATTERN DOTS 137, 10309 +BRAILLE PATTERN DOTS 237, 10310 +BRAILLE PATTERN DOTS 1237, 10311 +BRAILLE PATTERN DOTS 47, 10312 +BRAILLE PATTERN DOTS 147, 10313 +BRAILLE PATTERN DOTS 247, 10314 +BRAILLE PATTERN DOTS 1247, 10315 +BRAILLE PATTERN DOTS 347, 10316 +BRAILLE PATTERN DOTS 1347, 10317 +BRAILLE PATTERN DOTS 2347, 10318 +BRAILLE PATTERN DOTS 12347, 10319 +BRAILLE PATTERN DOTS 57, 10320 +BRAILLE PATTERN DOTS 157, 10321 +BRAILLE PATTERN DOTS 257, 10322 +BRAILLE PATTERN DOTS 1257, 10323 +BRAILLE PATTERN DOTS 357, 10324 +BRAILLE PATTERN DOTS 1357, 10325 +BRAILLE PATTERN DOTS 2357, 10326 +BRAILLE PATTERN DOTS 12357, 10327 +BRAILLE PATTERN DOTS 457, 10328 +BRAILLE PATTERN DOTS 1457, 10329 +BRAILLE PATTERN DOTS 2457, 10330 +BRAILLE PATTERN DOTS 12457, 10331 +BRAILLE PATTERN DOTS 3457, 10332 +BRAILLE PATTERN DOTS 13457, 10333 +BRAILLE PATTERN DOTS 23457, 10334 +BRAILLE PATTERN DOTS 123457, 10335 +BRAILLE PATTERN DOTS 67, 10336 +BRAILLE PATTERN DOTS 167, 10337 +BRAILLE PATTERN DOTS 267, 10338 +BRAILLE PATTERN DOTS 1267, 10339 +BRAILLE PATTERN DOTS 367, 10340 +BRAILLE PATTERN DOTS 1367, 10341 +BRAILLE PATTERN DOTS 2367, 10342 +BRAILLE PATTERN DOTS 12367, 10343 +BRAILLE PATTERN DOTS 467, 10344 +BRAILLE PATTERN DOTS 1467, 10345 +BRAILLE PATTERN DOTS 2467, 10346 +BRAILLE PATTERN DOTS 12467, 10347 +BRAILLE PATTERN DOTS 3467, 10348 +BRAILLE PATTERN DOTS 13467, 10349 +BRAILLE PATTERN DOTS 23467, 10350 +BRAILLE PATTERN DOTS 123467, 10351 +BRAILLE PATTERN DOTS 567, 10352 +BRAILLE PATTERN DOTS 1567, 10353 +BRAILLE PATTERN DOTS 2567, 10354 +BRAILLE PATTERN DOTS 12567, 10355 +BRAILLE PATTERN DOTS 3567, 10356 +BRAILLE PATTERN DOTS 13567, 10357 +BRAILLE PATTERN DOTS 23567, 10358 +BRAILLE PATTERN DOTS 123567, 10359 +BRAILLE PATTERN DOTS 4567, 10360 +BRAILLE PATTERN DOTS 14567, 10361 +BRAILLE PATTERN DOTS 24567, 10362 +BRAILLE PATTERN DOTS 124567, 10363 +BRAILLE PATTERN DOTS 34567, 10364 +BRAILLE PATTERN DOTS 134567, 10365 +BRAILLE PATTERN DOTS 234567, 10366 +BRAILLE PATTERN DOTS 1234567, 10367 +BRAILLE PATTERN DOTS 8, 10368 +BRAILLE PATTERN DOTS 18, 10369 +BRAILLE PATTERN DOTS 28, 10370 +BRAILLE PATTERN DOTS 128, 10371 +BRAILLE PATTERN DOTS 38, 10372 +BRAILLE PATTERN DOTS 138, 10373 +BRAILLE PATTERN DOTS 238, 10374 +BRAILLE PATTERN DOTS 1238, 10375 +BRAILLE PATTERN DOTS 48, 10376 +BRAILLE PATTERN DOTS 148, 10377 +BRAILLE PATTERN DOTS 248, 10378 +BRAILLE PATTERN DOTS 1248, 10379 +BRAILLE PATTERN DOTS 348, 10380 +BRAILLE PATTERN DOTS 1348, 10381 +BRAILLE PATTERN DOTS 2348, 10382 +BRAILLE PATTERN DOTS 12348, 10383 +BRAILLE PATTERN DOTS 58, 10384 +BRAILLE PATTERN DOTS 158, 10385 +BRAILLE PATTERN DOTS 258, 10386 +BRAILLE PATTERN DOTS 1258, 10387 +BRAILLE PATTERN DOTS 358, 10388 +BRAILLE PATTERN DOTS 1358, 10389 +BRAILLE PATTERN DOTS 2358, 10390 +BRAILLE PATTERN DOTS 12358, 10391 +BRAILLE PATTERN DOTS 458, 10392 +BRAILLE PATTERN DOTS 1458, 10393 +BRAILLE PATTERN DOTS 2458, 10394 +BRAILLE PATTERN DOTS 12458, 10395 +BRAILLE PATTERN DOTS 3458, 10396 +BRAILLE PATTERN DOTS 13458, 10397 +BRAILLE PATTERN DOTS 23458, 10398 +BRAILLE PATTERN DOTS 123458, 10399 +BRAILLE PATTERN DOTS 68, 10400 +BRAILLE PATTERN DOTS 168, 10401 +BRAILLE PATTERN DOTS 268, 10402 +BRAILLE PATTERN DOTS 1268, 10403 +BRAILLE PATTERN DOTS 368, 10404 +BRAILLE PATTERN DOTS 1368, 10405 +BRAILLE PATTERN DOTS 2368, 10406 +BRAILLE PATTERN DOTS 12368, 10407 +BRAILLE PATTERN DOTS 468, 10408 +BRAILLE PATTERN DOTS 1468, 10409 +BRAILLE PATTERN DOTS 2468, 10410 +BRAILLE PATTERN DOTS 12468, 10411 +BRAILLE PATTERN DOTS 3468, 10412 +BRAILLE PATTERN DOTS 13468, 10413 +BRAILLE PATTERN DOTS 23468, 10414 +BRAILLE PATTERN DOTS 123468, 10415 +BRAILLE PATTERN DOTS 568, 10416 +BRAILLE PATTERN DOTS 1568, 10417 +BRAILLE PATTERN DOTS 2568, 10418 +BRAILLE PATTERN DOTS 12568, 10419 +BRAILLE PATTERN DOTS 3568, 10420 +BRAILLE PATTERN DOTS 13568, 10421 +BRAILLE PATTERN DOTS 23568, 10422 +BRAILLE PATTERN DOTS 123568, 10423 +BRAILLE PATTERN DOTS 4568, 10424 +BRAILLE PATTERN DOTS 14568, 10425 +BRAILLE PATTERN DOTS 24568, 10426 +BRAILLE PATTERN DOTS 124568, 10427 +BRAILLE PATTERN DOTS 34568, 10428 +BRAILLE PATTERN DOTS 134568, 10429 +BRAILLE PATTERN DOTS 234568, 10430 +BRAILLE PATTERN DOTS 1234568, 10431 +BRAILLE PATTERN DOTS 78, 10432 +BRAILLE PATTERN DOTS 178, 10433 +BRAILLE PATTERN DOTS 278, 10434 +BRAILLE PATTERN DOTS 1278, 10435 +BRAILLE PATTERN DOTS 378, 10436 +BRAILLE PATTERN DOTS 1378, 10437 +BRAILLE PATTERN DOTS 2378, 10438 +BRAILLE PATTERN DOTS 12378, 10439 +BRAILLE PATTERN DOTS 478, 10440 +BRAILLE PATTERN DOTS 1478, 10441 +BRAILLE PATTERN DOTS 2478, 10442 +BRAILLE PATTERN DOTS 12478, 10443 +BRAILLE PATTERN DOTS 3478, 10444 +BRAILLE PATTERN DOTS 13478, 10445 +BRAILLE PATTERN DOTS 23478, 10446 +BRAILLE PATTERN DOTS 123478, 10447 +BRAILLE PATTERN DOTS 578, 10448 +BRAILLE PATTERN DOTS 1578, 10449 +BRAILLE PATTERN DOTS 2578, 10450 +BRAILLE PATTERN DOTS 12578, 10451 +BRAILLE PATTERN DOTS 3578, 10452 +BRAILLE PATTERN DOTS 13578, 10453 +BRAILLE PATTERN DOTS 23578, 10454 +BRAILLE PATTERN DOTS 123578, 10455 +BRAILLE PATTERN DOTS 4578, 10456 +BRAILLE PATTERN DOTS 14578, 10457 +BRAILLE PATTERN DOTS 24578, 10458 +BRAILLE PATTERN DOTS 124578, 10459 +BRAILLE PATTERN DOTS 34578, 10460 +BRAILLE PATTERN DOTS 134578, 10461 +BRAILLE PATTERN DOTS 234578, 10462 +BRAILLE PATTERN DOTS 1234578, 10463 +BRAILLE PATTERN DOTS 678, 10464 +BRAILLE PATTERN DOTS 1678, 10465 +BRAILLE PATTERN DOTS 2678, 10466 +BRAILLE PATTERN DOTS 12678, 10467 +BRAILLE PATTERN DOTS 3678, 10468 +BRAILLE PATTERN DOTS 13678, 10469 +BRAILLE PATTERN DOTS 23678, 10470 +BRAILLE PATTERN DOTS 123678, 10471 +BRAILLE PATTERN DOTS 4678, 10472 +BRAILLE PATTERN DOTS 14678, 10473 +BRAILLE PATTERN DOTS 24678, 10474 +BRAILLE PATTERN DOTS 124678, 10475 +BRAILLE PATTERN DOTS 34678, 10476 +BRAILLE PATTERN DOTS 134678, 10477 +BRAILLE PATTERN DOTS 234678, 10478 +BRAILLE PATTERN DOTS 1234678, 10479 +BRAILLE PATTERN DOTS 5678, 10480 +BRAILLE PATTERN DOTS 15678, 10481 +BRAILLE PATTERN DOTS 25678, 10482 +BRAILLE PATTERN DOTS 125678, 10483 +BRAILLE PATTERN DOTS 35678, 10484 +BRAILLE PATTERN DOTS 135678, 10485 +BRAILLE PATTERN DOTS 235678, 10486 +BRAILLE PATTERN DOTS 1235678, 10487 +BRAILLE PATTERN DOTS 45678, 10488 +BRAILLE PATTERN DOTS 145678, 10489 +BRAILLE PATTERN DOTS 245678, 10490 +BRAILLE PATTERN DOTS 1245678, 10491 +BRAILLE PATTERN DOTS 345678, 10492 +BRAILLE PATTERN DOTS 1345678, 10493 +BRAILLE PATTERN DOTS 2345678, 10494 +BRAILLE PATTERN DOTS 12345678, 10495 +RIGHTWARDS TWO HEADED ARROW WITH VERTICAL STROKE, 10496 +RIGHTWARDS TWO HEADED ARROW WITH DOUBLE VERTICAL STROKE, 10497 +LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE, 10498 +RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE, 10499 +LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE, 10500 +RIGHTWARDS TWO HEADED ARROW FROM BAR, 10501 +LEFTWARDS DOUBLE ARROW FROM BAR, 10502 +RIGHTWARDS DOUBLE ARROW FROM BAR, 10503 +DOWNWARDS ARROW WITH HORIZONTAL STROKE, 10504 +UPWARDS ARROW WITH HORIZONTAL STROKE, 10505 +UPWARDS TRIPLE ARROW, 10506 +DOWNWARDS TRIPLE ARROW, 10507 +LEFTWARDS DOUBLE DASH ARROW, 10508 +RIGHTWARDS DOUBLE DASH ARROW, 10509 +LEFTWARDS TRIPLE DASH ARROW, 10510 +RIGHTWARDS TRIPLE DASH ARROW, 10511 +RIGHTWARDS TWO HEADED TRIPLE DASH ARROW, 10512 +RIGHTWARDS ARROW WITH DOTTED STEM, 10513 +UPWARDS ARROW TO BAR, 10514 +DOWNWARDS ARROW TO BAR, 10515 +RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE, 10516 +RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE, 10517 +RIGHTWARDS TWO HEADED ARROW WITH TAIL, 10518 +RIGHTWARDS TWO HEADED ARROW WITH TAIL WITH VERTICAL STROKE, 10519 +RIGHTWARDS TWO HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE, 10520 +LEFTWARDS ARROW TAIL, 10521 +RIGHTWARDS ARROW TAIL, 10522 +LEFTWARDS DOUBLE ARROW TAIL, 10523 +RIGHTWARDS DOUBLE ARROW TAIL, 10524 +LEFTWARDS ARROW TO BLACK DIAMOND, 10525 +RIGHTWARDS ARROW TO BLACK DIAMOND, 10526 +LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND, 10527 +RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND, 10528 +NORTH WEST AND SOUTH EAST ARROW, 10529 +NORTH EAST AND SOUTH WEST ARROW, 10530 +NORTH WEST ARROW WITH HOOK, 10531 +NORTH EAST ARROW WITH HOOK, 10532 +SOUTH EAST ARROW WITH HOOK, 10533 +SOUTH WEST ARROW WITH HOOK, 10534 +NORTH WEST ARROW AND NORTH EAST ARROW, 10535 +NORTH EAST ARROW AND SOUTH EAST ARROW, 10536 +SOUTH EAST ARROW AND SOUTH WEST ARROW, 10537 +SOUTH WEST ARROW AND NORTH WEST ARROW, 10538 +RISING DIAGONAL CROSSING FALLING DIAGONAL, 10539 +FALLING DIAGONAL CROSSING RISING DIAGONAL, 10540 +SOUTH EAST ARROW CROSSING NORTH EAST ARROW, 10541 +NORTH EAST ARROW CROSSING SOUTH EAST ARROW, 10542 +FALLING DIAGONAL CROSSING NORTH EAST ARROW, 10543 +RISING DIAGONAL CROSSING SOUTH EAST ARROW, 10544 +NORTH EAST ARROW CROSSING NORTH WEST ARROW, 10545 +NORTH WEST ARROW CROSSING NORTH EAST ARROW, 10546 +WAVE ARROW POINTING DIRECTLY RIGHT, 10547 +ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS, 10548 +ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS, 10549 +ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS, 10550 +ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS, 10551 +RIGHT SIDE ARC CLOCKWISE ARROW, 10552 +LEFT SIDE ARC ANTICLOCKWISE ARROW, 10553 +TOP ARC ANTICLOCKWISE ARROW, 10554 +BOTTOM ARC ANTICLOCKWISE ARROW, 10555 +TOP ARC CLOCKWISE ARROW WITH MINUS, 10556 +TOP ARC ANTICLOCKWISE ARROW WITH PLUS, 10557 +LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW, 10558 +LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW, 10559 +ANTICLOCKWISE CLOSED CIRCLE ARROW, 10560 +CLOCKWISE CLOSED CIRCLE ARROW, 10561 +RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW, 10562 +LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW, 10563 +SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW, 10564 +RIGHTWARDS ARROW WITH PLUS BELOW, 10565 +LEFTWARDS ARROW WITH PLUS BELOW, 10566 +RIGHTWARDS ARROW THROUGH X, 10567 +LEFT RIGHT ARROW THROUGH SMALL CIRCLE, 10568 +UPWARDS TWO HEADED ARROW FROM SMALL CIRCLE, 10569 +LEFT BARB UP RIGHT BARB DOWN HARPOON, 10570 +LEFT BARB DOWN RIGHT BARB UP HARPOON, 10571 +UP BARB RIGHT DOWN BARB LEFT HARPOON, 10572 +UP BARB LEFT DOWN BARB RIGHT HARPOON, 10573 +LEFT BARB UP RIGHT BARB UP HARPOON, 10574 +UP BARB RIGHT DOWN BARB RIGHT HARPOON, 10575 +LEFT BARB DOWN RIGHT BARB DOWN HARPOON, 10576 +UP BARB LEFT DOWN BARB LEFT HARPOON, 10577 +LEFTWARDS HARPOON WITH BARB UP TO BAR, 10578 +RIGHTWARDS HARPOON WITH BARB UP TO BAR, 10579 +UPWARDS HARPOON WITH BARB RIGHT TO BAR, 10580 +DOWNWARDS HARPOON WITH BARB RIGHT TO BAR, 10581 +LEFTWARDS HARPOON WITH BARB DOWN TO BAR, 10582 +RIGHTWARDS HARPOON WITH BARB DOWN TO BAR, 10583 +UPWARDS HARPOON WITH BARB LEFT TO BAR, 10584 +DOWNWARDS HARPOON WITH BARB LEFT TO BAR, 10585 +LEFTWARDS HARPOON WITH BARB UP FROM BAR, 10586 +RIGHTWARDS HARPOON WITH BARB UP FROM BAR, 10587 +UPWARDS HARPOON WITH BARB RIGHT FROM BAR, 10588 +DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR, 10589 +LEFTWARDS HARPOON WITH BARB DOWN FROM BAR, 10590 +RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR, 10591 +UPWARDS HARPOON WITH BARB LEFT FROM BAR, 10592 +DOWNWARDS HARPOON WITH BARB LEFT FROM BAR, 10593 +LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN, 10594 +UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT, 10595 +RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN, 10596 +DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT, 10597 +LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP, 10598 +LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN, 10599 +RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP, 10600 +RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN, 10601 +LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH, 10602 +LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH, 10603 +RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH, 10604 +RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH, 10605 +UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT, 10606 +DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT, 10607 +RIGHT DOUBLE ARROW WITH ROUNDED HEAD, 10608 +EQUALS SIGN ABOVE RIGHTWARDS ARROW, 10609 +TILDE OPERATOR ABOVE RIGHTWARDS ARROW, 10610 +LEFTWARDS ARROW ABOVE TILDE OPERATOR, 10611 +RIGHTWARDS ARROW ABOVE TILDE OPERATOR, 10612 +RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO, 10613 +LESS THAN ABOVE LEFTWARDS ARROW, 10614 +LEFTWARDS ARROW THROUGH LESS THAN, 10615 +GREATER THAN ABOVE RIGHTWARDS ARROW, 10616 +SUBSET ABOVE RIGHTWARDS ARROW, 10617 +LEFTWARDS ARROW THROUGH SUBSET, 10618 +SUPERSET ABOVE LEFTWARDS ARROW, 10619 +LEFT FISH TAIL, 10620 +RIGHT FISH TAIL, 10621 +UP FISH TAIL, 10622 +DOWN FISH TAIL, 10623 +TRIPLE VERTICAL BAR DELIMITER, 10624 +Z NOTATION SPOT, 10625 +Z NOTATION TYPE COLON, 10626 +LEFT WHITE CURLY BRACKET, 10627 +RIGHT WHITE CURLY BRACKET, 10628 +LEFT WHITE PARENTHESIS, 10629 +RIGHT WHITE PARENTHESIS, 10630 +Z NOTATION LEFT IMAGE BRACKET, 10631 +Z NOTATION RIGHT IMAGE BRACKET, 10632 +Z NOTATION LEFT BINDING BRACKET, 10633 +Z NOTATION RIGHT BINDING BRACKET, 10634 +LEFT SQUARE BRACKET WITH UNDERBAR, 10635 +RIGHT SQUARE BRACKET WITH UNDERBAR, 10636 +LEFT SQUARE BRACKET WITH TICK IN TOP CORNER, 10637 +RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER, 10638 +LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER, 10639 +RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER, 10640 +LEFT ANGLE BRACKET WITH DOT, 10641 +RIGHT ANGLE BRACKET WITH DOT, 10642 +LEFT ARC LESS THAN BRACKET, 10643 +RIGHT ARC GREATER THAN BRACKET, 10644 +DOUBLE LEFT ARC GREATER THAN BRACKET, 10645 +DOUBLE RIGHT ARC LESS THAN BRACKET, 10646 +LEFT BLACK TORTOISE SHELL BRACKET, 10647 +RIGHT BLACK TORTOISE SHELL BRACKET, 10648 +DOTTED FENCE, 10649 +VERTICAL ZIGZAG LINE, 10650 +MEASURED ANGLE OPENING LEFT, 10651 +RIGHT ANGLE VARIANT WITH SQUARE, 10652 +MEASURED RIGHT ANGLE WITH DOT, 10653 +ANGLE WITH S INSIDE, 10654 +ACUTE ANGLE, 10655 +SPHERICAL ANGLE OPENING LEFT, 10656 +SPHERICAL ANGLE OPENING UP, 10657 +TURNED ANGLE, 10658 +REVERSED ANGLE, 10659 +ANGLE WITH UNDERBAR, 10660 +REVERSED ANGLE WITH UNDERBAR, 10661 +OBLIQUE ANGLE OPENING UP, 10662 +OBLIQUE ANGLE OPENING DOWN, 10663 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT, 10664 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT, 10665 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT, 10666 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT, 10667 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP, 10668 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP, 10669 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN, 10670 +MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN, 10671 +REVERSED EMPTY SET, 10672 +EMPTY SET WITH OVERBAR, 10673 +EMPTY SET WITH SMALL CIRCLE ABOVE, 10674 +EMPTY SET WITH RIGHT ARROW ABOVE, 10675 +EMPTY SET WITH LEFT ARROW ABOVE, 10676 +CIRCLE WITH HORIZONTAL BAR, 10677 +CIRCLED VERTICAL BAR, 10678 +CIRCLED PARALLEL, 10679 +CIRCLED REVERSE SOLIDUS, 10680 +CIRCLED PERPENDICULAR, 10681 +CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR, 10682 +CIRCLE WITH SUPERIMPOSED X, 10683 +CIRCLED ANTICLOCKWISE ROTATED DIVISION SIGN, 10684 +UP ARROW THROUGH CIRCLE, 10685 +CIRCLED WHITE BULLET, 10686 +CIRCLED BULLET, 10687 +CIRCLED LESS THAN, 10688 +CIRCLED GREATER THAN, 10689 +CIRCLE WITH SMALL CIRCLE TO THE RIGHT, 10690 +CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT, 10691 +SQUARED RISING DIAGONAL SLASH, 10692 +SQUARED FALLING DIAGONAL SLASH, 10693 +SQUARED ASTERISK, 10694 +SQUARED SMALL CIRCLE, 10695 +SQUARED SQUARE, 10696 +TWO JOINED SQUARES, 10697 +TRIANGLE WITH DOT ABOVE, 10698 +TRIANGLE WITH UNDERBAR, 10699 +S IN TRIANGLE, 10700 +TRIANGLE WITH SERIFS AT BOTTOM, 10701 +RIGHT TRIANGLE ABOVE LEFT TRIANGLE, 10702 +LEFT TRIANGLE BESIDE VERTICAL BAR, 10703 +VERTICAL BAR BESIDE RIGHT TRIANGLE, 10704 +BOWTIE WITH LEFT HALF BLACK, 10705 +BOWTIE WITH RIGHT HALF BLACK, 10706 +BLACK BOWTIE, 10707 +TIMES WITH LEFT HALF BLACK, 10708 +TIMES WITH RIGHT HALF BLACK, 10709 +WHITE HOURGLASS, 10710 +BLACK HOURGLASS, 10711 +LEFT WIGGLY FENCE, 10712 +RIGHT WIGGLY FENCE, 10713 +LEFT DOUBLE WIGGLY FENCE, 10714 +RIGHT DOUBLE WIGGLY FENCE, 10715 +INCOMPLETE INFINITY, 10716 +TIE OVER INFINITY, 10717 +INFINITY NEGATED WITH VERTICAL BAR, 10718 +DOUBLE ENDED MULTIMAP, 10719 +SQUARE WITH CONTOURED OUTLINE, 10720 +INCREASES AS, 10721 +SHUFFLE PRODUCT, 10722 +EQUALS SIGN AND SLANTED PARALLEL, 10723 +EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE, 10724 +IDENTICAL TO AND SLANTED PARALLEL, 10725 +GLEICH STARK, 10726 +THERMODYNAMIC, 10727 +DOWN POINTING TRIANGLE WITH LEFT HALF BLACK, 10728 +DOWN POINTING TRIANGLE WITH RIGHT HALF BLACK, 10729 +BLACK DIAMOND WITH DOWN ARROW, 10730 +BLACK LOZENGE, 10731 +WHITE CIRCLE WITH DOWN ARROW, 10732 +BLACK CIRCLE WITH DOWN ARROW, 10733 +ERROR BARRED WHITE SQUARE, 10734 +ERROR BARRED BLACK SQUARE, 10735 +ERROR BARRED WHITE DIAMOND, 10736 +ERROR BARRED BLACK DIAMOND, 10737 +ERROR BARRED WHITE CIRCLE, 10738 +ERROR BARRED BLACK CIRCLE, 10739 +RULE DELAYED, 10740 +REVERSE SOLIDUS OPERATOR, 10741 +SOLIDUS WITH OVERBAR, 10742 +REVERSE SOLIDUS WITH HORIZONTAL STROKE, 10743 +BIG SOLIDUS, 10744 +BIG REVERSE SOLIDUS, 10745 +DOUBLE PLUS, 10746 +TRIPLE PLUS, 10747 +LEFT POINTING CURVED ANGLE BRACKET, 10748 +RIGHT POINTING CURVED ANGLE BRACKET, 10749 +TINY, 10750 +MINY, 10751 +N ARY CIRCLED DOT OPERATOR, 10752 +N ARY CIRCLED PLUS OPERATOR, 10753 +N ARY CIRCLED TIMES OPERATOR, 10754 +N ARY UNION OPERATOR WITH DOT, 10755 +N ARY UNION OPERATOR WITH PLUS, 10756 +N ARY SQUARE INTERSECTION OPERATOR, 10757 +N ARY SQUARE UNION OPERATOR, 10758 +TWO LOGICAL AND OPERATOR, 10759 +TWO LOGICAL OR OPERATOR, 10760 +N ARY TIMES OPERATOR, 10761 +MODULO TWO SUM, 10762 +SUMMATION WITH INTEGRAL, 10763 +QUADRUPLE INTEGRAL OPERATOR, 10764 +FINITE PART INTEGRAL, 10765 +INTEGRAL WITH DOUBLE STROKE, 10766 +INTEGRAL AVERAGE WITH SLASH, 10767 +CIRCULATION FUNCTION, 10768 +ANTICLOCKWISE INTEGRATION, 10769 +LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE, 10770 +LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE, 10771 +LINE INTEGRATION NOT INCLUDING THE POLE, 10772 +INTEGRAL AROUND A POINT OPERATOR, 10773 +QUATERNION INTEGRAL OPERATOR, 10774 +INTEGRAL WITH LEFTWARDS ARROW WITH HOOK, 10775 +INTEGRAL WITH TIMES SIGN, 10776 +INTEGRAL WITH INTERSECTION, 10777 +INTEGRAL WITH UNION, 10778 +INTEGRAL WITH OVERBAR, 10779 +INTEGRAL WITH UNDERBAR, 10780 +JOIN, 10781 +LARGE LEFT TRIANGLE OPERATOR, 10782 +Z NOTATION SCHEMA COMPOSITION, 10783 +Z NOTATION SCHEMA PIPING, 10784 +Z NOTATION SCHEMA PROJECTION, 10785 +PLUS SIGN WITH SMALL CIRCLE ABOVE, 10786 +PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE, 10787 +PLUS SIGN WITH TILDE ABOVE, 10788 +PLUS SIGN WITH DOT BELOW, 10789 +PLUS SIGN WITH TILDE BELOW, 10790 +PLUS SIGN WITH SUBSCRIPT TWO, 10791 +PLUS SIGN WITH BLACK TRIANGLE, 10792 +MINUS SIGN WITH COMMA ABOVE, 10793 +MINUS SIGN WITH DOT BELOW, 10794 +MINUS SIGN WITH FALLING DOTS, 10795 +MINUS SIGN WITH RISING DOTS, 10796 +PLUS SIGN IN LEFT HALF CIRCLE, 10797 +PLUS SIGN IN RIGHT HALF CIRCLE, 10798 +VECTOR OR CROSS PRODUCT, 10799 +MULTIPLICATION SIGN WITH DOT ABOVE, 10800 +MULTIPLICATION SIGN WITH UNDERBAR, 10801 +SEMIDIRECT PRODUCT WITH BOTTOM CLOSED, 10802 +SMASH PRODUCT, 10803 +MULTIPLICATION SIGN IN LEFT HALF CIRCLE, 10804 +MULTIPLICATION SIGN IN RIGHT HALF CIRCLE, 10805 +CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT, 10806 +MULTIPLICATION SIGN IN DOUBLE CIRCLE, 10807 +CIRCLED DIVISION SIGN, 10808 +PLUS SIGN IN TRIANGLE, 10809 +MINUS SIGN IN TRIANGLE, 10810 +MULTIPLICATION SIGN IN TRIANGLE, 10811 +INTERIOR PRODUCT, 10812 +RIGHTHAND INTERIOR PRODUCT, 10813 +Z NOTATION RELATIONAL COMPOSITION, 10814 +AMALGAMATION OR COPRODUCT, 10815 +INTERSECTION WITH DOT, 10816 +UNION WITH MINUS SIGN, 10817 +UNION WITH OVERBAR, 10818 +INTERSECTION WITH OVERBAR, 10819 +INTERSECTION WITH LOGICAL AND, 10820 +UNION WITH LOGICAL OR, 10821 +UNION ABOVE INTERSECTION, 10822 +INTERSECTION ABOVE UNION, 10823 +UNION ABOVE BAR ABOVE INTERSECTION, 10824 +INTERSECTION ABOVE BAR ABOVE UNION, 10825 +UNION BESIDE AND JOINED WITH UNION, 10826 +INTERSECTION BESIDE AND JOINED WITH INTERSECTION, 10827 +CLOSED UNION WITH SERIFS, 10828 +CLOSED INTERSECTION WITH SERIFS, 10829 +DOUBLE SQUARE INTERSECTION, 10830 +DOUBLE SQUARE UNION, 10831 +CLOSED UNION WITH SERIFS AND SMASH PRODUCT, 10832 +LOGICAL AND WITH DOT ABOVE, 10833 +LOGICAL OR WITH DOT ABOVE, 10834 +DOUBLE LOGICAL AND, 10835 +DOUBLE LOGICAL OR, 10836 +TWO INTERSECTING LOGICAL AND, 10837 +TWO INTERSECTING LOGICAL OR, 10838 +SLOPING LARGE OR, 10839 +SLOPING LARGE AND, 10840 +LOGICAL OR OVERLAPPING LOGICAL AND, 10841 +LOGICAL AND WITH MIDDLE STEM, 10842 +LOGICAL OR WITH MIDDLE STEM, 10843 +LOGICAL AND WITH HORIZONTAL DASH, 10844 +LOGICAL OR WITH HORIZONTAL DASH, 10845 +LOGICAL AND WITH DOUBLE OVERBAR, 10846 +LOGICAL AND WITH UNDERBAR, 10847 +LOGICAL AND WITH DOUBLE UNDERBAR, 10848 +SMALL VEE WITH UNDERBAR, 10849 +LOGICAL OR WITH DOUBLE OVERBAR, 10850 +LOGICAL OR WITH DOUBLE UNDERBAR, 10851 +Z NOTATION DOMAIN ANTIRESTRICTION, 10852 +Z NOTATION RANGE ANTIRESTRICTION, 10853 +EQUALS SIGN WITH DOT BELOW, 10854 +IDENTICAL WITH DOT ABOVE, 10855 +TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE, 10856 +TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE, 10857 +TILDE OPERATOR WITH DOT ABOVE, 10858 +TILDE OPERATOR WITH RISING DOTS, 10859 +SIMILAR MINUS SIMILAR, 10860 +CONGRUENT WITH DOT ABOVE, 10861 +EQUALS WITH ASTERISK, 10862 +ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT, 10863 +APPROXIMATELY EQUAL OR EQUAL TO, 10864 +EQUALS SIGN ABOVE PLUS SIGN, 10865 +PLUS SIGN ABOVE EQUALS SIGN, 10866 +EQUALS SIGN ABOVE TILDE OPERATOR, 10867 +DOUBLE COLON EQUAL, 10868 +TWO CONSECUTIVE EQUALS SIGNS, 10869 +THREE CONSECUTIVE EQUALS SIGNS, 10870 +EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW, 10871 +EQUIVALENT WITH FOUR DOTS ABOVE, 10872 +LESS THAN WITH CIRCLE INSIDE, 10873 +GREATER THAN WITH CIRCLE INSIDE, 10874 +LESS THAN WITH QUESTION MARK ABOVE, 10875 +GREATER THAN WITH QUESTION MARK ABOVE, 10876 +LESS THAN OR SLANTED EQUAL TO, 10877 +GREATER THAN OR SLANTED EQUAL TO, 10878 +LESS THAN OR SLANTED EQUAL TO WITH DOT INSIDE, 10879 +GREATER THAN OR SLANTED EQUAL TO WITH DOT INSIDE, 10880 +LESS THAN OR SLANTED EQUAL TO WITH DOT ABOVE, 10881 +GREATER THAN OR SLANTED EQUAL TO WITH DOT ABOVE, 10882 +LESS THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT, 10883 +GREATER THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT, 10884 +LESS THAN OR APPROXIMATE, 10885 +GREATER THAN OR APPROXIMATE, 10886 +LESS THAN AND SINGLE LINE NOT EQUAL TO, 10887 +GREATER THAN AND SINGLE LINE NOT EQUAL TO, 10888 +LESS THAN AND NOT APPROXIMATE, 10889 +GREATER THAN AND NOT APPROXIMATE, 10890 +LESS THAN ABOVE DOUBLE LINE EQUAL ABOVE GREATER THAN, 10891 +GREATER THAN ABOVE DOUBLE LINE EQUAL ABOVE LESS THAN, 10892 +LESS THAN ABOVE SIMILAR OR EQUAL, 10893 +GREATER THAN ABOVE SIMILAR OR EQUAL, 10894 +LESS THAN ABOVE SIMILAR ABOVE GREATER THAN, 10895 +GREATER THAN ABOVE SIMILAR ABOVE LESS THAN, 10896 +LESS THAN ABOVE GREATER THAN ABOVE DOUBLE LINE EQUAL, 10897 +GREATER THAN ABOVE LESS THAN ABOVE DOUBLE LINE EQUAL, 10898 +LESS THAN ABOVE SLANTED EQUAL ABOVE GREATER THAN ABOVE SLANTED EQUAL, 10899 +GREATER THAN ABOVE SLANTED EQUAL ABOVE LESS THAN ABOVE SLANTED EQUAL, 10900 +SLANTED EQUAL TO OR LESS THAN, 10901 +SLANTED EQUAL TO OR GREATER THAN, 10902 +SLANTED EQUAL TO OR LESS THAN WITH DOT INSIDE, 10903 +SLANTED EQUAL TO OR GREATER THAN WITH DOT INSIDE, 10904 +DOUBLE LINE EQUAL TO OR LESS THAN, 10905 +DOUBLE LINE EQUAL TO OR GREATER THAN, 10906 +DOUBLE LINE SLANTED EQUAL TO OR LESS THAN, 10907 +DOUBLE LINE SLANTED EQUAL TO OR GREATER THAN, 10908 +SIMILAR OR LESS THAN, 10909 +SIMILAR OR GREATER THAN, 10910 +SIMILAR ABOVE LESS THAN ABOVE EQUALS SIGN, 10911 +SIMILAR ABOVE GREATER THAN ABOVE EQUALS SIGN, 10912 +DOUBLE NESTED LESS THAN, 10913 +DOUBLE NESTED GREATER THAN, 10914 +DOUBLE NESTED LESS THAN WITH UNDERBAR, 10915 +GREATER THAN OVERLAPPING LESS THAN, 10916 +GREATER THAN BESIDE LESS THAN, 10917 +LESS THAN CLOSED BY CURVE, 10918 +GREATER THAN CLOSED BY CURVE, 10919 +LESS THAN CLOSED BY CURVE ABOVE SLANTED EQUAL, 10920 +GREATER THAN CLOSED BY CURVE ABOVE SLANTED EQUAL, 10921 +SMALLER THAN, 10922 +LARGER THAN, 10923 +SMALLER THAN OR EQUAL TO, 10924 +LARGER THAN OR EQUAL TO, 10925 +EQUALS SIGN WITH BUMPY ABOVE, 10926 +PRECEDES ABOVE SINGLE LINE EQUALS SIGN, 10927 +SUCCEEDS ABOVE SINGLE LINE EQUALS SIGN, 10928 +PRECEDES ABOVE SINGLE LINE NOT EQUAL TO, 10929 +SUCCEEDS ABOVE SINGLE LINE NOT EQUAL TO, 10930 +PRECEDES ABOVE EQUALS SIGN, 10931 +SUCCEEDS ABOVE EQUALS SIGN, 10932 +PRECEDES ABOVE NOT EQUAL TO, 10933 +SUCCEEDS ABOVE NOT EQUAL TO, 10934 +PRECEDES ABOVE ALMOST EQUAL TO, 10935 +SUCCEEDS ABOVE ALMOST EQUAL TO, 10936 +PRECEDES ABOVE NOT ALMOST EQUAL TO, 10937 +SUCCEEDS ABOVE NOT ALMOST EQUAL TO, 10938 +DOUBLE PRECEDES, 10939 +DOUBLE SUCCEEDS, 10940 +SUBSET WITH DOT, 10941 +SUPERSET WITH DOT, 10942 +SUBSET WITH PLUS SIGN BELOW, 10943 +SUPERSET WITH PLUS SIGN BELOW, 10944 +SUBSET WITH MULTIPLICATION SIGN BELOW, 10945 +SUPERSET WITH MULTIPLICATION SIGN BELOW, 10946 +SUBSET OF OR EQUAL TO WITH DOT ABOVE, 10947 +SUPERSET OF OR EQUAL TO WITH DOT ABOVE, 10948 +SUBSET OF ABOVE EQUALS SIGN, 10949 +SUPERSET OF ABOVE EQUALS SIGN, 10950 +SUBSET OF ABOVE TILDE OPERATOR, 10951 +SUPERSET OF ABOVE TILDE OPERATOR, 10952 +SUBSET OF ABOVE ALMOST EQUAL TO, 10953 +SUPERSET OF ABOVE ALMOST EQUAL TO, 10954 +SUBSET OF ABOVE NOT EQUAL TO, 10955 +SUPERSET OF ABOVE NOT EQUAL TO, 10956 +SQUARE LEFT OPEN BOX OPERATOR, 10957 +SQUARE RIGHT OPEN BOX OPERATOR, 10958 +CLOSED SUBSET, 10959 +CLOSED SUPERSET, 10960 +CLOSED SUBSET OR EQUAL TO, 10961 +CLOSED SUPERSET OR EQUAL TO, 10962 +SUBSET ABOVE SUPERSET, 10963 +SUPERSET ABOVE SUBSET, 10964 +SUBSET ABOVE SUBSET, 10965 +SUPERSET ABOVE SUPERSET, 10966 +SUPERSET BESIDE SUBSET, 10967 +SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET, 10968 +ELEMENT OF OPENING DOWNWARDS, 10969 +PITCHFORK WITH TEE TOP, 10970 +TRANSVERSAL INTERSECTION, 10971 +FORKING, 10972 +NONFORKING, 10973 +SHORT LEFT TACK, 10974 +SHORT DOWN TACK, 10975 +SHORT UP TACK, 10976 +PERPENDICULAR WITH S, 10977 +VERTICAL BAR TRIPLE RIGHT TURNSTILE, 10978 +DOUBLE VERTICAL BAR LEFT TURNSTILE, 10979 +VERTICAL BAR DOUBLE LEFT TURNSTILE, 10980 +DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE, 10981 +LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL, 10982 +SHORT DOWN TACK WITH OVERBAR, 10983 +SHORT UP TACK WITH UNDERBAR, 10984 +SHORT UP TACK ABOVE SHORT DOWN TACK, 10985 +DOUBLE DOWN TACK, 10986 +DOUBLE UP TACK, 10987 +DOUBLE STROKE NOT SIGN, 10988 +REVERSED DOUBLE STROKE NOT SIGN, 10989 +DOES NOT DIVIDE WITH REVERSED NEGATION SLASH, 10990 +VERTICAL LINE WITH CIRCLE ABOVE, 10991 +VERTICAL LINE WITH CIRCLE BELOW, 10992 +DOWN TACK WITH CIRCLE BELOW, 10993 +PARALLEL WITH HORIZONTAL STROKE, 10994 +PARALLEL WITH TILDE OPERATOR, 10995 +TRIPLE VERTICAL BAR BINARY RELATION, 10996 +TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE, 10997 +TRIPLE COLON OPERATOR, 10998 +TRIPLE NESTED LESS THAN, 10999 +TRIPLE NESTED GREATER THAN, 11000 +DOUBLE LINE SLANTED LESS THAN OR EQUAL TO, 11001 +DOUBLE LINE SLANTED GREATER THAN OR EQUAL TO, 11002 +TRIPLE SOLIDUS BINARY RELATION, 11003 +LARGE TRIPLE VERTICAL BAR OPERATOR, 11004 +DOUBLE SOLIDUS OPERATOR, 11005 +WHITE VERTICAL BAR, 11006 +N ARY WHITE VERTICAL BAR, 11007 +NORTH EAST WHITE ARROW, 11008 +NORTH WEST WHITE ARROW, 11009 +SOUTH EAST WHITE ARROW, 11010 +SOUTH WEST WHITE ARROW, 11011 +LEFT RIGHT WHITE ARROW, 11012 +LEFTWARDS BLACK ARROW, 11013 +UPWARDS BLACK ARROW, 11014 +DOWNWARDS BLACK ARROW, 11015 +NORTH EAST BLACK ARROW, 11016 +NORTH WEST BLACK ARROW, 11017 +SOUTH EAST BLACK ARROW, 11018 +SOUTH WEST BLACK ARROW, 11019 +LEFT RIGHT BLACK ARROW, 11020 +UP DOWN BLACK ARROW, 11021 +RIGHTWARDS ARROW WITH TIP DOWNWARDS, 11022 +RIGHTWARDS ARROW WITH TIP UPWARDS, 11023 +LEFTWARDS ARROW WITH TIP DOWNWARDS, 11024 +LEFTWARDS ARROW WITH TIP UPWARDS, 11025 +SQUARE WITH TOP HALF BLACK, 11026 +SQUARE WITH BOTTOM HALF BLACK, 11027 +SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK, 11028 +SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK, 11029 +DIAMOND WITH LEFT HALF BLACK, 11030 +DIAMOND WITH RIGHT HALF BLACK, 11031 +DIAMOND WITH TOP HALF BLACK, 11032 +DIAMOND WITH BOTTOM HALF BLACK, 11033 +DOTTED SQUARE, 11034 +BLACK LARGE SQUARE, 11035 +WHITE LARGE SQUARE, 11036 +BLACK VERY SMALL SQUARE, 11037 +WHITE VERY SMALL SQUARE, 11038 +BLACK PENTAGON, 11039 +WHITE PENTAGON, 11040 +WHITE HEXAGON, 11041 +BLACK HEXAGON, 11042 +HORIZONTAL BLACK HEXAGON, 11043 +BLACK LARGE CIRCLE, 11044 +BLACK MEDIUM DIAMOND, 11045 +WHITE MEDIUM DIAMOND, 11046 +BLACK MEDIUM LOZENGE, 11047 +WHITE MEDIUM LOZENGE, 11048 +BLACK SMALL DIAMOND, 11049 +BLACK SMALL LOZENGE, 11050 +WHITE SMALL LOZENGE, 11051 +BLACK HORIZONTAL ELLIPSE, 11052 +WHITE HORIZONTAL ELLIPSE, 11053 +BLACK VERTICAL ELLIPSE, 11054 +WHITE VERTICAL ELLIPSE, 11055 +LEFT ARROW WITH SMALL CIRCLE, 11056 +THREE LEFTWARDS ARROWS, 11057 +LEFT ARROW WITH CIRCLED PLUS, 11058 +LONG LEFTWARDS SQUIGGLE ARROW, 11059 +LEFTWARDS TWO HEADED ARROW WITH VERTICAL STROKE, 11060 +LEFTWARDS TWO HEADED ARROW WITH DOUBLE VERTICAL STROKE, 11061 +LEFTWARDS TWO HEADED ARROW FROM BAR, 11062 +LEFTWARDS TWO HEADED TRIPLE DASH ARROW, 11063 +LEFTWARDS ARROW WITH DOTTED STEM, 11064 +LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE, 11065 +LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE, 11066 +LEFTWARDS TWO HEADED ARROW WITH TAIL, 11067 +LEFTWARDS TWO HEADED ARROW WITH TAIL WITH VERTICAL STROKE, 11068 +LEFTWARDS TWO HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE, 11069 +LEFTWARDS ARROW THROUGH X, 11070 +WAVE ARROW POINTING DIRECTLY LEFT, 11071 +EQUALS SIGN ABOVE LEFTWARDS ARROW, 11072 +REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW, 11073 +LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO, 11074 +RIGHTWARDS ARROW THROUGH GREATER THAN, 11075 +RIGHTWARDS ARROW THROUGH SUPERSET, 11076 +LEFTWARDS QUADRUPLE ARROW, 11077 +RIGHTWARDS QUADRUPLE ARROW, 11078 +REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW, 11079 +RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO, 11080 +TILDE OPERATOR ABOVE LEFTWARDS ARROW, 11081 +LEFTWARDS ARROW ABOVE ALMOST EQUAL TO, 11082 +LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR, 11083 +RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR, 11084 +DOWNWARDS TRIANGLE HEADED ZIGZAG ARROW, 11085 +SHORT SLANTED NORTH ARROW, 11086 +SHORT BACKSLANTED SOUTH ARROW, 11087 +WHITE MEDIUM STAR, 11088 +BLACK SMALL STAR, 11089 +WHITE SMALL STAR, 11090 +BLACK RIGHT POINTING PENTAGON, 11091 +WHITE RIGHT POINTING PENTAGON, 11092 +HEAVY LARGE CIRCLE, 11093 +HEAVY OVAL WITH OVAL INSIDE, 11094 +HEAVY CIRCLE WITH CIRCLE INSIDE, 11095 +HEAVY CIRCLE, 11096 +HEAVY CIRCLED SALTIRE, 11097 +SLANTED NORTH ARROW WITH HOOKED HEAD, 11098 +BACKSLANTED SOUTH ARROW WITH HOOKED TAIL, 11099 +SLANTED NORTH ARROW WITH HORIZONTAL TAIL, 11100 +BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL, 11101 +BENT ARROW POINTING DOWNWARDS THEN NORTH EAST, 11102 +SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST, 11103 +LEFTWARDS TRIANGLE HEADED ARROW, 11104 +UPWARDS TRIANGLE HEADED ARROW, 11105 +RIGHTWARDS TRIANGLE HEADED ARROW, 11106 +DOWNWARDS TRIANGLE HEADED ARROW, 11107 +LEFT RIGHT TRIANGLE HEADED ARROW, 11108 +UP DOWN TRIANGLE HEADED ARROW, 11109 +NORTH WEST TRIANGLE HEADED ARROW, 11110 +NORTH EAST TRIANGLE HEADED ARROW, 11111 +SOUTH EAST TRIANGLE HEADED ARROW, 11112 +SOUTH WEST TRIANGLE HEADED ARROW, 11113 +LEFTWARDS TRIANGLE HEADED DASHED ARROW, 11114 +UPWARDS TRIANGLE HEADED DASHED ARROW, 11115 +RIGHTWARDS TRIANGLE HEADED DASHED ARROW, 11116 +DOWNWARDS TRIANGLE HEADED DASHED ARROW, 11117 +CLOCKWISE TRIANGLE HEADED OPEN CIRCLE ARROW, 11118 +ANTICLOCKWISE TRIANGLE HEADED OPEN CIRCLE ARROW, 11119 +LEFTWARDS TRIANGLE HEADED ARROW TO BAR, 11120 +UPWARDS TRIANGLE HEADED ARROW TO BAR, 11121 +RIGHTWARDS TRIANGLE HEADED ARROW TO BAR, 11122 +DOWNWARDS TRIANGLE HEADED ARROW TO BAR, 11123 +NORTH WEST TRIANGLE HEADED ARROW TO BAR, 11126 +NORTH EAST TRIANGLE HEADED ARROW TO BAR, 11127 +SOUTH EAST TRIANGLE HEADED ARROW TO BAR, 11128 +SOUTH WEST TRIANGLE HEADED ARROW TO BAR, 11129 +LEFTWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE, 11130 +UPWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE, 11131 +RIGHTWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE, 11132 +DOWNWARDS TRIANGLE HEADED ARROW WITH DOUBLE HORIZONTAL STROKE, 11133 +HORIZONTAL TAB KEY, 11134 +VERTICAL TAB KEY, 11135 +LEFTWARDS TRIANGLE HEADED ARROW OVER RIGHTWARDS TRIANGLE HEADED ARROW, 11136 +UPWARDS TRIANGLE HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE HEADED ARROW, 11137 +RIGHTWARDS TRIANGLE HEADED ARROW OVER LEFTWARDS TRIANGLE HEADED ARROW, 11138 +DOWNWARDS TRIANGLE HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE HEADED ARROW, 11139 +LEFTWARDS TRIANGLE HEADED PAIRED ARROWS, 11140 +UPWARDS TRIANGLE HEADED PAIRED ARROWS, 11141 +RIGHTWARDS TRIANGLE HEADED PAIRED ARROWS, 11142 +DOWNWARDS TRIANGLE HEADED PAIRED ARROWS, 11143 +LEFTWARDS BLACK CIRCLED WHITE ARROW, 11144 +UPWARDS BLACK CIRCLED WHITE ARROW, 11145 +RIGHTWARDS BLACK CIRCLED WHITE ARROW, 11146 +DOWNWARDS BLACK CIRCLED WHITE ARROW, 11147 +ANTICLOCKWISE TRIANGLE HEADED RIGHT U SHAPED ARROW, 11148 +ANTICLOCKWISE TRIANGLE HEADED BOTTOM U SHAPED ARROW, 11149 +ANTICLOCKWISE TRIANGLE HEADED LEFT U SHAPED ARROW, 11150 +ANTICLOCKWISE TRIANGLE HEADED TOP U SHAPED ARROW, 11151 +RETURN LEFT, 11152 +RETURN RIGHT, 11153 +NEWLINE LEFT, 11154 +NEWLINE RIGHT, 11155 +FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE, 11156 +RIGHTWARDS BLACK ARROW, 11157 +THREE D TOP LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD, 11160 +THREE D RIGHT LIGHTED UPWARDS EQUILATERAL ARROWHEAD, 11161 +THREE D TOP LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD, 11162 +THREE D LEFT LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD, 11163 +BLACK LEFTWARDS EQUILATERAL ARROWHEAD, 11164 +BLACK UPWARDS EQUILATERAL ARROWHEAD, 11165 +BLACK RIGHTWARDS EQUILATERAL ARROWHEAD, 11166 +BLACK DOWNWARDS EQUILATERAL ARROWHEAD, 11167 +DOWNWARDS TRIANGLE HEADED ARROW WITH LONG TIP LEFTWARDS, 11168 +DOWNWARDS TRIANGLE HEADED ARROW WITH LONG TIP RIGHTWARDS, 11169 +UPWARDS TRIANGLE HEADED ARROW WITH LONG TIP LEFTWARDS, 11170 +UPWARDS TRIANGLE HEADED ARROW WITH LONG TIP RIGHTWARDS, 11171 +LEFTWARDS TRIANGLE HEADED ARROW WITH LONG TIP UPWARDS, 11172 +RIGHTWARDS TRIANGLE HEADED ARROW WITH LONG TIP UPWARDS, 11173 +LEFTWARDS TRIANGLE HEADED ARROW WITH LONG TIP DOWNWARDS, 11174 +RIGHTWARDS TRIANGLE HEADED ARROW WITH LONG TIP DOWNWARDS, 11175 +BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW, 11176 +BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW, 11177 +BLACK CURVED UPWARDS AND LEFTWARDS ARROW, 11178 +BLACK CURVED UPWARDS AND RIGHTWARDS ARROW, 11179 +BLACK CURVED LEFTWARDS AND UPWARDS ARROW, 11180 +BLACK CURVED RIGHTWARDS AND UPWARDS ARROW, 11181 +BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW, 11182 +BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW, 11183 +RIBBON ARROW DOWN LEFT, 11184 +RIBBON ARROW DOWN RIGHT, 11185 +RIBBON ARROW UP LEFT, 11186 +RIBBON ARROW UP RIGHT, 11187 +RIBBON ARROW LEFT UP, 11188 +RIBBON ARROW RIGHT UP, 11189 +RIBBON ARROW LEFT DOWN, 11190 +RIBBON ARROW RIGHT DOWN, 11191 +UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR, 11192 +UP ARROWHEAD IN A RECTANGLE BOX, 11193 +BALLOT BOX WITH LIGHT X, 11197 +CIRCLED X, 11198 +CIRCLED BOLD X, 11199 +BLACK SQUARE CENTRED, 11200 +BLACK DIAMOND CENTRED, 11201 +TURNED BLACK PENTAGON, 11202 +HORIZONTAL BLACK OCTAGON, 11203 +BLACK OCTAGON, 11204 +BLACK MEDIUM UP POINTING TRIANGLE CENTRED, 11205 +BLACK MEDIUM DOWN POINTING TRIANGLE CENTRED, 11206 +BLACK MEDIUM LEFT POINTING TRIANGLE CENTRED, 11207 +BLACK MEDIUM RIGHT POINTING TRIANGLE CENTRED, 11208 +TOP HALF BLACK CIRCLE, 11210 +BOTTOM HALF BLACK CIRCLE, 11211 +LIGHT FOUR POINTED BLACK CUSP, 11212 +ROTATED LIGHT FOUR POINTED BLACK CUSP, 11213 +WHITE FOUR POINTED CUSP, 11214 +ROTATED WHITE FOUR POINTED CUSP, 11215 +SQUARE POSITION INDICATOR, 11216 +UNCERTAINTY SIGN, 11217 +LEFTWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS, 11244 +UPWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS, 11245 +RIGHTWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS, 11246 +DOWNWARDS TWO HEADED ARROW WITH TRIANGLE ARROWHEADS, 11247 +GLAGOLITIC CAPITAL LETTER AZU, 11264 +GLAGOLITIC CAPITAL LETTER BUKY, 11265 +GLAGOLITIC CAPITAL LETTER VEDE, 11266 +GLAGOLITIC CAPITAL LETTER GLAGOLI, 11267 +GLAGOLITIC CAPITAL LETTER DOBRO, 11268 +GLAGOLITIC CAPITAL LETTER YESTU, 11269 +GLAGOLITIC CAPITAL LETTER ZHIVETE, 11270 +GLAGOLITIC CAPITAL LETTER DZELO, 11271 +GLAGOLITIC CAPITAL LETTER ZEMLJA, 11272 +GLAGOLITIC CAPITAL LETTER IZHE, 11273 +GLAGOLITIC CAPITAL LETTER INITIAL IZHE, 11274 +GLAGOLITIC CAPITAL LETTER I, 11275 +GLAGOLITIC CAPITAL LETTER DJERVI, 11276 +GLAGOLITIC CAPITAL LETTER KAKO, 11277 +GLAGOLITIC CAPITAL LETTER LJUDIJE, 11278 +GLAGOLITIC CAPITAL LETTER MYSLITE, 11279 +GLAGOLITIC CAPITAL LETTER NASHI, 11280 +GLAGOLITIC CAPITAL LETTER ONU, 11281 +GLAGOLITIC CAPITAL LETTER POKOJI, 11282 +GLAGOLITIC CAPITAL LETTER RITSI, 11283 +GLAGOLITIC CAPITAL LETTER SLOVO, 11284 +GLAGOLITIC CAPITAL LETTER TVRIDO, 11285 +GLAGOLITIC CAPITAL LETTER UKU, 11286 +GLAGOLITIC CAPITAL LETTER FRITU, 11287 +GLAGOLITIC CAPITAL LETTER HERU, 11288 +GLAGOLITIC CAPITAL LETTER OTU, 11289 +GLAGOLITIC CAPITAL LETTER PE, 11290 +GLAGOLITIC CAPITAL LETTER SHTA, 11291 +GLAGOLITIC CAPITAL LETTER TSI, 11292 +GLAGOLITIC CAPITAL LETTER CHRIVI, 11293 +GLAGOLITIC CAPITAL LETTER SHA, 11294 +GLAGOLITIC CAPITAL LETTER YERU, 11295 +GLAGOLITIC CAPITAL LETTER YERI, 11296 +GLAGOLITIC CAPITAL LETTER YATI, 11297 +GLAGOLITIC CAPITAL LETTER SPIDERY HA, 11298 +GLAGOLITIC CAPITAL LETTER YU, 11299 +GLAGOLITIC CAPITAL LETTER SMALL YUS, 11300 +GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL, 11301 +GLAGOLITIC CAPITAL LETTER YO, 11302 +GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS, 11303 +GLAGOLITIC CAPITAL LETTER BIG YUS, 11304 +GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS, 11305 +GLAGOLITIC CAPITAL LETTER FITA, 11306 +GLAGOLITIC CAPITAL LETTER IZHITSA, 11307 +GLAGOLITIC CAPITAL LETTER SHTAPIC, 11308 +GLAGOLITIC CAPITAL LETTER TROKUTASTI A, 11309 +GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE, 11310 +GLAGOLITIC SMALL LETTER AZU, 11312 +GLAGOLITIC SMALL LETTER BUKY, 11313 +GLAGOLITIC SMALL LETTER VEDE, 11314 +GLAGOLITIC SMALL LETTER GLAGOLI, 11315 +GLAGOLITIC SMALL LETTER DOBRO, 11316 +GLAGOLITIC SMALL LETTER YESTU, 11317 +GLAGOLITIC SMALL LETTER ZHIVETE, 11318 +GLAGOLITIC SMALL LETTER DZELO, 11319 +GLAGOLITIC SMALL LETTER ZEMLJA, 11320 +GLAGOLITIC SMALL LETTER IZHE, 11321 +GLAGOLITIC SMALL LETTER INITIAL IZHE, 11322 +GLAGOLITIC SMALL LETTER I, 11323 +GLAGOLITIC SMALL LETTER DJERVI, 11324 +GLAGOLITIC SMALL LETTER KAKO, 11325 +GLAGOLITIC SMALL LETTER LJUDIJE, 11326 +GLAGOLITIC SMALL LETTER MYSLITE, 11327 +GLAGOLITIC SMALL LETTER NASHI, 11328 +GLAGOLITIC SMALL LETTER ONU, 11329 +GLAGOLITIC SMALL LETTER POKOJI, 11330 +GLAGOLITIC SMALL LETTER RITSI, 11331 +GLAGOLITIC SMALL LETTER SLOVO, 11332 +GLAGOLITIC SMALL LETTER TVRIDO, 11333 +GLAGOLITIC SMALL LETTER UKU, 11334 +GLAGOLITIC SMALL LETTER FRITU, 11335 +GLAGOLITIC SMALL LETTER HERU, 11336 +GLAGOLITIC SMALL LETTER OTU, 11337 +GLAGOLITIC SMALL LETTER PE, 11338 +GLAGOLITIC SMALL LETTER SHTA, 11339 +GLAGOLITIC SMALL LETTER TSI, 11340 +GLAGOLITIC SMALL LETTER CHRIVI, 11341 +GLAGOLITIC SMALL LETTER SHA, 11342 +GLAGOLITIC SMALL LETTER YERU, 11343 +GLAGOLITIC SMALL LETTER YERI, 11344 +GLAGOLITIC SMALL LETTER YATI, 11345 +GLAGOLITIC SMALL LETTER SPIDERY HA, 11346 +GLAGOLITIC SMALL LETTER YU, 11347 +GLAGOLITIC SMALL LETTER SMALL YUS, 11348 +GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL, 11349 +GLAGOLITIC SMALL LETTER YO, 11350 +GLAGOLITIC SMALL LETTER IOTATED SMALL YUS, 11351 +GLAGOLITIC SMALL LETTER BIG YUS, 11352 +GLAGOLITIC SMALL LETTER IOTATED BIG YUS, 11353 +GLAGOLITIC SMALL LETTER FITA, 11354 +GLAGOLITIC SMALL LETTER IZHITSA, 11355 +GLAGOLITIC SMALL LETTER SHTAPIC, 11356 +GLAGOLITIC SMALL LETTER TROKUTASTI A, 11357 +GLAGOLITIC SMALL LETTER LATINATE MYSLITE, 11358 +LATIN CAPITAL LETTER L WITH DOUBLE BAR, 11360 +LATIN SMALL LETTER L WITH DOUBLE BAR, 11361 +LATIN CAPITAL LETTER L WITH MIDDLE TILDE, 11362 +LATIN CAPITAL LETTER P WITH STROKE, 11363 +LATIN CAPITAL LETTER R WITH TAIL, 11364 +LATIN SMALL LETTER A WITH STROKE, 11365 +LATIN SMALL LETTER T WITH DIAGONAL STROKE, 11366 +LATIN CAPITAL LETTER H WITH DESCENDER, 11367 +LATIN SMALL LETTER H WITH DESCENDER, 11368 +LATIN CAPITAL LETTER K WITH DESCENDER, 11369 +LATIN SMALL LETTER K WITH DESCENDER, 11370 +LATIN CAPITAL LETTER Z WITH DESCENDER, 11371 +LATIN SMALL LETTER Z WITH DESCENDER, 11372 +LATIN CAPITAL LETTER ALPHA, 11373 +LATIN CAPITAL LETTER M WITH HOOK, 11374 +LATIN CAPITAL LETTER TURNED A, 11375 +LATIN CAPITAL LETTER TURNED ALPHA, 11376 +LATIN SMALL LETTER V WITH RIGHT HOOK, 11377 +LATIN CAPITAL LETTER W WITH HOOK, 11378 +LATIN SMALL LETTER W WITH HOOK, 11379 +LATIN SMALL LETTER V WITH CURL, 11380 +LATIN CAPITAL LETTER HALF H, 11381 +LATIN SMALL LETTER HALF H, 11382 +LATIN SMALL LETTER TAILLESS PHI, 11383 +LATIN SMALL LETTER E WITH NOTCH, 11384 +LATIN SMALL LETTER TURNED R WITH TAIL, 11385 +LATIN SMALL LETTER O WITH LOW RING INSIDE, 11386 +LATIN LETTER SMALL CAPITAL TURNED E, 11387 +LATIN SUBSCRIPT SMALL LETTER J, 11388 +MODIFIER LETTER CAPITAL V, 11389 +LATIN CAPITAL LETTER S WITH SWASH TAIL, 11390 +LATIN CAPITAL LETTER Z WITH SWASH TAIL, 11391 +COPTIC CAPITAL LETTER ALFA, 11392 +COPTIC SMALL LETTER ALFA, 11393 +COPTIC CAPITAL LETTER VIDA, 11394 +COPTIC SMALL LETTER VIDA, 11395 +COPTIC CAPITAL LETTER GAMMA, 11396 +COPTIC SMALL LETTER GAMMA, 11397 +COPTIC CAPITAL LETTER DALDA, 11398 +COPTIC SMALL LETTER DALDA, 11399 +COPTIC CAPITAL LETTER EIE, 11400 +COPTIC SMALL LETTER EIE, 11401 +COPTIC CAPITAL LETTER SOU, 11402 +COPTIC SMALL LETTER SOU, 11403 +COPTIC CAPITAL LETTER ZATA, 11404 +COPTIC SMALL LETTER ZATA, 11405 +COPTIC CAPITAL LETTER HATE, 11406 +COPTIC SMALL LETTER HATE, 11407 +COPTIC CAPITAL LETTER THETHE, 11408 +COPTIC SMALL LETTER THETHE, 11409 +COPTIC CAPITAL LETTER IAUDA, 11410 +COPTIC SMALL LETTER IAUDA, 11411 +COPTIC CAPITAL LETTER KAPA, 11412 +COPTIC SMALL LETTER KAPA, 11413 +COPTIC CAPITAL LETTER LAULA, 11414 +COPTIC SMALL LETTER LAULA, 11415 +COPTIC CAPITAL LETTER MI, 11416 +COPTIC SMALL LETTER MI, 11417 +COPTIC CAPITAL LETTER NI, 11418 +COPTIC SMALL LETTER NI, 11419 +COPTIC CAPITAL LETTER KSI, 11420 +COPTIC SMALL LETTER KSI, 11421 +COPTIC CAPITAL LETTER O, 11422 +COPTIC SMALL LETTER O, 11423 +COPTIC CAPITAL LETTER PI, 11424 +COPTIC SMALL LETTER PI, 11425 +COPTIC CAPITAL LETTER RO, 11426 +COPTIC SMALL LETTER RO, 11427 +COPTIC CAPITAL LETTER SIMA, 11428 +COPTIC SMALL LETTER SIMA, 11429 +COPTIC CAPITAL LETTER TAU, 11430 +COPTIC SMALL LETTER TAU, 11431 +COPTIC CAPITAL LETTER UA, 11432 +COPTIC SMALL LETTER UA, 11433 +COPTIC CAPITAL LETTER FI, 11434 +COPTIC SMALL LETTER FI, 11435 +COPTIC CAPITAL LETTER KHI, 11436 +COPTIC SMALL LETTER KHI, 11437 +COPTIC CAPITAL LETTER PSI, 11438 +COPTIC SMALL LETTER PSI, 11439 +COPTIC CAPITAL LETTER OOU, 11440 +COPTIC SMALL LETTER OOU, 11441 +COPTIC CAPITAL LETTER DIALECT P ALEF, 11442 +COPTIC SMALL LETTER DIALECT P ALEF, 11443 +COPTIC CAPITAL LETTER OLD COPTIC AIN, 11444 +COPTIC SMALL LETTER OLD COPTIC AIN, 11445 +COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE, 11446 +COPTIC SMALL LETTER CRYPTOGRAMMIC EIE, 11447 +COPTIC CAPITAL LETTER DIALECT P KAPA, 11448 +COPTIC SMALL LETTER DIALECT P KAPA, 11449 +COPTIC CAPITAL LETTER DIALECT P NI, 11450 +COPTIC SMALL LETTER DIALECT P NI, 11451 +COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI, 11452 +COPTIC SMALL LETTER CRYPTOGRAMMIC NI, 11453 +COPTIC CAPITAL LETTER OLD COPTIC OOU, 11454 +COPTIC SMALL LETTER OLD COPTIC OOU, 11455 +COPTIC CAPITAL LETTER SAMPI, 11456 +COPTIC SMALL LETTER SAMPI, 11457 +COPTIC CAPITAL LETTER CROSSED SHEI, 11458 +COPTIC SMALL LETTER CROSSED SHEI, 11459 +COPTIC CAPITAL LETTER OLD COPTIC SHEI, 11460 +COPTIC SMALL LETTER OLD COPTIC SHEI, 11461 +COPTIC CAPITAL LETTER OLD COPTIC ESH, 11462 +COPTIC SMALL LETTER OLD COPTIC ESH, 11463 +COPTIC CAPITAL LETTER AKHMIMIC KHEI, 11464 +COPTIC SMALL LETTER AKHMIMIC KHEI, 11465 +COPTIC CAPITAL LETTER DIALECT P HORI, 11466 +COPTIC SMALL LETTER DIALECT P HORI, 11467 +COPTIC CAPITAL LETTER OLD COPTIC HORI, 11468 +COPTIC SMALL LETTER OLD COPTIC HORI, 11469 +COPTIC CAPITAL LETTER OLD COPTIC HA, 11470 +COPTIC SMALL LETTER OLD COPTIC HA, 11471 +COPTIC CAPITAL LETTER L SHAPED HA, 11472 +COPTIC SMALL LETTER L SHAPED HA, 11473 +COPTIC CAPITAL LETTER OLD COPTIC HEI, 11474 +COPTIC SMALL LETTER OLD COPTIC HEI, 11475 +COPTIC CAPITAL LETTER OLD COPTIC HAT, 11476 +COPTIC SMALL LETTER OLD COPTIC HAT, 11477 +COPTIC CAPITAL LETTER OLD COPTIC GANGIA, 11478 +COPTIC SMALL LETTER OLD COPTIC GANGIA, 11479 +COPTIC CAPITAL LETTER OLD COPTIC DJA, 11480 +COPTIC SMALL LETTER OLD COPTIC DJA, 11481 +COPTIC CAPITAL LETTER OLD COPTIC SHIMA, 11482 +COPTIC SMALL LETTER OLD COPTIC SHIMA, 11483 +COPTIC CAPITAL LETTER OLD NUBIAN SHIMA, 11484 +COPTIC SMALL LETTER OLD NUBIAN SHIMA, 11485 +COPTIC CAPITAL LETTER OLD NUBIAN NGI, 11486 +COPTIC SMALL LETTER OLD NUBIAN NGI, 11487 +COPTIC CAPITAL LETTER OLD NUBIAN NYI, 11488 +COPTIC SMALL LETTER OLD NUBIAN NYI, 11489 +COPTIC CAPITAL LETTER OLD NUBIAN WAU, 11490 +COPTIC SMALL LETTER OLD NUBIAN WAU, 11491 +COPTIC SYMBOL KAI, 11492 +COPTIC SYMBOL MI RO, 11493 +COPTIC SYMBOL PI RO, 11494 +COPTIC SYMBOL STAUROS, 11495 +COPTIC SYMBOL TAU RO, 11496 +COPTIC SYMBOL KHI RO, 11497 +COPTIC SYMBOL SHIMA SIMA, 11498 +COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI, 11499 +COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI, 11500 +COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA, 11501 +COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA, 11502 +COPTIC COMBINING NI ABOVE, 11503 +COPTIC COMBINING SPIRITUS ASPER, 11504 +COPTIC COMBINING SPIRITUS LENIS, 11505 +COPTIC CAPITAL LETTER BOHAIRIC KHEI, 11506 +COPTIC SMALL LETTER BOHAIRIC KHEI, 11507 +COPTIC OLD NUBIAN FULL STOP, 11513 +COPTIC OLD NUBIAN DIRECT QUESTION MARK, 11514 +COPTIC OLD NUBIAN INDIRECT QUESTION MARK, 11515 +COPTIC OLD NUBIAN VERSE DIVIDER, 11516 +COPTIC FRACTION ONE HALF, 11517 +COPTIC FULL STOP, 11518 +COPTIC MORPHOLOGICAL DIVIDER, 11519 +GEORGIAN SMALL LETTER AN, 11520 +GEORGIAN SMALL LETTER BAN, 11521 +GEORGIAN SMALL LETTER GAN, 11522 +GEORGIAN SMALL LETTER DON, 11523 +GEORGIAN SMALL LETTER EN, 11524 +GEORGIAN SMALL LETTER VIN, 11525 +GEORGIAN SMALL LETTER ZEN, 11526 +GEORGIAN SMALL LETTER TAN, 11527 +GEORGIAN SMALL LETTER IN, 11528 +GEORGIAN SMALL LETTER KAN, 11529 +GEORGIAN SMALL LETTER LAS, 11530 +GEORGIAN SMALL LETTER MAN, 11531 +GEORGIAN SMALL LETTER NAR, 11532 +GEORGIAN SMALL LETTER ON, 11533 +GEORGIAN SMALL LETTER PAR, 11534 +GEORGIAN SMALL LETTER ZHAR, 11535 +GEORGIAN SMALL LETTER RAE, 11536 +GEORGIAN SMALL LETTER SAN, 11537 +GEORGIAN SMALL LETTER TAR, 11538 +GEORGIAN SMALL LETTER UN, 11539 +GEORGIAN SMALL LETTER PHAR, 11540 +GEORGIAN SMALL LETTER KHAR, 11541 +GEORGIAN SMALL LETTER GHAN, 11542 +GEORGIAN SMALL LETTER QAR, 11543 +GEORGIAN SMALL LETTER SHIN, 11544 +GEORGIAN SMALL LETTER CHIN, 11545 +GEORGIAN SMALL LETTER CAN, 11546 +GEORGIAN SMALL LETTER JIL, 11547 +GEORGIAN SMALL LETTER CIL, 11548 +GEORGIAN SMALL LETTER CHAR, 11549 +GEORGIAN SMALL LETTER XAN, 11550 +GEORGIAN SMALL LETTER JHAN, 11551 +GEORGIAN SMALL LETTER HAE, 11552 +GEORGIAN SMALL LETTER HE, 11553 +GEORGIAN SMALL LETTER HIE, 11554 +GEORGIAN SMALL LETTER WE, 11555 +GEORGIAN SMALL LETTER HAR, 11556 +GEORGIAN SMALL LETTER HOE, 11557 +GEORGIAN SMALL LETTER YN, 11559 +GEORGIAN SMALL LETTER AEN, 11565 +TIFINAGH LETTER YA, 11568 +TIFINAGH LETTER YAB, 11569 +TIFINAGH LETTER YABH, 11570 +TIFINAGH LETTER YAG, 11571 +TIFINAGH LETTER YAGHH, 11572 +TIFINAGH LETTER BERBER ACADEMY YAJ, 11573 +TIFINAGH LETTER YAJ, 11574 +TIFINAGH LETTER YAD, 11575 +TIFINAGH LETTER YADH, 11576 +TIFINAGH LETTER YADD, 11577 +TIFINAGH LETTER YADDH, 11578 +TIFINAGH LETTER YEY, 11579 +TIFINAGH LETTER YAF, 11580 +TIFINAGH LETTER YAK, 11581 +TIFINAGH LETTER TUAREG YAK, 11582 +TIFINAGH LETTER YAKHH, 11583 +TIFINAGH LETTER YAH, 11584 +TIFINAGH LETTER BERBER ACADEMY YAH, 11585 +TIFINAGH LETTER TUAREG YAH, 11586 +TIFINAGH LETTER YAHH, 11587 +TIFINAGH LETTER YAA, 11588 +TIFINAGH LETTER YAKH, 11589 +TIFINAGH LETTER TUAREG YAKH, 11590 +TIFINAGH LETTER YAQ, 11591 +TIFINAGH LETTER TUAREG YAQ, 11592 +TIFINAGH LETTER YI, 11593 +TIFINAGH LETTER YAZH, 11594 +TIFINAGH LETTER AHAGGAR YAZH, 11595 +TIFINAGH LETTER TUAREG YAZH, 11596 +TIFINAGH LETTER YAL, 11597 +TIFINAGH LETTER YAM, 11598 +TIFINAGH LETTER YAN, 11599 +TIFINAGH LETTER TUAREG YAGN, 11600 +TIFINAGH LETTER TUAREG YANG, 11601 +TIFINAGH LETTER YAP, 11602 +TIFINAGH LETTER YU, 11603 +TIFINAGH LETTER YAR, 11604 +TIFINAGH LETTER YARR, 11605 +TIFINAGH LETTER YAGH, 11606 +TIFINAGH LETTER TUAREG YAGH, 11607 +TIFINAGH LETTER AYER YAGH, 11608 +TIFINAGH LETTER YAS, 11609 +TIFINAGH LETTER YASS, 11610 +TIFINAGH LETTER YASH, 11611 +TIFINAGH LETTER YAT, 11612 +TIFINAGH LETTER YATH, 11613 +TIFINAGH LETTER YACH, 11614 +TIFINAGH LETTER YATT, 11615 +TIFINAGH LETTER YAV, 11616 +TIFINAGH LETTER YAW, 11617 +TIFINAGH LETTER YAY, 11618 +TIFINAGH LETTER YAZ, 11619 +TIFINAGH LETTER TAWELLEMET YAZ, 11620 +TIFINAGH LETTER YAZZ, 11621 +TIFINAGH LETTER YE, 11622 +TIFINAGH LETTER YO, 11623 +TIFINAGH MODIFIER LETTER LABIALIZATION MARK, 11631 +TIFINAGH SEPARATOR MARK, 11632 +TIFINAGH CONSONANT JOINER, 11647 +ETHIOPIC SYLLABLE LOA, 11648 +ETHIOPIC SYLLABLE MOA, 11649 +ETHIOPIC SYLLABLE ROA, 11650 +ETHIOPIC SYLLABLE SOA, 11651 +ETHIOPIC SYLLABLE SHOA, 11652 +ETHIOPIC SYLLABLE BOA, 11653 +ETHIOPIC SYLLABLE TOA, 11654 +ETHIOPIC SYLLABLE COA, 11655 +ETHIOPIC SYLLABLE NOA, 11656 +ETHIOPIC SYLLABLE NYOA, 11657 +ETHIOPIC SYLLABLE GLOTTAL OA, 11658 +ETHIOPIC SYLLABLE ZOA, 11659 +ETHIOPIC SYLLABLE DOA, 11660 +ETHIOPIC SYLLABLE DDOA, 11661 +ETHIOPIC SYLLABLE JOA, 11662 +ETHIOPIC SYLLABLE THOA, 11663 +ETHIOPIC SYLLABLE CHOA, 11664 +ETHIOPIC SYLLABLE PHOA, 11665 +ETHIOPIC SYLLABLE POA, 11666 +ETHIOPIC SYLLABLE GGWA, 11667 +ETHIOPIC SYLLABLE GGWI, 11668 +ETHIOPIC SYLLABLE GGWEE, 11669 +ETHIOPIC SYLLABLE GGWE, 11670 +ETHIOPIC SYLLABLE SSA, 11680 +ETHIOPIC SYLLABLE SSU, 11681 +ETHIOPIC SYLLABLE SSI, 11682 +ETHIOPIC SYLLABLE SSAA, 11683 +ETHIOPIC SYLLABLE SSEE, 11684 +ETHIOPIC SYLLABLE SSE, 11685 +ETHIOPIC SYLLABLE SSO, 11686 +ETHIOPIC SYLLABLE CCA, 11688 +ETHIOPIC SYLLABLE CCU, 11689 +ETHIOPIC SYLLABLE CCI, 11690 +ETHIOPIC SYLLABLE CCAA, 11691 +ETHIOPIC SYLLABLE CCEE, 11692 +ETHIOPIC SYLLABLE CCE, 11693 +ETHIOPIC SYLLABLE CCO, 11694 +ETHIOPIC SYLLABLE ZZA, 11696 +ETHIOPIC SYLLABLE ZZU, 11697 +ETHIOPIC SYLLABLE ZZI, 11698 +ETHIOPIC SYLLABLE ZZAA, 11699 +ETHIOPIC SYLLABLE ZZEE, 11700 +ETHIOPIC SYLLABLE ZZE, 11701 +ETHIOPIC SYLLABLE ZZO, 11702 +ETHIOPIC SYLLABLE CCHA, 11704 +ETHIOPIC SYLLABLE CCHU, 11705 +ETHIOPIC SYLLABLE CCHI, 11706 +ETHIOPIC SYLLABLE CCHAA, 11707 +ETHIOPIC SYLLABLE CCHEE, 11708 +ETHIOPIC SYLLABLE CCHE, 11709 +ETHIOPIC SYLLABLE CCHO, 11710 +ETHIOPIC SYLLABLE QYA, 11712 +ETHIOPIC SYLLABLE QYU, 11713 +ETHIOPIC SYLLABLE QYI, 11714 +ETHIOPIC SYLLABLE QYAA, 11715 +ETHIOPIC SYLLABLE QYEE, 11716 +ETHIOPIC SYLLABLE QYE, 11717 +ETHIOPIC SYLLABLE QYO, 11718 +ETHIOPIC SYLLABLE KYA, 11720 +ETHIOPIC SYLLABLE KYU, 11721 +ETHIOPIC SYLLABLE KYI, 11722 +ETHIOPIC SYLLABLE KYAA, 11723 +ETHIOPIC SYLLABLE KYEE, 11724 +ETHIOPIC SYLLABLE KYE, 11725 +ETHIOPIC SYLLABLE KYO, 11726 +ETHIOPIC SYLLABLE XYA, 11728 +ETHIOPIC SYLLABLE XYU, 11729 +ETHIOPIC SYLLABLE XYI, 11730 +ETHIOPIC SYLLABLE XYAA, 11731 +ETHIOPIC SYLLABLE XYEE, 11732 +ETHIOPIC SYLLABLE XYE, 11733 +ETHIOPIC SYLLABLE XYO, 11734 +ETHIOPIC SYLLABLE GYA, 11736 +ETHIOPIC SYLLABLE GYU, 11737 +ETHIOPIC SYLLABLE GYI, 11738 +ETHIOPIC SYLLABLE GYAA, 11739 +ETHIOPIC SYLLABLE GYEE, 11740 +ETHIOPIC SYLLABLE GYE, 11741 +ETHIOPIC SYLLABLE GYO, 11742 +COMBINING CYRILLIC LETTER BE, 11744 +COMBINING CYRILLIC LETTER VE, 11745 +COMBINING CYRILLIC LETTER GHE, 11746 +COMBINING CYRILLIC LETTER DE, 11747 +COMBINING CYRILLIC LETTER ZHE, 11748 +COMBINING CYRILLIC LETTER ZE, 11749 +COMBINING CYRILLIC LETTER KA, 11750 +COMBINING CYRILLIC LETTER EL, 11751 +COMBINING CYRILLIC LETTER EM, 11752 +COMBINING CYRILLIC LETTER EN, 11753 +COMBINING CYRILLIC LETTER O, 11754 +COMBINING CYRILLIC LETTER PE, 11755 +COMBINING CYRILLIC LETTER ER, 11756 +COMBINING CYRILLIC LETTER ES, 11757 +COMBINING CYRILLIC LETTER TE, 11758 +COMBINING CYRILLIC LETTER HA, 11759 +COMBINING CYRILLIC LETTER TSE, 11760 +COMBINING CYRILLIC LETTER CHE, 11761 +COMBINING CYRILLIC LETTER SHA, 11762 +COMBINING CYRILLIC LETTER SHCHA, 11763 +COMBINING CYRILLIC LETTER FITA, 11764 +COMBINING CYRILLIC LETTER ES TE, 11765 +COMBINING CYRILLIC LETTER A, 11766 +COMBINING CYRILLIC LETTER IE, 11767 +COMBINING CYRILLIC LETTER DJERV, 11768 +COMBINING CYRILLIC LETTER MONOGRAPH UK, 11769 +COMBINING CYRILLIC LETTER YAT, 11770 +COMBINING CYRILLIC LETTER YU, 11771 +COMBINING CYRILLIC LETTER IOTIFIED A, 11772 +COMBINING CYRILLIC LETTER LITTLE YUS, 11773 +COMBINING CYRILLIC LETTER BIG YUS, 11774 +COMBINING CYRILLIC LETTER IOTIFIED BIG YUS, 11775 +RIGHT ANGLE SUBSTITUTION MARKER, 11776 +RIGHT ANGLE DOTTED SUBSTITUTION MARKER, 11777 +LEFT SUBSTITUTION BRACKET, 11778 +RIGHT SUBSTITUTION BRACKET, 11779 +LEFT DOTTED SUBSTITUTION BRACKET, 11780 +RIGHT DOTTED SUBSTITUTION BRACKET, 11781 +RAISED INTERPOLATION MARKER, 11782 +RAISED DOTTED INTERPOLATION MARKER, 11783 +DOTTED TRANSPOSITION MARKER, 11784 +LEFT TRANSPOSITION BRACKET, 11785 +RIGHT TRANSPOSITION BRACKET, 11786 +RAISED SQUARE, 11787 +LEFT RAISED OMISSION BRACKET, 11788 +RIGHT RAISED OMISSION BRACKET, 11789 +EDITORIAL CORONIS, 11790 +PARAGRAPHOS, 11791 +FORKED PARAGRAPHOS, 11792 +REVERSED FORKED PARAGRAPHOS, 11793 +HYPODIASTOLE, 11794 +DOTTED OBELOS, 11795 +DOWNWARDS ANCORA, 11796 +UPWARDS ANCORA, 11797 +DOTTED RIGHT POINTING ANGLE, 11798 +DOUBLE OBLIQUE HYPHEN, 11799 +INVERTED INTERROBANG, 11800 +PALM BRANCH, 11801 +HYPHEN WITH DIAERESIS, 11802 +TILDE WITH RING ABOVE, 11803 +LEFT LOW PARAPHRASE BRACKET, 11804 +RIGHT LOW PARAPHRASE BRACKET, 11805 +TILDE WITH DOT ABOVE, 11806 +TILDE WITH DOT BELOW, 11807 +LEFT VERTICAL BAR WITH QUILL, 11808 +RIGHT VERTICAL BAR WITH QUILL, 11809 +TOP LEFT HALF BRACKET, 11810 +TOP RIGHT HALF BRACKET, 11811 +BOTTOM LEFT HALF BRACKET, 11812 +BOTTOM RIGHT HALF BRACKET, 11813 +LEFT SIDEWAYS U BRACKET, 11814 +RIGHT SIDEWAYS U BRACKET, 11815 +LEFT DOUBLE PARENTHESIS, 11816 +RIGHT DOUBLE PARENTHESIS, 11817 +TWO DOTS OVER ONE DOT PUNCTUATION, 11818 +ONE DOT OVER TWO DOTS PUNCTUATION, 11819 +SQUARED FOUR DOT PUNCTUATION, 11820 +FIVE DOT MARK, 11821 +REVERSED QUESTION MARK, 11822 +VERTICAL TILDE, 11823 +RING POINT, 11824 +WORD SEPARATOR MIDDLE DOT, 11825 +TURNED COMMA, 11826 +RAISED DOT, 11827 +RAISED COMMA, 11828 +TURNED SEMICOLON, 11829 +DAGGER WITH LEFT GUARD, 11830 +DAGGER WITH RIGHT GUARD, 11831 +TURNED DAGGER, 11832 +TOP HALF SECTION SIGN, 11833 +TWO EM DASH, 11834 +THREE EM DASH, 11835 +STENOGRAPHIC FULL STOP, 11836 +VERTICAL SIX DOTS, 11837 +WIGGLY VERTICAL LINE, 11838 +CAPITULUM, 11839 +DOUBLE HYPHEN, 11840 +REVERSED COMMA, 11841 +DOUBLE LOW REVERSED 9 QUOTATION MARK, 11842 +DASH WITH LEFT UPTURN, 11843 +DOUBLE SUSPENSION MARK, 11844 +CJK RADICAL REPEAT, 11904 +CJK RADICAL CLIFF, 11905 +CJK RADICAL SECOND ONE, 11906 +CJK RADICAL SECOND TWO, 11907 +CJK RADICAL SECOND THREE, 11908 +CJK RADICAL PERSON, 11909 +CJK RADICAL BOX, 11910 +CJK RADICAL TABLE, 11911 +CJK RADICAL KNIFE ONE, 11912 +CJK RADICAL KNIFE TWO, 11913 +CJK RADICAL DIVINATION, 11914 +CJK RADICAL SEAL, 11915 +CJK RADICAL SMALL ONE, 11916 +CJK RADICAL SMALL TWO, 11917 +CJK RADICAL LAME ONE, 11918 +CJK RADICAL LAME TWO, 11919 +CJK RADICAL LAME THREE, 11920 +CJK RADICAL LAME FOUR, 11921 +CJK RADICAL SNAKE, 11922 +CJK RADICAL THREAD, 11923 +CJK RADICAL SNOUT ONE, 11924 +CJK RADICAL SNOUT TWO, 11925 +CJK RADICAL HEART ONE, 11926 +CJK RADICAL HEART TWO, 11927 +CJK RADICAL HAND, 11928 +CJK RADICAL RAP, 11929 +CJK RADICAL CHOKE, 11931 +CJK RADICAL SUN, 11932 +CJK RADICAL MOON, 11933 +CJK RADICAL DEATH, 11934 +CJK RADICAL MOTHER, 11935 +CJK RADICAL CIVILIAN, 11936 +CJK RADICAL WATER ONE, 11937 +CJK RADICAL WATER TWO, 11938 +CJK RADICAL FIRE, 11939 +CJK RADICAL PAW ONE, 11940 +CJK RADICAL PAW TWO, 11941 +CJK RADICAL SIMPLIFIED HALF TREE TRUNK, 11942 +CJK RADICAL COW, 11943 +CJK RADICAL DOG, 11944 +CJK RADICAL JADE, 11945 +CJK RADICAL BOLT OF CLOTH, 11946 +CJK RADICAL EYE, 11947 +CJK RADICAL SPIRIT ONE, 11948 +CJK RADICAL SPIRIT TWO, 11949 +CJK RADICAL BAMBOO, 11950 +CJK RADICAL SILK, 11951 +CJK RADICAL C SIMPLIFIED SILK, 11952 +CJK RADICAL NET ONE, 11953 +CJK RADICAL NET TWO, 11954 +CJK RADICAL NET THREE, 11955 +CJK RADICAL NET FOUR, 11956 +CJK RADICAL MESH, 11957 +CJK RADICAL SHEEP, 11958 +CJK RADICAL RAM, 11959 +CJK RADICAL EWE, 11960 +CJK RADICAL OLD, 11961 +CJK RADICAL BRUSH ONE, 11962 +CJK RADICAL BRUSH TWO, 11963 +CJK RADICAL MEAT, 11964 +CJK RADICAL MORTAR, 11965 +CJK RADICAL GRASS ONE, 11966 +CJK RADICAL GRASS TWO, 11967 +CJK RADICAL GRASS THREE, 11968 +CJK RADICAL TIGER, 11969 +CJK RADICAL CLOTHES, 11970 +CJK RADICAL WEST ONE, 11971 +CJK RADICAL WEST TWO, 11972 +CJK RADICAL C SIMPLIFIED SEE, 11973 +CJK RADICAL SIMPLIFIED HORN, 11974 +CJK RADICAL HORN, 11975 +CJK RADICAL C SIMPLIFIED SPEECH, 11976 +CJK RADICAL C SIMPLIFIED SHELL, 11977 +CJK RADICAL FOOT, 11978 +CJK RADICAL C SIMPLIFIED CART, 11979 +CJK RADICAL SIMPLIFIED WALK, 11980 +CJK RADICAL WALK ONE, 11981 +CJK RADICAL WALK TWO, 11982 +CJK RADICAL CITY, 11983 +CJK RADICAL C SIMPLIFIED GOLD, 11984 +CJK RADICAL LONG ONE, 11985 +CJK RADICAL LONG TWO, 11986 +CJK RADICAL C SIMPLIFIED LONG, 11987 +CJK RADICAL C SIMPLIFIED GATE, 11988 +CJK RADICAL MOUND ONE, 11989 +CJK RADICAL MOUND TWO, 11990 +CJK RADICAL RAIN, 11991 +CJK RADICAL BLUE, 11992 +CJK RADICAL C SIMPLIFIED TANNED LEATHER, 11993 +CJK RADICAL C SIMPLIFIED LEAF, 11994 +CJK RADICAL C SIMPLIFIED WIND, 11995 +CJK RADICAL C SIMPLIFIED FLY, 11996 +CJK RADICAL EAT ONE, 11997 +CJK RADICAL EAT TWO, 11998 +CJK RADICAL EAT THREE, 11999 +CJK RADICAL C SIMPLIFIED EAT, 12000 +CJK RADICAL HEAD, 12001 +CJK RADICAL C SIMPLIFIED HORSE, 12002 +CJK RADICAL BONE, 12003 +CJK RADICAL GHOST, 12004 +CJK RADICAL C SIMPLIFIED FISH, 12005 +CJK RADICAL C SIMPLIFIED BIRD, 12006 +CJK RADICAL C SIMPLIFIED SALT, 12007 +CJK RADICAL SIMPLIFIED WHEAT, 12008 +CJK RADICAL SIMPLIFIED YELLOW, 12009 +CJK RADICAL C SIMPLIFIED FROG, 12010 +CJK RADICAL J SIMPLIFIED EVEN, 12011 +CJK RADICAL C SIMPLIFIED EVEN, 12012 +CJK RADICAL J SIMPLIFIED TOOTH, 12013 +CJK RADICAL C SIMPLIFIED TOOTH, 12014 +CJK RADICAL J SIMPLIFIED DRAGON, 12015 +CJK RADICAL C SIMPLIFIED DRAGON, 12016 +CJK RADICAL TURTLE, 12017 +CJK RADICAL J SIMPLIFIED TURTLE, 12018 +CJK RADICAL C SIMPLIFIED TURTLE, 12019 +KANGXI RADICAL ONE, 12032 +KANGXI RADICAL LINE, 12033 +KANGXI RADICAL DOT, 12034 +KANGXI RADICAL SLASH, 12035 +KANGXI RADICAL SECOND, 12036 +KANGXI RADICAL HOOK, 12037 +KANGXI RADICAL TWO, 12038 +KANGXI RADICAL LID, 12039 +KANGXI RADICAL MAN, 12040 +KANGXI RADICAL LEGS, 12041 +KANGXI RADICAL ENTER, 12042 +KANGXI RADICAL EIGHT, 12043 +KANGXI RADICAL DOWN BOX, 12044 +KANGXI RADICAL COVER, 12045 +KANGXI RADICAL ICE, 12046 +KANGXI RADICAL TABLE, 12047 +KANGXI RADICAL OPEN BOX, 12048 +KANGXI RADICAL KNIFE, 12049 +KANGXI RADICAL POWER, 12050 +KANGXI RADICAL WRAP, 12051 +KANGXI RADICAL SPOON, 12052 +KANGXI RADICAL RIGHT OPEN BOX, 12053 +KANGXI RADICAL HIDING ENCLOSURE, 12054 +KANGXI RADICAL TEN, 12055 +KANGXI RADICAL DIVINATION, 12056 +KANGXI RADICAL SEAL, 12057 +KANGXI RADICAL CLIFF, 12058 +KANGXI RADICAL PRIVATE, 12059 +KANGXI RADICAL AGAIN, 12060 +KANGXI RADICAL MOUTH, 12061 +KANGXI RADICAL ENCLOSURE, 12062 +KANGXI RADICAL EARTH, 12063 +KANGXI RADICAL SCHOLAR, 12064 +KANGXI RADICAL GO, 12065 +KANGXI RADICAL GO SLOWLY, 12066 +KANGXI RADICAL EVENING, 12067 +KANGXI RADICAL BIG, 12068 +KANGXI RADICAL WOMAN, 12069 +KANGXI RADICAL CHILD, 12070 +KANGXI RADICAL ROOF, 12071 +KANGXI RADICAL INCH, 12072 +KANGXI RADICAL SMALL, 12073 +KANGXI RADICAL LAME, 12074 +KANGXI RADICAL CORPSE, 12075 +KANGXI RADICAL SPROUT, 12076 +KANGXI RADICAL MOUNTAIN, 12077 +KANGXI RADICAL RIVER, 12078 +KANGXI RADICAL WORK, 12079 +KANGXI RADICAL ONESELF, 12080 +KANGXI RADICAL TURBAN, 12081 +KANGXI RADICAL DRY, 12082 +KANGXI RADICAL SHORT THREAD, 12083 +KANGXI RADICAL DOTTED CLIFF, 12084 +KANGXI RADICAL LONG STRIDE, 12085 +KANGXI RADICAL TWO HANDS, 12086 +KANGXI RADICAL SHOOT, 12087 +KANGXI RADICAL BOW, 12088 +KANGXI RADICAL SNOUT, 12089 +KANGXI RADICAL BRISTLE, 12090 +KANGXI RADICAL STEP, 12091 +KANGXI RADICAL HEART, 12092 +KANGXI RADICAL HALBERD, 12093 +KANGXI RADICAL DOOR, 12094 +KANGXI RADICAL HAND, 12095 +KANGXI RADICAL BRANCH, 12096 +KANGXI RADICAL RAP, 12097 +KANGXI RADICAL SCRIPT, 12098 +KANGXI RADICAL DIPPER, 12099 +KANGXI RADICAL AXE, 12100 +KANGXI RADICAL SQUARE, 12101 +KANGXI RADICAL NOT, 12102 +KANGXI RADICAL SUN, 12103 +KANGXI RADICAL SAY, 12104 +KANGXI RADICAL MOON, 12105 +KANGXI RADICAL TREE, 12106 +KANGXI RADICAL LACK, 12107 +KANGXI RADICAL STOP, 12108 +KANGXI RADICAL DEATH, 12109 +KANGXI RADICAL WEAPON, 12110 +KANGXI RADICAL DO NOT, 12111 +KANGXI RADICAL COMPARE, 12112 +KANGXI RADICAL FUR, 12113 +KANGXI RADICAL CLAN, 12114 +KANGXI RADICAL STEAM, 12115 +KANGXI RADICAL WATER, 12116 +KANGXI RADICAL FIRE, 12117 +KANGXI RADICAL CLAW, 12118 +KANGXI RADICAL FATHER, 12119 +KANGXI RADICAL DOUBLE X, 12120 +KANGXI RADICAL HALF TREE TRUNK, 12121 +KANGXI RADICAL SLICE, 12122 +KANGXI RADICAL FANG, 12123 +KANGXI RADICAL COW, 12124 +KANGXI RADICAL DOG, 12125 +KANGXI RADICAL PROFOUND, 12126 +KANGXI RADICAL JADE, 12127 +KANGXI RADICAL MELON, 12128 +KANGXI RADICAL TILE, 12129 +KANGXI RADICAL SWEET, 12130 +KANGXI RADICAL LIFE, 12131 +KANGXI RADICAL USE, 12132 +KANGXI RADICAL FIELD, 12133 +KANGXI RADICAL BOLT OF CLOTH, 12134 +KANGXI RADICAL SICKNESS, 12135 +KANGXI RADICAL DOTTED TENT, 12136 +KANGXI RADICAL WHITE, 12137 +KANGXI RADICAL SKIN, 12138 +KANGXI RADICAL DISH, 12139 +KANGXI RADICAL EYE, 12140 +KANGXI RADICAL SPEAR, 12141 +KANGXI RADICAL ARROW, 12142 +KANGXI RADICAL STONE, 12143 +KANGXI RADICAL SPIRIT, 12144 +KANGXI RADICAL TRACK, 12145 +KANGXI RADICAL GRAIN, 12146 +KANGXI RADICAL CAVE, 12147 +KANGXI RADICAL STAND, 12148 +KANGXI RADICAL BAMBOO, 12149 +KANGXI RADICAL RICE, 12150 +KANGXI RADICAL SILK, 12151 +KANGXI RADICAL JAR, 12152 +KANGXI RADICAL NET, 12153 +KANGXI RADICAL SHEEP, 12154 +KANGXI RADICAL FEATHER, 12155 +KANGXI RADICAL OLD, 12156 +KANGXI RADICAL AND, 12157 +KANGXI RADICAL PLOW, 12158 +KANGXI RADICAL EAR, 12159 +KANGXI RADICAL BRUSH, 12160 +KANGXI RADICAL MEAT, 12161 +KANGXI RADICAL MINISTER, 12162 +KANGXI RADICAL SELF, 12163 +KANGXI RADICAL ARRIVE, 12164 +KANGXI RADICAL MORTAR, 12165 +KANGXI RADICAL TONGUE, 12166 +KANGXI RADICAL OPPOSE, 12167 +KANGXI RADICAL BOAT, 12168 +KANGXI RADICAL STOPPING, 12169 +KANGXI RADICAL COLOR, 12170 +KANGXI RADICAL GRASS, 12171 +KANGXI RADICAL TIGER, 12172 +KANGXI RADICAL INSECT, 12173 +KANGXI RADICAL BLOOD, 12174 +KANGXI RADICAL WALK ENCLOSURE, 12175 +KANGXI RADICAL CLOTHES, 12176 +KANGXI RADICAL WEST, 12177 +KANGXI RADICAL SEE, 12178 +KANGXI RADICAL HORN, 12179 +KANGXI RADICAL SPEECH, 12180 +KANGXI RADICAL VALLEY, 12181 +KANGXI RADICAL BEAN, 12182 +KANGXI RADICAL PIG, 12183 +KANGXI RADICAL BADGER, 12184 +KANGXI RADICAL SHELL, 12185 +KANGXI RADICAL RED, 12186 +KANGXI RADICAL RUN, 12187 +KANGXI RADICAL FOOT, 12188 +KANGXI RADICAL BODY, 12189 +KANGXI RADICAL CART, 12190 +KANGXI RADICAL BITTER, 12191 +KANGXI RADICAL MORNING, 12192 +KANGXI RADICAL WALK, 12193 +KANGXI RADICAL CITY, 12194 +KANGXI RADICAL WINE, 12195 +KANGXI RADICAL DISTINGUISH, 12196 +KANGXI RADICAL VILLAGE, 12197 +KANGXI RADICAL GOLD, 12198 +KANGXI RADICAL LONG, 12199 +KANGXI RADICAL GATE, 12200 +KANGXI RADICAL MOUND, 12201 +KANGXI RADICAL SLAVE, 12202 +KANGXI RADICAL SHORT TAILED BIRD, 12203 +KANGXI RADICAL RAIN, 12204 +KANGXI RADICAL BLUE, 12205 +KANGXI RADICAL WRONG, 12206 +KANGXI RADICAL FACE, 12207 +KANGXI RADICAL LEATHER, 12208 +KANGXI RADICAL TANNED LEATHER, 12209 +KANGXI RADICAL LEEK, 12210 +KANGXI RADICAL SOUND, 12211 +KANGXI RADICAL LEAF, 12212 +KANGXI RADICAL WIND, 12213 +KANGXI RADICAL FLY, 12214 +KANGXI RADICAL EAT, 12215 +KANGXI RADICAL HEAD, 12216 +KANGXI RADICAL FRAGRANT, 12217 +KANGXI RADICAL HORSE, 12218 +KANGXI RADICAL BONE, 12219 +KANGXI RADICAL TALL, 12220 +KANGXI RADICAL HAIR, 12221 +KANGXI RADICAL FIGHT, 12222 +KANGXI RADICAL SACRIFICIAL WINE, 12223 +KANGXI RADICAL CAULDRON, 12224 +KANGXI RADICAL GHOST, 12225 +KANGXI RADICAL FISH, 12226 +KANGXI RADICAL BIRD, 12227 +KANGXI RADICAL SALT, 12228 +KANGXI RADICAL DEER, 12229 +KANGXI RADICAL WHEAT, 12230 +KANGXI RADICAL HEMP, 12231 +KANGXI RADICAL YELLOW, 12232 +KANGXI RADICAL MILLET, 12233 +KANGXI RADICAL BLACK, 12234 +KANGXI RADICAL EMBROIDERY, 12235 +KANGXI RADICAL FROG, 12236 +KANGXI RADICAL TRIPOD, 12237 +KANGXI RADICAL DRUM, 12238 +KANGXI RADICAL RAT, 12239 +KANGXI RADICAL NOSE, 12240 +KANGXI RADICAL EVEN, 12241 +KANGXI RADICAL TOOTH, 12242 +KANGXI RADICAL DRAGON, 12243 +KANGXI RADICAL TURTLE, 12244 +KANGXI RADICAL FLUTE, 12245 +IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT, 12272 +IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW, 12273 +IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT, 12274 +IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW, 12275 +IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND, 12276 +IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE, 12277 +IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW, 12278 +IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT, 12279 +IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT, 12280 +IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT, 12281 +IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT, 12282 +IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID, 12283 +IDEOGRAPHIC SPACE, 12288 +IDEOGRAPHIC COMMA, 12289 +IDEOGRAPHIC FULL STOP, 12290 +DITTO MARK, 12291 +JAPANESE INDUSTRIAL STANDARD SYMBOL, 12292 +IDEOGRAPHIC ITERATION MARK, 12293 +IDEOGRAPHIC CLOSING MARK, 12294 +IDEOGRAPHIC NUMBER ZERO, 12295 +LEFT ANGLE BRACKET, 12296 +RIGHT ANGLE BRACKET, 12297 +LEFT DOUBLE ANGLE BRACKET, 12298 +RIGHT DOUBLE ANGLE BRACKET, 12299 +LEFT CORNER BRACKET, 12300 +RIGHT CORNER BRACKET, 12301 +LEFT WHITE CORNER BRACKET, 12302 +RIGHT WHITE CORNER BRACKET, 12303 +LEFT BLACK LENTICULAR BRACKET, 12304 +RIGHT BLACK LENTICULAR BRACKET, 12305 +POSTAL MARK, 12306 +GETA MARK, 12307 +LEFT TORTOISE SHELL BRACKET, 12308 +RIGHT TORTOISE SHELL BRACKET, 12309 +LEFT WHITE LENTICULAR BRACKET, 12310 +RIGHT WHITE LENTICULAR BRACKET, 12311 +LEFT WHITE TORTOISE SHELL BRACKET, 12312 +RIGHT WHITE TORTOISE SHELL BRACKET, 12313 +LEFT WHITE SQUARE BRACKET, 12314 +RIGHT WHITE SQUARE BRACKET, 12315 +WAVE DASH, 12316 +REVERSED DOUBLE PRIME QUOTATION MARK, 12317 +DOUBLE PRIME QUOTATION MARK, 12318 +LOW DOUBLE PRIME QUOTATION MARK, 12319 +POSTAL MARK FACE, 12320 +HANGZHOU NUMERAL ONE, 12321 +HANGZHOU NUMERAL TWO, 12322 +HANGZHOU NUMERAL THREE, 12323 +HANGZHOU NUMERAL FOUR, 12324 +HANGZHOU NUMERAL FIVE, 12325 +HANGZHOU NUMERAL SIX, 12326 +HANGZHOU NUMERAL SEVEN, 12327 +HANGZHOU NUMERAL EIGHT, 12328 +HANGZHOU NUMERAL NINE, 12329 +IDEOGRAPHIC LEVEL TONE MARK, 12330 +IDEOGRAPHIC RISING TONE MARK, 12331 +IDEOGRAPHIC DEPARTING TONE MARK, 12332 +IDEOGRAPHIC ENTERING TONE MARK, 12333 +HANGUL SINGLE DOT TONE MARK, 12334 +HANGUL DOUBLE DOT TONE MARK, 12335 +WAVY DASH, 12336 +VERTICAL KANA REPEAT MARK, 12337 +VERTICAL KANA REPEAT WITH VOICED SOUND MARK, 12338 +VERTICAL KANA REPEAT MARK UPPER HALF, 12339 +VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF, 12340 +VERTICAL KANA REPEAT MARK LOWER HALF, 12341 +CIRCLED POSTAL MARK, 12342 +IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL, 12343 +HANGZHOU NUMERAL TEN, 12344 +HANGZHOU NUMERAL TWENTY, 12345 +HANGZHOU NUMERAL THIRTY, 12346 +VERTICAL IDEOGRAPHIC ITERATION MARK, 12347 +MASU MARK, 12348 +PART ALTERNATION MARK, 12349 +IDEOGRAPHIC VARIATION INDICATOR, 12350 +IDEOGRAPHIC HALF FILL SPACE, 12351 +HIRAGANA LETTER SMALL A, 12353 +HIRAGANA LETTER A, 12354 +HIRAGANA LETTER SMALL I, 12355 +HIRAGANA LETTER I, 12356 +HIRAGANA LETTER SMALL U, 12357 +HIRAGANA LETTER U, 12358 +HIRAGANA LETTER SMALL E, 12359 +HIRAGANA LETTER E, 12360 +HIRAGANA LETTER SMALL O, 12361 +HIRAGANA LETTER O, 12362 +HIRAGANA LETTER KA, 12363 +HIRAGANA LETTER GA, 12364 +HIRAGANA LETTER KI, 12365 +HIRAGANA LETTER GI, 12366 +HIRAGANA LETTER KU, 12367 +HIRAGANA LETTER GU, 12368 +HIRAGANA LETTER KE, 12369 +HIRAGANA LETTER GE, 12370 +HIRAGANA LETTER KO, 12371 +HIRAGANA LETTER GO, 12372 +HIRAGANA LETTER SA, 12373 +HIRAGANA LETTER ZA, 12374 +HIRAGANA LETTER SI, 12375 +HIRAGANA LETTER ZI, 12376 +HIRAGANA LETTER SU, 12377 +HIRAGANA LETTER ZU, 12378 +HIRAGANA LETTER SE, 12379 +HIRAGANA LETTER ZE, 12380 +HIRAGANA LETTER SO, 12381 +HIRAGANA LETTER ZO, 12382 +HIRAGANA LETTER TA, 12383 +HIRAGANA LETTER DA, 12384 +HIRAGANA LETTER TI, 12385 +HIRAGANA LETTER DI, 12386 +HIRAGANA LETTER SMALL TU, 12387 +HIRAGANA LETTER TU, 12388 +HIRAGANA LETTER DU, 12389 +HIRAGANA LETTER TE, 12390 +HIRAGANA LETTER DE, 12391 +HIRAGANA LETTER TO, 12392 +HIRAGANA LETTER DO, 12393 +HIRAGANA LETTER NA, 12394 +HIRAGANA LETTER NI, 12395 +HIRAGANA LETTER NU, 12396 +HIRAGANA LETTER NE, 12397 +HIRAGANA LETTER NO, 12398 +HIRAGANA LETTER HA, 12399 +HIRAGANA LETTER BA, 12400 +HIRAGANA LETTER PA, 12401 +HIRAGANA LETTER HI, 12402 +HIRAGANA LETTER BI, 12403 +HIRAGANA LETTER PI, 12404 +HIRAGANA LETTER HU, 12405 +HIRAGANA LETTER BU, 12406 +HIRAGANA LETTER PU, 12407 +HIRAGANA LETTER HE, 12408 +HIRAGANA LETTER BE, 12409 +HIRAGANA LETTER PE, 12410 +HIRAGANA LETTER HO, 12411 +HIRAGANA LETTER BO, 12412 +HIRAGANA LETTER PO, 12413 +HIRAGANA LETTER MA, 12414 +HIRAGANA LETTER MI, 12415 +HIRAGANA LETTER MU, 12416 +HIRAGANA LETTER ME, 12417 +HIRAGANA LETTER MO, 12418 +HIRAGANA LETTER SMALL YA, 12419 +HIRAGANA LETTER YA, 12420 +HIRAGANA LETTER SMALL YU, 12421 +HIRAGANA LETTER YU, 12422 +HIRAGANA LETTER SMALL YO, 12423 +HIRAGANA LETTER YO, 12424 +HIRAGANA LETTER RA, 12425 +HIRAGANA LETTER RI, 12426 +HIRAGANA LETTER RU, 12427 +HIRAGANA LETTER RE, 12428 +HIRAGANA LETTER RO, 12429 +HIRAGANA LETTER SMALL WA, 12430 +HIRAGANA LETTER WA, 12431 +HIRAGANA LETTER WI, 12432 +HIRAGANA LETTER WE, 12433 +HIRAGANA LETTER WO, 12434 +HIRAGANA LETTER N, 12435 +HIRAGANA LETTER VU, 12436 +HIRAGANA LETTER SMALL KA, 12437 +HIRAGANA LETTER SMALL KE, 12438 +COMBINING KATAKANA HIRAGANA VOICED SOUND MARK, 12441 +COMBINING KATAKANA HIRAGANA SEMI VOICED SOUND MARK, 12442 +KATAKANA HIRAGANA VOICED SOUND MARK, 12443 +KATAKANA HIRAGANA SEMI VOICED SOUND MARK, 12444 +HIRAGANA ITERATION MARK, 12445 +HIRAGANA VOICED ITERATION MARK, 12446 +HIRAGANA DIGRAPH YORI, 12447 +KATAKANA HIRAGANA DOUBLE HYPHEN, 12448 +KATAKANA LETTER SMALL A, 12449 +KATAKANA LETTER A, 12450 +KATAKANA LETTER SMALL I, 12451 +KATAKANA LETTER I, 12452 +KATAKANA LETTER SMALL U, 12453 +KATAKANA LETTER U, 12454 +KATAKANA LETTER SMALL E, 12455 +KATAKANA LETTER E, 12456 +KATAKANA LETTER SMALL O, 12457 +KATAKANA LETTER O, 12458 +KATAKANA LETTER KA, 12459 +KATAKANA LETTER GA, 12460 +KATAKANA LETTER KI, 12461 +KATAKANA LETTER GI, 12462 +KATAKANA LETTER KU, 12463 +KATAKANA LETTER GU, 12464 +KATAKANA LETTER KE, 12465 +KATAKANA LETTER GE, 12466 +KATAKANA LETTER KO, 12467 +KATAKANA LETTER GO, 12468 +KATAKANA LETTER SA, 12469 +KATAKANA LETTER ZA, 12470 +KATAKANA LETTER SI, 12471 +KATAKANA LETTER ZI, 12472 +KATAKANA LETTER SU, 12473 +KATAKANA LETTER ZU, 12474 +KATAKANA LETTER SE, 12475 +KATAKANA LETTER ZE, 12476 +KATAKANA LETTER SO, 12477 +KATAKANA LETTER ZO, 12478 +KATAKANA LETTER TA, 12479 +KATAKANA LETTER DA, 12480 +KATAKANA LETTER TI, 12481 +KATAKANA LETTER DI, 12482 +KATAKANA LETTER SMALL TU, 12483 +KATAKANA LETTER TU, 12484 +KATAKANA LETTER DU, 12485 +KATAKANA LETTER TE, 12486 +KATAKANA LETTER DE, 12487 +KATAKANA LETTER TO, 12488 +KATAKANA LETTER DO, 12489 +KATAKANA LETTER NA, 12490 +KATAKANA LETTER NI, 12491 +KATAKANA LETTER NU, 12492 +KATAKANA LETTER NE, 12493 +KATAKANA LETTER NO, 12494 +KATAKANA LETTER HA, 12495 +KATAKANA LETTER BA, 12496 +KATAKANA LETTER PA, 12497 +KATAKANA LETTER HI, 12498 +KATAKANA LETTER BI, 12499 +KATAKANA LETTER PI, 12500 +KATAKANA LETTER HU, 12501 +KATAKANA LETTER BU, 12502 +KATAKANA LETTER PU, 12503 +KATAKANA LETTER HE, 12504 +KATAKANA LETTER BE, 12505 +KATAKANA LETTER PE, 12506 +KATAKANA LETTER HO, 12507 +KATAKANA LETTER BO, 12508 +KATAKANA LETTER PO, 12509 +KATAKANA LETTER MA, 12510 +KATAKANA LETTER MI, 12511 +KATAKANA LETTER MU, 12512 +KATAKANA LETTER ME, 12513 +KATAKANA LETTER MO, 12514 +KATAKANA LETTER SMALL YA, 12515 +KATAKANA LETTER YA, 12516 +KATAKANA LETTER SMALL YU, 12517 +KATAKANA LETTER YU, 12518 +KATAKANA LETTER SMALL YO, 12519 +KATAKANA LETTER YO, 12520 +KATAKANA LETTER RA, 12521 +KATAKANA LETTER RI, 12522 +KATAKANA LETTER RU, 12523 +KATAKANA LETTER RE, 12524 +KATAKANA LETTER RO, 12525 +KATAKANA LETTER SMALL WA, 12526 +KATAKANA LETTER WA, 12527 +KATAKANA LETTER WI, 12528 +KATAKANA LETTER WE, 12529 +KATAKANA LETTER WO, 12530 +KATAKANA LETTER N, 12531 +KATAKANA LETTER VU, 12532 +KATAKANA LETTER SMALL KA, 12533 +KATAKANA LETTER SMALL KE, 12534 +KATAKANA LETTER VA, 12535 +KATAKANA LETTER VI, 12536 +KATAKANA LETTER VE, 12537 +KATAKANA LETTER VO, 12538 +KATAKANA MIDDLE DOT, 12539 +KATAKANA HIRAGANA PROLONGED SOUND MARK, 12540 +KATAKANA ITERATION MARK, 12541 +KATAKANA VOICED ITERATION MARK, 12542 +KATAKANA DIGRAPH KOTO, 12543 +BOPOMOFO LETTER B, 12549 +BOPOMOFO LETTER P, 12550 +BOPOMOFO LETTER M, 12551 +BOPOMOFO LETTER F, 12552 +BOPOMOFO LETTER D, 12553 +BOPOMOFO LETTER T, 12554 +BOPOMOFO LETTER N, 12555 +BOPOMOFO LETTER L, 12556 +BOPOMOFO LETTER G, 12557 +BOPOMOFO LETTER K, 12558 +BOPOMOFO LETTER H, 12559 +BOPOMOFO LETTER J, 12560 +BOPOMOFO LETTER Q, 12561 +BOPOMOFO LETTER X, 12562 +BOPOMOFO LETTER ZH, 12563 +BOPOMOFO LETTER CH, 12564 +BOPOMOFO LETTER SH, 12565 +BOPOMOFO LETTER R, 12566 +BOPOMOFO LETTER Z, 12567 +BOPOMOFO LETTER C, 12568 +BOPOMOFO LETTER S, 12569 +BOPOMOFO LETTER A, 12570 +BOPOMOFO LETTER O, 12571 +BOPOMOFO LETTER E, 12572 +BOPOMOFO LETTER EH, 12573 +BOPOMOFO LETTER AI, 12574 +BOPOMOFO LETTER EI, 12575 +BOPOMOFO LETTER AU, 12576 +BOPOMOFO LETTER OU, 12577 +BOPOMOFO LETTER AN, 12578 +BOPOMOFO LETTER EN, 12579 +BOPOMOFO LETTER ANG, 12580 +BOPOMOFO LETTER ENG, 12581 +BOPOMOFO LETTER ER, 12582 +BOPOMOFO LETTER I, 12583 +BOPOMOFO LETTER U, 12584 +BOPOMOFO LETTER IU, 12585 +BOPOMOFO LETTER V, 12586 +BOPOMOFO LETTER NG, 12587 +BOPOMOFO LETTER GN, 12588 +BOPOMOFO LETTER IH, 12589 +HANGUL LETTER KIYEOK, 12593 +HANGUL LETTER SSANGKIYEOK, 12594 +HANGUL LETTER KIYEOK SIOS, 12595 +HANGUL LETTER NIEUN, 12596 +HANGUL LETTER NIEUN CIEUC, 12597 +HANGUL LETTER NIEUN HIEUH, 12598 +HANGUL LETTER TIKEUT, 12599 +HANGUL LETTER SSANGTIKEUT, 12600 +HANGUL LETTER RIEUL, 12601 +HANGUL LETTER RIEUL KIYEOK, 12602 +HANGUL LETTER RIEUL MIEUM, 12603 +HANGUL LETTER RIEUL PIEUP, 12604 +HANGUL LETTER RIEUL SIOS, 12605 +HANGUL LETTER RIEUL THIEUTH, 12606 +HANGUL LETTER RIEUL PHIEUPH, 12607 +HANGUL LETTER RIEUL HIEUH, 12608 +HANGUL LETTER MIEUM, 12609 +HANGUL LETTER PIEUP, 12610 +HANGUL LETTER SSANGPIEUP, 12611 +HANGUL LETTER PIEUP SIOS, 12612 +HANGUL LETTER SIOS, 12613 +HANGUL LETTER SSANGSIOS, 12614 +HANGUL LETTER IEUNG, 12615 +HANGUL LETTER CIEUC, 12616 +HANGUL LETTER SSANGCIEUC, 12617 +HANGUL LETTER CHIEUCH, 12618 +HANGUL LETTER KHIEUKH, 12619 +HANGUL LETTER THIEUTH, 12620 +HANGUL LETTER PHIEUPH, 12621 +HANGUL LETTER HIEUH, 12622 +HANGUL LETTER A, 12623 +HANGUL LETTER AE, 12624 +HANGUL LETTER YA, 12625 +HANGUL LETTER YAE, 12626 +HANGUL LETTER EO, 12627 +HANGUL LETTER E, 12628 +HANGUL LETTER YEO, 12629 +HANGUL LETTER YE, 12630 +HANGUL LETTER O, 12631 +HANGUL LETTER WA, 12632 +HANGUL LETTER WAE, 12633 +HANGUL LETTER OE, 12634 +HANGUL LETTER YO, 12635 +HANGUL LETTER U, 12636 +HANGUL LETTER WEO, 12637 +HANGUL LETTER WE, 12638 +HANGUL LETTER WI, 12639 +HANGUL LETTER YU, 12640 +HANGUL LETTER EU, 12641 +HANGUL LETTER YI, 12642 +HANGUL LETTER I, 12643 +HANGUL FILLER, 12644 +HANGUL LETTER SSANGNIEUN, 12645 +HANGUL LETTER NIEUN TIKEUT, 12646 +HANGUL LETTER NIEUN SIOS, 12647 +HANGUL LETTER NIEUN PANSIOS, 12648 +HANGUL LETTER RIEUL KIYEOK SIOS, 12649 +HANGUL LETTER RIEUL TIKEUT, 12650 +HANGUL LETTER RIEUL PIEUP SIOS, 12651 +HANGUL LETTER RIEUL PANSIOS, 12652 +HANGUL LETTER RIEUL YEORINHIEUH, 12653 +HANGUL LETTER MIEUM PIEUP, 12654 +HANGUL LETTER MIEUM SIOS, 12655 +HANGUL LETTER MIEUM PANSIOS, 12656 +HANGUL LETTER KAPYEOUNMIEUM, 12657 +HANGUL LETTER PIEUP KIYEOK, 12658 +HANGUL LETTER PIEUP TIKEUT, 12659 +HANGUL LETTER PIEUP SIOS KIYEOK, 12660 +HANGUL LETTER PIEUP SIOS TIKEUT, 12661 +HANGUL LETTER PIEUP CIEUC, 12662 +HANGUL LETTER PIEUP THIEUTH, 12663 +HANGUL LETTER KAPYEOUNPIEUP, 12664 +HANGUL LETTER KAPYEOUNSSANGPIEUP, 12665 +HANGUL LETTER SIOS KIYEOK, 12666 +HANGUL LETTER SIOS NIEUN, 12667 +HANGUL LETTER SIOS TIKEUT, 12668 +HANGUL LETTER SIOS PIEUP, 12669 +HANGUL LETTER SIOS CIEUC, 12670 +HANGUL LETTER PANSIOS, 12671 +HANGUL LETTER SSANGIEUNG, 12672 +HANGUL LETTER YESIEUNG, 12673 +HANGUL LETTER YESIEUNG SIOS, 12674 +HANGUL LETTER YESIEUNG PANSIOS, 12675 +HANGUL LETTER KAPYEOUNPHIEUPH, 12676 +HANGUL LETTER SSANGHIEUH, 12677 +HANGUL LETTER YEORINHIEUH, 12678 +HANGUL LETTER YO YA, 12679 +HANGUL LETTER YO YAE, 12680 +HANGUL LETTER YO I, 12681 +HANGUL LETTER YU YEO, 12682 +HANGUL LETTER YU YE, 12683 +HANGUL LETTER YU I, 12684 +HANGUL LETTER ARAEA, 12685 +HANGUL LETTER ARAEAE, 12686 +IDEOGRAPHIC ANNOTATION LINKING MARK, 12688 +IDEOGRAPHIC ANNOTATION REVERSE MARK, 12689 +IDEOGRAPHIC ANNOTATION ONE MARK, 12690 +IDEOGRAPHIC ANNOTATION TWO MARK, 12691 +IDEOGRAPHIC ANNOTATION THREE MARK, 12692 +IDEOGRAPHIC ANNOTATION FOUR MARK, 12693 +IDEOGRAPHIC ANNOTATION TOP MARK, 12694 +IDEOGRAPHIC ANNOTATION MIDDLE MARK, 12695 +IDEOGRAPHIC ANNOTATION BOTTOM MARK, 12696 +IDEOGRAPHIC ANNOTATION FIRST MARK, 12697 +IDEOGRAPHIC ANNOTATION SECOND MARK, 12698 +IDEOGRAPHIC ANNOTATION THIRD MARK, 12699 +IDEOGRAPHIC ANNOTATION FOURTH MARK, 12700 +IDEOGRAPHIC ANNOTATION HEAVEN MARK, 12701 +IDEOGRAPHIC ANNOTATION EARTH MARK, 12702 +IDEOGRAPHIC ANNOTATION MAN MARK, 12703 +BOPOMOFO LETTER BU, 12704 +BOPOMOFO LETTER ZI, 12705 +BOPOMOFO LETTER JI, 12706 +BOPOMOFO LETTER GU, 12707 +BOPOMOFO LETTER EE, 12708 +BOPOMOFO LETTER ENN, 12709 +BOPOMOFO LETTER OO, 12710 +BOPOMOFO LETTER ONN, 12711 +BOPOMOFO LETTER IR, 12712 +BOPOMOFO LETTER ANN, 12713 +BOPOMOFO LETTER INN, 12714 +BOPOMOFO LETTER UNN, 12715 +BOPOMOFO LETTER IM, 12716 +BOPOMOFO LETTER NGG, 12717 +BOPOMOFO LETTER AINN, 12718 +BOPOMOFO LETTER AUNN, 12719 +BOPOMOFO LETTER AM, 12720 +BOPOMOFO LETTER OM, 12721 +BOPOMOFO LETTER ONG, 12722 +BOPOMOFO LETTER INNN, 12723 +BOPOMOFO FINAL LETTER P, 12724 +BOPOMOFO FINAL LETTER T, 12725 +BOPOMOFO FINAL LETTER K, 12726 +BOPOMOFO FINAL LETTER H, 12727 +BOPOMOFO LETTER GH, 12728 +BOPOMOFO LETTER LH, 12729 +BOPOMOFO LETTER ZY, 12730 +CJK STROKE T, 12736 +CJK STROKE WG, 12737 +CJK STROKE XG, 12738 +CJK STROKE BXG, 12739 +CJK STROKE SW, 12740 +CJK STROKE HZZ, 12741 +CJK STROKE HZG, 12742 +CJK STROKE HP, 12743 +CJK STROKE HZWG, 12744 +CJK STROKE SZWG, 12745 +CJK STROKE HZT, 12746 +CJK STROKE HZZP, 12747 +CJK STROKE HPWG, 12748 +CJK STROKE HZW, 12749 +CJK STROKE HZZZ, 12750 +CJK STROKE N, 12751 +CJK STROKE H, 12752 +CJK STROKE S, 12753 +CJK STROKE P, 12754 +CJK STROKE SP, 12755 +CJK STROKE D, 12756 +CJK STROKE HZ, 12757 +CJK STROKE HG, 12758 +CJK STROKE SZ, 12759 +CJK STROKE SWZ, 12760 +CJK STROKE ST, 12761 +CJK STROKE SG, 12762 +CJK STROKE PD, 12763 +CJK STROKE PZ, 12764 +CJK STROKE TN, 12765 +CJK STROKE SZZ, 12766 +CJK STROKE SWG, 12767 +CJK STROKE HXWG, 12768 +CJK STROKE HZZZG, 12769 +CJK STROKE PG, 12770 +CJK STROKE Q, 12771 +KATAKANA LETTER SMALL KU, 12784 +KATAKANA LETTER SMALL SI, 12785 +KATAKANA LETTER SMALL SU, 12786 +KATAKANA LETTER SMALL TO, 12787 +KATAKANA LETTER SMALL NU, 12788 +KATAKANA LETTER SMALL HA, 12789 +KATAKANA LETTER SMALL HI, 12790 +KATAKANA LETTER SMALL HU, 12791 +KATAKANA LETTER SMALL HE, 12792 +KATAKANA LETTER SMALL HO, 12793 +KATAKANA LETTER SMALL MU, 12794 +KATAKANA LETTER SMALL RA, 12795 +KATAKANA LETTER SMALL RI, 12796 +KATAKANA LETTER SMALL RU, 12797 +KATAKANA LETTER SMALL RE, 12798 +KATAKANA LETTER SMALL RO, 12799 +PARENTHESIZED HANGUL KIYEOK, 12800 +PARENTHESIZED HANGUL NIEUN, 12801 +PARENTHESIZED HANGUL TIKEUT, 12802 +PARENTHESIZED HANGUL RIEUL, 12803 +PARENTHESIZED HANGUL MIEUM, 12804 +PARENTHESIZED HANGUL PIEUP, 12805 +PARENTHESIZED HANGUL SIOS, 12806 +PARENTHESIZED HANGUL IEUNG, 12807 +PARENTHESIZED HANGUL CIEUC, 12808 +PARENTHESIZED HANGUL CHIEUCH, 12809 +PARENTHESIZED HANGUL KHIEUKH, 12810 +PARENTHESIZED HANGUL THIEUTH, 12811 +PARENTHESIZED HANGUL PHIEUPH, 12812 +PARENTHESIZED HANGUL HIEUH, 12813 +PARENTHESIZED HANGUL KIYEOK A, 12814 +PARENTHESIZED HANGUL NIEUN A, 12815 +PARENTHESIZED HANGUL TIKEUT A, 12816 +PARENTHESIZED HANGUL RIEUL A, 12817 +PARENTHESIZED HANGUL MIEUM A, 12818 +PARENTHESIZED HANGUL PIEUP A, 12819 +PARENTHESIZED HANGUL SIOS A, 12820 +PARENTHESIZED HANGUL IEUNG A, 12821 +PARENTHESIZED HANGUL CIEUC A, 12822 +PARENTHESIZED HANGUL CHIEUCH A, 12823 +PARENTHESIZED HANGUL KHIEUKH A, 12824 +PARENTHESIZED HANGUL THIEUTH A, 12825 +PARENTHESIZED HANGUL PHIEUPH A, 12826 +PARENTHESIZED HANGUL HIEUH A, 12827 +PARENTHESIZED HANGUL CIEUC U, 12828 +PARENTHESIZED KOREAN CHARACTER OJEON, 12829 +PARENTHESIZED KOREAN CHARACTER O HU, 12830 +PARENTHESIZED IDEOGRAPH ONE, 12832 +PARENTHESIZED IDEOGRAPH TWO, 12833 +PARENTHESIZED IDEOGRAPH THREE, 12834 +PARENTHESIZED IDEOGRAPH FOUR, 12835 +PARENTHESIZED IDEOGRAPH FIVE, 12836 +PARENTHESIZED IDEOGRAPH SIX, 12837 +PARENTHESIZED IDEOGRAPH SEVEN, 12838 +PARENTHESIZED IDEOGRAPH EIGHT, 12839 +PARENTHESIZED IDEOGRAPH NINE, 12840 +PARENTHESIZED IDEOGRAPH TEN, 12841 +PARENTHESIZED IDEOGRAPH MOON, 12842 +PARENTHESIZED IDEOGRAPH FIRE, 12843 +PARENTHESIZED IDEOGRAPH WATER, 12844 +PARENTHESIZED IDEOGRAPH WOOD, 12845 +PARENTHESIZED IDEOGRAPH METAL, 12846 +PARENTHESIZED IDEOGRAPH EARTH, 12847 +PARENTHESIZED IDEOGRAPH SUN, 12848 +PARENTHESIZED IDEOGRAPH STOCK, 12849 +PARENTHESIZED IDEOGRAPH HAVE, 12850 +PARENTHESIZED IDEOGRAPH SOCIETY, 12851 +PARENTHESIZED IDEOGRAPH NAME, 12852 +PARENTHESIZED IDEOGRAPH SPECIAL, 12853 +PARENTHESIZED IDEOGRAPH FINANCIAL, 12854 +PARENTHESIZED IDEOGRAPH CONGRATULATION, 12855 +PARENTHESIZED IDEOGRAPH LABOR, 12856 +PARENTHESIZED IDEOGRAPH REPRESENT, 12857 +PARENTHESIZED IDEOGRAPH CALL, 12858 +PARENTHESIZED IDEOGRAPH STUDY, 12859 +PARENTHESIZED IDEOGRAPH SUPERVISE, 12860 +PARENTHESIZED IDEOGRAPH ENTERPRISE, 12861 +PARENTHESIZED IDEOGRAPH RESOURCE, 12862 +PARENTHESIZED IDEOGRAPH ALLIANCE, 12863 +PARENTHESIZED IDEOGRAPH FESTIVAL, 12864 +PARENTHESIZED IDEOGRAPH REST, 12865 +PARENTHESIZED IDEOGRAPH SELF, 12866 +PARENTHESIZED IDEOGRAPH REACH, 12867 +CIRCLED IDEOGRAPH QUESTION, 12868 +CIRCLED IDEOGRAPH KINDERGARTEN, 12869 +CIRCLED IDEOGRAPH SCHOOL, 12870 +CIRCLED IDEOGRAPH KOTO, 12871 +CIRCLED NUMBER TEN ON BLACK SQUARE, 12872 +CIRCLED NUMBER TWENTY ON BLACK SQUARE, 12873 +CIRCLED NUMBER THIRTY ON BLACK SQUARE, 12874 +CIRCLED NUMBER FORTY ON BLACK SQUARE, 12875 +CIRCLED NUMBER FIFTY ON BLACK SQUARE, 12876 +CIRCLED NUMBER SIXTY ON BLACK SQUARE, 12877 +CIRCLED NUMBER SEVENTY ON BLACK SQUARE, 12878 +CIRCLED NUMBER EIGHTY ON BLACK SQUARE, 12879 +PARTNERSHIP SIGN, 12880 +CIRCLED NUMBER TWENTY ONE, 12881 +CIRCLED NUMBER TWENTY TWO, 12882 +CIRCLED NUMBER TWENTY THREE, 12883 +CIRCLED NUMBER TWENTY FOUR, 12884 +CIRCLED NUMBER TWENTY FIVE, 12885 +CIRCLED NUMBER TWENTY SIX, 12886 +CIRCLED NUMBER TWENTY SEVEN, 12887 +CIRCLED NUMBER TWENTY EIGHT, 12888 +CIRCLED NUMBER TWENTY NINE, 12889 +CIRCLED NUMBER THIRTY, 12890 +CIRCLED NUMBER THIRTY ONE, 12891 +CIRCLED NUMBER THIRTY TWO, 12892 +CIRCLED NUMBER THIRTY THREE, 12893 +CIRCLED NUMBER THIRTY FOUR, 12894 +CIRCLED NUMBER THIRTY FIVE, 12895 +CIRCLED HANGUL KIYEOK, 12896 +CIRCLED HANGUL NIEUN, 12897 +CIRCLED HANGUL TIKEUT, 12898 +CIRCLED HANGUL RIEUL, 12899 +CIRCLED HANGUL MIEUM, 12900 +CIRCLED HANGUL PIEUP, 12901 +CIRCLED HANGUL SIOS, 12902 +CIRCLED HANGUL IEUNG, 12903 +CIRCLED HANGUL CIEUC, 12904 +CIRCLED HANGUL CHIEUCH, 12905 +CIRCLED HANGUL KHIEUKH, 12906 +CIRCLED HANGUL THIEUTH, 12907 +CIRCLED HANGUL PHIEUPH, 12908 +CIRCLED HANGUL HIEUH, 12909 +CIRCLED HANGUL KIYEOK A, 12910 +CIRCLED HANGUL NIEUN A, 12911 +CIRCLED HANGUL TIKEUT A, 12912 +CIRCLED HANGUL RIEUL A, 12913 +CIRCLED HANGUL MIEUM A, 12914 +CIRCLED HANGUL PIEUP A, 12915 +CIRCLED HANGUL SIOS A, 12916 +CIRCLED HANGUL IEUNG A, 12917 +CIRCLED HANGUL CIEUC A, 12918 +CIRCLED HANGUL CHIEUCH A, 12919 +CIRCLED HANGUL KHIEUKH A, 12920 +CIRCLED HANGUL THIEUTH A, 12921 +CIRCLED HANGUL PHIEUPH A, 12922 +CIRCLED HANGUL HIEUH A, 12923 +CIRCLED KOREAN CHARACTER CHAMKO, 12924 +CIRCLED KOREAN CHARACTER JUEUI, 12925 +CIRCLED HANGUL IEUNG U, 12926 +KOREAN STANDARD SYMBOL, 12927 +CIRCLED IDEOGRAPH ONE, 12928 +CIRCLED IDEOGRAPH TWO, 12929 +CIRCLED IDEOGRAPH THREE, 12930 +CIRCLED IDEOGRAPH FOUR, 12931 +CIRCLED IDEOGRAPH FIVE, 12932 +CIRCLED IDEOGRAPH SIX, 12933 +CIRCLED IDEOGRAPH SEVEN, 12934 +CIRCLED IDEOGRAPH EIGHT, 12935 +CIRCLED IDEOGRAPH NINE, 12936 +CIRCLED IDEOGRAPH TEN, 12937 +CIRCLED IDEOGRAPH MOON, 12938 +CIRCLED IDEOGRAPH FIRE, 12939 +CIRCLED IDEOGRAPH WATER, 12940 +CIRCLED IDEOGRAPH WOOD, 12941 +CIRCLED IDEOGRAPH METAL, 12942 +CIRCLED IDEOGRAPH EARTH, 12943 +CIRCLED IDEOGRAPH SUN, 12944 +CIRCLED IDEOGRAPH STOCK, 12945 +CIRCLED IDEOGRAPH HAVE, 12946 +CIRCLED IDEOGRAPH SOCIETY, 12947 +CIRCLED IDEOGRAPH NAME, 12948 +CIRCLED IDEOGRAPH SPECIAL, 12949 +CIRCLED IDEOGRAPH FINANCIAL, 12950 +CIRCLED IDEOGRAPH CONGRATULATION, 12951 +CIRCLED IDEOGRAPH LABOR, 12952 +CIRCLED IDEOGRAPH SECRET, 12953 +CIRCLED IDEOGRAPH MALE, 12954 +CIRCLED IDEOGRAPH FEMALE, 12955 +CIRCLED IDEOGRAPH SUITABLE, 12956 +CIRCLED IDEOGRAPH EXCELLENT, 12957 +CIRCLED IDEOGRAPH PRINT, 12958 +CIRCLED IDEOGRAPH ATTENTION, 12959 +CIRCLED IDEOGRAPH ITEM, 12960 +CIRCLED IDEOGRAPH REST, 12961 +CIRCLED IDEOGRAPH COPY, 12962 +CIRCLED IDEOGRAPH CORRECT, 12963 +CIRCLED IDEOGRAPH HIGH, 12964 +CIRCLED IDEOGRAPH CENTRE, 12965 +CIRCLED IDEOGRAPH LOW, 12966 +CIRCLED IDEOGRAPH LEFT, 12967 +CIRCLED IDEOGRAPH RIGHT, 12968 +CIRCLED IDEOGRAPH MEDICINE, 12969 +CIRCLED IDEOGRAPH RELIGION, 12970 +CIRCLED IDEOGRAPH STUDY, 12971 +CIRCLED IDEOGRAPH SUPERVISE, 12972 +CIRCLED IDEOGRAPH ENTERPRISE, 12973 +CIRCLED IDEOGRAPH RESOURCE, 12974 +CIRCLED IDEOGRAPH ALLIANCE, 12975 +CIRCLED IDEOGRAPH NIGHT, 12976 +CIRCLED NUMBER THIRTY SIX, 12977 +CIRCLED NUMBER THIRTY SEVEN, 12978 +CIRCLED NUMBER THIRTY EIGHT, 12979 +CIRCLED NUMBER THIRTY NINE, 12980 +CIRCLED NUMBER FORTY, 12981 +CIRCLED NUMBER FORTY ONE, 12982 +CIRCLED NUMBER FORTY TWO, 12983 +CIRCLED NUMBER FORTY THREE, 12984 +CIRCLED NUMBER FORTY FOUR, 12985 +CIRCLED NUMBER FORTY FIVE, 12986 +CIRCLED NUMBER FORTY SIX, 12987 +CIRCLED NUMBER FORTY SEVEN, 12988 +CIRCLED NUMBER FORTY EIGHT, 12989 +CIRCLED NUMBER FORTY NINE, 12990 +CIRCLED NUMBER FIFTY, 12991 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY, 12992 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY, 12993 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH, 12994 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL, 12995 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY, 12996 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE, 12997 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY, 12998 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST, 12999 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER, 13000 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER, 13001 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER, 13002 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER, 13003 +SQUARE HG, 13004 +SQUARE ERG, 13005 +SQUARE EV, 13006 +LIMITED LIABILITY SIGN, 13007 +CIRCLED KATAKANA A, 13008 +CIRCLED KATAKANA I, 13009 +CIRCLED KATAKANA U, 13010 +CIRCLED KATAKANA E, 13011 +CIRCLED KATAKANA O, 13012 +CIRCLED KATAKANA KA, 13013 +CIRCLED KATAKANA KI, 13014 +CIRCLED KATAKANA KU, 13015 +CIRCLED KATAKANA KE, 13016 +CIRCLED KATAKANA KO, 13017 +CIRCLED KATAKANA SA, 13018 +CIRCLED KATAKANA SI, 13019 +CIRCLED KATAKANA SU, 13020 +CIRCLED KATAKANA SE, 13021 +CIRCLED KATAKANA SO, 13022 +CIRCLED KATAKANA TA, 13023 +CIRCLED KATAKANA TI, 13024 +CIRCLED KATAKANA TU, 13025 +CIRCLED KATAKANA TE, 13026 +CIRCLED KATAKANA TO, 13027 +CIRCLED KATAKANA NA, 13028 +CIRCLED KATAKANA NI, 13029 +CIRCLED KATAKANA NU, 13030 +CIRCLED KATAKANA NE, 13031 +CIRCLED KATAKANA NO, 13032 +CIRCLED KATAKANA HA, 13033 +CIRCLED KATAKANA HI, 13034 +CIRCLED KATAKANA HU, 13035 +CIRCLED KATAKANA HE, 13036 +CIRCLED KATAKANA HO, 13037 +CIRCLED KATAKANA MA, 13038 +CIRCLED KATAKANA MI, 13039 +CIRCLED KATAKANA MU, 13040 +CIRCLED KATAKANA ME, 13041 +CIRCLED KATAKANA MO, 13042 +CIRCLED KATAKANA YA, 13043 +CIRCLED KATAKANA YU, 13044 +CIRCLED KATAKANA YO, 13045 +CIRCLED KATAKANA RA, 13046 +CIRCLED KATAKANA RI, 13047 +CIRCLED KATAKANA RU, 13048 +CIRCLED KATAKANA RE, 13049 +CIRCLED KATAKANA RO, 13050 +CIRCLED KATAKANA WA, 13051 +CIRCLED KATAKANA WI, 13052 +CIRCLED KATAKANA WE, 13053 +CIRCLED KATAKANA WO, 13054 +SQUARE APAATO, 13056 +SQUARE ARUHUA, 13057 +SQUARE ANPEA, 13058 +SQUARE AARU, 13059 +SQUARE ININGU, 13060 +SQUARE INTI, 13061 +SQUARE UON, 13062 +SQUARE ESUKUUDO, 13063 +SQUARE EEKAA, 13064 +SQUARE ONSU, 13065 +SQUARE OOMU, 13066 +SQUARE KAIRI, 13067 +SQUARE KARATTO, 13068 +SQUARE KARORII, 13069 +SQUARE GARON, 13070 +SQUARE GANMA, 13071 +SQUARE GIGA, 13072 +SQUARE GINII, 13073 +SQUARE KYURII, 13074 +SQUARE GIRUDAA, 13075 +SQUARE KIRO, 13076 +SQUARE KIROGURAMU, 13077 +SQUARE KIROMEETORU, 13078 +SQUARE KIROWATTO, 13079 +SQUARE GURAMU, 13080 +SQUARE GURAMUTON, 13081 +SQUARE KURUZEIRO, 13082 +SQUARE KUROONE, 13083 +SQUARE KEESU, 13084 +SQUARE KORUNA, 13085 +SQUARE KOOPO, 13086 +SQUARE SAIKURU, 13087 +SQUARE SANTIIMU, 13088 +SQUARE SIRINGU, 13089 +SQUARE SENTI, 13090 +SQUARE SENTO, 13091 +SQUARE DAASU, 13092 +SQUARE DESI, 13093 +SQUARE DORU, 13094 +SQUARE TON, 13095 +SQUARE NANO, 13096 +SQUARE NOTTO, 13097 +SQUARE HAITU, 13098 +SQUARE PAASENTO, 13099 +SQUARE PAATU, 13100 +SQUARE BAARERU, 13101 +SQUARE PIASUTORU, 13102 +SQUARE PIKURU, 13103 +SQUARE PIKO, 13104 +SQUARE BIRU, 13105 +SQUARE HUARADDO, 13106 +SQUARE HUIITO, 13107 +SQUARE BUSSYERU, 13108 +SQUARE HURAN, 13109 +SQUARE HEKUTAARU, 13110 +SQUARE PESO, 13111 +SQUARE PENIHI, 13112 +SQUARE HERUTU, 13113 +SQUARE PENSU, 13114 +SQUARE PEEZI, 13115 +SQUARE BEETA, 13116 +SQUARE POINTO, 13117 +SQUARE BORUTO, 13118 +SQUARE HON, 13119 +SQUARE PONDO, 13120 +SQUARE HOORU, 13121 +SQUARE HOON, 13122 +SQUARE MAIKURO, 13123 +SQUARE MAIRU, 13124 +SQUARE MAHHA, 13125 +SQUARE MARUKU, 13126 +SQUARE MANSYON, 13127 +SQUARE MIKURON, 13128 +SQUARE MIRI, 13129 +SQUARE MIRIBAARU, 13130 +SQUARE MEGA, 13131 +SQUARE MEGATON, 13132 +SQUARE MEETORU, 13133 +SQUARE YAADO, 13134 +SQUARE YAARU, 13135 +SQUARE YUAN, 13136 +SQUARE RITTORU, 13137 +SQUARE RIRA, 13138 +SQUARE RUPII, 13139 +SQUARE RUUBURU, 13140 +SQUARE REMU, 13141 +SQUARE RENTOGEN, 13142 +SQUARE WATTO, 13143 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO, 13144 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE, 13145 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO, 13146 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE, 13147 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR, 13148 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE, 13149 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX, 13150 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN, 13151 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT, 13152 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE, 13153 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN, 13154 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN, 13155 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE, 13156 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN, 13157 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN, 13158 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN, 13159 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN, 13160 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN, 13161 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN, 13162 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN, 13163 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY, 13164 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY ONE, 13165 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY TWO, 13166 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY THREE, 13167 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY FOUR, 13168 +SQUARE HPA, 13169 +SQUARE DA, 13170 +SQUARE AU, 13171 +SQUARE BAR, 13172 +SQUARE OV, 13173 +SQUARE PC, 13174 +SQUARE DM, 13175 +SQUARE DM SQUARED, 13176 +SQUARE DM CUBED, 13177 +SQUARE IU, 13178 +SQUARE ERA NAME HEISEI, 13179 +SQUARE ERA NAME SYOUWA, 13180 +SQUARE ERA NAME TAISYOU, 13181 +SQUARE ERA NAME MEIZI, 13182 +SQUARE CORPORATION, 13183 +SQUARE PA AMPS, 13184 +SQUARE NA, 13185 +SQUARE MU A, 13186 +SQUARE MA, 13187 +SQUARE KA, 13188 +SQUARE KB, 13189 +SQUARE MB, 13190 +SQUARE GB, 13191 +SQUARE CAL, 13192 +SQUARE KCAL, 13193 +SQUARE PF, 13194 +SQUARE NF, 13195 +SQUARE MU F, 13196 +SQUARE MU G, 13197 +SQUARE MG, 13198 +SQUARE KG, 13199 +SQUARE HZ, 13200 +SQUARE KHZ, 13201 +SQUARE MHZ, 13202 +SQUARE GHZ, 13203 +SQUARE THZ, 13204 +SQUARE MU L, 13205 +SQUARE ML, 13206 +SQUARE DL, 13207 +SQUARE KL, 13208 +SQUARE FM, 13209 +SQUARE NM, 13210 +SQUARE MU M, 13211 +SQUARE MM, 13212 +SQUARE CM, 13213 +SQUARE KM, 13214 +SQUARE MM SQUARED, 13215 +SQUARE CM SQUARED, 13216 +SQUARE M SQUARED, 13217 +SQUARE KM SQUARED, 13218 +SQUARE MM CUBED, 13219 +SQUARE CM CUBED, 13220 +SQUARE M CUBED, 13221 +SQUARE KM CUBED, 13222 +SQUARE M OVER S, 13223 +SQUARE M OVER S SQUARED, 13224 +SQUARE PA, 13225 +SQUARE KPA, 13226 +SQUARE MPA, 13227 +SQUARE GPA, 13228 +SQUARE RAD, 13229 +SQUARE RAD OVER S, 13230 +SQUARE RAD OVER S SQUARED, 13231 +SQUARE PS, 13232 +SQUARE NS, 13233 +SQUARE MU S, 13234 +SQUARE MS, 13235 +SQUARE PV, 13236 +SQUARE NV, 13237 +SQUARE MU V, 13238 +SQUARE MV, 13239 +SQUARE KV, 13240 +SQUARE MV MEGA, 13241 +SQUARE PW, 13242 +SQUARE NW, 13243 +SQUARE MU W, 13244 +SQUARE MW, 13245 +SQUARE KW, 13246 +SQUARE MW MEGA, 13247 +SQUARE K OHM, 13248 +SQUARE M OHM, 13249 +SQUARE AM, 13250 +SQUARE BQ, 13251 +SQUARE CC, 13252 +SQUARE CD, 13253 +SQUARE C OVER KG, 13254 +SQUARE CO, 13255 +SQUARE DB, 13256 +SQUARE GY, 13257 +SQUARE HA, 13258 +SQUARE HP, 13259 +SQUARE IN, 13260 +SQUARE KK, 13261 +SQUARE KM CAPITAL, 13262 +SQUARE KT, 13263 +SQUARE LM, 13264 +SQUARE LN, 13265 +SQUARE LOG, 13266 +SQUARE LX, 13267 +SQUARE MB SMALL, 13268 +SQUARE MIL, 13269 +SQUARE MOL, 13270 +SQUARE PH, 13271 +SQUARE PM, 13272 +SQUARE PPM, 13273 +SQUARE PR, 13274 +SQUARE SR, 13275 +SQUARE SV, 13276 +SQUARE WB, 13277 +SQUARE V OVER M, 13278 +SQUARE A OVER M, 13279 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE, 13280 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO, 13281 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE, 13282 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR, 13283 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE, 13284 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX, 13285 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN, 13286 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT, 13287 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE, 13288 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN, 13289 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN, 13290 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE, 13291 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN, 13292 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN, 13293 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN, 13294 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN, 13295 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN, 13296 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN, 13297 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN, 13298 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY, 13299 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY ONE, 13300 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY TWO, 13301 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY THREE, 13302 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY FOUR, 13303 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY FIVE, 13304 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY SIX, 13305 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY SEVEN, 13306 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY EIGHT, 13307 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY NINE, 13308 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY, 13309 +IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY ONE, 13310 +SQUARE GAL, 13311 +HEXAGRAM FOR THE CREATIVE HEAVEN, 19904 +HEXAGRAM FOR THE RECEPTIVE EARTH, 19905 +HEXAGRAM FOR DIFFICULTY AT THE BEGINNING, 19906 +HEXAGRAM FOR YOUTHFUL FOLLY, 19907 +HEXAGRAM FOR WAITING, 19908 +HEXAGRAM FOR CONFLICT, 19909 +HEXAGRAM FOR THE ARMY, 19910 +HEXAGRAM FOR HOLDING TOGETHER, 19911 +HEXAGRAM FOR SMALL TAMING, 19912 +HEXAGRAM FOR TREADING, 19913 +HEXAGRAM FOR PEACE, 19914 +HEXAGRAM FOR STANDSTILL, 19915 +HEXAGRAM FOR FELLOWSHIP, 19916 +HEXAGRAM FOR GREAT POSSESSION, 19917 +HEXAGRAM FOR MODESTY, 19918 +HEXAGRAM FOR ENTHUSIASM, 19919 +HEXAGRAM FOR FOLLOWING, 19920 +HEXAGRAM FOR WORK ON THE DECAYED, 19921 +HEXAGRAM FOR APPROACH, 19922 +HEXAGRAM FOR CONTEMPLATION, 19923 +HEXAGRAM FOR BITING THROUGH, 19924 +HEXAGRAM FOR GRACE, 19925 +HEXAGRAM FOR SPLITTING APART, 19926 +HEXAGRAM FOR RETURN, 19927 +HEXAGRAM FOR INNOCENCE, 19928 +HEXAGRAM FOR GREAT TAMING, 19929 +HEXAGRAM FOR MOUTH CORNERS, 19930 +HEXAGRAM FOR GREAT PREPONDERANCE, 19931 +HEXAGRAM FOR THE ABYSMAL WATER, 19932 +HEXAGRAM FOR THE CLINGING FIRE, 19933 +HEXAGRAM FOR INFLUENCE, 19934 +HEXAGRAM FOR DURATION, 19935 +HEXAGRAM FOR RETREAT, 19936 +HEXAGRAM FOR GREAT POWER, 19937 +HEXAGRAM FOR PROGRESS, 19938 +HEXAGRAM FOR DARKENING OF THE LIGHT, 19939 +HEXAGRAM FOR THE FAMILY, 19940 +HEXAGRAM FOR OPPOSITION, 19941 +HEXAGRAM FOR OBSTRUCTION, 19942 +HEXAGRAM FOR DELIVERANCE, 19943 +HEXAGRAM FOR DECREASE, 19944 +HEXAGRAM FOR INCREASE, 19945 +HEXAGRAM FOR BREAKTHROUGH, 19946 +HEXAGRAM FOR COMING TO MEET, 19947 +HEXAGRAM FOR GATHERING TOGETHER, 19948 +HEXAGRAM FOR PUSHING UPWARD, 19949 +HEXAGRAM FOR OPPRESSION, 19950 +HEXAGRAM FOR THE WELL, 19951 +HEXAGRAM FOR REVOLUTION, 19952 +HEXAGRAM FOR THE CAULDRON, 19953 +HEXAGRAM FOR THE AROUSING THUNDER, 19954 +HEXAGRAM FOR THE KEEPING STILL MOUNTAIN, 19955 +HEXAGRAM FOR DEVELOPMENT, 19956 +HEXAGRAM FOR THE MARRYING MAIDEN, 19957 +HEXAGRAM FOR ABUNDANCE, 19958 +HEXAGRAM FOR THE WANDERER, 19959 +HEXAGRAM FOR THE GENTLE WIND, 19960 +HEXAGRAM FOR THE JOYOUS LAKE, 19961 +HEXAGRAM FOR DISPERSION, 19962 +HEXAGRAM FOR LIMITATION, 19963 +HEXAGRAM FOR INNER TRUTH, 19964 +HEXAGRAM FOR SMALL PREPONDERANCE, 19965 +HEXAGRAM FOR AFTER COMPLETION, 19966 +HEXAGRAM FOR BEFORE COMPLETION, 19967 +YI SYLLABLE IT, 40960 +YI SYLLABLE IX, 40961 +YI SYLLABLE I, 40962 +YI SYLLABLE IP, 40963 +YI SYLLABLE IET, 40964 +YI SYLLABLE IEX, 40965 +YI SYLLABLE IE, 40966 +YI SYLLABLE IEP, 40967 +YI SYLLABLE AT, 40968 +YI SYLLABLE AX, 40969 +YI SYLLABLE A, 40970 +YI SYLLABLE AP, 40971 +YI SYLLABLE UOX, 40972 +YI SYLLABLE UO, 40973 +YI SYLLABLE UOP, 40974 +YI SYLLABLE OT, 40975 +YI SYLLABLE OX, 40976 +YI SYLLABLE O, 40977 +YI SYLLABLE OP, 40978 +YI SYLLABLE EX, 40979 +YI SYLLABLE E, 40980 +YI SYLLABLE WU, 40981 +YI SYLLABLE BIT, 40982 +YI SYLLABLE BIX, 40983 +YI SYLLABLE BI, 40984 +YI SYLLABLE BIP, 40985 +YI SYLLABLE BIET, 40986 +YI SYLLABLE BIEX, 40987 +YI SYLLABLE BIE, 40988 +YI SYLLABLE BIEP, 40989 +YI SYLLABLE BAT, 40990 +YI SYLLABLE BAX, 40991 +YI SYLLABLE BA, 40992 +YI SYLLABLE BAP, 40993 +YI SYLLABLE BUOX, 40994 +YI SYLLABLE BUO, 40995 +YI SYLLABLE BUOP, 40996 +YI SYLLABLE BOT, 40997 +YI SYLLABLE BOX, 40998 +YI SYLLABLE BO, 40999 +YI SYLLABLE BOP, 41000 +YI SYLLABLE BEX, 41001 +YI SYLLABLE BE, 41002 +YI SYLLABLE BEP, 41003 +YI SYLLABLE BUT, 41004 +YI SYLLABLE BUX, 41005 +YI SYLLABLE BU, 41006 +YI SYLLABLE BUP, 41007 +YI SYLLABLE BURX, 41008 +YI SYLLABLE BUR, 41009 +YI SYLLABLE BYT, 41010 +YI SYLLABLE BYX, 41011 +YI SYLLABLE BY, 41012 +YI SYLLABLE BYP, 41013 +YI SYLLABLE BYRX, 41014 +YI SYLLABLE BYR, 41015 +YI SYLLABLE PIT, 41016 +YI SYLLABLE PIX, 41017 +YI SYLLABLE PI, 41018 +YI SYLLABLE PIP, 41019 +YI SYLLABLE PIEX, 41020 +YI SYLLABLE PIE, 41021 +YI SYLLABLE PIEP, 41022 +YI SYLLABLE PAT, 41023 +YI SYLLABLE PAX, 41024 +YI SYLLABLE PA, 41025 +YI SYLLABLE PAP, 41026 +YI SYLLABLE PUOX, 41027 +YI SYLLABLE PUO, 41028 +YI SYLLABLE PUOP, 41029 +YI SYLLABLE POT, 41030 +YI SYLLABLE POX, 41031 +YI SYLLABLE PO, 41032 +YI SYLLABLE POP, 41033 +YI SYLLABLE PUT, 41034 +YI SYLLABLE PUX, 41035 +YI SYLLABLE PU, 41036 +YI SYLLABLE PUP, 41037 +YI SYLLABLE PURX, 41038 +YI SYLLABLE PUR, 41039 +YI SYLLABLE PYT, 41040 +YI SYLLABLE PYX, 41041 +YI SYLLABLE PY, 41042 +YI SYLLABLE PYP, 41043 +YI SYLLABLE PYRX, 41044 +YI SYLLABLE PYR, 41045 +YI SYLLABLE BBIT, 41046 +YI SYLLABLE BBIX, 41047 +YI SYLLABLE BBI, 41048 +YI SYLLABLE BBIP, 41049 +YI SYLLABLE BBIET, 41050 +YI SYLLABLE BBIEX, 41051 +YI SYLLABLE BBIE, 41052 +YI SYLLABLE BBIEP, 41053 +YI SYLLABLE BBAT, 41054 +YI SYLLABLE BBAX, 41055 +YI SYLLABLE BBA, 41056 +YI SYLLABLE BBAP, 41057 +YI SYLLABLE BBUOX, 41058 +YI SYLLABLE BBUO, 41059 +YI SYLLABLE BBUOP, 41060 +YI SYLLABLE BBOT, 41061 +YI SYLLABLE BBOX, 41062 +YI SYLLABLE BBO, 41063 +YI SYLLABLE BBOP, 41064 +YI SYLLABLE BBEX, 41065 +YI SYLLABLE BBE, 41066 +YI SYLLABLE BBEP, 41067 +YI SYLLABLE BBUT, 41068 +YI SYLLABLE BBUX, 41069 +YI SYLLABLE BBU, 41070 +YI SYLLABLE BBUP, 41071 +YI SYLLABLE BBURX, 41072 +YI SYLLABLE BBUR, 41073 +YI SYLLABLE BBYT, 41074 +YI SYLLABLE BBYX, 41075 +YI SYLLABLE BBY, 41076 +YI SYLLABLE BBYP, 41077 +YI SYLLABLE NBIT, 41078 +YI SYLLABLE NBIX, 41079 +YI SYLLABLE NBI, 41080 +YI SYLLABLE NBIP, 41081 +YI SYLLABLE NBIEX, 41082 +YI SYLLABLE NBIE, 41083 +YI SYLLABLE NBIEP, 41084 +YI SYLLABLE NBAT, 41085 +YI SYLLABLE NBAX, 41086 +YI SYLLABLE NBA, 41087 +YI SYLLABLE NBAP, 41088 +YI SYLLABLE NBOT, 41089 +YI SYLLABLE NBOX, 41090 +YI SYLLABLE NBO, 41091 +YI SYLLABLE NBOP, 41092 +YI SYLLABLE NBUT, 41093 +YI SYLLABLE NBUX, 41094 +YI SYLLABLE NBU, 41095 +YI SYLLABLE NBUP, 41096 +YI SYLLABLE NBURX, 41097 +YI SYLLABLE NBUR, 41098 +YI SYLLABLE NBYT, 41099 +YI SYLLABLE NBYX, 41100 +YI SYLLABLE NBY, 41101 +YI SYLLABLE NBYP, 41102 +YI SYLLABLE NBYRX, 41103 +YI SYLLABLE NBYR, 41104 +YI SYLLABLE HMIT, 41105 +YI SYLLABLE HMIX, 41106 +YI SYLLABLE HMI, 41107 +YI SYLLABLE HMIP, 41108 +YI SYLLABLE HMIEX, 41109 +YI SYLLABLE HMIE, 41110 +YI SYLLABLE HMIEP, 41111 +YI SYLLABLE HMAT, 41112 +YI SYLLABLE HMAX, 41113 +YI SYLLABLE HMA, 41114 +YI SYLLABLE HMAP, 41115 +YI SYLLABLE HMUOX, 41116 +YI SYLLABLE HMUO, 41117 +YI SYLLABLE HMUOP, 41118 +YI SYLLABLE HMOT, 41119 +YI SYLLABLE HMOX, 41120 +YI SYLLABLE HMO, 41121 +YI SYLLABLE HMOP, 41122 +YI SYLLABLE HMUT, 41123 +YI SYLLABLE HMUX, 41124 +YI SYLLABLE HMU, 41125 +YI SYLLABLE HMUP, 41126 +YI SYLLABLE HMURX, 41127 +YI SYLLABLE HMUR, 41128 +YI SYLLABLE HMYX, 41129 +YI SYLLABLE HMY, 41130 +YI SYLLABLE HMYP, 41131 +YI SYLLABLE HMYRX, 41132 +YI SYLLABLE HMYR, 41133 +YI SYLLABLE MIT, 41134 +YI SYLLABLE MIX, 41135 +YI SYLLABLE MI, 41136 +YI SYLLABLE MIP, 41137 +YI SYLLABLE MIEX, 41138 +YI SYLLABLE MIE, 41139 +YI SYLLABLE MIEP, 41140 +YI SYLLABLE MAT, 41141 +YI SYLLABLE MAX, 41142 +YI SYLLABLE MA, 41143 +YI SYLLABLE MAP, 41144 +YI SYLLABLE MUOT, 41145 +YI SYLLABLE MUOX, 41146 +YI SYLLABLE MUO, 41147 +YI SYLLABLE MUOP, 41148 +YI SYLLABLE MOT, 41149 +YI SYLLABLE MOX, 41150 +YI SYLLABLE MO, 41151 +YI SYLLABLE MOP, 41152 +YI SYLLABLE MEX, 41153 +YI SYLLABLE ME, 41154 +YI SYLLABLE MUT, 41155 +YI SYLLABLE MUX, 41156 +YI SYLLABLE MU, 41157 +YI SYLLABLE MUP, 41158 +YI SYLLABLE MURX, 41159 +YI SYLLABLE MUR, 41160 +YI SYLLABLE MYT, 41161 +YI SYLLABLE MYX, 41162 +YI SYLLABLE MY, 41163 +YI SYLLABLE MYP, 41164 +YI SYLLABLE FIT, 41165 +YI SYLLABLE FIX, 41166 +YI SYLLABLE FI, 41167 +YI SYLLABLE FIP, 41168 +YI SYLLABLE FAT, 41169 +YI SYLLABLE FAX, 41170 +YI SYLLABLE FA, 41171 +YI SYLLABLE FAP, 41172 +YI SYLLABLE FOX, 41173 +YI SYLLABLE FO, 41174 +YI SYLLABLE FOP, 41175 +YI SYLLABLE FUT, 41176 +YI SYLLABLE FUX, 41177 +YI SYLLABLE FU, 41178 +YI SYLLABLE FUP, 41179 +YI SYLLABLE FURX, 41180 +YI SYLLABLE FUR, 41181 +YI SYLLABLE FYT, 41182 +YI SYLLABLE FYX, 41183 +YI SYLLABLE FY, 41184 +YI SYLLABLE FYP, 41185 +YI SYLLABLE VIT, 41186 +YI SYLLABLE VIX, 41187 +YI SYLLABLE VI, 41188 +YI SYLLABLE VIP, 41189 +YI SYLLABLE VIET, 41190 +YI SYLLABLE VIEX, 41191 +YI SYLLABLE VIE, 41192 +YI SYLLABLE VIEP, 41193 +YI SYLLABLE VAT, 41194 +YI SYLLABLE VAX, 41195 +YI SYLLABLE VA, 41196 +YI SYLLABLE VAP, 41197 +YI SYLLABLE VOT, 41198 +YI SYLLABLE VOX, 41199 +YI SYLLABLE VO, 41200 +YI SYLLABLE VOP, 41201 +YI SYLLABLE VEX, 41202 +YI SYLLABLE VEP, 41203 +YI SYLLABLE VUT, 41204 +YI SYLLABLE VUX, 41205 +YI SYLLABLE VU, 41206 +YI SYLLABLE VUP, 41207 +YI SYLLABLE VURX, 41208 +YI SYLLABLE VUR, 41209 +YI SYLLABLE VYT, 41210 +YI SYLLABLE VYX, 41211 +YI SYLLABLE VY, 41212 +YI SYLLABLE VYP, 41213 +YI SYLLABLE VYRX, 41214 +YI SYLLABLE VYR, 41215 +YI SYLLABLE DIT, 41216 +YI SYLLABLE DIX, 41217 +YI SYLLABLE DI, 41218 +YI SYLLABLE DIP, 41219 +YI SYLLABLE DIEX, 41220 +YI SYLLABLE DIE, 41221 +YI SYLLABLE DIEP, 41222 +YI SYLLABLE DAT, 41223 +YI SYLLABLE DAX, 41224 +YI SYLLABLE DA, 41225 +YI SYLLABLE DAP, 41226 +YI SYLLABLE DUOX, 41227 +YI SYLLABLE DUO, 41228 +YI SYLLABLE DOT, 41229 +YI SYLLABLE DOX, 41230 +YI SYLLABLE DO, 41231 +YI SYLLABLE DOP, 41232 +YI SYLLABLE DEX, 41233 +YI SYLLABLE DE, 41234 +YI SYLLABLE DEP, 41235 +YI SYLLABLE DUT, 41236 +YI SYLLABLE DUX, 41237 +YI SYLLABLE DU, 41238 +YI SYLLABLE DUP, 41239 +YI SYLLABLE DURX, 41240 +YI SYLLABLE DUR, 41241 +YI SYLLABLE TIT, 41242 +YI SYLLABLE TIX, 41243 +YI SYLLABLE TI, 41244 +YI SYLLABLE TIP, 41245 +YI SYLLABLE TIEX, 41246 +YI SYLLABLE TIE, 41247 +YI SYLLABLE TIEP, 41248 +YI SYLLABLE TAT, 41249 +YI SYLLABLE TAX, 41250 +YI SYLLABLE TA, 41251 +YI SYLLABLE TAP, 41252 +YI SYLLABLE TUOT, 41253 +YI SYLLABLE TUOX, 41254 +YI SYLLABLE TUO, 41255 +YI SYLLABLE TUOP, 41256 +YI SYLLABLE TOT, 41257 +YI SYLLABLE TOX, 41258 +YI SYLLABLE TO, 41259 +YI SYLLABLE TOP, 41260 +YI SYLLABLE TEX, 41261 +YI SYLLABLE TE, 41262 +YI SYLLABLE TEP, 41263 +YI SYLLABLE TUT, 41264 +YI SYLLABLE TUX, 41265 +YI SYLLABLE TU, 41266 +YI SYLLABLE TUP, 41267 +YI SYLLABLE TURX, 41268 +YI SYLLABLE TUR, 41269 +YI SYLLABLE DDIT, 41270 +YI SYLLABLE DDIX, 41271 +YI SYLLABLE DDI, 41272 +YI SYLLABLE DDIP, 41273 +YI SYLLABLE DDIEX, 41274 +YI SYLLABLE DDIE, 41275 +YI SYLLABLE DDIEP, 41276 +YI SYLLABLE DDAT, 41277 +YI SYLLABLE DDAX, 41278 +YI SYLLABLE DDA, 41279 +YI SYLLABLE DDAP, 41280 +YI SYLLABLE DDUOX, 41281 +YI SYLLABLE DDUO, 41282 +YI SYLLABLE DDUOP, 41283 +YI SYLLABLE DDOT, 41284 +YI SYLLABLE DDOX, 41285 +YI SYLLABLE DDO, 41286 +YI SYLLABLE DDOP, 41287 +YI SYLLABLE DDEX, 41288 +YI SYLLABLE DDE, 41289 +YI SYLLABLE DDEP, 41290 +YI SYLLABLE DDUT, 41291 +YI SYLLABLE DDUX, 41292 +YI SYLLABLE DDU, 41293 +YI SYLLABLE DDUP, 41294 +YI SYLLABLE DDURX, 41295 +YI SYLLABLE DDUR, 41296 +YI SYLLABLE NDIT, 41297 +YI SYLLABLE NDIX, 41298 +YI SYLLABLE NDI, 41299 +YI SYLLABLE NDIP, 41300 +YI SYLLABLE NDIEX, 41301 +YI SYLLABLE NDIE, 41302 +YI SYLLABLE NDAT, 41303 +YI SYLLABLE NDAX, 41304 +YI SYLLABLE NDA, 41305 +YI SYLLABLE NDAP, 41306 +YI SYLLABLE NDOT, 41307 +YI SYLLABLE NDOX, 41308 +YI SYLLABLE NDO, 41309 +YI SYLLABLE NDOP, 41310 +YI SYLLABLE NDEX, 41311 +YI SYLLABLE NDE, 41312 +YI SYLLABLE NDEP, 41313 +YI SYLLABLE NDUT, 41314 +YI SYLLABLE NDUX, 41315 +YI SYLLABLE NDU, 41316 +YI SYLLABLE NDUP, 41317 +YI SYLLABLE NDURX, 41318 +YI SYLLABLE NDUR, 41319 +YI SYLLABLE HNIT, 41320 +YI SYLLABLE HNIX, 41321 +YI SYLLABLE HNI, 41322 +YI SYLLABLE HNIP, 41323 +YI SYLLABLE HNIET, 41324 +YI SYLLABLE HNIEX, 41325 +YI SYLLABLE HNIE, 41326 +YI SYLLABLE HNIEP, 41327 +YI SYLLABLE HNAT, 41328 +YI SYLLABLE HNAX, 41329 +YI SYLLABLE HNA, 41330 +YI SYLLABLE HNAP, 41331 +YI SYLLABLE HNUOX, 41332 +YI SYLLABLE HNUO, 41333 +YI SYLLABLE HNOT, 41334 +YI SYLLABLE HNOX, 41335 +YI SYLLABLE HNOP, 41336 +YI SYLLABLE HNEX, 41337 +YI SYLLABLE HNE, 41338 +YI SYLLABLE HNEP, 41339 +YI SYLLABLE HNUT, 41340 +YI SYLLABLE NIT, 41341 +YI SYLLABLE NIX, 41342 +YI SYLLABLE NI, 41343 +YI SYLLABLE NIP, 41344 +YI SYLLABLE NIEX, 41345 +YI SYLLABLE NIE, 41346 +YI SYLLABLE NIEP, 41347 +YI SYLLABLE NAX, 41348 +YI SYLLABLE NA, 41349 +YI SYLLABLE NAP, 41350 +YI SYLLABLE NUOX, 41351 +YI SYLLABLE NUO, 41352 +YI SYLLABLE NUOP, 41353 +YI SYLLABLE NOT, 41354 +YI SYLLABLE NOX, 41355 +YI SYLLABLE NO, 41356 +YI SYLLABLE NOP, 41357 +YI SYLLABLE NEX, 41358 +YI SYLLABLE NE, 41359 +YI SYLLABLE NEP, 41360 +YI SYLLABLE NUT, 41361 +YI SYLLABLE NUX, 41362 +YI SYLLABLE NU, 41363 +YI SYLLABLE NUP, 41364 +YI SYLLABLE NURX, 41365 +YI SYLLABLE NUR, 41366 +YI SYLLABLE HLIT, 41367 +YI SYLLABLE HLIX, 41368 +YI SYLLABLE HLI, 41369 +YI SYLLABLE HLIP, 41370 +YI SYLLABLE HLIEX, 41371 +YI SYLLABLE HLIE, 41372 +YI SYLLABLE HLIEP, 41373 +YI SYLLABLE HLAT, 41374 +YI SYLLABLE HLAX, 41375 +YI SYLLABLE HLA, 41376 +YI SYLLABLE HLAP, 41377 +YI SYLLABLE HLUOX, 41378 +YI SYLLABLE HLUO, 41379 +YI SYLLABLE HLUOP, 41380 +YI SYLLABLE HLOX, 41381 +YI SYLLABLE HLO, 41382 +YI SYLLABLE HLOP, 41383 +YI SYLLABLE HLEX, 41384 +YI SYLLABLE HLE, 41385 +YI SYLLABLE HLEP, 41386 +YI SYLLABLE HLUT, 41387 +YI SYLLABLE HLUX, 41388 +YI SYLLABLE HLU, 41389 +YI SYLLABLE HLUP, 41390 +YI SYLLABLE HLURX, 41391 +YI SYLLABLE HLUR, 41392 +YI SYLLABLE HLYT, 41393 +YI SYLLABLE HLYX, 41394 +YI SYLLABLE HLY, 41395 +YI SYLLABLE HLYP, 41396 +YI SYLLABLE HLYRX, 41397 +YI SYLLABLE HLYR, 41398 +YI SYLLABLE LIT, 41399 +YI SYLLABLE LIX, 41400 +YI SYLLABLE LI, 41401 +YI SYLLABLE LIP, 41402 +YI SYLLABLE LIET, 41403 +YI SYLLABLE LIEX, 41404 +YI SYLLABLE LIE, 41405 +YI SYLLABLE LIEP, 41406 +YI SYLLABLE LAT, 41407 +YI SYLLABLE LAX, 41408 +YI SYLLABLE LA, 41409 +YI SYLLABLE LAP, 41410 +YI SYLLABLE LUOT, 41411 +YI SYLLABLE LUOX, 41412 +YI SYLLABLE LUO, 41413 +YI SYLLABLE LUOP, 41414 +YI SYLLABLE LOT, 41415 +YI SYLLABLE LOX, 41416 +YI SYLLABLE LO, 41417 +YI SYLLABLE LOP, 41418 +YI SYLLABLE LEX, 41419 +YI SYLLABLE LE, 41420 +YI SYLLABLE LEP, 41421 +YI SYLLABLE LUT, 41422 +YI SYLLABLE LUX, 41423 +YI SYLLABLE LU, 41424 +YI SYLLABLE LUP, 41425 +YI SYLLABLE LURX, 41426 +YI SYLLABLE LUR, 41427 +YI SYLLABLE LYT, 41428 +YI SYLLABLE LYX, 41429 +YI SYLLABLE LY, 41430 +YI SYLLABLE LYP, 41431 +YI SYLLABLE LYRX, 41432 +YI SYLLABLE LYR, 41433 +YI SYLLABLE GIT, 41434 +YI SYLLABLE GIX, 41435 +YI SYLLABLE GI, 41436 +YI SYLLABLE GIP, 41437 +YI SYLLABLE GIET, 41438 +YI SYLLABLE GIEX, 41439 +YI SYLLABLE GIE, 41440 +YI SYLLABLE GIEP, 41441 +YI SYLLABLE GAT, 41442 +YI SYLLABLE GAX, 41443 +YI SYLLABLE GA, 41444 +YI SYLLABLE GAP, 41445 +YI SYLLABLE GUOT, 41446 +YI SYLLABLE GUOX, 41447 +YI SYLLABLE GUO, 41448 +YI SYLLABLE GUOP, 41449 +YI SYLLABLE GOT, 41450 +YI SYLLABLE GOX, 41451 +YI SYLLABLE GO, 41452 +YI SYLLABLE GOP, 41453 +YI SYLLABLE GET, 41454 +YI SYLLABLE GEX, 41455 +YI SYLLABLE GE, 41456 +YI SYLLABLE GEP, 41457 +YI SYLLABLE GUT, 41458 +YI SYLLABLE GUX, 41459 +YI SYLLABLE GU, 41460 +YI SYLLABLE GUP, 41461 +YI SYLLABLE GURX, 41462 +YI SYLLABLE GUR, 41463 +YI SYLLABLE KIT, 41464 +YI SYLLABLE KIX, 41465 +YI SYLLABLE KI, 41466 +YI SYLLABLE KIP, 41467 +YI SYLLABLE KIEX, 41468 +YI SYLLABLE KIE, 41469 +YI SYLLABLE KIEP, 41470 +YI SYLLABLE KAT, 41471 +YI SYLLABLE KAX, 41472 +YI SYLLABLE KA, 41473 +YI SYLLABLE KAP, 41474 +YI SYLLABLE KUOX, 41475 +YI SYLLABLE KUO, 41476 +YI SYLLABLE KUOP, 41477 +YI SYLLABLE KOT, 41478 +YI SYLLABLE KOX, 41479 +YI SYLLABLE KO, 41480 +YI SYLLABLE KOP, 41481 +YI SYLLABLE KET, 41482 +YI SYLLABLE KEX, 41483 +YI SYLLABLE KE, 41484 +YI SYLLABLE KEP, 41485 +YI SYLLABLE KUT, 41486 +YI SYLLABLE KUX, 41487 +YI SYLLABLE KU, 41488 +YI SYLLABLE KUP, 41489 +YI SYLLABLE KURX, 41490 +YI SYLLABLE KUR, 41491 +YI SYLLABLE GGIT, 41492 +YI SYLLABLE GGIX, 41493 +YI SYLLABLE GGI, 41494 +YI SYLLABLE GGIEX, 41495 +YI SYLLABLE GGIE, 41496 +YI SYLLABLE GGIEP, 41497 +YI SYLLABLE GGAT, 41498 +YI SYLLABLE GGAX, 41499 +YI SYLLABLE GGA, 41500 +YI SYLLABLE GGAP, 41501 +YI SYLLABLE GGUOT, 41502 +YI SYLLABLE GGUOX, 41503 +YI SYLLABLE GGUO, 41504 +YI SYLLABLE GGUOP, 41505 +YI SYLLABLE GGOT, 41506 +YI SYLLABLE GGOX, 41507 +YI SYLLABLE GGO, 41508 +YI SYLLABLE GGOP, 41509 +YI SYLLABLE GGET, 41510 +YI SYLLABLE GGEX, 41511 +YI SYLLABLE GGE, 41512 +YI SYLLABLE GGEP, 41513 +YI SYLLABLE GGUT, 41514 +YI SYLLABLE GGUX, 41515 +YI SYLLABLE GGU, 41516 +YI SYLLABLE GGUP, 41517 +YI SYLLABLE GGURX, 41518 +YI SYLLABLE GGUR, 41519 +YI SYLLABLE MGIEX, 41520 +YI SYLLABLE MGIE, 41521 +YI SYLLABLE MGAT, 41522 +YI SYLLABLE MGAX, 41523 +YI SYLLABLE MGA, 41524 +YI SYLLABLE MGAP, 41525 +YI SYLLABLE MGUOX, 41526 +YI SYLLABLE MGUO, 41527 +YI SYLLABLE MGUOP, 41528 +YI SYLLABLE MGOT, 41529 +YI SYLLABLE MGOX, 41530 +YI SYLLABLE MGO, 41531 +YI SYLLABLE MGOP, 41532 +YI SYLLABLE MGEX, 41533 +YI SYLLABLE MGE, 41534 +YI SYLLABLE MGEP, 41535 +YI SYLLABLE MGUT, 41536 +YI SYLLABLE MGUX, 41537 +YI SYLLABLE MGU, 41538 +YI SYLLABLE MGUP, 41539 +YI SYLLABLE MGURX, 41540 +YI SYLLABLE MGUR, 41541 +YI SYLLABLE HXIT, 41542 +YI SYLLABLE HXIX, 41543 +YI SYLLABLE HXI, 41544 +YI SYLLABLE HXIP, 41545 +YI SYLLABLE HXIET, 41546 +YI SYLLABLE HXIEX, 41547 +YI SYLLABLE HXIE, 41548 +YI SYLLABLE HXIEP, 41549 +YI SYLLABLE HXAT, 41550 +YI SYLLABLE HXAX, 41551 +YI SYLLABLE HXA, 41552 +YI SYLLABLE HXAP, 41553 +YI SYLLABLE HXUOT, 41554 +YI SYLLABLE HXUOX, 41555 +YI SYLLABLE HXUO, 41556 +YI SYLLABLE HXUOP, 41557 +YI SYLLABLE HXOT, 41558 +YI SYLLABLE HXOX, 41559 +YI SYLLABLE HXO, 41560 +YI SYLLABLE HXOP, 41561 +YI SYLLABLE HXEX, 41562 +YI SYLLABLE HXE, 41563 +YI SYLLABLE HXEP, 41564 +YI SYLLABLE NGIEX, 41565 +YI SYLLABLE NGIE, 41566 +YI SYLLABLE NGIEP, 41567 +YI SYLLABLE NGAT, 41568 +YI SYLLABLE NGAX, 41569 +YI SYLLABLE NGA, 41570 +YI SYLLABLE NGAP, 41571 +YI SYLLABLE NGUOT, 41572 +YI SYLLABLE NGUOX, 41573 +YI SYLLABLE NGUO, 41574 +YI SYLLABLE NGOT, 41575 +YI SYLLABLE NGOX, 41576 +YI SYLLABLE NGO, 41577 +YI SYLLABLE NGOP, 41578 +YI SYLLABLE NGEX, 41579 +YI SYLLABLE NGE, 41580 +YI SYLLABLE NGEP, 41581 +YI SYLLABLE HIT, 41582 +YI SYLLABLE HIEX, 41583 +YI SYLLABLE HIE, 41584 +YI SYLLABLE HAT, 41585 +YI SYLLABLE HAX, 41586 +YI SYLLABLE HA, 41587 +YI SYLLABLE HAP, 41588 +YI SYLLABLE HUOT, 41589 +YI SYLLABLE HUOX, 41590 +YI SYLLABLE HUO, 41591 +YI SYLLABLE HUOP, 41592 +YI SYLLABLE HOT, 41593 +YI SYLLABLE HOX, 41594 +YI SYLLABLE HO, 41595 +YI SYLLABLE HOP, 41596 +YI SYLLABLE HEX, 41597 +YI SYLLABLE HE, 41598 +YI SYLLABLE HEP, 41599 +YI SYLLABLE WAT, 41600 +YI SYLLABLE WAX, 41601 +YI SYLLABLE WA, 41602 +YI SYLLABLE WAP, 41603 +YI SYLLABLE WUOX, 41604 +YI SYLLABLE WUO, 41605 +YI SYLLABLE WUOP, 41606 +YI SYLLABLE WOX, 41607 +YI SYLLABLE WO, 41608 +YI SYLLABLE WOP, 41609 +YI SYLLABLE WEX, 41610 +YI SYLLABLE WE, 41611 +YI SYLLABLE WEP, 41612 +YI SYLLABLE ZIT, 41613 +YI SYLLABLE ZIX, 41614 +YI SYLLABLE ZI, 41615 +YI SYLLABLE ZIP, 41616 +YI SYLLABLE ZIEX, 41617 +YI SYLLABLE ZIE, 41618 +YI SYLLABLE ZIEP, 41619 +YI SYLLABLE ZAT, 41620 +YI SYLLABLE ZAX, 41621 +YI SYLLABLE ZA, 41622 +YI SYLLABLE ZAP, 41623 +YI SYLLABLE ZUOX, 41624 +YI SYLLABLE ZUO, 41625 +YI SYLLABLE ZUOP, 41626 +YI SYLLABLE ZOT, 41627 +YI SYLLABLE ZOX, 41628 +YI SYLLABLE ZO, 41629 +YI SYLLABLE ZOP, 41630 +YI SYLLABLE ZEX, 41631 +YI SYLLABLE ZE, 41632 +YI SYLLABLE ZEP, 41633 +YI SYLLABLE ZUT, 41634 +YI SYLLABLE ZUX, 41635 +YI SYLLABLE ZU, 41636 +YI SYLLABLE ZUP, 41637 +YI SYLLABLE ZURX, 41638 +YI SYLLABLE ZUR, 41639 +YI SYLLABLE ZYT, 41640 +YI SYLLABLE ZYX, 41641 +YI SYLLABLE ZY, 41642 +YI SYLLABLE ZYP, 41643 +YI SYLLABLE ZYRX, 41644 +YI SYLLABLE ZYR, 41645 +YI SYLLABLE CIT, 41646 +YI SYLLABLE CIX, 41647 +YI SYLLABLE CI, 41648 +YI SYLLABLE CIP, 41649 +YI SYLLABLE CIET, 41650 +YI SYLLABLE CIEX, 41651 +YI SYLLABLE CIE, 41652 +YI SYLLABLE CIEP, 41653 +YI SYLLABLE CAT, 41654 +YI SYLLABLE CAX, 41655 +YI SYLLABLE CA, 41656 +YI SYLLABLE CAP, 41657 +YI SYLLABLE CUOX, 41658 +YI SYLLABLE CUO, 41659 +YI SYLLABLE CUOP, 41660 +YI SYLLABLE COT, 41661 +YI SYLLABLE COX, 41662 +YI SYLLABLE CO, 41663 +YI SYLLABLE COP, 41664 +YI SYLLABLE CEX, 41665 +YI SYLLABLE CE, 41666 +YI SYLLABLE CEP, 41667 +YI SYLLABLE CUT, 41668 +YI SYLLABLE CUX, 41669 +YI SYLLABLE CU, 41670 +YI SYLLABLE CUP, 41671 +YI SYLLABLE CURX, 41672 +YI SYLLABLE CUR, 41673 +YI SYLLABLE CYT, 41674 +YI SYLLABLE CYX, 41675 +YI SYLLABLE CY, 41676 +YI SYLLABLE CYP, 41677 +YI SYLLABLE CYRX, 41678 +YI SYLLABLE CYR, 41679 +YI SYLLABLE ZZIT, 41680 +YI SYLLABLE ZZIX, 41681 +YI SYLLABLE ZZI, 41682 +YI SYLLABLE ZZIP, 41683 +YI SYLLABLE ZZIET, 41684 +YI SYLLABLE ZZIEX, 41685 +YI SYLLABLE ZZIE, 41686 +YI SYLLABLE ZZIEP, 41687 +YI SYLLABLE ZZAT, 41688 +YI SYLLABLE ZZAX, 41689 +YI SYLLABLE ZZA, 41690 +YI SYLLABLE ZZAP, 41691 +YI SYLLABLE ZZOX, 41692 +YI SYLLABLE ZZO, 41693 +YI SYLLABLE ZZOP, 41694 +YI SYLLABLE ZZEX, 41695 +YI SYLLABLE ZZE, 41696 +YI SYLLABLE ZZEP, 41697 +YI SYLLABLE ZZUX, 41698 +YI SYLLABLE ZZU, 41699 +YI SYLLABLE ZZUP, 41700 +YI SYLLABLE ZZURX, 41701 +YI SYLLABLE ZZUR, 41702 +YI SYLLABLE ZZYT, 41703 +YI SYLLABLE ZZYX, 41704 +YI SYLLABLE ZZY, 41705 +YI SYLLABLE ZZYP, 41706 +YI SYLLABLE ZZYRX, 41707 +YI SYLLABLE ZZYR, 41708 +YI SYLLABLE NZIT, 41709 +YI SYLLABLE NZIX, 41710 +YI SYLLABLE NZI, 41711 +YI SYLLABLE NZIP, 41712 +YI SYLLABLE NZIEX, 41713 +YI SYLLABLE NZIE, 41714 +YI SYLLABLE NZIEP, 41715 +YI SYLLABLE NZAT, 41716 +YI SYLLABLE NZAX, 41717 +YI SYLLABLE NZA, 41718 +YI SYLLABLE NZAP, 41719 +YI SYLLABLE NZUOX, 41720 +YI SYLLABLE NZUO, 41721 +YI SYLLABLE NZOX, 41722 +YI SYLLABLE NZOP, 41723 +YI SYLLABLE NZEX, 41724 +YI SYLLABLE NZE, 41725 +YI SYLLABLE NZUX, 41726 +YI SYLLABLE NZU, 41727 +YI SYLLABLE NZUP, 41728 +YI SYLLABLE NZURX, 41729 +YI SYLLABLE NZUR, 41730 +YI SYLLABLE NZYT, 41731 +YI SYLLABLE NZYX, 41732 +YI SYLLABLE NZY, 41733 +YI SYLLABLE NZYP, 41734 +YI SYLLABLE NZYRX, 41735 +YI SYLLABLE NZYR, 41736 +YI SYLLABLE SIT, 41737 +YI SYLLABLE SIX, 41738 +YI SYLLABLE SI, 41739 +YI SYLLABLE SIP, 41740 +YI SYLLABLE SIEX, 41741 +YI SYLLABLE SIE, 41742 +YI SYLLABLE SIEP, 41743 +YI SYLLABLE SAT, 41744 +YI SYLLABLE SAX, 41745 +YI SYLLABLE SA, 41746 +YI SYLLABLE SAP, 41747 +YI SYLLABLE SUOX, 41748 +YI SYLLABLE SUO, 41749 +YI SYLLABLE SUOP, 41750 +YI SYLLABLE SOT, 41751 +YI SYLLABLE SOX, 41752 +YI SYLLABLE SO, 41753 +YI SYLLABLE SOP, 41754 +YI SYLLABLE SEX, 41755 +YI SYLLABLE SE, 41756 +YI SYLLABLE SEP, 41757 +YI SYLLABLE SUT, 41758 +YI SYLLABLE SUX, 41759 +YI SYLLABLE SU, 41760 +YI SYLLABLE SUP, 41761 +YI SYLLABLE SURX, 41762 +YI SYLLABLE SUR, 41763 +YI SYLLABLE SYT, 41764 +YI SYLLABLE SYX, 41765 +YI SYLLABLE SY, 41766 +YI SYLLABLE SYP, 41767 +YI SYLLABLE SYRX, 41768 +YI SYLLABLE SYR, 41769 +YI SYLLABLE SSIT, 41770 +YI SYLLABLE SSIX, 41771 +YI SYLLABLE SSI, 41772 +YI SYLLABLE SSIP, 41773 +YI SYLLABLE SSIEX, 41774 +YI SYLLABLE SSIE, 41775 +YI SYLLABLE SSIEP, 41776 +YI SYLLABLE SSAT, 41777 +YI SYLLABLE SSAX, 41778 +YI SYLLABLE SSA, 41779 +YI SYLLABLE SSAP, 41780 +YI SYLLABLE SSOT, 41781 +YI SYLLABLE SSOX, 41782 +YI SYLLABLE SSO, 41783 +YI SYLLABLE SSOP, 41784 +YI SYLLABLE SSEX, 41785 +YI SYLLABLE SSE, 41786 +YI SYLLABLE SSEP, 41787 +YI SYLLABLE SSUT, 41788 +YI SYLLABLE SSUX, 41789 +YI SYLLABLE SSU, 41790 +YI SYLLABLE SSUP, 41791 +YI SYLLABLE SSYT, 41792 +YI SYLLABLE SSYX, 41793 +YI SYLLABLE SSY, 41794 +YI SYLLABLE SSYP, 41795 +YI SYLLABLE SSYRX, 41796 +YI SYLLABLE SSYR, 41797 +YI SYLLABLE ZHAT, 41798 +YI SYLLABLE ZHAX, 41799 +YI SYLLABLE ZHA, 41800 +YI SYLLABLE ZHAP, 41801 +YI SYLLABLE ZHUOX, 41802 +YI SYLLABLE ZHUO, 41803 +YI SYLLABLE ZHUOP, 41804 +YI SYLLABLE ZHOT, 41805 +YI SYLLABLE ZHOX, 41806 +YI SYLLABLE ZHO, 41807 +YI SYLLABLE ZHOP, 41808 +YI SYLLABLE ZHET, 41809 +YI SYLLABLE ZHEX, 41810 +YI SYLLABLE ZHE, 41811 +YI SYLLABLE ZHEP, 41812 +YI SYLLABLE ZHUT, 41813 +YI SYLLABLE ZHUX, 41814 +YI SYLLABLE ZHU, 41815 +YI SYLLABLE ZHUP, 41816 +YI SYLLABLE ZHURX, 41817 +YI SYLLABLE ZHUR, 41818 +YI SYLLABLE ZHYT, 41819 +YI SYLLABLE ZHYX, 41820 +YI SYLLABLE ZHY, 41821 +YI SYLLABLE ZHYP, 41822 +YI SYLLABLE ZHYRX, 41823 +YI SYLLABLE ZHYR, 41824 +YI SYLLABLE CHAT, 41825 +YI SYLLABLE CHAX, 41826 +YI SYLLABLE CHA, 41827 +YI SYLLABLE CHAP, 41828 +YI SYLLABLE CHUOT, 41829 +YI SYLLABLE CHUOX, 41830 +YI SYLLABLE CHUO, 41831 +YI SYLLABLE CHUOP, 41832 +YI SYLLABLE CHOT, 41833 +YI SYLLABLE CHOX, 41834 +YI SYLLABLE CHO, 41835 +YI SYLLABLE CHOP, 41836 +YI SYLLABLE CHET, 41837 +YI SYLLABLE CHEX, 41838 +YI SYLLABLE CHE, 41839 +YI SYLLABLE CHEP, 41840 +YI SYLLABLE CHUX, 41841 +YI SYLLABLE CHU, 41842 +YI SYLLABLE CHUP, 41843 +YI SYLLABLE CHURX, 41844 +YI SYLLABLE CHUR, 41845 +YI SYLLABLE CHYT, 41846 +YI SYLLABLE CHYX, 41847 +YI SYLLABLE CHY, 41848 +YI SYLLABLE CHYP, 41849 +YI SYLLABLE CHYRX, 41850 +YI SYLLABLE CHYR, 41851 +YI SYLLABLE RRAX, 41852 +YI SYLLABLE RRA, 41853 +YI SYLLABLE RRUOX, 41854 +YI SYLLABLE RRUO, 41855 +YI SYLLABLE RROT, 41856 +YI SYLLABLE RROX, 41857 +YI SYLLABLE RRO, 41858 +YI SYLLABLE RROP, 41859 +YI SYLLABLE RRET, 41860 +YI SYLLABLE RREX, 41861 +YI SYLLABLE RRE, 41862 +YI SYLLABLE RREP, 41863 +YI SYLLABLE RRUT, 41864 +YI SYLLABLE RRUX, 41865 +YI SYLLABLE RRU, 41866 +YI SYLLABLE RRUP, 41867 +YI SYLLABLE RRURX, 41868 +YI SYLLABLE RRUR, 41869 +YI SYLLABLE RRYT, 41870 +YI SYLLABLE RRYX, 41871 +YI SYLLABLE RRY, 41872 +YI SYLLABLE RRYP, 41873 +YI SYLLABLE RRYRX, 41874 +YI SYLLABLE RRYR, 41875 +YI SYLLABLE NRAT, 41876 +YI SYLLABLE NRAX, 41877 +YI SYLLABLE NRA, 41878 +YI SYLLABLE NRAP, 41879 +YI SYLLABLE NROX, 41880 +YI SYLLABLE NRO, 41881 +YI SYLLABLE NROP, 41882 +YI SYLLABLE NRET, 41883 +YI SYLLABLE NREX, 41884 +YI SYLLABLE NRE, 41885 +YI SYLLABLE NREP, 41886 +YI SYLLABLE NRUT, 41887 +YI SYLLABLE NRUX, 41888 +YI SYLLABLE NRU, 41889 +YI SYLLABLE NRUP, 41890 +YI SYLLABLE NRURX, 41891 +YI SYLLABLE NRUR, 41892 +YI SYLLABLE NRYT, 41893 +YI SYLLABLE NRYX, 41894 +YI SYLLABLE NRY, 41895 +YI SYLLABLE NRYP, 41896 +YI SYLLABLE NRYRX, 41897 +YI SYLLABLE NRYR, 41898 +YI SYLLABLE SHAT, 41899 +YI SYLLABLE SHAX, 41900 +YI SYLLABLE SHA, 41901 +YI SYLLABLE SHAP, 41902 +YI SYLLABLE SHUOX, 41903 +YI SYLLABLE SHUO, 41904 +YI SYLLABLE SHUOP, 41905 +YI SYLLABLE SHOT, 41906 +YI SYLLABLE SHOX, 41907 +YI SYLLABLE SHO, 41908 +YI SYLLABLE SHOP, 41909 +YI SYLLABLE SHET, 41910 +YI SYLLABLE SHEX, 41911 +YI SYLLABLE SHE, 41912 +YI SYLLABLE SHEP, 41913 +YI SYLLABLE SHUT, 41914 +YI SYLLABLE SHUX, 41915 +YI SYLLABLE SHU, 41916 +YI SYLLABLE SHUP, 41917 +YI SYLLABLE SHURX, 41918 +YI SYLLABLE SHUR, 41919 +YI SYLLABLE SHYT, 41920 +YI SYLLABLE SHYX, 41921 +YI SYLLABLE SHY, 41922 +YI SYLLABLE SHYP, 41923 +YI SYLLABLE SHYRX, 41924 +YI SYLLABLE SHYR, 41925 +YI SYLLABLE RAT, 41926 +YI SYLLABLE RAX, 41927 +YI SYLLABLE RA, 41928 +YI SYLLABLE RAP, 41929 +YI SYLLABLE RUOX, 41930 +YI SYLLABLE RUO, 41931 +YI SYLLABLE RUOP, 41932 +YI SYLLABLE ROT, 41933 +YI SYLLABLE ROX, 41934 +YI SYLLABLE RO, 41935 +YI SYLLABLE ROP, 41936 +YI SYLLABLE REX, 41937 +YI SYLLABLE RE, 41938 +YI SYLLABLE REP, 41939 +YI SYLLABLE RUT, 41940 +YI SYLLABLE RUX, 41941 +YI SYLLABLE RU, 41942 +YI SYLLABLE RUP, 41943 +YI SYLLABLE RURX, 41944 +YI SYLLABLE RUR, 41945 +YI SYLLABLE RYT, 41946 +YI SYLLABLE RYX, 41947 +YI SYLLABLE RY, 41948 +YI SYLLABLE RYP, 41949 +YI SYLLABLE RYRX, 41950 +YI SYLLABLE RYR, 41951 +YI SYLLABLE JIT, 41952 +YI SYLLABLE JIX, 41953 +YI SYLLABLE JI, 41954 +YI SYLLABLE JIP, 41955 +YI SYLLABLE JIET, 41956 +YI SYLLABLE JIEX, 41957 +YI SYLLABLE JIE, 41958 +YI SYLLABLE JIEP, 41959 +YI SYLLABLE JUOT, 41960 +YI SYLLABLE JUOX, 41961 +YI SYLLABLE JUO, 41962 +YI SYLLABLE JUOP, 41963 +YI SYLLABLE JOT, 41964 +YI SYLLABLE JOX, 41965 +YI SYLLABLE JO, 41966 +YI SYLLABLE JOP, 41967 +YI SYLLABLE JUT, 41968 +YI SYLLABLE JUX, 41969 +YI SYLLABLE JU, 41970 +YI SYLLABLE JUP, 41971 +YI SYLLABLE JURX, 41972 +YI SYLLABLE JUR, 41973 +YI SYLLABLE JYT, 41974 +YI SYLLABLE JYX, 41975 +YI SYLLABLE JY, 41976 +YI SYLLABLE JYP, 41977 +YI SYLLABLE JYRX, 41978 +YI SYLLABLE JYR, 41979 +YI SYLLABLE QIT, 41980 +YI SYLLABLE QIX, 41981 +YI SYLLABLE QI, 41982 +YI SYLLABLE QIP, 41983 +YI SYLLABLE QIET, 41984 +YI SYLLABLE QIEX, 41985 +YI SYLLABLE QIE, 41986 +YI SYLLABLE QIEP, 41987 +YI SYLLABLE QUOT, 41988 +YI SYLLABLE QUOX, 41989 +YI SYLLABLE QUO, 41990 +YI SYLLABLE QUOP, 41991 +YI SYLLABLE QOT, 41992 +YI SYLLABLE QOX, 41993 +YI SYLLABLE QO, 41994 +YI SYLLABLE QOP, 41995 +YI SYLLABLE QUT, 41996 +YI SYLLABLE QUX, 41997 +YI SYLLABLE QU, 41998 +YI SYLLABLE QUP, 41999 +YI SYLLABLE QURX, 42000 +YI SYLLABLE QUR, 42001 +YI SYLLABLE QYT, 42002 +YI SYLLABLE QYX, 42003 +YI SYLLABLE QY, 42004 +YI SYLLABLE QYP, 42005 +YI SYLLABLE QYRX, 42006 +YI SYLLABLE QYR, 42007 +YI SYLLABLE JJIT, 42008 +YI SYLLABLE JJIX, 42009 +YI SYLLABLE JJI, 42010 +YI SYLLABLE JJIP, 42011 +YI SYLLABLE JJIET, 42012 +YI SYLLABLE JJIEX, 42013 +YI SYLLABLE JJIE, 42014 +YI SYLLABLE JJIEP, 42015 +YI SYLLABLE JJUOX, 42016 +YI SYLLABLE JJUO, 42017 +YI SYLLABLE JJUOP, 42018 +YI SYLLABLE JJOT, 42019 +YI SYLLABLE JJOX, 42020 +YI SYLLABLE JJO, 42021 +YI SYLLABLE JJOP, 42022 +YI SYLLABLE JJUT, 42023 +YI SYLLABLE JJUX, 42024 +YI SYLLABLE JJU, 42025 +YI SYLLABLE JJUP, 42026 +YI SYLLABLE JJURX, 42027 +YI SYLLABLE JJUR, 42028 +YI SYLLABLE JJYT, 42029 +YI SYLLABLE JJYX, 42030 +YI SYLLABLE JJY, 42031 +YI SYLLABLE JJYP, 42032 +YI SYLLABLE NJIT, 42033 +YI SYLLABLE NJIX, 42034 +YI SYLLABLE NJI, 42035 +YI SYLLABLE NJIP, 42036 +YI SYLLABLE NJIET, 42037 +YI SYLLABLE NJIEX, 42038 +YI SYLLABLE NJIE, 42039 +YI SYLLABLE NJIEP, 42040 +YI SYLLABLE NJUOX, 42041 +YI SYLLABLE NJUO, 42042 +YI SYLLABLE NJOT, 42043 +YI SYLLABLE NJOX, 42044 +YI SYLLABLE NJO, 42045 +YI SYLLABLE NJOP, 42046 +YI SYLLABLE NJUX, 42047 +YI SYLLABLE NJU, 42048 +YI SYLLABLE NJUP, 42049 +YI SYLLABLE NJURX, 42050 +YI SYLLABLE NJUR, 42051 +YI SYLLABLE NJYT, 42052 +YI SYLLABLE NJYX, 42053 +YI SYLLABLE NJY, 42054 +YI SYLLABLE NJYP, 42055 +YI SYLLABLE NJYRX, 42056 +YI SYLLABLE NJYR, 42057 +YI SYLLABLE NYIT, 42058 +YI SYLLABLE NYIX, 42059 +YI SYLLABLE NYI, 42060 +YI SYLLABLE NYIP, 42061 +YI SYLLABLE NYIET, 42062 +YI SYLLABLE NYIEX, 42063 +YI SYLLABLE NYIE, 42064 +YI SYLLABLE NYIEP, 42065 +YI SYLLABLE NYUOX, 42066 +YI SYLLABLE NYUO, 42067 +YI SYLLABLE NYUOP, 42068 +YI SYLLABLE NYOT, 42069 +YI SYLLABLE NYOX, 42070 +YI SYLLABLE NYO, 42071 +YI SYLLABLE NYOP, 42072 +YI SYLLABLE NYUT, 42073 +YI SYLLABLE NYUX, 42074 +YI SYLLABLE NYU, 42075 +YI SYLLABLE NYUP, 42076 +YI SYLLABLE XIT, 42077 +YI SYLLABLE XIX, 42078 +YI SYLLABLE XI, 42079 +YI SYLLABLE XIP, 42080 +YI SYLLABLE XIET, 42081 +YI SYLLABLE XIEX, 42082 +YI SYLLABLE XIE, 42083 +YI SYLLABLE XIEP, 42084 +YI SYLLABLE XUOX, 42085 +YI SYLLABLE XUO, 42086 +YI SYLLABLE XOT, 42087 +YI SYLLABLE XOX, 42088 +YI SYLLABLE XO, 42089 +YI SYLLABLE XOP, 42090 +YI SYLLABLE XYT, 42091 +YI SYLLABLE XYX, 42092 +YI SYLLABLE XY, 42093 +YI SYLLABLE XYP, 42094 +YI SYLLABLE XYRX, 42095 +YI SYLLABLE XYR, 42096 +YI SYLLABLE YIT, 42097 +YI SYLLABLE YIX, 42098 +YI SYLLABLE YI, 42099 +YI SYLLABLE YIP, 42100 +YI SYLLABLE YIET, 42101 +YI SYLLABLE YIEX, 42102 +YI SYLLABLE YIE, 42103 +YI SYLLABLE YIEP, 42104 +YI SYLLABLE YUOT, 42105 +YI SYLLABLE YUOX, 42106 +YI SYLLABLE YUO, 42107 +YI SYLLABLE YUOP, 42108 +YI SYLLABLE YOT, 42109 +YI SYLLABLE YOX, 42110 +YI SYLLABLE YO, 42111 +YI SYLLABLE YOP, 42112 +YI SYLLABLE YUT, 42113 +YI SYLLABLE YUX, 42114 +YI SYLLABLE YU, 42115 +YI SYLLABLE YUP, 42116 +YI SYLLABLE YURX, 42117 +YI SYLLABLE YUR, 42118 +YI SYLLABLE YYT, 42119 +YI SYLLABLE YYX, 42120 +YI SYLLABLE YY, 42121 +YI SYLLABLE YYP, 42122 +YI SYLLABLE YYRX, 42123 +YI SYLLABLE YYR, 42124 +YI RADICAL QOT, 42128 +YI RADICAL LI, 42129 +YI RADICAL KIT, 42130 +YI RADICAL NYIP, 42131 +YI RADICAL CYP, 42132 +YI RADICAL SSI, 42133 +YI RADICAL GGOP, 42134 +YI RADICAL GEP, 42135 +YI RADICAL MI, 42136 +YI RADICAL HXIT, 42137 +YI RADICAL LYR, 42138 +YI RADICAL BBUT, 42139 +YI RADICAL MOP, 42140 +YI RADICAL YO, 42141 +YI RADICAL PUT, 42142 +YI RADICAL HXUO, 42143 +YI RADICAL TAT, 42144 +YI RADICAL GA, 42145 +YI RADICAL ZUP, 42146 +YI RADICAL CYT, 42147 +YI RADICAL DDUR, 42148 +YI RADICAL BUR, 42149 +YI RADICAL GGUO, 42150 +YI RADICAL NYOP, 42151 +YI RADICAL TU, 42152 +YI RADICAL OP, 42153 +YI RADICAL JJUT, 42154 +YI RADICAL ZOT, 42155 +YI RADICAL PYT, 42156 +YI RADICAL HMO, 42157 +YI RADICAL YIT, 42158 +YI RADICAL VUR, 42159 +YI RADICAL SHY, 42160 +YI RADICAL VEP, 42161 +YI RADICAL ZA, 42162 +YI RADICAL JO, 42163 +YI RADICAL NZUP, 42164 +YI RADICAL JJY, 42165 +YI RADICAL GOT, 42166 +YI RADICAL JJIE, 42167 +YI RADICAL WO, 42168 +YI RADICAL DU, 42169 +YI RADICAL SHUR, 42170 +YI RADICAL LIE, 42171 +YI RADICAL CY, 42172 +YI RADICAL CUOP, 42173 +YI RADICAL CIP, 42174 +YI RADICAL HXOP, 42175 +YI RADICAL SHAT, 42176 +YI RADICAL ZUR, 42177 +YI RADICAL SHOP, 42178 +YI RADICAL CHE, 42179 +YI RADICAL ZZIET, 42180 +YI RADICAL NBIE, 42181 +YI RADICAL KE, 42182 +LISU LETTER BA, 42192 +LISU LETTER PA, 42193 +LISU LETTER PHA, 42194 +LISU LETTER DA, 42195 +LISU LETTER TA, 42196 +LISU LETTER THA, 42197 +LISU LETTER GA, 42198 +LISU LETTER KA, 42199 +LISU LETTER KHA, 42200 +LISU LETTER JA, 42201 +LISU LETTER CA, 42202 +LISU LETTER CHA, 42203 +LISU LETTER DZA, 42204 +LISU LETTER TSA, 42205 +LISU LETTER TSHA, 42206 +LISU LETTER MA, 42207 +LISU LETTER NA, 42208 +LISU LETTER LA, 42209 +LISU LETTER SA, 42210 +LISU LETTER ZHA, 42211 +LISU LETTER ZA, 42212 +LISU LETTER NGA, 42213 +LISU LETTER HA, 42214 +LISU LETTER XA, 42215 +LISU LETTER HHA, 42216 +LISU LETTER FA, 42217 +LISU LETTER WA, 42218 +LISU LETTER SHA, 42219 +LISU LETTER YA, 42220 +LISU LETTER GHA, 42221 +LISU LETTER A, 42222 +LISU LETTER AE, 42223 +LISU LETTER E, 42224 +LISU LETTER EU, 42225 +LISU LETTER I, 42226 +LISU LETTER O, 42227 +LISU LETTER U, 42228 +LISU LETTER UE, 42229 +LISU LETTER UH, 42230 +LISU LETTER OE, 42231 +LISU LETTER TONE MYA TI, 42232 +LISU LETTER TONE NA PO, 42233 +LISU LETTER TONE MYA CYA, 42234 +LISU LETTER TONE MYA BO, 42235 +LISU LETTER TONE MYA NA, 42236 +LISU LETTER TONE MYA JEU, 42237 +LISU PUNCTUATION COMMA, 42238 +LISU PUNCTUATION FULL STOP, 42239 +VAI SYLLABLE EE, 42240 +VAI SYLLABLE EEN, 42241 +VAI SYLLABLE HEE, 42242 +VAI SYLLABLE WEE, 42243 +VAI SYLLABLE WEEN, 42244 +VAI SYLLABLE PEE, 42245 +VAI SYLLABLE BHEE, 42246 +VAI SYLLABLE BEE, 42247 +VAI SYLLABLE MBEE, 42248 +VAI SYLLABLE KPEE, 42249 +VAI SYLLABLE MGBEE, 42250 +VAI SYLLABLE GBEE, 42251 +VAI SYLLABLE FEE, 42252 +VAI SYLLABLE VEE, 42253 +VAI SYLLABLE TEE, 42254 +VAI SYLLABLE THEE, 42255 +VAI SYLLABLE DHEE, 42256 +VAI SYLLABLE DHHEE, 42257 +VAI SYLLABLE LEE, 42258 +VAI SYLLABLE REE, 42259 +VAI SYLLABLE DEE, 42260 +VAI SYLLABLE NDEE, 42261 +VAI SYLLABLE SEE, 42262 +VAI SYLLABLE SHEE, 42263 +VAI SYLLABLE ZEE, 42264 +VAI SYLLABLE ZHEE, 42265 +VAI SYLLABLE CEE, 42266 +VAI SYLLABLE JEE, 42267 +VAI SYLLABLE NJEE, 42268 +VAI SYLLABLE YEE, 42269 +VAI SYLLABLE KEE, 42270 +VAI SYLLABLE NGGEE, 42271 +VAI SYLLABLE GEE, 42272 +VAI SYLLABLE MEE, 42273 +VAI SYLLABLE NEE, 42274 +VAI SYLLABLE NYEE, 42275 +VAI SYLLABLE I, 42276 +VAI SYLLABLE IN, 42277 +VAI SYLLABLE HI, 42278 +VAI SYLLABLE HIN, 42279 +VAI SYLLABLE WI, 42280 +VAI SYLLABLE WIN, 42281 +VAI SYLLABLE PI, 42282 +VAI SYLLABLE BHI, 42283 +VAI SYLLABLE BI, 42284 +VAI SYLLABLE MBI, 42285 +VAI SYLLABLE KPI, 42286 +VAI SYLLABLE MGBI, 42287 +VAI SYLLABLE GBI, 42288 +VAI SYLLABLE FI, 42289 +VAI SYLLABLE VI, 42290 +VAI SYLLABLE TI, 42291 +VAI SYLLABLE THI, 42292 +VAI SYLLABLE DHI, 42293 +VAI SYLLABLE DHHI, 42294 +VAI SYLLABLE LI, 42295 +VAI SYLLABLE RI, 42296 +VAI SYLLABLE DI, 42297 +VAI SYLLABLE NDI, 42298 +VAI SYLLABLE SI, 42299 +VAI SYLLABLE SHI, 42300 +VAI SYLLABLE ZI, 42301 +VAI SYLLABLE ZHI, 42302 +VAI SYLLABLE CI, 42303 +VAI SYLLABLE JI, 42304 +VAI SYLLABLE NJI, 42305 +VAI SYLLABLE YI, 42306 +VAI SYLLABLE KI, 42307 +VAI SYLLABLE NGGI, 42308 +VAI SYLLABLE GI, 42309 +VAI SYLLABLE MI, 42310 +VAI SYLLABLE NI, 42311 +VAI SYLLABLE NYI, 42312 +VAI SYLLABLE A, 42313 +VAI SYLLABLE AN, 42314 +VAI SYLLABLE NGAN, 42315 +VAI SYLLABLE HA, 42316 +VAI SYLLABLE HAN, 42317 +VAI SYLLABLE WA, 42318 +VAI SYLLABLE WAN, 42319 +VAI SYLLABLE PA, 42320 +VAI SYLLABLE BHA, 42321 +VAI SYLLABLE BA, 42322 +VAI SYLLABLE MBA, 42323 +VAI SYLLABLE KPA, 42324 +VAI SYLLABLE KPAN, 42325 +VAI SYLLABLE MGBA, 42326 +VAI SYLLABLE GBA, 42327 +VAI SYLLABLE FA, 42328 +VAI SYLLABLE VA, 42329 +VAI SYLLABLE TA, 42330 +VAI SYLLABLE THA, 42331 +VAI SYLLABLE DHA, 42332 +VAI SYLLABLE DHHA, 42333 +VAI SYLLABLE LA, 42334 +VAI SYLLABLE RA, 42335 +VAI SYLLABLE DA, 42336 +VAI SYLLABLE NDA, 42337 +VAI SYLLABLE SA, 42338 +VAI SYLLABLE SHA, 42339 +VAI SYLLABLE ZA, 42340 +VAI SYLLABLE ZHA, 42341 +VAI SYLLABLE CA, 42342 +VAI SYLLABLE JA, 42343 +VAI SYLLABLE NJA, 42344 +VAI SYLLABLE YA, 42345 +VAI SYLLABLE KA, 42346 +VAI SYLLABLE KAN, 42347 +VAI SYLLABLE NGGA, 42348 +VAI SYLLABLE GA, 42349 +VAI SYLLABLE MA, 42350 +VAI SYLLABLE NA, 42351 +VAI SYLLABLE NYA, 42352 +VAI SYLLABLE OO, 42353 +VAI SYLLABLE OON, 42354 +VAI SYLLABLE HOO, 42355 +VAI SYLLABLE WOO, 42356 +VAI SYLLABLE WOON, 42357 +VAI SYLLABLE POO, 42358 +VAI SYLLABLE BHOO, 42359 +VAI SYLLABLE BOO, 42360 +VAI SYLLABLE MBOO, 42361 +VAI SYLLABLE KPOO, 42362 +VAI SYLLABLE MGBOO, 42363 +VAI SYLLABLE GBOO, 42364 +VAI SYLLABLE FOO, 42365 +VAI SYLLABLE VOO, 42366 +VAI SYLLABLE TOO, 42367 +VAI SYLLABLE THOO, 42368 +VAI SYLLABLE DHOO, 42369 +VAI SYLLABLE DHHOO, 42370 +VAI SYLLABLE LOO, 42371 +VAI SYLLABLE ROO, 42372 +VAI SYLLABLE DOO, 42373 +VAI SYLLABLE NDOO, 42374 +VAI SYLLABLE SOO, 42375 +VAI SYLLABLE SHOO, 42376 +VAI SYLLABLE ZOO, 42377 +VAI SYLLABLE ZHOO, 42378 +VAI SYLLABLE COO, 42379 +VAI SYLLABLE JOO, 42380 +VAI SYLLABLE NJOO, 42381 +VAI SYLLABLE YOO, 42382 +VAI SYLLABLE KOO, 42383 +VAI SYLLABLE NGGOO, 42384 +VAI SYLLABLE GOO, 42385 +VAI SYLLABLE MOO, 42386 +VAI SYLLABLE NOO, 42387 +VAI SYLLABLE NYOO, 42388 +VAI SYLLABLE U, 42389 +VAI SYLLABLE UN, 42390 +VAI SYLLABLE HU, 42391 +VAI SYLLABLE HUN, 42392 +VAI SYLLABLE WU, 42393 +VAI SYLLABLE WUN, 42394 +VAI SYLLABLE PU, 42395 +VAI SYLLABLE BHU, 42396 +VAI SYLLABLE BU, 42397 +VAI SYLLABLE MBU, 42398 +VAI SYLLABLE KPU, 42399 +VAI SYLLABLE MGBU, 42400 +VAI SYLLABLE GBU, 42401 +VAI SYLLABLE FU, 42402 +VAI SYLLABLE VU, 42403 +VAI SYLLABLE TU, 42404 +VAI SYLLABLE THU, 42405 +VAI SYLLABLE DHU, 42406 +VAI SYLLABLE DHHU, 42407 +VAI SYLLABLE LU, 42408 +VAI SYLLABLE RU, 42409 +VAI SYLLABLE DU, 42410 +VAI SYLLABLE NDU, 42411 +VAI SYLLABLE SU, 42412 +VAI SYLLABLE SHU, 42413 +VAI SYLLABLE ZU, 42414 +VAI SYLLABLE ZHU, 42415 +VAI SYLLABLE CU, 42416 +VAI SYLLABLE JU, 42417 +VAI SYLLABLE NJU, 42418 +VAI SYLLABLE YU, 42419 +VAI SYLLABLE KU, 42420 +VAI SYLLABLE NGGU, 42421 +VAI SYLLABLE GU, 42422 +VAI SYLLABLE MU, 42423 +VAI SYLLABLE NU, 42424 +VAI SYLLABLE NYU, 42425 +VAI SYLLABLE O, 42426 +VAI SYLLABLE ON, 42427 +VAI SYLLABLE NGON, 42428 +VAI SYLLABLE HO, 42429 +VAI SYLLABLE HON, 42430 +VAI SYLLABLE WO, 42431 +VAI SYLLABLE WON, 42432 +VAI SYLLABLE PO, 42433 +VAI SYLLABLE BHO, 42434 +VAI SYLLABLE BO, 42435 +VAI SYLLABLE MBO, 42436 +VAI SYLLABLE KPO, 42437 +VAI SYLLABLE MGBO, 42438 +VAI SYLLABLE GBO, 42439 +VAI SYLLABLE GBON, 42440 +VAI SYLLABLE FO, 42441 +VAI SYLLABLE VO, 42442 +VAI SYLLABLE TO, 42443 +VAI SYLLABLE THO, 42444 +VAI SYLLABLE DHO, 42445 +VAI SYLLABLE DHHO, 42446 +VAI SYLLABLE LO, 42447 +VAI SYLLABLE RO, 42448 +VAI SYLLABLE DO, 42449 +VAI SYLLABLE NDO, 42450 +VAI SYLLABLE SO, 42451 +VAI SYLLABLE SHO, 42452 +VAI SYLLABLE ZO, 42453 +VAI SYLLABLE ZHO, 42454 +VAI SYLLABLE CO, 42455 +VAI SYLLABLE JO, 42456 +VAI SYLLABLE NJO, 42457 +VAI SYLLABLE YO, 42458 +VAI SYLLABLE KO, 42459 +VAI SYLLABLE NGGO, 42460 +VAI SYLLABLE GO, 42461 +VAI SYLLABLE MO, 42462 +VAI SYLLABLE NO, 42463 +VAI SYLLABLE NYO, 42464 +VAI SYLLABLE E, 42465 +VAI SYLLABLE EN, 42466 +VAI SYLLABLE NGEN, 42467 +VAI SYLLABLE HE, 42468 +VAI SYLLABLE HEN, 42469 +VAI SYLLABLE WE, 42470 +VAI SYLLABLE WEN, 42471 +VAI SYLLABLE PE, 42472 +VAI SYLLABLE BHE, 42473 +VAI SYLLABLE BE, 42474 +VAI SYLLABLE MBE, 42475 +VAI SYLLABLE KPE, 42476 +VAI SYLLABLE KPEN, 42477 +VAI SYLLABLE MGBE, 42478 +VAI SYLLABLE GBE, 42479 +VAI SYLLABLE GBEN, 42480 +VAI SYLLABLE FE, 42481 +VAI SYLLABLE VE, 42482 +VAI SYLLABLE TE, 42483 +VAI SYLLABLE THE, 42484 +VAI SYLLABLE DHE, 42485 +VAI SYLLABLE DHHE, 42486 +VAI SYLLABLE LE, 42487 +VAI SYLLABLE RE, 42488 +VAI SYLLABLE DE, 42489 +VAI SYLLABLE NDE, 42490 +VAI SYLLABLE SE, 42491 +VAI SYLLABLE SHE, 42492 +VAI SYLLABLE ZE, 42493 +VAI SYLLABLE ZHE, 42494 +VAI SYLLABLE CE, 42495 +VAI SYLLABLE JE, 42496 +VAI SYLLABLE NJE, 42497 +VAI SYLLABLE YE, 42498 +VAI SYLLABLE KE, 42499 +VAI SYLLABLE NGGE, 42500 +VAI SYLLABLE NGGEN, 42501 +VAI SYLLABLE GE, 42502 +VAI SYLLABLE GEN, 42503 +VAI SYLLABLE ME, 42504 +VAI SYLLABLE NE, 42505 +VAI SYLLABLE NYE, 42506 +VAI SYLLABLE NG, 42507 +VAI SYLLABLE LENGTHENER, 42508 +VAI COMMA, 42509 +VAI FULL STOP, 42510 +VAI QUESTION MARK, 42511 +VAI SYLLABLE NDOLE FA, 42512 +VAI SYLLABLE NDOLE KA, 42513 +VAI SYLLABLE NDOLE SOO, 42514 +VAI SYMBOL FEENG, 42515 +VAI SYMBOL KEENG, 42516 +VAI SYMBOL TING, 42517 +VAI SYMBOL NII, 42518 +VAI SYMBOL BANG, 42519 +VAI SYMBOL FAA, 42520 +VAI SYMBOL TAA, 42521 +VAI SYMBOL DANG, 42522 +VAI SYMBOL DOONG, 42523 +VAI SYMBOL KUNG, 42524 +VAI SYMBOL TONG, 42525 +VAI SYMBOL DO O, 42526 +VAI SYMBOL JONG, 42527 +VAI DIGIT ZERO, 42528 +VAI DIGIT ONE, 42529 +VAI DIGIT TWO, 42530 +VAI DIGIT THREE, 42531 +VAI DIGIT FOUR, 42532 +VAI DIGIT FIVE, 42533 +VAI DIGIT SIX, 42534 +VAI DIGIT SEVEN, 42535 +VAI DIGIT EIGHT, 42536 +VAI DIGIT NINE, 42537 +VAI SYLLABLE NDOLE MA, 42538 +VAI SYLLABLE NDOLE DO, 42539 +CYRILLIC CAPITAL LETTER ZEMLYA, 42560 +CYRILLIC SMALL LETTER ZEMLYA, 42561 +CYRILLIC CAPITAL LETTER DZELO, 42562 +CYRILLIC SMALL LETTER DZELO, 42563 +CYRILLIC CAPITAL LETTER REVERSED DZE, 42564 +CYRILLIC SMALL LETTER REVERSED DZE, 42565 +CYRILLIC CAPITAL LETTER IOTA, 42566 +CYRILLIC SMALL LETTER IOTA, 42567 +CYRILLIC CAPITAL LETTER DJERV, 42568 +CYRILLIC SMALL LETTER DJERV, 42569 +CYRILLIC CAPITAL LETTER MONOGRAPH UK, 42570 +CYRILLIC SMALL LETTER MONOGRAPH UK, 42571 +CYRILLIC CAPITAL LETTER BROAD OMEGA, 42572 +CYRILLIC SMALL LETTER BROAD OMEGA, 42573 +CYRILLIC CAPITAL LETTER NEUTRAL YER, 42574 +CYRILLIC SMALL LETTER NEUTRAL YER, 42575 +CYRILLIC CAPITAL LETTER YERU WITH BACK YER, 42576 +CYRILLIC SMALL LETTER YERU WITH BACK YER, 42577 +CYRILLIC CAPITAL LETTER IOTIFIED YAT, 42578 +CYRILLIC SMALL LETTER IOTIFIED YAT, 42579 +CYRILLIC CAPITAL LETTER REVERSED YU, 42580 +CYRILLIC SMALL LETTER REVERSED YU, 42581 +CYRILLIC CAPITAL LETTER IOTIFIED A, 42582 +CYRILLIC SMALL LETTER IOTIFIED A, 42583 +CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS, 42584 +CYRILLIC SMALL LETTER CLOSED LITTLE YUS, 42585 +CYRILLIC CAPITAL LETTER BLENDED YUS, 42586 +CYRILLIC SMALL LETTER BLENDED YUS, 42587 +CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS, 42588 +CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS, 42589 +CYRILLIC CAPITAL LETTER YN, 42590 +CYRILLIC SMALL LETTER YN, 42591 +CYRILLIC CAPITAL LETTER REVERSED TSE, 42592 +CYRILLIC SMALL LETTER REVERSED TSE, 42593 +CYRILLIC CAPITAL LETTER SOFT DE, 42594 +CYRILLIC SMALL LETTER SOFT DE, 42595 +CYRILLIC CAPITAL LETTER SOFT EL, 42596 +CYRILLIC SMALL LETTER SOFT EL, 42597 +CYRILLIC CAPITAL LETTER SOFT EM, 42598 +CYRILLIC SMALL LETTER SOFT EM, 42599 +CYRILLIC CAPITAL LETTER MONOCULAR O, 42600 +CYRILLIC SMALL LETTER MONOCULAR O, 42601 +CYRILLIC CAPITAL LETTER BINOCULAR O, 42602 +CYRILLIC SMALL LETTER BINOCULAR O, 42603 +CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O, 42604 +CYRILLIC SMALL LETTER DOUBLE MONOCULAR O, 42605 +CYRILLIC LETTER MULTIOCULAR O, 42606 +COMBINING CYRILLIC VZMET, 42607 +COMBINING CYRILLIC TEN MILLIONS SIGN, 42608 +COMBINING CYRILLIC HUNDRED MILLIONS SIGN, 42609 +COMBINING CYRILLIC THOUSAND MILLIONS SIGN, 42610 +SLAVONIC ASTERISK, 42611 +COMBINING CYRILLIC LETTER UKRAINIAN IE, 42612 +COMBINING CYRILLIC LETTER I, 42613 +COMBINING CYRILLIC LETTER YI, 42614 +COMBINING CYRILLIC LETTER U, 42615 +COMBINING CYRILLIC LETTER HARD SIGN, 42616 +COMBINING CYRILLIC LETTER YERU, 42617 +COMBINING CYRILLIC LETTER SOFT SIGN, 42618 +COMBINING CYRILLIC LETTER OMEGA, 42619 +COMBINING CYRILLIC KAVYKA, 42620 +COMBINING CYRILLIC PAYEROK, 42621 +CYRILLIC KAVYKA, 42622 +CYRILLIC PAYEROK, 42623 +CYRILLIC CAPITAL LETTER DWE, 42624 +CYRILLIC SMALL LETTER DWE, 42625 +CYRILLIC CAPITAL LETTER DZWE, 42626 +CYRILLIC SMALL LETTER DZWE, 42627 +CYRILLIC CAPITAL LETTER ZHWE, 42628 +CYRILLIC SMALL LETTER ZHWE, 42629 +CYRILLIC CAPITAL LETTER CCHE, 42630 +CYRILLIC SMALL LETTER CCHE, 42631 +CYRILLIC CAPITAL LETTER DZZE, 42632 +CYRILLIC SMALL LETTER DZZE, 42633 +CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK, 42634 +CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK, 42635 +CYRILLIC CAPITAL LETTER TWE, 42636 +CYRILLIC SMALL LETTER TWE, 42637 +CYRILLIC CAPITAL LETTER TSWE, 42638 +CYRILLIC SMALL LETTER TSWE, 42639 +CYRILLIC CAPITAL LETTER TSSE, 42640 +CYRILLIC SMALL LETTER TSSE, 42641 +CYRILLIC CAPITAL LETTER TCHE, 42642 +CYRILLIC SMALL LETTER TCHE, 42643 +CYRILLIC CAPITAL LETTER HWE, 42644 +CYRILLIC SMALL LETTER HWE, 42645 +CYRILLIC CAPITAL LETTER SHWE, 42646 +CYRILLIC SMALL LETTER SHWE, 42647 +CYRILLIC CAPITAL LETTER DOUBLE O, 42648 +CYRILLIC SMALL LETTER DOUBLE O, 42649 +CYRILLIC CAPITAL LETTER CROSSED O, 42650 +CYRILLIC SMALL LETTER CROSSED O, 42651 +MODIFIER LETTER CYRILLIC HARD SIGN, 42652 +MODIFIER LETTER CYRILLIC SOFT SIGN, 42653 +COMBINING CYRILLIC LETTER EF, 42654 +COMBINING CYRILLIC LETTER IOTIFIED E, 42655 +BAMUM LETTER A, 42656 +BAMUM LETTER KA, 42657 +BAMUM LETTER U, 42658 +BAMUM LETTER KU, 42659 +BAMUM LETTER EE, 42660 +BAMUM LETTER REE, 42661 +BAMUM LETTER TAE, 42662 +BAMUM LETTER O, 42663 +BAMUM LETTER NYI, 42664 +BAMUM LETTER I, 42665 +BAMUM LETTER LA, 42666 +BAMUM LETTER PA, 42667 +BAMUM LETTER RII, 42668 +BAMUM LETTER RIEE, 42669 +BAMUM LETTER LEEEE, 42670 +BAMUM LETTER MEEEE, 42671 +BAMUM LETTER TAA, 42672 +BAMUM LETTER NDAA, 42673 +BAMUM LETTER NJAEM, 42674 +BAMUM LETTER M, 42675 +BAMUM LETTER SUU, 42676 +BAMUM LETTER MU, 42677 +BAMUM LETTER SHII, 42678 +BAMUM LETTER SI, 42679 +BAMUM LETTER SHEUX, 42680 +BAMUM LETTER SEUX, 42681 +BAMUM LETTER KYEE, 42682 +BAMUM LETTER KET, 42683 +BAMUM LETTER NUAE, 42684 +BAMUM LETTER NU, 42685 +BAMUM LETTER NJUAE, 42686 +BAMUM LETTER YOQ, 42687 +BAMUM LETTER SHU, 42688 +BAMUM LETTER YUQ, 42689 +BAMUM LETTER YA, 42690 +BAMUM LETTER NSHA, 42691 +BAMUM LETTER KEUX, 42692 +BAMUM LETTER PEUX, 42693 +BAMUM LETTER NJEE, 42694 +BAMUM LETTER NTEE, 42695 +BAMUM LETTER PUE, 42696 +BAMUM LETTER WUE, 42697 +BAMUM LETTER PEE, 42698 +BAMUM LETTER FEE, 42699 +BAMUM LETTER RU, 42700 +BAMUM LETTER LU, 42701 +BAMUM LETTER MI, 42702 +BAMUM LETTER NI, 42703 +BAMUM LETTER REUX, 42704 +BAMUM LETTER RAE, 42705 +BAMUM LETTER KEN, 42706 +BAMUM LETTER NGKWAEN, 42707 +BAMUM LETTER NGGA, 42708 +BAMUM LETTER NGA, 42709 +BAMUM LETTER SHO, 42710 +BAMUM LETTER PUAE, 42711 +BAMUM LETTER FU, 42712 +BAMUM LETTER FOM, 42713 +BAMUM LETTER WA, 42714 +BAMUM LETTER NA, 42715 +BAMUM LETTER LI, 42716 +BAMUM LETTER PI, 42717 +BAMUM LETTER LOQ, 42718 +BAMUM LETTER KO, 42719 +BAMUM LETTER MBEN, 42720 +BAMUM LETTER REN, 42721 +BAMUM LETTER MEN, 42722 +BAMUM LETTER MA, 42723 +BAMUM LETTER TI, 42724 +BAMUM LETTER KI, 42725 +BAMUM LETTER MO, 42726 +BAMUM LETTER MBAA, 42727 +BAMUM LETTER TET, 42728 +BAMUM LETTER KPA, 42729 +BAMUM LETTER TEN, 42730 +BAMUM LETTER NTUU, 42731 +BAMUM LETTER SAMBA, 42732 +BAMUM LETTER FAAMAE, 42733 +BAMUM LETTER KOVUU, 42734 +BAMUM LETTER KOGHOM, 42735 +BAMUM COMBINING MARK KOQNDON, 42736 +BAMUM COMBINING MARK TUKWENTIS, 42737 +BAMUM NJAEMLI, 42738 +BAMUM FULL STOP, 42739 +BAMUM COLON, 42740 +BAMUM COMMA, 42741 +BAMUM SEMICOLON, 42742 +BAMUM QUESTION MARK, 42743 +MODIFIER LETTER CHINESE TONE YIN PING, 42752 +MODIFIER LETTER CHINESE TONE YANG PING, 42753 +MODIFIER LETTER CHINESE TONE YIN SHANG, 42754 +MODIFIER LETTER CHINESE TONE YANG SHANG, 42755 +MODIFIER LETTER CHINESE TONE YIN QU, 42756 +MODIFIER LETTER CHINESE TONE YANG QU, 42757 +MODIFIER LETTER CHINESE TONE YIN RU, 42758 +MODIFIER LETTER CHINESE TONE YANG RU, 42759 +MODIFIER LETTER EXTRA HIGH DOTTED TONE BAR, 42760 +MODIFIER LETTER HIGH DOTTED TONE BAR, 42761 +MODIFIER LETTER MID DOTTED TONE BAR, 42762 +MODIFIER LETTER LOW DOTTED TONE BAR, 42763 +MODIFIER LETTER EXTRA LOW DOTTED TONE BAR, 42764 +MODIFIER LETTER EXTRA HIGH DOTTED LEFT STEM TONE BAR, 42765 +MODIFIER LETTER HIGH DOTTED LEFT STEM TONE BAR, 42766 +MODIFIER LETTER MID DOTTED LEFT STEM TONE BAR, 42767 +MODIFIER LETTER LOW DOTTED LEFT STEM TONE BAR, 42768 +MODIFIER LETTER EXTRA LOW DOTTED LEFT STEM TONE BAR, 42769 +MODIFIER LETTER EXTRA HIGH LEFT STEM TONE BAR, 42770 +MODIFIER LETTER HIGH LEFT STEM TONE BAR, 42771 +MODIFIER LETTER MID LEFT STEM TONE BAR, 42772 +MODIFIER LETTER LOW LEFT STEM TONE BAR, 42773 +MODIFIER LETTER EXTRA LOW LEFT STEM TONE BAR, 42774 +MODIFIER LETTER DOT VERTICAL BAR, 42775 +MODIFIER LETTER DOT SLASH, 42776 +MODIFIER LETTER DOT HORIZONTAL BAR, 42777 +MODIFIER LETTER LOWER RIGHT CORNER ANGLE, 42778 +MODIFIER LETTER RAISED UP ARROW, 42779 +MODIFIER LETTER RAISED DOWN ARROW, 42780 +MODIFIER LETTER RAISED EXCLAMATION MARK, 42781 +MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK, 42782 +MODIFIER LETTER LOW INVERTED EXCLAMATION MARK, 42783 +MODIFIER LETTER STRESS AND HIGH TONE, 42784 +MODIFIER LETTER STRESS AND LOW TONE, 42785 +LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF, 42786 +LATIN SMALL LETTER EGYPTOLOGICAL ALEF, 42787 +LATIN CAPITAL LETTER EGYPTOLOGICAL AIN, 42788 +LATIN SMALL LETTER EGYPTOLOGICAL AIN, 42789 +LATIN CAPITAL LETTER HENG, 42790 +LATIN SMALL LETTER HENG, 42791 +LATIN CAPITAL LETTER TZ, 42792 +LATIN SMALL LETTER TZ, 42793 +LATIN CAPITAL LETTER TRESILLO, 42794 +LATIN SMALL LETTER TRESILLO, 42795 +LATIN CAPITAL LETTER CUATRILLO, 42796 +LATIN SMALL LETTER CUATRILLO, 42797 +LATIN CAPITAL LETTER CUATRILLO WITH COMMA, 42798 +LATIN SMALL LETTER CUATRILLO WITH COMMA, 42799 +LATIN LETTER SMALL CAPITAL F, 42800 +LATIN LETTER SMALL CAPITAL S, 42801 +LATIN CAPITAL LETTER AA, 42802 +LATIN SMALL LETTER AA, 42803 +LATIN CAPITAL LETTER AO, 42804 +LATIN SMALL LETTER AO, 42805 +LATIN CAPITAL LETTER AU, 42806 +LATIN SMALL LETTER AU, 42807 +LATIN CAPITAL LETTER AV, 42808 +LATIN SMALL LETTER AV, 42809 +LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR, 42810 +LATIN SMALL LETTER AV WITH HORIZONTAL BAR, 42811 +LATIN CAPITAL LETTER AY, 42812 +LATIN SMALL LETTER AY, 42813 +LATIN CAPITAL LETTER REVERSED C WITH DOT, 42814 +LATIN SMALL LETTER REVERSED C WITH DOT, 42815 +LATIN CAPITAL LETTER K WITH STROKE, 42816 +LATIN SMALL LETTER K WITH STROKE, 42817 +LATIN CAPITAL LETTER K WITH DIAGONAL STROKE, 42818 +LATIN SMALL LETTER K WITH DIAGONAL STROKE, 42819 +LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE, 42820 +LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE, 42821 +LATIN CAPITAL LETTER BROKEN L, 42822 +LATIN SMALL LETTER BROKEN L, 42823 +LATIN CAPITAL LETTER L WITH HIGH STROKE, 42824 +LATIN SMALL LETTER L WITH HIGH STROKE, 42825 +LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY, 42826 +LATIN SMALL LETTER O WITH LONG STROKE OVERLAY, 42827 +LATIN CAPITAL LETTER O WITH LOOP, 42828 +LATIN SMALL LETTER O WITH LOOP, 42829 +LATIN CAPITAL LETTER OO, 42830 +LATIN SMALL LETTER OO, 42831 +LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER, 42832 +LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER, 42833 +LATIN CAPITAL LETTER P WITH FLOURISH, 42834 +LATIN SMALL LETTER P WITH FLOURISH, 42835 +LATIN CAPITAL LETTER P WITH SQUIRREL TAIL, 42836 +LATIN SMALL LETTER P WITH SQUIRREL TAIL, 42837 +LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER, 42838 +LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER, 42839 +LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE, 42840 +LATIN SMALL LETTER Q WITH DIAGONAL STROKE, 42841 +LATIN CAPITAL LETTER R ROTUNDA, 42842 +LATIN SMALL LETTER R ROTUNDA, 42843 +LATIN CAPITAL LETTER RUM ROTUNDA, 42844 +LATIN SMALL LETTER RUM ROTUNDA, 42845 +LATIN CAPITAL LETTER V WITH DIAGONAL STROKE, 42846 +LATIN SMALL LETTER V WITH DIAGONAL STROKE, 42847 +LATIN CAPITAL LETTER VY, 42848 +LATIN SMALL LETTER VY, 42849 +LATIN CAPITAL LETTER VISIGOTHIC Z, 42850 +LATIN SMALL LETTER VISIGOTHIC Z, 42851 +LATIN CAPITAL LETTER THORN WITH STROKE, 42852 +LATIN SMALL LETTER THORN WITH STROKE, 42853 +LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER, 42854 +LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER, 42855 +LATIN CAPITAL LETTER VEND, 42856 +LATIN SMALL LETTER VEND, 42857 +LATIN CAPITAL LETTER ET, 42858 +LATIN SMALL LETTER ET, 42859 +LATIN CAPITAL LETTER IS, 42860 +LATIN SMALL LETTER IS, 42861 +LATIN CAPITAL LETTER CON, 42862 +LATIN SMALL LETTER CON, 42863 +MODIFIER LETTER US, 42864 +LATIN SMALL LETTER DUM, 42865 +LATIN SMALL LETTER LUM, 42866 +LATIN SMALL LETTER MUM, 42867 +LATIN SMALL LETTER NUM, 42868 +LATIN SMALL LETTER RUM, 42869 +LATIN LETTER SMALL CAPITAL RUM, 42870 +LATIN SMALL LETTER TUM, 42871 +LATIN SMALL LETTER UM, 42872 +LATIN CAPITAL LETTER INSULAR D, 42873 +LATIN SMALL LETTER INSULAR D, 42874 +LATIN CAPITAL LETTER INSULAR F, 42875 +LATIN SMALL LETTER INSULAR F, 42876 +LATIN CAPITAL LETTER INSULAR G, 42877 +LATIN CAPITAL LETTER TURNED INSULAR G, 42878 +LATIN SMALL LETTER TURNED INSULAR G, 42879 +LATIN CAPITAL LETTER TURNED L, 42880 +LATIN SMALL LETTER TURNED L, 42881 +LATIN CAPITAL LETTER INSULAR R, 42882 +LATIN SMALL LETTER INSULAR R, 42883 +LATIN CAPITAL LETTER INSULAR S, 42884 +LATIN SMALL LETTER INSULAR S, 42885 +LATIN CAPITAL LETTER INSULAR T, 42886 +LATIN SMALL LETTER INSULAR T, 42887 +MODIFIER LETTER LOW CIRCUMFLEX ACCENT, 42888 +MODIFIER LETTER COLON, 42889 +MODIFIER LETTER SHORT EQUALS SIGN, 42890 +LATIN CAPITAL LETTER SALTILLO, 42891 +LATIN SMALL LETTER SALTILLO, 42892 +LATIN CAPITAL LETTER TURNED H, 42893 +LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT, 42894 +LATIN LETTER SINOLOGICAL DOT, 42895 +LATIN CAPITAL LETTER N WITH DESCENDER, 42896 +LATIN SMALL LETTER N WITH DESCENDER, 42897 +LATIN CAPITAL LETTER C WITH BAR, 42898 +LATIN SMALL LETTER C WITH BAR, 42899 +LATIN SMALL LETTER C WITH PALATAL HOOK, 42900 +LATIN SMALL LETTER H WITH PALATAL HOOK, 42901 +LATIN CAPITAL LETTER B WITH FLOURISH, 42902 +LATIN SMALL LETTER B WITH FLOURISH, 42903 +LATIN CAPITAL LETTER F WITH STROKE, 42904 +LATIN SMALL LETTER F WITH STROKE, 42905 +LATIN CAPITAL LETTER VOLAPUK AE, 42906 +LATIN SMALL LETTER VOLAPUK AE, 42907 +LATIN CAPITAL LETTER VOLAPUK OE, 42908 +LATIN SMALL LETTER VOLAPUK OE, 42909 +LATIN CAPITAL LETTER VOLAPUK UE, 42910 +LATIN SMALL LETTER VOLAPUK UE, 42911 +LATIN CAPITAL LETTER G WITH OBLIQUE STROKE, 42912 +LATIN SMALL LETTER G WITH OBLIQUE STROKE, 42913 +LATIN CAPITAL LETTER K WITH OBLIQUE STROKE, 42914 +LATIN SMALL LETTER K WITH OBLIQUE STROKE, 42915 +LATIN CAPITAL LETTER N WITH OBLIQUE STROKE, 42916 +LATIN SMALL LETTER N WITH OBLIQUE STROKE, 42917 +LATIN CAPITAL LETTER R WITH OBLIQUE STROKE, 42918 +LATIN SMALL LETTER R WITH OBLIQUE STROKE, 42919 +LATIN CAPITAL LETTER S WITH OBLIQUE STROKE, 42920 +LATIN SMALL LETTER S WITH OBLIQUE STROKE, 42921 +LATIN CAPITAL LETTER H WITH HOOK, 42922 +LATIN CAPITAL LETTER REVERSED OPEN E, 42923 +LATIN CAPITAL LETTER SCRIPT G, 42924 +LATIN CAPITAL LETTER L WITH BELT, 42925 +LATIN CAPITAL LETTER SMALL CAPITAL I, 42926 +LATIN CAPITAL LETTER TURNED K, 42928 +LATIN CAPITAL LETTER TURNED T, 42929 +LATIN CAPITAL LETTER J WITH CROSSED TAIL, 42930 +LATIN CAPITAL LETTER CHI, 42931 +LATIN CAPITAL LETTER BETA, 42932 +LATIN SMALL LETTER BETA, 42933 +LATIN CAPITAL LETTER OMEGA, 42934 +LATIN SMALL LETTER OMEGA, 42935 +LATIN EPIGRAPHIC LETTER SIDEWAYS I, 42999 +MODIFIER LETTER CAPITAL H WITH STROKE, 43000 +MODIFIER LETTER SMALL LIGATURE OE, 43001 +LATIN LETTER SMALL CAPITAL TURNED M, 43002 +LATIN EPIGRAPHIC LETTER REVERSED F, 43003 +LATIN EPIGRAPHIC LETTER REVERSED P, 43004 +LATIN EPIGRAPHIC LETTER INVERTED M, 43005 +LATIN EPIGRAPHIC LETTER I LONGA, 43006 +LATIN EPIGRAPHIC LETTER ARCHAIC M, 43007 +SYLOTI NAGRI LETTER A, 43008 +SYLOTI NAGRI LETTER I, 43009 +SYLOTI NAGRI SIGN DVISVARA, 43010 +SYLOTI NAGRI LETTER U, 43011 +SYLOTI NAGRI LETTER E, 43012 +SYLOTI NAGRI LETTER O, 43013 +SYLOTI NAGRI SIGN HASANTA, 43014 +SYLOTI NAGRI LETTER KO, 43015 +SYLOTI NAGRI LETTER KHO, 43016 +SYLOTI NAGRI LETTER GO, 43017 +SYLOTI NAGRI LETTER GHO, 43018 +SYLOTI NAGRI SIGN ANUSVARA, 43019 +SYLOTI NAGRI LETTER CO, 43020 +SYLOTI NAGRI LETTER CHO, 43021 +SYLOTI NAGRI LETTER JO, 43022 +SYLOTI NAGRI LETTER JHO, 43023 +SYLOTI NAGRI LETTER TTO, 43024 +SYLOTI NAGRI LETTER TTHO, 43025 +SYLOTI NAGRI LETTER DDO, 43026 +SYLOTI NAGRI LETTER DDHO, 43027 +SYLOTI NAGRI LETTER TO, 43028 +SYLOTI NAGRI LETTER THO, 43029 +SYLOTI NAGRI LETTER DO, 43030 +SYLOTI NAGRI LETTER DHO, 43031 +SYLOTI NAGRI LETTER NO, 43032 +SYLOTI NAGRI LETTER PO, 43033 +SYLOTI NAGRI LETTER PHO, 43034 +SYLOTI NAGRI LETTER BO, 43035 +SYLOTI NAGRI LETTER BHO, 43036 +SYLOTI NAGRI LETTER MO, 43037 +SYLOTI NAGRI LETTER RO, 43038 +SYLOTI NAGRI LETTER LO, 43039 +SYLOTI NAGRI LETTER RRO, 43040 +SYLOTI NAGRI LETTER SO, 43041 +SYLOTI NAGRI LETTER HO, 43042 +SYLOTI NAGRI VOWEL SIGN A, 43043 +SYLOTI NAGRI VOWEL SIGN I, 43044 +SYLOTI NAGRI VOWEL SIGN U, 43045 +SYLOTI NAGRI VOWEL SIGN E, 43046 +SYLOTI NAGRI VOWEL SIGN OO, 43047 +SYLOTI NAGRI POETRY MARK 1, 43048 +SYLOTI NAGRI POETRY MARK 2, 43049 +SYLOTI NAGRI POETRY MARK 3, 43050 +SYLOTI NAGRI POETRY MARK 4, 43051 +NORTH INDIC FRACTION ONE QUARTER, 43056 +NORTH INDIC FRACTION ONE HALF, 43057 +NORTH INDIC FRACTION THREE QUARTERS, 43058 +NORTH INDIC FRACTION ONE SIXTEENTH, 43059 +NORTH INDIC FRACTION ONE EIGHTH, 43060 +NORTH INDIC FRACTION THREE SIXTEENTHS, 43061 +NORTH INDIC QUARTER MARK, 43062 +NORTH INDIC PLACEHOLDER MARK, 43063 +NORTH INDIC RUPEE MARK, 43064 +NORTH INDIC QUANTITY MARK, 43065 +PHAGS PA LETTER KA, 43072 +PHAGS PA LETTER KHA, 43073 +PHAGS PA LETTER GA, 43074 +PHAGS PA LETTER NGA, 43075 +PHAGS PA LETTER CA, 43076 +PHAGS PA LETTER CHA, 43077 +PHAGS PA LETTER JA, 43078 +PHAGS PA LETTER NYA, 43079 +PHAGS PA LETTER TA, 43080 +PHAGS PA LETTER THA, 43081 +PHAGS PA LETTER DA, 43082 +PHAGS PA LETTER NA, 43083 +PHAGS PA LETTER PA, 43084 +PHAGS PA LETTER PHA, 43085 +PHAGS PA LETTER BA, 43086 +PHAGS PA LETTER MA, 43087 +PHAGS PA LETTER TSA, 43088 +PHAGS PA LETTER TSHA, 43089 +PHAGS PA LETTER DZA, 43090 +PHAGS PA LETTER WA, 43091 +PHAGS PA LETTER ZHA, 43092 +PHAGS PA LETTER ZA, 43093 +PHAGS PA LETTER SMALL A, 43094 +PHAGS PA LETTER YA, 43095 +PHAGS PA LETTER RA, 43096 +PHAGS PA LETTER LA, 43097 +PHAGS PA LETTER SHA, 43098 +PHAGS PA LETTER SA, 43099 +PHAGS PA LETTER HA, 43100 +PHAGS PA LETTER A, 43101 +PHAGS PA LETTER I, 43102 +PHAGS PA LETTER U, 43103 +PHAGS PA LETTER E, 43104 +PHAGS PA LETTER O, 43105 +PHAGS PA LETTER QA, 43106 +PHAGS PA LETTER XA, 43107 +PHAGS PA LETTER FA, 43108 +PHAGS PA LETTER GGA, 43109 +PHAGS PA LETTER EE, 43110 +PHAGS PA SUBJOINED LETTER WA, 43111 +PHAGS PA SUBJOINED LETTER YA, 43112 +PHAGS PA LETTER TTA, 43113 +PHAGS PA LETTER TTHA, 43114 +PHAGS PA LETTER DDA, 43115 +PHAGS PA LETTER NNA, 43116 +PHAGS PA LETTER ALTERNATE YA, 43117 +PHAGS PA LETTER VOICELESS SHA, 43118 +PHAGS PA LETTER VOICED HA, 43119 +PHAGS PA LETTER ASPIRATED FA, 43120 +PHAGS PA SUBJOINED LETTER RA, 43121 +PHAGS PA SUPERFIXED LETTER RA, 43122 +PHAGS PA LETTER CANDRABINDU, 43123 +PHAGS PA SINGLE HEAD MARK, 43124 +PHAGS PA DOUBLE HEAD MARK, 43125 +PHAGS PA MARK SHAD, 43126 +PHAGS PA MARK DOUBLE SHAD, 43127 +SAURASHTRA SIGN ANUSVARA, 43136 +SAURASHTRA SIGN VISARGA, 43137 +SAURASHTRA LETTER A, 43138 +SAURASHTRA LETTER AA, 43139 +SAURASHTRA LETTER I, 43140 +SAURASHTRA LETTER II, 43141 +SAURASHTRA LETTER U, 43142 +SAURASHTRA LETTER UU, 43143 +SAURASHTRA LETTER VOCALIC R, 43144 +SAURASHTRA LETTER VOCALIC RR, 43145 +SAURASHTRA LETTER VOCALIC L, 43146 +SAURASHTRA LETTER VOCALIC LL, 43147 +SAURASHTRA LETTER E, 43148 +SAURASHTRA LETTER EE, 43149 +SAURASHTRA LETTER AI, 43150 +SAURASHTRA LETTER O, 43151 +SAURASHTRA LETTER OO, 43152 +SAURASHTRA LETTER AU, 43153 +SAURASHTRA LETTER KA, 43154 +SAURASHTRA LETTER KHA, 43155 +SAURASHTRA LETTER GA, 43156 +SAURASHTRA LETTER GHA, 43157 +SAURASHTRA LETTER NGA, 43158 +SAURASHTRA LETTER CA, 43159 +SAURASHTRA LETTER CHA, 43160 +SAURASHTRA LETTER JA, 43161 +SAURASHTRA LETTER JHA, 43162 +SAURASHTRA LETTER NYA, 43163 +SAURASHTRA LETTER TTA, 43164 +SAURASHTRA LETTER TTHA, 43165 +SAURASHTRA LETTER DDA, 43166 +SAURASHTRA LETTER DDHA, 43167 +SAURASHTRA LETTER NNA, 43168 +SAURASHTRA LETTER TA, 43169 +SAURASHTRA LETTER THA, 43170 +SAURASHTRA LETTER DA, 43171 +SAURASHTRA LETTER DHA, 43172 +SAURASHTRA LETTER NA, 43173 +SAURASHTRA LETTER PA, 43174 +SAURASHTRA LETTER PHA, 43175 +SAURASHTRA LETTER BA, 43176 +SAURASHTRA LETTER BHA, 43177 +SAURASHTRA LETTER MA, 43178 +SAURASHTRA LETTER YA, 43179 +SAURASHTRA LETTER RA, 43180 +SAURASHTRA LETTER LA, 43181 +SAURASHTRA LETTER VA, 43182 +SAURASHTRA LETTER SHA, 43183 +SAURASHTRA LETTER SSA, 43184 +SAURASHTRA LETTER SA, 43185 +SAURASHTRA LETTER HA, 43186 +SAURASHTRA LETTER LLA, 43187 +SAURASHTRA CONSONANT SIGN HAARU, 43188 +SAURASHTRA VOWEL SIGN AA, 43189 +SAURASHTRA VOWEL SIGN I, 43190 +SAURASHTRA VOWEL SIGN II, 43191 +SAURASHTRA VOWEL SIGN U, 43192 +SAURASHTRA VOWEL SIGN UU, 43193 +SAURASHTRA VOWEL SIGN VOCALIC R, 43194 +SAURASHTRA VOWEL SIGN VOCALIC RR, 43195 +SAURASHTRA VOWEL SIGN VOCALIC L, 43196 +SAURASHTRA VOWEL SIGN VOCALIC LL, 43197 +SAURASHTRA VOWEL SIGN E, 43198 +SAURASHTRA VOWEL SIGN EE, 43199 +SAURASHTRA VOWEL SIGN AI, 43200 +SAURASHTRA VOWEL SIGN O, 43201 +SAURASHTRA VOWEL SIGN OO, 43202 +SAURASHTRA VOWEL SIGN AU, 43203 +SAURASHTRA SIGN VIRAMA, 43204 +SAURASHTRA SIGN CANDRABINDU, 43205 +SAURASHTRA DANDA, 43214 +SAURASHTRA DOUBLE DANDA, 43215 +SAURASHTRA DIGIT ZERO, 43216 +SAURASHTRA DIGIT ONE, 43217 +SAURASHTRA DIGIT TWO, 43218 +SAURASHTRA DIGIT THREE, 43219 +SAURASHTRA DIGIT FOUR, 43220 +SAURASHTRA DIGIT FIVE, 43221 +SAURASHTRA DIGIT SIX, 43222 +SAURASHTRA DIGIT SEVEN, 43223 +SAURASHTRA DIGIT EIGHT, 43224 +SAURASHTRA DIGIT NINE, 43225 +COMBINING DEVANAGARI DIGIT ZERO, 43232 +COMBINING DEVANAGARI DIGIT ONE, 43233 +COMBINING DEVANAGARI DIGIT TWO, 43234 +COMBINING DEVANAGARI DIGIT THREE, 43235 +COMBINING DEVANAGARI DIGIT FOUR, 43236 +COMBINING DEVANAGARI DIGIT FIVE, 43237 +COMBINING DEVANAGARI DIGIT SIX, 43238 +COMBINING DEVANAGARI DIGIT SEVEN, 43239 +COMBINING DEVANAGARI DIGIT EIGHT, 43240 +COMBINING DEVANAGARI DIGIT NINE, 43241 +COMBINING DEVANAGARI LETTER A, 43242 +COMBINING DEVANAGARI LETTER U, 43243 +COMBINING DEVANAGARI LETTER KA, 43244 +COMBINING DEVANAGARI LETTER NA, 43245 +COMBINING DEVANAGARI LETTER PA, 43246 +COMBINING DEVANAGARI LETTER RA, 43247 +COMBINING DEVANAGARI LETTER VI, 43248 +COMBINING DEVANAGARI SIGN AVAGRAHA, 43249 +DEVANAGARI SIGN SPACING CANDRABINDU, 43250 +DEVANAGARI SIGN CANDRABINDU VIRAMA, 43251 +DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA, 43252 +DEVANAGARI SIGN CANDRABINDU TWO, 43253 +DEVANAGARI SIGN CANDRABINDU THREE, 43254 +DEVANAGARI SIGN CANDRABINDU AVAGRAHA, 43255 +DEVANAGARI SIGN PUSHPIKA, 43256 +DEVANAGARI GAP FILLER, 43257 +DEVANAGARI CARET, 43258 +DEVANAGARI HEADSTROKE, 43259 +DEVANAGARI SIGN SIDDHAM, 43260 +DEVANAGARI JAIN OM, 43261 +KAYAH LI DIGIT ZERO, 43264 +KAYAH LI DIGIT ONE, 43265 +KAYAH LI DIGIT TWO, 43266 +KAYAH LI DIGIT THREE, 43267 +KAYAH LI DIGIT FOUR, 43268 +KAYAH LI DIGIT FIVE, 43269 +KAYAH LI DIGIT SIX, 43270 +KAYAH LI DIGIT SEVEN, 43271 +KAYAH LI DIGIT EIGHT, 43272 +KAYAH LI DIGIT NINE, 43273 +KAYAH LI LETTER KA, 43274 +KAYAH LI LETTER KHA, 43275 +KAYAH LI LETTER GA, 43276 +KAYAH LI LETTER NGA, 43277 +KAYAH LI LETTER SA, 43278 +KAYAH LI LETTER SHA, 43279 +KAYAH LI LETTER ZA, 43280 +KAYAH LI LETTER NYA, 43281 +KAYAH LI LETTER TA, 43282 +KAYAH LI LETTER HTA, 43283 +KAYAH LI LETTER NA, 43284 +KAYAH LI LETTER PA, 43285 +KAYAH LI LETTER PHA, 43286 +KAYAH LI LETTER MA, 43287 +KAYAH LI LETTER DA, 43288 +KAYAH LI LETTER BA, 43289 +KAYAH LI LETTER RA, 43290 +KAYAH LI LETTER YA, 43291 +KAYAH LI LETTER LA, 43292 +KAYAH LI LETTER WA, 43293 +KAYAH LI LETTER THA, 43294 +KAYAH LI LETTER HA, 43295 +KAYAH LI LETTER VA, 43296 +KAYAH LI LETTER CA, 43297 +KAYAH LI LETTER A, 43298 +KAYAH LI LETTER OE, 43299 +KAYAH LI LETTER I, 43300 +KAYAH LI LETTER OO, 43301 +KAYAH LI VOWEL UE, 43302 +KAYAH LI VOWEL E, 43303 +KAYAH LI VOWEL U, 43304 +KAYAH LI VOWEL EE, 43305 +KAYAH LI VOWEL O, 43306 +KAYAH LI TONE PLOPHU, 43307 +KAYAH LI TONE CALYA, 43308 +KAYAH LI TONE CALYA PLOPHU, 43309 +KAYAH LI SIGN CWI, 43310 +KAYAH LI SIGN SHYA, 43311 +REJANG LETTER KA, 43312 +REJANG LETTER GA, 43313 +REJANG LETTER NGA, 43314 +REJANG LETTER TA, 43315 +REJANG LETTER DA, 43316 +REJANG LETTER NA, 43317 +REJANG LETTER PA, 43318 +REJANG LETTER BA, 43319 +REJANG LETTER MA, 43320 +REJANG LETTER CA, 43321 +REJANG LETTER JA, 43322 +REJANG LETTER NYA, 43323 +REJANG LETTER SA, 43324 +REJANG LETTER RA, 43325 +REJANG LETTER LA, 43326 +REJANG LETTER YA, 43327 +REJANG LETTER WA, 43328 +REJANG LETTER HA, 43329 +REJANG LETTER MBA, 43330 +REJANG LETTER NGGA, 43331 +REJANG LETTER NDA, 43332 +REJANG LETTER NYJA, 43333 +REJANG LETTER A, 43334 +REJANG VOWEL SIGN I, 43335 +REJANG VOWEL SIGN U, 43336 +REJANG VOWEL SIGN E, 43337 +REJANG VOWEL SIGN AI, 43338 +REJANG VOWEL SIGN O, 43339 +REJANG VOWEL SIGN AU, 43340 +REJANG VOWEL SIGN EU, 43341 +REJANG VOWEL SIGN EA, 43342 +REJANG CONSONANT SIGN NG, 43343 +REJANG CONSONANT SIGN N, 43344 +REJANG CONSONANT SIGN R, 43345 +REJANG CONSONANT SIGN H, 43346 +REJANG VIRAMA, 43347 +REJANG SECTION MARK, 43359 +HANGUL CHOSEONG TIKEUT MIEUM, 43360 +HANGUL CHOSEONG TIKEUT PIEUP, 43361 +HANGUL CHOSEONG TIKEUT SIOS, 43362 +HANGUL CHOSEONG TIKEUT CIEUC, 43363 +HANGUL CHOSEONG RIEUL KIYEOK, 43364 +HANGUL CHOSEONG RIEUL SSANGKIYEOK, 43365 +HANGUL CHOSEONG RIEUL TIKEUT, 43366 +HANGUL CHOSEONG RIEUL SSANGTIKEUT, 43367 +HANGUL CHOSEONG RIEUL MIEUM, 43368 +HANGUL CHOSEONG RIEUL PIEUP, 43369 +HANGUL CHOSEONG RIEUL SSANGPIEUP, 43370 +HANGUL CHOSEONG RIEUL KAPYEOUNPIEUP, 43371 +HANGUL CHOSEONG RIEUL SIOS, 43372 +HANGUL CHOSEONG RIEUL CIEUC, 43373 +HANGUL CHOSEONG RIEUL KHIEUKH, 43374 +HANGUL CHOSEONG MIEUM KIYEOK, 43375 +HANGUL CHOSEONG MIEUM TIKEUT, 43376 +HANGUL CHOSEONG MIEUM SIOS, 43377 +HANGUL CHOSEONG PIEUP SIOS THIEUTH, 43378 +HANGUL CHOSEONG PIEUP KHIEUKH, 43379 +HANGUL CHOSEONG PIEUP HIEUH, 43380 +HANGUL CHOSEONG SSANGSIOS PIEUP, 43381 +HANGUL CHOSEONG IEUNG RIEUL, 43382 +HANGUL CHOSEONG IEUNG HIEUH, 43383 +HANGUL CHOSEONG SSANGCIEUC HIEUH, 43384 +HANGUL CHOSEONG SSANGTHIEUTH, 43385 +HANGUL CHOSEONG PHIEUPH HIEUH, 43386 +HANGUL CHOSEONG HIEUH SIOS, 43387 +HANGUL CHOSEONG SSANGYEORINHIEUH, 43388 +JAVANESE SIGN PANYANGGA, 43392 +JAVANESE SIGN CECAK, 43393 +JAVANESE SIGN LAYAR, 43394 +JAVANESE SIGN WIGNYAN, 43395 +JAVANESE LETTER A, 43396 +JAVANESE LETTER I KAWI, 43397 +JAVANESE LETTER I, 43398 +JAVANESE LETTER II, 43399 +JAVANESE LETTER U, 43400 +JAVANESE LETTER PA CEREK, 43401 +JAVANESE LETTER NGA LELET, 43402 +JAVANESE LETTER NGA LELET RASWADI, 43403 +JAVANESE LETTER E, 43404 +JAVANESE LETTER AI, 43405 +JAVANESE LETTER O, 43406 +JAVANESE LETTER KA, 43407 +JAVANESE LETTER KA SASAK, 43408 +JAVANESE LETTER KA MURDA, 43409 +JAVANESE LETTER GA, 43410 +JAVANESE LETTER GA MURDA, 43411 +JAVANESE LETTER NGA, 43412 +JAVANESE LETTER CA, 43413 +JAVANESE LETTER CA MURDA, 43414 +JAVANESE LETTER JA, 43415 +JAVANESE LETTER NYA MURDA, 43416 +JAVANESE LETTER JA MAHAPRANA, 43417 +JAVANESE LETTER NYA, 43418 +JAVANESE LETTER TTA, 43419 +JAVANESE LETTER TTA MAHAPRANA, 43420 +JAVANESE LETTER DDA, 43421 +JAVANESE LETTER DDA MAHAPRANA, 43422 +JAVANESE LETTER NA MURDA, 43423 +JAVANESE LETTER TA, 43424 +JAVANESE LETTER TA MURDA, 43425 +JAVANESE LETTER DA, 43426 +JAVANESE LETTER DA MAHAPRANA, 43427 +JAVANESE LETTER NA, 43428 +JAVANESE LETTER PA, 43429 +JAVANESE LETTER PA MURDA, 43430 +JAVANESE LETTER BA, 43431 +JAVANESE LETTER BA MURDA, 43432 +JAVANESE LETTER MA, 43433 +JAVANESE LETTER YA, 43434 +JAVANESE LETTER RA, 43435 +JAVANESE LETTER RA AGUNG, 43436 +JAVANESE LETTER LA, 43437 +JAVANESE LETTER WA, 43438 +JAVANESE LETTER SA MURDA, 43439 +JAVANESE LETTER SA MAHAPRANA, 43440 +JAVANESE LETTER SA, 43441 +JAVANESE LETTER HA, 43442 +JAVANESE SIGN CECAK TELU, 43443 +JAVANESE VOWEL SIGN TARUNG, 43444 +JAVANESE VOWEL SIGN TOLONG, 43445 +JAVANESE VOWEL SIGN WULU, 43446 +JAVANESE VOWEL SIGN WULU MELIK, 43447 +JAVANESE VOWEL SIGN SUKU, 43448 +JAVANESE VOWEL SIGN SUKU MENDUT, 43449 +JAVANESE VOWEL SIGN TALING, 43450 +JAVANESE VOWEL SIGN DIRGA MURE, 43451 +JAVANESE VOWEL SIGN PEPET, 43452 +JAVANESE CONSONANT SIGN KERET, 43453 +JAVANESE CONSONANT SIGN PENGKAL, 43454 +JAVANESE CONSONANT SIGN CAKRA, 43455 +JAVANESE PANGKON, 43456 +JAVANESE LEFT RERENGGAN, 43457 +JAVANESE RIGHT RERENGGAN, 43458 +JAVANESE PADA ANDAP, 43459 +JAVANESE PADA MADYA, 43460 +JAVANESE PADA LUHUR, 43461 +JAVANESE PADA WINDU, 43462 +JAVANESE PADA PANGKAT, 43463 +JAVANESE PADA LINGSA, 43464 +JAVANESE PADA LUNGSI, 43465 +JAVANESE PADA ADEG, 43466 +JAVANESE PADA ADEG ADEG, 43467 +JAVANESE PADA PISELEH, 43468 +JAVANESE TURNED PADA PISELEH, 43469 +JAVANESE PANGRANGKEP, 43471 +JAVANESE DIGIT ZERO, 43472 +JAVANESE DIGIT ONE, 43473 +JAVANESE DIGIT TWO, 43474 +JAVANESE DIGIT THREE, 43475 +JAVANESE DIGIT FOUR, 43476 +JAVANESE DIGIT FIVE, 43477 +JAVANESE DIGIT SIX, 43478 +JAVANESE DIGIT SEVEN, 43479 +JAVANESE DIGIT EIGHT, 43480 +JAVANESE DIGIT NINE, 43481 +JAVANESE PADA TIRTA TUMETES, 43486 +JAVANESE PADA ISEN ISEN, 43487 +MYANMAR LETTER SHAN GHA, 43488 +MYANMAR LETTER SHAN CHA, 43489 +MYANMAR LETTER SHAN JHA, 43490 +MYANMAR LETTER SHAN NNA, 43491 +MYANMAR LETTER SHAN BHA, 43492 +MYANMAR SIGN SHAN SAW, 43493 +MYANMAR MODIFIER LETTER SHAN REDUPLICATION, 43494 +MYANMAR LETTER TAI LAING NYA, 43495 +MYANMAR LETTER TAI LAING FA, 43496 +MYANMAR LETTER TAI LAING GA, 43497 +MYANMAR LETTER TAI LAING GHA, 43498 +MYANMAR LETTER TAI LAING JA, 43499 +MYANMAR LETTER TAI LAING JHA, 43500 +MYANMAR LETTER TAI LAING DDA, 43501 +MYANMAR LETTER TAI LAING DDHA, 43502 +MYANMAR LETTER TAI LAING NNA, 43503 +MYANMAR TAI LAING DIGIT ZERO, 43504 +MYANMAR TAI LAING DIGIT ONE, 43505 +MYANMAR TAI LAING DIGIT TWO, 43506 +MYANMAR TAI LAING DIGIT THREE, 43507 +MYANMAR TAI LAING DIGIT FOUR, 43508 +MYANMAR TAI LAING DIGIT FIVE, 43509 +MYANMAR TAI LAING DIGIT SIX, 43510 +MYANMAR TAI LAING DIGIT SEVEN, 43511 +MYANMAR TAI LAING DIGIT EIGHT, 43512 +MYANMAR TAI LAING DIGIT NINE, 43513 +MYANMAR LETTER TAI LAING LLA, 43514 +MYANMAR LETTER TAI LAING DA, 43515 +MYANMAR LETTER TAI LAING DHA, 43516 +MYANMAR LETTER TAI LAING BA, 43517 +MYANMAR LETTER TAI LAING BHA, 43518 +CHAM LETTER A, 43520 +CHAM LETTER I, 43521 +CHAM LETTER U, 43522 +CHAM LETTER E, 43523 +CHAM LETTER AI, 43524 +CHAM LETTER O, 43525 +CHAM LETTER KA, 43526 +CHAM LETTER KHA, 43527 +CHAM LETTER GA, 43528 +CHAM LETTER GHA, 43529 +CHAM LETTER NGUE, 43530 +CHAM LETTER NGA, 43531 +CHAM LETTER CHA, 43532 +CHAM LETTER CHHA, 43533 +CHAM LETTER JA, 43534 +CHAM LETTER JHA, 43535 +CHAM LETTER NHUE, 43536 +CHAM LETTER NHA, 43537 +CHAM LETTER NHJA, 43538 +CHAM LETTER TA, 43539 +CHAM LETTER THA, 43540 +CHAM LETTER DA, 43541 +CHAM LETTER DHA, 43542 +CHAM LETTER NUE, 43543 +CHAM LETTER NA, 43544 +CHAM LETTER DDA, 43545 +CHAM LETTER PA, 43546 +CHAM LETTER PPA, 43547 +CHAM LETTER PHA, 43548 +CHAM LETTER BA, 43549 +CHAM LETTER BHA, 43550 +CHAM LETTER MUE, 43551 +CHAM LETTER MA, 43552 +CHAM LETTER BBA, 43553 +CHAM LETTER YA, 43554 +CHAM LETTER RA, 43555 +CHAM LETTER LA, 43556 +CHAM LETTER VA, 43557 +CHAM LETTER SSA, 43558 +CHAM LETTER SA, 43559 +CHAM LETTER HA, 43560 +CHAM VOWEL SIGN AA, 43561 +CHAM VOWEL SIGN I, 43562 +CHAM VOWEL SIGN II, 43563 +CHAM VOWEL SIGN EI, 43564 +CHAM VOWEL SIGN U, 43565 +CHAM VOWEL SIGN OE, 43566 +CHAM VOWEL SIGN O, 43567 +CHAM VOWEL SIGN AI, 43568 +CHAM VOWEL SIGN AU, 43569 +CHAM VOWEL SIGN UE, 43570 +CHAM CONSONANT SIGN YA, 43571 +CHAM CONSONANT SIGN RA, 43572 +CHAM CONSONANT SIGN LA, 43573 +CHAM CONSONANT SIGN WA, 43574 +CHAM LETTER FINAL K, 43584 +CHAM LETTER FINAL G, 43585 +CHAM LETTER FINAL NG, 43586 +CHAM CONSONANT SIGN FINAL NG, 43587 +CHAM LETTER FINAL CH, 43588 +CHAM LETTER FINAL T, 43589 +CHAM LETTER FINAL N, 43590 +CHAM LETTER FINAL P, 43591 +CHAM LETTER FINAL Y, 43592 +CHAM LETTER FINAL R, 43593 +CHAM LETTER FINAL L, 43594 +CHAM LETTER FINAL SS, 43595 +CHAM CONSONANT SIGN FINAL M, 43596 +CHAM CONSONANT SIGN FINAL H, 43597 +CHAM DIGIT ZERO, 43600 +CHAM DIGIT ONE, 43601 +CHAM DIGIT TWO, 43602 +CHAM DIGIT THREE, 43603 +CHAM DIGIT FOUR, 43604 +CHAM DIGIT FIVE, 43605 +CHAM DIGIT SIX, 43606 +CHAM DIGIT SEVEN, 43607 +CHAM DIGIT EIGHT, 43608 +CHAM DIGIT NINE, 43609 +CHAM PUNCTUATION SPIRAL, 43612 +CHAM PUNCTUATION DANDA, 43613 +CHAM PUNCTUATION DOUBLE DANDA, 43614 +CHAM PUNCTUATION TRIPLE DANDA, 43615 +MYANMAR LETTER KHAMTI GA, 43616 +MYANMAR LETTER KHAMTI CA, 43617 +MYANMAR LETTER KHAMTI CHA, 43618 +MYANMAR LETTER KHAMTI JA, 43619 +MYANMAR LETTER KHAMTI JHA, 43620 +MYANMAR LETTER KHAMTI NYA, 43621 +MYANMAR LETTER KHAMTI TTA, 43622 +MYANMAR LETTER KHAMTI TTHA, 43623 +MYANMAR LETTER KHAMTI DDA, 43624 +MYANMAR LETTER KHAMTI DDHA, 43625 +MYANMAR LETTER KHAMTI DHA, 43626 +MYANMAR LETTER KHAMTI NA, 43627 +MYANMAR LETTER KHAMTI SA, 43628 +MYANMAR LETTER KHAMTI HA, 43629 +MYANMAR LETTER KHAMTI HHA, 43630 +MYANMAR LETTER KHAMTI FA, 43631 +MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION, 43632 +MYANMAR LETTER KHAMTI XA, 43633 +MYANMAR LETTER KHAMTI ZA, 43634 +MYANMAR LETTER KHAMTI RA, 43635 +MYANMAR LOGOGRAM KHAMTI OAY, 43636 +MYANMAR LOGOGRAM KHAMTI QN, 43637 +MYANMAR LOGOGRAM KHAMTI HM, 43638 +MYANMAR SYMBOL AITON EXCLAMATION, 43639 +MYANMAR SYMBOL AITON ONE, 43640 +MYANMAR SYMBOL AITON TWO, 43641 +MYANMAR LETTER AITON RA, 43642 +MYANMAR SIGN PAO KAREN TONE, 43643 +MYANMAR SIGN TAI LAING TONE 2, 43644 +MYANMAR SIGN TAI LAING TONE 5, 43645 +MYANMAR LETTER SHWE PALAUNG CHA, 43646 +MYANMAR LETTER SHWE PALAUNG SHA, 43647 +TAI VIET LETTER LOW KO, 43648 +TAI VIET LETTER HIGH KO, 43649 +TAI VIET LETTER LOW KHO, 43650 +TAI VIET LETTER HIGH KHO, 43651 +TAI VIET LETTER LOW KHHO, 43652 +TAI VIET LETTER HIGH KHHO, 43653 +TAI VIET LETTER LOW GO, 43654 +TAI VIET LETTER HIGH GO, 43655 +TAI VIET LETTER LOW NGO, 43656 +TAI VIET LETTER HIGH NGO, 43657 +TAI VIET LETTER LOW CO, 43658 +TAI VIET LETTER HIGH CO, 43659 +TAI VIET LETTER LOW CHO, 43660 +TAI VIET LETTER HIGH CHO, 43661 +TAI VIET LETTER LOW SO, 43662 +TAI VIET LETTER HIGH SO, 43663 +TAI VIET LETTER LOW NYO, 43664 +TAI VIET LETTER HIGH NYO, 43665 +TAI VIET LETTER LOW DO, 43666 +TAI VIET LETTER HIGH DO, 43667 +TAI VIET LETTER LOW TO, 43668 +TAI VIET LETTER HIGH TO, 43669 +TAI VIET LETTER LOW THO, 43670 +TAI VIET LETTER HIGH THO, 43671 +TAI VIET LETTER LOW NO, 43672 +TAI VIET LETTER HIGH NO, 43673 +TAI VIET LETTER LOW BO, 43674 +TAI VIET LETTER HIGH BO, 43675 +TAI VIET LETTER LOW PO, 43676 +TAI VIET LETTER HIGH PO, 43677 +TAI VIET LETTER LOW PHO, 43678 +TAI VIET LETTER HIGH PHO, 43679 +TAI VIET LETTER LOW FO, 43680 +TAI VIET LETTER HIGH FO, 43681 +TAI VIET LETTER LOW MO, 43682 +TAI VIET LETTER HIGH MO, 43683 +TAI VIET LETTER LOW YO, 43684 +TAI VIET LETTER HIGH YO, 43685 +TAI VIET LETTER LOW RO, 43686 +TAI VIET LETTER HIGH RO, 43687 +TAI VIET LETTER LOW LO, 43688 +TAI VIET LETTER HIGH LO, 43689 +TAI VIET LETTER LOW VO, 43690 +TAI VIET LETTER HIGH VO, 43691 +TAI VIET LETTER LOW HO, 43692 +TAI VIET LETTER HIGH HO, 43693 +TAI VIET LETTER LOW O, 43694 +TAI VIET LETTER HIGH O, 43695 +TAI VIET MAI KANG, 43696 +TAI VIET VOWEL AA, 43697 +TAI VIET VOWEL I, 43698 +TAI VIET VOWEL UE, 43699 +TAI VIET VOWEL U, 43700 +TAI VIET VOWEL E, 43701 +TAI VIET VOWEL O, 43702 +TAI VIET MAI KHIT, 43703 +TAI VIET VOWEL IA, 43704 +TAI VIET VOWEL UEA, 43705 +TAI VIET VOWEL UA, 43706 +TAI VIET VOWEL AUE, 43707 +TAI VIET VOWEL AY, 43708 +TAI VIET VOWEL AN, 43709 +TAI VIET VOWEL AM, 43710 +TAI VIET TONE MAI EK, 43711 +TAI VIET TONE MAI NUENG, 43712 +TAI VIET TONE MAI THO, 43713 +TAI VIET TONE MAI SONG, 43714 +TAI VIET SYMBOL KON, 43739 +TAI VIET SYMBOL NUENG, 43740 +TAI VIET SYMBOL SAM, 43741 +TAI VIET SYMBOL HO HOI, 43742 +TAI VIET SYMBOL KOI KOI, 43743 +MEETEI MAYEK LETTER E, 43744 +MEETEI MAYEK LETTER O, 43745 +MEETEI MAYEK LETTER CHA, 43746 +MEETEI MAYEK LETTER NYA, 43747 +MEETEI MAYEK LETTER TTA, 43748 +MEETEI MAYEK LETTER TTHA, 43749 +MEETEI MAYEK LETTER DDA, 43750 +MEETEI MAYEK LETTER DDHA, 43751 +MEETEI MAYEK LETTER NNA, 43752 +MEETEI MAYEK LETTER SHA, 43753 +MEETEI MAYEK LETTER SSA, 43754 +MEETEI MAYEK VOWEL SIGN II, 43755 +MEETEI MAYEK VOWEL SIGN UU, 43756 +MEETEI MAYEK VOWEL SIGN AAI, 43757 +MEETEI MAYEK VOWEL SIGN AU, 43758 +MEETEI MAYEK VOWEL SIGN AAU, 43759 +MEETEI MAYEK CHEIKHAN, 43760 +MEETEI MAYEK AHANG KHUDAM, 43761 +MEETEI MAYEK ANJI, 43762 +MEETEI MAYEK SYLLABLE REPETITION MARK, 43763 +MEETEI MAYEK WORD REPETITION MARK, 43764 +MEETEI MAYEK VOWEL SIGN VISARGA, 43765 +MEETEI MAYEK VIRAMA, 43766 +ETHIOPIC SYLLABLE TTHU, 43777 +ETHIOPIC SYLLABLE TTHI, 43778 +ETHIOPIC SYLLABLE TTHAA, 43779 +ETHIOPIC SYLLABLE TTHEE, 43780 +ETHIOPIC SYLLABLE TTHE, 43781 +ETHIOPIC SYLLABLE TTHO, 43782 +ETHIOPIC SYLLABLE DDHU, 43785 +ETHIOPIC SYLLABLE DDHI, 43786 +ETHIOPIC SYLLABLE DDHAA, 43787 +ETHIOPIC SYLLABLE DDHEE, 43788 +ETHIOPIC SYLLABLE DDHE, 43789 +ETHIOPIC SYLLABLE DDHO, 43790 +ETHIOPIC SYLLABLE DZU, 43793 +ETHIOPIC SYLLABLE DZI, 43794 +ETHIOPIC SYLLABLE DZAA, 43795 +ETHIOPIC SYLLABLE DZEE, 43796 +ETHIOPIC SYLLABLE DZE, 43797 +ETHIOPIC SYLLABLE DZO, 43798 +ETHIOPIC SYLLABLE CCHHA, 43808 +ETHIOPIC SYLLABLE CCHHU, 43809 +ETHIOPIC SYLLABLE CCHHI, 43810 +ETHIOPIC SYLLABLE CCHHAA, 43811 +ETHIOPIC SYLLABLE CCHHEE, 43812 +ETHIOPIC SYLLABLE CCHHE, 43813 +ETHIOPIC SYLLABLE CCHHO, 43814 +ETHIOPIC SYLLABLE BBA, 43816 +ETHIOPIC SYLLABLE BBU, 43817 +ETHIOPIC SYLLABLE BBI, 43818 +ETHIOPIC SYLLABLE BBAA, 43819 +ETHIOPIC SYLLABLE BBEE, 43820 +ETHIOPIC SYLLABLE BBE, 43821 +ETHIOPIC SYLLABLE BBO, 43822 +LATIN SMALL LETTER BARRED ALPHA, 43824 +LATIN SMALL LETTER A REVERSED SCHWA, 43825 +LATIN SMALL LETTER BLACKLETTER E, 43826 +LATIN SMALL LETTER BARRED E, 43827 +LATIN SMALL LETTER E WITH FLOURISH, 43828 +LATIN SMALL LETTER LENIS F, 43829 +LATIN SMALL LETTER SCRIPT G WITH CROSSED TAIL, 43830 +LATIN SMALL LETTER L WITH INVERTED LAZY S, 43831 +LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE, 43832 +LATIN SMALL LETTER L WITH MIDDLE RING, 43833 +LATIN SMALL LETTER M WITH CROSSED TAIL, 43834 +LATIN SMALL LETTER N WITH CROSSED TAIL, 43835 +LATIN SMALL LETTER ENG WITH CROSSED TAIL, 43836 +LATIN SMALL LETTER BLACKLETTER O, 43837 +LATIN SMALL LETTER BLACKLETTER O WITH STROKE, 43838 +LATIN SMALL LETTER OPEN O WITH STROKE, 43839 +LATIN SMALL LETTER INVERTED OE, 43840 +LATIN SMALL LETTER TURNED OE WITH STROKE, 43841 +LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE, 43842 +LATIN SMALL LETTER TURNED O OPEN O, 43843 +LATIN SMALL LETTER TURNED O OPEN O WITH STROKE, 43844 +LATIN SMALL LETTER STIRRUP R, 43845 +LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG, 43846 +LATIN SMALL LETTER R WITHOUT HANDLE, 43847 +LATIN SMALL LETTER DOUBLE R, 43848 +LATIN SMALL LETTER R WITH CROSSED TAIL, 43849 +LATIN SMALL LETTER DOUBLE R WITH CROSSED TAIL, 43850 +LATIN SMALL LETTER SCRIPT R, 43851 +LATIN SMALL LETTER SCRIPT R WITH RING, 43852 +LATIN SMALL LETTER BASELINE ESH, 43853 +LATIN SMALL LETTER U WITH SHORT RIGHT LEG, 43854 +LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG, 43855 +LATIN SMALL LETTER UI, 43856 +LATIN SMALL LETTER TURNED UI, 43857 +LATIN SMALL LETTER U WITH LEFT HOOK, 43858 +LATIN SMALL LETTER CHI, 43859 +LATIN SMALL LETTER CHI WITH LOW RIGHT RING, 43860 +LATIN SMALL LETTER CHI WITH LOW LEFT SERIF, 43861 +LATIN SMALL LETTER X WITH LOW RIGHT RING, 43862 +LATIN SMALL LETTER X WITH LONG LEFT LEG, 43863 +LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING, 43864 +LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF, 43865 +LATIN SMALL LETTER Y WITH SHORT RIGHT LEG, 43866 +MODIFIER BREVE WITH INVERTED BREVE, 43867 +MODIFIER LETTER SMALL HENG, 43868 +MODIFIER LETTER SMALL L WITH INVERTED LAZY S, 43869 +MODIFIER LETTER SMALL L WITH MIDDLE TILDE, 43870 +MODIFIER LETTER SMALL U WITH LEFT HOOK, 43871 +LATIN SMALL LETTER SAKHA YAT, 43872 +LATIN SMALL LETTER IOTIFIED E, 43873 +LATIN SMALL LETTER OPEN OE, 43874 +LATIN SMALL LETTER UO, 43875 +LATIN SMALL LETTER INVERTED ALPHA, 43876 +GREEK LETTER SMALL CAPITAL OMEGA, 43877 +CHEROKEE SMALL LETTER A, 43888 +CHEROKEE SMALL LETTER E, 43889 +CHEROKEE SMALL LETTER I, 43890 +CHEROKEE SMALL LETTER O, 43891 +CHEROKEE SMALL LETTER U, 43892 +CHEROKEE SMALL LETTER V, 43893 +CHEROKEE SMALL LETTER GA, 43894 +CHEROKEE SMALL LETTER KA, 43895 +CHEROKEE SMALL LETTER GE, 43896 +CHEROKEE SMALL LETTER GI, 43897 +CHEROKEE SMALL LETTER GO, 43898 +CHEROKEE SMALL LETTER GU, 43899 +CHEROKEE SMALL LETTER GV, 43900 +CHEROKEE SMALL LETTER HA, 43901 +CHEROKEE SMALL LETTER HE, 43902 +CHEROKEE SMALL LETTER HI, 43903 +CHEROKEE SMALL LETTER HO, 43904 +CHEROKEE SMALL LETTER HU, 43905 +CHEROKEE SMALL LETTER HV, 43906 +CHEROKEE SMALL LETTER LA, 43907 +CHEROKEE SMALL LETTER LE, 43908 +CHEROKEE SMALL LETTER LI, 43909 +CHEROKEE SMALL LETTER LO, 43910 +CHEROKEE SMALL LETTER LU, 43911 +CHEROKEE SMALL LETTER LV, 43912 +CHEROKEE SMALL LETTER MA, 43913 +CHEROKEE SMALL LETTER ME, 43914 +CHEROKEE SMALL LETTER MI, 43915 +CHEROKEE SMALL LETTER MO, 43916 +CHEROKEE SMALL LETTER MU, 43917 +CHEROKEE SMALL LETTER NA, 43918 +CHEROKEE SMALL LETTER HNA, 43919 +CHEROKEE SMALL LETTER NAH, 43920 +CHEROKEE SMALL LETTER NE, 43921 +CHEROKEE SMALL LETTER NI, 43922 +CHEROKEE SMALL LETTER NO, 43923 +CHEROKEE SMALL LETTER NU, 43924 +CHEROKEE SMALL LETTER NV, 43925 +CHEROKEE SMALL LETTER QUA, 43926 +CHEROKEE SMALL LETTER QUE, 43927 +CHEROKEE SMALL LETTER QUI, 43928 +CHEROKEE SMALL LETTER QUO, 43929 +CHEROKEE SMALL LETTER QUU, 43930 +CHEROKEE SMALL LETTER QUV, 43931 +CHEROKEE SMALL LETTER SA, 43932 +CHEROKEE SMALL LETTER S, 43933 +CHEROKEE SMALL LETTER SE, 43934 +CHEROKEE SMALL LETTER SI, 43935 +CHEROKEE SMALL LETTER SO, 43936 +CHEROKEE SMALL LETTER SU, 43937 +CHEROKEE SMALL LETTER SV, 43938 +CHEROKEE SMALL LETTER DA, 43939 +CHEROKEE SMALL LETTER TA, 43940 +CHEROKEE SMALL LETTER DE, 43941 +CHEROKEE SMALL LETTER TE, 43942 +CHEROKEE SMALL LETTER DI, 43943 +CHEROKEE SMALL LETTER TI, 43944 +CHEROKEE SMALL LETTER DO, 43945 +CHEROKEE SMALL LETTER DU, 43946 +CHEROKEE SMALL LETTER DV, 43947 +CHEROKEE SMALL LETTER DLA, 43948 +CHEROKEE SMALL LETTER TLA, 43949 +CHEROKEE SMALL LETTER TLE, 43950 +CHEROKEE SMALL LETTER TLI, 43951 +CHEROKEE SMALL LETTER TLO, 43952 +CHEROKEE SMALL LETTER TLU, 43953 +CHEROKEE SMALL LETTER TLV, 43954 +CHEROKEE SMALL LETTER TSA, 43955 +CHEROKEE SMALL LETTER TSE, 43956 +CHEROKEE SMALL LETTER TSI, 43957 +CHEROKEE SMALL LETTER TSO, 43958 +CHEROKEE SMALL LETTER TSU, 43959 +CHEROKEE SMALL LETTER TSV, 43960 +CHEROKEE SMALL LETTER WA, 43961 +CHEROKEE SMALL LETTER WE, 43962 +CHEROKEE SMALL LETTER WI, 43963 +CHEROKEE SMALL LETTER WO, 43964 +CHEROKEE SMALL LETTER WU, 43965 +CHEROKEE SMALL LETTER WV, 43966 +CHEROKEE SMALL LETTER YA, 43967 +MEETEI MAYEK LETTER KOK, 43968 +MEETEI MAYEK LETTER SAM, 43969 +MEETEI MAYEK LETTER LAI, 43970 +MEETEI MAYEK LETTER MIT, 43971 +MEETEI MAYEK LETTER PA, 43972 +MEETEI MAYEK LETTER NA, 43973 +MEETEI MAYEK LETTER CHIL, 43974 +MEETEI MAYEK LETTER TIL, 43975 +MEETEI MAYEK LETTER KHOU, 43976 +MEETEI MAYEK LETTER NGOU, 43977 +MEETEI MAYEK LETTER THOU, 43978 +MEETEI MAYEK LETTER WAI, 43979 +MEETEI MAYEK LETTER YANG, 43980 +MEETEI MAYEK LETTER HUK, 43981 +MEETEI MAYEK LETTER UN, 43982 +MEETEI MAYEK LETTER I, 43983 +MEETEI MAYEK LETTER PHAM, 43984 +MEETEI MAYEK LETTER ATIYA, 43985 +MEETEI MAYEK LETTER GOK, 43986 +MEETEI MAYEK LETTER JHAM, 43987 +MEETEI MAYEK LETTER RAI, 43988 +MEETEI MAYEK LETTER BA, 43989 +MEETEI MAYEK LETTER JIL, 43990 +MEETEI MAYEK LETTER DIL, 43991 +MEETEI MAYEK LETTER GHOU, 43992 +MEETEI MAYEK LETTER DHOU, 43993 +MEETEI MAYEK LETTER BHAM, 43994 +MEETEI MAYEK LETTER KOK LONSUM, 43995 +MEETEI MAYEK LETTER LAI LONSUM, 43996 +MEETEI MAYEK LETTER MIT LONSUM, 43997 +MEETEI MAYEK LETTER PA LONSUM, 43998 +MEETEI MAYEK LETTER NA LONSUM, 43999 +MEETEI MAYEK LETTER TIL LONSUM, 44000 +MEETEI MAYEK LETTER NGOU LONSUM, 44001 +MEETEI MAYEK LETTER I LONSUM, 44002 +MEETEI MAYEK VOWEL SIGN ONAP, 44003 +MEETEI MAYEK VOWEL SIGN INAP, 44004 +MEETEI MAYEK VOWEL SIGN ANAP, 44005 +MEETEI MAYEK VOWEL SIGN YENAP, 44006 +MEETEI MAYEK VOWEL SIGN SOUNAP, 44007 +MEETEI MAYEK VOWEL SIGN UNAP, 44008 +MEETEI MAYEK VOWEL SIGN CHEINAP, 44009 +MEETEI MAYEK VOWEL SIGN NUNG, 44010 +MEETEI MAYEK CHEIKHEI, 44011 +MEETEI MAYEK LUM IYEK, 44012 +MEETEI MAYEK APUN IYEK, 44013 +MEETEI MAYEK DIGIT ZERO, 44016 +MEETEI MAYEK DIGIT ONE, 44017 +MEETEI MAYEK DIGIT TWO, 44018 +MEETEI MAYEK DIGIT THREE, 44019 +MEETEI MAYEK DIGIT FOUR, 44020 +MEETEI MAYEK DIGIT FIVE, 44021 +MEETEI MAYEK DIGIT SIX, 44022 +MEETEI MAYEK DIGIT SEVEN, 44023 +MEETEI MAYEK DIGIT EIGHT, 44024 +MEETEI MAYEK DIGIT NINE, 44025 +HANGUL JUNGSEONG O YEO, 55216 +HANGUL JUNGSEONG O O I, 55217 +HANGUL JUNGSEONG YO A, 55218 +HANGUL JUNGSEONG YO AE, 55219 +HANGUL JUNGSEONG YO EO, 55220 +HANGUL JUNGSEONG U YEO, 55221 +HANGUL JUNGSEONG U I I, 55222 +HANGUL JUNGSEONG YU AE, 55223 +HANGUL JUNGSEONG YU O, 55224 +HANGUL JUNGSEONG EU A, 55225 +HANGUL JUNGSEONG EU EO, 55226 +HANGUL JUNGSEONG EU E, 55227 +HANGUL JUNGSEONG EU O, 55228 +HANGUL JUNGSEONG I YA O, 55229 +HANGUL JUNGSEONG I YAE, 55230 +HANGUL JUNGSEONG I YEO, 55231 +HANGUL JUNGSEONG I YE, 55232 +HANGUL JUNGSEONG I O I, 55233 +HANGUL JUNGSEONG I YO, 55234 +HANGUL JUNGSEONG I YU, 55235 +HANGUL JUNGSEONG I I, 55236 +HANGUL JUNGSEONG ARAEA A, 55237 +HANGUL JUNGSEONG ARAEA E, 55238 +HANGUL JONGSEONG NIEUN RIEUL, 55243 +HANGUL JONGSEONG NIEUN CHIEUCH, 55244 +HANGUL JONGSEONG SSANGTIKEUT, 55245 +HANGUL JONGSEONG SSANGTIKEUT PIEUP, 55246 +HANGUL JONGSEONG TIKEUT PIEUP, 55247 +HANGUL JONGSEONG TIKEUT SIOS, 55248 +HANGUL JONGSEONG TIKEUT SIOS KIYEOK, 55249 +HANGUL JONGSEONG TIKEUT CIEUC, 55250 +HANGUL JONGSEONG TIKEUT CHIEUCH, 55251 +HANGUL JONGSEONG TIKEUT THIEUTH, 55252 +HANGUL JONGSEONG RIEUL SSANGKIYEOK, 55253 +HANGUL JONGSEONG RIEUL KIYEOK HIEUH, 55254 +HANGUL JONGSEONG SSANGRIEUL KHIEUKH, 55255 +HANGUL JONGSEONG RIEUL MIEUM HIEUH, 55256 +HANGUL JONGSEONG RIEUL PIEUP TIKEUT, 55257 +HANGUL JONGSEONG RIEUL PIEUP PHIEUPH, 55258 +HANGUL JONGSEONG RIEUL YESIEUNG, 55259 +HANGUL JONGSEONG RIEUL YEORINHIEUH HIEUH, 55260 +HANGUL JONGSEONG KAPYEOUNRIEUL, 55261 +HANGUL JONGSEONG MIEUM NIEUN, 55262 +HANGUL JONGSEONG MIEUM SSANGNIEUN, 55263 +HANGUL JONGSEONG SSANGMIEUM, 55264 +HANGUL JONGSEONG MIEUM PIEUP SIOS, 55265 +HANGUL JONGSEONG MIEUM CIEUC, 55266 +HANGUL JONGSEONG PIEUP TIKEUT, 55267 +HANGUL JONGSEONG PIEUP RIEUL PHIEUPH, 55268 +HANGUL JONGSEONG PIEUP MIEUM, 55269 +HANGUL JONGSEONG SSANGPIEUP, 55270 +HANGUL JONGSEONG PIEUP SIOS TIKEUT, 55271 +HANGUL JONGSEONG PIEUP CIEUC, 55272 +HANGUL JONGSEONG PIEUP CHIEUCH, 55273 +HANGUL JONGSEONG SIOS MIEUM, 55274 +HANGUL JONGSEONG SIOS KAPYEOUNPIEUP, 55275 +HANGUL JONGSEONG SSANGSIOS KIYEOK, 55276 +HANGUL JONGSEONG SSANGSIOS TIKEUT, 55277 +HANGUL JONGSEONG SIOS PANSIOS, 55278 +HANGUL JONGSEONG SIOS CIEUC, 55279 +HANGUL JONGSEONG SIOS CHIEUCH, 55280 +HANGUL JONGSEONG SIOS THIEUTH, 55281 +HANGUL JONGSEONG SIOS HIEUH, 55282 +HANGUL JONGSEONG PANSIOS PIEUP, 55283 +HANGUL JONGSEONG PANSIOS KAPYEOUNPIEUP, 55284 +HANGUL JONGSEONG YESIEUNG MIEUM, 55285 +HANGUL JONGSEONG YESIEUNG HIEUH, 55286 +HANGUL JONGSEONG CIEUC PIEUP, 55287 +HANGUL JONGSEONG CIEUC SSANGPIEUP, 55288 +HANGUL JONGSEONG SSANGCIEUC, 55289 +HANGUL JONGSEONG PHIEUPH SIOS, 55290 +HANGUL JONGSEONG PHIEUPH THIEUTH, 55291 +CJK COMPATIBILITY IDEOGRAPH F900, 63744 +CJK COMPATIBILITY IDEOGRAPH F901, 63745 +CJK COMPATIBILITY IDEOGRAPH F902, 63746 +CJK COMPATIBILITY IDEOGRAPH F903, 63747 +CJK COMPATIBILITY IDEOGRAPH F904, 63748 +CJK COMPATIBILITY IDEOGRAPH F905, 63749 +CJK COMPATIBILITY IDEOGRAPH F906, 63750 +CJK COMPATIBILITY IDEOGRAPH F907, 63751 +CJK COMPATIBILITY IDEOGRAPH F908, 63752 +CJK COMPATIBILITY IDEOGRAPH F909, 63753 +CJK COMPATIBILITY IDEOGRAPH F90A, 63754 +CJK COMPATIBILITY IDEOGRAPH F90B, 63755 +CJK COMPATIBILITY IDEOGRAPH F90C, 63756 +CJK COMPATIBILITY IDEOGRAPH F90D, 63757 +CJK COMPATIBILITY IDEOGRAPH F90E, 63758 +CJK COMPATIBILITY IDEOGRAPH F90F, 63759 +CJK COMPATIBILITY IDEOGRAPH F910, 63760 +CJK COMPATIBILITY IDEOGRAPH F911, 63761 +CJK COMPATIBILITY IDEOGRAPH F912, 63762 +CJK COMPATIBILITY IDEOGRAPH F913, 63763 +CJK COMPATIBILITY IDEOGRAPH F914, 63764 +CJK COMPATIBILITY IDEOGRAPH F915, 63765 +CJK COMPATIBILITY IDEOGRAPH F916, 63766 +CJK COMPATIBILITY IDEOGRAPH F917, 63767 +CJK COMPATIBILITY IDEOGRAPH F918, 63768 +CJK COMPATIBILITY IDEOGRAPH F919, 63769 +CJK COMPATIBILITY IDEOGRAPH F91A, 63770 +CJK COMPATIBILITY IDEOGRAPH F91B, 63771 +CJK COMPATIBILITY IDEOGRAPH F91C, 63772 +CJK COMPATIBILITY IDEOGRAPH F91D, 63773 +CJK COMPATIBILITY IDEOGRAPH F91E, 63774 +CJK COMPATIBILITY IDEOGRAPH F91F, 63775 +CJK COMPATIBILITY IDEOGRAPH F920, 63776 +CJK COMPATIBILITY IDEOGRAPH F921, 63777 +CJK COMPATIBILITY IDEOGRAPH F922, 63778 +CJK COMPATIBILITY IDEOGRAPH F923, 63779 +CJK COMPATIBILITY IDEOGRAPH F924, 63780 +CJK COMPATIBILITY IDEOGRAPH F925, 63781 +CJK COMPATIBILITY IDEOGRAPH F926, 63782 +CJK COMPATIBILITY IDEOGRAPH F927, 63783 +CJK COMPATIBILITY IDEOGRAPH F928, 63784 +CJK COMPATIBILITY IDEOGRAPH F929, 63785 +CJK COMPATIBILITY IDEOGRAPH F92A, 63786 +CJK COMPATIBILITY IDEOGRAPH F92B, 63787 +CJK COMPATIBILITY IDEOGRAPH F92C, 63788 +CJK COMPATIBILITY IDEOGRAPH F92D, 63789 +CJK COMPATIBILITY IDEOGRAPH F92E, 63790 +CJK COMPATIBILITY IDEOGRAPH F92F, 63791 +CJK COMPATIBILITY IDEOGRAPH F930, 63792 +CJK COMPATIBILITY IDEOGRAPH F931, 63793 +CJK COMPATIBILITY IDEOGRAPH F932, 63794 +CJK COMPATIBILITY IDEOGRAPH F933, 63795 +CJK COMPATIBILITY IDEOGRAPH F934, 63796 +CJK COMPATIBILITY IDEOGRAPH F935, 63797 +CJK COMPATIBILITY IDEOGRAPH F936, 63798 +CJK COMPATIBILITY IDEOGRAPH F937, 63799 +CJK COMPATIBILITY IDEOGRAPH F938, 63800 +CJK COMPATIBILITY IDEOGRAPH F939, 63801 +CJK COMPATIBILITY IDEOGRAPH F93A, 63802 +CJK COMPATIBILITY IDEOGRAPH F93B, 63803 +CJK COMPATIBILITY IDEOGRAPH F93C, 63804 +CJK COMPATIBILITY IDEOGRAPH F93D, 63805 +CJK COMPATIBILITY IDEOGRAPH F93E, 63806 +CJK COMPATIBILITY IDEOGRAPH F93F, 63807 +CJK COMPATIBILITY IDEOGRAPH F940, 63808 +CJK COMPATIBILITY IDEOGRAPH F941, 63809 +CJK COMPATIBILITY IDEOGRAPH F942, 63810 +CJK COMPATIBILITY IDEOGRAPH F943, 63811 +CJK COMPATIBILITY IDEOGRAPH F944, 63812 +CJK COMPATIBILITY IDEOGRAPH F945, 63813 +CJK COMPATIBILITY IDEOGRAPH F946, 63814 +CJK COMPATIBILITY IDEOGRAPH F947, 63815 +CJK COMPATIBILITY IDEOGRAPH F948, 63816 +CJK COMPATIBILITY IDEOGRAPH F949, 63817 +CJK COMPATIBILITY IDEOGRAPH F94A, 63818 +CJK COMPATIBILITY IDEOGRAPH F94B, 63819 +CJK COMPATIBILITY IDEOGRAPH F94C, 63820 +CJK COMPATIBILITY IDEOGRAPH F94D, 63821 +CJK COMPATIBILITY IDEOGRAPH F94E, 63822 +CJK COMPATIBILITY IDEOGRAPH F94F, 63823 +CJK COMPATIBILITY IDEOGRAPH F950, 63824 +CJK COMPATIBILITY IDEOGRAPH F951, 63825 +CJK COMPATIBILITY IDEOGRAPH F952, 63826 +CJK COMPATIBILITY IDEOGRAPH F953, 63827 +CJK COMPATIBILITY IDEOGRAPH F954, 63828 +CJK COMPATIBILITY IDEOGRAPH F955, 63829 +CJK COMPATIBILITY IDEOGRAPH F956, 63830 +CJK COMPATIBILITY IDEOGRAPH F957, 63831 +CJK COMPATIBILITY IDEOGRAPH F958, 63832 +CJK COMPATIBILITY IDEOGRAPH F959, 63833 +CJK COMPATIBILITY IDEOGRAPH F95A, 63834 +CJK COMPATIBILITY IDEOGRAPH F95B, 63835 +CJK COMPATIBILITY IDEOGRAPH F95C, 63836 +CJK COMPATIBILITY IDEOGRAPH F95D, 63837 +CJK COMPATIBILITY IDEOGRAPH F95E, 63838 +CJK COMPATIBILITY IDEOGRAPH F95F, 63839 +CJK COMPATIBILITY IDEOGRAPH F960, 63840 +CJK COMPATIBILITY IDEOGRAPH F961, 63841 +CJK COMPATIBILITY IDEOGRAPH F962, 63842 +CJK COMPATIBILITY IDEOGRAPH F963, 63843 +CJK COMPATIBILITY IDEOGRAPH F964, 63844 +CJK COMPATIBILITY IDEOGRAPH F965, 63845 +CJK COMPATIBILITY IDEOGRAPH F966, 63846 +CJK COMPATIBILITY IDEOGRAPH F967, 63847 +CJK COMPATIBILITY IDEOGRAPH F968, 63848 +CJK COMPATIBILITY IDEOGRAPH F969, 63849 +CJK COMPATIBILITY IDEOGRAPH F96A, 63850 +CJK COMPATIBILITY IDEOGRAPH F96B, 63851 +CJK COMPATIBILITY IDEOGRAPH F96C, 63852 +CJK COMPATIBILITY IDEOGRAPH F96D, 63853 +CJK COMPATIBILITY IDEOGRAPH F96E, 63854 +CJK COMPATIBILITY IDEOGRAPH F96F, 63855 +CJK COMPATIBILITY IDEOGRAPH F970, 63856 +CJK COMPATIBILITY IDEOGRAPH F971, 63857 +CJK COMPATIBILITY IDEOGRAPH F972, 63858 +CJK COMPATIBILITY IDEOGRAPH F973, 63859 +CJK COMPATIBILITY IDEOGRAPH F974, 63860 +CJK COMPATIBILITY IDEOGRAPH F975, 63861 +CJK COMPATIBILITY IDEOGRAPH F976, 63862 +CJK COMPATIBILITY IDEOGRAPH F977, 63863 +CJK COMPATIBILITY IDEOGRAPH F978, 63864 +CJK COMPATIBILITY IDEOGRAPH F979, 63865 +CJK COMPATIBILITY IDEOGRAPH F97A, 63866 +CJK COMPATIBILITY IDEOGRAPH F97B, 63867 +CJK COMPATIBILITY IDEOGRAPH F97C, 63868 +CJK COMPATIBILITY IDEOGRAPH F97D, 63869 +CJK COMPATIBILITY IDEOGRAPH F97E, 63870 +CJK COMPATIBILITY IDEOGRAPH F97F, 63871 +CJK COMPATIBILITY IDEOGRAPH F980, 63872 +CJK COMPATIBILITY IDEOGRAPH F981, 63873 +CJK COMPATIBILITY IDEOGRAPH F982, 63874 +CJK COMPATIBILITY IDEOGRAPH F983, 63875 +CJK COMPATIBILITY IDEOGRAPH F984, 63876 +CJK COMPATIBILITY IDEOGRAPH F985, 63877 +CJK COMPATIBILITY IDEOGRAPH F986, 63878 +CJK COMPATIBILITY IDEOGRAPH F987, 63879 +CJK COMPATIBILITY IDEOGRAPH F988, 63880 +CJK COMPATIBILITY IDEOGRAPH F989, 63881 +CJK COMPATIBILITY IDEOGRAPH F98A, 63882 +CJK COMPATIBILITY IDEOGRAPH F98B, 63883 +CJK COMPATIBILITY IDEOGRAPH F98C, 63884 +CJK COMPATIBILITY IDEOGRAPH F98D, 63885 +CJK COMPATIBILITY IDEOGRAPH F98E, 63886 +CJK COMPATIBILITY IDEOGRAPH F98F, 63887 +CJK COMPATIBILITY IDEOGRAPH F990, 63888 +CJK COMPATIBILITY IDEOGRAPH F991, 63889 +CJK COMPATIBILITY IDEOGRAPH F992, 63890 +CJK COMPATIBILITY IDEOGRAPH F993, 63891 +CJK COMPATIBILITY IDEOGRAPH F994, 63892 +CJK COMPATIBILITY IDEOGRAPH F995, 63893 +CJK COMPATIBILITY IDEOGRAPH F996, 63894 +CJK COMPATIBILITY IDEOGRAPH F997, 63895 +CJK COMPATIBILITY IDEOGRAPH F998, 63896 +CJK COMPATIBILITY IDEOGRAPH F999, 63897 +CJK COMPATIBILITY IDEOGRAPH F99A, 63898 +CJK COMPATIBILITY IDEOGRAPH F99B, 63899 +CJK COMPATIBILITY IDEOGRAPH F99C, 63900 +CJK COMPATIBILITY IDEOGRAPH F99D, 63901 +CJK COMPATIBILITY IDEOGRAPH F99E, 63902 +CJK COMPATIBILITY IDEOGRAPH F99F, 63903 +CJK COMPATIBILITY IDEOGRAPH F9A0, 63904 +CJK COMPATIBILITY IDEOGRAPH F9A1, 63905 +CJK COMPATIBILITY IDEOGRAPH F9A2, 63906 +CJK COMPATIBILITY IDEOGRAPH F9A3, 63907 +CJK COMPATIBILITY IDEOGRAPH F9A4, 63908 +CJK COMPATIBILITY IDEOGRAPH F9A5, 63909 +CJK COMPATIBILITY IDEOGRAPH F9A6, 63910 +CJK COMPATIBILITY IDEOGRAPH F9A7, 63911 +CJK COMPATIBILITY IDEOGRAPH F9A8, 63912 +CJK COMPATIBILITY IDEOGRAPH F9A9, 63913 +CJK COMPATIBILITY IDEOGRAPH F9AA, 63914 +CJK COMPATIBILITY IDEOGRAPH F9AB, 63915 +CJK COMPATIBILITY IDEOGRAPH F9AC, 63916 +CJK COMPATIBILITY IDEOGRAPH F9AD, 63917 +CJK COMPATIBILITY IDEOGRAPH F9AE, 63918 +CJK COMPATIBILITY IDEOGRAPH F9AF, 63919 +CJK COMPATIBILITY IDEOGRAPH F9B0, 63920 +CJK COMPATIBILITY IDEOGRAPH F9B1, 63921 +CJK COMPATIBILITY IDEOGRAPH F9B2, 63922 +CJK COMPATIBILITY IDEOGRAPH F9B3, 63923 +CJK COMPATIBILITY IDEOGRAPH F9B4, 63924 +CJK COMPATIBILITY IDEOGRAPH F9B5, 63925 +CJK COMPATIBILITY IDEOGRAPH F9B6, 63926 +CJK COMPATIBILITY IDEOGRAPH F9B7, 63927 +CJK COMPATIBILITY IDEOGRAPH F9B8, 63928 +CJK COMPATIBILITY IDEOGRAPH F9B9, 63929 +CJK COMPATIBILITY IDEOGRAPH F9BA, 63930 +CJK COMPATIBILITY IDEOGRAPH F9BB, 63931 +CJK COMPATIBILITY IDEOGRAPH F9BC, 63932 +CJK COMPATIBILITY IDEOGRAPH F9BD, 63933 +CJK COMPATIBILITY IDEOGRAPH F9BE, 63934 +CJK COMPATIBILITY IDEOGRAPH F9BF, 63935 +CJK COMPATIBILITY IDEOGRAPH F9C0, 63936 +CJK COMPATIBILITY IDEOGRAPH F9C1, 63937 +CJK COMPATIBILITY IDEOGRAPH F9C2, 63938 +CJK COMPATIBILITY IDEOGRAPH F9C3, 63939 +CJK COMPATIBILITY IDEOGRAPH F9C4, 63940 +CJK COMPATIBILITY IDEOGRAPH F9C5, 63941 +CJK COMPATIBILITY IDEOGRAPH F9C6, 63942 +CJK COMPATIBILITY IDEOGRAPH F9C7, 63943 +CJK COMPATIBILITY IDEOGRAPH F9C8, 63944 +CJK COMPATIBILITY IDEOGRAPH F9C9, 63945 +CJK COMPATIBILITY IDEOGRAPH F9CA, 63946 +CJK COMPATIBILITY IDEOGRAPH F9CB, 63947 +CJK COMPATIBILITY IDEOGRAPH F9CC, 63948 +CJK COMPATIBILITY IDEOGRAPH F9CD, 63949 +CJK COMPATIBILITY IDEOGRAPH F9CE, 63950 +CJK COMPATIBILITY IDEOGRAPH F9CF, 63951 +CJK COMPATIBILITY IDEOGRAPH F9D0, 63952 +CJK COMPATIBILITY IDEOGRAPH F9D1, 63953 +CJK COMPATIBILITY IDEOGRAPH F9D2, 63954 +CJK COMPATIBILITY IDEOGRAPH F9D3, 63955 +CJK COMPATIBILITY IDEOGRAPH F9D4, 63956 +CJK COMPATIBILITY IDEOGRAPH F9D5, 63957 +CJK COMPATIBILITY IDEOGRAPH F9D6, 63958 +CJK COMPATIBILITY IDEOGRAPH F9D7, 63959 +CJK COMPATIBILITY IDEOGRAPH F9D8, 63960 +CJK COMPATIBILITY IDEOGRAPH F9D9, 63961 +CJK COMPATIBILITY IDEOGRAPH F9DA, 63962 +CJK COMPATIBILITY IDEOGRAPH F9DB, 63963 +CJK COMPATIBILITY IDEOGRAPH F9DC, 63964 +CJK COMPATIBILITY IDEOGRAPH F9DD, 63965 +CJK COMPATIBILITY IDEOGRAPH F9DE, 63966 +CJK COMPATIBILITY IDEOGRAPH F9DF, 63967 +CJK COMPATIBILITY IDEOGRAPH F9E0, 63968 +CJK COMPATIBILITY IDEOGRAPH F9E1, 63969 +CJK COMPATIBILITY IDEOGRAPH F9E2, 63970 +CJK COMPATIBILITY IDEOGRAPH F9E3, 63971 +CJK COMPATIBILITY IDEOGRAPH F9E4, 63972 +CJK COMPATIBILITY IDEOGRAPH F9E5, 63973 +CJK COMPATIBILITY IDEOGRAPH F9E6, 63974 +CJK COMPATIBILITY IDEOGRAPH F9E7, 63975 +CJK COMPATIBILITY IDEOGRAPH F9E8, 63976 +CJK COMPATIBILITY IDEOGRAPH F9E9, 63977 +CJK COMPATIBILITY IDEOGRAPH F9EA, 63978 +CJK COMPATIBILITY IDEOGRAPH F9EB, 63979 +CJK COMPATIBILITY IDEOGRAPH F9EC, 63980 +CJK COMPATIBILITY IDEOGRAPH F9ED, 63981 +CJK COMPATIBILITY IDEOGRAPH F9EE, 63982 +CJK COMPATIBILITY IDEOGRAPH F9EF, 63983 +CJK COMPATIBILITY IDEOGRAPH F9F0, 63984 +CJK COMPATIBILITY IDEOGRAPH F9F1, 63985 +CJK COMPATIBILITY IDEOGRAPH F9F2, 63986 +CJK COMPATIBILITY IDEOGRAPH F9F3, 63987 +CJK COMPATIBILITY IDEOGRAPH F9F4, 63988 +CJK COMPATIBILITY IDEOGRAPH F9F5, 63989 +CJK COMPATIBILITY IDEOGRAPH F9F6, 63990 +CJK COMPATIBILITY IDEOGRAPH F9F7, 63991 +CJK COMPATIBILITY IDEOGRAPH F9F8, 63992 +CJK COMPATIBILITY IDEOGRAPH F9F9, 63993 +CJK COMPATIBILITY IDEOGRAPH F9FA, 63994 +CJK COMPATIBILITY IDEOGRAPH F9FB, 63995 +CJK COMPATIBILITY IDEOGRAPH F9FC, 63996 +CJK COMPATIBILITY IDEOGRAPH F9FD, 63997 +CJK COMPATIBILITY IDEOGRAPH F9FE, 63998 +CJK COMPATIBILITY IDEOGRAPH F9FF, 63999 +CJK COMPATIBILITY IDEOGRAPH FA00, 64000 +CJK COMPATIBILITY IDEOGRAPH FA01, 64001 +CJK COMPATIBILITY IDEOGRAPH FA02, 64002 +CJK COMPATIBILITY IDEOGRAPH FA03, 64003 +CJK COMPATIBILITY IDEOGRAPH FA04, 64004 +CJK COMPATIBILITY IDEOGRAPH FA05, 64005 +CJK COMPATIBILITY IDEOGRAPH FA06, 64006 +CJK COMPATIBILITY IDEOGRAPH FA07, 64007 +CJK COMPATIBILITY IDEOGRAPH FA08, 64008 +CJK COMPATIBILITY IDEOGRAPH FA09, 64009 +CJK COMPATIBILITY IDEOGRAPH FA0A, 64010 +CJK COMPATIBILITY IDEOGRAPH FA0B, 64011 +CJK COMPATIBILITY IDEOGRAPH FA0C, 64012 +CJK COMPATIBILITY IDEOGRAPH FA0D, 64013 +CJK COMPATIBILITY IDEOGRAPH FA0E, 64014 +CJK COMPATIBILITY IDEOGRAPH FA0F, 64015 +CJK COMPATIBILITY IDEOGRAPH FA10, 64016 +CJK COMPATIBILITY IDEOGRAPH FA11, 64017 +CJK COMPATIBILITY IDEOGRAPH FA12, 64018 +CJK COMPATIBILITY IDEOGRAPH FA13, 64019 +CJK COMPATIBILITY IDEOGRAPH FA14, 64020 +CJK COMPATIBILITY IDEOGRAPH FA15, 64021 +CJK COMPATIBILITY IDEOGRAPH FA16, 64022 +CJK COMPATIBILITY IDEOGRAPH FA17, 64023 +CJK COMPATIBILITY IDEOGRAPH FA18, 64024 +CJK COMPATIBILITY IDEOGRAPH FA19, 64025 +CJK COMPATIBILITY IDEOGRAPH FA1A, 64026 +CJK COMPATIBILITY IDEOGRAPH FA1B, 64027 +CJK COMPATIBILITY IDEOGRAPH FA1C, 64028 +CJK COMPATIBILITY IDEOGRAPH FA1D, 64029 +CJK COMPATIBILITY IDEOGRAPH FA1E, 64030 +CJK COMPATIBILITY IDEOGRAPH FA1F, 64031 +CJK COMPATIBILITY IDEOGRAPH FA20, 64032 +CJK COMPATIBILITY IDEOGRAPH FA21, 64033 +CJK COMPATIBILITY IDEOGRAPH FA22, 64034 +CJK COMPATIBILITY IDEOGRAPH FA23, 64035 +CJK COMPATIBILITY IDEOGRAPH FA24, 64036 +CJK COMPATIBILITY IDEOGRAPH FA25, 64037 +CJK COMPATIBILITY IDEOGRAPH FA26, 64038 +CJK COMPATIBILITY IDEOGRAPH FA27, 64039 +CJK COMPATIBILITY IDEOGRAPH FA28, 64040 +CJK COMPATIBILITY IDEOGRAPH FA29, 64041 +CJK COMPATIBILITY IDEOGRAPH FA2A, 64042 +CJK COMPATIBILITY IDEOGRAPH FA2B, 64043 +CJK COMPATIBILITY IDEOGRAPH FA2C, 64044 +CJK COMPATIBILITY IDEOGRAPH FA2D, 64045 +CJK COMPATIBILITY IDEOGRAPH FA2E, 64046 +CJK COMPATIBILITY IDEOGRAPH FA2F, 64047 +CJK COMPATIBILITY IDEOGRAPH FA30, 64048 +CJK COMPATIBILITY IDEOGRAPH FA31, 64049 +CJK COMPATIBILITY IDEOGRAPH FA32, 64050 +CJK COMPATIBILITY IDEOGRAPH FA33, 64051 +CJK COMPATIBILITY IDEOGRAPH FA34, 64052 +CJK COMPATIBILITY IDEOGRAPH FA35, 64053 +CJK COMPATIBILITY IDEOGRAPH FA36, 64054 +CJK COMPATIBILITY IDEOGRAPH FA37, 64055 +CJK COMPATIBILITY IDEOGRAPH FA38, 64056 +CJK COMPATIBILITY IDEOGRAPH FA39, 64057 +CJK COMPATIBILITY IDEOGRAPH FA3A, 64058 +CJK COMPATIBILITY IDEOGRAPH FA3B, 64059 +CJK COMPATIBILITY IDEOGRAPH FA3C, 64060 +CJK COMPATIBILITY IDEOGRAPH FA3D, 64061 +CJK COMPATIBILITY IDEOGRAPH FA3E, 64062 +CJK COMPATIBILITY IDEOGRAPH FA3F, 64063 +CJK COMPATIBILITY IDEOGRAPH FA40, 64064 +CJK COMPATIBILITY IDEOGRAPH FA41, 64065 +CJK COMPATIBILITY IDEOGRAPH FA42, 64066 +CJK COMPATIBILITY IDEOGRAPH FA43, 64067 +CJK COMPATIBILITY IDEOGRAPH FA44, 64068 +CJK COMPATIBILITY IDEOGRAPH FA45, 64069 +CJK COMPATIBILITY IDEOGRAPH FA46, 64070 +CJK COMPATIBILITY IDEOGRAPH FA47, 64071 +CJK COMPATIBILITY IDEOGRAPH FA48, 64072 +CJK COMPATIBILITY IDEOGRAPH FA49, 64073 +CJK COMPATIBILITY IDEOGRAPH FA4A, 64074 +CJK COMPATIBILITY IDEOGRAPH FA4B, 64075 +CJK COMPATIBILITY IDEOGRAPH FA4C, 64076 +CJK COMPATIBILITY IDEOGRAPH FA4D, 64077 +CJK COMPATIBILITY IDEOGRAPH FA4E, 64078 +CJK COMPATIBILITY IDEOGRAPH FA4F, 64079 +CJK COMPATIBILITY IDEOGRAPH FA50, 64080 +CJK COMPATIBILITY IDEOGRAPH FA51, 64081 +CJK COMPATIBILITY IDEOGRAPH FA52, 64082 +CJK COMPATIBILITY IDEOGRAPH FA53, 64083 +CJK COMPATIBILITY IDEOGRAPH FA54, 64084 +CJK COMPATIBILITY IDEOGRAPH FA55, 64085 +CJK COMPATIBILITY IDEOGRAPH FA56, 64086 +CJK COMPATIBILITY IDEOGRAPH FA57, 64087 +CJK COMPATIBILITY IDEOGRAPH FA58, 64088 +CJK COMPATIBILITY IDEOGRAPH FA59, 64089 +CJK COMPATIBILITY IDEOGRAPH FA5A, 64090 +CJK COMPATIBILITY IDEOGRAPH FA5B, 64091 +CJK COMPATIBILITY IDEOGRAPH FA5C, 64092 +CJK COMPATIBILITY IDEOGRAPH FA5D, 64093 +CJK COMPATIBILITY IDEOGRAPH FA5E, 64094 +CJK COMPATIBILITY IDEOGRAPH FA5F, 64095 +CJK COMPATIBILITY IDEOGRAPH FA60, 64096 +CJK COMPATIBILITY IDEOGRAPH FA61, 64097 +CJK COMPATIBILITY IDEOGRAPH FA62, 64098 +CJK COMPATIBILITY IDEOGRAPH FA63, 64099 +CJK COMPATIBILITY IDEOGRAPH FA64, 64100 +CJK COMPATIBILITY IDEOGRAPH FA65, 64101 +CJK COMPATIBILITY IDEOGRAPH FA66, 64102 +CJK COMPATIBILITY IDEOGRAPH FA67, 64103 +CJK COMPATIBILITY IDEOGRAPH FA68, 64104 +CJK COMPATIBILITY IDEOGRAPH FA69, 64105 +CJK COMPATIBILITY IDEOGRAPH FA6A, 64106 +CJK COMPATIBILITY IDEOGRAPH FA6B, 64107 +CJK COMPATIBILITY IDEOGRAPH FA6C, 64108 +CJK COMPATIBILITY IDEOGRAPH FA6D, 64109 +CJK COMPATIBILITY IDEOGRAPH FA70, 64112 +CJK COMPATIBILITY IDEOGRAPH FA71, 64113 +CJK COMPATIBILITY IDEOGRAPH FA72, 64114 +CJK COMPATIBILITY IDEOGRAPH FA73, 64115 +CJK COMPATIBILITY IDEOGRAPH FA74, 64116 +CJK COMPATIBILITY IDEOGRAPH FA75, 64117 +CJK COMPATIBILITY IDEOGRAPH FA76, 64118 +CJK COMPATIBILITY IDEOGRAPH FA77, 64119 +CJK COMPATIBILITY IDEOGRAPH FA78, 64120 +CJK COMPATIBILITY IDEOGRAPH FA79, 64121 +CJK COMPATIBILITY IDEOGRAPH FA7A, 64122 +CJK COMPATIBILITY IDEOGRAPH FA7B, 64123 +CJK COMPATIBILITY IDEOGRAPH FA7C, 64124 +CJK COMPATIBILITY IDEOGRAPH FA7D, 64125 +CJK COMPATIBILITY IDEOGRAPH FA7E, 64126 +CJK COMPATIBILITY IDEOGRAPH FA7F, 64127 +CJK COMPATIBILITY IDEOGRAPH FA80, 64128 +CJK COMPATIBILITY IDEOGRAPH FA81, 64129 +CJK COMPATIBILITY IDEOGRAPH FA82, 64130 +CJK COMPATIBILITY IDEOGRAPH FA83, 64131 +CJK COMPATIBILITY IDEOGRAPH FA84, 64132 +CJK COMPATIBILITY IDEOGRAPH FA85, 64133 +CJK COMPATIBILITY IDEOGRAPH FA86, 64134 +CJK COMPATIBILITY IDEOGRAPH FA87, 64135 +CJK COMPATIBILITY IDEOGRAPH FA88, 64136 +CJK COMPATIBILITY IDEOGRAPH FA89, 64137 +CJK COMPATIBILITY IDEOGRAPH FA8A, 64138 +CJK COMPATIBILITY IDEOGRAPH FA8B, 64139 +CJK COMPATIBILITY IDEOGRAPH FA8C, 64140 +CJK COMPATIBILITY IDEOGRAPH FA8D, 64141 +CJK COMPATIBILITY IDEOGRAPH FA8E, 64142 +CJK COMPATIBILITY IDEOGRAPH FA8F, 64143 +CJK COMPATIBILITY IDEOGRAPH FA90, 64144 +CJK COMPATIBILITY IDEOGRAPH FA91, 64145 +CJK COMPATIBILITY IDEOGRAPH FA92, 64146 +CJK COMPATIBILITY IDEOGRAPH FA93, 64147 +CJK COMPATIBILITY IDEOGRAPH FA94, 64148 +CJK COMPATIBILITY IDEOGRAPH FA95, 64149 +CJK COMPATIBILITY IDEOGRAPH FA96, 64150 +CJK COMPATIBILITY IDEOGRAPH FA97, 64151 +CJK COMPATIBILITY IDEOGRAPH FA98, 64152 +CJK COMPATIBILITY IDEOGRAPH FA99, 64153 +CJK COMPATIBILITY IDEOGRAPH FA9A, 64154 +CJK COMPATIBILITY IDEOGRAPH FA9B, 64155 +CJK COMPATIBILITY IDEOGRAPH FA9C, 64156 +CJK COMPATIBILITY IDEOGRAPH FA9D, 64157 +CJK COMPATIBILITY IDEOGRAPH FA9E, 64158 +CJK COMPATIBILITY IDEOGRAPH FA9F, 64159 +CJK COMPATIBILITY IDEOGRAPH FAA0, 64160 +CJK COMPATIBILITY IDEOGRAPH FAA1, 64161 +CJK COMPATIBILITY IDEOGRAPH FAA2, 64162 +CJK COMPATIBILITY IDEOGRAPH FAA3, 64163 +CJK COMPATIBILITY IDEOGRAPH FAA4, 64164 +CJK COMPATIBILITY IDEOGRAPH FAA5, 64165 +CJK COMPATIBILITY IDEOGRAPH FAA6, 64166 +CJK COMPATIBILITY IDEOGRAPH FAA7, 64167 +CJK COMPATIBILITY IDEOGRAPH FAA8, 64168 +CJK COMPATIBILITY IDEOGRAPH FAA9, 64169 +CJK COMPATIBILITY IDEOGRAPH FAAA, 64170 +CJK COMPATIBILITY IDEOGRAPH FAAB, 64171 +CJK COMPATIBILITY IDEOGRAPH FAAC, 64172 +CJK COMPATIBILITY IDEOGRAPH FAAD, 64173 +CJK COMPATIBILITY IDEOGRAPH FAAE, 64174 +CJK COMPATIBILITY IDEOGRAPH FAAF, 64175 +CJK COMPATIBILITY IDEOGRAPH FAB0, 64176 +CJK COMPATIBILITY IDEOGRAPH FAB1, 64177 +CJK COMPATIBILITY IDEOGRAPH FAB2, 64178 +CJK COMPATIBILITY IDEOGRAPH FAB3, 64179 +CJK COMPATIBILITY IDEOGRAPH FAB4, 64180 +CJK COMPATIBILITY IDEOGRAPH FAB5, 64181 +CJK COMPATIBILITY IDEOGRAPH FAB6, 64182 +CJK COMPATIBILITY IDEOGRAPH FAB7, 64183 +CJK COMPATIBILITY IDEOGRAPH FAB8, 64184 +CJK COMPATIBILITY IDEOGRAPH FAB9, 64185 +CJK COMPATIBILITY IDEOGRAPH FABA, 64186 +CJK COMPATIBILITY IDEOGRAPH FABB, 64187 +CJK COMPATIBILITY IDEOGRAPH FABC, 64188 +CJK COMPATIBILITY IDEOGRAPH FABD, 64189 +CJK COMPATIBILITY IDEOGRAPH FABE, 64190 +CJK COMPATIBILITY IDEOGRAPH FABF, 64191 +CJK COMPATIBILITY IDEOGRAPH FAC0, 64192 +CJK COMPATIBILITY IDEOGRAPH FAC1, 64193 +CJK COMPATIBILITY IDEOGRAPH FAC2, 64194 +CJK COMPATIBILITY IDEOGRAPH FAC3, 64195 +CJK COMPATIBILITY IDEOGRAPH FAC4, 64196 +CJK COMPATIBILITY IDEOGRAPH FAC5, 64197 +CJK COMPATIBILITY IDEOGRAPH FAC6, 64198 +CJK COMPATIBILITY IDEOGRAPH FAC7, 64199 +CJK COMPATIBILITY IDEOGRAPH FAC8, 64200 +CJK COMPATIBILITY IDEOGRAPH FAC9, 64201 +CJK COMPATIBILITY IDEOGRAPH FACA, 64202 +CJK COMPATIBILITY IDEOGRAPH FACB, 64203 +CJK COMPATIBILITY IDEOGRAPH FACC, 64204 +CJK COMPATIBILITY IDEOGRAPH FACD, 64205 +CJK COMPATIBILITY IDEOGRAPH FACE, 64206 +CJK COMPATIBILITY IDEOGRAPH FACF, 64207 +CJK COMPATIBILITY IDEOGRAPH FAD0, 64208 +CJK COMPATIBILITY IDEOGRAPH FAD1, 64209 +CJK COMPATIBILITY IDEOGRAPH FAD2, 64210 +CJK COMPATIBILITY IDEOGRAPH FAD3, 64211 +CJK COMPATIBILITY IDEOGRAPH FAD4, 64212 +CJK COMPATIBILITY IDEOGRAPH FAD5, 64213 +CJK COMPATIBILITY IDEOGRAPH FAD6, 64214 +CJK COMPATIBILITY IDEOGRAPH FAD7, 64215 +CJK COMPATIBILITY IDEOGRAPH FAD8, 64216 +CJK COMPATIBILITY IDEOGRAPH FAD9, 64217 +LATIN SMALL LIGATURE FF, 64256 +LATIN SMALL LIGATURE FI, 64257 +LATIN SMALL LIGATURE FL, 64258 +LATIN SMALL LIGATURE FFI, 64259 +LATIN SMALL LIGATURE FFL, 64260 +LATIN SMALL LIGATURE LONG S T, 64261 +LATIN SMALL LIGATURE ST, 64262 +ARMENIAN SMALL LIGATURE MEN NOW, 64275 +ARMENIAN SMALL LIGATURE MEN ECH, 64276 +ARMENIAN SMALL LIGATURE MEN INI, 64277 +ARMENIAN SMALL LIGATURE VEW NOW, 64278 +ARMENIAN SMALL LIGATURE MEN XEH, 64279 +HEBREW LETTER YOD WITH HIRIQ, 64285 +HEBREW POINT JUDEO SPANISH VARIKA, 64286 +HEBREW LIGATURE YIDDISH YOD YOD PATAH, 64287 +HEBREW LETTER ALTERNATIVE AYIN, 64288 +HEBREW LETTER WIDE ALEF, 64289 +HEBREW LETTER WIDE DALET, 64290 +HEBREW LETTER WIDE HE, 64291 +HEBREW LETTER WIDE KAF, 64292 +HEBREW LETTER WIDE LAMED, 64293 +HEBREW LETTER WIDE FINAL MEM, 64294 +HEBREW LETTER WIDE RESH, 64295 +HEBREW LETTER WIDE TAV, 64296 +HEBREW LETTER ALTERNATIVE PLUS SIGN, 64297 +HEBREW LETTER SHIN WITH SHIN DOT, 64298 +HEBREW LETTER SHIN WITH SIN DOT, 64299 +HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT, 64300 +HEBREW LETTER SHIN WITH DAGESH AND SIN DOT, 64301 +HEBREW LETTER ALEF WITH PATAH, 64302 +HEBREW LETTER ALEF WITH QAMATS, 64303 +HEBREW LETTER ALEF WITH MAPIQ, 64304 +HEBREW LETTER BET WITH DAGESH, 64305 +HEBREW LETTER GIMEL WITH DAGESH, 64306 +HEBREW LETTER DALET WITH DAGESH, 64307 +HEBREW LETTER HE WITH MAPIQ, 64308 +HEBREW LETTER VAV WITH DAGESH, 64309 +HEBREW LETTER ZAYIN WITH DAGESH, 64310 +HEBREW LETTER TET WITH DAGESH, 64312 +HEBREW LETTER YOD WITH DAGESH, 64313 +HEBREW LETTER FINAL KAF WITH DAGESH, 64314 +HEBREW LETTER KAF WITH DAGESH, 64315 +HEBREW LETTER LAMED WITH DAGESH, 64316 +HEBREW LETTER MEM WITH DAGESH, 64318 +HEBREW LETTER NUN WITH DAGESH, 64320 +HEBREW LETTER SAMEKH WITH DAGESH, 64321 +HEBREW LETTER FINAL PE WITH DAGESH, 64323 +HEBREW LETTER PE WITH DAGESH, 64324 +HEBREW LETTER TSADI WITH DAGESH, 64326 +HEBREW LETTER QOF WITH DAGESH, 64327 +HEBREW LETTER RESH WITH DAGESH, 64328 +HEBREW LETTER SHIN WITH DAGESH, 64329 +HEBREW LETTER TAV WITH DAGESH, 64330 +HEBREW LETTER VAV WITH HOLAM, 64331 +HEBREW LETTER BET WITH RAFE, 64332 +HEBREW LETTER KAF WITH RAFE, 64333 +HEBREW LETTER PE WITH RAFE, 64334 +HEBREW LIGATURE ALEF LAMED, 64335 +ARABIC LETTER ALEF WASLA ISOLATED FORM, 64336 +ARABIC LETTER ALEF WASLA FINAL FORM, 64337 +ARABIC LETTER BEEH ISOLATED FORM, 64338 +ARABIC LETTER BEEH FINAL FORM, 64339 +ARABIC LETTER BEEH INITIAL FORM, 64340 +ARABIC LETTER BEEH MEDIAL FORM, 64341 +ARABIC LETTER PEH ISOLATED FORM, 64342 +ARABIC LETTER PEH FINAL FORM, 64343 +ARABIC LETTER PEH INITIAL FORM, 64344 +ARABIC LETTER PEH MEDIAL FORM, 64345 +ARABIC LETTER BEHEH ISOLATED FORM, 64346 +ARABIC LETTER BEHEH FINAL FORM, 64347 +ARABIC LETTER BEHEH INITIAL FORM, 64348 +ARABIC LETTER BEHEH MEDIAL FORM, 64349 +ARABIC LETTER TTEHEH ISOLATED FORM, 64350 +ARABIC LETTER TTEHEH FINAL FORM, 64351 +ARABIC LETTER TTEHEH INITIAL FORM, 64352 +ARABIC LETTER TTEHEH MEDIAL FORM, 64353 +ARABIC LETTER TEHEH ISOLATED FORM, 64354 +ARABIC LETTER TEHEH FINAL FORM, 64355 +ARABIC LETTER TEHEH INITIAL FORM, 64356 +ARABIC LETTER TEHEH MEDIAL FORM, 64357 +ARABIC LETTER TTEH ISOLATED FORM, 64358 +ARABIC LETTER TTEH FINAL FORM, 64359 +ARABIC LETTER TTEH INITIAL FORM, 64360 +ARABIC LETTER TTEH MEDIAL FORM, 64361 +ARABIC LETTER VEH ISOLATED FORM, 64362 +ARABIC LETTER VEH FINAL FORM, 64363 +ARABIC LETTER VEH INITIAL FORM, 64364 +ARABIC LETTER VEH MEDIAL FORM, 64365 +ARABIC LETTER PEHEH ISOLATED FORM, 64366 +ARABIC LETTER PEHEH FINAL FORM, 64367 +ARABIC LETTER PEHEH INITIAL FORM, 64368 +ARABIC LETTER PEHEH MEDIAL FORM, 64369 +ARABIC LETTER DYEH ISOLATED FORM, 64370 +ARABIC LETTER DYEH FINAL FORM, 64371 +ARABIC LETTER DYEH INITIAL FORM, 64372 +ARABIC LETTER DYEH MEDIAL FORM, 64373 +ARABIC LETTER NYEH ISOLATED FORM, 64374 +ARABIC LETTER NYEH FINAL FORM, 64375 +ARABIC LETTER NYEH INITIAL FORM, 64376 +ARABIC LETTER NYEH MEDIAL FORM, 64377 +ARABIC LETTER TCHEH ISOLATED FORM, 64378 +ARABIC LETTER TCHEH FINAL FORM, 64379 +ARABIC LETTER TCHEH INITIAL FORM, 64380 +ARABIC LETTER TCHEH MEDIAL FORM, 64381 +ARABIC LETTER TCHEHEH ISOLATED FORM, 64382 +ARABIC LETTER TCHEHEH FINAL FORM, 64383 +ARABIC LETTER TCHEHEH INITIAL FORM, 64384 +ARABIC LETTER TCHEHEH MEDIAL FORM, 64385 +ARABIC LETTER DDAHAL ISOLATED FORM, 64386 +ARABIC LETTER DDAHAL FINAL FORM, 64387 +ARABIC LETTER DAHAL ISOLATED FORM, 64388 +ARABIC LETTER DAHAL FINAL FORM, 64389 +ARABIC LETTER DUL ISOLATED FORM, 64390 +ARABIC LETTER DUL FINAL FORM, 64391 +ARABIC LETTER DDAL ISOLATED FORM, 64392 +ARABIC LETTER DDAL FINAL FORM, 64393 +ARABIC LETTER JEH ISOLATED FORM, 64394 +ARABIC LETTER JEH FINAL FORM, 64395 +ARABIC LETTER RREH ISOLATED FORM, 64396 +ARABIC LETTER RREH FINAL FORM, 64397 +ARABIC LETTER KEHEH ISOLATED FORM, 64398 +ARABIC LETTER KEHEH FINAL FORM, 64399 +ARABIC LETTER KEHEH INITIAL FORM, 64400 +ARABIC LETTER KEHEH MEDIAL FORM, 64401 +ARABIC LETTER GAF ISOLATED FORM, 64402 +ARABIC LETTER GAF FINAL FORM, 64403 +ARABIC LETTER GAF INITIAL FORM, 64404 +ARABIC LETTER GAF MEDIAL FORM, 64405 +ARABIC LETTER GUEH ISOLATED FORM, 64406 +ARABIC LETTER GUEH FINAL FORM, 64407 +ARABIC LETTER GUEH INITIAL FORM, 64408 +ARABIC LETTER GUEH MEDIAL FORM, 64409 +ARABIC LETTER NGOEH ISOLATED FORM, 64410 +ARABIC LETTER NGOEH FINAL FORM, 64411 +ARABIC LETTER NGOEH INITIAL FORM, 64412 +ARABIC LETTER NGOEH MEDIAL FORM, 64413 +ARABIC LETTER NOON GHUNNA ISOLATED FORM, 64414 +ARABIC LETTER NOON GHUNNA FINAL FORM, 64415 +ARABIC LETTER RNOON ISOLATED FORM, 64416 +ARABIC LETTER RNOON FINAL FORM, 64417 +ARABIC LETTER RNOON INITIAL FORM, 64418 +ARABIC LETTER RNOON MEDIAL FORM, 64419 +ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM, 64420 +ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM, 64421 +ARABIC LETTER HEH GOAL ISOLATED FORM, 64422 +ARABIC LETTER HEH GOAL FINAL FORM, 64423 +ARABIC LETTER HEH GOAL INITIAL FORM, 64424 +ARABIC LETTER HEH GOAL MEDIAL FORM, 64425 +ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM, 64426 +ARABIC LETTER HEH DOACHASHMEE FINAL FORM, 64427 +ARABIC LETTER HEH DOACHASHMEE INITIAL FORM, 64428 +ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM, 64429 +ARABIC LETTER YEH BARREE ISOLATED FORM, 64430 +ARABIC LETTER YEH BARREE FINAL FORM, 64431 +ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM, 64432 +ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM, 64433 +ARABIC SYMBOL DOT ABOVE, 64434 +ARABIC SYMBOL DOT BELOW, 64435 +ARABIC SYMBOL TWO DOTS ABOVE, 64436 +ARABIC SYMBOL TWO DOTS BELOW, 64437 +ARABIC SYMBOL THREE DOTS ABOVE, 64438 +ARABIC SYMBOL THREE DOTS BELOW, 64439 +ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE, 64440 +ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW, 64441 +ARABIC SYMBOL FOUR DOTS ABOVE, 64442 +ARABIC SYMBOL FOUR DOTS BELOW, 64443 +ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW, 64444 +ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE, 64445 +ARABIC SYMBOL TWO DOTS VERTICALLY BELOW, 64446 +ARABIC SYMBOL RING, 64447 +ARABIC SYMBOL SMALL TAH ABOVE, 64448 +ARABIC SYMBOL SMALL TAH BELOW, 64449 +ARABIC LETTER NG ISOLATED FORM, 64467 +ARABIC LETTER NG FINAL FORM, 64468 +ARABIC LETTER NG INITIAL FORM, 64469 +ARABIC LETTER NG MEDIAL FORM, 64470 +ARABIC LETTER U ISOLATED FORM, 64471 +ARABIC LETTER U FINAL FORM, 64472 +ARABIC LETTER OE ISOLATED FORM, 64473 +ARABIC LETTER OE FINAL FORM, 64474 +ARABIC LETTER YU ISOLATED FORM, 64475 +ARABIC LETTER YU FINAL FORM, 64476 +ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM, 64477 +ARABIC LETTER VE ISOLATED FORM, 64478 +ARABIC LETTER VE FINAL FORM, 64479 +ARABIC LETTER KIRGHIZ OE ISOLATED FORM, 64480 +ARABIC LETTER KIRGHIZ OE FINAL FORM, 64481 +ARABIC LETTER KIRGHIZ YU ISOLATED FORM, 64482 +ARABIC LETTER KIRGHIZ YU FINAL FORM, 64483 +ARABIC LETTER E ISOLATED FORM, 64484 +ARABIC LETTER E FINAL FORM, 64485 +ARABIC LETTER E INITIAL FORM, 64486 +ARABIC LETTER E MEDIAL FORM, 64487 +ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM, 64488 +ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM, 64489 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM, 64490 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM, 64491 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM, 64492 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM, 64493 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM, 64494 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM, 64495 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM, 64496 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM, 64497 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM, 64498 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM, 64499 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM, 64500 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM, 64501 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM, 64502 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM, 64503 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM, 64504 +ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM, 64505 +ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM, 64506 +ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM, 64507 +ARABIC LETTER FARSI YEH ISOLATED FORM, 64508 +ARABIC LETTER FARSI YEH FINAL FORM, 64509 +ARABIC LETTER FARSI YEH INITIAL FORM, 64510 +ARABIC LETTER FARSI YEH MEDIAL FORM, 64511 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM, 64512 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM, 64513 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM, 64514 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM, 64515 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM, 64516 +ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM, 64517 +ARABIC LIGATURE BEH WITH HAH ISOLATED FORM, 64518 +ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM, 64519 +ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM, 64520 +ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM, 64521 +ARABIC LIGATURE BEH WITH YEH ISOLATED FORM, 64522 +ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM, 64523 +ARABIC LIGATURE TEH WITH HAH ISOLATED FORM, 64524 +ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM, 64525 +ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM, 64526 +ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM, 64527 +ARABIC LIGATURE TEH WITH YEH ISOLATED FORM, 64528 +ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM, 64529 +ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM, 64530 +ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM, 64531 +ARABIC LIGATURE THEH WITH YEH ISOLATED FORM, 64532 +ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM, 64533 +ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM, 64534 +ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM, 64535 +ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM, 64536 +ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM, 64537 +ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM, 64538 +ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM, 64539 +ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM, 64540 +ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM, 64541 +ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM, 64542 +ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM, 64543 +ARABIC LIGATURE SAD WITH HAH ISOLATED FORM, 64544 +ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM, 64545 +ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM, 64546 +ARABIC LIGATURE DAD WITH HAH ISOLATED FORM, 64547 +ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM, 64548 +ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM, 64549 +ARABIC LIGATURE TAH WITH HAH ISOLATED FORM, 64550 +ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM, 64551 +ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM, 64552 +ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM, 64553 +ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM, 64554 +ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM, 64555 +ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM, 64556 +ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM, 64557 +ARABIC LIGATURE FEH WITH HAH ISOLATED FORM, 64558 +ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM, 64559 +ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM, 64560 +ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM, 64561 +ARABIC LIGATURE FEH WITH YEH ISOLATED FORM, 64562 +ARABIC LIGATURE QAF WITH HAH ISOLATED FORM, 64563 +ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM, 64564 +ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM, 64565 +ARABIC LIGATURE QAF WITH YEH ISOLATED FORM, 64566 +ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM, 64567 +ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM, 64568 +ARABIC LIGATURE KAF WITH HAH ISOLATED FORM, 64569 +ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM, 64570 +ARABIC LIGATURE KAF WITH LAM ISOLATED FORM, 64571 +ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM, 64572 +ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM, 64573 +ARABIC LIGATURE KAF WITH YEH ISOLATED FORM, 64574 +ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM, 64575 +ARABIC LIGATURE LAM WITH HAH ISOLATED FORM, 64576 +ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM, 64577 +ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM, 64578 +ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM, 64579 +ARABIC LIGATURE LAM WITH YEH ISOLATED FORM, 64580 +ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM, 64581 +ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM, 64582 +ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM, 64583 +ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM, 64584 +ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM, 64585 +ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM, 64586 +ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM, 64587 +ARABIC LIGATURE NOON WITH HAH ISOLATED FORM, 64588 +ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM, 64589 +ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM, 64590 +ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM, 64591 +ARABIC LIGATURE NOON WITH YEH ISOLATED FORM, 64592 +ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM, 64593 +ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM, 64594 +ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM, 64595 +ARABIC LIGATURE HEH WITH YEH ISOLATED FORM, 64596 +ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM, 64597 +ARABIC LIGATURE YEH WITH HAH ISOLATED FORM, 64598 +ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM, 64599 +ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM, 64600 +ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM, 64601 +ARABIC LIGATURE YEH WITH YEH ISOLATED FORM, 64602 +ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM, 64603 +ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM, 64604 +ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM, 64605 +ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM, 64606 +ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM, 64607 +ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM, 64608 +ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM, 64609 +ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM, 64610 +ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM, 64611 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM, 64612 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM, 64613 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM, 64614 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM, 64615 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM, 64616 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM, 64617 +ARABIC LIGATURE BEH WITH REH FINAL FORM, 64618 +ARABIC LIGATURE BEH WITH ZAIN FINAL FORM, 64619 +ARABIC LIGATURE BEH WITH MEEM FINAL FORM, 64620 +ARABIC LIGATURE BEH WITH NOON FINAL FORM, 64621 +ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM, 64622 +ARABIC LIGATURE BEH WITH YEH FINAL FORM, 64623 +ARABIC LIGATURE TEH WITH REH FINAL FORM, 64624 +ARABIC LIGATURE TEH WITH ZAIN FINAL FORM, 64625 +ARABIC LIGATURE TEH WITH MEEM FINAL FORM, 64626 +ARABIC LIGATURE TEH WITH NOON FINAL FORM, 64627 +ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM, 64628 +ARABIC LIGATURE TEH WITH YEH FINAL FORM, 64629 +ARABIC LIGATURE THEH WITH REH FINAL FORM, 64630 +ARABIC LIGATURE THEH WITH ZAIN FINAL FORM, 64631 +ARABIC LIGATURE THEH WITH MEEM FINAL FORM, 64632 +ARABIC LIGATURE THEH WITH NOON FINAL FORM, 64633 +ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM, 64634 +ARABIC LIGATURE THEH WITH YEH FINAL FORM, 64635 +ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM, 64636 +ARABIC LIGATURE FEH WITH YEH FINAL FORM, 64637 +ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM, 64638 +ARABIC LIGATURE QAF WITH YEH FINAL FORM, 64639 +ARABIC LIGATURE KAF WITH ALEF FINAL FORM, 64640 +ARABIC LIGATURE KAF WITH LAM FINAL FORM, 64641 +ARABIC LIGATURE KAF WITH MEEM FINAL FORM, 64642 +ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM, 64643 +ARABIC LIGATURE KAF WITH YEH FINAL FORM, 64644 +ARABIC LIGATURE LAM WITH MEEM FINAL FORM, 64645 +ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM, 64646 +ARABIC LIGATURE LAM WITH YEH FINAL FORM, 64647 +ARABIC LIGATURE MEEM WITH ALEF FINAL FORM, 64648 +ARABIC LIGATURE MEEM WITH MEEM FINAL FORM, 64649 +ARABIC LIGATURE NOON WITH REH FINAL FORM, 64650 +ARABIC LIGATURE NOON WITH ZAIN FINAL FORM, 64651 +ARABIC LIGATURE NOON WITH MEEM FINAL FORM, 64652 +ARABIC LIGATURE NOON WITH NOON FINAL FORM, 64653 +ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM, 64654 +ARABIC LIGATURE NOON WITH YEH FINAL FORM, 64655 +ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM, 64656 +ARABIC LIGATURE YEH WITH REH FINAL FORM, 64657 +ARABIC LIGATURE YEH WITH ZAIN FINAL FORM, 64658 +ARABIC LIGATURE YEH WITH MEEM FINAL FORM, 64659 +ARABIC LIGATURE YEH WITH NOON FINAL FORM, 64660 +ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM, 64661 +ARABIC LIGATURE YEH WITH YEH FINAL FORM, 64662 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM, 64663 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM, 64664 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM, 64665 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM, 64666 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM, 64667 +ARABIC LIGATURE BEH WITH JEEM INITIAL FORM, 64668 +ARABIC LIGATURE BEH WITH HAH INITIAL FORM, 64669 +ARABIC LIGATURE BEH WITH KHAH INITIAL FORM, 64670 +ARABIC LIGATURE BEH WITH MEEM INITIAL FORM, 64671 +ARABIC LIGATURE BEH WITH HEH INITIAL FORM, 64672 +ARABIC LIGATURE TEH WITH JEEM INITIAL FORM, 64673 +ARABIC LIGATURE TEH WITH HAH INITIAL FORM, 64674 +ARABIC LIGATURE TEH WITH KHAH INITIAL FORM, 64675 +ARABIC LIGATURE TEH WITH MEEM INITIAL FORM, 64676 +ARABIC LIGATURE TEH WITH HEH INITIAL FORM, 64677 +ARABIC LIGATURE THEH WITH MEEM INITIAL FORM, 64678 +ARABIC LIGATURE JEEM WITH HAH INITIAL FORM, 64679 +ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM, 64680 +ARABIC LIGATURE HAH WITH JEEM INITIAL FORM, 64681 +ARABIC LIGATURE HAH WITH MEEM INITIAL FORM, 64682 +ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM, 64683 +ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM, 64684 +ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM, 64685 +ARABIC LIGATURE SEEN WITH HAH INITIAL FORM, 64686 +ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM, 64687 +ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM, 64688 +ARABIC LIGATURE SAD WITH HAH INITIAL FORM, 64689 +ARABIC LIGATURE SAD WITH KHAH INITIAL FORM, 64690 +ARABIC LIGATURE SAD WITH MEEM INITIAL FORM, 64691 +ARABIC LIGATURE DAD WITH JEEM INITIAL FORM, 64692 +ARABIC LIGATURE DAD WITH HAH INITIAL FORM, 64693 +ARABIC LIGATURE DAD WITH KHAH INITIAL FORM, 64694 +ARABIC LIGATURE DAD WITH MEEM INITIAL FORM, 64695 +ARABIC LIGATURE TAH WITH HAH INITIAL FORM, 64696 +ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM, 64697 +ARABIC LIGATURE AIN WITH JEEM INITIAL FORM, 64698 +ARABIC LIGATURE AIN WITH MEEM INITIAL FORM, 64699 +ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM, 64700 +ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM, 64701 +ARABIC LIGATURE FEH WITH JEEM INITIAL FORM, 64702 +ARABIC LIGATURE FEH WITH HAH INITIAL FORM, 64703 +ARABIC LIGATURE FEH WITH KHAH INITIAL FORM, 64704 +ARABIC LIGATURE FEH WITH MEEM INITIAL FORM, 64705 +ARABIC LIGATURE QAF WITH HAH INITIAL FORM, 64706 +ARABIC LIGATURE QAF WITH MEEM INITIAL FORM, 64707 +ARABIC LIGATURE KAF WITH JEEM INITIAL FORM, 64708 +ARABIC LIGATURE KAF WITH HAH INITIAL FORM, 64709 +ARABIC LIGATURE KAF WITH KHAH INITIAL FORM, 64710 +ARABIC LIGATURE KAF WITH LAM INITIAL FORM, 64711 +ARABIC LIGATURE KAF WITH MEEM INITIAL FORM, 64712 +ARABIC LIGATURE LAM WITH JEEM INITIAL FORM, 64713 +ARABIC LIGATURE LAM WITH HAH INITIAL FORM, 64714 +ARABIC LIGATURE LAM WITH KHAH INITIAL FORM, 64715 +ARABIC LIGATURE LAM WITH MEEM INITIAL FORM, 64716 +ARABIC LIGATURE LAM WITH HEH INITIAL FORM, 64717 +ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM, 64718 +ARABIC LIGATURE MEEM WITH HAH INITIAL FORM, 64719 +ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM, 64720 +ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM, 64721 +ARABIC LIGATURE NOON WITH JEEM INITIAL FORM, 64722 +ARABIC LIGATURE NOON WITH HAH INITIAL FORM, 64723 +ARABIC LIGATURE NOON WITH KHAH INITIAL FORM, 64724 +ARABIC LIGATURE NOON WITH MEEM INITIAL FORM, 64725 +ARABIC LIGATURE NOON WITH HEH INITIAL FORM, 64726 +ARABIC LIGATURE HEH WITH JEEM INITIAL FORM, 64727 +ARABIC LIGATURE HEH WITH MEEM INITIAL FORM, 64728 +ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM, 64729 +ARABIC LIGATURE YEH WITH JEEM INITIAL FORM, 64730 +ARABIC LIGATURE YEH WITH HAH INITIAL FORM, 64731 +ARABIC LIGATURE YEH WITH KHAH INITIAL FORM, 64732 +ARABIC LIGATURE YEH WITH MEEM INITIAL FORM, 64733 +ARABIC LIGATURE YEH WITH HEH INITIAL FORM, 64734 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM, 64735 +ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM, 64736 +ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM, 64737 +ARABIC LIGATURE BEH WITH HEH MEDIAL FORM, 64738 +ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM, 64739 +ARABIC LIGATURE TEH WITH HEH MEDIAL FORM, 64740 +ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM, 64741 +ARABIC LIGATURE THEH WITH HEH MEDIAL FORM, 64742 +ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM, 64743 +ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM, 64744 +ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM, 64745 +ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM, 64746 +ARABIC LIGATURE KAF WITH LAM MEDIAL FORM, 64747 +ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM, 64748 +ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM, 64749 +ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM, 64750 +ARABIC LIGATURE NOON WITH HEH MEDIAL FORM, 64751 +ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM, 64752 +ARABIC LIGATURE YEH WITH HEH MEDIAL FORM, 64753 +ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM, 64754 +ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM, 64755 +ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM, 64756 +ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM, 64757 +ARABIC LIGATURE TAH WITH YEH ISOLATED FORM, 64758 +ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM, 64759 +ARABIC LIGATURE AIN WITH YEH ISOLATED FORM, 64760 +ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM, 64761 +ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM, 64762 +ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM, 64763 +ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM, 64764 +ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM, 64765 +ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM, 64766 +ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM, 64767 +ARABIC LIGATURE HAH WITH YEH ISOLATED FORM, 64768 +ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM, 64769 +ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM, 64770 +ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM, 64771 +ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM, 64772 +ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM, 64773 +ARABIC LIGATURE SAD WITH YEH ISOLATED FORM, 64774 +ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM, 64775 +ARABIC LIGATURE DAD WITH YEH ISOLATED FORM, 64776 +ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM, 64777 +ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM, 64778 +ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM, 64779 +ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM, 64780 +ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM, 64781 +ARABIC LIGATURE SEEN WITH REH ISOLATED FORM, 64782 +ARABIC LIGATURE SAD WITH REH ISOLATED FORM, 64783 +ARABIC LIGATURE DAD WITH REH ISOLATED FORM, 64784 +ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM, 64785 +ARABIC LIGATURE TAH WITH YEH FINAL FORM, 64786 +ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM, 64787 +ARABIC LIGATURE AIN WITH YEH FINAL FORM, 64788 +ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM, 64789 +ARABIC LIGATURE GHAIN WITH YEH FINAL FORM, 64790 +ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM, 64791 +ARABIC LIGATURE SEEN WITH YEH FINAL FORM, 64792 +ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM, 64793 +ARABIC LIGATURE SHEEN WITH YEH FINAL FORM, 64794 +ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM, 64795 +ARABIC LIGATURE HAH WITH YEH FINAL FORM, 64796 +ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM, 64797 +ARABIC LIGATURE JEEM WITH YEH FINAL FORM, 64798 +ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM, 64799 +ARABIC LIGATURE KHAH WITH YEH FINAL FORM, 64800 +ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM, 64801 +ARABIC LIGATURE SAD WITH YEH FINAL FORM, 64802 +ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM, 64803 +ARABIC LIGATURE DAD WITH YEH FINAL FORM, 64804 +ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM, 64805 +ARABIC LIGATURE SHEEN WITH HAH FINAL FORM, 64806 +ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM, 64807 +ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM, 64808 +ARABIC LIGATURE SHEEN WITH REH FINAL FORM, 64809 +ARABIC LIGATURE SEEN WITH REH FINAL FORM, 64810 +ARABIC LIGATURE SAD WITH REH FINAL FORM, 64811 +ARABIC LIGATURE DAD WITH REH FINAL FORM, 64812 +ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM, 64813 +ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM, 64814 +ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM, 64815 +ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM, 64816 +ARABIC LIGATURE SEEN WITH HEH INITIAL FORM, 64817 +ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM, 64818 +ARABIC LIGATURE TAH WITH MEEM INITIAL FORM, 64819 +ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM, 64820 +ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM, 64821 +ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM, 64822 +ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM, 64823 +ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM, 64824 +ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM, 64825 +ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM, 64826 +ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM, 64827 +ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM, 64828 +ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM, 64829 +ORNATE LEFT PARENTHESIS, 64830 +ORNATE RIGHT PARENTHESIS, 64831 +ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM, 64848 +ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM, 64849 +ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM, 64850 +ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM, 64851 +ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM, 64852 +ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM, 64853 +ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM, 64854 +ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM, 64855 +ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM, 64856 +ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM, 64857 +ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM, 64858 +ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM, 64859 +ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM, 64860 +ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM, 64861 +ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM, 64862 +ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM, 64863 +ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM, 64864 +ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM, 64865 +ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM, 64866 +ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM, 64867 +ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM, 64868 +ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM, 64869 +ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM, 64870 +ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM, 64871 +ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM, 64872 +ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM, 64873 +ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM, 64874 +ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM, 64875 +ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM, 64876 +ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM, 64877 +ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM, 64878 +ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM, 64879 +ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM, 64880 +ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM, 64881 +ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM, 64882 +ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM, 64883 +ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM, 64884 +ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM, 64885 +ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM, 64886 +ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM, 64887 +ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM, 64888 +ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM, 64889 +ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM, 64890 +ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM, 64891 +ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM, 64892 +ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM, 64893 +ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM, 64894 +ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM, 64895 +ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM, 64896 +ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM, 64897 +ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM, 64898 +ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM, 64899 +ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM, 64900 +ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM, 64901 +ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM, 64902 +ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM, 64903 +ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM, 64904 +ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM, 64905 +ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM, 64906 +ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM, 64907 +ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM, 64908 +ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM, 64909 +ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM, 64910 +ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM, 64911 +ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM, 64914 +ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM, 64915 +ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM, 64916 +ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM, 64917 +ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM, 64918 +ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM, 64919 +ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM, 64920 +ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM, 64921 +ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM, 64922 +ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM, 64923 +ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM, 64924 +ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM, 64925 +ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM, 64926 +ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM, 64927 +ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM, 64928 +ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM, 64929 +ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM, 64930 +ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM, 64931 +ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM, 64932 +ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM, 64933 +ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM, 64934 +ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM, 64935 +ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM, 64936 +ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM, 64937 +ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM, 64938 +ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM, 64939 +ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM, 64940 +ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM, 64941 +ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM, 64942 +ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM, 64943 +ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM, 64944 +ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM, 64945 +ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM, 64946 +ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM, 64947 +ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM, 64948 +ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM, 64949 +ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM, 64950 +ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM, 64951 +ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM, 64952 +ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM, 64953 +ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM, 64954 +ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM, 64955 +ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM, 64956 +ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM, 64957 +ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM, 64958 +ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM, 64959 +ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM, 64960 +ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM, 64961 +ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM, 64962 +ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM, 64963 +ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM, 64964 +ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM, 64965 +ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM, 64966 +ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM, 64967 +ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM, 65008 +ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM, 65009 +ARABIC LIGATURE ALLAH ISOLATED FORM, 65010 +ARABIC LIGATURE AKBAR ISOLATED FORM, 65011 +ARABIC LIGATURE MOHAMMAD ISOLATED FORM, 65012 +ARABIC LIGATURE SALAM ISOLATED FORM, 65013 +ARABIC LIGATURE RASOUL ISOLATED FORM, 65014 +ARABIC LIGATURE ALAYHE ISOLATED FORM, 65015 +ARABIC LIGATURE WASALLAM ISOLATED FORM, 65016 +ARABIC LIGATURE SALLA ISOLATED FORM, 65017 +ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM, 65018 +ARABIC LIGATURE JALLAJALALOUHOU, 65019 +RIAL SIGN, 65020 +ARABIC LIGATURE BISMILLAH AR RAHMAN AR RAHEEM, 65021 +VARIATION SELECTOR 1, 65024 +VARIATION SELECTOR 2, 65025 +VARIATION SELECTOR 3, 65026 +VARIATION SELECTOR 4, 65027 +VARIATION SELECTOR 5, 65028 +VARIATION SELECTOR 6, 65029 +VARIATION SELECTOR 7, 65030 +VARIATION SELECTOR 8, 65031 +VARIATION SELECTOR 9, 65032 +VARIATION SELECTOR 10, 65033 +VARIATION SELECTOR 11, 65034 +VARIATION SELECTOR 12, 65035 +VARIATION SELECTOR 13, 65036 +VARIATION SELECTOR 14, 65037 +VARIATION SELECTOR 15, 65038 +VARIATION SELECTOR 16, 65039 +PRESENTATION FORM FOR VERTICAL COMMA, 65040 +PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA, 65041 +PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP, 65042 +PRESENTATION FORM FOR VERTICAL COLON, 65043 +PRESENTATION FORM FOR VERTICAL SEMICOLON, 65044 +PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK, 65045 +PRESENTATION FORM FOR VERTICAL QUESTION MARK, 65046 +PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET, 65047 +PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET, 65048 +PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS, 65049 +COMBINING LIGATURE LEFT HALF, 65056 +COMBINING LIGATURE RIGHT HALF, 65057 +COMBINING DOUBLE TILDE LEFT HALF, 65058 +COMBINING DOUBLE TILDE RIGHT HALF, 65059 +COMBINING MACRON LEFT HALF, 65060 +COMBINING MACRON RIGHT HALF, 65061 +COMBINING CONJOINING MACRON, 65062 +COMBINING LIGATURE LEFT HALF BELOW, 65063 +COMBINING LIGATURE RIGHT HALF BELOW, 65064 +COMBINING TILDE LEFT HALF BELOW, 65065 +COMBINING TILDE RIGHT HALF BELOW, 65066 +COMBINING MACRON LEFT HALF BELOW, 65067 +COMBINING MACRON RIGHT HALF BELOW, 65068 +COMBINING CONJOINING MACRON BELOW, 65069 +COMBINING CYRILLIC TITLO LEFT HALF, 65070 +COMBINING CYRILLIC TITLO RIGHT HALF, 65071 +PRESENTATION FORM FOR VERTICAL TWO DOT LEADER, 65072 +PRESENTATION FORM FOR VERTICAL EM DASH, 65073 +PRESENTATION FORM FOR VERTICAL EN DASH, 65074 +PRESENTATION FORM FOR VERTICAL LOW LINE, 65075 +PRESENTATION FORM FOR VERTICAL WAVY LOW LINE, 65076 +PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS, 65077 +PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS, 65078 +PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET, 65079 +PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET, 65080 +PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET, 65081 +PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET, 65082 +PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET, 65083 +PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET, 65084 +PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET, 65085 +PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET, 65086 +PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET, 65087 +PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET, 65088 +PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET, 65089 +PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET, 65090 +PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET, 65091 +PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET, 65092 +SESAME DOT, 65093 +WHITE SESAME DOT, 65094 +PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET, 65095 +PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET, 65096 +DASHED OVERLINE, 65097 +CENTRELINE OVERLINE, 65098 +WAVY OVERLINE, 65099 +DOUBLE WAVY OVERLINE, 65100 +DASHED LOW LINE, 65101 +CENTRELINE LOW LINE, 65102 +WAVY LOW LINE, 65103 +SMALL COMMA, 65104 +SMALL IDEOGRAPHIC COMMA, 65105 +SMALL FULL STOP, 65106 +SMALL SEMICOLON, 65108 +SMALL COLON, 65109 +SMALL QUESTION MARK, 65110 +SMALL EXCLAMATION MARK, 65111 +SMALL EM DASH, 65112 +SMALL LEFT PARENTHESIS, 65113 +SMALL RIGHT PARENTHESIS, 65114 +SMALL LEFT CURLY BRACKET, 65115 +SMALL RIGHT CURLY BRACKET, 65116 +SMALL LEFT TORTOISE SHELL BRACKET, 65117 +SMALL RIGHT TORTOISE SHELL BRACKET, 65118 +SMALL NUMBER SIGN, 65119 +SMALL AMPERSAND, 65120 +SMALL ASTERISK, 65121 +SMALL PLUS SIGN, 65122 +SMALL HYPHEN MINUS, 65123 +SMALL LESS THAN SIGN, 65124 +SMALL GREATER THAN SIGN, 65125 +SMALL EQUALS SIGN, 65126 +SMALL REVERSE SOLIDUS, 65128 +SMALL DOLLAR SIGN, 65129 +SMALL PERCENT SIGN, 65130 +SMALL COMMERCIAL AT, 65131 +ARABIC FATHATAN ISOLATED FORM, 65136 +ARABIC TATWEEL WITH FATHATAN ABOVE, 65137 +ARABIC DAMMATAN ISOLATED FORM, 65138 +ARABIC TAIL FRAGMENT, 65139 +ARABIC KASRATAN ISOLATED FORM, 65140 +ARABIC FATHA ISOLATED FORM, 65142 +ARABIC FATHA MEDIAL FORM, 65143 +ARABIC DAMMA ISOLATED FORM, 65144 +ARABIC DAMMA MEDIAL FORM, 65145 +ARABIC KASRA ISOLATED FORM, 65146 +ARABIC KASRA MEDIAL FORM, 65147 +ARABIC SHADDA ISOLATED FORM, 65148 +ARABIC SHADDA MEDIAL FORM, 65149 +ARABIC SUKUN ISOLATED FORM, 65150 +ARABIC SUKUN MEDIAL FORM, 65151 +ARABIC LETTER HAMZA ISOLATED FORM, 65152 +ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM, 65153 +ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM, 65154 +ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM, 65155 +ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM, 65156 +ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM, 65157 +ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM, 65158 +ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM, 65159 +ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM, 65160 +ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM, 65161 +ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM, 65162 +ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM, 65163 +ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM, 65164 +ARABIC LETTER ALEF ISOLATED FORM, 65165 +ARABIC LETTER ALEF FINAL FORM, 65166 +ARABIC LETTER BEH ISOLATED FORM, 65167 +ARABIC LETTER BEH FINAL FORM, 65168 +ARABIC LETTER BEH INITIAL FORM, 65169 +ARABIC LETTER BEH MEDIAL FORM, 65170 +ARABIC LETTER TEH MARBUTA ISOLATED FORM, 65171 +ARABIC LETTER TEH MARBUTA FINAL FORM, 65172 +ARABIC LETTER TEH ISOLATED FORM, 65173 +ARABIC LETTER TEH FINAL FORM, 65174 +ARABIC LETTER TEH INITIAL FORM, 65175 +ARABIC LETTER TEH MEDIAL FORM, 65176 +ARABIC LETTER THEH ISOLATED FORM, 65177 +ARABIC LETTER THEH FINAL FORM, 65178 +ARABIC LETTER THEH INITIAL FORM, 65179 +ARABIC LETTER THEH MEDIAL FORM, 65180 +ARABIC LETTER JEEM ISOLATED FORM, 65181 +ARABIC LETTER JEEM FINAL FORM, 65182 +ARABIC LETTER JEEM INITIAL FORM, 65183 +ARABIC LETTER JEEM MEDIAL FORM, 65184 +ARABIC LETTER HAH ISOLATED FORM, 65185 +ARABIC LETTER HAH FINAL FORM, 65186 +ARABIC LETTER HAH INITIAL FORM, 65187 +ARABIC LETTER HAH MEDIAL FORM, 65188 +ARABIC LETTER KHAH ISOLATED FORM, 65189 +ARABIC LETTER KHAH FINAL FORM, 65190 +ARABIC LETTER KHAH INITIAL FORM, 65191 +ARABIC LETTER KHAH MEDIAL FORM, 65192 +ARABIC LETTER DAL ISOLATED FORM, 65193 +ARABIC LETTER DAL FINAL FORM, 65194 +ARABIC LETTER THAL ISOLATED FORM, 65195 +ARABIC LETTER THAL FINAL FORM, 65196 +ARABIC LETTER REH ISOLATED FORM, 65197 +ARABIC LETTER REH FINAL FORM, 65198 +ARABIC LETTER ZAIN ISOLATED FORM, 65199 +ARABIC LETTER ZAIN FINAL FORM, 65200 +ARABIC LETTER SEEN ISOLATED FORM, 65201 +ARABIC LETTER SEEN FINAL FORM, 65202 +ARABIC LETTER SEEN INITIAL FORM, 65203 +ARABIC LETTER SEEN MEDIAL FORM, 65204 +ARABIC LETTER SHEEN ISOLATED FORM, 65205 +ARABIC LETTER SHEEN FINAL FORM, 65206 +ARABIC LETTER SHEEN INITIAL FORM, 65207 +ARABIC LETTER SHEEN MEDIAL FORM, 65208 +ARABIC LETTER SAD ISOLATED FORM, 65209 +ARABIC LETTER SAD FINAL FORM, 65210 +ARABIC LETTER SAD INITIAL FORM, 65211 +ARABIC LETTER SAD MEDIAL FORM, 65212 +ARABIC LETTER DAD ISOLATED FORM, 65213 +ARABIC LETTER DAD FINAL FORM, 65214 +ARABIC LETTER DAD INITIAL FORM, 65215 +ARABIC LETTER DAD MEDIAL FORM, 65216 +ARABIC LETTER TAH ISOLATED FORM, 65217 +ARABIC LETTER TAH FINAL FORM, 65218 +ARABIC LETTER TAH INITIAL FORM, 65219 +ARABIC LETTER TAH MEDIAL FORM, 65220 +ARABIC LETTER ZAH ISOLATED FORM, 65221 +ARABIC LETTER ZAH FINAL FORM, 65222 +ARABIC LETTER ZAH INITIAL FORM, 65223 +ARABIC LETTER ZAH MEDIAL FORM, 65224 +ARABIC LETTER AIN ISOLATED FORM, 65225 +ARABIC LETTER AIN FINAL FORM, 65226 +ARABIC LETTER AIN INITIAL FORM, 65227 +ARABIC LETTER AIN MEDIAL FORM, 65228 +ARABIC LETTER GHAIN ISOLATED FORM, 65229 +ARABIC LETTER GHAIN FINAL FORM, 65230 +ARABIC LETTER GHAIN INITIAL FORM, 65231 +ARABIC LETTER GHAIN MEDIAL FORM, 65232 +ARABIC LETTER FEH ISOLATED FORM, 65233 +ARABIC LETTER FEH FINAL FORM, 65234 +ARABIC LETTER FEH INITIAL FORM, 65235 +ARABIC LETTER FEH MEDIAL FORM, 65236 +ARABIC LETTER QAF ISOLATED FORM, 65237 +ARABIC LETTER QAF FINAL FORM, 65238 +ARABIC LETTER QAF INITIAL FORM, 65239 +ARABIC LETTER QAF MEDIAL FORM, 65240 +ARABIC LETTER KAF ISOLATED FORM, 65241 +ARABIC LETTER KAF FINAL FORM, 65242 +ARABIC LETTER KAF INITIAL FORM, 65243 +ARABIC LETTER KAF MEDIAL FORM, 65244 +ARABIC LETTER LAM ISOLATED FORM, 65245 +ARABIC LETTER LAM FINAL FORM, 65246 +ARABIC LETTER LAM INITIAL FORM, 65247 +ARABIC LETTER LAM MEDIAL FORM, 65248 +ARABIC LETTER MEEM ISOLATED FORM, 65249 +ARABIC LETTER MEEM FINAL FORM, 65250 +ARABIC LETTER MEEM INITIAL FORM, 65251 +ARABIC LETTER MEEM MEDIAL FORM, 65252 +ARABIC LETTER NOON ISOLATED FORM, 65253 +ARABIC LETTER NOON FINAL FORM, 65254 +ARABIC LETTER NOON INITIAL FORM, 65255 +ARABIC LETTER NOON MEDIAL FORM, 65256 +ARABIC LETTER HEH ISOLATED FORM, 65257 +ARABIC LETTER HEH FINAL FORM, 65258 +ARABIC LETTER HEH INITIAL FORM, 65259 +ARABIC LETTER HEH MEDIAL FORM, 65260 +ARABIC LETTER WAW ISOLATED FORM, 65261 +ARABIC LETTER WAW FINAL FORM, 65262 +ARABIC LETTER ALEF MAKSURA ISOLATED FORM, 65263 +ARABIC LETTER ALEF MAKSURA FINAL FORM, 65264 +ARABIC LETTER YEH ISOLATED FORM, 65265 +ARABIC LETTER YEH FINAL FORM, 65266 +ARABIC LETTER YEH INITIAL FORM, 65267 +ARABIC LETTER YEH MEDIAL FORM, 65268 +ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM, 65269 +ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM, 65270 +ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM, 65271 +ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM, 65272 +ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM, 65273 +ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM, 65274 +ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM, 65275 +ARABIC LIGATURE LAM WITH ALEF FINAL FORM, 65276 +ZERO WIDTH NO BREAK SPACE, 65279 +FULLWIDTH EXCLAMATION MARK, 65281 +FULLWIDTH QUOTATION MARK, 65282 +FULLWIDTH NUMBER SIGN, 65283 +FULLWIDTH DOLLAR SIGN, 65284 +FULLWIDTH PERCENT SIGN, 65285 +FULLWIDTH AMPERSAND, 65286 +FULLWIDTH APOSTROPHE, 65287 +FULLWIDTH LEFT PARENTHESIS, 65288 +FULLWIDTH RIGHT PARENTHESIS, 65289 +FULLWIDTH ASTERISK, 65290 +FULLWIDTH PLUS SIGN, 65291 +FULLWIDTH COMMA, 65292 +FULLWIDTH HYPHEN MINUS, 65293 +FULLWIDTH FULL STOP, 65294 +FULLWIDTH SOLIDUS, 65295 +FULLWIDTH DIGIT ZERO, 65296 +FULLWIDTH DIGIT ONE, 65297 +FULLWIDTH DIGIT TWO, 65298 +FULLWIDTH DIGIT THREE, 65299 +FULLWIDTH DIGIT FOUR, 65300 +FULLWIDTH DIGIT FIVE, 65301 +FULLWIDTH DIGIT SIX, 65302 +FULLWIDTH DIGIT SEVEN, 65303 +FULLWIDTH DIGIT EIGHT, 65304 +FULLWIDTH DIGIT NINE, 65305 +FULLWIDTH COLON, 65306 +FULLWIDTH SEMICOLON, 65307 +FULLWIDTH LESS THAN SIGN, 65308 +FULLWIDTH EQUALS SIGN, 65309 +FULLWIDTH GREATER THAN SIGN, 65310 +FULLWIDTH QUESTION MARK, 65311 +FULLWIDTH COMMERCIAL AT, 65312 +FULLWIDTH LATIN CAPITAL LETTER A, 65313 +FULLWIDTH LATIN CAPITAL LETTER B, 65314 +FULLWIDTH LATIN CAPITAL LETTER C, 65315 +FULLWIDTH LATIN CAPITAL LETTER D, 65316 +FULLWIDTH LATIN CAPITAL LETTER E, 65317 +FULLWIDTH LATIN CAPITAL LETTER F, 65318 +FULLWIDTH LATIN CAPITAL LETTER G, 65319 +FULLWIDTH LATIN CAPITAL LETTER H, 65320 +FULLWIDTH LATIN CAPITAL LETTER I, 65321 +FULLWIDTH LATIN CAPITAL LETTER J, 65322 +FULLWIDTH LATIN CAPITAL LETTER K, 65323 +FULLWIDTH LATIN CAPITAL LETTER L, 65324 +FULLWIDTH LATIN CAPITAL LETTER M, 65325 +FULLWIDTH LATIN CAPITAL LETTER N, 65326 +FULLWIDTH LATIN CAPITAL LETTER O, 65327 +FULLWIDTH LATIN CAPITAL LETTER P, 65328 +FULLWIDTH LATIN CAPITAL LETTER Q, 65329 +FULLWIDTH LATIN CAPITAL LETTER R, 65330 +FULLWIDTH LATIN CAPITAL LETTER S, 65331 +FULLWIDTH LATIN CAPITAL LETTER T, 65332 +FULLWIDTH LATIN CAPITAL LETTER U, 65333 +FULLWIDTH LATIN CAPITAL LETTER V, 65334 +FULLWIDTH LATIN CAPITAL LETTER W, 65335 +FULLWIDTH LATIN CAPITAL LETTER X, 65336 +FULLWIDTH LATIN CAPITAL LETTER Y, 65337 +FULLWIDTH LATIN CAPITAL LETTER Z, 65338 +FULLWIDTH LEFT SQUARE BRACKET, 65339 +FULLWIDTH REVERSE SOLIDUS, 65340 +FULLWIDTH RIGHT SQUARE BRACKET, 65341 +FULLWIDTH CIRCUMFLEX ACCENT, 65342 +FULLWIDTH LOW LINE, 65343 +FULLWIDTH GRAVE ACCENT, 65344 +FULLWIDTH LATIN SMALL LETTER A, 65345 +FULLWIDTH LATIN SMALL LETTER B, 65346 +FULLWIDTH LATIN SMALL LETTER C, 65347 +FULLWIDTH LATIN SMALL LETTER D, 65348 +FULLWIDTH LATIN SMALL LETTER E, 65349 +FULLWIDTH LATIN SMALL LETTER F, 65350 +FULLWIDTH LATIN SMALL LETTER G, 65351 +FULLWIDTH LATIN SMALL LETTER H, 65352 +FULLWIDTH LATIN SMALL LETTER I, 65353 +FULLWIDTH LATIN SMALL LETTER J, 65354 +FULLWIDTH LATIN SMALL LETTER K, 65355 +FULLWIDTH LATIN SMALL LETTER L, 65356 +FULLWIDTH LATIN SMALL LETTER M, 65357 +FULLWIDTH LATIN SMALL LETTER N, 65358 +FULLWIDTH LATIN SMALL LETTER O, 65359 +FULLWIDTH LATIN SMALL LETTER P, 65360 +FULLWIDTH LATIN SMALL LETTER Q, 65361 +FULLWIDTH LATIN SMALL LETTER R, 65362 +FULLWIDTH LATIN SMALL LETTER S, 65363 +FULLWIDTH LATIN SMALL LETTER T, 65364 +FULLWIDTH LATIN SMALL LETTER U, 65365 +FULLWIDTH LATIN SMALL LETTER V, 65366 +FULLWIDTH LATIN SMALL LETTER W, 65367 +FULLWIDTH LATIN SMALL LETTER X, 65368 +FULLWIDTH LATIN SMALL LETTER Y, 65369 +FULLWIDTH LATIN SMALL LETTER Z, 65370 +FULLWIDTH LEFT CURLY BRACKET, 65371 +FULLWIDTH VERTICAL LINE, 65372 +FULLWIDTH RIGHT CURLY BRACKET, 65373 +FULLWIDTH TILDE, 65374 +FULLWIDTH LEFT WHITE PARENTHESIS, 65375 +FULLWIDTH RIGHT WHITE PARENTHESIS, 65376 +HALFWIDTH IDEOGRAPHIC FULL STOP, 65377 +HALFWIDTH LEFT CORNER BRACKET, 65378 +HALFWIDTH RIGHT CORNER BRACKET, 65379 +HALFWIDTH IDEOGRAPHIC COMMA, 65380 +HALFWIDTH KATAKANA MIDDLE DOT, 65381 +HALFWIDTH KATAKANA LETTER WO, 65382 +HALFWIDTH KATAKANA LETTER SMALL A, 65383 +HALFWIDTH KATAKANA LETTER SMALL I, 65384 +HALFWIDTH KATAKANA LETTER SMALL U, 65385 +HALFWIDTH KATAKANA LETTER SMALL E, 65386 +HALFWIDTH KATAKANA LETTER SMALL O, 65387 +HALFWIDTH KATAKANA LETTER SMALL YA, 65388 +HALFWIDTH KATAKANA LETTER SMALL YU, 65389 +HALFWIDTH KATAKANA LETTER SMALL YO, 65390 +HALFWIDTH KATAKANA LETTER SMALL TU, 65391 +HALFWIDTH KATAKANA HIRAGANA PROLONGED SOUND MARK, 65392 +HALFWIDTH KATAKANA LETTER A, 65393 +HALFWIDTH KATAKANA LETTER I, 65394 +HALFWIDTH KATAKANA LETTER U, 65395 +HALFWIDTH KATAKANA LETTER E, 65396 +HALFWIDTH KATAKANA LETTER O, 65397 +HALFWIDTH KATAKANA LETTER KA, 65398 +HALFWIDTH KATAKANA LETTER KI, 65399 +HALFWIDTH KATAKANA LETTER KU, 65400 +HALFWIDTH KATAKANA LETTER KE, 65401 +HALFWIDTH KATAKANA LETTER KO, 65402 +HALFWIDTH KATAKANA LETTER SA, 65403 +HALFWIDTH KATAKANA LETTER SI, 65404 +HALFWIDTH KATAKANA LETTER SU, 65405 +HALFWIDTH KATAKANA LETTER SE, 65406 +HALFWIDTH KATAKANA LETTER SO, 65407 +HALFWIDTH KATAKANA LETTER TA, 65408 +HALFWIDTH KATAKANA LETTER TI, 65409 +HALFWIDTH KATAKANA LETTER TU, 65410 +HALFWIDTH KATAKANA LETTER TE, 65411 +HALFWIDTH KATAKANA LETTER TO, 65412 +HALFWIDTH KATAKANA LETTER NA, 65413 +HALFWIDTH KATAKANA LETTER NI, 65414 +HALFWIDTH KATAKANA LETTER NU, 65415 +HALFWIDTH KATAKANA LETTER NE, 65416 +HALFWIDTH KATAKANA LETTER NO, 65417 +HALFWIDTH KATAKANA LETTER HA, 65418 +HALFWIDTH KATAKANA LETTER HI, 65419 +HALFWIDTH KATAKANA LETTER HU, 65420 +HALFWIDTH KATAKANA LETTER HE, 65421 +HALFWIDTH KATAKANA LETTER HO, 65422 +HALFWIDTH KATAKANA LETTER MA, 65423 +HALFWIDTH KATAKANA LETTER MI, 65424 +HALFWIDTH KATAKANA LETTER MU, 65425 +HALFWIDTH KATAKANA LETTER ME, 65426 +HALFWIDTH KATAKANA LETTER MO, 65427 +HALFWIDTH KATAKANA LETTER YA, 65428 +HALFWIDTH KATAKANA LETTER YU, 65429 +HALFWIDTH KATAKANA LETTER YO, 65430 +HALFWIDTH KATAKANA LETTER RA, 65431 +HALFWIDTH KATAKANA LETTER RI, 65432 +HALFWIDTH KATAKANA LETTER RU, 65433 +HALFWIDTH KATAKANA LETTER RE, 65434 +HALFWIDTH KATAKANA LETTER RO, 65435 +HALFWIDTH KATAKANA LETTER WA, 65436 +HALFWIDTH KATAKANA LETTER N, 65437 +HALFWIDTH KATAKANA VOICED SOUND MARK, 65438 +HALFWIDTH KATAKANA SEMI VOICED SOUND MARK, 65439 +HALFWIDTH HANGUL FILLER, 65440 +HALFWIDTH HANGUL LETTER KIYEOK, 65441 +HALFWIDTH HANGUL LETTER SSANGKIYEOK, 65442 +HALFWIDTH HANGUL LETTER KIYEOK SIOS, 65443 +HALFWIDTH HANGUL LETTER NIEUN, 65444 +HALFWIDTH HANGUL LETTER NIEUN CIEUC, 65445 +HALFWIDTH HANGUL LETTER NIEUN HIEUH, 65446 +HALFWIDTH HANGUL LETTER TIKEUT, 65447 +HALFWIDTH HANGUL LETTER SSANGTIKEUT, 65448 +HALFWIDTH HANGUL LETTER RIEUL, 65449 +HALFWIDTH HANGUL LETTER RIEUL KIYEOK, 65450 +HALFWIDTH HANGUL LETTER RIEUL MIEUM, 65451 +HALFWIDTH HANGUL LETTER RIEUL PIEUP, 65452 +HALFWIDTH HANGUL LETTER RIEUL SIOS, 65453 +HALFWIDTH HANGUL LETTER RIEUL THIEUTH, 65454 +HALFWIDTH HANGUL LETTER RIEUL PHIEUPH, 65455 +HALFWIDTH HANGUL LETTER RIEUL HIEUH, 65456 +HALFWIDTH HANGUL LETTER MIEUM, 65457 +HALFWIDTH HANGUL LETTER PIEUP, 65458 +HALFWIDTH HANGUL LETTER SSANGPIEUP, 65459 +HALFWIDTH HANGUL LETTER PIEUP SIOS, 65460 +HALFWIDTH HANGUL LETTER SIOS, 65461 +HALFWIDTH HANGUL LETTER SSANGSIOS, 65462 +HALFWIDTH HANGUL LETTER IEUNG, 65463 +HALFWIDTH HANGUL LETTER CIEUC, 65464 +HALFWIDTH HANGUL LETTER SSANGCIEUC, 65465 +HALFWIDTH HANGUL LETTER CHIEUCH, 65466 +HALFWIDTH HANGUL LETTER KHIEUKH, 65467 +HALFWIDTH HANGUL LETTER THIEUTH, 65468 +HALFWIDTH HANGUL LETTER PHIEUPH, 65469 +HALFWIDTH HANGUL LETTER HIEUH, 65470 +HALFWIDTH HANGUL LETTER A, 65474 +HALFWIDTH HANGUL LETTER AE, 65475 +HALFWIDTH HANGUL LETTER YA, 65476 +HALFWIDTH HANGUL LETTER YAE, 65477 +HALFWIDTH HANGUL LETTER EO, 65478 +HALFWIDTH HANGUL LETTER E, 65479 +HALFWIDTH HANGUL LETTER YEO, 65482 +HALFWIDTH HANGUL LETTER YE, 65483 +HALFWIDTH HANGUL LETTER O, 65484 +HALFWIDTH HANGUL LETTER WA, 65485 +HALFWIDTH HANGUL LETTER WAE, 65486 +HALFWIDTH HANGUL LETTER OE, 65487 +HALFWIDTH HANGUL LETTER YO, 65490 +HALFWIDTH HANGUL LETTER U, 65491 +HALFWIDTH HANGUL LETTER WEO, 65492 +HALFWIDTH HANGUL LETTER WE, 65493 +HALFWIDTH HANGUL LETTER WI, 65494 +HALFWIDTH HANGUL LETTER YU, 65495 +HALFWIDTH HANGUL LETTER EU, 65498 +HALFWIDTH HANGUL LETTER YI, 65499 +HALFWIDTH HANGUL LETTER I, 65500 +FULLWIDTH CENT SIGN, 65504 +FULLWIDTH POUND SIGN, 65505 +FULLWIDTH NOT SIGN, 65506 +FULLWIDTH MACRON, 65507 +FULLWIDTH BROKEN BAR, 65508 +FULLWIDTH YEN SIGN, 65509 +FULLWIDTH WON SIGN, 65510 +HALFWIDTH FORMS LIGHT VERTICAL, 65512 +HALFWIDTH LEFTWARDS ARROW, 65513 +HALFWIDTH UPWARDS ARROW, 65514 +HALFWIDTH RIGHTWARDS ARROW, 65515 +HALFWIDTH DOWNWARDS ARROW, 65516 +HALFWIDTH BLACK SQUARE, 65517 +HALFWIDTH WHITE CIRCLE, 65518 +INTERLINEAR ANNOTATION ANCHOR, 65529 +INTERLINEAR ANNOTATION SEPARATOR, 65530 +INTERLINEAR ANNOTATION TERMINATOR, 65531 +OBJECT REPLACEMENT CHARACTER, 65532 +REPLACEMENT CHARACTER, 65533 +LINEAR B SYLLABLE B008 A, 65536 +LINEAR B SYLLABLE B038 E, 65537 +LINEAR B SYLLABLE B028 I, 65538 +LINEAR B SYLLABLE B061 O, 65539 +LINEAR B SYLLABLE B010 U, 65540 +LINEAR B SYLLABLE B001 DA, 65541 +LINEAR B SYLLABLE B045 DE, 65542 +LINEAR B SYLLABLE B007 DI, 65543 +LINEAR B SYLLABLE B014 DO, 65544 +LINEAR B SYLLABLE B051 DU, 65545 +LINEAR B SYLLABLE B057 JA, 65546 +LINEAR B SYLLABLE B046 JE, 65547 +LINEAR B SYLLABLE B036 JO, 65549 +LINEAR B SYLLABLE B065 JU, 65550 +LINEAR B SYLLABLE B077 KA, 65551 +LINEAR B SYLLABLE B044 KE, 65552 +LINEAR B SYLLABLE B067 KI, 65553 +LINEAR B SYLLABLE B070 KO, 65554 +LINEAR B SYLLABLE B081 KU, 65555 +LINEAR B SYLLABLE B080 MA, 65556 +LINEAR B SYLLABLE B013 ME, 65557 +LINEAR B SYLLABLE B073 MI, 65558 +LINEAR B SYLLABLE B015 MO, 65559 +LINEAR B SYLLABLE B023 MU, 65560 +LINEAR B SYLLABLE B006 NA, 65561 +LINEAR B SYLLABLE B024 NE, 65562 +LINEAR B SYLLABLE B030 NI, 65563 +LINEAR B SYLLABLE B052 NO, 65564 +LINEAR B SYLLABLE B055 NU, 65565 +LINEAR B SYLLABLE B003 PA, 65566 +LINEAR B SYLLABLE B072 PE, 65567 +LINEAR B SYLLABLE B039 PI, 65568 +LINEAR B SYLLABLE B011 PO, 65569 +LINEAR B SYLLABLE B050 PU, 65570 +LINEAR B SYLLABLE B016 QA, 65571 +LINEAR B SYLLABLE B078 QE, 65572 +LINEAR B SYLLABLE B021 QI, 65573 +LINEAR B SYLLABLE B032 QO, 65574 +LINEAR B SYLLABLE B060 RA, 65576 +LINEAR B SYLLABLE B027 RE, 65577 +LINEAR B SYLLABLE B053 RI, 65578 +LINEAR B SYLLABLE B002 RO, 65579 +LINEAR B SYLLABLE B026 RU, 65580 +LINEAR B SYLLABLE B031 SA, 65581 +LINEAR B SYLLABLE B009 SE, 65582 +LINEAR B SYLLABLE B041 SI, 65583 +LINEAR B SYLLABLE B012 SO, 65584 +LINEAR B SYLLABLE B058 SU, 65585 +LINEAR B SYLLABLE B059 TA, 65586 +LINEAR B SYLLABLE B004 TE, 65587 +LINEAR B SYLLABLE B037 TI, 65588 +LINEAR B SYLLABLE B005 TO, 65589 +LINEAR B SYLLABLE B069 TU, 65590 +LINEAR B SYLLABLE B054 WA, 65591 +LINEAR B SYLLABLE B075 WE, 65592 +LINEAR B SYLLABLE B040 WI, 65593 +LINEAR B SYLLABLE B042 WO, 65594 +LINEAR B SYLLABLE B017 ZA, 65596 +LINEAR B SYLLABLE B074 ZE, 65597 +LINEAR B SYLLABLE B020 ZO, 65599 +LINEAR B SYLLABLE B025 A2, 65600 +LINEAR B SYLLABLE B043 A3, 65601 +LINEAR B SYLLABLE B085 AU, 65602 +LINEAR B SYLLABLE B071 DWE, 65603 +LINEAR B SYLLABLE B090 DWO, 65604 +LINEAR B SYLLABLE B048 NWA, 65605 +LINEAR B SYLLABLE B029 PU2, 65606 +LINEAR B SYLLABLE B062 PTE, 65607 +LINEAR B SYLLABLE B076 RA2, 65608 +LINEAR B SYLLABLE B033 RA3, 65609 +LINEAR B SYLLABLE B068 RO2, 65610 +LINEAR B SYLLABLE B066 TA2, 65611 +LINEAR B SYLLABLE B087 TWE, 65612 +LINEAR B SYLLABLE B091 TWO, 65613 +LINEAR B SYMBOL B018, 65616 +LINEAR B SYMBOL B019, 65617 +LINEAR B SYMBOL B022, 65618 +LINEAR B SYMBOL B034, 65619 +LINEAR B SYMBOL B047, 65620 +LINEAR B SYMBOL B049, 65621 +LINEAR B SYMBOL B056, 65622 +LINEAR B SYMBOL B063, 65623 +LINEAR B SYMBOL B064, 65624 +LINEAR B SYMBOL B079, 65625 +LINEAR B SYMBOL B082, 65626 +LINEAR B SYMBOL B083, 65627 +LINEAR B SYMBOL B086, 65628 +LINEAR B SYMBOL B089, 65629 +LINEAR B IDEOGRAM B100 MAN, 65664 +LINEAR B IDEOGRAM B102 WOMAN, 65665 +LINEAR B IDEOGRAM B104 DEER, 65666 +LINEAR B IDEOGRAM B105 EQUID, 65667 +LINEAR B IDEOGRAM B105F MARE, 65668 +LINEAR B IDEOGRAM B105M STALLION, 65669 +LINEAR B IDEOGRAM B106F EWE, 65670 +LINEAR B IDEOGRAM B106M RAM, 65671 +LINEAR B IDEOGRAM B107F SHE GOAT, 65672 +LINEAR B IDEOGRAM B107M HE GOAT, 65673 +LINEAR B IDEOGRAM B108F SOW, 65674 +LINEAR B IDEOGRAM B108M BOAR, 65675 +LINEAR B IDEOGRAM B109F COW, 65676 +LINEAR B IDEOGRAM B109M BULL, 65677 +LINEAR B IDEOGRAM B120 WHEAT, 65678 +LINEAR B IDEOGRAM B121 BARLEY, 65679 +LINEAR B IDEOGRAM B122 OLIVE, 65680 +LINEAR B IDEOGRAM B123 SPICE, 65681 +LINEAR B IDEOGRAM B125 CYPERUS, 65682 +LINEAR B MONOGRAM B127 KAPO, 65683 +LINEAR B MONOGRAM B128 KANAKO, 65684 +LINEAR B IDEOGRAM B130 OIL, 65685 +LINEAR B IDEOGRAM B131 WINE, 65686 +LINEAR B IDEOGRAM B132, 65687 +LINEAR B MONOGRAM B133 AREPA, 65688 +LINEAR B MONOGRAM B135 MERI, 65689 +LINEAR B IDEOGRAM B140 BRONZE, 65690 +LINEAR B IDEOGRAM B141 GOLD, 65691 +LINEAR B IDEOGRAM B142, 65692 +LINEAR B IDEOGRAM B145 WOOL, 65693 +LINEAR B IDEOGRAM B146, 65694 +LINEAR B IDEOGRAM B150, 65695 +LINEAR B IDEOGRAM B151 HORN, 65696 +LINEAR B IDEOGRAM B152, 65697 +LINEAR B IDEOGRAM B153, 65698 +LINEAR B IDEOGRAM B154, 65699 +LINEAR B MONOGRAM B156 TURO2, 65700 +LINEAR B IDEOGRAM B157, 65701 +LINEAR B IDEOGRAM B158, 65702 +LINEAR B IDEOGRAM B159 CLOTH, 65703 +LINEAR B IDEOGRAM B160, 65704 +LINEAR B IDEOGRAM B161, 65705 +LINEAR B IDEOGRAM B162 GARMENT, 65706 +LINEAR B IDEOGRAM B163 ARMOUR, 65707 +LINEAR B IDEOGRAM B164, 65708 +LINEAR B IDEOGRAM B165, 65709 +LINEAR B IDEOGRAM B166, 65710 +LINEAR B IDEOGRAM B167, 65711 +LINEAR B IDEOGRAM B168, 65712 +LINEAR B IDEOGRAM B169, 65713 +LINEAR B IDEOGRAM B170, 65714 +LINEAR B IDEOGRAM B171, 65715 +LINEAR B IDEOGRAM B172, 65716 +LINEAR B IDEOGRAM B173 MONTH, 65717 +LINEAR B IDEOGRAM B174, 65718 +LINEAR B IDEOGRAM B176 TREE, 65719 +LINEAR B IDEOGRAM B177, 65720 +LINEAR B IDEOGRAM B178, 65721 +LINEAR B IDEOGRAM B179, 65722 +LINEAR B IDEOGRAM B180, 65723 +LINEAR B IDEOGRAM B181, 65724 +LINEAR B IDEOGRAM B182, 65725 +LINEAR B IDEOGRAM B183, 65726 +LINEAR B IDEOGRAM B184, 65727 +LINEAR B IDEOGRAM B185, 65728 +LINEAR B IDEOGRAM B189, 65729 +LINEAR B IDEOGRAM B190, 65730 +LINEAR B IDEOGRAM B191 HELMET, 65731 +LINEAR B IDEOGRAM B220 FOOTSTOOL, 65732 +LINEAR B IDEOGRAM B225 BATHTUB, 65733 +LINEAR B IDEOGRAM B230 SPEAR, 65734 +LINEAR B IDEOGRAM B231 ARROW, 65735 +LINEAR B IDEOGRAM B232, 65736 +LINEAR B IDEOGRAM B233 SWORD, 65737 +LINEAR B IDEOGRAM B234, 65738 +LINEAR B IDEOGRAM B236, 65739 +LINEAR B IDEOGRAM B240 WHEELED CHARIOT, 65740 +LINEAR B IDEOGRAM B241 CHARIOT, 65741 +LINEAR B IDEOGRAM B242 CHARIOT FRAME, 65742 +LINEAR B IDEOGRAM B243 WHEEL, 65743 +LINEAR B IDEOGRAM B245, 65744 +LINEAR B IDEOGRAM B246, 65745 +LINEAR B MONOGRAM B247 DIPTE, 65746 +LINEAR B IDEOGRAM B248, 65747 +LINEAR B IDEOGRAM B249, 65748 +LINEAR B IDEOGRAM B251, 65749 +LINEAR B IDEOGRAM B252, 65750 +LINEAR B IDEOGRAM B253, 65751 +LINEAR B IDEOGRAM B254 DART, 65752 +LINEAR B IDEOGRAM B255, 65753 +LINEAR B IDEOGRAM B256, 65754 +LINEAR B IDEOGRAM B257, 65755 +LINEAR B IDEOGRAM B258, 65756 +LINEAR B IDEOGRAM B259, 65757 +LINEAR B IDEOGRAM VESSEL B155, 65758 +LINEAR B IDEOGRAM VESSEL B200, 65759 +LINEAR B IDEOGRAM VESSEL B201, 65760 +LINEAR B IDEOGRAM VESSEL B202, 65761 +LINEAR B IDEOGRAM VESSEL B203, 65762 +LINEAR B IDEOGRAM VESSEL B204, 65763 +LINEAR B IDEOGRAM VESSEL B205, 65764 +LINEAR B IDEOGRAM VESSEL B206, 65765 +LINEAR B IDEOGRAM VESSEL B207, 65766 +LINEAR B IDEOGRAM VESSEL B208, 65767 +LINEAR B IDEOGRAM VESSEL B209, 65768 +LINEAR B IDEOGRAM VESSEL B210, 65769 +LINEAR B IDEOGRAM VESSEL B211, 65770 +LINEAR B IDEOGRAM VESSEL B212, 65771 +LINEAR B IDEOGRAM VESSEL B213, 65772 +LINEAR B IDEOGRAM VESSEL B214, 65773 +LINEAR B IDEOGRAM VESSEL B215, 65774 +LINEAR B IDEOGRAM VESSEL B216, 65775 +LINEAR B IDEOGRAM VESSEL B217, 65776 +LINEAR B IDEOGRAM VESSEL B218, 65777 +LINEAR B IDEOGRAM VESSEL B219, 65778 +LINEAR B IDEOGRAM VESSEL B221, 65779 +LINEAR B IDEOGRAM VESSEL B222, 65780 +LINEAR B IDEOGRAM VESSEL B226, 65781 +LINEAR B IDEOGRAM VESSEL B227, 65782 +LINEAR B IDEOGRAM VESSEL B228, 65783 +LINEAR B IDEOGRAM VESSEL B229, 65784 +LINEAR B IDEOGRAM VESSEL B250, 65785 +LINEAR B IDEOGRAM VESSEL B305, 65786 +AEGEAN WORD SEPARATOR LINE, 65792 +AEGEAN WORD SEPARATOR DOT, 65793 +AEGEAN CHECK MARK, 65794 +AEGEAN NUMBER ONE, 65799 +AEGEAN NUMBER TWO, 65800 +AEGEAN NUMBER THREE, 65801 +AEGEAN NUMBER FOUR, 65802 +AEGEAN NUMBER FIVE, 65803 +AEGEAN NUMBER SIX, 65804 +AEGEAN NUMBER SEVEN, 65805 +AEGEAN NUMBER EIGHT, 65806 +AEGEAN NUMBER NINE, 65807 +AEGEAN NUMBER TEN, 65808 +AEGEAN NUMBER TWENTY, 65809 +AEGEAN NUMBER THIRTY, 65810 +AEGEAN NUMBER FORTY, 65811 +AEGEAN NUMBER FIFTY, 65812 +AEGEAN NUMBER SIXTY, 65813 +AEGEAN NUMBER SEVENTY, 65814 +AEGEAN NUMBER EIGHTY, 65815 +AEGEAN NUMBER NINETY, 65816 +AEGEAN NUMBER ONE HUNDRED, 65817 +AEGEAN NUMBER TWO HUNDRED, 65818 +AEGEAN NUMBER THREE HUNDRED, 65819 +AEGEAN NUMBER FOUR HUNDRED, 65820 +AEGEAN NUMBER FIVE HUNDRED, 65821 +AEGEAN NUMBER SIX HUNDRED, 65822 +AEGEAN NUMBER SEVEN HUNDRED, 65823 +AEGEAN NUMBER EIGHT HUNDRED, 65824 +AEGEAN NUMBER NINE HUNDRED, 65825 +AEGEAN NUMBER ONE THOUSAND, 65826 +AEGEAN NUMBER TWO THOUSAND, 65827 +AEGEAN NUMBER THREE THOUSAND, 65828 +AEGEAN NUMBER FOUR THOUSAND, 65829 +AEGEAN NUMBER FIVE THOUSAND, 65830 +AEGEAN NUMBER SIX THOUSAND, 65831 +AEGEAN NUMBER SEVEN THOUSAND, 65832 +AEGEAN NUMBER EIGHT THOUSAND, 65833 +AEGEAN NUMBER NINE THOUSAND, 65834 +AEGEAN NUMBER TEN THOUSAND, 65835 +AEGEAN NUMBER TWENTY THOUSAND, 65836 +AEGEAN NUMBER THIRTY THOUSAND, 65837 +AEGEAN NUMBER FORTY THOUSAND, 65838 +AEGEAN NUMBER FIFTY THOUSAND, 65839 +AEGEAN NUMBER SIXTY THOUSAND, 65840 +AEGEAN NUMBER SEVENTY THOUSAND, 65841 +AEGEAN NUMBER EIGHTY THOUSAND, 65842 +AEGEAN NUMBER NINETY THOUSAND, 65843 +AEGEAN WEIGHT BASE UNIT, 65847 +AEGEAN WEIGHT FIRST SUBUNIT, 65848 +AEGEAN WEIGHT SECOND SUBUNIT, 65849 +AEGEAN WEIGHT THIRD SUBUNIT, 65850 +AEGEAN WEIGHT FOURTH SUBUNIT, 65851 +AEGEAN DRY MEASURE FIRST SUBUNIT, 65852 +AEGEAN LIQUID MEASURE FIRST SUBUNIT, 65853 +AEGEAN MEASURE SECOND SUBUNIT, 65854 +AEGEAN MEASURE THIRD SUBUNIT, 65855 +GREEK ACROPHONIC ATTIC ONE QUARTER, 65856 +GREEK ACROPHONIC ATTIC ONE HALF, 65857 +GREEK ACROPHONIC ATTIC ONE DRACHMA, 65858 +GREEK ACROPHONIC ATTIC FIVE, 65859 +GREEK ACROPHONIC ATTIC FIFTY, 65860 +GREEK ACROPHONIC ATTIC FIVE HUNDRED, 65861 +GREEK ACROPHONIC ATTIC FIVE THOUSAND, 65862 +GREEK ACROPHONIC ATTIC FIFTY THOUSAND, 65863 +GREEK ACROPHONIC ATTIC FIVE TALENTS, 65864 +GREEK ACROPHONIC ATTIC TEN TALENTS, 65865 +GREEK ACROPHONIC ATTIC FIFTY TALENTS, 65866 +GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS, 65867 +GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS, 65868 +GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS, 65869 +GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS, 65870 +GREEK ACROPHONIC ATTIC FIVE STATERS, 65871 +GREEK ACROPHONIC ATTIC TEN STATERS, 65872 +GREEK ACROPHONIC ATTIC FIFTY STATERS, 65873 +GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS, 65874 +GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS, 65875 +GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS, 65876 +GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS, 65877 +GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS, 65878 +GREEK ACROPHONIC ATTIC TEN MNAS, 65879 +GREEK ACROPHONIC HERAEUM ONE PLETHRON, 65880 +GREEK ACROPHONIC THESPIAN ONE, 65881 +GREEK ACROPHONIC HERMIONIAN ONE, 65882 +GREEK ACROPHONIC EPIDAUREAN TWO, 65883 +GREEK ACROPHONIC THESPIAN TWO, 65884 +GREEK ACROPHONIC CYRENAIC TWO DRACHMAS, 65885 +GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS, 65886 +GREEK ACROPHONIC TROEZENIAN FIVE, 65887 +GREEK ACROPHONIC TROEZENIAN TEN, 65888 +GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM, 65889 +GREEK ACROPHONIC HERMIONIAN TEN, 65890 +GREEK ACROPHONIC MESSENIAN TEN, 65891 +GREEK ACROPHONIC THESPIAN TEN, 65892 +GREEK ACROPHONIC THESPIAN THIRTY, 65893 +GREEK ACROPHONIC TROEZENIAN FIFTY, 65894 +GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM, 65895 +GREEK ACROPHONIC HERMIONIAN FIFTY, 65896 +GREEK ACROPHONIC THESPIAN FIFTY, 65897 +GREEK ACROPHONIC THESPIAN ONE HUNDRED, 65898 +GREEK ACROPHONIC THESPIAN THREE HUNDRED, 65899 +GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED, 65900 +GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED, 65901 +GREEK ACROPHONIC THESPIAN FIVE HUNDRED, 65902 +GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED, 65903 +GREEK ACROPHONIC NAXIAN FIVE HUNDRED, 65904 +GREEK ACROPHONIC THESPIAN ONE THOUSAND, 65905 +GREEK ACROPHONIC THESPIAN FIVE THOUSAND, 65906 +GREEK ACROPHONIC DELPHIC FIVE MNAS, 65907 +GREEK ACROPHONIC STRATIAN FIFTY MNAS, 65908 +GREEK ONE HALF SIGN, 65909 +GREEK ONE HALF SIGN ALTERNATE FORM, 65910 +GREEK TWO THIRDS SIGN, 65911 +GREEK THREE QUARTERS SIGN, 65912 +GREEK YEAR SIGN, 65913 +GREEK TALENT SIGN, 65914 +GREEK DRACHMA SIGN, 65915 +GREEK OBOL SIGN, 65916 +GREEK TWO OBOLS SIGN, 65917 +GREEK THREE OBOLS SIGN, 65918 +GREEK FOUR OBOLS SIGN, 65919 +GREEK FIVE OBOLS SIGN, 65920 +GREEK METRETES SIGN, 65921 +GREEK KYATHOS BASE SIGN, 65922 +GREEK LITRA SIGN, 65923 +GREEK OUNKIA SIGN, 65924 +GREEK XESTES SIGN, 65925 +GREEK ARTABE SIGN, 65926 +GREEK AROURA SIGN, 65927 +GREEK GRAMMA SIGN, 65928 +GREEK TRYBLION BASE SIGN, 65929 +GREEK ZERO SIGN, 65930 +GREEK ONE QUARTER SIGN, 65931 +GREEK SINUSOID SIGN, 65932 +GREEK INDICTION SIGN, 65933 +NOMISMA SIGN, 65934 +ROMAN SEXTANS SIGN, 65936 +ROMAN UNCIA SIGN, 65937 +ROMAN SEMUNCIA SIGN, 65938 +ROMAN SEXTULA SIGN, 65939 +ROMAN DIMIDIA SEXTULA SIGN, 65940 +ROMAN SILIQUA SIGN, 65941 +ROMAN DENARIUS SIGN, 65942 +ROMAN QUINARIUS SIGN, 65943 +ROMAN SESTERTIUS SIGN, 65944 +ROMAN DUPONDIUS SIGN, 65945 +ROMAN AS SIGN, 65946 +ROMAN CENTURIAL SIGN, 65947 +GREEK SYMBOL TAU RHO, 65952 +PHAISTOS DISC SIGN PEDESTRIAN, 66000 +PHAISTOS DISC SIGN PLUMED HEAD, 66001 +PHAISTOS DISC SIGN TATTOOED HEAD, 66002 +PHAISTOS DISC SIGN CAPTIVE, 66003 +PHAISTOS DISC SIGN CHILD, 66004 +PHAISTOS DISC SIGN WOMAN, 66005 +PHAISTOS DISC SIGN HELMET, 66006 +PHAISTOS DISC SIGN GAUNTLET, 66007 +PHAISTOS DISC SIGN TIARA, 66008 +PHAISTOS DISC SIGN ARROW, 66009 +PHAISTOS DISC SIGN BOW, 66010 +PHAISTOS DISC SIGN SHIELD, 66011 +PHAISTOS DISC SIGN CLUB, 66012 +PHAISTOS DISC SIGN MANACLES, 66013 +PHAISTOS DISC SIGN MATTOCK, 66014 +PHAISTOS DISC SIGN SAW, 66015 +PHAISTOS DISC SIGN LID, 66016 +PHAISTOS DISC SIGN BOOMERANG, 66017 +PHAISTOS DISC SIGN CARPENTRY PLANE, 66018 +PHAISTOS DISC SIGN DOLIUM, 66019 +PHAISTOS DISC SIGN COMB, 66020 +PHAISTOS DISC SIGN SLING, 66021 +PHAISTOS DISC SIGN COLUMN, 66022 +PHAISTOS DISC SIGN BEEHIVE, 66023 +PHAISTOS DISC SIGN SHIP, 66024 +PHAISTOS DISC SIGN HORN, 66025 +PHAISTOS DISC SIGN HIDE, 66026 +PHAISTOS DISC SIGN BULLS LEG, 66027 +PHAISTOS DISC SIGN CAT, 66028 +PHAISTOS DISC SIGN RAM, 66029 +PHAISTOS DISC SIGN EAGLE, 66030 +PHAISTOS DISC SIGN DOVE, 66031 +PHAISTOS DISC SIGN TUNNY, 66032 +PHAISTOS DISC SIGN BEE, 66033 +PHAISTOS DISC SIGN PLANE TREE, 66034 +PHAISTOS DISC SIGN VINE, 66035 +PHAISTOS DISC SIGN PAPYRUS, 66036 +PHAISTOS DISC SIGN ROSETTE, 66037 +PHAISTOS DISC SIGN LILY, 66038 +PHAISTOS DISC SIGN OX BACK, 66039 +PHAISTOS DISC SIGN FLUTE, 66040 +PHAISTOS DISC SIGN GRATER, 66041 +PHAISTOS DISC SIGN STRAINER, 66042 +PHAISTOS DISC SIGN SMALL AXE, 66043 +PHAISTOS DISC SIGN WAVY BAND, 66044 +PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, 66045 +LYCIAN LETTER A, 66176 +LYCIAN LETTER E, 66177 +LYCIAN LETTER B, 66178 +LYCIAN LETTER BH, 66179 +LYCIAN LETTER G, 66180 +LYCIAN LETTER D, 66181 +LYCIAN LETTER I, 66182 +LYCIAN LETTER W, 66183 +LYCIAN LETTER Z, 66184 +LYCIAN LETTER TH, 66185 +LYCIAN LETTER J, 66186 +LYCIAN LETTER K, 66187 +LYCIAN LETTER Q, 66188 +LYCIAN LETTER L, 66189 +LYCIAN LETTER M, 66190 +LYCIAN LETTER N, 66191 +LYCIAN LETTER MM, 66192 +LYCIAN LETTER NN, 66193 +LYCIAN LETTER U, 66194 +LYCIAN LETTER P, 66195 +LYCIAN LETTER KK, 66196 +LYCIAN LETTER R, 66197 +LYCIAN LETTER S, 66198 +LYCIAN LETTER T, 66199 +LYCIAN LETTER TT, 66200 +LYCIAN LETTER AN, 66201 +LYCIAN LETTER EN, 66202 +LYCIAN LETTER H, 66203 +LYCIAN LETTER X, 66204 +CARIAN LETTER A, 66208 +CARIAN LETTER P2, 66209 +CARIAN LETTER D, 66210 +CARIAN LETTER L, 66211 +CARIAN LETTER UUU, 66212 +CARIAN LETTER R, 66213 +CARIAN LETTER LD, 66214 +CARIAN LETTER A2, 66215 +CARIAN LETTER Q, 66216 +CARIAN LETTER B, 66217 +CARIAN LETTER M, 66218 +CARIAN LETTER O, 66219 +CARIAN LETTER D2, 66220 +CARIAN LETTER T, 66221 +CARIAN LETTER SH, 66222 +CARIAN LETTER SH2, 66223 +CARIAN LETTER S, 66224 +CARIAN LETTER C 18, 66225 +CARIAN LETTER U, 66226 +CARIAN LETTER NN, 66227 +CARIAN LETTER X, 66228 +CARIAN LETTER N, 66229 +CARIAN LETTER TT2, 66230 +CARIAN LETTER P, 66231 +CARIAN LETTER SS, 66232 +CARIAN LETTER I, 66233 +CARIAN LETTER E, 66234 +CARIAN LETTER UUUU, 66235 +CARIAN LETTER K, 66236 +CARIAN LETTER K2, 66237 +CARIAN LETTER ND, 66238 +CARIAN LETTER UU, 66239 +CARIAN LETTER G, 66240 +CARIAN LETTER G2, 66241 +CARIAN LETTER ST, 66242 +CARIAN LETTER ST2, 66243 +CARIAN LETTER NG, 66244 +CARIAN LETTER II, 66245 +CARIAN LETTER C 39, 66246 +CARIAN LETTER TT, 66247 +CARIAN LETTER UUU2, 66248 +CARIAN LETTER RR, 66249 +CARIAN LETTER MB, 66250 +CARIAN LETTER MB2, 66251 +CARIAN LETTER MB3, 66252 +CARIAN LETTER MB4, 66253 +CARIAN LETTER LD2, 66254 +CARIAN LETTER E2, 66255 +CARIAN LETTER UUU3, 66256 +COPTIC EPACT THOUSANDS MARK, 66272 +COPTIC EPACT DIGIT ONE, 66273 +COPTIC EPACT DIGIT TWO, 66274 +COPTIC EPACT DIGIT THREE, 66275 +COPTIC EPACT DIGIT FOUR, 66276 +COPTIC EPACT DIGIT FIVE, 66277 +COPTIC EPACT DIGIT SIX, 66278 +COPTIC EPACT DIGIT SEVEN, 66279 +COPTIC EPACT DIGIT EIGHT, 66280 +COPTIC EPACT DIGIT NINE, 66281 +COPTIC EPACT NUMBER TEN, 66282 +COPTIC EPACT NUMBER TWENTY, 66283 +COPTIC EPACT NUMBER THIRTY, 66284 +COPTIC EPACT NUMBER FORTY, 66285 +COPTIC EPACT NUMBER FIFTY, 66286 +COPTIC EPACT NUMBER SIXTY, 66287 +COPTIC EPACT NUMBER SEVENTY, 66288 +COPTIC EPACT NUMBER EIGHTY, 66289 +COPTIC EPACT NUMBER NINETY, 66290 +COPTIC EPACT NUMBER ONE HUNDRED, 66291 +COPTIC EPACT NUMBER TWO HUNDRED, 66292 +COPTIC EPACT NUMBER THREE HUNDRED, 66293 +COPTIC EPACT NUMBER FOUR HUNDRED, 66294 +COPTIC EPACT NUMBER FIVE HUNDRED, 66295 +COPTIC EPACT NUMBER SIX HUNDRED, 66296 +COPTIC EPACT NUMBER SEVEN HUNDRED, 66297 +COPTIC EPACT NUMBER EIGHT HUNDRED, 66298 +COPTIC EPACT NUMBER NINE HUNDRED, 66299 +OLD ITALIC LETTER A, 66304 +OLD ITALIC LETTER BE, 66305 +OLD ITALIC LETTER KE, 66306 +OLD ITALIC LETTER DE, 66307 +OLD ITALIC LETTER E, 66308 +OLD ITALIC LETTER VE, 66309 +OLD ITALIC LETTER ZE, 66310 +OLD ITALIC LETTER HE, 66311 +OLD ITALIC LETTER THE, 66312 +OLD ITALIC LETTER I, 66313 +OLD ITALIC LETTER KA, 66314 +OLD ITALIC LETTER EL, 66315 +OLD ITALIC LETTER EM, 66316 +OLD ITALIC LETTER EN, 66317 +OLD ITALIC LETTER ESH, 66318 +OLD ITALIC LETTER O, 66319 +OLD ITALIC LETTER PE, 66320 +OLD ITALIC LETTER SHE, 66321 +OLD ITALIC LETTER KU, 66322 +OLD ITALIC LETTER ER, 66323 +OLD ITALIC LETTER ES, 66324 +OLD ITALIC LETTER TE, 66325 +OLD ITALIC LETTER U, 66326 +OLD ITALIC LETTER EKS, 66327 +OLD ITALIC LETTER PHE, 66328 +OLD ITALIC LETTER KHE, 66329 +OLD ITALIC LETTER EF, 66330 +OLD ITALIC LETTER ERS, 66331 +OLD ITALIC LETTER CHE, 66332 +OLD ITALIC LETTER II, 66333 +OLD ITALIC LETTER UU, 66334 +OLD ITALIC LETTER ESS, 66335 +OLD ITALIC NUMERAL ONE, 66336 +OLD ITALIC NUMERAL FIVE, 66337 +OLD ITALIC NUMERAL TEN, 66338 +OLD ITALIC NUMERAL FIFTY, 66339 +GOTHIC LETTER AHSA, 66352 +GOTHIC LETTER BAIRKAN, 66353 +GOTHIC LETTER GIBA, 66354 +GOTHIC LETTER DAGS, 66355 +GOTHIC LETTER AIHVUS, 66356 +GOTHIC LETTER QAIRTHRA, 66357 +GOTHIC LETTER IUJA, 66358 +GOTHIC LETTER HAGL, 66359 +GOTHIC LETTER THIUTH, 66360 +GOTHIC LETTER EIS, 66361 +GOTHIC LETTER KUSMA, 66362 +GOTHIC LETTER LAGUS, 66363 +GOTHIC LETTER MANNA, 66364 +GOTHIC LETTER NAUTHS, 66365 +GOTHIC LETTER JER, 66366 +GOTHIC LETTER URUS, 66367 +GOTHIC LETTER PAIRTHRA, 66368 +GOTHIC LETTER NINETY, 66369 +GOTHIC LETTER RAIDA, 66370 +GOTHIC LETTER SAUIL, 66371 +GOTHIC LETTER TEIWS, 66372 +GOTHIC LETTER WINJA, 66373 +GOTHIC LETTER FAIHU, 66374 +GOTHIC LETTER IGGWS, 66375 +GOTHIC LETTER HWAIR, 66376 +GOTHIC LETTER OTHAL, 66377 +GOTHIC LETTER NINE HUNDRED, 66378 +OLD PERMIC LETTER AN, 66384 +OLD PERMIC LETTER BUR, 66385 +OLD PERMIC LETTER GAI, 66386 +OLD PERMIC LETTER DOI, 66387 +OLD PERMIC LETTER E, 66388 +OLD PERMIC LETTER ZHOI, 66389 +OLD PERMIC LETTER DZHOI, 66390 +OLD PERMIC LETTER ZATA, 66391 +OLD PERMIC LETTER DZITA, 66392 +OLD PERMIC LETTER I, 66393 +OLD PERMIC LETTER KOKE, 66394 +OLD PERMIC LETTER LEI, 66395 +OLD PERMIC LETTER MENOE, 66396 +OLD PERMIC LETTER NENOE, 66397 +OLD PERMIC LETTER VOOI, 66398 +OLD PERMIC LETTER PEEI, 66399 +OLD PERMIC LETTER REI, 66400 +OLD PERMIC LETTER SII, 66401 +OLD PERMIC LETTER TAI, 66402 +OLD PERMIC LETTER U, 66403 +OLD PERMIC LETTER CHERY, 66404 +OLD PERMIC LETTER SHOOI, 66405 +OLD PERMIC LETTER SHCHOOI, 66406 +OLD PERMIC LETTER YRY, 66407 +OLD PERMIC LETTER YERU, 66408 +OLD PERMIC LETTER O, 66409 +OLD PERMIC LETTER OO, 66410 +OLD PERMIC LETTER EF, 66411 +OLD PERMIC LETTER HA, 66412 +OLD PERMIC LETTER TSIU, 66413 +OLD PERMIC LETTER VER, 66414 +OLD PERMIC LETTER YER, 66415 +OLD PERMIC LETTER YERI, 66416 +OLD PERMIC LETTER YAT, 66417 +OLD PERMIC LETTER IE, 66418 +OLD PERMIC LETTER YU, 66419 +OLD PERMIC LETTER YA, 66420 +OLD PERMIC LETTER IA, 66421 +COMBINING OLD PERMIC LETTER AN, 66422 +COMBINING OLD PERMIC LETTER DOI, 66423 +COMBINING OLD PERMIC LETTER ZATA, 66424 +COMBINING OLD PERMIC LETTER NENOE, 66425 +COMBINING OLD PERMIC LETTER SII, 66426 +UGARITIC LETTER ALPA, 66432 +UGARITIC LETTER BETA, 66433 +UGARITIC LETTER GAMLA, 66434 +UGARITIC LETTER KHA, 66435 +UGARITIC LETTER DELTA, 66436 +UGARITIC LETTER HO, 66437 +UGARITIC LETTER WO, 66438 +UGARITIC LETTER ZETA, 66439 +UGARITIC LETTER HOTA, 66440 +UGARITIC LETTER TET, 66441 +UGARITIC LETTER YOD, 66442 +UGARITIC LETTER KAF, 66443 +UGARITIC LETTER SHIN, 66444 +UGARITIC LETTER LAMDA, 66445 +UGARITIC LETTER MEM, 66446 +UGARITIC LETTER DHAL, 66447 +UGARITIC LETTER NUN, 66448 +UGARITIC LETTER ZU, 66449 +UGARITIC LETTER SAMKA, 66450 +UGARITIC LETTER AIN, 66451 +UGARITIC LETTER PU, 66452 +UGARITIC LETTER SADE, 66453 +UGARITIC LETTER QOPA, 66454 +UGARITIC LETTER RASHA, 66455 +UGARITIC LETTER THANNA, 66456 +UGARITIC LETTER GHAIN, 66457 +UGARITIC LETTER TO, 66458 +UGARITIC LETTER I, 66459 +UGARITIC LETTER U, 66460 +UGARITIC LETTER SSU, 66461 +UGARITIC WORD DIVIDER, 66463 +OLD PERSIAN SIGN A, 66464 +OLD PERSIAN SIGN I, 66465 +OLD PERSIAN SIGN U, 66466 +OLD PERSIAN SIGN KA, 66467 +OLD PERSIAN SIGN KU, 66468 +OLD PERSIAN SIGN GA, 66469 +OLD PERSIAN SIGN GU, 66470 +OLD PERSIAN SIGN XA, 66471 +OLD PERSIAN SIGN CA, 66472 +OLD PERSIAN SIGN JA, 66473 +OLD PERSIAN SIGN JI, 66474 +OLD PERSIAN SIGN TA, 66475 +OLD PERSIAN SIGN TU, 66476 +OLD PERSIAN SIGN DA, 66477 +OLD PERSIAN SIGN DI, 66478 +OLD PERSIAN SIGN DU, 66479 +OLD PERSIAN SIGN THA, 66480 +OLD PERSIAN SIGN PA, 66481 +OLD PERSIAN SIGN BA, 66482 +OLD PERSIAN SIGN FA, 66483 +OLD PERSIAN SIGN NA, 66484 +OLD PERSIAN SIGN NU, 66485 +OLD PERSIAN SIGN MA, 66486 +OLD PERSIAN SIGN MI, 66487 +OLD PERSIAN SIGN MU, 66488 +OLD PERSIAN SIGN YA, 66489 +OLD PERSIAN SIGN VA, 66490 +OLD PERSIAN SIGN VI, 66491 +OLD PERSIAN SIGN RA, 66492 +OLD PERSIAN SIGN RU, 66493 +OLD PERSIAN SIGN LA, 66494 +OLD PERSIAN SIGN SA, 66495 +OLD PERSIAN SIGN ZA, 66496 +OLD PERSIAN SIGN SHA, 66497 +OLD PERSIAN SIGN SSA, 66498 +OLD PERSIAN SIGN HA, 66499 +OLD PERSIAN SIGN AURAMAZDAA, 66504 +OLD PERSIAN SIGN AURAMAZDAA 2, 66505 +OLD PERSIAN SIGN AURAMAZDAAHA, 66506 +OLD PERSIAN SIGN XSHAAYATHIYA, 66507 +OLD PERSIAN SIGN DAHYAAUSH, 66508 +OLD PERSIAN SIGN DAHYAAUSH 2, 66509 +OLD PERSIAN SIGN BAGA, 66510 +OLD PERSIAN SIGN BUUMISH, 66511 +OLD PERSIAN WORD DIVIDER, 66512 +OLD PERSIAN NUMBER ONE, 66513 +OLD PERSIAN NUMBER TWO, 66514 +OLD PERSIAN NUMBER TEN, 66515 +OLD PERSIAN NUMBER TWENTY, 66516 +OLD PERSIAN NUMBER HUNDRED, 66517 +DESERET CAPITAL LETTER LONG I, 66560 +DESERET CAPITAL LETTER LONG E, 66561 +DESERET CAPITAL LETTER LONG A, 66562 +DESERET CAPITAL LETTER LONG AH, 66563 +DESERET CAPITAL LETTER LONG O, 66564 +DESERET CAPITAL LETTER LONG OO, 66565 +DESERET CAPITAL LETTER SHORT I, 66566 +DESERET CAPITAL LETTER SHORT E, 66567 +DESERET CAPITAL LETTER SHORT A, 66568 +DESERET CAPITAL LETTER SHORT AH, 66569 +DESERET CAPITAL LETTER SHORT O, 66570 +DESERET CAPITAL LETTER SHORT OO, 66571 +DESERET CAPITAL LETTER AY, 66572 +DESERET CAPITAL LETTER OW, 66573 +DESERET CAPITAL LETTER WU, 66574 +DESERET CAPITAL LETTER YEE, 66575 +DESERET CAPITAL LETTER H, 66576 +DESERET CAPITAL LETTER PEE, 66577 +DESERET CAPITAL LETTER BEE, 66578 +DESERET CAPITAL LETTER TEE, 66579 +DESERET CAPITAL LETTER DEE, 66580 +DESERET CAPITAL LETTER CHEE, 66581 +DESERET CAPITAL LETTER JEE, 66582 +DESERET CAPITAL LETTER KAY, 66583 +DESERET CAPITAL LETTER GAY, 66584 +DESERET CAPITAL LETTER EF, 66585 +DESERET CAPITAL LETTER VEE, 66586 +DESERET CAPITAL LETTER ETH, 66587 +DESERET CAPITAL LETTER THEE, 66588 +DESERET CAPITAL LETTER ES, 66589 +DESERET CAPITAL LETTER ZEE, 66590 +DESERET CAPITAL LETTER ESH, 66591 +DESERET CAPITAL LETTER ZHEE, 66592 +DESERET CAPITAL LETTER ER, 66593 +DESERET CAPITAL LETTER EL, 66594 +DESERET CAPITAL LETTER EM, 66595 +DESERET CAPITAL LETTER EN, 66596 +DESERET CAPITAL LETTER ENG, 66597 +DESERET CAPITAL LETTER OI, 66598 +DESERET CAPITAL LETTER EW, 66599 +DESERET SMALL LETTER LONG I, 66600 +DESERET SMALL LETTER LONG E, 66601 +DESERET SMALL LETTER LONG A, 66602 +DESERET SMALL LETTER LONG AH, 66603 +DESERET SMALL LETTER LONG O, 66604 +DESERET SMALL LETTER LONG OO, 66605 +DESERET SMALL LETTER SHORT I, 66606 +DESERET SMALL LETTER SHORT E, 66607 +DESERET SMALL LETTER SHORT A, 66608 +DESERET SMALL LETTER SHORT AH, 66609 +DESERET SMALL LETTER SHORT O, 66610 +DESERET SMALL LETTER SHORT OO, 66611 +DESERET SMALL LETTER AY, 66612 +DESERET SMALL LETTER OW, 66613 +DESERET SMALL LETTER WU, 66614 +DESERET SMALL LETTER YEE, 66615 +DESERET SMALL LETTER H, 66616 +DESERET SMALL LETTER PEE, 66617 +DESERET SMALL LETTER BEE, 66618 +DESERET SMALL LETTER TEE, 66619 +DESERET SMALL LETTER DEE, 66620 +DESERET SMALL LETTER CHEE, 66621 +DESERET SMALL LETTER JEE, 66622 +DESERET SMALL LETTER KAY, 66623 +DESERET SMALL LETTER GAY, 66624 +DESERET SMALL LETTER EF, 66625 +DESERET SMALL LETTER VEE, 66626 +DESERET SMALL LETTER ETH, 66627 +DESERET SMALL LETTER THEE, 66628 +DESERET SMALL LETTER ES, 66629 +DESERET SMALL LETTER ZEE, 66630 +DESERET SMALL LETTER ESH, 66631 +DESERET SMALL LETTER ZHEE, 66632 +DESERET SMALL LETTER ER, 66633 +DESERET SMALL LETTER EL, 66634 +DESERET SMALL LETTER EM, 66635 +DESERET SMALL LETTER EN, 66636 +DESERET SMALL LETTER ENG, 66637 +DESERET SMALL LETTER OI, 66638 +DESERET SMALL LETTER EW, 66639 +SHAVIAN LETTER PEEP, 66640 +SHAVIAN LETTER TOT, 66641 +SHAVIAN LETTER KICK, 66642 +SHAVIAN LETTER FEE, 66643 +SHAVIAN LETTER THIGH, 66644 +SHAVIAN LETTER SO, 66645 +SHAVIAN LETTER SURE, 66646 +SHAVIAN LETTER CHURCH, 66647 +SHAVIAN LETTER YEA, 66648 +SHAVIAN LETTER HUNG, 66649 +SHAVIAN LETTER BIB, 66650 +SHAVIAN LETTER DEAD, 66651 +SHAVIAN LETTER GAG, 66652 +SHAVIAN LETTER VOW, 66653 +SHAVIAN LETTER THEY, 66654 +SHAVIAN LETTER ZOO, 66655 +SHAVIAN LETTER MEASURE, 66656 +SHAVIAN LETTER JUDGE, 66657 +SHAVIAN LETTER WOE, 66658 +SHAVIAN LETTER HA HA, 66659 +SHAVIAN LETTER LOLL, 66660 +SHAVIAN LETTER MIME, 66661 +SHAVIAN LETTER IF, 66662 +SHAVIAN LETTER EGG, 66663 +SHAVIAN LETTER ASH, 66664 +SHAVIAN LETTER ADO, 66665 +SHAVIAN LETTER ON, 66666 +SHAVIAN LETTER WOOL, 66667 +SHAVIAN LETTER OUT, 66668 +SHAVIAN LETTER AH, 66669 +SHAVIAN LETTER ROAR, 66670 +SHAVIAN LETTER NUN, 66671 +SHAVIAN LETTER EAT, 66672 +SHAVIAN LETTER AGE, 66673 +SHAVIAN LETTER ICE, 66674 +SHAVIAN LETTER UP, 66675 +SHAVIAN LETTER OAK, 66676 +SHAVIAN LETTER OOZE, 66677 +SHAVIAN LETTER OIL, 66678 +SHAVIAN LETTER AWE, 66679 +SHAVIAN LETTER ARE, 66680 +SHAVIAN LETTER OR, 66681 +SHAVIAN LETTER AIR, 66682 +SHAVIAN LETTER ERR, 66683 +SHAVIAN LETTER ARRAY, 66684 +SHAVIAN LETTER EAR, 66685 +SHAVIAN LETTER IAN, 66686 +SHAVIAN LETTER YEW, 66687 +OSMANYA LETTER ALEF, 66688 +OSMANYA LETTER BA, 66689 +OSMANYA LETTER TA, 66690 +OSMANYA LETTER JA, 66691 +OSMANYA LETTER XA, 66692 +OSMANYA LETTER KHA, 66693 +OSMANYA LETTER DEEL, 66694 +OSMANYA LETTER RA, 66695 +OSMANYA LETTER SA, 66696 +OSMANYA LETTER SHIIN, 66697 +OSMANYA LETTER DHA, 66698 +OSMANYA LETTER CAYN, 66699 +OSMANYA LETTER GA, 66700 +OSMANYA LETTER FA, 66701 +OSMANYA LETTER QAAF, 66702 +OSMANYA LETTER KAAF, 66703 +OSMANYA LETTER LAAN, 66704 +OSMANYA LETTER MIIN, 66705 +OSMANYA LETTER NUUN, 66706 +OSMANYA LETTER WAW, 66707 +OSMANYA LETTER HA, 66708 +OSMANYA LETTER YA, 66709 +OSMANYA LETTER A, 66710 +OSMANYA LETTER E, 66711 +OSMANYA LETTER I, 66712 +OSMANYA LETTER O, 66713 +OSMANYA LETTER U, 66714 +OSMANYA LETTER AA, 66715 +OSMANYA LETTER EE, 66716 +OSMANYA LETTER OO, 66717 +OSMANYA DIGIT ZERO, 66720 +OSMANYA DIGIT ONE, 66721 +OSMANYA DIGIT TWO, 66722 +OSMANYA DIGIT THREE, 66723 +OSMANYA DIGIT FOUR, 66724 +OSMANYA DIGIT FIVE, 66725 +OSMANYA DIGIT SIX, 66726 +OSMANYA DIGIT SEVEN, 66727 +OSMANYA DIGIT EIGHT, 66728 +OSMANYA DIGIT NINE, 66729 +OSAGE CAPITAL LETTER A, 66736 +OSAGE CAPITAL LETTER AI, 66737 +OSAGE CAPITAL LETTER AIN, 66738 +OSAGE CAPITAL LETTER AH, 66739 +OSAGE CAPITAL LETTER BRA, 66740 +OSAGE CAPITAL LETTER CHA, 66741 +OSAGE CAPITAL LETTER EHCHA, 66742 +OSAGE CAPITAL LETTER E, 66743 +OSAGE CAPITAL LETTER EIN, 66744 +OSAGE CAPITAL LETTER HA, 66745 +OSAGE CAPITAL LETTER HYA, 66746 +OSAGE CAPITAL LETTER I, 66747 +OSAGE CAPITAL LETTER KA, 66748 +OSAGE CAPITAL LETTER EHKA, 66749 +OSAGE CAPITAL LETTER KYA, 66750 +OSAGE CAPITAL LETTER LA, 66751 +OSAGE CAPITAL LETTER MA, 66752 +OSAGE CAPITAL LETTER NA, 66753 +OSAGE CAPITAL LETTER O, 66754 +OSAGE CAPITAL LETTER OIN, 66755 +OSAGE CAPITAL LETTER PA, 66756 +OSAGE CAPITAL LETTER EHPA, 66757 +OSAGE CAPITAL LETTER SA, 66758 +OSAGE CAPITAL LETTER SHA, 66759 +OSAGE CAPITAL LETTER TA, 66760 +OSAGE CAPITAL LETTER EHTA, 66761 +OSAGE CAPITAL LETTER TSA, 66762 +OSAGE CAPITAL LETTER EHTSA, 66763 +OSAGE CAPITAL LETTER TSHA, 66764 +OSAGE CAPITAL LETTER DHA, 66765 +OSAGE CAPITAL LETTER U, 66766 +OSAGE CAPITAL LETTER WA, 66767 +OSAGE CAPITAL LETTER KHA, 66768 +OSAGE CAPITAL LETTER GHA, 66769 +OSAGE CAPITAL LETTER ZA, 66770 +OSAGE CAPITAL LETTER ZHA, 66771 +OSAGE SMALL LETTER A, 66776 +OSAGE SMALL LETTER AI, 66777 +OSAGE SMALL LETTER AIN, 66778 +OSAGE SMALL LETTER AH, 66779 +OSAGE SMALL LETTER BRA, 66780 +OSAGE SMALL LETTER CHA, 66781 +OSAGE SMALL LETTER EHCHA, 66782 +OSAGE SMALL LETTER E, 66783 +OSAGE SMALL LETTER EIN, 66784 +OSAGE SMALL LETTER HA, 66785 +OSAGE SMALL LETTER HYA, 66786 +OSAGE SMALL LETTER I, 66787 +OSAGE SMALL LETTER KA, 66788 +OSAGE SMALL LETTER EHKA, 66789 +OSAGE SMALL LETTER KYA, 66790 +OSAGE SMALL LETTER LA, 66791 +OSAGE SMALL LETTER MA, 66792 +OSAGE SMALL LETTER NA, 66793 +OSAGE SMALL LETTER O, 66794 +OSAGE SMALL LETTER OIN, 66795 +OSAGE SMALL LETTER PA, 66796 +OSAGE SMALL LETTER EHPA, 66797 +OSAGE SMALL LETTER SA, 66798 +OSAGE SMALL LETTER SHA, 66799 +OSAGE SMALL LETTER TA, 66800 +OSAGE SMALL LETTER EHTA, 66801 +OSAGE SMALL LETTER TSA, 66802 +OSAGE SMALL LETTER EHTSA, 66803 +OSAGE SMALL LETTER TSHA, 66804 +OSAGE SMALL LETTER DHA, 66805 +OSAGE SMALL LETTER U, 66806 +OSAGE SMALL LETTER WA, 66807 +OSAGE SMALL LETTER KHA, 66808 +OSAGE SMALL LETTER GHA, 66809 +OSAGE SMALL LETTER ZA, 66810 +OSAGE SMALL LETTER ZHA, 66811 +ELBASAN LETTER A, 66816 +ELBASAN LETTER BE, 66817 +ELBASAN LETTER CE, 66818 +ELBASAN LETTER CHE, 66819 +ELBASAN LETTER DE, 66820 +ELBASAN LETTER NDE, 66821 +ELBASAN LETTER DHE, 66822 +ELBASAN LETTER EI, 66823 +ELBASAN LETTER E, 66824 +ELBASAN LETTER FE, 66825 +ELBASAN LETTER GE, 66826 +ELBASAN LETTER GJE, 66827 +ELBASAN LETTER HE, 66828 +ELBASAN LETTER I, 66829 +ELBASAN LETTER JE, 66830 +ELBASAN LETTER KE, 66831 +ELBASAN LETTER LE, 66832 +ELBASAN LETTER LLE, 66833 +ELBASAN LETTER ME, 66834 +ELBASAN LETTER NE, 66835 +ELBASAN LETTER NA, 66836 +ELBASAN LETTER NJE, 66837 +ELBASAN LETTER O, 66838 +ELBASAN LETTER PE, 66839 +ELBASAN LETTER QE, 66840 +ELBASAN LETTER RE, 66841 +ELBASAN LETTER RRE, 66842 +ELBASAN LETTER SE, 66843 +ELBASAN LETTER SHE, 66844 +ELBASAN LETTER TE, 66845 +ELBASAN LETTER THE, 66846 +ELBASAN LETTER U, 66847 +ELBASAN LETTER VE, 66848 +ELBASAN LETTER XE, 66849 +ELBASAN LETTER Y, 66850 +ELBASAN LETTER ZE, 66851 +ELBASAN LETTER ZHE, 66852 +ELBASAN LETTER GHE, 66853 +ELBASAN LETTER GHAMMA, 66854 +ELBASAN LETTER KHE, 66855 +CAUCASIAN ALBANIAN LETTER ALT, 66864 +CAUCASIAN ALBANIAN LETTER BET, 66865 +CAUCASIAN ALBANIAN LETTER GIM, 66866 +CAUCASIAN ALBANIAN LETTER DAT, 66867 +CAUCASIAN ALBANIAN LETTER EB, 66868 +CAUCASIAN ALBANIAN LETTER ZARL, 66869 +CAUCASIAN ALBANIAN LETTER EYN, 66870 +CAUCASIAN ALBANIAN LETTER ZHIL, 66871 +CAUCASIAN ALBANIAN LETTER TAS, 66872 +CAUCASIAN ALBANIAN LETTER CHA, 66873 +CAUCASIAN ALBANIAN LETTER YOWD, 66874 +CAUCASIAN ALBANIAN LETTER ZHA, 66875 +CAUCASIAN ALBANIAN LETTER IRB, 66876 +CAUCASIAN ALBANIAN LETTER SHA, 66877 +CAUCASIAN ALBANIAN LETTER LAN, 66878 +CAUCASIAN ALBANIAN LETTER INYA, 66879 +CAUCASIAN ALBANIAN LETTER XEYN, 66880 +CAUCASIAN ALBANIAN LETTER DYAN, 66881 +CAUCASIAN ALBANIAN LETTER CAR, 66882 +CAUCASIAN ALBANIAN LETTER JHOX, 66883 +CAUCASIAN ALBANIAN LETTER KAR, 66884 +CAUCASIAN ALBANIAN LETTER LYIT, 66885 +CAUCASIAN ALBANIAN LETTER HEYT, 66886 +CAUCASIAN ALBANIAN LETTER QAY, 66887 +CAUCASIAN ALBANIAN LETTER AOR, 66888 +CAUCASIAN ALBANIAN LETTER CHOY, 66889 +CAUCASIAN ALBANIAN LETTER CHI, 66890 +CAUCASIAN ALBANIAN LETTER CYAY, 66891 +CAUCASIAN ALBANIAN LETTER MAQ, 66892 +CAUCASIAN ALBANIAN LETTER QAR, 66893 +CAUCASIAN ALBANIAN LETTER NOWC, 66894 +CAUCASIAN ALBANIAN LETTER DZYAY, 66895 +CAUCASIAN ALBANIAN LETTER SHAK, 66896 +CAUCASIAN ALBANIAN LETTER JAYN, 66897 +CAUCASIAN ALBANIAN LETTER ON, 66898 +CAUCASIAN ALBANIAN LETTER TYAY, 66899 +CAUCASIAN ALBANIAN LETTER FAM, 66900 +CAUCASIAN ALBANIAN LETTER DZAY, 66901 +CAUCASIAN ALBANIAN LETTER CHAT, 66902 +CAUCASIAN ALBANIAN LETTER PEN, 66903 +CAUCASIAN ALBANIAN LETTER GHEYS, 66904 +CAUCASIAN ALBANIAN LETTER RAT, 66905 +CAUCASIAN ALBANIAN LETTER SEYK, 66906 +CAUCASIAN ALBANIAN LETTER VEYZ, 66907 +CAUCASIAN ALBANIAN LETTER TIWR, 66908 +CAUCASIAN ALBANIAN LETTER SHOY, 66909 +CAUCASIAN ALBANIAN LETTER IWN, 66910 +CAUCASIAN ALBANIAN LETTER CYAW, 66911 +CAUCASIAN ALBANIAN LETTER CAYN, 66912 +CAUCASIAN ALBANIAN LETTER YAYD, 66913 +CAUCASIAN ALBANIAN LETTER PIWR, 66914 +CAUCASIAN ALBANIAN LETTER KIW, 66915 +CAUCASIAN ALBANIAN CITATION MARK, 66927 +LINEAR A SIGN AB001, 67072 +LINEAR A SIGN AB002, 67073 +LINEAR A SIGN AB003, 67074 +LINEAR A SIGN AB004, 67075 +LINEAR A SIGN AB005, 67076 +LINEAR A SIGN AB006, 67077 +LINEAR A SIGN AB007, 67078 +LINEAR A SIGN AB008, 67079 +LINEAR A SIGN AB009, 67080 +LINEAR A SIGN AB010, 67081 +LINEAR A SIGN AB011, 67082 +LINEAR A SIGN AB013, 67083 +LINEAR A SIGN AB016, 67084 +LINEAR A SIGN AB017, 67085 +LINEAR A SIGN AB020, 67086 +LINEAR A SIGN AB021, 67087 +LINEAR A SIGN AB021F, 67088 +LINEAR A SIGN AB021M, 67089 +LINEAR A SIGN AB022, 67090 +LINEAR A SIGN AB022F, 67091 +LINEAR A SIGN AB022M, 67092 +LINEAR A SIGN AB023, 67093 +LINEAR A SIGN AB023M, 67094 +LINEAR A SIGN AB024, 67095 +LINEAR A SIGN AB026, 67096 +LINEAR A SIGN AB027, 67097 +LINEAR A SIGN AB028, 67098 +LINEAR A SIGN A028B, 67099 +LINEAR A SIGN AB029, 67100 +LINEAR A SIGN AB030, 67101 +LINEAR A SIGN AB031, 67102 +LINEAR A SIGN AB034, 67103 +LINEAR A SIGN AB037, 67104 +LINEAR A SIGN AB038, 67105 +LINEAR A SIGN AB039, 67106 +LINEAR A SIGN AB040, 67107 +LINEAR A SIGN AB041, 67108 +LINEAR A SIGN AB044, 67109 +LINEAR A SIGN AB045, 67110 +LINEAR A SIGN AB046, 67111 +LINEAR A SIGN AB047, 67112 +LINEAR A SIGN AB048, 67113 +LINEAR A SIGN AB049, 67114 +LINEAR A SIGN AB050, 67115 +LINEAR A SIGN AB051, 67116 +LINEAR A SIGN AB053, 67117 +LINEAR A SIGN AB054, 67118 +LINEAR A SIGN AB055, 67119 +LINEAR A SIGN AB056, 67120 +LINEAR A SIGN AB057, 67121 +LINEAR A SIGN AB058, 67122 +LINEAR A SIGN AB059, 67123 +LINEAR A SIGN AB060, 67124 +LINEAR A SIGN AB061, 67125 +LINEAR A SIGN AB065, 67126 +LINEAR A SIGN AB066, 67127 +LINEAR A SIGN AB067, 67128 +LINEAR A SIGN AB069, 67129 +LINEAR A SIGN AB070, 67130 +LINEAR A SIGN AB073, 67131 +LINEAR A SIGN AB074, 67132 +LINEAR A SIGN AB076, 67133 +LINEAR A SIGN AB077, 67134 +LINEAR A SIGN AB078, 67135 +LINEAR A SIGN AB079, 67136 +LINEAR A SIGN AB080, 67137 +LINEAR A SIGN AB081, 67138 +LINEAR A SIGN AB082, 67139 +LINEAR A SIGN AB085, 67140 +LINEAR A SIGN AB086, 67141 +LINEAR A SIGN AB087, 67142 +LINEAR A SIGN A100 102, 67143 +LINEAR A SIGN AB118, 67144 +LINEAR A SIGN AB120, 67145 +LINEAR A SIGN A120B, 67146 +LINEAR A SIGN AB122, 67147 +LINEAR A SIGN AB123, 67148 +LINEAR A SIGN AB131A, 67149 +LINEAR A SIGN AB131B, 67150 +LINEAR A SIGN A131C, 67151 +LINEAR A SIGN AB164, 67152 +LINEAR A SIGN AB171, 67153 +LINEAR A SIGN AB180, 67154 +LINEAR A SIGN AB188, 67155 +LINEAR A SIGN AB191, 67156 +LINEAR A SIGN A301, 67157 +LINEAR A SIGN A302, 67158 +LINEAR A SIGN A303, 67159 +LINEAR A SIGN A304, 67160 +LINEAR A SIGN A305, 67161 +LINEAR A SIGN A306, 67162 +LINEAR A SIGN A307, 67163 +LINEAR A SIGN A308, 67164 +LINEAR A SIGN A309A, 67165 +LINEAR A SIGN A309B, 67166 +LINEAR A SIGN A309C, 67167 +LINEAR A SIGN A310, 67168 +LINEAR A SIGN A311, 67169 +LINEAR A SIGN A312, 67170 +LINEAR A SIGN A313A, 67171 +LINEAR A SIGN A313B, 67172 +LINEAR A SIGN A313C, 67173 +LINEAR A SIGN A314, 67174 +LINEAR A SIGN A315, 67175 +LINEAR A SIGN A316, 67176 +LINEAR A SIGN A317, 67177 +LINEAR A SIGN A318, 67178 +LINEAR A SIGN A319, 67179 +LINEAR A SIGN A320, 67180 +LINEAR A SIGN A321, 67181 +LINEAR A SIGN A322, 67182 +LINEAR A SIGN A323, 67183 +LINEAR A SIGN A324, 67184 +LINEAR A SIGN A325, 67185 +LINEAR A SIGN A326, 67186 +LINEAR A SIGN A327, 67187 +LINEAR A SIGN A328, 67188 +LINEAR A SIGN A329, 67189 +LINEAR A SIGN A330, 67190 +LINEAR A SIGN A331, 67191 +LINEAR A SIGN A332, 67192 +LINEAR A SIGN A333, 67193 +LINEAR A SIGN A334, 67194 +LINEAR A SIGN A335, 67195 +LINEAR A SIGN A336, 67196 +LINEAR A SIGN A337, 67197 +LINEAR A SIGN A338, 67198 +LINEAR A SIGN A339, 67199 +LINEAR A SIGN A340, 67200 +LINEAR A SIGN A341, 67201 +LINEAR A SIGN A342, 67202 +LINEAR A SIGN A343, 67203 +LINEAR A SIGN A344, 67204 +LINEAR A SIGN A345, 67205 +LINEAR A SIGN A346, 67206 +LINEAR A SIGN A347, 67207 +LINEAR A SIGN A348, 67208 +LINEAR A SIGN A349, 67209 +LINEAR A SIGN A350, 67210 +LINEAR A SIGN A351, 67211 +LINEAR A SIGN A352, 67212 +LINEAR A SIGN A353, 67213 +LINEAR A SIGN A354, 67214 +LINEAR A SIGN A355, 67215 +LINEAR A SIGN A356, 67216 +LINEAR A SIGN A357, 67217 +LINEAR A SIGN A358, 67218 +LINEAR A SIGN A359, 67219 +LINEAR A SIGN A360, 67220 +LINEAR A SIGN A361, 67221 +LINEAR A SIGN A362, 67222 +LINEAR A SIGN A363, 67223 +LINEAR A SIGN A364, 67224 +LINEAR A SIGN A365, 67225 +LINEAR A SIGN A366, 67226 +LINEAR A SIGN A367, 67227 +LINEAR A SIGN A368, 67228 +LINEAR A SIGN A369, 67229 +LINEAR A SIGN A370, 67230 +LINEAR A SIGN A371, 67231 +LINEAR A SIGN A400 VAS, 67232 +LINEAR A SIGN A401 VAS, 67233 +LINEAR A SIGN A402 VAS, 67234 +LINEAR A SIGN A403 VAS, 67235 +LINEAR A SIGN A404 VAS, 67236 +LINEAR A SIGN A405 VAS, 67237 +LINEAR A SIGN A406 VAS, 67238 +LINEAR A SIGN A407 VAS, 67239 +LINEAR A SIGN A408 VAS, 67240 +LINEAR A SIGN A409 VAS, 67241 +LINEAR A SIGN A410 VAS, 67242 +LINEAR A SIGN A411 VAS, 67243 +LINEAR A SIGN A412 VAS, 67244 +LINEAR A SIGN A413 VAS, 67245 +LINEAR A SIGN A414 VAS, 67246 +LINEAR A SIGN A415 VAS, 67247 +LINEAR A SIGN A416 VAS, 67248 +LINEAR A SIGN A417 VAS, 67249 +LINEAR A SIGN A418 VAS, 67250 +LINEAR A SIGN A501, 67251 +LINEAR A SIGN A502, 67252 +LINEAR A SIGN A503, 67253 +LINEAR A SIGN A504, 67254 +LINEAR A SIGN A505, 67255 +LINEAR A SIGN A506, 67256 +LINEAR A SIGN A508, 67257 +LINEAR A SIGN A509, 67258 +LINEAR A SIGN A510, 67259 +LINEAR A SIGN A511, 67260 +LINEAR A SIGN A512, 67261 +LINEAR A SIGN A513, 67262 +LINEAR A SIGN A515, 67263 +LINEAR A SIGN A516, 67264 +LINEAR A SIGN A520, 67265 +LINEAR A SIGN A521, 67266 +LINEAR A SIGN A523, 67267 +LINEAR A SIGN A524, 67268 +LINEAR A SIGN A525, 67269 +LINEAR A SIGN A526, 67270 +LINEAR A SIGN A527, 67271 +LINEAR A SIGN A528, 67272 +LINEAR A SIGN A529, 67273 +LINEAR A SIGN A530, 67274 +LINEAR A SIGN A531, 67275 +LINEAR A SIGN A532, 67276 +LINEAR A SIGN A534, 67277 +LINEAR A SIGN A535, 67278 +LINEAR A SIGN A536, 67279 +LINEAR A SIGN A537, 67280 +LINEAR A SIGN A538, 67281 +LINEAR A SIGN A539, 67282 +LINEAR A SIGN A540, 67283 +LINEAR A SIGN A541, 67284 +LINEAR A SIGN A542, 67285 +LINEAR A SIGN A545, 67286 +LINEAR A SIGN A547, 67287 +LINEAR A SIGN A548, 67288 +LINEAR A SIGN A549, 67289 +LINEAR A SIGN A550, 67290 +LINEAR A SIGN A551, 67291 +LINEAR A SIGN A552, 67292 +LINEAR A SIGN A553, 67293 +LINEAR A SIGN A554, 67294 +LINEAR A SIGN A555, 67295 +LINEAR A SIGN A556, 67296 +LINEAR A SIGN A557, 67297 +LINEAR A SIGN A559, 67298 +LINEAR A SIGN A563, 67299 +LINEAR A SIGN A564, 67300 +LINEAR A SIGN A565, 67301 +LINEAR A SIGN A566, 67302 +LINEAR A SIGN A568, 67303 +LINEAR A SIGN A569, 67304 +LINEAR A SIGN A570, 67305 +LINEAR A SIGN A571, 67306 +LINEAR A SIGN A572, 67307 +LINEAR A SIGN A573, 67308 +LINEAR A SIGN A574, 67309 +LINEAR A SIGN A575, 67310 +LINEAR A SIGN A576, 67311 +LINEAR A SIGN A577, 67312 +LINEAR A SIGN A578, 67313 +LINEAR A SIGN A579, 67314 +LINEAR A SIGN A580, 67315 +LINEAR A SIGN A581, 67316 +LINEAR A SIGN A582, 67317 +LINEAR A SIGN A583, 67318 +LINEAR A SIGN A584, 67319 +LINEAR A SIGN A585, 67320 +LINEAR A SIGN A586, 67321 +LINEAR A SIGN A587, 67322 +LINEAR A SIGN A588, 67323 +LINEAR A SIGN A589, 67324 +LINEAR A SIGN A591, 67325 +LINEAR A SIGN A592, 67326 +LINEAR A SIGN A594, 67327 +LINEAR A SIGN A595, 67328 +LINEAR A SIGN A596, 67329 +LINEAR A SIGN A598, 67330 +LINEAR A SIGN A600, 67331 +LINEAR A SIGN A601, 67332 +LINEAR A SIGN A602, 67333 +LINEAR A SIGN A603, 67334 +LINEAR A SIGN A604, 67335 +LINEAR A SIGN A606, 67336 +LINEAR A SIGN A608, 67337 +LINEAR A SIGN A609, 67338 +LINEAR A SIGN A610, 67339 +LINEAR A SIGN A611, 67340 +LINEAR A SIGN A612, 67341 +LINEAR A SIGN A613, 67342 +LINEAR A SIGN A614, 67343 +LINEAR A SIGN A615, 67344 +LINEAR A SIGN A616, 67345 +LINEAR A SIGN A617, 67346 +LINEAR A SIGN A618, 67347 +LINEAR A SIGN A619, 67348 +LINEAR A SIGN A620, 67349 +LINEAR A SIGN A621, 67350 +LINEAR A SIGN A622, 67351 +LINEAR A SIGN A623, 67352 +LINEAR A SIGN A624, 67353 +LINEAR A SIGN A626, 67354 +LINEAR A SIGN A627, 67355 +LINEAR A SIGN A628, 67356 +LINEAR A SIGN A629, 67357 +LINEAR A SIGN A634, 67358 +LINEAR A SIGN A637, 67359 +LINEAR A SIGN A638, 67360 +LINEAR A SIGN A640, 67361 +LINEAR A SIGN A642, 67362 +LINEAR A SIGN A643, 67363 +LINEAR A SIGN A644, 67364 +LINEAR A SIGN A645, 67365 +LINEAR A SIGN A646, 67366 +LINEAR A SIGN A648, 67367 +LINEAR A SIGN A649, 67368 +LINEAR A SIGN A651, 67369 +LINEAR A SIGN A652, 67370 +LINEAR A SIGN A653, 67371 +LINEAR A SIGN A654, 67372 +LINEAR A SIGN A655, 67373 +LINEAR A SIGN A656, 67374 +LINEAR A SIGN A657, 67375 +LINEAR A SIGN A658, 67376 +LINEAR A SIGN A659, 67377 +LINEAR A SIGN A660, 67378 +LINEAR A SIGN A661, 67379 +LINEAR A SIGN A662, 67380 +LINEAR A SIGN A663, 67381 +LINEAR A SIGN A664, 67382 +LINEAR A SIGN A701 A, 67392 +LINEAR A SIGN A702 B, 67393 +LINEAR A SIGN A703 D, 67394 +LINEAR A SIGN A704 E, 67395 +LINEAR A SIGN A705 F, 67396 +LINEAR A SIGN A706 H, 67397 +LINEAR A SIGN A707 J, 67398 +LINEAR A SIGN A708 K, 67399 +LINEAR A SIGN A709 L, 67400 +LINEAR A SIGN A709 2 L2, 67401 +LINEAR A SIGN A709 3 L3, 67402 +LINEAR A SIGN A709 4 L4, 67403 +LINEAR A SIGN A709 6 L6, 67404 +LINEAR A SIGN A710 W, 67405 +LINEAR A SIGN A711 X, 67406 +LINEAR A SIGN A712 Y, 67407 +LINEAR A SIGN A713 OMEGA, 67408 +LINEAR A SIGN A714 ABB, 67409 +LINEAR A SIGN A715 BB, 67410 +LINEAR A SIGN A717 DD, 67411 +LINEAR A SIGN A726 EYYY, 67412 +LINEAR A SIGN A732 JE, 67413 +LINEAR A SIGN A800, 67424 +LINEAR A SIGN A801, 67425 +LINEAR A SIGN A802, 67426 +LINEAR A SIGN A803, 67427 +LINEAR A SIGN A804, 67428 +LINEAR A SIGN A805, 67429 +LINEAR A SIGN A806, 67430 +LINEAR A SIGN A807, 67431 +CYPRIOT SYLLABLE A, 67584 +CYPRIOT SYLLABLE E, 67585 +CYPRIOT SYLLABLE I, 67586 +CYPRIOT SYLLABLE O, 67587 +CYPRIOT SYLLABLE U, 67588 +CYPRIOT SYLLABLE JA, 67589 +CYPRIOT SYLLABLE JO, 67592 +CYPRIOT SYLLABLE KA, 67594 +CYPRIOT SYLLABLE KE, 67595 +CYPRIOT SYLLABLE KI, 67596 +CYPRIOT SYLLABLE KO, 67597 +CYPRIOT SYLLABLE KU, 67598 +CYPRIOT SYLLABLE LA, 67599 +CYPRIOT SYLLABLE LE, 67600 +CYPRIOT SYLLABLE LI, 67601 +CYPRIOT SYLLABLE LO, 67602 +CYPRIOT SYLLABLE LU, 67603 +CYPRIOT SYLLABLE MA, 67604 +CYPRIOT SYLLABLE ME, 67605 +CYPRIOT SYLLABLE MI, 67606 +CYPRIOT SYLLABLE MO, 67607 +CYPRIOT SYLLABLE MU, 67608 +CYPRIOT SYLLABLE NA, 67609 +CYPRIOT SYLLABLE NE, 67610 +CYPRIOT SYLLABLE NI, 67611 +CYPRIOT SYLLABLE NO, 67612 +CYPRIOT SYLLABLE NU, 67613 +CYPRIOT SYLLABLE PA, 67614 +CYPRIOT SYLLABLE PE, 67615 +CYPRIOT SYLLABLE PI, 67616 +CYPRIOT SYLLABLE PO, 67617 +CYPRIOT SYLLABLE PU, 67618 +CYPRIOT SYLLABLE RA, 67619 +CYPRIOT SYLLABLE RE, 67620 +CYPRIOT SYLLABLE RI, 67621 +CYPRIOT SYLLABLE RO, 67622 +CYPRIOT SYLLABLE RU, 67623 +CYPRIOT SYLLABLE SA, 67624 +CYPRIOT SYLLABLE SE, 67625 +CYPRIOT SYLLABLE SI, 67626 +CYPRIOT SYLLABLE SO, 67627 +CYPRIOT SYLLABLE SU, 67628 +CYPRIOT SYLLABLE TA, 67629 +CYPRIOT SYLLABLE TE, 67630 +CYPRIOT SYLLABLE TI, 67631 +CYPRIOT SYLLABLE TO, 67632 +CYPRIOT SYLLABLE TU, 67633 +CYPRIOT SYLLABLE WA, 67634 +CYPRIOT SYLLABLE WE, 67635 +CYPRIOT SYLLABLE WI, 67636 +CYPRIOT SYLLABLE WO, 67637 +CYPRIOT SYLLABLE XA, 67639 +CYPRIOT SYLLABLE XE, 67640 +CYPRIOT SYLLABLE ZA, 67644 +CYPRIOT SYLLABLE ZO, 67647 +IMPERIAL ARAMAIC LETTER ALEPH, 67648 +IMPERIAL ARAMAIC LETTER BETH, 67649 +IMPERIAL ARAMAIC LETTER GIMEL, 67650 +IMPERIAL ARAMAIC LETTER DALETH, 67651 +IMPERIAL ARAMAIC LETTER HE, 67652 +IMPERIAL ARAMAIC LETTER WAW, 67653 +IMPERIAL ARAMAIC LETTER ZAYIN, 67654 +IMPERIAL ARAMAIC LETTER HETH, 67655 +IMPERIAL ARAMAIC LETTER TETH, 67656 +IMPERIAL ARAMAIC LETTER YODH, 67657 +IMPERIAL ARAMAIC LETTER KAPH, 67658 +IMPERIAL ARAMAIC LETTER LAMEDH, 67659 +IMPERIAL ARAMAIC LETTER MEM, 67660 +IMPERIAL ARAMAIC LETTER NUN, 67661 +IMPERIAL ARAMAIC LETTER SAMEKH, 67662 +IMPERIAL ARAMAIC LETTER AYIN, 67663 +IMPERIAL ARAMAIC LETTER PE, 67664 +IMPERIAL ARAMAIC LETTER SADHE, 67665 +IMPERIAL ARAMAIC LETTER QOPH, 67666 +IMPERIAL ARAMAIC LETTER RESH, 67667 +IMPERIAL ARAMAIC LETTER SHIN, 67668 +IMPERIAL ARAMAIC LETTER TAW, 67669 +IMPERIAL ARAMAIC SECTION SIGN, 67671 +IMPERIAL ARAMAIC NUMBER ONE, 67672 +IMPERIAL ARAMAIC NUMBER TWO, 67673 +IMPERIAL ARAMAIC NUMBER THREE, 67674 +IMPERIAL ARAMAIC NUMBER TEN, 67675 +IMPERIAL ARAMAIC NUMBER TWENTY, 67676 +IMPERIAL ARAMAIC NUMBER ONE HUNDRED, 67677 +IMPERIAL ARAMAIC NUMBER ONE THOUSAND, 67678 +IMPERIAL ARAMAIC NUMBER TEN THOUSAND, 67679 +PALMYRENE LETTER ALEPH, 67680 +PALMYRENE LETTER BETH, 67681 +PALMYRENE LETTER GIMEL, 67682 +PALMYRENE LETTER DALETH, 67683 +PALMYRENE LETTER HE, 67684 +PALMYRENE LETTER WAW, 67685 +PALMYRENE LETTER ZAYIN, 67686 +PALMYRENE LETTER HETH, 67687 +PALMYRENE LETTER TETH, 67688 +PALMYRENE LETTER YODH, 67689 +PALMYRENE LETTER KAPH, 67690 +PALMYRENE LETTER LAMEDH, 67691 +PALMYRENE LETTER MEM, 67692 +PALMYRENE LETTER FINAL NUN, 67693 +PALMYRENE LETTER NUN, 67694 +PALMYRENE LETTER SAMEKH, 67695 +PALMYRENE LETTER AYIN, 67696 +PALMYRENE LETTER PE, 67697 +PALMYRENE LETTER SADHE, 67698 +PALMYRENE LETTER QOPH, 67699 +PALMYRENE LETTER RESH, 67700 +PALMYRENE LETTER SHIN, 67701 +PALMYRENE LETTER TAW, 67702 +PALMYRENE LEFT POINTING FLEURON, 67703 +PALMYRENE RIGHT POINTING FLEURON, 67704 +PALMYRENE NUMBER ONE, 67705 +PALMYRENE NUMBER TWO, 67706 +PALMYRENE NUMBER THREE, 67707 +PALMYRENE NUMBER FOUR, 67708 +PALMYRENE NUMBER FIVE, 67709 +PALMYRENE NUMBER TEN, 67710 +PALMYRENE NUMBER TWENTY, 67711 +NABATAEAN LETTER FINAL ALEPH, 67712 +NABATAEAN LETTER ALEPH, 67713 +NABATAEAN LETTER FINAL BETH, 67714 +NABATAEAN LETTER BETH, 67715 +NABATAEAN LETTER GIMEL, 67716 +NABATAEAN LETTER DALETH, 67717 +NABATAEAN LETTER FINAL HE, 67718 +NABATAEAN LETTER HE, 67719 +NABATAEAN LETTER WAW, 67720 +NABATAEAN LETTER ZAYIN, 67721 +NABATAEAN LETTER HETH, 67722 +NABATAEAN LETTER TETH, 67723 +NABATAEAN LETTER FINAL YODH, 67724 +NABATAEAN LETTER YODH, 67725 +NABATAEAN LETTER FINAL KAPH, 67726 +NABATAEAN LETTER KAPH, 67727 +NABATAEAN LETTER FINAL LAMEDH, 67728 +NABATAEAN LETTER LAMEDH, 67729 +NABATAEAN LETTER FINAL MEM, 67730 +NABATAEAN LETTER MEM, 67731 +NABATAEAN LETTER FINAL NUN, 67732 +NABATAEAN LETTER NUN, 67733 +NABATAEAN LETTER SAMEKH, 67734 +NABATAEAN LETTER AYIN, 67735 +NABATAEAN LETTER PE, 67736 +NABATAEAN LETTER SADHE, 67737 +NABATAEAN LETTER QOPH, 67738 +NABATAEAN LETTER RESH, 67739 +NABATAEAN LETTER FINAL SHIN, 67740 +NABATAEAN LETTER SHIN, 67741 +NABATAEAN LETTER TAW, 67742 +NABATAEAN NUMBER ONE, 67751 +NABATAEAN NUMBER TWO, 67752 +NABATAEAN NUMBER THREE, 67753 +NABATAEAN NUMBER FOUR, 67754 +NABATAEAN CRUCIFORM NUMBER FOUR, 67755 +NABATAEAN NUMBER FIVE, 67756 +NABATAEAN NUMBER TEN, 67757 +NABATAEAN NUMBER TWENTY, 67758 +NABATAEAN NUMBER ONE HUNDRED, 67759 +HATRAN LETTER ALEPH, 67808 +HATRAN LETTER BETH, 67809 +HATRAN LETTER GIMEL, 67810 +HATRAN LETTER DALETH RESH, 67811 +HATRAN LETTER HE, 67812 +HATRAN LETTER WAW, 67813 +HATRAN LETTER ZAYN, 67814 +HATRAN LETTER HETH, 67815 +HATRAN LETTER TETH, 67816 +HATRAN LETTER YODH, 67817 +HATRAN LETTER KAPH, 67818 +HATRAN LETTER LAMEDH, 67819 +HATRAN LETTER MEM, 67820 +HATRAN LETTER NUN, 67821 +HATRAN LETTER SAMEKH, 67822 +HATRAN LETTER AYN, 67823 +HATRAN LETTER PE, 67824 +HATRAN LETTER SADHE, 67825 +HATRAN LETTER QOPH, 67826 +HATRAN LETTER SHIN, 67828 +HATRAN LETTER TAW, 67829 +HATRAN NUMBER ONE, 67835 +HATRAN NUMBER FIVE, 67836 +HATRAN NUMBER TEN, 67837 +HATRAN NUMBER TWENTY, 67838 +HATRAN NUMBER ONE HUNDRED, 67839 +PHOENICIAN LETTER ALF, 67840 +PHOENICIAN LETTER BET, 67841 +PHOENICIAN LETTER GAML, 67842 +PHOENICIAN LETTER DELT, 67843 +PHOENICIAN LETTER HE, 67844 +PHOENICIAN LETTER WAU, 67845 +PHOENICIAN LETTER ZAI, 67846 +PHOENICIAN LETTER HET, 67847 +PHOENICIAN LETTER TET, 67848 +PHOENICIAN LETTER YOD, 67849 +PHOENICIAN LETTER KAF, 67850 +PHOENICIAN LETTER LAMD, 67851 +PHOENICIAN LETTER MEM, 67852 +PHOENICIAN LETTER NUN, 67853 +PHOENICIAN LETTER SEMK, 67854 +PHOENICIAN LETTER AIN, 67855 +PHOENICIAN LETTER PE, 67856 +PHOENICIAN LETTER SADE, 67857 +PHOENICIAN LETTER QOF, 67858 +PHOENICIAN LETTER ROSH, 67859 +PHOENICIAN LETTER SHIN, 67860 +PHOENICIAN LETTER TAU, 67861 +PHOENICIAN NUMBER ONE, 67862 +PHOENICIAN NUMBER TEN, 67863 +PHOENICIAN NUMBER TWENTY, 67864 +PHOENICIAN NUMBER ONE HUNDRED, 67865 +PHOENICIAN NUMBER TWO, 67866 +PHOENICIAN NUMBER THREE, 67867 +PHOENICIAN WORD SEPARATOR, 67871 +LYDIAN LETTER A, 67872 +LYDIAN LETTER B, 67873 +LYDIAN LETTER G, 67874 +LYDIAN LETTER D, 67875 +LYDIAN LETTER E, 67876 +LYDIAN LETTER V, 67877 +LYDIAN LETTER I, 67878 +LYDIAN LETTER Y, 67879 +LYDIAN LETTER K, 67880 +LYDIAN LETTER L, 67881 +LYDIAN LETTER M, 67882 +LYDIAN LETTER N, 67883 +LYDIAN LETTER O, 67884 +LYDIAN LETTER R, 67885 +LYDIAN LETTER SS, 67886 +LYDIAN LETTER T, 67887 +LYDIAN LETTER U, 67888 +LYDIAN LETTER F, 67889 +LYDIAN LETTER Q, 67890 +LYDIAN LETTER S, 67891 +LYDIAN LETTER TT, 67892 +LYDIAN LETTER AN, 67893 +LYDIAN LETTER EN, 67894 +LYDIAN LETTER LY, 67895 +LYDIAN LETTER NN, 67896 +LYDIAN LETTER C, 67897 +LYDIAN TRIANGULAR MARK, 67903 +MEROITIC HIEROGLYPHIC LETTER A, 67968 +MEROITIC HIEROGLYPHIC LETTER E, 67969 +MEROITIC HIEROGLYPHIC LETTER I, 67970 +MEROITIC HIEROGLYPHIC LETTER O, 67971 +MEROITIC HIEROGLYPHIC LETTER YA, 67972 +MEROITIC HIEROGLYPHIC LETTER WA, 67973 +MEROITIC HIEROGLYPHIC LETTER BA, 67974 +MEROITIC HIEROGLYPHIC LETTER BA 2, 67975 +MEROITIC HIEROGLYPHIC LETTER PA, 67976 +MEROITIC HIEROGLYPHIC LETTER MA, 67977 +MEROITIC HIEROGLYPHIC LETTER NA, 67978 +MEROITIC HIEROGLYPHIC LETTER NA 2, 67979 +MEROITIC HIEROGLYPHIC LETTER NE, 67980 +MEROITIC HIEROGLYPHIC LETTER NE 2, 67981 +MEROITIC HIEROGLYPHIC LETTER RA, 67982 +MEROITIC HIEROGLYPHIC LETTER RA 2, 67983 +MEROITIC HIEROGLYPHIC LETTER LA, 67984 +MEROITIC HIEROGLYPHIC LETTER KHA, 67985 +MEROITIC HIEROGLYPHIC LETTER HHA, 67986 +MEROITIC HIEROGLYPHIC LETTER SA, 67987 +MEROITIC HIEROGLYPHIC LETTER SA 2, 67988 +MEROITIC HIEROGLYPHIC LETTER SE, 67989 +MEROITIC HIEROGLYPHIC LETTER KA, 67990 +MEROITIC HIEROGLYPHIC LETTER QA, 67991 +MEROITIC HIEROGLYPHIC LETTER TA, 67992 +MEROITIC HIEROGLYPHIC LETTER TA 2, 67993 +MEROITIC HIEROGLYPHIC LETTER TE, 67994 +MEROITIC HIEROGLYPHIC LETTER TE 2, 67995 +MEROITIC HIEROGLYPHIC LETTER TO, 67996 +MEROITIC HIEROGLYPHIC LETTER DA, 67997 +MEROITIC HIEROGLYPHIC SYMBOL VIDJ, 67998 +MEROITIC HIEROGLYPHIC SYMBOL VIDJ 2, 67999 +MEROITIC CURSIVE LETTER A, 68000 +MEROITIC CURSIVE LETTER E, 68001 +MEROITIC CURSIVE LETTER I, 68002 +MEROITIC CURSIVE LETTER O, 68003 +MEROITIC CURSIVE LETTER YA, 68004 +MEROITIC CURSIVE LETTER WA, 68005 +MEROITIC CURSIVE LETTER BA, 68006 +MEROITIC CURSIVE LETTER PA, 68007 +MEROITIC CURSIVE LETTER MA, 68008 +MEROITIC CURSIVE LETTER NA, 68009 +MEROITIC CURSIVE LETTER NE, 68010 +MEROITIC CURSIVE LETTER RA, 68011 +MEROITIC CURSIVE LETTER LA, 68012 +MEROITIC CURSIVE LETTER KHA, 68013 +MEROITIC CURSIVE LETTER HHA, 68014 +MEROITIC CURSIVE LETTER SA, 68015 +MEROITIC CURSIVE LETTER ARCHAIC SA, 68016 +MEROITIC CURSIVE LETTER SE, 68017 +MEROITIC CURSIVE LETTER KA, 68018 +MEROITIC CURSIVE LETTER QA, 68019 +MEROITIC CURSIVE LETTER TA, 68020 +MEROITIC CURSIVE LETTER TE, 68021 +MEROITIC CURSIVE LETTER TO, 68022 +MEROITIC CURSIVE LETTER DA, 68023 +MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS, 68028 +MEROITIC CURSIVE FRACTION ONE HALF, 68029 +MEROITIC CURSIVE LOGOGRAM RMT, 68030 +MEROITIC CURSIVE LOGOGRAM IMN, 68031 +MEROITIC CURSIVE NUMBER ONE, 68032 +MEROITIC CURSIVE NUMBER TWO, 68033 +MEROITIC CURSIVE NUMBER THREE, 68034 +MEROITIC CURSIVE NUMBER FOUR, 68035 +MEROITIC CURSIVE NUMBER FIVE, 68036 +MEROITIC CURSIVE NUMBER SIX, 68037 +MEROITIC CURSIVE NUMBER SEVEN, 68038 +MEROITIC CURSIVE NUMBER EIGHT, 68039 +MEROITIC CURSIVE NUMBER NINE, 68040 +MEROITIC CURSIVE NUMBER TEN, 68041 +MEROITIC CURSIVE NUMBER TWENTY, 68042 +MEROITIC CURSIVE NUMBER THIRTY, 68043 +MEROITIC CURSIVE NUMBER FORTY, 68044 +MEROITIC CURSIVE NUMBER FIFTY, 68045 +MEROITIC CURSIVE NUMBER SIXTY, 68046 +MEROITIC CURSIVE NUMBER SEVENTY, 68047 +MEROITIC CURSIVE NUMBER ONE HUNDRED, 68050 +MEROITIC CURSIVE NUMBER TWO HUNDRED, 68051 +MEROITIC CURSIVE NUMBER THREE HUNDRED, 68052 +MEROITIC CURSIVE NUMBER FOUR HUNDRED, 68053 +MEROITIC CURSIVE NUMBER FIVE HUNDRED, 68054 +MEROITIC CURSIVE NUMBER SIX HUNDRED, 68055 +MEROITIC CURSIVE NUMBER SEVEN HUNDRED, 68056 +MEROITIC CURSIVE NUMBER EIGHT HUNDRED, 68057 +MEROITIC CURSIVE NUMBER NINE HUNDRED, 68058 +MEROITIC CURSIVE NUMBER ONE THOUSAND, 68059 +MEROITIC CURSIVE NUMBER TWO THOUSAND, 68060 +MEROITIC CURSIVE NUMBER THREE THOUSAND, 68061 +MEROITIC CURSIVE NUMBER FOUR THOUSAND, 68062 +MEROITIC CURSIVE NUMBER FIVE THOUSAND, 68063 +MEROITIC CURSIVE NUMBER SIX THOUSAND, 68064 +MEROITIC CURSIVE NUMBER SEVEN THOUSAND, 68065 +MEROITIC CURSIVE NUMBER EIGHT THOUSAND, 68066 +MEROITIC CURSIVE NUMBER NINE THOUSAND, 68067 +MEROITIC CURSIVE NUMBER TEN THOUSAND, 68068 +MEROITIC CURSIVE NUMBER TWENTY THOUSAND, 68069 +MEROITIC CURSIVE NUMBER THIRTY THOUSAND, 68070 +MEROITIC CURSIVE NUMBER FORTY THOUSAND, 68071 +MEROITIC CURSIVE NUMBER FIFTY THOUSAND, 68072 +MEROITIC CURSIVE NUMBER SIXTY THOUSAND, 68073 +MEROITIC CURSIVE NUMBER SEVENTY THOUSAND, 68074 +MEROITIC CURSIVE NUMBER EIGHTY THOUSAND, 68075 +MEROITIC CURSIVE NUMBER NINETY THOUSAND, 68076 +MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND, 68077 +MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND, 68078 +MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND, 68079 +MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND, 68080 +MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND, 68081 +MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND, 68082 +MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND, 68083 +MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND, 68084 +MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND, 68085 +MEROITIC CURSIVE FRACTION ONE TWELFTH, 68086 +MEROITIC CURSIVE FRACTION TWO TWELFTHS, 68087 +MEROITIC CURSIVE FRACTION THREE TWELFTHS, 68088 +MEROITIC CURSIVE FRACTION FOUR TWELFTHS, 68089 +MEROITIC CURSIVE FRACTION FIVE TWELFTHS, 68090 +MEROITIC CURSIVE FRACTION SIX TWELFTHS, 68091 +MEROITIC CURSIVE FRACTION SEVEN TWELFTHS, 68092 +MEROITIC CURSIVE FRACTION EIGHT TWELFTHS, 68093 +MEROITIC CURSIVE FRACTION NINE TWELFTHS, 68094 +MEROITIC CURSIVE FRACTION TEN TWELFTHS, 68095 +KHAROSHTHI LETTER A, 68096 +KHAROSHTHI VOWEL SIGN I, 68097 +KHAROSHTHI VOWEL SIGN U, 68098 +KHAROSHTHI VOWEL SIGN VOCALIC R, 68099 +KHAROSHTHI VOWEL SIGN E, 68101 +KHAROSHTHI VOWEL SIGN O, 68102 +KHAROSHTHI VOWEL LENGTH MARK, 68108 +KHAROSHTHI SIGN DOUBLE RING BELOW, 68109 +KHAROSHTHI SIGN ANUSVARA, 68110 +KHAROSHTHI SIGN VISARGA, 68111 +KHAROSHTHI LETTER KA, 68112 +KHAROSHTHI LETTER KHA, 68113 +KHAROSHTHI LETTER GA, 68114 +KHAROSHTHI LETTER GHA, 68115 +KHAROSHTHI LETTER CA, 68117 +KHAROSHTHI LETTER CHA, 68118 +KHAROSHTHI LETTER JA, 68119 +KHAROSHTHI LETTER NYA, 68121 +KHAROSHTHI LETTER TTA, 68122 +KHAROSHTHI LETTER TTHA, 68123 +KHAROSHTHI LETTER DDA, 68124 +KHAROSHTHI LETTER DDHA, 68125 +KHAROSHTHI LETTER NNA, 68126 +KHAROSHTHI LETTER TA, 68127 +KHAROSHTHI LETTER THA, 68128 +KHAROSHTHI LETTER DA, 68129 +KHAROSHTHI LETTER DHA, 68130 +KHAROSHTHI LETTER NA, 68131 +KHAROSHTHI LETTER PA, 68132 +KHAROSHTHI LETTER PHA, 68133 +KHAROSHTHI LETTER BA, 68134 +KHAROSHTHI LETTER BHA, 68135 +KHAROSHTHI LETTER MA, 68136 +KHAROSHTHI LETTER YA, 68137 +KHAROSHTHI LETTER RA, 68138 +KHAROSHTHI LETTER LA, 68139 +KHAROSHTHI LETTER VA, 68140 +KHAROSHTHI LETTER SHA, 68141 +KHAROSHTHI LETTER SSA, 68142 +KHAROSHTHI LETTER SA, 68143 +KHAROSHTHI LETTER ZA, 68144 +KHAROSHTHI LETTER HA, 68145 +KHAROSHTHI LETTER KKA, 68146 +KHAROSHTHI LETTER TTTHA, 68147 +KHAROSHTHI SIGN BAR ABOVE, 68152 +KHAROSHTHI SIGN CAUDA, 68153 +KHAROSHTHI SIGN DOT BELOW, 68154 +KHAROSHTHI VIRAMA, 68159 +KHAROSHTHI DIGIT ONE, 68160 +KHAROSHTHI DIGIT TWO, 68161 +KHAROSHTHI DIGIT THREE, 68162 +KHAROSHTHI DIGIT FOUR, 68163 +KHAROSHTHI NUMBER TEN, 68164 +KHAROSHTHI NUMBER TWENTY, 68165 +KHAROSHTHI NUMBER ONE HUNDRED, 68166 +KHAROSHTHI NUMBER ONE THOUSAND, 68167 +KHAROSHTHI PUNCTUATION DOT, 68176 +KHAROSHTHI PUNCTUATION SMALL CIRCLE, 68177 +KHAROSHTHI PUNCTUATION CIRCLE, 68178 +KHAROSHTHI PUNCTUATION CRESCENT BAR, 68179 +KHAROSHTHI PUNCTUATION MANGALAM, 68180 +KHAROSHTHI PUNCTUATION LOTUS, 68181 +KHAROSHTHI PUNCTUATION DANDA, 68182 +KHAROSHTHI PUNCTUATION DOUBLE DANDA, 68183 +KHAROSHTHI PUNCTUATION LINES, 68184 +OLD SOUTH ARABIAN LETTER HE, 68192 +OLD SOUTH ARABIAN LETTER LAMEDH, 68193 +OLD SOUTH ARABIAN LETTER HETH, 68194 +OLD SOUTH ARABIAN LETTER MEM, 68195 +OLD SOUTH ARABIAN LETTER QOPH, 68196 +OLD SOUTH ARABIAN LETTER WAW, 68197 +OLD SOUTH ARABIAN LETTER SHIN, 68198 +OLD SOUTH ARABIAN LETTER RESH, 68199 +OLD SOUTH ARABIAN LETTER BETH, 68200 +OLD SOUTH ARABIAN LETTER TAW, 68201 +OLD SOUTH ARABIAN LETTER SAT, 68202 +OLD SOUTH ARABIAN LETTER KAPH, 68203 +OLD SOUTH ARABIAN LETTER NUN, 68204 +OLD SOUTH ARABIAN LETTER KHETH, 68205 +OLD SOUTH ARABIAN LETTER SADHE, 68206 +OLD SOUTH ARABIAN LETTER SAMEKH, 68207 +OLD SOUTH ARABIAN LETTER FE, 68208 +OLD SOUTH ARABIAN LETTER ALEF, 68209 +OLD SOUTH ARABIAN LETTER AYN, 68210 +OLD SOUTH ARABIAN LETTER DHADHE, 68211 +OLD SOUTH ARABIAN LETTER GIMEL, 68212 +OLD SOUTH ARABIAN LETTER DALETH, 68213 +OLD SOUTH ARABIAN LETTER GHAYN, 68214 +OLD SOUTH ARABIAN LETTER TETH, 68215 +OLD SOUTH ARABIAN LETTER ZAYN, 68216 +OLD SOUTH ARABIAN LETTER DHALETH, 68217 +OLD SOUTH ARABIAN LETTER YODH, 68218 +OLD SOUTH ARABIAN LETTER THAW, 68219 +OLD SOUTH ARABIAN LETTER THETH, 68220 +OLD SOUTH ARABIAN NUMBER ONE, 68221 +OLD SOUTH ARABIAN NUMBER FIFTY, 68222 +OLD SOUTH ARABIAN NUMERIC INDICATOR, 68223 +OLD NORTH ARABIAN LETTER HEH, 68224 +OLD NORTH ARABIAN LETTER LAM, 68225 +OLD NORTH ARABIAN LETTER HAH, 68226 +OLD NORTH ARABIAN LETTER MEEM, 68227 +OLD NORTH ARABIAN LETTER QAF, 68228 +OLD NORTH ARABIAN LETTER WAW, 68229 +OLD NORTH ARABIAN LETTER ES 2, 68230 +OLD NORTH ARABIAN LETTER REH, 68231 +OLD NORTH ARABIAN LETTER BEH, 68232 +OLD NORTH ARABIAN LETTER TEH, 68233 +OLD NORTH ARABIAN LETTER ES 1, 68234 +OLD NORTH ARABIAN LETTER KAF, 68235 +OLD NORTH ARABIAN LETTER NOON, 68236 +OLD NORTH ARABIAN LETTER KHAH, 68237 +OLD NORTH ARABIAN LETTER SAD, 68238 +OLD NORTH ARABIAN LETTER ES 3, 68239 +OLD NORTH ARABIAN LETTER FEH, 68240 +OLD NORTH ARABIAN LETTER ALEF, 68241 +OLD NORTH ARABIAN LETTER AIN, 68242 +OLD NORTH ARABIAN LETTER DAD, 68243 +OLD NORTH ARABIAN LETTER GEEM, 68244 +OLD NORTH ARABIAN LETTER DAL, 68245 +OLD NORTH ARABIAN LETTER GHAIN, 68246 +OLD NORTH ARABIAN LETTER TAH, 68247 +OLD NORTH ARABIAN LETTER ZAIN, 68248 +OLD NORTH ARABIAN LETTER THAL, 68249 +OLD NORTH ARABIAN LETTER YEH, 68250 +OLD NORTH ARABIAN LETTER THEH, 68251 +OLD NORTH ARABIAN LETTER ZAH, 68252 +OLD NORTH ARABIAN NUMBER ONE, 68253 +OLD NORTH ARABIAN NUMBER TEN, 68254 +OLD NORTH ARABIAN NUMBER TWENTY, 68255 +MANICHAEAN LETTER ALEPH, 68288 +MANICHAEAN LETTER BETH, 68289 +MANICHAEAN LETTER BHETH, 68290 +MANICHAEAN LETTER GIMEL, 68291 +MANICHAEAN LETTER GHIMEL, 68292 +MANICHAEAN LETTER DALETH, 68293 +MANICHAEAN LETTER HE, 68294 +MANICHAEAN LETTER WAW, 68295 +MANICHAEAN SIGN UD, 68296 +MANICHAEAN LETTER ZAYIN, 68297 +MANICHAEAN LETTER ZHAYIN, 68298 +MANICHAEAN LETTER JAYIN, 68299 +MANICHAEAN LETTER JHAYIN, 68300 +MANICHAEAN LETTER HETH, 68301 +MANICHAEAN LETTER TETH, 68302 +MANICHAEAN LETTER YODH, 68303 +MANICHAEAN LETTER KAPH, 68304 +MANICHAEAN LETTER XAPH, 68305 +MANICHAEAN LETTER KHAPH, 68306 +MANICHAEAN LETTER LAMEDH, 68307 +MANICHAEAN LETTER DHAMEDH, 68308 +MANICHAEAN LETTER THAMEDH, 68309 +MANICHAEAN LETTER MEM, 68310 +MANICHAEAN LETTER NUN, 68311 +MANICHAEAN LETTER SAMEKH, 68312 +MANICHAEAN LETTER AYIN, 68313 +MANICHAEAN LETTER AAYIN, 68314 +MANICHAEAN LETTER PE, 68315 +MANICHAEAN LETTER FE, 68316 +MANICHAEAN LETTER SADHE, 68317 +MANICHAEAN LETTER QOPH, 68318 +MANICHAEAN LETTER XOPH, 68319 +MANICHAEAN LETTER QHOPH, 68320 +MANICHAEAN LETTER RESH, 68321 +MANICHAEAN LETTER SHIN, 68322 +MANICHAEAN LETTER SSHIN, 68323 +MANICHAEAN LETTER TAW, 68324 +MANICHAEAN ABBREVIATION MARK ABOVE, 68325 +MANICHAEAN ABBREVIATION MARK BELOW, 68326 +MANICHAEAN NUMBER ONE, 68331 +MANICHAEAN NUMBER FIVE, 68332 +MANICHAEAN NUMBER TEN, 68333 +MANICHAEAN NUMBER TWENTY, 68334 +MANICHAEAN NUMBER ONE HUNDRED, 68335 +MANICHAEAN PUNCTUATION STAR, 68336 +MANICHAEAN PUNCTUATION FLEURON, 68337 +MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT, 68338 +MANICHAEAN PUNCTUATION DOT WITHIN DOT, 68339 +MANICHAEAN PUNCTUATION DOT, 68340 +MANICHAEAN PUNCTUATION TWO DOTS, 68341 +MANICHAEAN PUNCTUATION LINE FILLER, 68342 +AVESTAN LETTER A, 68352 +AVESTAN LETTER AA, 68353 +AVESTAN LETTER AO, 68354 +AVESTAN LETTER AAO, 68355 +AVESTAN LETTER AN, 68356 +AVESTAN LETTER AAN, 68357 +AVESTAN LETTER AE, 68358 +AVESTAN LETTER AEE, 68359 +AVESTAN LETTER E, 68360 +AVESTAN LETTER EE, 68361 +AVESTAN LETTER O, 68362 +AVESTAN LETTER OO, 68363 +AVESTAN LETTER I, 68364 +AVESTAN LETTER II, 68365 +AVESTAN LETTER U, 68366 +AVESTAN LETTER UU, 68367 +AVESTAN LETTER KE, 68368 +AVESTAN LETTER XE, 68369 +AVESTAN LETTER XYE, 68370 +AVESTAN LETTER XVE, 68371 +AVESTAN LETTER GE, 68372 +AVESTAN LETTER GGE, 68373 +AVESTAN LETTER GHE, 68374 +AVESTAN LETTER CE, 68375 +AVESTAN LETTER JE, 68376 +AVESTAN LETTER TE, 68377 +AVESTAN LETTER THE, 68378 +AVESTAN LETTER DE, 68379 +AVESTAN LETTER DHE, 68380 +AVESTAN LETTER TTE, 68381 +AVESTAN LETTER PE, 68382 +AVESTAN LETTER FE, 68383 +AVESTAN LETTER BE, 68384 +AVESTAN LETTER BHE, 68385 +AVESTAN LETTER NGE, 68386 +AVESTAN LETTER NGYE, 68387 +AVESTAN LETTER NGVE, 68388 +AVESTAN LETTER NE, 68389 +AVESTAN LETTER NYE, 68390 +AVESTAN LETTER NNE, 68391 +AVESTAN LETTER ME, 68392 +AVESTAN LETTER HME, 68393 +AVESTAN LETTER YYE, 68394 +AVESTAN LETTER YE, 68395 +AVESTAN LETTER VE, 68396 +AVESTAN LETTER RE, 68397 +AVESTAN LETTER LE, 68398 +AVESTAN LETTER SE, 68399 +AVESTAN LETTER ZE, 68400 +AVESTAN LETTER SHE, 68401 +AVESTAN LETTER ZHE, 68402 +AVESTAN LETTER SHYE, 68403 +AVESTAN LETTER SSHE, 68404 +AVESTAN LETTER HE, 68405 +AVESTAN ABBREVIATION MARK, 68409 +TINY TWO DOTS OVER ONE DOT PUNCTUATION, 68410 +SMALL TWO DOTS OVER ONE DOT PUNCTUATION, 68411 +LARGE TWO DOTS OVER ONE DOT PUNCTUATION, 68412 +LARGE ONE DOT OVER TWO DOTS PUNCTUATION, 68413 +LARGE TWO RINGS OVER ONE RING PUNCTUATION, 68414 +LARGE ONE RING OVER TWO RINGS PUNCTUATION, 68415 +INSCRIPTIONAL PARTHIAN LETTER ALEPH, 68416 +INSCRIPTIONAL PARTHIAN LETTER BETH, 68417 +INSCRIPTIONAL PARTHIAN LETTER GIMEL, 68418 +INSCRIPTIONAL PARTHIAN LETTER DALETH, 68419 +INSCRIPTIONAL PARTHIAN LETTER HE, 68420 +INSCRIPTIONAL PARTHIAN LETTER WAW, 68421 +INSCRIPTIONAL PARTHIAN LETTER ZAYIN, 68422 +INSCRIPTIONAL PARTHIAN LETTER HETH, 68423 +INSCRIPTIONAL PARTHIAN LETTER TETH, 68424 +INSCRIPTIONAL PARTHIAN LETTER YODH, 68425 +INSCRIPTIONAL PARTHIAN LETTER KAPH, 68426 +INSCRIPTIONAL PARTHIAN LETTER LAMEDH, 68427 +INSCRIPTIONAL PARTHIAN LETTER MEM, 68428 +INSCRIPTIONAL PARTHIAN LETTER NUN, 68429 +INSCRIPTIONAL PARTHIAN LETTER SAMEKH, 68430 +INSCRIPTIONAL PARTHIAN LETTER AYIN, 68431 +INSCRIPTIONAL PARTHIAN LETTER PE, 68432 +INSCRIPTIONAL PARTHIAN LETTER SADHE, 68433 +INSCRIPTIONAL PARTHIAN LETTER QOPH, 68434 +INSCRIPTIONAL PARTHIAN LETTER RESH, 68435 +INSCRIPTIONAL PARTHIAN LETTER SHIN, 68436 +INSCRIPTIONAL PARTHIAN LETTER TAW, 68437 +INSCRIPTIONAL PARTHIAN NUMBER ONE, 68440 +INSCRIPTIONAL PARTHIAN NUMBER TWO, 68441 +INSCRIPTIONAL PARTHIAN NUMBER THREE, 68442 +INSCRIPTIONAL PARTHIAN NUMBER FOUR, 68443 +INSCRIPTIONAL PARTHIAN NUMBER TEN, 68444 +INSCRIPTIONAL PARTHIAN NUMBER TWENTY, 68445 +INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED, 68446 +INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND, 68447 +INSCRIPTIONAL PAHLAVI LETTER ALEPH, 68448 +INSCRIPTIONAL PAHLAVI LETTER BETH, 68449 +INSCRIPTIONAL PAHLAVI LETTER GIMEL, 68450 +INSCRIPTIONAL PAHLAVI LETTER DALETH, 68451 +INSCRIPTIONAL PAHLAVI LETTER HE, 68452 +INSCRIPTIONAL PAHLAVI LETTER WAW AYIN RESH, 68453 +INSCRIPTIONAL PAHLAVI LETTER ZAYIN, 68454 +INSCRIPTIONAL PAHLAVI LETTER HETH, 68455 +INSCRIPTIONAL PAHLAVI LETTER TETH, 68456 +INSCRIPTIONAL PAHLAVI LETTER YODH, 68457 +INSCRIPTIONAL PAHLAVI LETTER KAPH, 68458 +INSCRIPTIONAL PAHLAVI LETTER LAMEDH, 68459 +INSCRIPTIONAL PAHLAVI LETTER MEM QOPH, 68460 +INSCRIPTIONAL PAHLAVI LETTER NUN, 68461 +INSCRIPTIONAL PAHLAVI LETTER SAMEKH, 68462 +INSCRIPTIONAL PAHLAVI LETTER PE, 68463 +INSCRIPTIONAL PAHLAVI LETTER SADHE, 68464 +INSCRIPTIONAL PAHLAVI LETTER SHIN, 68465 +INSCRIPTIONAL PAHLAVI LETTER TAW, 68466 +INSCRIPTIONAL PAHLAVI NUMBER ONE, 68472 +INSCRIPTIONAL PAHLAVI NUMBER TWO, 68473 +INSCRIPTIONAL PAHLAVI NUMBER THREE, 68474 +INSCRIPTIONAL PAHLAVI NUMBER FOUR, 68475 +INSCRIPTIONAL PAHLAVI NUMBER TEN, 68476 +INSCRIPTIONAL PAHLAVI NUMBER TWENTY, 68477 +INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED, 68478 +INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND, 68479 +PSALTER PAHLAVI LETTER ALEPH, 68480 +PSALTER PAHLAVI LETTER BETH, 68481 +PSALTER PAHLAVI LETTER GIMEL, 68482 +PSALTER PAHLAVI LETTER DALETH, 68483 +PSALTER PAHLAVI LETTER HE, 68484 +PSALTER PAHLAVI LETTER WAW AYIN RESH, 68485 +PSALTER PAHLAVI LETTER ZAYIN, 68486 +PSALTER PAHLAVI LETTER HETH, 68487 +PSALTER PAHLAVI LETTER YODH, 68488 +PSALTER PAHLAVI LETTER KAPH, 68489 +PSALTER PAHLAVI LETTER LAMEDH, 68490 +PSALTER PAHLAVI LETTER MEM QOPH, 68491 +PSALTER PAHLAVI LETTER NUN, 68492 +PSALTER PAHLAVI LETTER SAMEKH, 68493 +PSALTER PAHLAVI LETTER PE, 68494 +PSALTER PAHLAVI LETTER SADHE, 68495 +PSALTER PAHLAVI LETTER SHIN, 68496 +PSALTER PAHLAVI LETTER TAW, 68497 +PSALTER PAHLAVI SECTION MARK, 68505 +PSALTER PAHLAVI TURNED SECTION MARK, 68506 +PSALTER PAHLAVI FOUR DOTS WITH CROSS, 68507 +PSALTER PAHLAVI FOUR DOTS WITH DOT, 68508 +PSALTER PAHLAVI NUMBER ONE, 68521 +PSALTER PAHLAVI NUMBER TWO, 68522 +PSALTER PAHLAVI NUMBER THREE, 68523 +PSALTER PAHLAVI NUMBER FOUR, 68524 +PSALTER PAHLAVI NUMBER TEN, 68525 +PSALTER PAHLAVI NUMBER TWENTY, 68526 +PSALTER PAHLAVI NUMBER ONE HUNDRED, 68527 +OLD TURKIC LETTER ORKHON A, 68608 +OLD TURKIC LETTER YENISEI A, 68609 +OLD TURKIC LETTER YENISEI AE, 68610 +OLD TURKIC LETTER ORKHON I, 68611 +OLD TURKIC LETTER YENISEI I, 68612 +OLD TURKIC LETTER YENISEI E, 68613 +OLD TURKIC LETTER ORKHON O, 68614 +OLD TURKIC LETTER ORKHON OE, 68615 +OLD TURKIC LETTER YENISEI OE, 68616 +OLD TURKIC LETTER ORKHON AB, 68617 +OLD TURKIC LETTER YENISEI AB, 68618 +OLD TURKIC LETTER ORKHON AEB, 68619 +OLD TURKIC LETTER YENISEI AEB, 68620 +OLD TURKIC LETTER ORKHON AG, 68621 +OLD TURKIC LETTER YENISEI AG, 68622 +OLD TURKIC LETTER ORKHON AEG, 68623 +OLD TURKIC LETTER YENISEI AEG, 68624 +OLD TURKIC LETTER ORKHON AD, 68625 +OLD TURKIC LETTER YENISEI AD, 68626 +OLD TURKIC LETTER ORKHON AED, 68627 +OLD TURKIC LETTER ORKHON EZ, 68628 +OLD TURKIC LETTER YENISEI EZ, 68629 +OLD TURKIC LETTER ORKHON AY, 68630 +OLD TURKIC LETTER YENISEI AY, 68631 +OLD TURKIC LETTER ORKHON AEY, 68632 +OLD TURKIC LETTER YENISEI AEY, 68633 +OLD TURKIC LETTER ORKHON AEK, 68634 +OLD TURKIC LETTER YENISEI AEK, 68635 +OLD TURKIC LETTER ORKHON OEK, 68636 +OLD TURKIC LETTER YENISEI OEK, 68637 +OLD TURKIC LETTER ORKHON AL, 68638 +OLD TURKIC LETTER YENISEI AL, 68639 +OLD TURKIC LETTER ORKHON AEL, 68640 +OLD TURKIC LETTER ORKHON ELT, 68641 +OLD TURKIC LETTER ORKHON EM, 68642 +OLD TURKIC LETTER ORKHON AN, 68643 +OLD TURKIC LETTER ORKHON AEN, 68644 +OLD TURKIC LETTER YENISEI AEN, 68645 +OLD TURKIC LETTER ORKHON ENT, 68646 +OLD TURKIC LETTER YENISEI ENT, 68647 +OLD TURKIC LETTER ORKHON ENC, 68648 +OLD TURKIC LETTER YENISEI ENC, 68649 +OLD TURKIC LETTER ORKHON ENY, 68650 +OLD TURKIC LETTER YENISEI ENY, 68651 +OLD TURKIC LETTER YENISEI ANG, 68652 +OLD TURKIC LETTER ORKHON ENG, 68653 +OLD TURKIC LETTER YENISEI AENG, 68654 +OLD TURKIC LETTER ORKHON EP, 68655 +OLD TURKIC LETTER ORKHON OP, 68656 +OLD TURKIC LETTER ORKHON IC, 68657 +OLD TURKIC LETTER ORKHON EC, 68658 +OLD TURKIC LETTER YENISEI EC, 68659 +OLD TURKIC LETTER ORKHON AQ, 68660 +OLD TURKIC LETTER YENISEI AQ, 68661 +OLD TURKIC LETTER ORKHON IQ, 68662 +OLD TURKIC LETTER YENISEI IQ, 68663 +OLD TURKIC LETTER ORKHON OQ, 68664 +OLD TURKIC LETTER YENISEI OQ, 68665 +OLD TURKIC LETTER ORKHON AR, 68666 +OLD TURKIC LETTER YENISEI AR, 68667 +OLD TURKIC LETTER ORKHON AER, 68668 +OLD TURKIC LETTER ORKHON AS, 68669 +OLD TURKIC LETTER ORKHON AES, 68670 +OLD TURKIC LETTER ORKHON ASH, 68671 +OLD TURKIC LETTER YENISEI ASH, 68672 +OLD TURKIC LETTER ORKHON ESH, 68673 +OLD TURKIC LETTER YENISEI ESH, 68674 +OLD TURKIC LETTER ORKHON AT, 68675 +OLD TURKIC LETTER YENISEI AT, 68676 +OLD TURKIC LETTER ORKHON AET, 68677 +OLD TURKIC LETTER YENISEI AET, 68678 +OLD TURKIC LETTER ORKHON OT, 68679 +OLD TURKIC LETTER ORKHON BASH, 68680 +OLD HUNGARIAN CAPITAL LETTER A, 68736 +OLD HUNGARIAN CAPITAL LETTER AA, 68737 +OLD HUNGARIAN CAPITAL LETTER EB, 68738 +OLD HUNGARIAN CAPITAL LETTER AMB, 68739 +OLD HUNGARIAN CAPITAL LETTER EC, 68740 +OLD HUNGARIAN CAPITAL LETTER ENC, 68741 +OLD HUNGARIAN CAPITAL LETTER ECS, 68742 +OLD HUNGARIAN CAPITAL LETTER ED, 68743 +OLD HUNGARIAN CAPITAL LETTER AND, 68744 +OLD HUNGARIAN CAPITAL LETTER E, 68745 +OLD HUNGARIAN CAPITAL LETTER CLOSE E, 68746 +OLD HUNGARIAN CAPITAL LETTER EE, 68747 +OLD HUNGARIAN CAPITAL LETTER EF, 68748 +OLD HUNGARIAN CAPITAL LETTER EG, 68749 +OLD HUNGARIAN CAPITAL LETTER EGY, 68750 +OLD HUNGARIAN CAPITAL LETTER EH, 68751 +OLD HUNGARIAN CAPITAL LETTER I, 68752 +OLD HUNGARIAN CAPITAL LETTER II, 68753 +OLD HUNGARIAN CAPITAL LETTER EJ, 68754 +OLD HUNGARIAN CAPITAL LETTER EK, 68755 +OLD HUNGARIAN CAPITAL LETTER AK, 68756 +OLD HUNGARIAN CAPITAL LETTER UNK, 68757 +OLD HUNGARIAN CAPITAL LETTER EL, 68758 +OLD HUNGARIAN CAPITAL LETTER ELY, 68759 +OLD HUNGARIAN CAPITAL LETTER EM, 68760 +OLD HUNGARIAN CAPITAL LETTER EN, 68761 +OLD HUNGARIAN CAPITAL LETTER ENY, 68762 +OLD HUNGARIAN CAPITAL LETTER O, 68763 +OLD HUNGARIAN CAPITAL LETTER OO, 68764 +OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE, 68765 +OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE, 68766 +OLD HUNGARIAN CAPITAL LETTER OEE, 68767 +OLD HUNGARIAN CAPITAL LETTER EP, 68768 +OLD HUNGARIAN CAPITAL LETTER EMP, 68769 +OLD HUNGARIAN CAPITAL LETTER ER, 68770 +OLD HUNGARIAN CAPITAL LETTER SHORT ER, 68771 +OLD HUNGARIAN CAPITAL LETTER ES, 68772 +OLD HUNGARIAN CAPITAL LETTER ESZ, 68773 +OLD HUNGARIAN CAPITAL LETTER ET, 68774 +OLD HUNGARIAN CAPITAL LETTER ENT, 68775 +OLD HUNGARIAN CAPITAL LETTER ETY, 68776 +OLD HUNGARIAN CAPITAL LETTER ECH, 68777 +OLD HUNGARIAN CAPITAL LETTER U, 68778 +OLD HUNGARIAN CAPITAL LETTER UU, 68779 +OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE, 68780 +OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE, 68781 +OLD HUNGARIAN CAPITAL LETTER EV, 68782 +OLD HUNGARIAN CAPITAL LETTER EZ, 68783 +OLD HUNGARIAN CAPITAL LETTER EZS, 68784 +OLD HUNGARIAN CAPITAL LETTER ENT SHAPED SIGN, 68785 +OLD HUNGARIAN CAPITAL LETTER US, 68786 +OLD HUNGARIAN SMALL LETTER A, 68800 +OLD HUNGARIAN SMALL LETTER AA, 68801 +OLD HUNGARIAN SMALL LETTER EB, 68802 +OLD HUNGARIAN SMALL LETTER AMB, 68803 +OLD HUNGARIAN SMALL LETTER EC, 68804 +OLD HUNGARIAN SMALL LETTER ENC, 68805 +OLD HUNGARIAN SMALL LETTER ECS, 68806 +OLD HUNGARIAN SMALL LETTER ED, 68807 +OLD HUNGARIAN SMALL LETTER AND, 68808 +OLD HUNGARIAN SMALL LETTER E, 68809 +OLD HUNGARIAN SMALL LETTER CLOSE E, 68810 +OLD HUNGARIAN SMALL LETTER EE, 68811 +OLD HUNGARIAN SMALL LETTER EF, 68812 +OLD HUNGARIAN SMALL LETTER EG, 68813 +OLD HUNGARIAN SMALL LETTER EGY, 68814 +OLD HUNGARIAN SMALL LETTER EH, 68815 +OLD HUNGARIAN SMALL LETTER I, 68816 +OLD HUNGARIAN SMALL LETTER II, 68817 +OLD HUNGARIAN SMALL LETTER EJ, 68818 +OLD HUNGARIAN SMALL LETTER EK, 68819 +OLD HUNGARIAN SMALL LETTER AK, 68820 +OLD HUNGARIAN SMALL LETTER UNK, 68821 +OLD HUNGARIAN SMALL LETTER EL, 68822 +OLD HUNGARIAN SMALL LETTER ELY, 68823 +OLD HUNGARIAN SMALL LETTER EM, 68824 +OLD HUNGARIAN SMALL LETTER EN, 68825 +OLD HUNGARIAN SMALL LETTER ENY, 68826 +OLD HUNGARIAN SMALL LETTER O, 68827 +OLD HUNGARIAN SMALL LETTER OO, 68828 +OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE, 68829 +OLD HUNGARIAN SMALL LETTER RUDIMENTA OE, 68830 +OLD HUNGARIAN SMALL LETTER OEE, 68831 +OLD HUNGARIAN SMALL LETTER EP, 68832 +OLD HUNGARIAN SMALL LETTER EMP, 68833 +OLD HUNGARIAN SMALL LETTER ER, 68834 +OLD HUNGARIAN SMALL LETTER SHORT ER, 68835 +OLD HUNGARIAN SMALL LETTER ES, 68836 +OLD HUNGARIAN SMALL LETTER ESZ, 68837 +OLD HUNGARIAN SMALL LETTER ET, 68838 +OLD HUNGARIAN SMALL LETTER ENT, 68839 +OLD HUNGARIAN SMALL LETTER ETY, 68840 +OLD HUNGARIAN SMALL LETTER ECH, 68841 +OLD HUNGARIAN SMALL LETTER U, 68842 +OLD HUNGARIAN SMALL LETTER UU, 68843 +OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE, 68844 +OLD HUNGARIAN SMALL LETTER RUDIMENTA UE, 68845 +OLD HUNGARIAN SMALL LETTER EV, 68846 +OLD HUNGARIAN SMALL LETTER EZ, 68847 +OLD HUNGARIAN SMALL LETTER EZS, 68848 +OLD HUNGARIAN SMALL LETTER ENT SHAPED SIGN, 68849 +OLD HUNGARIAN SMALL LETTER US, 68850 +OLD HUNGARIAN NUMBER ONE, 68858 +OLD HUNGARIAN NUMBER FIVE, 68859 +OLD HUNGARIAN NUMBER TEN, 68860 +OLD HUNGARIAN NUMBER FIFTY, 68861 +OLD HUNGARIAN NUMBER ONE HUNDRED, 68862 +OLD HUNGARIAN NUMBER ONE THOUSAND, 68863 +RUMI DIGIT ONE, 69216 +RUMI DIGIT TWO, 69217 +RUMI DIGIT THREE, 69218 +RUMI DIGIT FOUR, 69219 +RUMI DIGIT FIVE, 69220 +RUMI DIGIT SIX, 69221 +RUMI DIGIT SEVEN, 69222 +RUMI DIGIT EIGHT, 69223 +RUMI DIGIT NINE, 69224 +RUMI NUMBER TEN, 69225 +RUMI NUMBER TWENTY, 69226 +RUMI NUMBER THIRTY, 69227 +RUMI NUMBER FORTY, 69228 +RUMI NUMBER FIFTY, 69229 +RUMI NUMBER SIXTY, 69230 +RUMI NUMBER SEVENTY, 69231 +RUMI NUMBER EIGHTY, 69232 +RUMI NUMBER NINETY, 69233 +RUMI NUMBER ONE HUNDRED, 69234 +RUMI NUMBER TWO HUNDRED, 69235 +RUMI NUMBER THREE HUNDRED, 69236 +RUMI NUMBER FOUR HUNDRED, 69237 +RUMI NUMBER FIVE HUNDRED, 69238 +RUMI NUMBER SIX HUNDRED, 69239 +RUMI NUMBER SEVEN HUNDRED, 69240 +RUMI NUMBER EIGHT HUNDRED, 69241 +RUMI NUMBER NINE HUNDRED, 69242 +RUMI FRACTION ONE HALF, 69243 +RUMI FRACTION ONE QUARTER, 69244 +RUMI FRACTION ONE THIRD, 69245 +RUMI FRACTION TWO THIRDS, 69246 +BRAHMI SIGN CANDRABINDU, 69632 +BRAHMI SIGN ANUSVARA, 69633 +BRAHMI SIGN VISARGA, 69634 +BRAHMI SIGN JIHVAMULIYA, 69635 +BRAHMI SIGN UPADHMANIYA, 69636 +BRAHMI LETTER A, 69637 +BRAHMI LETTER AA, 69638 +BRAHMI LETTER I, 69639 +BRAHMI LETTER II, 69640 +BRAHMI LETTER U, 69641 +BRAHMI LETTER UU, 69642 +BRAHMI LETTER VOCALIC R, 69643 +BRAHMI LETTER VOCALIC RR, 69644 +BRAHMI LETTER VOCALIC L, 69645 +BRAHMI LETTER VOCALIC LL, 69646 +BRAHMI LETTER E, 69647 +BRAHMI LETTER AI, 69648 +BRAHMI LETTER O, 69649 +BRAHMI LETTER AU, 69650 +BRAHMI LETTER KA, 69651 +BRAHMI LETTER KHA, 69652 +BRAHMI LETTER GA, 69653 +BRAHMI LETTER GHA, 69654 +BRAHMI LETTER NGA, 69655 +BRAHMI LETTER CA, 69656 +BRAHMI LETTER CHA, 69657 +BRAHMI LETTER JA, 69658 +BRAHMI LETTER JHA, 69659 +BRAHMI LETTER NYA, 69660 +BRAHMI LETTER TTA, 69661 +BRAHMI LETTER TTHA, 69662 +BRAHMI LETTER DDA, 69663 +BRAHMI LETTER DDHA, 69664 +BRAHMI LETTER NNA, 69665 +BRAHMI LETTER TA, 69666 +BRAHMI LETTER THA, 69667 +BRAHMI LETTER DA, 69668 +BRAHMI LETTER DHA, 69669 +BRAHMI LETTER NA, 69670 +BRAHMI LETTER PA, 69671 +BRAHMI LETTER PHA, 69672 +BRAHMI LETTER BA, 69673 +BRAHMI LETTER BHA, 69674 +BRAHMI LETTER MA, 69675 +BRAHMI LETTER YA, 69676 +BRAHMI LETTER RA, 69677 +BRAHMI LETTER LA, 69678 +BRAHMI LETTER VA, 69679 +BRAHMI LETTER SHA, 69680 +BRAHMI LETTER SSA, 69681 +BRAHMI LETTER SA, 69682 +BRAHMI LETTER HA, 69683 +BRAHMI LETTER LLA, 69684 +BRAHMI LETTER OLD TAMIL LLLA, 69685 +BRAHMI LETTER OLD TAMIL RRA, 69686 +BRAHMI LETTER OLD TAMIL NNNA, 69687 +BRAHMI VOWEL SIGN AA, 69688 +BRAHMI VOWEL SIGN BHATTIPROLU AA, 69689 +BRAHMI VOWEL SIGN I, 69690 +BRAHMI VOWEL SIGN II, 69691 +BRAHMI VOWEL SIGN U, 69692 +BRAHMI VOWEL SIGN UU, 69693 +BRAHMI VOWEL SIGN VOCALIC R, 69694 +BRAHMI VOWEL SIGN VOCALIC RR, 69695 +BRAHMI VOWEL SIGN VOCALIC L, 69696 +BRAHMI VOWEL SIGN VOCALIC LL, 69697 +BRAHMI VOWEL SIGN E, 69698 +BRAHMI VOWEL SIGN AI, 69699 +BRAHMI VOWEL SIGN O, 69700 +BRAHMI VOWEL SIGN AU, 69701 +BRAHMI VIRAMA, 69702 +BRAHMI DANDA, 69703 +BRAHMI DOUBLE DANDA, 69704 +BRAHMI PUNCTUATION DOT, 69705 +BRAHMI PUNCTUATION DOUBLE DOT, 69706 +BRAHMI PUNCTUATION LINE, 69707 +BRAHMI PUNCTUATION CRESCENT BAR, 69708 +BRAHMI PUNCTUATION LOTUS, 69709 +BRAHMI NUMBER ONE, 69714 +BRAHMI NUMBER TWO, 69715 +BRAHMI NUMBER THREE, 69716 +BRAHMI NUMBER FOUR, 69717 +BRAHMI NUMBER FIVE, 69718 +BRAHMI NUMBER SIX, 69719 +BRAHMI NUMBER SEVEN, 69720 +BRAHMI NUMBER EIGHT, 69721 +BRAHMI NUMBER NINE, 69722 +BRAHMI NUMBER TEN, 69723 +BRAHMI NUMBER TWENTY, 69724 +BRAHMI NUMBER THIRTY, 69725 +BRAHMI NUMBER FORTY, 69726 +BRAHMI NUMBER FIFTY, 69727 +BRAHMI NUMBER SIXTY, 69728 +BRAHMI NUMBER SEVENTY, 69729 +BRAHMI NUMBER EIGHTY, 69730 +BRAHMI NUMBER NINETY, 69731 +BRAHMI NUMBER ONE HUNDRED, 69732 +BRAHMI NUMBER ONE THOUSAND, 69733 +BRAHMI DIGIT ZERO, 69734 +BRAHMI DIGIT ONE, 69735 +BRAHMI DIGIT TWO, 69736 +BRAHMI DIGIT THREE, 69737 +BRAHMI DIGIT FOUR, 69738 +BRAHMI DIGIT FIVE, 69739 +BRAHMI DIGIT SIX, 69740 +BRAHMI DIGIT SEVEN, 69741 +BRAHMI DIGIT EIGHT, 69742 +BRAHMI DIGIT NINE, 69743 +BRAHMI NUMBER JOINER, 69759 +KAITHI SIGN CANDRABINDU, 69760 +KAITHI SIGN ANUSVARA, 69761 +KAITHI SIGN VISARGA, 69762 +KAITHI LETTER A, 69763 +KAITHI LETTER AA, 69764 +KAITHI LETTER I, 69765 +KAITHI LETTER II, 69766 +KAITHI LETTER U, 69767 +KAITHI LETTER UU, 69768 +KAITHI LETTER E, 69769 +KAITHI LETTER AI, 69770 +KAITHI LETTER O, 69771 +KAITHI LETTER AU, 69772 +KAITHI LETTER KA, 69773 +KAITHI LETTER KHA, 69774 +KAITHI LETTER GA, 69775 +KAITHI LETTER GHA, 69776 +KAITHI LETTER NGA, 69777 +KAITHI LETTER CA, 69778 +KAITHI LETTER CHA, 69779 +KAITHI LETTER JA, 69780 +KAITHI LETTER JHA, 69781 +KAITHI LETTER NYA, 69782 +KAITHI LETTER TTA, 69783 +KAITHI LETTER TTHA, 69784 +KAITHI LETTER DDA, 69785 +KAITHI LETTER DDDHA, 69786 +KAITHI LETTER DDHA, 69787 +KAITHI LETTER RHA, 69788 +KAITHI LETTER NNA, 69789 +KAITHI LETTER TA, 69790 +KAITHI LETTER THA, 69791 +KAITHI LETTER DA, 69792 +KAITHI LETTER DHA, 69793 +KAITHI LETTER NA, 69794 +KAITHI LETTER PA, 69795 +KAITHI LETTER PHA, 69796 +KAITHI LETTER BA, 69797 +KAITHI LETTER BHA, 69798 +KAITHI LETTER MA, 69799 +KAITHI LETTER YA, 69800 +KAITHI LETTER RA, 69801 +KAITHI LETTER LA, 69802 +KAITHI LETTER VA, 69803 +KAITHI LETTER SHA, 69804 +KAITHI LETTER SSA, 69805 +KAITHI LETTER SA, 69806 +KAITHI LETTER HA, 69807 +KAITHI VOWEL SIGN AA, 69808 +KAITHI VOWEL SIGN I, 69809 +KAITHI VOWEL SIGN II, 69810 +KAITHI VOWEL SIGN U, 69811 +KAITHI VOWEL SIGN UU, 69812 +KAITHI VOWEL SIGN E, 69813 +KAITHI VOWEL SIGN AI, 69814 +KAITHI VOWEL SIGN O, 69815 +KAITHI VOWEL SIGN AU, 69816 +KAITHI SIGN VIRAMA, 69817 +KAITHI SIGN NUKTA, 69818 +KAITHI ABBREVIATION SIGN, 69819 +KAITHI ENUMERATION SIGN, 69820 +KAITHI NUMBER SIGN, 69821 +KAITHI SECTION MARK, 69822 +KAITHI DOUBLE SECTION MARK, 69823 +KAITHI DANDA, 69824 +KAITHI DOUBLE DANDA, 69825 +SORA SOMPENG LETTER SAH, 69840 +SORA SOMPENG LETTER TAH, 69841 +SORA SOMPENG LETTER BAH, 69842 +SORA SOMPENG LETTER CAH, 69843 +SORA SOMPENG LETTER DAH, 69844 +SORA SOMPENG LETTER GAH, 69845 +SORA SOMPENG LETTER MAH, 69846 +SORA SOMPENG LETTER NGAH, 69847 +SORA SOMPENG LETTER LAH, 69848 +SORA SOMPENG LETTER NAH, 69849 +SORA SOMPENG LETTER VAH, 69850 +SORA SOMPENG LETTER PAH, 69851 +SORA SOMPENG LETTER YAH, 69852 +SORA SOMPENG LETTER RAH, 69853 +SORA SOMPENG LETTER HAH, 69854 +SORA SOMPENG LETTER KAH, 69855 +SORA SOMPENG LETTER JAH, 69856 +SORA SOMPENG LETTER NYAH, 69857 +SORA SOMPENG LETTER AH, 69858 +SORA SOMPENG LETTER EEH, 69859 +SORA SOMPENG LETTER IH, 69860 +SORA SOMPENG LETTER UH, 69861 +SORA SOMPENG LETTER OH, 69862 +SORA SOMPENG LETTER EH, 69863 +SORA SOMPENG LETTER MAE, 69864 +SORA SOMPENG DIGIT ZERO, 69872 +SORA SOMPENG DIGIT ONE, 69873 +SORA SOMPENG DIGIT TWO, 69874 +SORA SOMPENG DIGIT THREE, 69875 +SORA SOMPENG DIGIT FOUR, 69876 +SORA SOMPENG DIGIT FIVE, 69877 +SORA SOMPENG DIGIT SIX, 69878 +SORA SOMPENG DIGIT SEVEN, 69879 +SORA SOMPENG DIGIT EIGHT, 69880 +SORA SOMPENG DIGIT NINE, 69881 +CHAKMA SIGN CANDRABINDU, 69888 +CHAKMA SIGN ANUSVARA, 69889 +CHAKMA SIGN VISARGA, 69890 +CHAKMA LETTER AA, 69891 +CHAKMA LETTER I, 69892 +CHAKMA LETTER U, 69893 +CHAKMA LETTER E, 69894 +CHAKMA LETTER KAA, 69895 +CHAKMA LETTER KHAA, 69896 +CHAKMA LETTER GAA, 69897 +CHAKMA LETTER GHAA, 69898 +CHAKMA LETTER NGAA, 69899 +CHAKMA LETTER CAA, 69900 +CHAKMA LETTER CHAA, 69901 +CHAKMA LETTER JAA, 69902 +CHAKMA LETTER JHAA, 69903 +CHAKMA LETTER NYAA, 69904 +CHAKMA LETTER TTAA, 69905 +CHAKMA LETTER TTHAA, 69906 +CHAKMA LETTER DDAA, 69907 +CHAKMA LETTER DDHAA, 69908 +CHAKMA LETTER NNAA, 69909 +CHAKMA LETTER TAA, 69910 +CHAKMA LETTER THAA, 69911 +CHAKMA LETTER DAA, 69912 +CHAKMA LETTER DHAA, 69913 +CHAKMA LETTER NAA, 69914 +CHAKMA LETTER PAA, 69915 +CHAKMA LETTER PHAA, 69916 +CHAKMA LETTER BAA, 69917 +CHAKMA LETTER BHAA, 69918 +CHAKMA LETTER MAA, 69919 +CHAKMA LETTER YYAA, 69920 +CHAKMA LETTER YAA, 69921 +CHAKMA LETTER RAA, 69922 +CHAKMA LETTER LAA, 69923 +CHAKMA LETTER WAA, 69924 +CHAKMA LETTER SAA, 69925 +CHAKMA LETTER HAA, 69926 +CHAKMA VOWEL SIGN A, 69927 +CHAKMA VOWEL SIGN I, 69928 +CHAKMA VOWEL SIGN II, 69929 +CHAKMA VOWEL SIGN U, 69930 +CHAKMA VOWEL SIGN UU, 69931 +CHAKMA VOWEL SIGN E, 69932 +CHAKMA VOWEL SIGN AI, 69933 +CHAKMA VOWEL SIGN O, 69934 +CHAKMA VOWEL SIGN AU, 69935 +CHAKMA VOWEL SIGN OI, 69936 +CHAKMA O MARK, 69937 +CHAKMA AU MARK, 69938 +CHAKMA VIRAMA, 69939 +CHAKMA MAAYYAA, 69940 +CHAKMA DIGIT ZERO, 69942 +CHAKMA DIGIT ONE, 69943 +CHAKMA DIGIT TWO, 69944 +CHAKMA DIGIT THREE, 69945 +CHAKMA DIGIT FOUR, 69946 +CHAKMA DIGIT FIVE, 69947 +CHAKMA DIGIT SIX, 69948 +CHAKMA DIGIT SEVEN, 69949 +CHAKMA DIGIT EIGHT, 69950 +CHAKMA DIGIT NINE, 69951 +CHAKMA SECTION MARK, 69952 +CHAKMA DANDA, 69953 +CHAKMA DOUBLE DANDA, 69954 +CHAKMA QUESTION MARK, 69955 +MAHAJANI LETTER A, 69968 +MAHAJANI LETTER I, 69969 +MAHAJANI LETTER U, 69970 +MAHAJANI LETTER E, 69971 +MAHAJANI LETTER O, 69972 +MAHAJANI LETTER KA, 69973 +MAHAJANI LETTER KHA, 69974 +MAHAJANI LETTER GA, 69975 +MAHAJANI LETTER GHA, 69976 +MAHAJANI LETTER CA, 69977 +MAHAJANI LETTER CHA, 69978 +MAHAJANI LETTER JA, 69979 +MAHAJANI LETTER JHA, 69980 +MAHAJANI LETTER NYA, 69981 +MAHAJANI LETTER TTA, 69982 +MAHAJANI LETTER TTHA, 69983 +MAHAJANI LETTER DDA, 69984 +MAHAJANI LETTER DDHA, 69985 +MAHAJANI LETTER NNA, 69986 +MAHAJANI LETTER TA, 69987 +MAHAJANI LETTER THA, 69988 +MAHAJANI LETTER DA, 69989 +MAHAJANI LETTER DHA, 69990 +MAHAJANI LETTER NA, 69991 +MAHAJANI LETTER PA, 69992 +MAHAJANI LETTER PHA, 69993 +MAHAJANI LETTER BA, 69994 +MAHAJANI LETTER BHA, 69995 +MAHAJANI LETTER MA, 69996 +MAHAJANI LETTER RA, 69997 +MAHAJANI LETTER LA, 69998 +MAHAJANI LETTER VA, 69999 +MAHAJANI LETTER SA, 70000 +MAHAJANI LETTER HA, 70001 +MAHAJANI LETTER RRA, 70002 +MAHAJANI SIGN NUKTA, 70003 +MAHAJANI ABBREVIATION SIGN, 70004 +MAHAJANI SECTION MARK, 70005 +MAHAJANI LIGATURE SHRI, 70006 +SHARADA SIGN CANDRABINDU, 70016 +SHARADA SIGN ANUSVARA, 70017 +SHARADA SIGN VISARGA, 70018 +SHARADA LETTER A, 70019 +SHARADA LETTER AA, 70020 +SHARADA LETTER I, 70021 +SHARADA LETTER II, 70022 +SHARADA LETTER U, 70023 +SHARADA LETTER UU, 70024 +SHARADA LETTER VOCALIC R, 70025 +SHARADA LETTER VOCALIC RR, 70026 +SHARADA LETTER VOCALIC L, 70027 +SHARADA LETTER VOCALIC LL, 70028 +SHARADA LETTER E, 70029 +SHARADA LETTER AI, 70030 +SHARADA LETTER O, 70031 +SHARADA LETTER AU, 70032 +SHARADA LETTER KA, 70033 +SHARADA LETTER KHA, 70034 +SHARADA LETTER GA, 70035 +SHARADA LETTER GHA, 70036 +SHARADA LETTER NGA, 70037 +SHARADA LETTER CA, 70038 +SHARADA LETTER CHA, 70039 +SHARADA LETTER JA, 70040 +SHARADA LETTER JHA, 70041 +SHARADA LETTER NYA, 70042 +SHARADA LETTER TTA, 70043 +SHARADA LETTER TTHA, 70044 +SHARADA LETTER DDA, 70045 +SHARADA LETTER DDHA, 70046 +SHARADA LETTER NNA, 70047 +SHARADA LETTER TA, 70048 +SHARADA LETTER THA, 70049 +SHARADA LETTER DA, 70050 +SHARADA LETTER DHA, 70051 +SHARADA LETTER NA, 70052 +SHARADA LETTER PA, 70053 +SHARADA LETTER PHA, 70054 +SHARADA LETTER BA, 70055 +SHARADA LETTER BHA, 70056 +SHARADA LETTER MA, 70057 +SHARADA LETTER YA, 70058 +SHARADA LETTER RA, 70059 +SHARADA LETTER LA, 70060 +SHARADA LETTER LLA, 70061 +SHARADA LETTER VA, 70062 +SHARADA LETTER SHA, 70063 +SHARADA LETTER SSA, 70064 +SHARADA LETTER SA, 70065 +SHARADA LETTER HA, 70066 +SHARADA VOWEL SIGN AA, 70067 +SHARADA VOWEL SIGN I, 70068 +SHARADA VOWEL SIGN II, 70069 +SHARADA VOWEL SIGN U, 70070 +SHARADA VOWEL SIGN UU, 70071 +SHARADA VOWEL SIGN VOCALIC R, 70072 +SHARADA VOWEL SIGN VOCALIC RR, 70073 +SHARADA VOWEL SIGN VOCALIC L, 70074 +SHARADA VOWEL SIGN VOCALIC LL, 70075 +SHARADA VOWEL SIGN E, 70076 +SHARADA VOWEL SIGN AI, 70077 +SHARADA VOWEL SIGN O, 70078 +SHARADA VOWEL SIGN AU, 70079 +SHARADA SIGN VIRAMA, 70080 +SHARADA SIGN AVAGRAHA, 70081 +SHARADA SIGN JIHVAMULIYA, 70082 +SHARADA SIGN UPADHMANIYA, 70083 +SHARADA OM, 70084 +SHARADA DANDA, 70085 +SHARADA DOUBLE DANDA, 70086 +SHARADA ABBREVIATION SIGN, 70087 +SHARADA SEPARATOR, 70088 +SHARADA SANDHI MARK, 70089 +SHARADA SIGN NUKTA, 70090 +SHARADA VOWEL MODIFIER MARK, 70091 +SHARADA EXTRA SHORT VOWEL MARK, 70092 +SHARADA SUTRA MARK, 70093 +SHARADA DIGIT ZERO, 70096 +SHARADA DIGIT ONE, 70097 +SHARADA DIGIT TWO, 70098 +SHARADA DIGIT THREE, 70099 +SHARADA DIGIT FOUR, 70100 +SHARADA DIGIT FIVE, 70101 +SHARADA DIGIT SIX, 70102 +SHARADA DIGIT SEVEN, 70103 +SHARADA DIGIT EIGHT, 70104 +SHARADA DIGIT NINE, 70105 +SHARADA EKAM, 70106 +SHARADA SIGN SIDDHAM, 70107 +SHARADA HEADSTROKE, 70108 +SHARADA CONTINUATION SIGN, 70109 +SHARADA SECTION MARK 1, 70110 +SHARADA SECTION MARK 2, 70111 +SINHALA ARCHAIC DIGIT ONE, 70113 +SINHALA ARCHAIC DIGIT TWO, 70114 +SINHALA ARCHAIC DIGIT THREE, 70115 +SINHALA ARCHAIC DIGIT FOUR, 70116 +SINHALA ARCHAIC DIGIT FIVE, 70117 +SINHALA ARCHAIC DIGIT SIX, 70118 +SINHALA ARCHAIC DIGIT SEVEN, 70119 +SINHALA ARCHAIC DIGIT EIGHT, 70120 +SINHALA ARCHAIC DIGIT NINE, 70121 +SINHALA ARCHAIC NUMBER TEN, 70122 +SINHALA ARCHAIC NUMBER TWENTY, 70123 +SINHALA ARCHAIC NUMBER THIRTY, 70124 +SINHALA ARCHAIC NUMBER FORTY, 70125 +SINHALA ARCHAIC NUMBER FIFTY, 70126 +SINHALA ARCHAIC NUMBER SIXTY, 70127 +SINHALA ARCHAIC NUMBER SEVENTY, 70128 +SINHALA ARCHAIC NUMBER EIGHTY, 70129 +SINHALA ARCHAIC NUMBER NINETY, 70130 +SINHALA ARCHAIC NUMBER ONE HUNDRED, 70131 +SINHALA ARCHAIC NUMBER ONE THOUSAND, 70132 +KHOJKI LETTER A, 70144 +KHOJKI LETTER AA, 70145 +KHOJKI LETTER I, 70146 +KHOJKI LETTER U, 70147 +KHOJKI LETTER E, 70148 +KHOJKI LETTER AI, 70149 +KHOJKI LETTER O, 70150 +KHOJKI LETTER AU, 70151 +KHOJKI LETTER KA, 70152 +KHOJKI LETTER KHA, 70153 +KHOJKI LETTER GA, 70154 +KHOJKI LETTER GGA, 70155 +KHOJKI LETTER GHA, 70156 +KHOJKI LETTER NGA, 70157 +KHOJKI LETTER CA, 70158 +KHOJKI LETTER CHA, 70159 +KHOJKI LETTER JA, 70160 +KHOJKI LETTER JJA, 70161 +KHOJKI LETTER NYA, 70163 +KHOJKI LETTER TTA, 70164 +KHOJKI LETTER TTHA, 70165 +KHOJKI LETTER DDA, 70166 +KHOJKI LETTER DDHA, 70167 +KHOJKI LETTER NNA, 70168 +KHOJKI LETTER TA, 70169 +KHOJKI LETTER THA, 70170 +KHOJKI LETTER DA, 70171 +KHOJKI LETTER DDDA, 70172 +KHOJKI LETTER DHA, 70173 +KHOJKI LETTER NA, 70174 +KHOJKI LETTER PA, 70175 +KHOJKI LETTER PHA, 70176 +KHOJKI LETTER BA, 70177 +KHOJKI LETTER BBA, 70178 +KHOJKI LETTER BHA, 70179 +KHOJKI LETTER MA, 70180 +KHOJKI LETTER YA, 70181 +KHOJKI LETTER RA, 70182 +KHOJKI LETTER LA, 70183 +KHOJKI LETTER VA, 70184 +KHOJKI LETTER SA, 70185 +KHOJKI LETTER HA, 70186 +KHOJKI LETTER LLA, 70187 +KHOJKI VOWEL SIGN AA, 70188 +KHOJKI VOWEL SIGN I, 70189 +KHOJKI VOWEL SIGN II, 70190 +KHOJKI VOWEL SIGN U, 70191 +KHOJKI VOWEL SIGN E, 70192 +KHOJKI VOWEL SIGN AI, 70193 +KHOJKI VOWEL SIGN O, 70194 +KHOJKI VOWEL SIGN AU, 70195 +KHOJKI SIGN ANUSVARA, 70196 +KHOJKI SIGN VIRAMA, 70197 +KHOJKI SIGN NUKTA, 70198 +KHOJKI SIGN SHADDA, 70199 +KHOJKI DANDA, 70200 +KHOJKI DOUBLE DANDA, 70201 +KHOJKI WORD SEPARATOR, 70202 +KHOJKI SECTION MARK, 70203 +KHOJKI DOUBLE SECTION MARK, 70204 +KHOJKI ABBREVIATION SIGN, 70205 +KHOJKI SIGN SUKUN, 70206 +MULTANI LETTER A, 70272 +MULTANI LETTER I, 70273 +MULTANI LETTER U, 70274 +MULTANI LETTER E, 70275 +MULTANI LETTER KA, 70276 +MULTANI LETTER KHA, 70277 +MULTANI LETTER GA, 70278 +MULTANI LETTER GHA, 70280 +MULTANI LETTER CA, 70282 +MULTANI LETTER CHA, 70283 +MULTANI LETTER JA, 70284 +MULTANI LETTER JJA, 70285 +MULTANI LETTER NYA, 70287 +MULTANI LETTER TTA, 70288 +MULTANI LETTER TTHA, 70289 +MULTANI LETTER DDA, 70290 +MULTANI LETTER DDDA, 70291 +MULTANI LETTER DDHA, 70292 +MULTANI LETTER NNA, 70293 +MULTANI LETTER TA, 70294 +MULTANI LETTER THA, 70295 +MULTANI LETTER DA, 70296 +MULTANI LETTER DHA, 70297 +MULTANI LETTER NA, 70298 +MULTANI LETTER PA, 70299 +MULTANI LETTER PHA, 70300 +MULTANI LETTER BA, 70301 +MULTANI LETTER BHA, 70303 +MULTANI LETTER MA, 70304 +MULTANI LETTER YA, 70305 +MULTANI LETTER RA, 70306 +MULTANI LETTER LA, 70307 +MULTANI LETTER VA, 70308 +MULTANI LETTER SA, 70309 +MULTANI LETTER HA, 70310 +MULTANI LETTER RRA, 70311 +MULTANI LETTER RHA, 70312 +MULTANI SECTION MARK, 70313 +KHUDAWADI LETTER A, 70320 +KHUDAWADI LETTER AA, 70321 +KHUDAWADI LETTER I, 70322 +KHUDAWADI LETTER II, 70323 +KHUDAWADI LETTER U, 70324 +KHUDAWADI LETTER UU, 70325 +KHUDAWADI LETTER E, 70326 +KHUDAWADI LETTER AI, 70327 +KHUDAWADI LETTER O, 70328 +KHUDAWADI LETTER AU, 70329 +KHUDAWADI LETTER KA, 70330 +KHUDAWADI LETTER KHA, 70331 +KHUDAWADI LETTER GA, 70332 +KHUDAWADI LETTER GGA, 70333 +KHUDAWADI LETTER GHA, 70334 +KHUDAWADI LETTER NGA, 70335 +KHUDAWADI LETTER CA, 70336 +KHUDAWADI LETTER CHA, 70337 +KHUDAWADI LETTER JA, 70338 +KHUDAWADI LETTER JJA, 70339 +KHUDAWADI LETTER JHA, 70340 +KHUDAWADI LETTER NYA, 70341 +KHUDAWADI LETTER TTA, 70342 +KHUDAWADI LETTER TTHA, 70343 +KHUDAWADI LETTER DDA, 70344 +KHUDAWADI LETTER DDDA, 70345 +KHUDAWADI LETTER RRA, 70346 +KHUDAWADI LETTER DDHA, 70347 +KHUDAWADI LETTER NNA, 70348 +KHUDAWADI LETTER TA, 70349 +KHUDAWADI LETTER THA, 70350 +KHUDAWADI LETTER DA, 70351 +KHUDAWADI LETTER DHA, 70352 +KHUDAWADI LETTER NA, 70353 +KHUDAWADI LETTER PA, 70354 +KHUDAWADI LETTER PHA, 70355 +KHUDAWADI LETTER BA, 70356 +KHUDAWADI LETTER BBA, 70357 +KHUDAWADI LETTER BHA, 70358 +KHUDAWADI LETTER MA, 70359 +KHUDAWADI LETTER YA, 70360 +KHUDAWADI LETTER RA, 70361 +KHUDAWADI LETTER LA, 70362 +KHUDAWADI LETTER VA, 70363 +KHUDAWADI LETTER SHA, 70364 +KHUDAWADI LETTER SA, 70365 +KHUDAWADI LETTER HA, 70366 +KHUDAWADI SIGN ANUSVARA, 70367 +KHUDAWADI VOWEL SIGN AA, 70368 +KHUDAWADI VOWEL SIGN I, 70369 +KHUDAWADI VOWEL SIGN II, 70370 +KHUDAWADI VOWEL SIGN U, 70371 +KHUDAWADI VOWEL SIGN UU, 70372 +KHUDAWADI VOWEL SIGN E, 70373 +KHUDAWADI VOWEL SIGN AI, 70374 +KHUDAWADI VOWEL SIGN O, 70375 +KHUDAWADI VOWEL SIGN AU, 70376 +KHUDAWADI SIGN NUKTA, 70377 +KHUDAWADI SIGN VIRAMA, 70378 +KHUDAWADI DIGIT ZERO, 70384 +KHUDAWADI DIGIT ONE, 70385 +KHUDAWADI DIGIT TWO, 70386 +KHUDAWADI DIGIT THREE, 70387 +KHUDAWADI DIGIT FOUR, 70388 +KHUDAWADI DIGIT FIVE, 70389 +KHUDAWADI DIGIT SIX, 70390 +KHUDAWADI DIGIT SEVEN, 70391 +KHUDAWADI DIGIT EIGHT, 70392 +KHUDAWADI DIGIT NINE, 70393 +GRANTHA SIGN COMBINING ANUSVARA ABOVE, 70400 +GRANTHA SIGN CANDRABINDU, 70401 +GRANTHA SIGN ANUSVARA, 70402 +GRANTHA SIGN VISARGA, 70403 +GRANTHA LETTER A, 70405 +GRANTHA LETTER AA, 70406 +GRANTHA LETTER I, 70407 +GRANTHA LETTER II, 70408 +GRANTHA LETTER U, 70409 +GRANTHA LETTER UU, 70410 +GRANTHA LETTER VOCALIC R, 70411 +GRANTHA LETTER VOCALIC L, 70412 +GRANTHA LETTER EE, 70415 +GRANTHA LETTER AI, 70416 +GRANTHA LETTER OO, 70419 +GRANTHA LETTER AU, 70420 +GRANTHA LETTER KA, 70421 +GRANTHA LETTER KHA, 70422 +GRANTHA LETTER GA, 70423 +GRANTHA LETTER GHA, 70424 +GRANTHA LETTER NGA, 70425 +GRANTHA LETTER CA, 70426 +GRANTHA LETTER CHA, 70427 +GRANTHA LETTER JA, 70428 +GRANTHA LETTER JHA, 70429 +GRANTHA LETTER NYA, 70430 +GRANTHA LETTER TTA, 70431 +GRANTHA LETTER TTHA, 70432 +GRANTHA LETTER DDA, 70433 +GRANTHA LETTER DDHA, 70434 +GRANTHA LETTER NNA, 70435 +GRANTHA LETTER TA, 70436 +GRANTHA LETTER THA, 70437 +GRANTHA LETTER DA, 70438 +GRANTHA LETTER DHA, 70439 +GRANTHA LETTER NA, 70440 +GRANTHA LETTER PA, 70442 +GRANTHA LETTER PHA, 70443 +GRANTHA LETTER BA, 70444 +GRANTHA LETTER BHA, 70445 +GRANTHA LETTER MA, 70446 +GRANTHA LETTER YA, 70447 +GRANTHA LETTER RA, 70448 +GRANTHA LETTER LA, 70450 +GRANTHA LETTER LLA, 70451 +GRANTHA LETTER VA, 70453 +GRANTHA LETTER SHA, 70454 +GRANTHA LETTER SSA, 70455 +GRANTHA LETTER SA, 70456 +GRANTHA LETTER HA, 70457 +GRANTHA SIGN NUKTA, 70460 +GRANTHA SIGN AVAGRAHA, 70461 +GRANTHA VOWEL SIGN AA, 70462 +GRANTHA VOWEL SIGN I, 70463 +GRANTHA VOWEL SIGN II, 70464 +GRANTHA VOWEL SIGN U, 70465 +GRANTHA VOWEL SIGN UU, 70466 +GRANTHA VOWEL SIGN VOCALIC R, 70467 +GRANTHA VOWEL SIGN VOCALIC RR, 70468 +GRANTHA VOWEL SIGN EE, 70471 +GRANTHA VOWEL SIGN AI, 70472 +GRANTHA VOWEL SIGN OO, 70475 +GRANTHA VOWEL SIGN AU, 70476 +GRANTHA SIGN VIRAMA, 70477 +GRANTHA OM, 70480 +GRANTHA AU LENGTH MARK, 70487 +GRANTHA SIGN PLUTA, 70493 +GRANTHA LETTER VEDIC ANUSVARA, 70494 +GRANTHA LETTER VEDIC DOUBLE ANUSVARA, 70495 +GRANTHA LETTER VOCALIC RR, 70496 +GRANTHA LETTER VOCALIC LL, 70497 +GRANTHA VOWEL SIGN VOCALIC L, 70498 +GRANTHA VOWEL SIGN VOCALIC LL, 70499 +COMBINING GRANTHA DIGIT ZERO, 70502 +COMBINING GRANTHA DIGIT ONE, 70503 +COMBINING GRANTHA DIGIT TWO, 70504 +COMBINING GRANTHA DIGIT THREE, 70505 +COMBINING GRANTHA DIGIT FOUR, 70506 +COMBINING GRANTHA DIGIT FIVE, 70507 +COMBINING GRANTHA DIGIT SIX, 70508 +COMBINING GRANTHA LETTER A, 70512 +COMBINING GRANTHA LETTER KA, 70513 +COMBINING GRANTHA LETTER NA, 70514 +COMBINING GRANTHA LETTER VI, 70515 +COMBINING GRANTHA LETTER PA, 70516 +NEWA LETTER A, 70656 +NEWA LETTER AA, 70657 +NEWA LETTER I, 70658 +NEWA LETTER II, 70659 +NEWA LETTER U, 70660 +NEWA LETTER UU, 70661 +NEWA LETTER VOCALIC R, 70662 +NEWA LETTER VOCALIC RR, 70663 +NEWA LETTER VOCALIC L, 70664 +NEWA LETTER VOCALIC LL, 70665 +NEWA LETTER E, 70666 +NEWA LETTER AI, 70667 +NEWA LETTER O, 70668 +NEWA LETTER AU, 70669 +NEWA LETTER KA, 70670 +NEWA LETTER KHA, 70671 +NEWA LETTER GA, 70672 +NEWA LETTER GHA, 70673 +NEWA LETTER NGA, 70674 +NEWA LETTER NGHA, 70675 +NEWA LETTER CA, 70676 +NEWA LETTER CHA, 70677 +NEWA LETTER JA, 70678 +NEWA LETTER JHA, 70679 +NEWA LETTER NYA, 70680 +NEWA LETTER NYHA, 70681 +NEWA LETTER TTA, 70682 +NEWA LETTER TTHA, 70683 +NEWA LETTER DDA, 70684 +NEWA LETTER DDHA, 70685 +NEWA LETTER NNA, 70686 +NEWA LETTER TA, 70687 +NEWA LETTER THA, 70688 +NEWA LETTER DA, 70689 +NEWA LETTER DHA, 70690 +NEWA LETTER NA, 70691 +NEWA LETTER NHA, 70692 +NEWA LETTER PA, 70693 +NEWA LETTER PHA, 70694 +NEWA LETTER BA, 70695 +NEWA LETTER BHA, 70696 +NEWA LETTER MA, 70697 +NEWA LETTER MHA, 70698 +NEWA LETTER YA, 70699 +NEWA LETTER RA, 70700 +NEWA LETTER RHA, 70701 +NEWA LETTER LA, 70702 +NEWA LETTER LHA, 70703 +NEWA LETTER WA, 70704 +NEWA LETTER SHA, 70705 +NEWA LETTER SSA, 70706 +NEWA LETTER SA, 70707 +NEWA LETTER HA, 70708 +NEWA VOWEL SIGN AA, 70709 +NEWA VOWEL SIGN I, 70710 +NEWA VOWEL SIGN II, 70711 +NEWA VOWEL SIGN U, 70712 +NEWA VOWEL SIGN UU, 70713 +NEWA VOWEL SIGN VOCALIC R, 70714 +NEWA VOWEL SIGN VOCALIC RR, 70715 +NEWA VOWEL SIGN VOCALIC L, 70716 +NEWA VOWEL SIGN VOCALIC LL, 70717 +NEWA VOWEL SIGN E, 70718 +NEWA VOWEL SIGN AI, 70719 +NEWA VOWEL SIGN O, 70720 +NEWA VOWEL SIGN AU, 70721 +NEWA SIGN VIRAMA, 70722 +NEWA SIGN CANDRABINDU, 70723 +NEWA SIGN ANUSVARA, 70724 +NEWA SIGN VISARGA, 70725 +NEWA SIGN NUKTA, 70726 +NEWA SIGN AVAGRAHA, 70727 +NEWA SIGN FINAL ANUSVARA, 70728 +NEWA OM, 70729 +NEWA SIDDHI, 70730 +NEWA DANDA, 70731 +NEWA DOUBLE DANDA, 70732 +NEWA COMMA, 70733 +NEWA GAP FILLER, 70734 +NEWA ABBREVIATION SIGN, 70735 +NEWA DIGIT ZERO, 70736 +NEWA DIGIT ONE, 70737 +NEWA DIGIT TWO, 70738 +NEWA DIGIT THREE, 70739 +NEWA DIGIT FOUR, 70740 +NEWA DIGIT FIVE, 70741 +NEWA DIGIT SIX, 70742 +NEWA DIGIT SEVEN, 70743 +NEWA DIGIT EIGHT, 70744 +NEWA DIGIT NINE, 70745 +NEWA PLACEHOLDER MARK, 70747 +NEWA INSERTION SIGN, 70749 +TIRHUTA ANJI, 70784 +TIRHUTA LETTER A, 70785 +TIRHUTA LETTER AA, 70786 +TIRHUTA LETTER I, 70787 +TIRHUTA LETTER II, 70788 +TIRHUTA LETTER U, 70789 +TIRHUTA LETTER UU, 70790 +TIRHUTA LETTER VOCALIC R, 70791 +TIRHUTA LETTER VOCALIC RR, 70792 +TIRHUTA LETTER VOCALIC L, 70793 +TIRHUTA LETTER VOCALIC LL, 70794 +TIRHUTA LETTER E, 70795 +TIRHUTA LETTER AI, 70796 +TIRHUTA LETTER O, 70797 +TIRHUTA LETTER AU, 70798 +TIRHUTA LETTER KA, 70799 +TIRHUTA LETTER KHA, 70800 +TIRHUTA LETTER GA, 70801 +TIRHUTA LETTER GHA, 70802 +TIRHUTA LETTER NGA, 70803 +TIRHUTA LETTER CA, 70804 +TIRHUTA LETTER CHA, 70805 +TIRHUTA LETTER JA, 70806 +TIRHUTA LETTER JHA, 70807 +TIRHUTA LETTER NYA, 70808 +TIRHUTA LETTER TTA, 70809 +TIRHUTA LETTER TTHA, 70810 +TIRHUTA LETTER DDA, 70811 +TIRHUTA LETTER DDHA, 70812 +TIRHUTA LETTER NNA, 70813 +TIRHUTA LETTER TA, 70814 +TIRHUTA LETTER THA, 70815 +TIRHUTA LETTER DA, 70816 +TIRHUTA LETTER DHA, 70817 +TIRHUTA LETTER NA, 70818 +TIRHUTA LETTER PA, 70819 +TIRHUTA LETTER PHA, 70820 +TIRHUTA LETTER BA, 70821 +TIRHUTA LETTER BHA, 70822 +TIRHUTA LETTER MA, 70823 +TIRHUTA LETTER YA, 70824 +TIRHUTA LETTER RA, 70825 +TIRHUTA LETTER LA, 70826 +TIRHUTA LETTER VA, 70827 +TIRHUTA LETTER SHA, 70828 +TIRHUTA LETTER SSA, 70829 +TIRHUTA LETTER SA, 70830 +TIRHUTA LETTER HA, 70831 +TIRHUTA VOWEL SIGN AA, 70832 +TIRHUTA VOWEL SIGN I, 70833 +TIRHUTA VOWEL SIGN II, 70834 +TIRHUTA VOWEL SIGN U, 70835 +TIRHUTA VOWEL SIGN UU, 70836 +TIRHUTA VOWEL SIGN VOCALIC R, 70837 +TIRHUTA VOWEL SIGN VOCALIC RR, 70838 +TIRHUTA VOWEL SIGN VOCALIC L, 70839 +TIRHUTA VOWEL SIGN VOCALIC LL, 70840 +TIRHUTA VOWEL SIGN E, 70841 +TIRHUTA VOWEL SIGN SHORT E, 70842 +TIRHUTA VOWEL SIGN AI, 70843 +TIRHUTA VOWEL SIGN O, 70844 +TIRHUTA VOWEL SIGN SHORT O, 70845 +TIRHUTA VOWEL SIGN AU, 70846 +TIRHUTA SIGN CANDRABINDU, 70847 +TIRHUTA SIGN ANUSVARA, 70848 +TIRHUTA SIGN VISARGA, 70849 +TIRHUTA SIGN VIRAMA, 70850 +TIRHUTA SIGN NUKTA, 70851 +TIRHUTA SIGN AVAGRAHA, 70852 +TIRHUTA GVANG, 70853 +TIRHUTA ABBREVIATION SIGN, 70854 +TIRHUTA OM, 70855 +TIRHUTA DIGIT ZERO, 70864 +TIRHUTA DIGIT ONE, 70865 +TIRHUTA DIGIT TWO, 70866 +TIRHUTA DIGIT THREE, 70867 +TIRHUTA DIGIT FOUR, 70868 +TIRHUTA DIGIT FIVE, 70869 +TIRHUTA DIGIT SIX, 70870 +TIRHUTA DIGIT SEVEN, 70871 +TIRHUTA DIGIT EIGHT, 70872 +TIRHUTA DIGIT NINE, 70873 +SIDDHAM LETTER A, 71040 +SIDDHAM LETTER AA, 71041 +SIDDHAM LETTER I, 71042 +SIDDHAM LETTER II, 71043 +SIDDHAM LETTER U, 71044 +SIDDHAM LETTER UU, 71045 +SIDDHAM LETTER VOCALIC R, 71046 +SIDDHAM LETTER VOCALIC RR, 71047 +SIDDHAM LETTER VOCALIC L, 71048 +SIDDHAM LETTER VOCALIC LL, 71049 +SIDDHAM LETTER E, 71050 +SIDDHAM LETTER AI, 71051 +SIDDHAM LETTER O, 71052 +SIDDHAM LETTER AU, 71053 +SIDDHAM LETTER KA, 71054 +SIDDHAM LETTER KHA, 71055 +SIDDHAM LETTER GA, 71056 +SIDDHAM LETTER GHA, 71057 +SIDDHAM LETTER NGA, 71058 +SIDDHAM LETTER CA, 71059 +SIDDHAM LETTER CHA, 71060 +SIDDHAM LETTER JA, 71061 +SIDDHAM LETTER JHA, 71062 +SIDDHAM LETTER NYA, 71063 +SIDDHAM LETTER TTA, 71064 +SIDDHAM LETTER TTHA, 71065 +SIDDHAM LETTER DDA, 71066 +SIDDHAM LETTER DDHA, 71067 +SIDDHAM LETTER NNA, 71068 +SIDDHAM LETTER TA, 71069 +SIDDHAM LETTER THA, 71070 +SIDDHAM LETTER DA, 71071 +SIDDHAM LETTER DHA, 71072 +SIDDHAM LETTER NA, 71073 +SIDDHAM LETTER PA, 71074 +SIDDHAM LETTER PHA, 71075 +SIDDHAM LETTER BA, 71076 +SIDDHAM LETTER BHA, 71077 +SIDDHAM LETTER MA, 71078 +SIDDHAM LETTER YA, 71079 +SIDDHAM LETTER RA, 71080 +SIDDHAM LETTER LA, 71081 +SIDDHAM LETTER VA, 71082 +SIDDHAM LETTER SHA, 71083 +SIDDHAM LETTER SSA, 71084 +SIDDHAM LETTER SA, 71085 +SIDDHAM LETTER HA, 71086 +SIDDHAM VOWEL SIGN AA, 71087 +SIDDHAM VOWEL SIGN I, 71088 +SIDDHAM VOWEL SIGN II, 71089 +SIDDHAM VOWEL SIGN U, 71090 +SIDDHAM VOWEL SIGN UU, 71091 +SIDDHAM VOWEL SIGN VOCALIC R, 71092 +SIDDHAM VOWEL SIGN VOCALIC RR, 71093 +SIDDHAM VOWEL SIGN E, 71096 +SIDDHAM VOWEL SIGN AI, 71097 +SIDDHAM VOWEL SIGN O, 71098 +SIDDHAM VOWEL SIGN AU, 71099 +SIDDHAM SIGN CANDRABINDU, 71100 +SIDDHAM SIGN ANUSVARA, 71101 +SIDDHAM SIGN VISARGA, 71102 +SIDDHAM SIGN VIRAMA, 71103 +SIDDHAM SIGN NUKTA, 71104 +SIDDHAM SIGN SIDDHAM, 71105 +SIDDHAM DANDA, 71106 +SIDDHAM DOUBLE DANDA, 71107 +SIDDHAM SEPARATOR DOT, 71108 +SIDDHAM SEPARATOR BAR, 71109 +SIDDHAM REPETITION MARK 1, 71110 +SIDDHAM REPETITION MARK 2, 71111 +SIDDHAM REPETITION MARK 3, 71112 +SIDDHAM END OF TEXT MARK, 71113 +SIDDHAM SECTION MARK WITH TRIDENT AND U SHAPED ORNAMENTS, 71114 +SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS, 71115 +SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS, 71116 +SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS, 71117 +SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS, 71118 +SIDDHAM SECTION MARK DOUBLE RING, 71119 +SIDDHAM SECTION MARK DOUBLE RING WITH RAYS, 71120 +SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS, 71121 +SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS, 71122 +SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS, 71123 +SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS, 71124 +SIDDHAM SECTION MARK WITH CIRCLES AND RAYS, 71125 +SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES, 71126 +SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES, 71127 +SIDDHAM LETTER THREE CIRCLE ALTERNATE I, 71128 +SIDDHAM LETTER TWO CIRCLE ALTERNATE I, 71129 +SIDDHAM LETTER TWO CIRCLE ALTERNATE II, 71130 +SIDDHAM LETTER ALTERNATE U, 71131 +SIDDHAM VOWEL SIGN ALTERNATE U, 71132 +SIDDHAM VOWEL SIGN ALTERNATE UU, 71133 +MODI LETTER A, 71168 +MODI LETTER AA, 71169 +MODI LETTER I, 71170 +MODI LETTER II, 71171 +MODI LETTER U, 71172 +MODI LETTER UU, 71173 +MODI LETTER VOCALIC R, 71174 +MODI LETTER VOCALIC RR, 71175 +MODI LETTER VOCALIC L, 71176 +MODI LETTER VOCALIC LL, 71177 +MODI LETTER E, 71178 +MODI LETTER AI, 71179 +MODI LETTER O, 71180 +MODI LETTER AU, 71181 +MODI LETTER KA, 71182 +MODI LETTER KHA, 71183 +MODI LETTER GA, 71184 +MODI LETTER GHA, 71185 +MODI LETTER NGA, 71186 +MODI LETTER CA, 71187 +MODI LETTER CHA, 71188 +MODI LETTER JA, 71189 +MODI LETTER JHA, 71190 +MODI LETTER NYA, 71191 +MODI LETTER TTA, 71192 +MODI LETTER TTHA, 71193 +MODI LETTER DDA, 71194 +MODI LETTER DDHA, 71195 +MODI LETTER NNA, 71196 +MODI LETTER TA, 71197 +MODI LETTER THA, 71198 +MODI LETTER DA, 71199 +MODI LETTER DHA, 71200 +MODI LETTER NA, 71201 +MODI LETTER PA, 71202 +MODI LETTER PHA, 71203 +MODI LETTER BA, 71204 +MODI LETTER BHA, 71205 +MODI LETTER MA, 71206 +MODI LETTER YA, 71207 +MODI LETTER RA, 71208 +MODI LETTER LA, 71209 +MODI LETTER VA, 71210 +MODI LETTER SHA, 71211 +MODI LETTER SSA, 71212 +MODI LETTER SA, 71213 +MODI LETTER HA, 71214 +MODI LETTER LLA, 71215 +MODI VOWEL SIGN AA, 71216 +MODI VOWEL SIGN I, 71217 +MODI VOWEL SIGN II, 71218 +MODI VOWEL SIGN U, 71219 +MODI VOWEL SIGN UU, 71220 +MODI VOWEL SIGN VOCALIC R, 71221 +MODI VOWEL SIGN VOCALIC RR, 71222 +MODI VOWEL SIGN VOCALIC L, 71223 +MODI VOWEL SIGN VOCALIC LL, 71224 +MODI VOWEL SIGN E, 71225 +MODI VOWEL SIGN AI, 71226 +MODI VOWEL SIGN O, 71227 +MODI VOWEL SIGN AU, 71228 +MODI SIGN ANUSVARA, 71229 +MODI SIGN VISARGA, 71230 +MODI SIGN VIRAMA, 71231 +MODI SIGN ARDHACANDRA, 71232 +MODI DANDA, 71233 +MODI DOUBLE DANDA, 71234 +MODI ABBREVIATION SIGN, 71235 +MODI SIGN HUVA, 71236 +MODI DIGIT ZERO, 71248 +MODI DIGIT ONE, 71249 +MODI DIGIT TWO, 71250 +MODI DIGIT THREE, 71251 +MODI DIGIT FOUR, 71252 +MODI DIGIT FIVE, 71253 +MODI DIGIT SIX, 71254 +MODI DIGIT SEVEN, 71255 +MODI DIGIT EIGHT, 71256 +MODI DIGIT NINE, 71257 +MONGOLIAN BIRGA WITH ORNAMENT, 71264 +MONGOLIAN ROTATED BIRGA, 71265 +MONGOLIAN DOUBLE BIRGA WITH ORNAMENT, 71266 +MONGOLIAN TRIPLE BIRGA WITH ORNAMENT, 71267 +MONGOLIAN BIRGA WITH DOUBLE ORNAMENT, 71268 +MONGOLIAN ROTATED BIRGA WITH ORNAMENT, 71269 +MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT, 71270 +MONGOLIAN INVERTED BIRGA, 71271 +MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT, 71272 +MONGOLIAN SWIRL BIRGA, 71273 +MONGOLIAN SWIRL BIRGA WITH ORNAMENT, 71274 +MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT, 71275 +MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT, 71276 +TAKRI LETTER A, 71296 +TAKRI LETTER AA, 71297 +TAKRI LETTER I, 71298 +TAKRI LETTER II, 71299 +TAKRI LETTER U, 71300 +TAKRI LETTER UU, 71301 +TAKRI LETTER E, 71302 +TAKRI LETTER AI, 71303 +TAKRI LETTER O, 71304 +TAKRI LETTER AU, 71305 +TAKRI LETTER KA, 71306 +TAKRI LETTER KHA, 71307 +TAKRI LETTER GA, 71308 +TAKRI LETTER GHA, 71309 +TAKRI LETTER NGA, 71310 +TAKRI LETTER CA, 71311 +TAKRI LETTER CHA, 71312 +TAKRI LETTER JA, 71313 +TAKRI LETTER JHA, 71314 +TAKRI LETTER NYA, 71315 +TAKRI LETTER TTA, 71316 +TAKRI LETTER TTHA, 71317 +TAKRI LETTER DDA, 71318 +TAKRI LETTER DDHA, 71319 +TAKRI LETTER NNA, 71320 +TAKRI LETTER TA, 71321 +TAKRI LETTER THA, 71322 +TAKRI LETTER DA, 71323 +TAKRI LETTER DHA, 71324 +TAKRI LETTER NA, 71325 +TAKRI LETTER PA, 71326 +TAKRI LETTER PHA, 71327 +TAKRI LETTER BA, 71328 +TAKRI LETTER BHA, 71329 +TAKRI LETTER MA, 71330 +TAKRI LETTER YA, 71331 +TAKRI LETTER RA, 71332 +TAKRI LETTER LA, 71333 +TAKRI LETTER VA, 71334 +TAKRI LETTER SHA, 71335 +TAKRI LETTER SA, 71336 +TAKRI LETTER HA, 71337 +TAKRI LETTER RRA, 71338 +TAKRI SIGN ANUSVARA, 71339 +TAKRI SIGN VISARGA, 71340 +TAKRI VOWEL SIGN AA, 71341 +TAKRI VOWEL SIGN I, 71342 +TAKRI VOWEL SIGN II, 71343 +TAKRI VOWEL SIGN U, 71344 +TAKRI VOWEL SIGN UU, 71345 +TAKRI VOWEL SIGN E, 71346 +TAKRI VOWEL SIGN AI, 71347 +TAKRI VOWEL SIGN O, 71348 +TAKRI VOWEL SIGN AU, 71349 +TAKRI SIGN VIRAMA, 71350 +TAKRI SIGN NUKTA, 71351 +TAKRI DIGIT ZERO, 71360 +TAKRI DIGIT ONE, 71361 +TAKRI DIGIT TWO, 71362 +TAKRI DIGIT THREE, 71363 +TAKRI DIGIT FOUR, 71364 +TAKRI DIGIT FIVE, 71365 +TAKRI DIGIT SIX, 71366 +TAKRI DIGIT SEVEN, 71367 +TAKRI DIGIT EIGHT, 71368 +TAKRI DIGIT NINE, 71369 +AHOM LETTER KA, 71424 +AHOM LETTER KHA, 71425 +AHOM LETTER NGA, 71426 +AHOM LETTER NA, 71427 +AHOM LETTER TA, 71428 +AHOM LETTER ALTERNATE TA, 71429 +AHOM LETTER PA, 71430 +AHOM LETTER PHA, 71431 +AHOM LETTER BA, 71432 +AHOM LETTER MA, 71433 +AHOM LETTER JA, 71434 +AHOM LETTER CHA, 71435 +AHOM LETTER THA, 71436 +AHOM LETTER RA, 71437 +AHOM LETTER LA, 71438 +AHOM LETTER SA, 71439 +AHOM LETTER NYA, 71440 +AHOM LETTER HA, 71441 +AHOM LETTER A, 71442 +AHOM LETTER DA, 71443 +AHOM LETTER DHA, 71444 +AHOM LETTER GA, 71445 +AHOM LETTER ALTERNATE GA, 71446 +AHOM LETTER GHA, 71447 +AHOM LETTER BHA, 71448 +AHOM LETTER JHA, 71449 +AHOM CONSONANT SIGN MEDIAL LA, 71453 +AHOM CONSONANT SIGN MEDIAL RA, 71454 +AHOM CONSONANT SIGN MEDIAL LIGATING RA, 71455 +AHOM VOWEL SIGN A, 71456 +AHOM VOWEL SIGN AA, 71457 +AHOM VOWEL SIGN I, 71458 +AHOM VOWEL SIGN II, 71459 +AHOM VOWEL SIGN U, 71460 +AHOM VOWEL SIGN UU, 71461 +AHOM VOWEL SIGN E, 71462 +AHOM VOWEL SIGN AW, 71463 +AHOM VOWEL SIGN O, 71464 +AHOM VOWEL SIGN AI, 71465 +AHOM VOWEL SIGN AM, 71466 +AHOM SIGN KILLER, 71467 +AHOM DIGIT ZERO, 71472 +AHOM DIGIT ONE, 71473 +AHOM DIGIT TWO, 71474 +AHOM DIGIT THREE, 71475 +AHOM DIGIT FOUR, 71476 +AHOM DIGIT FIVE, 71477 +AHOM DIGIT SIX, 71478 +AHOM DIGIT SEVEN, 71479 +AHOM DIGIT EIGHT, 71480 +AHOM DIGIT NINE, 71481 +AHOM NUMBER TEN, 71482 +AHOM NUMBER TWENTY, 71483 +AHOM SIGN SMALL SECTION, 71484 +AHOM SIGN SECTION, 71485 +AHOM SIGN RULAI, 71486 +AHOM SYMBOL VI, 71487 +WARANG CITI CAPITAL LETTER NGAA, 71840 +WARANG CITI CAPITAL LETTER A, 71841 +WARANG CITI CAPITAL LETTER WI, 71842 +WARANG CITI CAPITAL LETTER YU, 71843 +WARANG CITI CAPITAL LETTER YA, 71844 +WARANG CITI CAPITAL LETTER YO, 71845 +WARANG CITI CAPITAL LETTER II, 71846 +WARANG CITI CAPITAL LETTER UU, 71847 +WARANG CITI CAPITAL LETTER E, 71848 +WARANG CITI CAPITAL LETTER O, 71849 +WARANG CITI CAPITAL LETTER ANG, 71850 +WARANG CITI CAPITAL LETTER GA, 71851 +WARANG CITI CAPITAL LETTER KO, 71852 +WARANG CITI CAPITAL LETTER ENY, 71853 +WARANG CITI CAPITAL LETTER YUJ, 71854 +WARANG CITI CAPITAL LETTER UC, 71855 +WARANG CITI CAPITAL LETTER ENN, 71856 +WARANG CITI CAPITAL LETTER ODD, 71857 +WARANG CITI CAPITAL LETTER TTE, 71858 +WARANG CITI CAPITAL LETTER NUNG, 71859 +WARANG CITI CAPITAL LETTER DA, 71860 +WARANG CITI CAPITAL LETTER AT, 71861 +WARANG CITI CAPITAL LETTER AM, 71862 +WARANG CITI CAPITAL LETTER BU, 71863 +WARANG CITI CAPITAL LETTER PU, 71864 +WARANG CITI CAPITAL LETTER HIYO, 71865 +WARANG CITI CAPITAL LETTER HOLO, 71866 +WARANG CITI CAPITAL LETTER HORR, 71867 +WARANG CITI CAPITAL LETTER HAR, 71868 +WARANG CITI CAPITAL LETTER SSUU, 71869 +WARANG CITI CAPITAL LETTER SII, 71870 +WARANG CITI CAPITAL LETTER VIYO, 71871 +WARANG CITI SMALL LETTER NGAA, 71872 +WARANG CITI SMALL LETTER A, 71873 +WARANG CITI SMALL LETTER WI, 71874 +WARANG CITI SMALL LETTER YU, 71875 +WARANG CITI SMALL LETTER YA, 71876 +WARANG CITI SMALL LETTER YO, 71877 +WARANG CITI SMALL LETTER II, 71878 +WARANG CITI SMALL LETTER UU, 71879 +WARANG CITI SMALL LETTER E, 71880 +WARANG CITI SMALL LETTER O, 71881 +WARANG CITI SMALL LETTER ANG, 71882 +WARANG CITI SMALL LETTER GA, 71883 +WARANG CITI SMALL LETTER KO, 71884 +WARANG CITI SMALL LETTER ENY, 71885 +WARANG CITI SMALL LETTER YUJ, 71886 +WARANG CITI SMALL LETTER UC, 71887 +WARANG CITI SMALL LETTER ENN, 71888 +WARANG CITI SMALL LETTER ODD, 71889 +WARANG CITI SMALL LETTER TTE, 71890 +WARANG CITI SMALL LETTER NUNG, 71891 +WARANG CITI SMALL LETTER DA, 71892 +WARANG CITI SMALL LETTER AT, 71893 +WARANG CITI SMALL LETTER AM, 71894 +WARANG CITI SMALL LETTER BU, 71895 +WARANG CITI SMALL LETTER PU, 71896 +WARANG CITI SMALL LETTER HIYO, 71897 +WARANG CITI SMALL LETTER HOLO, 71898 +WARANG CITI SMALL LETTER HORR, 71899 +WARANG CITI SMALL LETTER HAR, 71900 +WARANG CITI SMALL LETTER SSUU, 71901 +WARANG CITI SMALL LETTER SII, 71902 +WARANG CITI SMALL LETTER VIYO, 71903 +WARANG CITI DIGIT ZERO, 71904 +WARANG CITI DIGIT ONE, 71905 +WARANG CITI DIGIT TWO, 71906 +WARANG CITI DIGIT THREE, 71907 +WARANG CITI DIGIT FOUR, 71908 +WARANG CITI DIGIT FIVE, 71909 +WARANG CITI DIGIT SIX, 71910 +WARANG CITI DIGIT SEVEN, 71911 +WARANG CITI DIGIT EIGHT, 71912 +WARANG CITI DIGIT NINE, 71913 +WARANG CITI NUMBER TEN, 71914 +WARANG CITI NUMBER TWENTY, 71915 +WARANG CITI NUMBER THIRTY, 71916 +WARANG CITI NUMBER FORTY, 71917 +WARANG CITI NUMBER FIFTY, 71918 +WARANG CITI NUMBER SIXTY, 71919 +WARANG CITI NUMBER SEVENTY, 71920 +WARANG CITI NUMBER EIGHTY, 71921 +WARANG CITI NUMBER NINETY, 71922 +WARANG CITI OM, 71935 +PAU CIN HAU LETTER PA, 72384 +PAU CIN HAU LETTER KA, 72385 +PAU CIN HAU LETTER LA, 72386 +PAU CIN HAU LETTER MA, 72387 +PAU CIN HAU LETTER DA, 72388 +PAU CIN HAU LETTER ZA, 72389 +PAU CIN HAU LETTER VA, 72390 +PAU CIN HAU LETTER NGA, 72391 +PAU CIN HAU LETTER HA, 72392 +PAU CIN HAU LETTER GA, 72393 +PAU CIN HAU LETTER KHA, 72394 +PAU CIN HAU LETTER SA, 72395 +PAU CIN HAU LETTER BA, 72396 +PAU CIN HAU LETTER CA, 72397 +PAU CIN HAU LETTER TA, 72398 +PAU CIN HAU LETTER THA, 72399 +PAU CIN HAU LETTER NA, 72400 +PAU CIN HAU LETTER PHA, 72401 +PAU CIN HAU LETTER RA, 72402 +PAU CIN HAU LETTER FA, 72403 +PAU CIN HAU LETTER CHA, 72404 +PAU CIN HAU LETTER A, 72405 +PAU CIN HAU LETTER E, 72406 +PAU CIN HAU LETTER I, 72407 +PAU CIN HAU LETTER O, 72408 +PAU CIN HAU LETTER U, 72409 +PAU CIN HAU LETTER UA, 72410 +PAU CIN HAU LETTER IA, 72411 +PAU CIN HAU LETTER FINAL P, 72412 +PAU CIN HAU LETTER FINAL K, 72413 +PAU CIN HAU LETTER FINAL T, 72414 +PAU CIN HAU LETTER FINAL M, 72415 +PAU CIN HAU LETTER FINAL N, 72416 +PAU CIN HAU LETTER FINAL L, 72417 +PAU CIN HAU LETTER FINAL W, 72418 +PAU CIN HAU LETTER FINAL NG, 72419 +PAU CIN HAU LETTER FINAL Y, 72420 +PAU CIN HAU RISING TONE LONG, 72421 +PAU CIN HAU RISING TONE, 72422 +PAU CIN HAU SANDHI GLOTTAL STOP, 72423 +PAU CIN HAU RISING TONE LONG FINAL, 72424 +PAU CIN HAU RISING TONE FINAL, 72425 +PAU CIN HAU SANDHI GLOTTAL STOP FINAL, 72426 +PAU CIN HAU SANDHI TONE LONG, 72427 +PAU CIN HAU SANDHI TONE, 72428 +PAU CIN HAU SANDHI TONE LONG FINAL, 72429 +PAU CIN HAU SANDHI TONE FINAL, 72430 +PAU CIN HAU MID LEVEL TONE, 72431 +PAU CIN HAU GLOTTAL STOP VARIANT, 72432 +PAU CIN HAU MID LEVEL TONE LONG FINAL, 72433 +PAU CIN HAU MID LEVEL TONE FINAL, 72434 +PAU CIN HAU LOW FALLING TONE LONG, 72435 +PAU CIN HAU LOW FALLING TONE, 72436 +PAU CIN HAU GLOTTAL STOP, 72437 +PAU CIN HAU LOW FALLING TONE LONG FINAL, 72438 +PAU CIN HAU LOW FALLING TONE FINAL, 72439 +PAU CIN HAU GLOTTAL STOP FINAL, 72440 +BHAIKSUKI LETTER A, 72704 +BHAIKSUKI LETTER AA, 72705 +BHAIKSUKI LETTER I, 72706 +BHAIKSUKI LETTER II, 72707 +BHAIKSUKI LETTER U, 72708 +BHAIKSUKI LETTER UU, 72709 +BHAIKSUKI LETTER VOCALIC R, 72710 +BHAIKSUKI LETTER VOCALIC RR, 72711 +BHAIKSUKI LETTER VOCALIC L, 72712 +BHAIKSUKI LETTER E, 72714 +BHAIKSUKI LETTER AI, 72715 +BHAIKSUKI LETTER O, 72716 +BHAIKSUKI LETTER AU, 72717 +BHAIKSUKI LETTER KA, 72718 +BHAIKSUKI LETTER KHA, 72719 +BHAIKSUKI LETTER GA, 72720 +BHAIKSUKI LETTER GHA, 72721 +BHAIKSUKI LETTER NGA, 72722 +BHAIKSUKI LETTER CA, 72723 +BHAIKSUKI LETTER CHA, 72724 +BHAIKSUKI LETTER JA, 72725 +BHAIKSUKI LETTER JHA, 72726 +BHAIKSUKI LETTER NYA, 72727 +BHAIKSUKI LETTER TTA, 72728 +BHAIKSUKI LETTER TTHA, 72729 +BHAIKSUKI LETTER DDA, 72730 +BHAIKSUKI LETTER DDHA, 72731 +BHAIKSUKI LETTER NNA, 72732 +BHAIKSUKI LETTER TA, 72733 +BHAIKSUKI LETTER THA, 72734 +BHAIKSUKI LETTER DA, 72735 +BHAIKSUKI LETTER DHA, 72736 +BHAIKSUKI LETTER NA, 72737 +BHAIKSUKI LETTER PA, 72738 +BHAIKSUKI LETTER PHA, 72739 +BHAIKSUKI LETTER BA, 72740 +BHAIKSUKI LETTER BHA, 72741 +BHAIKSUKI LETTER MA, 72742 +BHAIKSUKI LETTER YA, 72743 +BHAIKSUKI LETTER RA, 72744 +BHAIKSUKI LETTER LA, 72745 +BHAIKSUKI LETTER VA, 72746 +BHAIKSUKI LETTER SHA, 72747 +BHAIKSUKI LETTER SSA, 72748 +BHAIKSUKI LETTER SA, 72749 +BHAIKSUKI LETTER HA, 72750 +BHAIKSUKI VOWEL SIGN AA, 72751 +BHAIKSUKI VOWEL SIGN I, 72752 +BHAIKSUKI VOWEL SIGN II, 72753 +BHAIKSUKI VOWEL SIGN U, 72754 +BHAIKSUKI VOWEL SIGN UU, 72755 +BHAIKSUKI VOWEL SIGN VOCALIC R, 72756 +BHAIKSUKI VOWEL SIGN VOCALIC RR, 72757 +BHAIKSUKI VOWEL SIGN VOCALIC L, 72758 +BHAIKSUKI VOWEL SIGN E, 72760 +BHAIKSUKI VOWEL SIGN AI, 72761 +BHAIKSUKI VOWEL SIGN O, 72762 +BHAIKSUKI VOWEL SIGN AU, 72763 +BHAIKSUKI SIGN CANDRABINDU, 72764 +BHAIKSUKI SIGN ANUSVARA, 72765 +BHAIKSUKI SIGN VISARGA, 72766 +BHAIKSUKI SIGN VIRAMA, 72767 +BHAIKSUKI SIGN AVAGRAHA, 72768 +BHAIKSUKI DANDA, 72769 +BHAIKSUKI DOUBLE DANDA, 72770 +BHAIKSUKI WORD SEPARATOR, 72771 +BHAIKSUKI GAP FILLER 1, 72772 +BHAIKSUKI GAP FILLER 2, 72773 +BHAIKSUKI DIGIT ZERO, 72784 +BHAIKSUKI DIGIT ONE, 72785 +BHAIKSUKI DIGIT TWO, 72786 +BHAIKSUKI DIGIT THREE, 72787 +BHAIKSUKI DIGIT FOUR, 72788 +BHAIKSUKI DIGIT FIVE, 72789 +BHAIKSUKI DIGIT SIX, 72790 +BHAIKSUKI DIGIT SEVEN, 72791 +BHAIKSUKI DIGIT EIGHT, 72792 +BHAIKSUKI DIGIT NINE, 72793 +BHAIKSUKI NUMBER ONE, 72794 +BHAIKSUKI NUMBER TWO, 72795 +BHAIKSUKI NUMBER THREE, 72796 +BHAIKSUKI NUMBER FOUR, 72797 +BHAIKSUKI NUMBER FIVE, 72798 +BHAIKSUKI NUMBER SIX, 72799 +BHAIKSUKI NUMBER SEVEN, 72800 +BHAIKSUKI NUMBER EIGHT, 72801 +BHAIKSUKI NUMBER NINE, 72802 +BHAIKSUKI NUMBER TEN, 72803 +BHAIKSUKI NUMBER TWENTY, 72804 +BHAIKSUKI NUMBER THIRTY, 72805 +BHAIKSUKI NUMBER FORTY, 72806 +BHAIKSUKI NUMBER FIFTY, 72807 +BHAIKSUKI NUMBER SIXTY, 72808 +BHAIKSUKI NUMBER SEVENTY, 72809 +BHAIKSUKI NUMBER EIGHTY, 72810 +BHAIKSUKI NUMBER NINETY, 72811 +BHAIKSUKI HUNDREDS UNIT MARK, 72812 +MARCHEN HEAD MARK, 72816 +MARCHEN MARK SHAD, 72817 +MARCHEN LETTER KA, 72818 +MARCHEN LETTER KHA, 72819 +MARCHEN LETTER GA, 72820 +MARCHEN LETTER NGA, 72821 +MARCHEN LETTER CA, 72822 +MARCHEN LETTER CHA, 72823 +MARCHEN LETTER JA, 72824 +MARCHEN LETTER NYA, 72825 +MARCHEN LETTER TA, 72826 +MARCHEN LETTER THA, 72827 +MARCHEN LETTER DA, 72828 +MARCHEN LETTER NA, 72829 +MARCHEN LETTER PA, 72830 +MARCHEN LETTER PHA, 72831 +MARCHEN LETTER BA, 72832 +MARCHEN LETTER MA, 72833 +MARCHEN LETTER TSA, 72834 +MARCHEN LETTER TSHA, 72835 +MARCHEN LETTER DZA, 72836 +MARCHEN LETTER WA, 72837 +MARCHEN LETTER ZHA, 72838 +MARCHEN LETTER ZA, 72839 +MARCHEN LETTER A, 72840 +MARCHEN LETTER YA, 72841 +MARCHEN LETTER RA, 72842 +MARCHEN LETTER LA, 72843 +MARCHEN LETTER SHA, 72844 +MARCHEN LETTER SA, 72845 +MARCHEN LETTER HA, 72846 +MARCHEN LETTER A, 72847 +MARCHEN SUBJOINED LETTER KA, 72850 +MARCHEN SUBJOINED LETTER KHA, 72851 +MARCHEN SUBJOINED LETTER GA, 72852 +MARCHEN SUBJOINED LETTER NGA, 72853 +MARCHEN SUBJOINED LETTER CA, 72854 +MARCHEN SUBJOINED LETTER CHA, 72855 +MARCHEN SUBJOINED LETTER JA, 72856 +MARCHEN SUBJOINED LETTER NYA, 72857 +MARCHEN SUBJOINED LETTER TA, 72858 +MARCHEN SUBJOINED LETTER THA, 72859 +MARCHEN SUBJOINED LETTER DA, 72860 +MARCHEN SUBJOINED LETTER NA, 72861 +MARCHEN SUBJOINED LETTER PA, 72862 +MARCHEN SUBJOINED LETTER PHA, 72863 +MARCHEN SUBJOINED LETTER BA, 72864 +MARCHEN SUBJOINED LETTER MA, 72865 +MARCHEN SUBJOINED LETTER TSA, 72866 +MARCHEN SUBJOINED LETTER TSHA, 72867 +MARCHEN SUBJOINED LETTER DZA, 72868 +MARCHEN SUBJOINED LETTER WA, 72869 +MARCHEN SUBJOINED LETTER ZHA, 72870 +MARCHEN SUBJOINED LETTER ZA, 72871 +MARCHEN SUBJOINED LETTER YA, 72873 +MARCHEN SUBJOINED LETTER RA, 72874 +MARCHEN SUBJOINED LETTER LA, 72875 +MARCHEN SUBJOINED LETTER SHA, 72876 +MARCHEN SUBJOINED LETTER SA, 72877 +MARCHEN SUBJOINED LETTER HA, 72878 +MARCHEN SUBJOINED LETTER A, 72879 +MARCHEN VOWEL SIGN AA, 72880 +MARCHEN VOWEL SIGN I, 72881 +MARCHEN VOWEL SIGN U, 72882 +MARCHEN VOWEL SIGN E, 72883 +MARCHEN VOWEL SIGN O, 72884 +MARCHEN SIGN ANUSVARA, 72885 +MARCHEN SIGN CANDRABINDU, 72886 +CUNEIFORM SIGN A, 73728 +CUNEIFORM SIGN A TIMES A, 73729 +CUNEIFORM SIGN A TIMES BAD, 73730 +CUNEIFORM SIGN A TIMES GAN2 TENU, 73731 +CUNEIFORM SIGN A TIMES HA, 73732 +CUNEIFORM SIGN A TIMES IGI, 73733 +CUNEIFORM SIGN A TIMES LAGAR GUNU, 73734 +CUNEIFORM SIGN A TIMES MUSH, 73735 +CUNEIFORM SIGN A TIMES SAG, 73736 +CUNEIFORM SIGN A2, 73737 +CUNEIFORM SIGN AB, 73738 +CUNEIFORM SIGN AB TIMES ASH2, 73739 +CUNEIFORM SIGN AB TIMES DUN3 GUNU, 73740 +CUNEIFORM SIGN AB TIMES GAL, 73741 +CUNEIFORM SIGN AB TIMES GAN2 TENU, 73742 +CUNEIFORM SIGN AB TIMES HA, 73743 +CUNEIFORM SIGN AB TIMES IGI GUNU, 73744 +CUNEIFORM SIGN AB TIMES IMIN, 73745 +CUNEIFORM SIGN AB TIMES LAGAB, 73746 +CUNEIFORM SIGN AB TIMES SHESH, 73747 +CUNEIFORM SIGN AB TIMES U PLUS U PLUS U, 73748 +CUNEIFORM SIGN AB GUNU, 73749 +CUNEIFORM SIGN AB2, 73750 +CUNEIFORM SIGN AB2 TIMES BALAG, 73751 +CUNEIFORM SIGN AB2 TIMES GAN2 TENU, 73752 +CUNEIFORM SIGN AB2 TIMES ME PLUS EN, 73753 +CUNEIFORM SIGN AB2 TIMES SHA3, 73754 +CUNEIFORM SIGN AB2 TIMES TAK4, 73755 +CUNEIFORM SIGN AD, 73756 +CUNEIFORM SIGN AK, 73757 +CUNEIFORM SIGN AK TIMES ERIN2, 73758 +CUNEIFORM SIGN AK TIMES SHITA PLUS GISH, 73759 +CUNEIFORM SIGN AL, 73760 +CUNEIFORM SIGN AL TIMES AL, 73761 +CUNEIFORM SIGN AL TIMES DIM2, 73762 +CUNEIFORM SIGN AL TIMES GISH, 73763 +CUNEIFORM SIGN AL TIMES HA, 73764 +CUNEIFORM SIGN AL TIMES KAD3, 73765 +CUNEIFORM SIGN AL TIMES KI, 73766 +CUNEIFORM SIGN AL TIMES SHE, 73767 +CUNEIFORM SIGN AL TIMES USH, 73768 +CUNEIFORM SIGN ALAN, 73769 +CUNEIFORM SIGN ALEPH, 73770 +CUNEIFORM SIGN AMAR, 73771 +CUNEIFORM SIGN AMAR TIMES SHE, 73772 +CUNEIFORM SIGN AN, 73773 +CUNEIFORM SIGN AN OVER AN, 73774 +CUNEIFORM SIGN AN THREE TIMES, 73775 +CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA, 73776 +CUNEIFORM SIGN AN PLUS NAGA SQUARED, 73777 +CUNEIFORM SIGN ANSHE, 73778 +CUNEIFORM SIGN APIN, 73779 +CUNEIFORM SIGN ARAD, 73780 +CUNEIFORM SIGN ARAD TIMES KUR, 73781 +CUNEIFORM SIGN ARKAB, 73782 +CUNEIFORM SIGN ASAL2, 73783 +CUNEIFORM SIGN ASH, 73784 +CUNEIFORM SIGN ASH ZIDA TENU, 73785 +CUNEIFORM SIGN ASH KABA TENU, 73786 +CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP, 73787 +CUNEIFORM SIGN ASH OVER ASH OVER ASH, 73788 +CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH, 73789 +CUNEIFORM SIGN ASH2, 73790 +CUNEIFORM SIGN ASHGAB, 73791 +CUNEIFORM SIGN BA, 73792 +CUNEIFORM SIGN BAD, 73793 +CUNEIFORM SIGN BAG3, 73794 +CUNEIFORM SIGN BAHAR2, 73795 +CUNEIFORM SIGN BAL, 73796 +CUNEIFORM SIGN BAL OVER BAL, 73797 +CUNEIFORM SIGN BALAG, 73798 +CUNEIFORM SIGN BAR, 73799 +CUNEIFORM SIGN BARA2, 73800 +CUNEIFORM SIGN BI, 73801 +CUNEIFORM SIGN BI TIMES A, 73802 +CUNEIFORM SIGN BI TIMES GAR, 73803 +CUNEIFORM SIGN BI TIMES IGI GUNU, 73804 +CUNEIFORM SIGN BU, 73805 +CUNEIFORM SIGN BU OVER BU AB, 73806 +CUNEIFORM SIGN BU OVER BU UN, 73807 +CUNEIFORM SIGN BU CROSSING BU, 73808 +CUNEIFORM SIGN BULUG, 73809 +CUNEIFORM SIGN BULUG OVER BULUG, 73810 +CUNEIFORM SIGN BUR, 73811 +CUNEIFORM SIGN BUR2, 73812 +CUNEIFORM SIGN DA, 73813 +CUNEIFORM SIGN DAG, 73814 +CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH, 73815 +CUNEIFORM SIGN DAG KISIM5 TIMES AMAR, 73816 +CUNEIFORM SIGN DAG KISIM5 TIMES BALAG, 73817 +CUNEIFORM SIGN DAG KISIM5 TIMES BI, 73818 +CUNEIFORM SIGN DAG KISIM5 TIMES GA, 73819 +CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH, 73820 +CUNEIFORM SIGN DAG KISIM5 TIMES GI, 73821 +CUNEIFORM SIGN DAG KISIM5 TIMES GIR2, 73822 +CUNEIFORM SIGN DAG KISIM5 TIMES GUD, 73823 +CUNEIFORM SIGN DAG KISIM5 TIMES HA, 73824 +CUNEIFORM SIGN DAG KISIM5 TIMES IR, 73825 +CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU, 73826 +CUNEIFORM SIGN DAG KISIM5 TIMES KAK, 73827 +CUNEIFORM SIGN DAG KISIM5 TIMES LA, 73828 +CUNEIFORM SIGN DAG KISIM5 TIMES LU, 73829 +CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2, 73830 +CUNEIFORM SIGN DAG KISIM5 TIMES LUM, 73831 +CUNEIFORM SIGN DAG KISIM5 TIMES NE, 73832 +CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP, 73833 +CUNEIFORM SIGN DAG KISIM5 TIMES SI, 73834 +CUNEIFORM SIGN DAG KISIM5 TIMES TAK4, 73835 +CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2, 73836 +CUNEIFORM SIGN DAG KISIM5 TIMES USH, 73837 +CUNEIFORM SIGN DAM, 73838 +CUNEIFORM SIGN DAR, 73839 +CUNEIFORM SIGN DARA3, 73840 +CUNEIFORM SIGN DARA4, 73841 +CUNEIFORM SIGN DI, 73842 +CUNEIFORM SIGN DIB, 73843 +CUNEIFORM SIGN DIM, 73844 +CUNEIFORM SIGN DIM TIMES SHE, 73845 +CUNEIFORM SIGN DIM2, 73846 +CUNEIFORM SIGN DIN, 73847 +CUNEIFORM SIGN DIN KASKAL U GUNU DISH, 73848 +CUNEIFORM SIGN DISH, 73849 +CUNEIFORM SIGN DU, 73850 +CUNEIFORM SIGN DU OVER DU, 73851 +CUNEIFORM SIGN DU GUNU, 73852 +CUNEIFORM SIGN DU SHESHIG, 73853 +CUNEIFORM SIGN DUB, 73854 +CUNEIFORM SIGN DUB TIMES ESH2, 73855 +CUNEIFORM SIGN DUB2, 73856 +CUNEIFORM SIGN DUG, 73857 +CUNEIFORM SIGN DUGUD, 73858 +CUNEIFORM SIGN DUH, 73859 +CUNEIFORM SIGN DUN, 73860 +CUNEIFORM SIGN DUN3, 73861 +CUNEIFORM SIGN DUN3 GUNU, 73862 +CUNEIFORM SIGN DUN3 GUNU GUNU, 73863 +CUNEIFORM SIGN DUN4, 73864 +CUNEIFORM SIGN DUR2, 73865 +CUNEIFORM SIGN E, 73866 +CUNEIFORM SIGN E TIMES PAP, 73867 +CUNEIFORM SIGN E OVER E NUN OVER NUN, 73868 +CUNEIFORM SIGN E2, 73869 +CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA, 73870 +CUNEIFORM SIGN E2 TIMES GAR, 73871 +CUNEIFORM SIGN E2 TIMES MI, 73872 +CUNEIFORM SIGN E2 TIMES SAL, 73873 +CUNEIFORM SIGN E2 TIMES SHE, 73874 +CUNEIFORM SIGN E2 TIMES U, 73875 +CUNEIFORM SIGN EDIN, 73876 +CUNEIFORM SIGN EGIR, 73877 +CUNEIFORM SIGN EL, 73878 +CUNEIFORM SIGN EN, 73879 +CUNEIFORM SIGN EN TIMES GAN2, 73880 +CUNEIFORM SIGN EN TIMES GAN2 TENU, 73881 +CUNEIFORM SIGN EN TIMES ME, 73882 +CUNEIFORM SIGN EN CROSSING EN, 73883 +CUNEIFORM SIGN EN OPPOSING EN, 73884 +CUNEIFORM SIGN EN SQUARED, 73885 +CUNEIFORM SIGN EREN, 73886 +CUNEIFORM SIGN ERIN2, 73887 +CUNEIFORM SIGN ESH2, 73888 +CUNEIFORM SIGN EZEN, 73889 +CUNEIFORM SIGN EZEN TIMES A, 73890 +CUNEIFORM SIGN EZEN TIMES A PLUS LAL, 73891 +CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL, 73892 +CUNEIFORM SIGN EZEN TIMES AN, 73893 +CUNEIFORM SIGN EZEN TIMES BAD, 73894 +CUNEIFORM SIGN EZEN TIMES DUN3 GUNU, 73895 +CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU, 73896 +CUNEIFORM SIGN EZEN TIMES HA, 73897 +CUNEIFORM SIGN EZEN TIMES HA GUNU, 73898 +CUNEIFORM SIGN EZEN TIMES IGI GUNU, 73899 +CUNEIFORM SIGN EZEN TIMES KASKAL, 73900 +CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED, 73901 +CUNEIFORM SIGN EZEN TIMES KU3, 73902 +CUNEIFORM SIGN EZEN TIMES LA, 73903 +CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL, 73904 +CUNEIFORM SIGN EZEN TIMES LI, 73905 +CUNEIFORM SIGN EZEN TIMES LU, 73906 +CUNEIFORM SIGN EZEN TIMES U2, 73907 +CUNEIFORM SIGN EZEN TIMES UD, 73908 +CUNEIFORM SIGN GA, 73909 +CUNEIFORM SIGN GA GUNU, 73910 +CUNEIFORM SIGN GA2, 73911 +CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA, 73912 +CUNEIFORM SIGN GA2 TIMES A PLUS HA, 73913 +CUNEIFORM SIGN GA2 TIMES A PLUS IGI, 73914 +CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB, 73915 +CUNEIFORM SIGN GA2 TIMES AN, 73916 +CUNEIFORM SIGN GA2 TIMES ASH, 73917 +CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL, 73918 +CUNEIFORM SIGN GA2 TIMES BAD, 73919 +CUNEIFORM SIGN GA2 TIMES BAR PLUS RA, 73920 +CUNEIFORM SIGN GA2 TIMES BUR, 73921 +CUNEIFORM SIGN GA2 TIMES BUR PLUS RA, 73922 +CUNEIFORM SIGN GA2 TIMES DA, 73923 +CUNEIFORM SIGN GA2 TIMES DI, 73924 +CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE, 73925 +CUNEIFORM SIGN GA2 TIMES DUB, 73926 +CUNEIFORM SIGN GA2 TIMES EL, 73927 +CUNEIFORM SIGN GA2 TIMES EL PLUS LA, 73928 +CUNEIFORM SIGN GA2 TIMES EN, 73929 +CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU, 73930 +CUNEIFORM SIGN GA2 TIMES GAN2 TENU, 73931 +CUNEIFORM SIGN GA2 TIMES GAR, 73932 +CUNEIFORM SIGN GA2 TIMES GI, 73933 +CUNEIFORM SIGN GA2 TIMES GI4, 73934 +CUNEIFORM SIGN GA2 TIMES GI4 PLUS A, 73935 +CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU, 73936 +CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2, 73937 +CUNEIFORM SIGN GA2 TIMES HAL, 73938 +CUNEIFORM SIGN GA2 TIMES HAL PLUS LA, 73939 +CUNEIFORM SIGN GA2 TIMES HI PLUS LI, 73940 +CUNEIFORM SIGN GA2 TIMES HUB2, 73941 +CUNEIFORM SIGN GA2 TIMES IGI GUNU, 73942 +CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH, 73943 +CUNEIFORM SIGN GA2 TIMES KAK, 73944 +CUNEIFORM SIGN GA2 TIMES KASKAL, 73945 +CUNEIFORM SIGN GA2 TIMES KID, 73946 +CUNEIFORM SIGN GA2 TIMES KID PLUS LAL, 73947 +CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN, 73948 +CUNEIFORM SIGN GA2 TIMES LA, 73949 +CUNEIFORM SIGN GA2 TIMES ME PLUS EN, 73950 +CUNEIFORM SIGN GA2 TIMES MI, 73951 +CUNEIFORM SIGN GA2 TIMES NUN, 73952 +CUNEIFORM SIGN GA2 TIMES NUN OVER NUN, 73953 +CUNEIFORM SIGN GA2 TIMES PA, 73954 +CUNEIFORM SIGN GA2 TIMES SAL, 73955 +CUNEIFORM SIGN GA2 TIMES SAR, 73956 +CUNEIFORM SIGN GA2 TIMES SHE, 73957 +CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR, 73958 +CUNEIFORM SIGN GA2 TIMES SHID, 73959 +CUNEIFORM SIGN GA2 TIMES SUM, 73960 +CUNEIFORM SIGN GA2 TIMES TAK4, 73961 +CUNEIFORM SIGN GA2 TIMES U, 73962 +CUNEIFORM SIGN GA2 TIMES UD, 73963 +CUNEIFORM SIGN GA2 TIMES UD PLUS DU, 73964 +CUNEIFORM SIGN GA2 OVER GA2, 73965 +CUNEIFORM SIGN GABA, 73966 +CUNEIFORM SIGN GABA CROSSING GABA, 73967 +CUNEIFORM SIGN GAD, 73968 +CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR, 73969 +CUNEIFORM SIGN GAL, 73970 +CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR, 73971 +CUNEIFORM SIGN GALAM, 73972 +CUNEIFORM SIGN GAM, 73973 +CUNEIFORM SIGN GAN, 73974 +CUNEIFORM SIGN GAN2, 73975 +CUNEIFORM SIGN GAN2 TENU, 73976 +CUNEIFORM SIGN GAN2 OVER GAN2, 73977 +CUNEIFORM SIGN GAN2 CROSSING GAN2, 73978 +CUNEIFORM SIGN GAR, 73979 +CUNEIFORM SIGN GAR3, 73980 +CUNEIFORM SIGN GASHAN, 73981 +CUNEIFORM SIGN GESHTIN, 73982 +CUNEIFORM SIGN GESHTIN TIMES KUR, 73983 +CUNEIFORM SIGN GI, 73984 +CUNEIFORM SIGN GI TIMES E, 73985 +CUNEIFORM SIGN GI TIMES U, 73986 +CUNEIFORM SIGN GI CROSSING GI, 73987 +CUNEIFORM SIGN GI4, 73988 +CUNEIFORM SIGN GI4 OVER GI4, 73989 +CUNEIFORM SIGN GI4 CROSSING GI4, 73990 +CUNEIFORM SIGN GIDIM, 73991 +CUNEIFORM SIGN GIR2, 73992 +CUNEIFORM SIGN GIR2 GUNU, 73993 +CUNEIFORM SIGN GIR3, 73994 +CUNEIFORM SIGN GIR3 TIMES A PLUS IGI, 73995 +CUNEIFORM SIGN GIR3 TIMES GAN2 TENU, 73996 +CUNEIFORM SIGN GIR3 TIMES IGI, 73997 +CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI, 73998 +CUNEIFORM SIGN GIR3 TIMES PA, 73999 +CUNEIFORM SIGN GISAL, 74000 +CUNEIFORM SIGN GISH, 74001 +CUNEIFORM SIGN GISH CROSSING GISH, 74002 +CUNEIFORM SIGN GISH TIMES BAD, 74003 +CUNEIFORM SIGN GISH TIMES TAK4, 74004 +CUNEIFORM SIGN GISH TENU, 74005 +CUNEIFORM SIGN GU, 74006 +CUNEIFORM SIGN GU CROSSING GU, 74007 +CUNEIFORM SIGN GU2, 74008 +CUNEIFORM SIGN GU2 TIMES KAK, 74009 +CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU, 74010 +CUNEIFORM SIGN GU2 TIMES NUN, 74011 +CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2, 74012 +CUNEIFORM SIGN GU2 GUNU, 74013 +CUNEIFORM SIGN GUD, 74014 +CUNEIFORM SIGN GUD TIMES A PLUS KUR, 74015 +CUNEIFORM SIGN GUD TIMES KUR, 74016 +CUNEIFORM SIGN GUD OVER GUD LUGAL, 74017 +CUNEIFORM SIGN GUL, 74018 +CUNEIFORM SIGN GUM, 74019 +CUNEIFORM SIGN GUM TIMES SHE, 74020 +CUNEIFORM SIGN GUR, 74021 +CUNEIFORM SIGN GUR7, 74022 +CUNEIFORM SIGN GURUN, 74023 +CUNEIFORM SIGN GURUSH, 74024 +CUNEIFORM SIGN HA, 74025 +CUNEIFORM SIGN HA TENU, 74026 +CUNEIFORM SIGN HA GUNU, 74027 +CUNEIFORM SIGN HAL, 74028 +CUNEIFORM SIGN HI, 74029 +CUNEIFORM SIGN HI TIMES ASH, 74030 +CUNEIFORM SIGN HI TIMES ASH2, 74031 +CUNEIFORM SIGN HI TIMES BAD, 74032 +CUNEIFORM SIGN HI TIMES DISH, 74033 +CUNEIFORM SIGN HI TIMES GAD, 74034 +CUNEIFORM SIGN HI TIMES KIN, 74035 +CUNEIFORM SIGN HI TIMES NUN, 74036 +CUNEIFORM SIGN HI TIMES SHE, 74037 +CUNEIFORM SIGN HI TIMES U, 74038 +CUNEIFORM SIGN HU, 74039 +CUNEIFORM SIGN HUB2, 74040 +CUNEIFORM SIGN HUB2 TIMES AN, 74041 +CUNEIFORM SIGN HUB2 TIMES HAL, 74042 +CUNEIFORM SIGN HUB2 TIMES KASKAL, 74043 +CUNEIFORM SIGN HUB2 TIMES LISH, 74044 +CUNEIFORM SIGN HUB2 TIMES UD, 74045 +CUNEIFORM SIGN HUL2, 74046 +CUNEIFORM SIGN I, 74047 +CUNEIFORM SIGN I A, 74048 +CUNEIFORM SIGN IB, 74049 +CUNEIFORM SIGN IDIM, 74050 +CUNEIFORM SIGN IDIM OVER IDIM BUR, 74051 +CUNEIFORM SIGN IDIM OVER IDIM SQUARED, 74052 +CUNEIFORM SIGN IG, 74053 +CUNEIFORM SIGN IGI, 74054 +CUNEIFORM SIGN IGI DIB, 74055 +CUNEIFORM SIGN IGI RI, 74056 +CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD, 74057 +CUNEIFORM SIGN IGI GUNU, 74058 +CUNEIFORM SIGN IL, 74059 +CUNEIFORM SIGN IL TIMES GAN2 TENU, 74060 +CUNEIFORM SIGN IL2, 74061 +CUNEIFORM SIGN IM, 74062 +CUNEIFORM SIGN IM TIMES TAK4, 74063 +CUNEIFORM SIGN IM CROSSING IM, 74064 +CUNEIFORM SIGN IM OPPOSING IM, 74065 +CUNEIFORM SIGN IM SQUARED, 74066 +CUNEIFORM SIGN IMIN, 74067 +CUNEIFORM SIGN IN, 74068 +CUNEIFORM SIGN IR, 74069 +CUNEIFORM SIGN ISH, 74070 +CUNEIFORM SIGN KA, 74071 +CUNEIFORM SIGN KA TIMES A, 74072 +CUNEIFORM SIGN KA TIMES AD, 74073 +CUNEIFORM SIGN KA TIMES AD PLUS KU3, 74074 +CUNEIFORM SIGN KA TIMES ASH2, 74075 +CUNEIFORM SIGN KA TIMES BAD, 74076 +CUNEIFORM SIGN KA TIMES BALAG, 74077 +CUNEIFORM SIGN KA TIMES BAR, 74078 +CUNEIFORM SIGN KA TIMES BI, 74079 +CUNEIFORM SIGN KA TIMES ERIN2, 74080 +CUNEIFORM SIGN KA TIMES ESH2, 74081 +CUNEIFORM SIGN KA TIMES GA, 74082 +CUNEIFORM SIGN KA TIMES GAL, 74083 +CUNEIFORM SIGN KA TIMES GAN2 TENU, 74084 +CUNEIFORM SIGN KA TIMES GAR, 74085 +CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A, 74086 +CUNEIFORM SIGN KA TIMES GI, 74087 +CUNEIFORM SIGN KA TIMES GIR2, 74088 +CUNEIFORM SIGN KA TIMES GISH PLUS SAR, 74089 +CUNEIFORM SIGN KA TIMES GISH CROSSING GISH, 74090 +CUNEIFORM SIGN KA TIMES GU, 74091 +CUNEIFORM SIGN KA TIMES GUR7, 74092 +CUNEIFORM SIGN KA TIMES IGI, 74093 +CUNEIFORM SIGN KA TIMES IM, 74094 +CUNEIFORM SIGN KA TIMES KAK, 74095 +CUNEIFORM SIGN KA TIMES KI, 74096 +CUNEIFORM SIGN KA TIMES KID, 74097 +CUNEIFORM SIGN KA TIMES LI, 74098 +CUNEIFORM SIGN KA TIMES LU, 74099 +CUNEIFORM SIGN KA TIMES ME, 74100 +CUNEIFORM SIGN KA TIMES ME PLUS DU, 74101 +CUNEIFORM SIGN KA TIMES ME PLUS GI, 74102 +CUNEIFORM SIGN KA TIMES ME PLUS TE, 74103 +CUNEIFORM SIGN KA TIMES MI, 74104 +CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ, 74105 +CUNEIFORM SIGN KA TIMES NE, 74106 +CUNEIFORM SIGN KA TIMES NUN, 74107 +CUNEIFORM SIGN KA TIMES PI, 74108 +CUNEIFORM SIGN KA TIMES RU, 74109 +CUNEIFORM SIGN KA TIMES SA, 74110 +CUNEIFORM SIGN KA TIMES SAR, 74111 +CUNEIFORM SIGN KA TIMES SHA, 74112 +CUNEIFORM SIGN KA TIMES SHE, 74113 +CUNEIFORM SIGN KA TIMES SHID, 74114 +CUNEIFORM SIGN KA TIMES SHU, 74115 +CUNEIFORM SIGN KA TIMES SIG, 74116 +CUNEIFORM SIGN KA TIMES SUHUR, 74117 +CUNEIFORM SIGN KA TIMES TAR, 74118 +CUNEIFORM SIGN KA TIMES U, 74119 +CUNEIFORM SIGN KA TIMES U2, 74120 +CUNEIFORM SIGN KA TIMES UD, 74121 +CUNEIFORM SIGN KA TIMES UMUM TIMES PA, 74122 +CUNEIFORM SIGN KA TIMES USH, 74123 +CUNEIFORM SIGN KA TIMES ZI, 74124 +CUNEIFORM SIGN KA2, 74125 +CUNEIFORM SIGN KA2 CROSSING KA2, 74126 +CUNEIFORM SIGN KAB, 74127 +CUNEIFORM SIGN KAD2, 74128 +CUNEIFORM SIGN KAD3, 74129 +CUNEIFORM SIGN KAD4, 74130 +CUNEIFORM SIGN KAD5, 74131 +CUNEIFORM SIGN KAD5 OVER KAD5, 74132 +CUNEIFORM SIGN KAK, 74133 +CUNEIFORM SIGN KAK TIMES IGI GUNU, 74134 +CUNEIFORM SIGN KAL, 74135 +CUNEIFORM SIGN KAL TIMES BAD, 74136 +CUNEIFORM SIGN KAL CROSSING KAL, 74137 +CUNEIFORM SIGN KAM2, 74138 +CUNEIFORM SIGN KAM4, 74139 +CUNEIFORM SIGN KASKAL, 74140 +CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U, 74141 +CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U, 74142 +CUNEIFORM SIGN KESH2, 74143 +CUNEIFORM SIGN KI, 74144 +CUNEIFORM SIGN KI TIMES BAD, 74145 +CUNEIFORM SIGN KI TIMES U, 74146 +CUNEIFORM SIGN KI TIMES UD, 74147 +CUNEIFORM SIGN KID, 74148 +CUNEIFORM SIGN KIN, 74149 +CUNEIFORM SIGN KISAL, 74150 +CUNEIFORM SIGN KISH, 74151 +CUNEIFORM SIGN KISIM5, 74152 +CUNEIFORM SIGN KISIM5 OVER KISIM5, 74153 +CUNEIFORM SIGN KU, 74154 +CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2, 74155 +CUNEIFORM SIGN KU3, 74156 +CUNEIFORM SIGN KU4, 74157 +CUNEIFORM SIGN KU4 VARIANT FORM, 74158 +CUNEIFORM SIGN KU7, 74159 +CUNEIFORM SIGN KUL, 74160 +CUNEIFORM SIGN KUL GUNU, 74161 +CUNEIFORM SIGN KUN, 74162 +CUNEIFORM SIGN KUR, 74163 +CUNEIFORM SIGN KUR OPPOSING KUR, 74164 +CUNEIFORM SIGN KUSHU2, 74165 +CUNEIFORM SIGN KWU318, 74166 +CUNEIFORM SIGN LA, 74167 +CUNEIFORM SIGN LAGAB, 74168 +CUNEIFORM SIGN LAGAB TIMES A, 74169 +CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA, 74170 +CUNEIFORM SIGN LAGAB TIMES A PLUS GAR, 74171 +CUNEIFORM SIGN LAGAB TIMES A PLUS LAL, 74172 +CUNEIFORM SIGN LAGAB TIMES AL, 74173 +CUNEIFORM SIGN LAGAB TIMES AN, 74174 +CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU, 74175 +CUNEIFORM SIGN LAGAB TIMES BAD, 74176 +CUNEIFORM SIGN LAGAB TIMES BI, 74177 +CUNEIFORM SIGN LAGAB TIMES DAR, 74178 +CUNEIFORM SIGN LAGAB TIMES EN, 74179 +CUNEIFORM SIGN LAGAB TIMES GA, 74180 +CUNEIFORM SIGN LAGAB TIMES GAR, 74181 +CUNEIFORM SIGN LAGAB TIMES GUD, 74182 +CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD, 74183 +CUNEIFORM SIGN LAGAB TIMES HA, 74184 +CUNEIFORM SIGN LAGAB TIMES HAL, 74185 +CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN, 74186 +CUNEIFORM SIGN LAGAB TIMES IGI GUNU, 74187 +CUNEIFORM SIGN LAGAB TIMES IM, 74188 +CUNEIFORM SIGN LAGAB TIMES IM PLUS HA, 74189 +CUNEIFORM SIGN LAGAB TIMES IM PLUS LU, 74190 +CUNEIFORM SIGN LAGAB TIMES KI, 74191 +CUNEIFORM SIGN LAGAB TIMES KIN, 74192 +CUNEIFORM SIGN LAGAB TIMES KU3, 74193 +CUNEIFORM SIGN LAGAB TIMES KUL, 74194 +CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A, 74195 +CUNEIFORM SIGN LAGAB TIMES LAGAB, 74196 +CUNEIFORM SIGN LAGAB TIMES LISH, 74197 +CUNEIFORM SIGN LAGAB TIMES LU, 74198 +CUNEIFORM SIGN LAGAB TIMES LUL, 74199 +CUNEIFORM SIGN LAGAB TIMES ME, 74200 +CUNEIFORM SIGN LAGAB TIMES ME PLUS EN, 74201 +CUNEIFORM SIGN LAGAB TIMES MUSH, 74202 +CUNEIFORM SIGN LAGAB TIMES NE, 74203 +CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM, 74204 +CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2, 74205 +CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU, 74206 +CUNEIFORM SIGN LAGAB TIMES SHU2, 74207 +CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2, 74208 +CUNEIFORM SIGN LAGAB TIMES SUM, 74209 +CUNEIFORM SIGN LAGAB TIMES TAG, 74210 +CUNEIFORM SIGN LAGAB TIMES TAK4, 74211 +CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA, 74212 +CUNEIFORM SIGN LAGAB TIMES U, 74213 +CUNEIFORM SIGN LAGAB TIMES U PLUS A, 74214 +CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U, 74215 +CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH, 74216 +CUNEIFORM SIGN LAGAB TIMES UD, 74217 +CUNEIFORM SIGN LAGAB TIMES USH, 74218 +CUNEIFORM SIGN LAGAB SQUARED, 74219 +CUNEIFORM SIGN LAGAR, 74220 +CUNEIFORM SIGN LAGAR TIMES SHE, 74221 +CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM, 74222 +CUNEIFORM SIGN LAGAR GUNU, 74223 +CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE, 74224 +CUNEIFORM SIGN LAHSHU, 74225 +CUNEIFORM SIGN LAL, 74226 +CUNEIFORM SIGN LAL TIMES LAL, 74227 +CUNEIFORM SIGN LAM, 74228 +CUNEIFORM SIGN LAM TIMES KUR, 74229 +CUNEIFORM SIGN LAM TIMES KUR PLUS RU, 74230 +CUNEIFORM SIGN LI, 74231 +CUNEIFORM SIGN LIL, 74232 +CUNEIFORM SIGN LIMMU2, 74233 +CUNEIFORM SIGN LISH, 74234 +CUNEIFORM SIGN LU, 74235 +CUNEIFORM SIGN LU TIMES BAD, 74236 +CUNEIFORM SIGN LU2, 74237 +CUNEIFORM SIGN LU2 TIMES AL, 74238 +CUNEIFORM SIGN LU2 TIMES BAD, 74239 +CUNEIFORM SIGN LU2 TIMES ESH2, 74240 +CUNEIFORM SIGN LU2 TIMES ESH2 TENU, 74241 +CUNEIFORM SIGN LU2 TIMES GAN2 TENU, 74242 +CUNEIFORM SIGN LU2 TIMES HI TIMES BAD, 74243 +CUNEIFORM SIGN LU2 TIMES IM, 74244 +CUNEIFORM SIGN LU2 TIMES KAD2, 74245 +CUNEIFORM SIGN LU2 TIMES KAD3, 74246 +CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH, 74247 +CUNEIFORM SIGN LU2 TIMES KI, 74248 +CUNEIFORM SIGN LU2 TIMES LA PLUS ASH, 74249 +CUNEIFORM SIGN LU2 TIMES LAGAB, 74250 +CUNEIFORM SIGN LU2 TIMES ME PLUS EN, 74251 +CUNEIFORM SIGN LU2 TIMES NE, 74252 +CUNEIFORM SIGN LU2 TIMES NU, 74253 +CUNEIFORM SIGN LU2 TIMES SI PLUS ASH, 74254 +CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU, 74255 +CUNEIFORM SIGN LU2 TIMES TUG2, 74256 +CUNEIFORM SIGN LU2 TENU, 74257 +CUNEIFORM SIGN LU2 CROSSING LU2, 74258 +CUNEIFORM SIGN LU2 OPPOSING LU2, 74259 +CUNEIFORM SIGN LU2 SQUARED, 74260 +CUNEIFORM SIGN LU2 SHESHIG, 74261 +CUNEIFORM SIGN LU3, 74262 +CUNEIFORM SIGN LUGAL, 74263 +CUNEIFORM SIGN LUGAL OVER LUGAL, 74264 +CUNEIFORM SIGN LUGAL OPPOSING LUGAL, 74265 +CUNEIFORM SIGN LUGAL SHESHIG, 74266 +CUNEIFORM SIGN LUH, 74267 +CUNEIFORM SIGN LUL, 74268 +CUNEIFORM SIGN LUM, 74269 +CUNEIFORM SIGN LUM OVER LUM, 74270 +CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR, 74271 +CUNEIFORM SIGN MA, 74272 +CUNEIFORM SIGN MA TIMES TAK4, 74273 +CUNEIFORM SIGN MA GUNU, 74274 +CUNEIFORM SIGN MA2, 74275 +CUNEIFORM SIGN MAH, 74276 +CUNEIFORM SIGN MAR, 74277 +CUNEIFORM SIGN MASH, 74278 +CUNEIFORM SIGN MASH2, 74279 +CUNEIFORM SIGN ME, 74280 +CUNEIFORM SIGN MES, 74281 +CUNEIFORM SIGN MI, 74282 +CUNEIFORM SIGN MIN, 74283 +CUNEIFORM SIGN MU, 74284 +CUNEIFORM SIGN MU OVER MU, 74285 +CUNEIFORM SIGN MUG, 74286 +CUNEIFORM SIGN MUG GUNU, 74287 +CUNEIFORM SIGN MUNSUB, 74288 +CUNEIFORM SIGN MURGU2, 74289 +CUNEIFORM SIGN MUSH, 74290 +CUNEIFORM SIGN MUSH TIMES A, 74291 +CUNEIFORM SIGN MUSH TIMES KUR, 74292 +CUNEIFORM SIGN MUSH TIMES ZA, 74293 +CUNEIFORM SIGN MUSH OVER MUSH, 74294 +CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA, 74295 +CUNEIFORM SIGN MUSH CROSSING MUSH, 74296 +CUNEIFORM SIGN MUSH3, 74297 +CUNEIFORM SIGN MUSH3 TIMES A, 74298 +CUNEIFORM SIGN MUSH3 TIMES A PLUS DI, 74299 +CUNEIFORM SIGN MUSH3 TIMES DI, 74300 +CUNEIFORM SIGN MUSH3 GUNU, 74301 +CUNEIFORM SIGN NA, 74302 +CUNEIFORM SIGN NA2, 74303 +CUNEIFORM SIGN NAGA, 74304 +CUNEIFORM SIGN NAGA INVERTED, 74305 +CUNEIFORM SIGN NAGA TIMES SHU TENU, 74306 +CUNEIFORM SIGN NAGA OPPOSING NAGA, 74307 +CUNEIFORM SIGN NAGAR, 74308 +CUNEIFORM SIGN NAM NUTILLU, 74309 +CUNEIFORM SIGN NAM, 74310 +CUNEIFORM SIGN NAM2, 74311 +CUNEIFORM SIGN NE, 74312 +CUNEIFORM SIGN NE TIMES A, 74313 +CUNEIFORM SIGN NE TIMES UD, 74314 +CUNEIFORM SIGN NE SHESHIG, 74315 +CUNEIFORM SIGN NI, 74316 +CUNEIFORM SIGN NI TIMES E, 74317 +CUNEIFORM SIGN NI2, 74318 +CUNEIFORM SIGN NIM, 74319 +CUNEIFORM SIGN NIM TIMES GAN2 TENU, 74320 +CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU, 74321 +CUNEIFORM SIGN NINDA2, 74322 +CUNEIFORM SIGN NINDA2 TIMES AN, 74323 +CUNEIFORM SIGN NINDA2 TIMES ASH, 74324 +CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH, 74325 +CUNEIFORM SIGN NINDA2 TIMES GUD, 74326 +CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU, 74327 +CUNEIFORM SIGN NINDA2 TIMES NE, 74328 +CUNEIFORM SIGN NINDA2 TIMES NUN, 74329 +CUNEIFORM SIGN NINDA2 TIMES SHE, 74330 +CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN, 74331 +CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH, 74332 +CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH, 74333 +CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH, 74334 +CUNEIFORM SIGN NINDA2 TIMES USH, 74335 +CUNEIFORM SIGN NISAG, 74336 +CUNEIFORM SIGN NU, 74337 +CUNEIFORM SIGN NU11, 74338 +CUNEIFORM SIGN NUN, 74339 +CUNEIFORM SIGN NUN LAGAR TIMES GAR, 74340 +CUNEIFORM SIGN NUN LAGAR TIMES MASH, 74341 +CUNEIFORM SIGN NUN LAGAR TIMES SAL, 74342 +CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL, 74343 +CUNEIFORM SIGN NUN LAGAR TIMES USH, 74344 +CUNEIFORM SIGN NUN TENU, 74345 +CUNEIFORM SIGN NUN OVER NUN, 74346 +CUNEIFORM SIGN NUN CROSSING NUN, 74347 +CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR, 74348 +CUNEIFORM SIGN NUNUZ, 74349 +CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB, 74350 +CUNEIFORM SIGN NUNUZ AB2 TIMES BI, 74351 +CUNEIFORM SIGN NUNUZ AB2 TIMES DUG, 74352 +CUNEIFORM SIGN NUNUZ AB2 TIMES GUD, 74353 +CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU, 74354 +CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3, 74355 +CUNEIFORM SIGN NUNUZ AB2 TIMES LA, 74356 +CUNEIFORM SIGN NUNUZ AB2 TIMES NE, 74357 +CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3, 74358 +CUNEIFORM SIGN NUNUZ AB2 TIMES U2, 74359 +CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI, 74360 +CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U, 74361 +CUNEIFORM SIGN PA, 74362 +CUNEIFORM SIGN PAD, 74363 +CUNEIFORM SIGN PAN, 74364 +CUNEIFORM SIGN PAP, 74365 +CUNEIFORM SIGN PESH2, 74366 +CUNEIFORM SIGN PI, 74367 +CUNEIFORM SIGN PI TIMES A, 74368 +CUNEIFORM SIGN PI TIMES AB, 74369 +CUNEIFORM SIGN PI TIMES BI, 74370 +CUNEIFORM SIGN PI TIMES BU, 74371 +CUNEIFORM SIGN PI TIMES E, 74372 +CUNEIFORM SIGN PI TIMES I, 74373 +CUNEIFORM SIGN PI TIMES IB, 74374 +CUNEIFORM SIGN PI TIMES U, 74375 +CUNEIFORM SIGN PI TIMES U2, 74376 +CUNEIFORM SIGN PI CROSSING PI, 74377 +CUNEIFORM SIGN PIRIG, 74378 +CUNEIFORM SIGN PIRIG TIMES KAL, 74379 +CUNEIFORM SIGN PIRIG TIMES UD, 74380 +CUNEIFORM SIGN PIRIG TIMES ZA, 74381 +CUNEIFORM SIGN PIRIG OPPOSING PIRIG, 74382 +CUNEIFORM SIGN RA, 74383 +CUNEIFORM SIGN RAB, 74384 +CUNEIFORM SIGN RI, 74385 +CUNEIFORM SIGN RU, 74386 +CUNEIFORM SIGN SA, 74387 +CUNEIFORM SIGN SAG NUTILLU, 74388 +CUNEIFORM SIGN SAG, 74389 +CUNEIFORM SIGN SAG TIMES A, 74390 +CUNEIFORM SIGN SAG TIMES DU, 74391 +CUNEIFORM SIGN SAG TIMES DUB, 74392 +CUNEIFORM SIGN SAG TIMES HA, 74393 +CUNEIFORM SIGN SAG TIMES KAK, 74394 +CUNEIFORM SIGN SAG TIMES KUR, 74395 +CUNEIFORM SIGN SAG TIMES LUM, 74396 +CUNEIFORM SIGN SAG TIMES MI, 74397 +CUNEIFORM SIGN SAG TIMES NUN, 74398 +CUNEIFORM SIGN SAG TIMES SAL, 74399 +CUNEIFORM SIGN SAG TIMES SHID, 74400 +CUNEIFORM SIGN SAG TIMES TAB, 74401 +CUNEIFORM SIGN SAG TIMES U2, 74402 +CUNEIFORM SIGN SAG TIMES UB, 74403 +CUNEIFORM SIGN SAG TIMES UM, 74404 +CUNEIFORM SIGN SAG TIMES UR, 74405 +CUNEIFORM SIGN SAG TIMES USH, 74406 +CUNEIFORM SIGN SAG OVER SAG, 74407 +CUNEIFORM SIGN SAG GUNU, 74408 +CUNEIFORM SIGN SAL, 74409 +CUNEIFORM SIGN SAL LAGAB TIMES ASH2, 74410 +CUNEIFORM SIGN SANGA2, 74411 +CUNEIFORM SIGN SAR, 74412 +CUNEIFORM SIGN SHA, 74413 +CUNEIFORM SIGN SHA3, 74414 +CUNEIFORM SIGN SHA3 TIMES A, 74415 +CUNEIFORM SIGN SHA3 TIMES BAD, 74416 +CUNEIFORM SIGN SHA3 TIMES GISH, 74417 +CUNEIFORM SIGN SHA3 TIMES NE, 74418 +CUNEIFORM SIGN SHA3 TIMES SHU2, 74419 +CUNEIFORM SIGN SHA3 TIMES TUR, 74420 +CUNEIFORM SIGN SHA3 TIMES U, 74421 +CUNEIFORM SIGN SHA3 TIMES U PLUS A, 74422 +CUNEIFORM SIGN SHA6, 74423 +CUNEIFORM SIGN SHAB6, 74424 +CUNEIFORM SIGN SHAR2, 74425 +CUNEIFORM SIGN SHE, 74426 +CUNEIFORM SIGN SHE HU, 74427 +CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR, 74428 +CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR, 74429 +CUNEIFORM SIGN SHEG9, 74430 +CUNEIFORM SIGN SHEN, 74431 +CUNEIFORM SIGN SHESH, 74432 +CUNEIFORM SIGN SHESH2, 74433 +CUNEIFORM SIGN SHESHLAM, 74434 +CUNEIFORM SIGN SHID, 74435 +CUNEIFORM SIGN SHID TIMES A, 74436 +CUNEIFORM SIGN SHID TIMES IM, 74437 +CUNEIFORM SIGN SHIM, 74438 +CUNEIFORM SIGN SHIM TIMES A, 74439 +CUNEIFORM SIGN SHIM TIMES BAL, 74440 +CUNEIFORM SIGN SHIM TIMES BULUG, 74441 +CUNEIFORM SIGN SHIM TIMES DIN, 74442 +CUNEIFORM SIGN SHIM TIMES GAR, 74443 +CUNEIFORM SIGN SHIM TIMES IGI, 74444 +CUNEIFORM SIGN SHIM TIMES IGI GUNU, 74445 +CUNEIFORM SIGN SHIM TIMES KUSHU2, 74446 +CUNEIFORM SIGN SHIM TIMES LUL, 74447 +CUNEIFORM SIGN SHIM TIMES MUG, 74448 +CUNEIFORM SIGN SHIM TIMES SAL, 74449 +CUNEIFORM SIGN SHINIG, 74450 +CUNEIFORM SIGN SHIR, 74451 +CUNEIFORM SIGN SHIR TENU, 74452 +CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR, 74453 +CUNEIFORM SIGN SHITA, 74454 +CUNEIFORM SIGN SHU, 74455 +CUNEIFORM SIGN SHU OVER INVERTED SHU, 74456 +CUNEIFORM SIGN SHU2, 74457 +CUNEIFORM SIGN SHUBUR, 74458 +CUNEIFORM SIGN SI, 74459 +CUNEIFORM SIGN SI GUNU, 74460 +CUNEIFORM SIGN SIG, 74461 +CUNEIFORM SIGN SIG4, 74462 +CUNEIFORM SIGN SIG4 OVER SIG4 SHU2, 74463 +CUNEIFORM SIGN SIK2, 74464 +CUNEIFORM SIGN SILA3, 74465 +CUNEIFORM SIGN SU, 74466 +CUNEIFORM SIGN SU OVER SU, 74467 +CUNEIFORM SIGN SUD, 74468 +CUNEIFORM SIGN SUD2, 74469 +CUNEIFORM SIGN SUHUR, 74470 +CUNEIFORM SIGN SUM, 74471 +CUNEIFORM SIGN SUMASH, 74472 +CUNEIFORM SIGN SUR, 74473 +CUNEIFORM SIGN SUR9, 74474 +CUNEIFORM SIGN TA, 74475 +CUNEIFORM SIGN TA ASTERISK, 74476 +CUNEIFORM SIGN TA TIMES HI, 74477 +CUNEIFORM SIGN TA TIMES MI, 74478 +CUNEIFORM SIGN TA GUNU, 74479 +CUNEIFORM SIGN TAB, 74480 +CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH, 74481 +CUNEIFORM SIGN TAB SQUARED, 74482 +CUNEIFORM SIGN TAG, 74483 +CUNEIFORM SIGN TAG TIMES BI, 74484 +CUNEIFORM SIGN TAG TIMES GUD, 74485 +CUNEIFORM SIGN TAG TIMES SHE, 74486 +CUNEIFORM SIGN TAG TIMES SHU, 74487 +CUNEIFORM SIGN TAG TIMES TUG2, 74488 +CUNEIFORM SIGN TAG TIMES UD, 74489 +CUNEIFORM SIGN TAK4, 74490 +CUNEIFORM SIGN TAR, 74491 +CUNEIFORM SIGN TE, 74492 +CUNEIFORM SIGN TE GUNU, 74493 +CUNEIFORM SIGN TI, 74494 +CUNEIFORM SIGN TI TENU, 74495 +CUNEIFORM SIGN TIL, 74496 +CUNEIFORM SIGN TIR, 74497 +CUNEIFORM SIGN TIR TIMES TAK4, 74498 +CUNEIFORM SIGN TIR OVER TIR, 74499 +CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR, 74500 +CUNEIFORM SIGN TU, 74501 +CUNEIFORM SIGN TUG2, 74502 +CUNEIFORM SIGN TUK, 74503 +CUNEIFORM SIGN TUM, 74504 +CUNEIFORM SIGN TUR, 74505 +CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA, 74506 +CUNEIFORM SIGN U, 74507 +CUNEIFORM SIGN U GUD, 74508 +CUNEIFORM SIGN U U U, 74509 +CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR, 74510 +CUNEIFORM SIGN U OVER U SUR OVER SUR, 74511 +CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED, 74512 +CUNEIFORM SIGN U2, 74513 +CUNEIFORM SIGN UB, 74514 +CUNEIFORM SIGN UD, 74515 +CUNEIFORM SIGN UD KUSHU2, 74516 +CUNEIFORM SIGN UD TIMES BAD, 74517 +CUNEIFORM SIGN UD TIMES MI, 74518 +CUNEIFORM SIGN UD TIMES U PLUS U PLUS U, 74519 +CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU, 74520 +CUNEIFORM SIGN UD GUNU, 74521 +CUNEIFORM SIGN UD SHESHIG, 74522 +CUNEIFORM SIGN UD SHESHIG TIMES BAD, 74523 +CUNEIFORM SIGN UDUG, 74524 +CUNEIFORM SIGN UM, 74525 +CUNEIFORM SIGN UM TIMES LAGAB, 74526 +CUNEIFORM SIGN UM TIMES ME PLUS DA, 74527 +CUNEIFORM SIGN UM TIMES SHA3, 74528 +CUNEIFORM SIGN UM TIMES U, 74529 +CUNEIFORM SIGN UMBIN, 74530 +CUNEIFORM SIGN UMUM, 74531 +CUNEIFORM SIGN UMUM TIMES KASKAL, 74532 +CUNEIFORM SIGN UMUM TIMES PA, 74533 +CUNEIFORM SIGN UN, 74534 +CUNEIFORM SIGN UN GUNU, 74535 +CUNEIFORM SIGN UR, 74536 +CUNEIFORM SIGN UR CROSSING UR, 74537 +CUNEIFORM SIGN UR SHESHIG, 74538 +CUNEIFORM SIGN UR2, 74539 +CUNEIFORM SIGN UR2 TIMES A PLUS HA, 74540 +CUNEIFORM SIGN UR2 TIMES A PLUS NA, 74541 +CUNEIFORM SIGN UR2 TIMES AL, 74542 +CUNEIFORM SIGN UR2 TIMES HA, 74543 +CUNEIFORM SIGN UR2 TIMES NUN, 74544 +CUNEIFORM SIGN UR2 TIMES U2, 74545 +CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH, 74546 +CUNEIFORM SIGN UR2 TIMES U2 PLUS BI, 74547 +CUNEIFORM SIGN UR4, 74548 +CUNEIFORM SIGN URI, 74549 +CUNEIFORM SIGN URI3, 74550 +CUNEIFORM SIGN URU, 74551 +CUNEIFORM SIGN URU TIMES A, 74552 +CUNEIFORM SIGN URU TIMES ASHGAB, 74553 +CUNEIFORM SIGN URU TIMES BAR, 74554 +CUNEIFORM SIGN URU TIMES DUN, 74555 +CUNEIFORM SIGN URU TIMES GA, 74556 +CUNEIFORM SIGN URU TIMES GAL, 74557 +CUNEIFORM SIGN URU TIMES GAN2 TENU, 74558 +CUNEIFORM SIGN URU TIMES GAR, 74559 +CUNEIFORM SIGN URU TIMES GU, 74560 +CUNEIFORM SIGN URU TIMES HA, 74561 +CUNEIFORM SIGN URU TIMES IGI, 74562 +CUNEIFORM SIGN URU TIMES IM, 74563 +CUNEIFORM SIGN URU TIMES ISH, 74564 +CUNEIFORM SIGN URU TIMES KI, 74565 +CUNEIFORM SIGN URU TIMES LUM, 74566 +CUNEIFORM SIGN URU TIMES MIN, 74567 +CUNEIFORM SIGN URU TIMES PA, 74568 +CUNEIFORM SIGN URU TIMES SHE, 74569 +CUNEIFORM SIGN URU TIMES SIG4, 74570 +CUNEIFORM SIGN URU TIMES TU, 74571 +CUNEIFORM SIGN URU TIMES U PLUS GUD, 74572 +CUNEIFORM SIGN URU TIMES UD, 74573 +CUNEIFORM SIGN URU TIMES URUDA, 74574 +CUNEIFORM SIGN URUDA, 74575 +CUNEIFORM SIGN URUDA TIMES U, 74576 +CUNEIFORM SIGN USH, 74577 +CUNEIFORM SIGN USH TIMES A, 74578 +CUNEIFORM SIGN USH TIMES KU, 74579 +CUNEIFORM SIGN USH TIMES KUR, 74580 +CUNEIFORM SIGN USH TIMES TAK4, 74581 +CUNEIFORM SIGN USHX, 74582 +CUNEIFORM SIGN USH2, 74583 +CUNEIFORM SIGN USHUMX, 74584 +CUNEIFORM SIGN UTUKI, 74585 +CUNEIFORM SIGN UZ3, 74586 +CUNEIFORM SIGN UZ3 TIMES KASKAL, 74587 +CUNEIFORM SIGN UZU, 74588 +CUNEIFORM SIGN ZA, 74589 +CUNEIFORM SIGN ZA TENU, 74590 +CUNEIFORM SIGN ZA SQUARED TIMES KUR, 74591 +CUNEIFORM SIGN ZAG, 74592 +CUNEIFORM SIGN ZAMX, 74593 +CUNEIFORM SIGN ZE2, 74594 +CUNEIFORM SIGN ZI, 74595 +CUNEIFORM SIGN ZI OVER ZI, 74596 +CUNEIFORM SIGN ZI3, 74597 +CUNEIFORM SIGN ZIB, 74598 +CUNEIFORM SIGN ZIB KABA TENU, 74599 +CUNEIFORM SIGN ZIG, 74600 +CUNEIFORM SIGN ZIZ2, 74601 +CUNEIFORM SIGN ZU, 74602 +CUNEIFORM SIGN ZU5, 74603 +CUNEIFORM SIGN ZU5 TIMES A, 74604 +CUNEIFORM SIGN ZUBUR, 74605 +CUNEIFORM SIGN ZUM, 74606 +CUNEIFORM SIGN KAP ELAMITE, 74607 +CUNEIFORM SIGN AB TIMES NUN, 74608 +CUNEIFORM SIGN AB2 TIMES A, 74609 +CUNEIFORM SIGN AMAR TIMES KUG, 74610 +CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH, 74611 +CUNEIFORM SIGN DAG3, 74612 +CUNEIFORM SIGN DISH PLUS SHU, 74613 +CUNEIFORM SIGN DUB TIMES SHE, 74614 +CUNEIFORM SIGN EZEN TIMES GUD, 74615 +CUNEIFORM SIGN EZEN TIMES SHE, 74616 +CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A, 74617 +CUNEIFORM SIGN GA2 TIMES ASH2, 74618 +CUNEIFORM SIGN GE22, 74619 +CUNEIFORM SIGN GIG, 74620 +CUNEIFORM SIGN HUSH, 74621 +CUNEIFORM SIGN KA TIMES ANSHE, 74622 +CUNEIFORM SIGN KA TIMES ASH3, 74623 +CUNEIFORM SIGN KA TIMES GISH, 74624 +CUNEIFORM SIGN KA TIMES GUD, 74625 +CUNEIFORM SIGN KA TIMES HI TIMES ASH2, 74626 +CUNEIFORM SIGN KA TIMES LUM, 74627 +CUNEIFORM SIGN KA TIMES PA, 74628 +CUNEIFORM SIGN KA TIMES SHUL, 74629 +CUNEIFORM SIGN KA TIMES TU, 74630 +CUNEIFORM SIGN KA TIMES UR2, 74631 +CUNEIFORM SIGN LAGAB TIMES GI, 74632 +CUNEIFORM SIGN LU2 SHESHIG TIMES BAD, 74633 +CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL, 74634 +CUNEIFORM SIGN LU2 TIMES SHU, 74635 +CUNEIFORM SIGN MESH, 74636 +CUNEIFORM SIGN MUSH3 TIMES ZA, 74637 +CUNEIFORM SIGN NA4, 74638 +CUNEIFORM SIGN NIN, 74639 +CUNEIFORM SIGN NIN9, 74640 +CUNEIFORM SIGN NINDA2 TIMES BAL, 74641 +CUNEIFORM SIGN NINDA2 TIMES GI, 74642 +CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES, 74643 +CUNEIFORM SIGN PESH2 ASTERISK, 74644 +CUNEIFORM SIGN PIR2, 74645 +CUNEIFORM SIGN SAG TIMES IGI GUNU, 74646 +CUNEIFORM SIGN TI2, 74647 +CUNEIFORM SIGN UM TIMES ME, 74648 +CUNEIFORM SIGN U U, 74649 +CUNEIFORM NUMERIC SIGN TWO ASH, 74752 +CUNEIFORM NUMERIC SIGN THREE ASH, 74753 +CUNEIFORM NUMERIC SIGN FOUR ASH, 74754 +CUNEIFORM NUMERIC SIGN FIVE ASH, 74755 +CUNEIFORM NUMERIC SIGN SIX ASH, 74756 +CUNEIFORM NUMERIC SIGN SEVEN ASH, 74757 +CUNEIFORM NUMERIC SIGN EIGHT ASH, 74758 +CUNEIFORM NUMERIC SIGN NINE ASH, 74759 +CUNEIFORM NUMERIC SIGN THREE DISH, 74760 +CUNEIFORM NUMERIC SIGN FOUR DISH, 74761 +CUNEIFORM NUMERIC SIGN FIVE DISH, 74762 +CUNEIFORM NUMERIC SIGN SIX DISH, 74763 +CUNEIFORM NUMERIC SIGN SEVEN DISH, 74764 +CUNEIFORM NUMERIC SIGN EIGHT DISH, 74765 +CUNEIFORM NUMERIC SIGN NINE DISH, 74766 +CUNEIFORM NUMERIC SIGN FOUR U, 74767 +CUNEIFORM NUMERIC SIGN FIVE U, 74768 +CUNEIFORM NUMERIC SIGN SIX U, 74769 +CUNEIFORM NUMERIC SIGN SEVEN U, 74770 +CUNEIFORM NUMERIC SIGN EIGHT U, 74771 +CUNEIFORM NUMERIC SIGN NINE U, 74772 +CUNEIFORM NUMERIC SIGN ONE GESH2, 74773 +CUNEIFORM NUMERIC SIGN TWO GESH2, 74774 +CUNEIFORM NUMERIC SIGN THREE GESH2, 74775 +CUNEIFORM NUMERIC SIGN FOUR GESH2, 74776 +CUNEIFORM NUMERIC SIGN FIVE GESH2, 74777 +CUNEIFORM NUMERIC SIGN SIX GESH2, 74778 +CUNEIFORM NUMERIC SIGN SEVEN GESH2, 74779 +CUNEIFORM NUMERIC SIGN EIGHT GESH2, 74780 +CUNEIFORM NUMERIC SIGN NINE GESH2, 74781 +CUNEIFORM NUMERIC SIGN ONE GESHU, 74782 +CUNEIFORM NUMERIC SIGN TWO GESHU, 74783 +CUNEIFORM NUMERIC SIGN THREE GESHU, 74784 +CUNEIFORM NUMERIC SIGN FOUR GESHU, 74785 +CUNEIFORM NUMERIC SIGN FIVE GESHU, 74786 +CUNEIFORM NUMERIC SIGN TWO SHAR2, 74787 +CUNEIFORM NUMERIC SIGN THREE SHAR2, 74788 +CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM, 74789 +CUNEIFORM NUMERIC SIGN FOUR SHAR2, 74790 +CUNEIFORM NUMERIC SIGN FIVE SHAR2, 74791 +CUNEIFORM NUMERIC SIGN SIX SHAR2, 74792 +CUNEIFORM NUMERIC SIGN SEVEN SHAR2, 74793 +CUNEIFORM NUMERIC SIGN EIGHT SHAR2, 74794 +CUNEIFORM NUMERIC SIGN NINE SHAR2, 74795 +CUNEIFORM NUMERIC SIGN ONE SHARU, 74796 +CUNEIFORM NUMERIC SIGN TWO SHARU, 74797 +CUNEIFORM NUMERIC SIGN THREE SHARU, 74798 +CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM, 74799 +CUNEIFORM NUMERIC SIGN FOUR SHARU, 74800 +CUNEIFORM NUMERIC SIGN FIVE SHARU, 74801 +CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH, 74802 +CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN, 74803 +CUNEIFORM NUMERIC SIGN ONE BURU, 74804 +CUNEIFORM NUMERIC SIGN TWO BURU, 74805 +CUNEIFORM NUMERIC SIGN THREE BURU, 74806 +CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM, 74807 +CUNEIFORM NUMERIC SIGN FOUR BURU, 74808 +CUNEIFORM NUMERIC SIGN FIVE BURU, 74809 +CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16, 74810 +CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21, 74811 +CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU, 74812 +CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4, 74813 +CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A, 74814 +CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B, 74815 +CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9, 74816 +CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3, 74817 +CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A, 74818 +CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B, 74819 +CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU, 74820 +CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3, 74821 +CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU, 74822 +CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3, 74823 +CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4, 74824 +CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A, 74825 +CUNEIFORM NUMERIC SIGN TWO ASH TENU, 74826 +CUNEIFORM NUMERIC SIGN THREE ASH TENU, 74827 +CUNEIFORM NUMERIC SIGN FOUR ASH TENU, 74828 +CUNEIFORM NUMERIC SIGN FIVE ASH TENU, 74829 +CUNEIFORM NUMERIC SIGN SIX ASH TENU, 74830 +CUNEIFORM NUMERIC SIGN ONE BAN2, 74831 +CUNEIFORM NUMERIC SIGN TWO BAN2, 74832 +CUNEIFORM NUMERIC SIGN THREE BAN2, 74833 +CUNEIFORM NUMERIC SIGN FOUR BAN2, 74834 +CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM, 74835 +CUNEIFORM NUMERIC SIGN FIVE BAN2, 74836 +CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM, 74837 +CUNEIFORM NUMERIC SIGN NIGIDAMIN, 74838 +CUNEIFORM NUMERIC SIGN NIGIDAESH, 74839 +CUNEIFORM NUMERIC SIGN ONE ESHE3, 74840 +CUNEIFORM NUMERIC SIGN TWO ESHE3, 74841 +CUNEIFORM NUMERIC SIGN ONE THIRD DISH, 74842 +CUNEIFORM NUMERIC SIGN TWO THIRDS DISH, 74843 +CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH, 74844 +CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A, 74845 +CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A, 74846 +CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH, 74847 +CUNEIFORM NUMERIC SIGN ONE QUARTER ASH, 74848 +CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH, 74849 +CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER, 74850 +CUNEIFORM NUMERIC SIGN ONE QUARTER GUR, 74851 +CUNEIFORM NUMERIC SIGN ONE HALF GUR, 74852 +CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD, 74853 +CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS, 74854 +CUNEIFORM NUMERIC SIGN ELAMITE FORTY, 74855 +CUNEIFORM NUMERIC SIGN ELAMITE FIFTY, 74856 +CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM, 74857 +CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM, 74858 +CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM, 74859 +CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM, 74860 +CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM, 74861 +CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM, 74862 +CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER, 74864 +CUNEIFORM PUNCTUATION SIGN VERTICAL COLON, 74865 +CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON, 74866 +CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON, 74867 +CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON, 74868 +CUNEIFORM SIGN AB TIMES NUN TENU, 74880 +CUNEIFORM SIGN AB TIMES SHU2, 74881 +CUNEIFORM SIGN AD TIMES ESH2, 74882 +CUNEIFORM SIGN BAD TIMES DISH TENU, 74883 +CUNEIFORM SIGN BAHAR2 TIMES AB2, 74884 +CUNEIFORM SIGN BAHAR2 TIMES NI, 74885 +CUNEIFORM SIGN BAHAR2 TIMES ZA, 74886 +CUNEIFORM SIGN BU OVER BU TIMES NA2, 74887 +CUNEIFORM SIGN DA TIMES TAK4, 74888 +CUNEIFORM SIGN DAG TIMES KUR, 74889 +CUNEIFORM SIGN DIM TIMES IGI, 74890 +CUNEIFORM SIGN DIM TIMES U U U, 74891 +CUNEIFORM SIGN DIM2 TIMES UD, 74892 +CUNEIFORM SIGN DUG TIMES ANSHE, 74893 +CUNEIFORM SIGN DUG TIMES ASH, 74894 +CUNEIFORM SIGN DUG TIMES ASH AT LEFT, 74895 +CUNEIFORM SIGN DUG TIMES DIN, 74896 +CUNEIFORM SIGN DUG TIMES DUN, 74897 +CUNEIFORM SIGN DUG TIMES ERIN2, 74898 +CUNEIFORM SIGN DUG TIMES GA, 74899 +CUNEIFORM SIGN DUG TIMES GI, 74900 +CUNEIFORM SIGN DUG TIMES GIR2 GUNU, 74901 +CUNEIFORM SIGN DUG TIMES GISH, 74902 +CUNEIFORM SIGN DUG TIMES HA, 74903 +CUNEIFORM SIGN DUG TIMES HI, 74904 +CUNEIFORM SIGN DUG TIMES IGI GUNU, 74905 +CUNEIFORM SIGN DUG TIMES KASKAL, 74906 +CUNEIFORM SIGN DUG TIMES KUR, 74907 +CUNEIFORM SIGN DUG TIMES KUSHU2, 74908 +CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL, 74909 +CUNEIFORM SIGN DUG TIMES LAK 020, 74910 +CUNEIFORM SIGN DUG TIMES LAM, 74911 +CUNEIFORM SIGN DUG TIMES LAM TIMES KUR, 74912 +CUNEIFORM SIGN DUG TIMES LUH PLUS GISH, 74913 +CUNEIFORM SIGN DUG TIMES MASH, 74914 +CUNEIFORM SIGN DUG TIMES MES, 74915 +CUNEIFORM SIGN DUG TIMES MI, 74916 +CUNEIFORM SIGN DUG TIMES NI, 74917 +CUNEIFORM SIGN DUG TIMES PI, 74918 +CUNEIFORM SIGN DUG TIMES SHE, 74919 +CUNEIFORM SIGN DUG TIMES SI GUNU, 74920 +CUNEIFORM SIGN E2 TIMES KUR, 74921 +CUNEIFORM SIGN E2 TIMES PAP, 74922 +CUNEIFORM SIGN ERIN2 X, 74923 +CUNEIFORM SIGN ESH2 CROSSING ESH2, 74924 +CUNEIFORM SIGN EZEN SHESHIG TIMES ASH, 74925 +CUNEIFORM SIGN EZEN SHESHIG TIMES HI, 74926 +CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU, 74927 +CUNEIFORM SIGN EZEN SHESHIG TIMES LA, 74928 +CUNEIFORM SIGN EZEN SHESHIG TIMES LAL, 74929 +CUNEIFORM SIGN EZEN SHESHIG TIMES ME, 74930 +CUNEIFORM SIGN EZEN SHESHIG TIMES MES, 74931 +CUNEIFORM SIGN EZEN SHESHIG TIMES SU, 74932 +CUNEIFORM SIGN EZEN TIMES SU, 74933 +CUNEIFORM SIGN GA2 TIMES BAHAR2, 74934 +CUNEIFORM SIGN GA2 TIMES DIM GUNU, 74935 +CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU, 74936 +CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL, 74937 +CUNEIFORM SIGN GA2 TIMES EREN, 74938 +CUNEIFORM SIGN GA2 TIMES GA, 74939 +CUNEIFORM SIGN GA2 TIMES GAR PLUS DI, 74940 +CUNEIFORM SIGN GA2 TIMES GAR PLUS NE, 74941 +CUNEIFORM SIGN GA2 TIMES HA PLUS A, 74942 +CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL, 74943 +CUNEIFORM SIGN GA2 TIMES LAM, 74944 +CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR, 74945 +CUNEIFORM SIGN GA2 TIMES LUH, 74946 +CUNEIFORM SIGN GA2 TIMES MUSH, 74947 +CUNEIFORM SIGN GA2 TIMES NE, 74948 +CUNEIFORM SIGN GA2 TIMES NE PLUS E2, 74949 +CUNEIFORM SIGN GA2 TIMES NE PLUS GI, 74950 +CUNEIFORM SIGN GA2 TIMES SHIM, 74951 +CUNEIFORM SIGN GA2 TIMES ZIZ2, 74952 +CUNEIFORM SIGN GABA ROTATED NINETY DEGREES, 74953 +CUNEIFORM SIGN GESHTIN TIMES U, 74954 +CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH, 74955 +CUNEIFORM SIGN GU2 TIMES IGI GUNU, 74956 +CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4, 74957 +CUNEIFORM SIGN HA TENU GUNU, 74958 +CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH, 74959 +CUNEIFORM SIGN KA TIMES BU, 74960 +CUNEIFORM SIGN KA TIMES KA, 74961 +CUNEIFORM SIGN KA TIMES U U U, 74962 +CUNEIFORM SIGN KA TIMES UR, 74963 +CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU, 74964 +CUNEIFORM SIGN LAK 003, 74965 +CUNEIFORM SIGN LAK 021, 74966 +CUNEIFORM SIGN LAK 025, 74967 +CUNEIFORM SIGN LAK 030, 74968 +CUNEIFORM SIGN LAK 050, 74969 +CUNEIFORM SIGN LAK 051, 74970 +CUNEIFORM SIGN LAK 062, 74971 +CUNEIFORM SIGN LAK 079 OVER LAK 079 GUNU, 74972 +CUNEIFORM SIGN LAK 080, 74973 +CUNEIFORM SIGN LAK 081 OVER LAK 081, 74974 +CUNEIFORM SIGN LAK 092, 74975 +CUNEIFORM SIGN LAK 130, 74976 +CUNEIFORM SIGN LAK 142, 74977 +CUNEIFORM SIGN LAK 210, 74978 +CUNEIFORM SIGN LAK 219, 74979 +CUNEIFORM SIGN LAK 220, 74980 +CUNEIFORM SIGN LAK 225, 74981 +CUNEIFORM SIGN LAK 228, 74982 +CUNEIFORM SIGN LAK 238, 74983 +CUNEIFORM SIGN LAK 265, 74984 +CUNEIFORM SIGN LAK 266, 74985 +CUNEIFORM SIGN LAK 343, 74986 +CUNEIFORM SIGN LAK 347, 74987 +CUNEIFORM SIGN LAK 348, 74988 +CUNEIFORM SIGN LAK 383, 74989 +CUNEIFORM SIGN LAK 384, 74990 +CUNEIFORM SIGN LAK 390, 74991 +CUNEIFORM SIGN LAK 441, 74992 +CUNEIFORM SIGN LAK 449, 74993 +CUNEIFORM SIGN LAK 449 TIMES GU, 74994 +CUNEIFORM SIGN LAK 449 TIMES IGI, 74995 +CUNEIFORM SIGN LAK 449 TIMES PAP PLUS LU3, 74996 +CUNEIFORM SIGN LAK 449 TIMES PAP PLUS PAP PLUS LU3, 74997 +CUNEIFORM SIGN LAK 449 TIMES U2 PLUS BA, 74998 +CUNEIFORM SIGN LAK 450, 74999 +CUNEIFORM SIGN LAK 457, 75000 +CUNEIFORM SIGN LAK 470, 75001 +CUNEIFORM SIGN LAK 483, 75002 +CUNEIFORM SIGN LAK 490, 75003 +CUNEIFORM SIGN LAK 492, 75004 +CUNEIFORM SIGN LAK 493, 75005 +CUNEIFORM SIGN LAK 495, 75006 +CUNEIFORM SIGN LAK 550, 75007 +CUNEIFORM SIGN LAK 608, 75008 +CUNEIFORM SIGN LAK 617, 75009 +CUNEIFORM SIGN LAK 617 TIMES ASH, 75010 +CUNEIFORM SIGN LAK 617 TIMES BAD, 75011 +CUNEIFORM SIGN LAK 617 TIMES DUN3 GUNU GUNU, 75012 +CUNEIFORM SIGN LAK 617 TIMES KU3, 75013 +CUNEIFORM SIGN LAK 617 TIMES LA, 75014 +CUNEIFORM SIGN LAK 617 TIMES TAR, 75015 +CUNEIFORM SIGN LAK 617 TIMES TE, 75016 +CUNEIFORM SIGN LAK 617 TIMES U2, 75017 +CUNEIFORM SIGN LAK 617 TIMES UD, 75018 +CUNEIFORM SIGN LAK 617 TIMES URUDA, 75019 +CUNEIFORM SIGN LAK 636, 75020 +CUNEIFORM SIGN LAK 648, 75021 +CUNEIFORM SIGN LAK 648 TIMES DUB, 75022 +CUNEIFORM SIGN LAK 648 TIMES GA, 75023 +CUNEIFORM SIGN LAK 648 TIMES IGI, 75024 +CUNEIFORM SIGN LAK 648 TIMES IGI GUNU, 75025 +CUNEIFORM SIGN LAK 648 TIMES NI, 75026 +CUNEIFORM SIGN LAK 648 TIMES PAP PLUS PAP PLUS LU3, 75027 +CUNEIFORM SIGN LAK 648 TIMES SHESH PLUS KI, 75028 +CUNEIFORM SIGN LAK 648 TIMES UD, 75029 +CUNEIFORM SIGN LAK 648 TIMES URUDA, 75030 +CUNEIFORM SIGN LAK 724, 75031 +CUNEIFORM SIGN LAK 749, 75032 +CUNEIFORM SIGN LU2 GUNU TIMES ASH, 75033 +CUNEIFORM SIGN LU2 TIMES DISH, 75034 +CUNEIFORM SIGN LU2 TIMES HAL, 75035 +CUNEIFORM SIGN LU2 TIMES PAP, 75036 +CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3, 75037 +CUNEIFORM SIGN LU2 TIMES TAK4, 75038 +CUNEIFORM SIGN MI PLUS ZA7, 75039 +CUNEIFORM SIGN MUSH OVER MUSH TIMES GA, 75040 +CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK, 75041 +CUNEIFORM SIGN NINDA2 TIMES DIM GUNU, 75042 +CUNEIFORM SIGN NINDA2 TIMES GISH, 75043 +CUNEIFORM SIGN NINDA2 TIMES GUL, 75044 +CUNEIFORM SIGN NINDA2 TIMES HI, 75045 +CUNEIFORM SIGN NINDA2 TIMES KESH2, 75046 +CUNEIFORM SIGN NINDA2 TIMES LAK 050, 75047 +CUNEIFORM SIGN NINDA2 TIMES MASH, 75048 +CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP, 75049 +CUNEIFORM SIGN NINDA2 TIMES U, 75050 +CUNEIFORM SIGN NINDA2 TIMES U PLUS U, 75051 +CUNEIFORM SIGN NINDA2 TIMES URUDA, 75052 +CUNEIFORM SIGN SAG GUNU TIMES HA, 75053 +CUNEIFORM SIGN SAG TIMES EN, 75054 +CUNEIFORM SIGN SAG TIMES SHE AT LEFT, 75055 +CUNEIFORM SIGN SAG TIMES TAK4, 75056 +CUNEIFORM SIGN SHA6 TENU, 75057 +CUNEIFORM SIGN SHE OVER SHE, 75058 +CUNEIFORM SIGN SHE PLUS HUB2, 75059 +CUNEIFORM SIGN SHE PLUS NAM2, 75060 +CUNEIFORM SIGN SHE PLUS SAR, 75061 +CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI, 75062 +CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN, 75063 +CUNEIFORM SIGN SI TIMES TAK4, 75064 +CUNEIFORM SIGN TAK4 PLUS SAG, 75065 +CUNEIFORM SIGN TUM TIMES GAN2 TENU, 75066 +CUNEIFORM SIGN TUM TIMES THREE DISH, 75067 +CUNEIFORM SIGN UR2 INVERTED, 75068 +CUNEIFORM SIGN UR2 TIMES UD, 75069 +CUNEIFORM SIGN URU TIMES DARA3, 75070 +CUNEIFORM SIGN URU TIMES LAK 668, 75071 +CUNEIFORM SIGN URU TIMES LU3, 75072 +CUNEIFORM SIGN ZA7, 75073 +CUNEIFORM SIGN ZU OVER ZU PLUS SAR, 75074 +CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU, 75075 +EGYPTIAN HIEROGLYPH A001, 77824 +EGYPTIAN HIEROGLYPH A002, 77825 +EGYPTIAN HIEROGLYPH A003, 77826 +EGYPTIAN HIEROGLYPH A004, 77827 +EGYPTIAN HIEROGLYPH A005, 77828 +EGYPTIAN HIEROGLYPH A005A, 77829 +EGYPTIAN HIEROGLYPH A006, 77830 +EGYPTIAN HIEROGLYPH A006A, 77831 +EGYPTIAN HIEROGLYPH A006B, 77832 +EGYPTIAN HIEROGLYPH A007, 77833 +EGYPTIAN HIEROGLYPH A008, 77834 +EGYPTIAN HIEROGLYPH A009, 77835 +EGYPTIAN HIEROGLYPH A010, 77836 +EGYPTIAN HIEROGLYPH A011, 77837 +EGYPTIAN HIEROGLYPH A012, 77838 +EGYPTIAN HIEROGLYPH A013, 77839 +EGYPTIAN HIEROGLYPH A014, 77840 +EGYPTIAN HIEROGLYPH A014A, 77841 +EGYPTIAN HIEROGLYPH A015, 77842 +EGYPTIAN HIEROGLYPH A016, 77843 +EGYPTIAN HIEROGLYPH A017, 77844 +EGYPTIAN HIEROGLYPH A017A, 77845 +EGYPTIAN HIEROGLYPH A018, 77846 +EGYPTIAN HIEROGLYPH A019, 77847 +EGYPTIAN HIEROGLYPH A020, 77848 +EGYPTIAN HIEROGLYPH A021, 77849 +EGYPTIAN HIEROGLYPH A022, 77850 +EGYPTIAN HIEROGLYPH A023, 77851 +EGYPTIAN HIEROGLYPH A024, 77852 +EGYPTIAN HIEROGLYPH A025, 77853 +EGYPTIAN HIEROGLYPH A026, 77854 +EGYPTIAN HIEROGLYPH A027, 77855 +EGYPTIAN HIEROGLYPH A028, 77856 +EGYPTIAN HIEROGLYPH A029, 77857 +EGYPTIAN HIEROGLYPH A030, 77858 +EGYPTIAN HIEROGLYPH A031, 77859 +EGYPTIAN HIEROGLYPH A032, 77860 +EGYPTIAN HIEROGLYPH A032A, 77861 +EGYPTIAN HIEROGLYPH A033, 77862 +EGYPTIAN HIEROGLYPH A034, 77863 +EGYPTIAN HIEROGLYPH A035, 77864 +EGYPTIAN HIEROGLYPH A036, 77865 +EGYPTIAN HIEROGLYPH A037, 77866 +EGYPTIAN HIEROGLYPH A038, 77867 +EGYPTIAN HIEROGLYPH A039, 77868 +EGYPTIAN HIEROGLYPH A040, 77869 +EGYPTIAN HIEROGLYPH A040A, 77870 +EGYPTIAN HIEROGLYPH A041, 77871 +EGYPTIAN HIEROGLYPH A042, 77872 +EGYPTIAN HIEROGLYPH A042A, 77873 +EGYPTIAN HIEROGLYPH A043, 77874 +EGYPTIAN HIEROGLYPH A043A, 77875 +EGYPTIAN HIEROGLYPH A044, 77876 +EGYPTIAN HIEROGLYPH A045, 77877 +EGYPTIAN HIEROGLYPH A045A, 77878 +EGYPTIAN HIEROGLYPH A046, 77879 +EGYPTIAN HIEROGLYPH A047, 77880 +EGYPTIAN HIEROGLYPH A048, 77881 +EGYPTIAN HIEROGLYPH A049, 77882 +EGYPTIAN HIEROGLYPH A050, 77883 +EGYPTIAN HIEROGLYPH A051, 77884 +EGYPTIAN HIEROGLYPH A052, 77885 +EGYPTIAN HIEROGLYPH A053, 77886 +EGYPTIAN HIEROGLYPH A054, 77887 +EGYPTIAN HIEROGLYPH A055, 77888 +EGYPTIAN HIEROGLYPH A056, 77889 +EGYPTIAN HIEROGLYPH A057, 77890 +EGYPTIAN HIEROGLYPH A058, 77891 +EGYPTIAN HIEROGLYPH A059, 77892 +EGYPTIAN HIEROGLYPH A060, 77893 +EGYPTIAN HIEROGLYPH A061, 77894 +EGYPTIAN HIEROGLYPH A062, 77895 +EGYPTIAN HIEROGLYPH A063, 77896 +EGYPTIAN HIEROGLYPH A064, 77897 +EGYPTIAN HIEROGLYPH A065, 77898 +EGYPTIAN HIEROGLYPH A066, 77899 +EGYPTIAN HIEROGLYPH A067, 77900 +EGYPTIAN HIEROGLYPH A068, 77901 +EGYPTIAN HIEROGLYPH A069, 77902 +EGYPTIAN HIEROGLYPH A070, 77903 +EGYPTIAN HIEROGLYPH B001, 77904 +EGYPTIAN HIEROGLYPH B002, 77905 +EGYPTIAN HIEROGLYPH B003, 77906 +EGYPTIAN HIEROGLYPH B004, 77907 +EGYPTIAN HIEROGLYPH B005, 77908 +EGYPTIAN HIEROGLYPH B005A, 77909 +EGYPTIAN HIEROGLYPH B006, 77910 +EGYPTIAN HIEROGLYPH B007, 77911 +EGYPTIAN HIEROGLYPH B008, 77912 +EGYPTIAN HIEROGLYPH B009, 77913 +EGYPTIAN HIEROGLYPH C001, 77914 +EGYPTIAN HIEROGLYPH C002, 77915 +EGYPTIAN HIEROGLYPH C002A, 77916 +EGYPTIAN HIEROGLYPH C002B, 77917 +EGYPTIAN HIEROGLYPH C002C, 77918 +EGYPTIAN HIEROGLYPH C003, 77919 +EGYPTIAN HIEROGLYPH C004, 77920 +EGYPTIAN HIEROGLYPH C005, 77921 +EGYPTIAN HIEROGLYPH C006, 77922 +EGYPTIAN HIEROGLYPH C007, 77923 +EGYPTIAN HIEROGLYPH C008, 77924 +EGYPTIAN HIEROGLYPH C009, 77925 +EGYPTIAN HIEROGLYPH C010, 77926 +EGYPTIAN HIEROGLYPH C010A, 77927 +EGYPTIAN HIEROGLYPH C011, 77928 +EGYPTIAN HIEROGLYPH C012, 77929 +EGYPTIAN HIEROGLYPH C013, 77930 +EGYPTIAN HIEROGLYPH C014, 77931 +EGYPTIAN HIEROGLYPH C015, 77932 +EGYPTIAN HIEROGLYPH C016, 77933 +EGYPTIAN HIEROGLYPH C017, 77934 +EGYPTIAN HIEROGLYPH C018, 77935 +EGYPTIAN HIEROGLYPH C019, 77936 +EGYPTIAN HIEROGLYPH C020, 77937 +EGYPTIAN HIEROGLYPH C021, 77938 +EGYPTIAN HIEROGLYPH C022, 77939 +EGYPTIAN HIEROGLYPH C023, 77940 +EGYPTIAN HIEROGLYPH C024, 77941 +EGYPTIAN HIEROGLYPH D001, 77942 +EGYPTIAN HIEROGLYPH D002, 77943 +EGYPTIAN HIEROGLYPH D003, 77944 +EGYPTIAN HIEROGLYPH D004, 77945 +EGYPTIAN HIEROGLYPH D005, 77946 +EGYPTIAN HIEROGLYPH D006, 77947 +EGYPTIAN HIEROGLYPH D007, 77948 +EGYPTIAN HIEROGLYPH D008, 77949 +EGYPTIAN HIEROGLYPH D008A, 77950 +EGYPTIAN HIEROGLYPH D009, 77951 +EGYPTIAN HIEROGLYPH D010, 77952 +EGYPTIAN HIEROGLYPH D011, 77953 +EGYPTIAN HIEROGLYPH D012, 77954 +EGYPTIAN HIEROGLYPH D013, 77955 +EGYPTIAN HIEROGLYPH D014, 77956 +EGYPTIAN HIEROGLYPH D015, 77957 +EGYPTIAN HIEROGLYPH D016, 77958 +EGYPTIAN HIEROGLYPH D017, 77959 +EGYPTIAN HIEROGLYPH D018, 77960 +EGYPTIAN HIEROGLYPH D019, 77961 +EGYPTIAN HIEROGLYPH D020, 77962 +EGYPTIAN HIEROGLYPH D021, 77963 +EGYPTIAN HIEROGLYPH D022, 77964 +EGYPTIAN HIEROGLYPH D023, 77965 +EGYPTIAN HIEROGLYPH D024, 77966 +EGYPTIAN HIEROGLYPH D025, 77967 +EGYPTIAN HIEROGLYPH D026, 77968 +EGYPTIAN HIEROGLYPH D027, 77969 +EGYPTIAN HIEROGLYPH D027A, 77970 +EGYPTIAN HIEROGLYPH D028, 77971 +EGYPTIAN HIEROGLYPH D029, 77972 +EGYPTIAN HIEROGLYPH D030, 77973 +EGYPTIAN HIEROGLYPH D031, 77974 +EGYPTIAN HIEROGLYPH D031A, 77975 +EGYPTIAN HIEROGLYPH D032, 77976 +EGYPTIAN HIEROGLYPH D033, 77977 +EGYPTIAN HIEROGLYPH D034, 77978 +EGYPTIAN HIEROGLYPH D034A, 77979 +EGYPTIAN HIEROGLYPH D035, 77980 +EGYPTIAN HIEROGLYPH D036, 77981 +EGYPTIAN HIEROGLYPH D037, 77982 +EGYPTIAN HIEROGLYPH D038, 77983 +EGYPTIAN HIEROGLYPH D039, 77984 +EGYPTIAN HIEROGLYPH D040, 77985 +EGYPTIAN HIEROGLYPH D041, 77986 +EGYPTIAN HIEROGLYPH D042, 77987 +EGYPTIAN HIEROGLYPH D043, 77988 +EGYPTIAN HIEROGLYPH D044, 77989 +EGYPTIAN HIEROGLYPH D045, 77990 +EGYPTIAN HIEROGLYPH D046, 77991 +EGYPTIAN HIEROGLYPH D046A, 77992 +EGYPTIAN HIEROGLYPH D047, 77993 +EGYPTIAN HIEROGLYPH D048, 77994 +EGYPTIAN HIEROGLYPH D048A, 77995 +EGYPTIAN HIEROGLYPH D049, 77996 +EGYPTIAN HIEROGLYPH D050, 77997 +EGYPTIAN HIEROGLYPH D050A, 77998 +EGYPTIAN HIEROGLYPH D050B, 77999 +EGYPTIAN HIEROGLYPH D050C, 78000 +EGYPTIAN HIEROGLYPH D050D, 78001 +EGYPTIAN HIEROGLYPH D050E, 78002 +EGYPTIAN HIEROGLYPH D050F, 78003 +EGYPTIAN HIEROGLYPH D050G, 78004 +EGYPTIAN HIEROGLYPH D050H, 78005 +EGYPTIAN HIEROGLYPH D050I, 78006 +EGYPTIAN HIEROGLYPH D051, 78007 +EGYPTIAN HIEROGLYPH D052, 78008 +EGYPTIAN HIEROGLYPH D052A, 78009 +EGYPTIAN HIEROGLYPH D053, 78010 +EGYPTIAN HIEROGLYPH D054, 78011 +EGYPTIAN HIEROGLYPH D054A, 78012 +EGYPTIAN HIEROGLYPH D055, 78013 +EGYPTIAN HIEROGLYPH D056, 78014 +EGYPTIAN HIEROGLYPH D057, 78015 +EGYPTIAN HIEROGLYPH D058, 78016 +EGYPTIAN HIEROGLYPH D059, 78017 +EGYPTIAN HIEROGLYPH D060, 78018 +EGYPTIAN HIEROGLYPH D061, 78019 +EGYPTIAN HIEROGLYPH D062, 78020 +EGYPTIAN HIEROGLYPH D063, 78021 +EGYPTIAN HIEROGLYPH D064, 78022 +EGYPTIAN HIEROGLYPH D065, 78023 +EGYPTIAN HIEROGLYPH D066, 78024 +EGYPTIAN HIEROGLYPH D067, 78025 +EGYPTIAN HIEROGLYPH D067A, 78026 +EGYPTIAN HIEROGLYPH D067B, 78027 +EGYPTIAN HIEROGLYPH D067C, 78028 +EGYPTIAN HIEROGLYPH D067D, 78029 +EGYPTIAN HIEROGLYPH D067E, 78030 +EGYPTIAN HIEROGLYPH D067F, 78031 +EGYPTIAN HIEROGLYPH D067G, 78032 +EGYPTIAN HIEROGLYPH D067H, 78033 +EGYPTIAN HIEROGLYPH E001, 78034 +EGYPTIAN HIEROGLYPH E002, 78035 +EGYPTIAN HIEROGLYPH E003, 78036 +EGYPTIAN HIEROGLYPH E004, 78037 +EGYPTIAN HIEROGLYPH E005, 78038 +EGYPTIAN HIEROGLYPH E006, 78039 +EGYPTIAN HIEROGLYPH E007, 78040 +EGYPTIAN HIEROGLYPH E008, 78041 +EGYPTIAN HIEROGLYPH E008A, 78042 +EGYPTIAN HIEROGLYPH E009, 78043 +EGYPTIAN HIEROGLYPH E009A, 78044 +EGYPTIAN HIEROGLYPH E010, 78045 +EGYPTIAN HIEROGLYPH E011, 78046 +EGYPTIAN HIEROGLYPH E012, 78047 +EGYPTIAN HIEROGLYPH E013, 78048 +EGYPTIAN HIEROGLYPH E014, 78049 +EGYPTIAN HIEROGLYPH E015, 78050 +EGYPTIAN HIEROGLYPH E016, 78051 +EGYPTIAN HIEROGLYPH E016A, 78052 +EGYPTIAN HIEROGLYPH E017, 78053 +EGYPTIAN HIEROGLYPH E017A, 78054 +EGYPTIAN HIEROGLYPH E018, 78055 +EGYPTIAN HIEROGLYPH E019, 78056 +EGYPTIAN HIEROGLYPH E020, 78057 +EGYPTIAN HIEROGLYPH E020A, 78058 +EGYPTIAN HIEROGLYPH E021, 78059 +EGYPTIAN HIEROGLYPH E022, 78060 +EGYPTIAN HIEROGLYPH E023, 78061 +EGYPTIAN HIEROGLYPH E024, 78062 +EGYPTIAN HIEROGLYPH E025, 78063 +EGYPTIAN HIEROGLYPH E026, 78064 +EGYPTIAN HIEROGLYPH E027, 78065 +EGYPTIAN HIEROGLYPH E028, 78066 +EGYPTIAN HIEROGLYPH E028A, 78067 +EGYPTIAN HIEROGLYPH E029, 78068 +EGYPTIAN HIEROGLYPH E030, 78069 +EGYPTIAN HIEROGLYPH E031, 78070 +EGYPTIAN HIEROGLYPH E032, 78071 +EGYPTIAN HIEROGLYPH E033, 78072 +EGYPTIAN HIEROGLYPH E034, 78073 +EGYPTIAN HIEROGLYPH E034A, 78074 +EGYPTIAN HIEROGLYPH E036, 78075 +EGYPTIAN HIEROGLYPH E037, 78076 +EGYPTIAN HIEROGLYPH E038, 78077 +EGYPTIAN HIEROGLYPH F001, 78078 +EGYPTIAN HIEROGLYPH F001A, 78079 +EGYPTIAN HIEROGLYPH F002, 78080 +EGYPTIAN HIEROGLYPH F003, 78081 +EGYPTIAN HIEROGLYPH F004, 78082 +EGYPTIAN HIEROGLYPH F005, 78083 +EGYPTIAN HIEROGLYPH F006, 78084 +EGYPTIAN HIEROGLYPH F007, 78085 +EGYPTIAN HIEROGLYPH F008, 78086 +EGYPTIAN HIEROGLYPH F009, 78087 +EGYPTIAN HIEROGLYPH F010, 78088 +EGYPTIAN HIEROGLYPH F011, 78089 +EGYPTIAN HIEROGLYPH F012, 78090 +EGYPTIAN HIEROGLYPH F013, 78091 +EGYPTIAN HIEROGLYPH F013A, 78092 +EGYPTIAN HIEROGLYPH F014, 78093 +EGYPTIAN HIEROGLYPH F015, 78094 +EGYPTIAN HIEROGLYPH F016, 78095 +EGYPTIAN HIEROGLYPH F017, 78096 +EGYPTIAN HIEROGLYPH F018, 78097 +EGYPTIAN HIEROGLYPH F019, 78098 +EGYPTIAN HIEROGLYPH F020, 78099 +EGYPTIAN HIEROGLYPH F021, 78100 +EGYPTIAN HIEROGLYPH F021A, 78101 +EGYPTIAN HIEROGLYPH F022, 78102 +EGYPTIAN HIEROGLYPH F023, 78103 +EGYPTIAN HIEROGLYPH F024, 78104 +EGYPTIAN HIEROGLYPH F025, 78105 +EGYPTIAN HIEROGLYPH F026, 78106 +EGYPTIAN HIEROGLYPH F027, 78107 +EGYPTIAN HIEROGLYPH F028, 78108 +EGYPTIAN HIEROGLYPH F029, 78109 +EGYPTIAN HIEROGLYPH F030, 78110 +EGYPTIAN HIEROGLYPH F031, 78111 +EGYPTIAN HIEROGLYPH F031A, 78112 +EGYPTIAN HIEROGLYPH F032, 78113 +EGYPTIAN HIEROGLYPH F033, 78114 +EGYPTIAN HIEROGLYPH F034, 78115 +EGYPTIAN HIEROGLYPH F035, 78116 +EGYPTIAN HIEROGLYPH F036, 78117 +EGYPTIAN HIEROGLYPH F037, 78118 +EGYPTIAN HIEROGLYPH F037A, 78119 +EGYPTIAN HIEROGLYPH F038, 78120 +EGYPTIAN HIEROGLYPH F038A, 78121 +EGYPTIAN HIEROGLYPH F039, 78122 +EGYPTIAN HIEROGLYPH F040, 78123 +EGYPTIAN HIEROGLYPH F041, 78124 +EGYPTIAN HIEROGLYPH F042, 78125 +EGYPTIAN HIEROGLYPH F043, 78126 +EGYPTIAN HIEROGLYPH F044, 78127 +EGYPTIAN HIEROGLYPH F045, 78128 +EGYPTIAN HIEROGLYPH F045A, 78129 +EGYPTIAN HIEROGLYPH F046, 78130 +EGYPTIAN HIEROGLYPH F046A, 78131 +EGYPTIAN HIEROGLYPH F047, 78132 +EGYPTIAN HIEROGLYPH F047A, 78133 +EGYPTIAN HIEROGLYPH F048, 78134 +EGYPTIAN HIEROGLYPH F049, 78135 +EGYPTIAN HIEROGLYPH F050, 78136 +EGYPTIAN HIEROGLYPH F051, 78137 +EGYPTIAN HIEROGLYPH F051A, 78138 +EGYPTIAN HIEROGLYPH F051B, 78139 +EGYPTIAN HIEROGLYPH F051C, 78140 +EGYPTIAN HIEROGLYPH F052, 78141 +EGYPTIAN HIEROGLYPH F053, 78142 +EGYPTIAN HIEROGLYPH G001, 78143 +EGYPTIAN HIEROGLYPH G002, 78144 +EGYPTIAN HIEROGLYPH G003, 78145 +EGYPTIAN HIEROGLYPH G004, 78146 +EGYPTIAN HIEROGLYPH G005, 78147 +EGYPTIAN HIEROGLYPH G006, 78148 +EGYPTIAN HIEROGLYPH G006A, 78149 +EGYPTIAN HIEROGLYPH G007, 78150 +EGYPTIAN HIEROGLYPH G007A, 78151 +EGYPTIAN HIEROGLYPH G007B, 78152 +EGYPTIAN HIEROGLYPH G008, 78153 +EGYPTIAN HIEROGLYPH G009, 78154 +EGYPTIAN HIEROGLYPH G010, 78155 +EGYPTIAN HIEROGLYPH G011, 78156 +EGYPTIAN HIEROGLYPH G011A, 78157 +EGYPTIAN HIEROGLYPH G012, 78158 +EGYPTIAN HIEROGLYPH G013, 78159 +EGYPTIAN HIEROGLYPH G014, 78160 +EGYPTIAN HIEROGLYPH G015, 78161 +EGYPTIAN HIEROGLYPH G016, 78162 +EGYPTIAN HIEROGLYPH G017, 78163 +EGYPTIAN HIEROGLYPH G018, 78164 +EGYPTIAN HIEROGLYPH G019, 78165 +EGYPTIAN HIEROGLYPH G020, 78166 +EGYPTIAN HIEROGLYPH G020A, 78167 +EGYPTIAN HIEROGLYPH G021, 78168 +EGYPTIAN HIEROGLYPH G022, 78169 +EGYPTIAN HIEROGLYPH G023, 78170 +EGYPTIAN HIEROGLYPH G024, 78171 +EGYPTIAN HIEROGLYPH G025, 78172 +EGYPTIAN HIEROGLYPH G026, 78173 +EGYPTIAN HIEROGLYPH G026A, 78174 +EGYPTIAN HIEROGLYPH G027, 78175 +EGYPTIAN HIEROGLYPH G028, 78176 +EGYPTIAN HIEROGLYPH G029, 78177 +EGYPTIAN HIEROGLYPH G030, 78178 +EGYPTIAN HIEROGLYPH G031, 78179 +EGYPTIAN HIEROGLYPH G032, 78180 +EGYPTIAN HIEROGLYPH G033, 78181 +EGYPTIAN HIEROGLYPH G034, 78182 +EGYPTIAN HIEROGLYPH G035, 78183 +EGYPTIAN HIEROGLYPH G036, 78184 +EGYPTIAN HIEROGLYPH G036A, 78185 +EGYPTIAN HIEROGLYPH G037, 78186 +EGYPTIAN HIEROGLYPH G037A, 78187 +EGYPTIAN HIEROGLYPH G038, 78188 +EGYPTIAN HIEROGLYPH G039, 78189 +EGYPTIAN HIEROGLYPH G040, 78190 +EGYPTIAN HIEROGLYPH G041, 78191 +EGYPTIAN HIEROGLYPH G042, 78192 +EGYPTIAN HIEROGLYPH G043, 78193 +EGYPTIAN HIEROGLYPH G043A, 78194 +EGYPTIAN HIEROGLYPH G044, 78195 +EGYPTIAN HIEROGLYPH G045, 78196 +EGYPTIAN HIEROGLYPH G045A, 78197 +EGYPTIAN HIEROGLYPH G046, 78198 +EGYPTIAN HIEROGLYPH G047, 78199 +EGYPTIAN HIEROGLYPH G048, 78200 +EGYPTIAN HIEROGLYPH G049, 78201 +EGYPTIAN HIEROGLYPH G050, 78202 +EGYPTIAN HIEROGLYPH G051, 78203 +EGYPTIAN HIEROGLYPH G052, 78204 +EGYPTIAN HIEROGLYPH G053, 78205 +EGYPTIAN HIEROGLYPH G054, 78206 +EGYPTIAN HIEROGLYPH H001, 78207 +EGYPTIAN HIEROGLYPH H002, 78208 +EGYPTIAN HIEROGLYPH H003, 78209 +EGYPTIAN HIEROGLYPH H004, 78210 +EGYPTIAN HIEROGLYPH H005, 78211 +EGYPTIAN HIEROGLYPH H006, 78212 +EGYPTIAN HIEROGLYPH H006A, 78213 +EGYPTIAN HIEROGLYPH H007, 78214 +EGYPTIAN HIEROGLYPH H008, 78215 +EGYPTIAN HIEROGLYPH I001, 78216 +EGYPTIAN HIEROGLYPH I002, 78217 +EGYPTIAN HIEROGLYPH I003, 78218 +EGYPTIAN HIEROGLYPH I004, 78219 +EGYPTIAN HIEROGLYPH I005, 78220 +EGYPTIAN HIEROGLYPH I005A, 78221 +EGYPTIAN HIEROGLYPH I006, 78222 +EGYPTIAN HIEROGLYPH I007, 78223 +EGYPTIAN HIEROGLYPH I008, 78224 +EGYPTIAN HIEROGLYPH I009, 78225 +EGYPTIAN HIEROGLYPH I009A, 78226 +EGYPTIAN HIEROGLYPH I010, 78227 +EGYPTIAN HIEROGLYPH I010A, 78228 +EGYPTIAN HIEROGLYPH I011, 78229 +EGYPTIAN HIEROGLYPH I011A, 78230 +EGYPTIAN HIEROGLYPH I012, 78231 +EGYPTIAN HIEROGLYPH I013, 78232 +EGYPTIAN HIEROGLYPH I014, 78233 +EGYPTIAN HIEROGLYPH I015, 78234 +EGYPTIAN HIEROGLYPH K001, 78235 +EGYPTIAN HIEROGLYPH K002, 78236 +EGYPTIAN HIEROGLYPH K003, 78237 +EGYPTIAN HIEROGLYPH K004, 78238 +EGYPTIAN HIEROGLYPH K005, 78239 +EGYPTIAN HIEROGLYPH K006, 78240 +EGYPTIAN HIEROGLYPH K007, 78241 +EGYPTIAN HIEROGLYPH K008, 78242 +EGYPTIAN HIEROGLYPH L001, 78243 +EGYPTIAN HIEROGLYPH L002, 78244 +EGYPTIAN HIEROGLYPH L002A, 78245 +EGYPTIAN HIEROGLYPH L003, 78246 +EGYPTIAN HIEROGLYPH L004, 78247 +EGYPTIAN HIEROGLYPH L005, 78248 +EGYPTIAN HIEROGLYPH L006, 78249 +EGYPTIAN HIEROGLYPH L006A, 78250 +EGYPTIAN HIEROGLYPH L007, 78251 +EGYPTIAN HIEROGLYPH L008, 78252 +EGYPTIAN HIEROGLYPH M001, 78253 +EGYPTIAN HIEROGLYPH M001A, 78254 +EGYPTIAN HIEROGLYPH M001B, 78255 +EGYPTIAN HIEROGLYPH M002, 78256 +EGYPTIAN HIEROGLYPH M003, 78257 +EGYPTIAN HIEROGLYPH M003A, 78258 +EGYPTIAN HIEROGLYPH M004, 78259 +EGYPTIAN HIEROGLYPH M005, 78260 +EGYPTIAN HIEROGLYPH M006, 78261 +EGYPTIAN HIEROGLYPH M007, 78262 +EGYPTIAN HIEROGLYPH M008, 78263 +EGYPTIAN HIEROGLYPH M009, 78264 +EGYPTIAN HIEROGLYPH M010, 78265 +EGYPTIAN HIEROGLYPH M010A, 78266 +EGYPTIAN HIEROGLYPH M011, 78267 +EGYPTIAN HIEROGLYPH M012, 78268 +EGYPTIAN HIEROGLYPH M012A, 78269 +EGYPTIAN HIEROGLYPH M012B, 78270 +EGYPTIAN HIEROGLYPH M012C, 78271 +EGYPTIAN HIEROGLYPH M012D, 78272 +EGYPTIAN HIEROGLYPH M012E, 78273 +EGYPTIAN HIEROGLYPH M012F, 78274 +EGYPTIAN HIEROGLYPH M012G, 78275 +EGYPTIAN HIEROGLYPH M012H, 78276 +EGYPTIAN HIEROGLYPH M013, 78277 +EGYPTIAN HIEROGLYPH M014, 78278 +EGYPTIAN HIEROGLYPH M015, 78279 +EGYPTIAN HIEROGLYPH M015A, 78280 +EGYPTIAN HIEROGLYPH M016, 78281 +EGYPTIAN HIEROGLYPH M016A, 78282 +EGYPTIAN HIEROGLYPH M017, 78283 +EGYPTIAN HIEROGLYPH M017A, 78284 +EGYPTIAN HIEROGLYPH M018, 78285 +EGYPTIAN HIEROGLYPH M019, 78286 +EGYPTIAN HIEROGLYPH M020, 78287 +EGYPTIAN HIEROGLYPH M021, 78288 +EGYPTIAN HIEROGLYPH M022, 78289 +EGYPTIAN HIEROGLYPH M022A, 78290 +EGYPTIAN HIEROGLYPH M023, 78291 +EGYPTIAN HIEROGLYPH M024, 78292 +EGYPTIAN HIEROGLYPH M024A, 78293 +EGYPTIAN HIEROGLYPH M025, 78294 +EGYPTIAN HIEROGLYPH M026, 78295 +EGYPTIAN HIEROGLYPH M027, 78296 +EGYPTIAN HIEROGLYPH M028, 78297 +EGYPTIAN HIEROGLYPH M028A, 78298 +EGYPTIAN HIEROGLYPH M029, 78299 +EGYPTIAN HIEROGLYPH M030, 78300 +EGYPTIAN HIEROGLYPH M031, 78301 +EGYPTIAN HIEROGLYPH M031A, 78302 +EGYPTIAN HIEROGLYPH M032, 78303 +EGYPTIAN HIEROGLYPH M033, 78304 +EGYPTIAN HIEROGLYPH M033A, 78305 +EGYPTIAN HIEROGLYPH M033B, 78306 +EGYPTIAN HIEROGLYPH M034, 78307 +EGYPTIAN HIEROGLYPH M035, 78308 +EGYPTIAN HIEROGLYPH M036, 78309 +EGYPTIAN HIEROGLYPH M037, 78310 +EGYPTIAN HIEROGLYPH M038, 78311 +EGYPTIAN HIEROGLYPH M039, 78312 +EGYPTIAN HIEROGLYPH M040, 78313 +EGYPTIAN HIEROGLYPH M040A, 78314 +EGYPTIAN HIEROGLYPH M041, 78315 +EGYPTIAN HIEROGLYPH M042, 78316 +EGYPTIAN HIEROGLYPH M043, 78317 +EGYPTIAN HIEROGLYPH M044, 78318 +EGYPTIAN HIEROGLYPH N001, 78319 +EGYPTIAN HIEROGLYPH N002, 78320 +EGYPTIAN HIEROGLYPH N003, 78321 +EGYPTIAN HIEROGLYPH N004, 78322 +EGYPTIAN HIEROGLYPH N005, 78323 +EGYPTIAN HIEROGLYPH N006, 78324 +EGYPTIAN HIEROGLYPH N007, 78325 +EGYPTIAN HIEROGLYPH N008, 78326 +EGYPTIAN HIEROGLYPH N009, 78327 +EGYPTIAN HIEROGLYPH N010, 78328 +EGYPTIAN HIEROGLYPH N011, 78329 +EGYPTIAN HIEROGLYPH N012, 78330 +EGYPTIAN HIEROGLYPH N013, 78331 +EGYPTIAN HIEROGLYPH N014, 78332 +EGYPTIAN HIEROGLYPH N015, 78333 +EGYPTIAN HIEROGLYPH N016, 78334 +EGYPTIAN HIEROGLYPH N017, 78335 +EGYPTIAN HIEROGLYPH N018, 78336 +EGYPTIAN HIEROGLYPH N018A, 78337 +EGYPTIAN HIEROGLYPH N018B, 78338 +EGYPTIAN HIEROGLYPH N019, 78339 +EGYPTIAN HIEROGLYPH N020, 78340 +EGYPTIAN HIEROGLYPH N021, 78341 +EGYPTIAN HIEROGLYPH N022, 78342 +EGYPTIAN HIEROGLYPH N023, 78343 +EGYPTIAN HIEROGLYPH N024, 78344 +EGYPTIAN HIEROGLYPH N025, 78345 +EGYPTIAN HIEROGLYPH N025A, 78346 +EGYPTIAN HIEROGLYPH N026, 78347 +EGYPTIAN HIEROGLYPH N027, 78348 +EGYPTIAN HIEROGLYPH N028, 78349 +EGYPTIAN HIEROGLYPH N029, 78350 +EGYPTIAN HIEROGLYPH N030, 78351 +EGYPTIAN HIEROGLYPH N031, 78352 +EGYPTIAN HIEROGLYPH N032, 78353 +EGYPTIAN HIEROGLYPH N033, 78354 +EGYPTIAN HIEROGLYPH N033A, 78355 +EGYPTIAN HIEROGLYPH N034, 78356 +EGYPTIAN HIEROGLYPH N034A, 78357 +EGYPTIAN HIEROGLYPH N035, 78358 +EGYPTIAN HIEROGLYPH N035A, 78359 +EGYPTIAN HIEROGLYPH N036, 78360 +EGYPTIAN HIEROGLYPH N037, 78361 +EGYPTIAN HIEROGLYPH N037A, 78362 +EGYPTIAN HIEROGLYPH N038, 78363 +EGYPTIAN HIEROGLYPH N039, 78364 +EGYPTIAN HIEROGLYPH N040, 78365 +EGYPTIAN HIEROGLYPH N041, 78366 +EGYPTIAN HIEROGLYPH N042, 78367 +EGYPTIAN HIEROGLYPH NL001, 78368 +EGYPTIAN HIEROGLYPH NL002, 78369 +EGYPTIAN HIEROGLYPH NL003, 78370 +EGYPTIAN HIEROGLYPH NL004, 78371 +EGYPTIAN HIEROGLYPH NL005, 78372 +EGYPTIAN HIEROGLYPH NL005A, 78373 +EGYPTIAN HIEROGLYPH NL006, 78374 +EGYPTIAN HIEROGLYPH NL007, 78375 +EGYPTIAN HIEROGLYPH NL008, 78376 +EGYPTIAN HIEROGLYPH NL009, 78377 +EGYPTIAN HIEROGLYPH NL010, 78378 +EGYPTIAN HIEROGLYPH NL011, 78379 +EGYPTIAN HIEROGLYPH NL012, 78380 +EGYPTIAN HIEROGLYPH NL013, 78381 +EGYPTIAN HIEROGLYPH NL014, 78382 +EGYPTIAN HIEROGLYPH NL015, 78383 +EGYPTIAN HIEROGLYPH NL016, 78384 +EGYPTIAN HIEROGLYPH NL017, 78385 +EGYPTIAN HIEROGLYPH NL017A, 78386 +EGYPTIAN HIEROGLYPH NL018, 78387 +EGYPTIAN HIEROGLYPH NL019, 78388 +EGYPTIAN HIEROGLYPH NL020, 78389 +EGYPTIAN HIEROGLYPH NU001, 78390 +EGYPTIAN HIEROGLYPH NU002, 78391 +EGYPTIAN HIEROGLYPH NU003, 78392 +EGYPTIAN HIEROGLYPH NU004, 78393 +EGYPTIAN HIEROGLYPH NU005, 78394 +EGYPTIAN HIEROGLYPH NU006, 78395 +EGYPTIAN HIEROGLYPH NU007, 78396 +EGYPTIAN HIEROGLYPH NU008, 78397 +EGYPTIAN HIEROGLYPH NU009, 78398 +EGYPTIAN HIEROGLYPH NU010, 78399 +EGYPTIAN HIEROGLYPH NU010A, 78400 +EGYPTIAN HIEROGLYPH NU011, 78401 +EGYPTIAN HIEROGLYPH NU011A, 78402 +EGYPTIAN HIEROGLYPH NU012, 78403 +EGYPTIAN HIEROGLYPH NU013, 78404 +EGYPTIAN HIEROGLYPH NU014, 78405 +EGYPTIAN HIEROGLYPH NU015, 78406 +EGYPTIAN HIEROGLYPH NU016, 78407 +EGYPTIAN HIEROGLYPH NU017, 78408 +EGYPTIAN HIEROGLYPH NU018, 78409 +EGYPTIAN HIEROGLYPH NU018A, 78410 +EGYPTIAN HIEROGLYPH NU019, 78411 +EGYPTIAN HIEROGLYPH NU020, 78412 +EGYPTIAN HIEROGLYPH NU021, 78413 +EGYPTIAN HIEROGLYPH NU022, 78414 +EGYPTIAN HIEROGLYPH NU022A, 78415 +EGYPTIAN HIEROGLYPH O001, 78416 +EGYPTIAN HIEROGLYPH O001A, 78417 +EGYPTIAN HIEROGLYPH O002, 78418 +EGYPTIAN HIEROGLYPH O003, 78419 +EGYPTIAN HIEROGLYPH O004, 78420 +EGYPTIAN HIEROGLYPH O005, 78421 +EGYPTIAN HIEROGLYPH O005A, 78422 +EGYPTIAN HIEROGLYPH O006, 78423 +EGYPTIAN HIEROGLYPH O006A, 78424 +EGYPTIAN HIEROGLYPH O006B, 78425 +EGYPTIAN HIEROGLYPH O006C, 78426 +EGYPTIAN HIEROGLYPH O006D, 78427 +EGYPTIAN HIEROGLYPH O006E, 78428 +EGYPTIAN HIEROGLYPH O006F, 78429 +EGYPTIAN HIEROGLYPH O007, 78430 +EGYPTIAN HIEROGLYPH O008, 78431 +EGYPTIAN HIEROGLYPH O009, 78432 +EGYPTIAN HIEROGLYPH O010, 78433 +EGYPTIAN HIEROGLYPH O010A, 78434 +EGYPTIAN HIEROGLYPH O010B, 78435 +EGYPTIAN HIEROGLYPH O010C, 78436 +EGYPTIAN HIEROGLYPH O011, 78437 +EGYPTIAN HIEROGLYPH O012, 78438 +EGYPTIAN HIEROGLYPH O013, 78439 +EGYPTIAN HIEROGLYPH O014, 78440 +EGYPTIAN HIEROGLYPH O015, 78441 +EGYPTIAN HIEROGLYPH O016, 78442 +EGYPTIAN HIEROGLYPH O017, 78443 +EGYPTIAN HIEROGLYPH O018, 78444 +EGYPTIAN HIEROGLYPH O019, 78445 +EGYPTIAN HIEROGLYPH O019A, 78446 +EGYPTIAN HIEROGLYPH O020, 78447 +EGYPTIAN HIEROGLYPH O020A, 78448 +EGYPTIAN HIEROGLYPH O021, 78449 +EGYPTIAN HIEROGLYPH O022, 78450 +EGYPTIAN HIEROGLYPH O023, 78451 +EGYPTIAN HIEROGLYPH O024, 78452 +EGYPTIAN HIEROGLYPH O024A, 78453 +EGYPTIAN HIEROGLYPH O025, 78454 +EGYPTIAN HIEROGLYPH O025A, 78455 +EGYPTIAN HIEROGLYPH O026, 78456 +EGYPTIAN HIEROGLYPH O027, 78457 +EGYPTIAN HIEROGLYPH O028, 78458 +EGYPTIAN HIEROGLYPH O029, 78459 +EGYPTIAN HIEROGLYPH O029A, 78460 +EGYPTIAN HIEROGLYPH O030, 78461 +EGYPTIAN HIEROGLYPH O030A, 78462 +EGYPTIAN HIEROGLYPH O031, 78463 +EGYPTIAN HIEROGLYPH O032, 78464 +EGYPTIAN HIEROGLYPH O033, 78465 +EGYPTIAN HIEROGLYPH O033A, 78466 +EGYPTIAN HIEROGLYPH O034, 78467 +EGYPTIAN HIEROGLYPH O035, 78468 +EGYPTIAN HIEROGLYPH O036, 78469 +EGYPTIAN HIEROGLYPH O036A, 78470 +EGYPTIAN HIEROGLYPH O036B, 78471 +EGYPTIAN HIEROGLYPH O036C, 78472 +EGYPTIAN HIEROGLYPH O036D, 78473 +EGYPTIAN HIEROGLYPH O037, 78474 +EGYPTIAN HIEROGLYPH O038, 78475 +EGYPTIAN HIEROGLYPH O039, 78476 +EGYPTIAN HIEROGLYPH O040, 78477 +EGYPTIAN HIEROGLYPH O041, 78478 +EGYPTIAN HIEROGLYPH O042, 78479 +EGYPTIAN HIEROGLYPH O043, 78480 +EGYPTIAN HIEROGLYPH O044, 78481 +EGYPTIAN HIEROGLYPH O045, 78482 +EGYPTIAN HIEROGLYPH O046, 78483 +EGYPTIAN HIEROGLYPH O047, 78484 +EGYPTIAN HIEROGLYPH O048, 78485 +EGYPTIAN HIEROGLYPH O049, 78486 +EGYPTIAN HIEROGLYPH O050, 78487 +EGYPTIAN HIEROGLYPH O050A, 78488 +EGYPTIAN HIEROGLYPH O050B, 78489 +EGYPTIAN HIEROGLYPH O051, 78490 +EGYPTIAN HIEROGLYPH P001, 78491 +EGYPTIAN HIEROGLYPH P001A, 78492 +EGYPTIAN HIEROGLYPH P002, 78493 +EGYPTIAN HIEROGLYPH P003, 78494 +EGYPTIAN HIEROGLYPH P003A, 78495 +EGYPTIAN HIEROGLYPH P004, 78496 +EGYPTIAN HIEROGLYPH P005, 78497 +EGYPTIAN HIEROGLYPH P006, 78498 +EGYPTIAN HIEROGLYPH P007, 78499 +EGYPTIAN HIEROGLYPH P008, 78500 +EGYPTIAN HIEROGLYPH P009, 78501 +EGYPTIAN HIEROGLYPH P010, 78502 +EGYPTIAN HIEROGLYPH P011, 78503 +EGYPTIAN HIEROGLYPH Q001, 78504 +EGYPTIAN HIEROGLYPH Q002, 78505 +EGYPTIAN HIEROGLYPH Q003, 78506 +EGYPTIAN HIEROGLYPH Q004, 78507 +EGYPTIAN HIEROGLYPH Q005, 78508 +EGYPTIAN HIEROGLYPH Q006, 78509 +EGYPTIAN HIEROGLYPH Q007, 78510 +EGYPTIAN HIEROGLYPH R001, 78511 +EGYPTIAN HIEROGLYPH R002, 78512 +EGYPTIAN HIEROGLYPH R002A, 78513 +EGYPTIAN HIEROGLYPH R003, 78514 +EGYPTIAN HIEROGLYPH R003A, 78515 +EGYPTIAN HIEROGLYPH R003B, 78516 +EGYPTIAN HIEROGLYPH R004, 78517 +EGYPTIAN HIEROGLYPH R005, 78518 +EGYPTIAN HIEROGLYPH R006, 78519 +EGYPTIAN HIEROGLYPH R007, 78520 +EGYPTIAN HIEROGLYPH R008, 78521 +EGYPTIAN HIEROGLYPH R009, 78522 +EGYPTIAN HIEROGLYPH R010, 78523 +EGYPTIAN HIEROGLYPH R010A, 78524 +EGYPTIAN HIEROGLYPH R011, 78525 +EGYPTIAN HIEROGLYPH R012, 78526 +EGYPTIAN HIEROGLYPH R013, 78527 +EGYPTIAN HIEROGLYPH R014, 78528 +EGYPTIAN HIEROGLYPH R015, 78529 +EGYPTIAN HIEROGLYPH R016, 78530 +EGYPTIAN HIEROGLYPH R016A, 78531 +EGYPTIAN HIEROGLYPH R017, 78532 +EGYPTIAN HIEROGLYPH R018, 78533 +EGYPTIAN HIEROGLYPH R019, 78534 +EGYPTIAN HIEROGLYPH R020, 78535 +EGYPTIAN HIEROGLYPH R021, 78536 +EGYPTIAN HIEROGLYPH R022, 78537 +EGYPTIAN HIEROGLYPH R023, 78538 +EGYPTIAN HIEROGLYPH R024, 78539 +EGYPTIAN HIEROGLYPH R025, 78540 +EGYPTIAN HIEROGLYPH R026, 78541 +EGYPTIAN HIEROGLYPH R027, 78542 +EGYPTIAN HIEROGLYPH R028, 78543 +EGYPTIAN HIEROGLYPH R029, 78544 +EGYPTIAN HIEROGLYPH S001, 78545 +EGYPTIAN HIEROGLYPH S002, 78546 +EGYPTIAN HIEROGLYPH S002A, 78547 +EGYPTIAN HIEROGLYPH S003, 78548 +EGYPTIAN HIEROGLYPH S004, 78549 +EGYPTIAN HIEROGLYPH S005, 78550 +EGYPTIAN HIEROGLYPH S006, 78551 +EGYPTIAN HIEROGLYPH S006A, 78552 +EGYPTIAN HIEROGLYPH S007, 78553 +EGYPTIAN HIEROGLYPH S008, 78554 +EGYPTIAN HIEROGLYPH S009, 78555 +EGYPTIAN HIEROGLYPH S010, 78556 +EGYPTIAN HIEROGLYPH S011, 78557 +EGYPTIAN HIEROGLYPH S012, 78558 +EGYPTIAN HIEROGLYPH S013, 78559 +EGYPTIAN HIEROGLYPH S014, 78560 +EGYPTIAN HIEROGLYPH S014A, 78561 +EGYPTIAN HIEROGLYPH S014B, 78562 +EGYPTIAN HIEROGLYPH S015, 78563 +EGYPTIAN HIEROGLYPH S016, 78564 +EGYPTIAN HIEROGLYPH S017, 78565 +EGYPTIAN HIEROGLYPH S017A, 78566 +EGYPTIAN HIEROGLYPH S018, 78567 +EGYPTIAN HIEROGLYPH S019, 78568 +EGYPTIAN HIEROGLYPH S020, 78569 +EGYPTIAN HIEROGLYPH S021, 78570 +EGYPTIAN HIEROGLYPH S022, 78571 +EGYPTIAN HIEROGLYPH S023, 78572 +EGYPTIAN HIEROGLYPH S024, 78573 +EGYPTIAN HIEROGLYPH S025, 78574 +EGYPTIAN HIEROGLYPH S026, 78575 +EGYPTIAN HIEROGLYPH S026A, 78576 +EGYPTIAN HIEROGLYPH S026B, 78577 +EGYPTIAN HIEROGLYPH S027, 78578 +EGYPTIAN HIEROGLYPH S028, 78579 +EGYPTIAN HIEROGLYPH S029, 78580 +EGYPTIAN HIEROGLYPH S030, 78581 +EGYPTIAN HIEROGLYPH S031, 78582 +EGYPTIAN HIEROGLYPH S032, 78583 +EGYPTIAN HIEROGLYPH S033, 78584 +EGYPTIAN HIEROGLYPH S034, 78585 +EGYPTIAN HIEROGLYPH S035, 78586 +EGYPTIAN HIEROGLYPH S035A, 78587 +EGYPTIAN HIEROGLYPH S036, 78588 +EGYPTIAN HIEROGLYPH S037, 78589 +EGYPTIAN HIEROGLYPH S038, 78590 +EGYPTIAN HIEROGLYPH S039, 78591 +EGYPTIAN HIEROGLYPH S040, 78592 +EGYPTIAN HIEROGLYPH S041, 78593 +EGYPTIAN HIEROGLYPH S042, 78594 +EGYPTIAN HIEROGLYPH S043, 78595 +EGYPTIAN HIEROGLYPH S044, 78596 +EGYPTIAN HIEROGLYPH S045, 78597 +EGYPTIAN HIEROGLYPH S046, 78598 +EGYPTIAN HIEROGLYPH T001, 78599 +EGYPTIAN HIEROGLYPH T002, 78600 +EGYPTIAN HIEROGLYPH T003, 78601 +EGYPTIAN HIEROGLYPH T003A, 78602 +EGYPTIAN HIEROGLYPH T004, 78603 +EGYPTIAN HIEROGLYPH T005, 78604 +EGYPTIAN HIEROGLYPH T006, 78605 +EGYPTIAN HIEROGLYPH T007, 78606 +EGYPTIAN HIEROGLYPH T007A, 78607 +EGYPTIAN HIEROGLYPH T008, 78608 +EGYPTIAN HIEROGLYPH T008A, 78609 +EGYPTIAN HIEROGLYPH T009, 78610 +EGYPTIAN HIEROGLYPH T009A, 78611 +EGYPTIAN HIEROGLYPH T010, 78612 +EGYPTIAN HIEROGLYPH T011, 78613 +EGYPTIAN HIEROGLYPH T011A, 78614 +EGYPTIAN HIEROGLYPH T012, 78615 +EGYPTIAN HIEROGLYPH T013, 78616 +EGYPTIAN HIEROGLYPH T014, 78617 +EGYPTIAN HIEROGLYPH T015, 78618 +EGYPTIAN HIEROGLYPH T016, 78619 +EGYPTIAN HIEROGLYPH T016A, 78620 +EGYPTIAN HIEROGLYPH T017, 78621 +EGYPTIAN HIEROGLYPH T018, 78622 +EGYPTIAN HIEROGLYPH T019, 78623 +EGYPTIAN HIEROGLYPH T020, 78624 +EGYPTIAN HIEROGLYPH T021, 78625 +EGYPTIAN HIEROGLYPH T022, 78626 +EGYPTIAN HIEROGLYPH T023, 78627 +EGYPTIAN HIEROGLYPH T024, 78628 +EGYPTIAN HIEROGLYPH T025, 78629 +EGYPTIAN HIEROGLYPH T026, 78630 +EGYPTIAN HIEROGLYPH T027, 78631 +EGYPTIAN HIEROGLYPH T028, 78632 +EGYPTIAN HIEROGLYPH T029, 78633 +EGYPTIAN HIEROGLYPH T030, 78634 +EGYPTIAN HIEROGLYPH T031, 78635 +EGYPTIAN HIEROGLYPH T032, 78636 +EGYPTIAN HIEROGLYPH T032A, 78637 +EGYPTIAN HIEROGLYPH T033, 78638 +EGYPTIAN HIEROGLYPH T033A, 78639 +EGYPTIAN HIEROGLYPH T034, 78640 +EGYPTIAN HIEROGLYPH T035, 78641 +EGYPTIAN HIEROGLYPH T036, 78642 +EGYPTIAN HIEROGLYPH U001, 78643 +EGYPTIAN HIEROGLYPH U002, 78644 +EGYPTIAN HIEROGLYPH U003, 78645 +EGYPTIAN HIEROGLYPH U004, 78646 +EGYPTIAN HIEROGLYPH U005, 78647 +EGYPTIAN HIEROGLYPH U006, 78648 +EGYPTIAN HIEROGLYPH U006A, 78649 +EGYPTIAN HIEROGLYPH U006B, 78650 +EGYPTIAN HIEROGLYPH U007, 78651 +EGYPTIAN HIEROGLYPH U008, 78652 +EGYPTIAN HIEROGLYPH U009, 78653 +EGYPTIAN HIEROGLYPH U010, 78654 +EGYPTIAN HIEROGLYPH U011, 78655 +EGYPTIAN HIEROGLYPH U012, 78656 +EGYPTIAN HIEROGLYPH U013, 78657 +EGYPTIAN HIEROGLYPH U014, 78658 +EGYPTIAN HIEROGLYPH U015, 78659 +EGYPTIAN HIEROGLYPH U016, 78660 +EGYPTIAN HIEROGLYPH U017, 78661 +EGYPTIAN HIEROGLYPH U018, 78662 +EGYPTIAN HIEROGLYPH U019, 78663 +EGYPTIAN HIEROGLYPH U020, 78664 +EGYPTIAN HIEROGLYPH U021, 78665 +EGYPTIAN HIEROGLYPH U022, 78666 +EGYPTIAN HIEROGLYPH U023, 78667 +EGYPTIAN HIEROGLYPH U023A, 78668 +EGYPTIAN HIEROGLYPH U024, 78669 +EGYPTIAN HIEROGLYPH U025, 78670 +EGYPTIAN HIEROGLYPH U026, 78671 +EGYPTIAN HIEROGLYPH U027, 78672 +EGYPTIAN HIEROGLYPH U028, 78673 +EGYPTIAN HIEROGLYPH U029, 78674 +EGYPTIAN HIEROGLYPH U029A, 78675 +EGYPTIAN HIEROGLYPH U030, 78676 +EGYPTIAN HIEROGLYPH U031, 78677 +EGYPTIAN HIEROGLYPH U032, 78678 +EGYPTIAN HIEROGLYPH U032A, 78679 +EGYPTIAN HIEROGLYPH U033, 78680 +EGYPTIAN HIEROGLYPH U034, 78681 +EGYPTIAN HIEROGLYPH U035, 78682 +EGYPTIAN HIEROGLYPH U036, 78683 +EGYPTIAN HIEROGLYPH U037, 78684 +EGYPTIAN HIEROGLYPH U038, 78685 +EGYPTIAN HIEROGLYPH U039, 78686 +EGYPTIAN HIEROGLYPH U040, 78687 +EGYPTIAN HIEROGLYPH U041, 78688 +EGYPTIAN HIEROGLYPH U042, 78689 +EGYPTIAN HIEROGLYPH V001, 78690 +EGYPTIAN HIEROGLYPH V001A, 78691 +EGYPTIAN HIEROGLYPH V001B, 78692 +EGYPTIAN HIEROGLYPH V001C, 78693 +EGYPTIAN HIEROGLYPH V001D, 78694 +EGYPTIAN HIEROGLYPH V001E, 78695 +EGYPTIAN HIEROGLYPH V001F, 78696 +EGYPTIAN HIEROGLYPH V001G, 78697 +EGYPTIAN HIEROGLYPH V001H, 78698 +EGYPTIAN HIEROGLYPH V001I, 78699 +EGYPTIAN HIEROGLYPH V002, 78700 +EGYPTIAN HIEROGLYPH V002A, 78701 +EGYPTIAN HIEROGLYPH V003, 78702 +EGYPTIAN HIEROGLYPH V004, 78703 +EGYPTIAN HIEROGLYPH V005, 78704 +EGYPTIAN HIEROGLYPH V006, 78705 +EGYPTIAN HIEROGLYPH V007, 78706 +EGYPTIAN HIEROGLYPH V007A, 78707 +EGYPTIAN HIEROGLYPH V007B, 78708 +EGYPTIAN HIEROGLYPH V008, 78709 +EGYPTIAN HIEROGLYPH V009, 78710 +EGYPTIAN HIEROGLYPH V010, 78711 +EGYPTIAN HIEROGLYPH V011, 78712 +EGYPTIAN HIEROGLYPH V011A, 78713 +EGYPTIAN HIEROGLYPH V011B, 78714 +EGYPTIAN HIEROGLYPH V011C, 78715 +EGYPTIAN HIEROGLYPH V012, 78716 +EGYPTIAN HIEROGLYPH V012A, 78717 +EGYPTIAN HIEROGLYPH V012B, 78718 +EGYPTIAN HIEROGLYPH V013, 78719 +EGYPTIAN HIEROGLYPH V014, 78720 +EGYPTIAN HIEROGLYPH V015, 78721 +EGYPTIAN HIEROGLYPH V016, 78722 +EGYPTIAN HIEROGLYPH V017, 78723 +EGYPTIAN HIEROGLYPH V018, 78724 +EGYPTIAN HIEROGLYPH V019, 78725 +EGYPTIAN HIEROGLYPH V020, 78726 +EGYPTIAN HIEROGLYPH V020A, 78727 +EGYPTIAN HIEROGLYPH V020B, 78728 +EGYPTIAN HIEROGLYPH V020C, 78729 +EGYPTIAN HIEROGLYPH V020D, 78730 +EGYPTIAN HIEROGLYPH V020E, 78731 +EGYPTIAN HIEROGLYPH V020F, 78732 +EGYPTIAN HIEROGLYPH V020G, 78733 +EGYPTIAN HIEROGLYPH V020H, 78734 +EGYPTIAN HIEROGLYPH V020I, 78735 +EGYPTIAN HIEROGLYPH V020J, 78736 +EGYPTIAN HIEROGLYPH V020K, 78737 +EGYPTIAN HIEROGLYPH V020L, 78738 +EGYPTIAN HIEROGLYPH V021, 78739 +EGYPTIAN HIEROGLYPH V022, 78740 +EGYPTIAN HIEROGLYPH V023, 78741 +EGYPTIAN HIEROGLYPH V023A, 78742 +EGYPTIAN HIEROGLYPH V024, 78743 +EGYPTIAN HIEROGLYPH V025, 78744 +EGYPTIAN HIEROGLYPH V026, 78745 +EGYPTIAN HIEROGLYPH V027, 78746 +EGYPTIAN HIEROGLYPH V028, 78747 +EGYPTIAN HIEROGLYPH V028A, 78748 +EGYPTIAN HIEROGLYPH V029, 78749 +EGYPTIAN HIEROGLYPH V029A, 78750 +EGYPTIAN HIEROGLYPH V030, 78751 +EGYPTIAN HIEROGLYPH V030A, 78752 +EGYPTIAN HIEROGLYPH V031, 78753 +EGYPTIAN HIEROGLYPH V031A, 78754 +EGYPTIAN HIEROGLYPH V032, 78755 +EGYPTIAN HIEROGLYPH V033, 78756 +EGYPTIAN HIEROGLYPH V033A, 78757 +EGYPTIAN HIEROGLYPH V034, 78758 +EGYPTIAN HIEROGLYPH V035, 78759 +EGYPTIAN HIEROGLYPH V036, 78760 +EGYPTIAN HIEROGLYPH V037, 78761 +EGYPTIAN HIEROGLYPH V037A, 78762 +EGYPTIAN HIEROGLYPH V038, 78763 +EGYPTIAN HIEROGLYPH V039, 78764 +EGYPTIAN HIEROGLYPH V040, 78765 +EGYPTIAN HIEROGLYPH V040A, 78766 +EGYPTIAN HIEROGLYPH W001, 78767 +EGYPTIAN HIEROGLYPH W002, 78768 +EGYPTIAN HIEROGLYPH W003, 78769 +EGYPTIAN HIEROGLYPH W003A, 78770 +EGYPTIAN HIEROGLYPH W004, 78771 +EGYPTIAN HIEROGLYPH W005, 78772 +EGYPTIAN HIEROGLYPH W006, 78773 +EGYPTIAN HIEROGLYPH W007, 78774 +EGYPTIAN HIEROGLYPH W008, 78775 +EGYPTIAN HIEROGLYPH W009, 78776 +EGYPTIAN HIEROGLYPH W009A, 78777 +EGYPTIAN HIEROGLYPH W010, 78778 +EGYPTIAN HIEROGLYPH W010A, 78779 +EGYPTIAN HIEROGLYPH W011, 78780 +EGYPTIAN HIEROGLYPH W012, 78781 +EGYPTIAN HIEROGLYPH W013, 78782 +EGYPTIAN HIEROGLYPH W014, 78783 +EGYPTIAN HIEROGLYPH W014A, 78784 +EGYPTIAN HIEROGLYPH W015, 78785 +EGYPTIAN HIEROGLYPH W016, 78786 +EGYPTIAN HIEROGLYPH W017, 78787 +EGYPTIAN HIEROGLYPH W017A, 78788 +EGYPTIAN HIEROGLYPH W018, 78789 +EGYPTIAN HIEROGLYPH W018A, 78790 +EGYPTIAN HIEROGLYPH W019, 78791 +EGYPTIAN HIEROGLYPH W020, 78792 +EGYPTIAN HIEROGLYPH W021, 78793 +EGYPTIAN HIEROGLYPH W022, 78794 +EGYPTIAN HIEROGLYPH W023, 78795 +EGYPTIAN HIEROGLYPH W024, 78796 +EGYPTIAN HIEROGLYPH W024A, 78797 +EGYPTIAN HIEROGLYPH W025, 78798 +EGYPTIAN HIEROGLYPH X001, 78799 +EGYPTIAN HIEROGLYPH X002, 78800 +EGYPTIAN HIEROGLYPH X003, 78801 +EGYPTIAN HIEROGLYPH X004, 78802 +EGYPTIAN HIEROGLYPH X004A, 78803 +EGYPTIAN HIEROGLYPH X004B, 78804 +EGYPTIAN HIEROGLYPH X005, 78805 +EGYPTIAN HIEROGLYPH X006, 78806 +EGYPTIAN HIEROGLYPH X006A, 78807 +EGYPTIAN HIEROGLYPH X007, 78808 +EGYPTIAN HIEROGLYPH X008, 78809 +EGYPTIAN HIEROGLYPH X008A, 78810 +EGYPTIAN HIEROGLYPH Y001, 78811 +EGYPTIAN HIEROGLYPH Y001A, 78812 +EGYPTIAN HIEROGLYPH Y002, 78813 +EGYPTIAN HIEROGLYPH Y003, 78814 +EGYPTIAN HIEROGLYPH Y004, 78815 +EGYPTIAN HIEROGLYPH Y005, 78816 +EGYPTIAN HIEROGLYPH Y006, 78817 +EGYPTIAN HIEROGLYPH Y007, 78818 +EGYPTIAN HIEROGLYPH Y008, 78819 +EGYPTIAN HIEROGLYPH Z001, 78820 +EGYPTIAN HIEROGLYPH Z002, 78821 +EGYPTIAN HIEROGLYPH Z002A, 78822 +EGYPTIAN HIEROGLYPH Z002B, 78823 +EGYPTIAN HIEROGLYPH Z002C, 78824 +EGYPTIAN HIEROGLYPH Z002D, 78825 +EGYPTIAN HIEROGLYPH Z003, 78826 +EGYPTIAN HIEROGLYPH Z003A, 78827 +EGYPTIAN HIEROGLYPH Z003B, 78828 +EGYPTIAN HIEROGLYPH Z004, 78829 +EGYPTIAN HIEROGLYPH Z004A, 78830 +EGYPTIAN HIEROGLYPH Z005, 78831 +EGYPTIAN HIEROGLYPH Z005A, 78832 +EGYPTIAN HIEROGLYPH Z006, 78833 +EGYPTIAN HIEROGLYPH Z007, 78834 +EGYPTIAN HIEROGLYPH Z008, 78835 +EGYPTIAN HIEROGLYPH Z009, 78836 +EGYPTIAN HIEROGLYPH Z010, 78837 +EGYPTIAN HIEROGLYPH Z011, 78838 +EGYPTIAN HIEROGLYPH Z012, 78839 +EGYPTIAN HIEROGLYPH Z013, 78840 +EGYPTIAN HIEROGLYPH Z014, 78841 +EGYPTIAN HIEROGLYPH Z015, 78842 +EGYPTIAN HIEROGLYPH Z015A, 78843 +EGYPTIAN HIEROGLYPH Z015B, 78844 +EGYPTIAN HIEROGLYPH Z015C, 78845 +EGYPTIAN HIEROGLYPH Z015D, 78846 +EGYPTIAN HIEROGLYPH Z015E, 78847 +EGYPTIAN HIEROGLYPH Z015F, 78848 +EGYPTIAN HIEROGLYPH Z015G, 78849 +EGYPTIAN HIEROGLYPH Z015H, 78850 +EGYPTIAN HIEROGLYPH Z015I, 78851 +EGYPTIAN HIEROGLYPH Z016, 78852 +EGYPTIAN HIEROGLYPH Z016A, 78853 +EGYPTIAN HIEROGLYPH Z016B, 78854 +EGYPTIAN HIEROGLYPH Z016C, 78855 +EGYPTIAN HIEROGLYPH Z016D, 78856 +EGYPTIAN HIEROGLYPH Z016E, 78857 +EGYPTIAN HIEROGLYPH Z016F, 78858 +EGYPTIAN HIEROGLYPH Z016G, 78859 +EGYPTIAN HIEROGLYPH Z016H, 78860 +EGYPTIAN HIEROGLYPH AA001, 78861 +EGYPTIAN HIEROGLYPH AA002, 78862 +EGYPTIAN HIEROGLYPH AA003, 78863 +EGYPTIAN HIEROGLYPH AA004, 78864 +EGYPTIAN HIEROGLYPH AA005, 78865 +EGYPTIAN HIEROGLYPH AA006, 78866 +EGYPTIAN HIEROGLYPH AA007, 78867 +EGYPTIAN HIEROGLYPH AA007A, 78868 +EGYPTIAN HIEROGLYPH AA007B, 78869 +EGYPTIAN HIEROGLYPH AA008, 78870 +EGYPTIAN HIEROGLYPH AA009, 78871 +EGYPTIAN HIEROGLYPH AA010, 78872 +EGYPTIAN HIEROGLYPH AA011, 78873 +EGYPTIAN HIEROGLYPH AA012, 78874 +EGYPTIAN HIEROGLYPH AA013, 78875 +EGYPTIAN HIEROGLYPH AA014, 78876 +EGYPTIAN HIEROGLYPH AA015, 78877 +EGYPTIAN HIEROGLYPH AA016, 78878 +EGYPTIAN HIEROGLYPH AA017, 78879 +EGYPTIAN HIEROGLYPH AA018, 78880 +EGYPTIAN HIEROGLYPH AA019, 78881 +EGYPTIAN HIEROGLYPH AA020, 78882 +EGYPTIAN HIEROGLYPH AA021, 78883 +EGYPTIAN HIEROGLYPH AA022, 78884 +EGYPTIAN HIEROGLYPH AA023, 78885 +EGYPTIAN HIEROGLYPH AA024, 78886 +EGYPTIAN HIEROGLYPH AA025, 78887 +EGYPTIAN HIEROGLYPH AA026, 78888 +EGYPTIAN HIEROGLYPH AA027, 78889 +EGYPTIAN HIEROGLYPH AA028, 78890 +EGYPTIAN HIEROGLYPH AA029, 78891 +EGYPTIAN HIEROGLYPH AA030, 78892 +EGYPTIAN HIEROGLYPH AA031, 78893 +EGYPTIAN HIEROGLYPH AA032, 78894 +ANATOLIAN HIEROGLYPH A001, 82944 +ANATOLIAN HIEROGLYPH A002, 82945 +ANATOLIAN HIEROGLYPH A003, 82946 +ANATOLIAN HIEROGLYPH A004, 82947 +ANATOLIAN HIEROGLYPH A005, 82948 +ANATOLIAN HIEROGLYPH A006, 82949 +ANATOLIAN HIEROGLYPH A007, 82950 +ANATOLIAN HIEROGLYPH A008, 82951 +ANATOLIAN HIEROGLYPH A009, 82952 +ANATOLIAN HIEROGLYPH A010, 82953 +ANATOLIAN HIEROGLYPH A010A, 82954 +ANATOLIAN HIEROGLYPH A011, 82955 +ANATOLIAN HIEROGLYPH A012, 82956 +ANATOLIAN HIEROGLYPH A013, 82957 +ANATOLIAN HIEROGLYPH A014, 82958 +ANATOLIAN HIEROGLYPH A015, 82959 +ANATOLIAN HIEROGLYPH A016, 82960 +ANATOLIAN HIEROGLYPH A017, 82961 +ANATOLIAN HIEROGLYPH A018, 82962 +ANATOLIAN HIEROGLYPH A019, 82963 +ANATOLIAN HIEROGLYPH A020, 82964 +ANATOLIAN HIEROGLYPH A021, 82965 +ANATOLIAN HIEROGLYPH A022, 82966 +ANATOLIAN HIEROGLYPH A023, 82967 +ANATOLIAN HIEROGLYPH A024, 82968 +ANATOLIAN HIEROGLYPH A025, 82969 +ANATOLIAN HIEROGLYPH A026, 82970 +ANATOLIAN HIEROGLYPH A026A, 82971 +ANATOLIAN HIEROGLYPH A027, 82972 +ANATOLIAN HIEROGLYPH A028, 82973 +ANATOLIAN HIEROGLYPH A029, 82974 +ANATOLIAN HIEROGLYPH A030, 82975 +ANATOLIAN HIEROGLYPH A031, 82976 +ANATOLIAN HIEROGLYPH A032, 82977 +ANATOLIAN HIEROGLYPH A033, 82978 +ANATOLIAN HIEROGLYPH A034, 82979 +ANATOLIAN HIEROGLYPH A035, 82980 +ANATOLIAN HIEROGLYPH A036, 82981 +ANATOLIAN HIEROGLYPH A037, 82982 +ANATOLIAN HIEROGLYPH A038, 82983 +ANATOLIAN HIEROGLYPH A039, 82984 +ANATOLIAN HIEROGLYPH A039A, 82985 +ANATOLIAN HIEROGLYPH A040, 82986 +ANATOLIAN HIEROGLYPH A041, 82987 +ANATOLIAN HIEROGLYPH A041A, 82988 +ANATOLIAN HIEROGLYPH A042, 82989 +ANATOLIAN HIEROGLYPH A043, 82990 +ANATOLIAN HIEROGLYPH A044, 82991 +ANATOLIAN HIEROGLYPH A045, 82992 +ANATOLIAN HIEROGLYPH A045A, 82993 +ANATOLIAN HIEROGLYPH A046, 82994 +ANATOLIAN HIEROGLYPH A046A, 82995 +ANATOLIAN HIEROGLYPH A046B, 82996 +ANATOLIAN HIEROGLYPH A047, 82997 +ANATOLIAN HIEROGLYPH A048, 82998 +ANATOLIAN HIEROGLYPH A049, 82999 +ANATOLIAN HIEROGLYPH A050, 83000 +ANATOLIAN HIEROGLYPH A051, 83001 +ANATOLIAN HIEROGLYPH A052, 83002 +ANATOLIAN HIEROGLYPH A053, 83003 +ANATOLIAN HIEROGLYPH A054, 83004 +ANATOLIAN HIEROGLYPH A055, 83005 +ANATOLIAN HIEROGLYPH A056, 83006 +ANATOLIAN HIEROGLYPH A057, 83007 +ANATOLIAN HIEROGLYPH A058, 83008 +ANATOLIAN HIEROGLYPH A059, 83009 +ANATOLIAN HIEROGLYPH A060, 83010 +ANATOLIAN HIEROGLYPH A061, 83011 +ANATOLIAN HIEROGLYPH A062, 83012 +ANATOLIAN HIEROGLYPH A063, 83013 +ANATOLIAN HIEROGLYPH A064, 83014 +ANATOLIAN HIEROGLYPH A065, 83015 +ANATOLIAN HIEROGLYPH A066, 83016 +ANATOLIAN HIEROGLYPH A066A, 83017 +ANATOLIAN HIEROGLYPH A066B, 83018 +ANATOLIAN HIEROGLYPH A066C, 83019 +ANATOLIAN HIEROGLYPH A067, 83020 +ANATOLIAN HIEROGLYPH A068, 83021 +ANATOLIAN HIEROGLYPH A069, 83022 +ANATOLIAN HIEROGLYPH A070, 83023 +ANATOLIAN HIEROGLYPH A071, 83024 +ANATOLIAN HIEROGLYPH A072, 83025 +ANATOLIAN HIEROGLYPH A073, 83026 +ANATOLIAN HIEROGLYPH A074, 83027 +ANATOLIAN HIEROGLYPH A075, 83028 +ANATOLIAN HIEROGLYPH A076, 83029 +ANATOLIAN HIEROGLYPH A077, 83030 +ANATOLIAN HIEROGLYPH A078, 83031 +ANATOLIAN HIEROGLYPH A079, 83032 +ANATOLIAN HIEROGLYPH A080, 83033 +ANATOLIAN HIEROGLYPH A081, 83034 +ANATOLIAN HIEROGLYPH A082, 83035 +ANATOLIAN HIEROGLYPH A083, 83036 +ANATOLIAN HIEROGLYPH A084, 83037 +ANATOLIAN HIEROGLYPH A085, 83038 +ANATOLIAN HIEROGLYPH A086, 83039 +ANATOLIAN HIEROGLYPH A087, 83040 +ANATOLIAN HIEROGLYPH A088, 83041 +ANATOLIAN HIEROGLYPH A089, 83042 +ANATOLIAN HIEROGLYPH A090, 83043 +ANATOLIAN HIEROGLYPH A091, 83044 +ANATOLIAN HIEROGLYPH A092, 83045 +ANATOLIAN HIEROGLYPH A093, 83046 +ANATOLIAN HIEROGLYPH A094, 83047 +ANATOLIAN HIEROGLYPH A095, 83048 +ANATOLIAN HIEROGLYPH A096, 83049 +ANATOLIAN HIEROGLYPH A097, 83050 +ANATOLIAN HIEROGLYPH A097A, 83051 +ANATOLIAN HIEROGLYPH A098, 83052 +ANATOLIAN HIEROGLYPH A098A, 83053 +ANATOLIAN HIEROGLYPH A099, 83054 +ANATOLIAN HIEROGLYPH A100, 83055 +ANATOLIAN HIEROGLYPH A100A, 83056 +ANATOLIAN HIEROGLYPH A101, 83057 +ANATOLIAN HIEROGLYPH A101A, 83058 +ANATOLIAN HIEROGLYPH A102, 83059 +ANATOLIAN HIEROGLYPH A102A, 83060 +ANATOLIAN HIEROGLYPH A103, 83061 +ANATOLIAN HIEROGLYPH A104, 83062 +ANATOLIAN HIEROGLYPH A104A, 83063 +ANATOLIAN HIEROGLYPH A104B, 83064 +ANATOLIAN HIEROGLYPH A104C, 83065 +ANATOLIAN HIEROGLYPH A105, 83066 +ANATOLIAN HIEROGLYPH A105A, 83067 +ANATOLIAN HIEROGLYPH A105B, 83068 +ANATOLIAN HIEROGLYPH A106, 83069 +ANATOLIAN HIEROGLYPH A107, 83070 +ANATOLIAN HIEROGLYPH A107A, 83071 +ANATOLIAN HIEROGLYPH A107B, 83072 +ANATOLIAN HIEROGLYPH A107C, 83073 +ANATOLIAN HIEROGLYPH A108, 83074 +ANATOLIAN HIEROGLYPH A109, 83075 +ANATOLIAN HIEROGLYPH A110, 83076 +ANATOLIAN HIEROGLYPH A110A, 83077 +ANATOLIAN HIEROGLYPH A110B, 83078 +ANATOLIAN HIEROGLYPH A111, 83079 +ANATOLIAN HIEROGLYPH A112, 83080 +ANATOLIAN HIEROGLYPH A113, 83081 +ANATOLIAN HIEROGLYPH A114, 83082 +ANATOLIAN HIEROGLYPH A115, 83083 +ANATOLIAN HIEROGLYPH A115A, 83084 +ANATOLIAN HIEROGLYPH A116, 83085 +ANATOLIAN HIEROGLYPH A117, 83086 +ANATOLIAN HIEROGLYPH A118, 83087 +ANATOLIAN HIEROGLYPH A119, 83088 +ANATOLIAN HIEROGLYPH A120, 83089 +ANATOLIAN HIEROGLYPH A121, 83090 +ANATOLIAN HIEROGLYPH A122, 83091 +ANATOLIAN HIEROGLYPH A123, 83092 +ANATOLIAN HIEROGLYPH A124, 83093 +ANATOLIAN HIEROGLYPH A125, 83094 +ANATOLIAN HIEROGLYPH A125A, 83095 +ANATOLIAN HIEROGLYPH A126, 83096 +ANATOLIAN HIEROGLYPH A127, 83097 +ANATOLIAN HIEROGLYPH A128, 83098 +ANATOLIAN HIEROGLYPH A129, 83099 +ANATOLIAN HIEROGLYPH A130, 83100 +ANATOLIAN HIEROGLYPH A131, 83101 +ANATOLIAN HIEROGLYPH A132, 83102 +ANATOLIAN HIEROGLYPH A133, 83103 +ANATOLIAN HIEROGLYPH A134, 83104 +ANATOLIAN HIEROGLYPH A135, 83105 +ANATOLIAN HIEROGLYPH A135A, 83106 +ANATOLIAN HIEROGLYPH A136, 83107 +ANATOLIAN HIEROGLYPH A137, 83108 +ANATOLIAN HIEROGLYPH A138, 83109 +ANATOLIAN HIEROGLYPH A139, 83110 +ANATOLIAN HIEROGLYPH A140, 83111 +ANATOLIAN HIEROGLYPH A141, 83112 +ANATOLIAN HIEROGLYPH A142, 83113 +ANATOLIAN HIEROGLYPH A143, 83114 +ANATOLIAN HIEROGLYPH A144, 83115 +ANATOLIAN HIEROGLYPH A145, 83116 +ANATOLIAN HIEROGLYPH A146, 83117 +ANATOLIAN HIEROGLYPH A147, 83118 +ANATOLIAN HIEROGLYPH A148, 83119 +ANATOLIAN HIEROGLYPH A149, 83120 +ANATOLIAN HIEROGLYPH A150, 83121 +ANATOLIAN HIEROGLYPH A151, 83122 +ANATOLIAN HIEROGLYPH A152, 83123 +ANATOLIAN HIEROGLYPH A153, 83124 +ANATOLIAN HIEROGLYPH A154, 83125 +ANATOLIAN HIEROGLYPH A155, 83126 +ANATOLIAN HIEROGLYPH A156, 83127 +ANATOLIAN HIEROGLYPH A157, 83128 +ANATOLIAN HIEROGLYPH A158, 83129 +ANATOLIAN HIEROGLYPH A159, 83130 +ANATOLIAN HIEROGLYPH A160, 83131 +ANATOLIAN HIEROGLYPH A161, 83132 +ANATOLIAN HIEROGLYPH A162, 83133 +ANATOLIAN HIEROGLYPH A163, 83134 +ANATOLIAN HIEROGLYPH A164, 83135 +ANATOLIAN HIEROGLYPH A165, 83136 +ANATOLIAN HIEROGLYPH A166, 83137 +ANATOLIAN HIEROGLYPH A167, 83138 +ANATOLIAN HIEROGLYPH A168, 83139 +ANATOLIAN HIEROGLYPH A169, 83140 +ANATOLIAN HIEROGLYPH A170, 83141 +ANATOLIAN HIEROGLYPH A171, 83142 +ANATOLIAN HIEROGLYPH A172, 83143 +ANATOLIAN HIEROGLYPH A173, 83144 +ANATOLIAN HIEROGLYPH A174, 83145 +ANATOLIAN HIEROGLYPH A175, 83146 +ANATOLIAN HIEROGLYPH A176, 83147 +ANATOLIAN HIEROGLYPH A177, 83148 +ANATOLIAN HIEROGLYPH A178, 83149 +ANATOLIAN HIEROGLYPH A179, 83150 +ANATOLIAN HIEROGLYPH A180, 83151 +ANATOLIAN HIEROGLYPH A181, 83152 +ANATOLIAN HIEROGLYPH A182, 83153 +ANATOLIAN HIEROGLYPH A183, 83154 +ANATOLIAN HIEROGLYPH A184, 83155 +ANATOLIAN HIEROGLYPH A185, 83156 +ANATOLIAN HIEROGLYPH A186, 83157 +ANATOLIAN HIEROGLYPH A187, 83158 +ANATOLIAN HIEROGLYPH A188, 83159 +ANATOLIAN HIEROGLYPH A189, 83160 +ANATOLIAN HIEROGLYPH A190, 83161 +ANATOLIAN HIEROGLYPH A191, 83162 +ANATOLIAN HIEROGLYPH A192, 83163 +ANATOLIAN HIEROGLYPH A193, 83164 +ANATOLIAN HIEROGLYPH A194, 83165 +ANATOLIAN HIEROGLYPH A195, 83166 +ANATOLIAN HIEROGLYPH A196, 83167 +ANATOLIAN HIEROGLYPH A197, 83168 +ANATOLIAN HIEROGLYPH A198, 83169 +ANATOLIAN HIEROGLYPH A199, 83170 +ANATOLIAN HIEROGLYPH A200, 83171 +ANATOLIAN HIEROGLYPH A201, 83172 +ANATOLIAN HIEROGLYPH A202, 83173 +ANATOLIAN HIEROGLYPH A202A, 83174 +ANATOLIAN HIEROGLYPH A202B, 83175 +ANATOLIAN HIEROGLYPH A203, 83176 +ANATOLIAN HIEROGLYPH A204, 83177 +ANATOLIAN HIEROGLYPH A205, 83178 +ANATOLIAN HIEROGLYPH A206, 83179 +ANATOLIAN HIEROGLYPH A207, 83180 +ANATOLIAN HIEROGLYPH A207A, 83181 +ANATOLIAN HIEROGLYPH A208, 83182 +ANATOLIAN HIEROGLYPH A209, 83183 +ANATOLIAN HIEROGLYPH A209A, 83184 +ANATOLIAN HIEROGLYPH A210, 83185 +ANATOLIAN HIEROGLYPH A211, 83186 +ANATOLIAN HIEROGLYPH A212, 83187 +ANATOLIAN HIEROGLYPH A213, 83188 +ANATOLIAN HIEROGLYPH A214, 83189 +ANATOLIAN HIEROGLYPH A215, 83190 +ANATOLIAN HIEROGLYPH A215A, 83191 +ANATOLIAN HIEROGLYPH A216, 83192 +ANATOLIAN HIEROGLYPH A216A, 83193 +ANATOLIAN HIEROGLYPH A217, 83194 +ANATOLIAN HIEROGLYPH A218, 83195 +ANATOLIAN HIEROGLYPH A219, 83196 +ANATOLIAN HIEROGLYPH A220, 83197 +ANATOLIAN HIEROGLYPH A221, 83198 +ANATOLIAN HIEROGLYPH A222, 83199 +ANATOLIAN HIEROGLYPH A223, 83200 +ANATOLIAN HIEROGLYPH A224, 83201 +ANATOLIAN HIEROGLYPH A225, 83202 +ANATOLIAN HIEROGLYPH A226, 83203 +ANATOLIAN HIEROGLYPH A227, 83204 +ANATOLIAN HIEROGLYPH A227A, 83205 +ANATOLIAN HIEROGLYPH A228, 83206 +ANATOLIAN HIEROGLYPH A229, 83207 +ANATOLIAN HIEROGLYPH A230, 83208 +ANATOLIAN HIEROGLYPH A231, 83209 +ANATOLIAN HIEROGLYPH A232, 83210 +ANATOLIAN HIEROGLYPH A233, 83211 +ANATOLIAN HIEROGLYPH A234, 83212 +ANATOLIAN HIEROGLYPH A235, 83213 +ANATOLIAN HIEROGLYPH A236, 83214 +ANATOLIAN HIEROGLYPH A237, 83215 +ANATOLIAN HIEROGLYPH A238, 83216 +ANATOLIAN HIEROGLYPH A239, 83217 +ANATOLIAN HIEROGLYPH A240, 83218 +ANATOLIAN HIEROGLYPH A241, 83219 +ANATOLIAN HIEROGLYPH A242, 83220 +ANATOLIAN HIEROGLYPH A243, 83221 +ANATOLIAN HIEROGLYPH A244, 83222 +ANATOLIAN HIEROGLYPH A245, 83223 +ANATOLIAN HIEROGLYPH A246, 83224 +ANATOLIAN HIEROGLYPH A247, 83225 +ANATOLIAN HIEROGLYPH A248, 83226 +ANATOLIAN HIEROGLYPH A249, 83227 +ANATOLIAN HIEROGLYPH A250, 83228 +ANATOLIAN HIEROGLYPH A251, 83229 +ANATOLIAN HIEROGLYPH A252, 83230 +ANATOLIAN HIEROGLYPH A253, 83231 +ANATOLIAN HIEROGLYPH A254, 83232 +ANATOLIAN HIEROGLYPH A255, 83233 +ANATOLIAN HIEROGLYPH A256, 83234 +ANATOLIAN HIEROGLYPH A257, 83235 +ANATOLIAN HIEROGLYPH A258, 83236 +ANATOLIAN HIEROGLYPH A259, 83237 +ANATOLIAN HIEROGLYPH A260, 83238 +ANATOLIAN HIEROGLYPH A261, 83239 +ANATOLIAN HIEROGLYPH A262, 83240 +ANATOLIAN HIEROGLYPH A263, 83241 +ANATOLIAN HIEROGLYPH A264, 83242 +ANATOLIAN HIEROGLYPH A265, 83243 +ANATOLIAN HIEROGLYPH A266, 83244 +ANATOLIAN HIEROGLYPH A267, 83245 +ANATOLIAN HIEROGLYPH A267A, 83246 +ANATOLIAN HIEROGLYPH A268, 83247 +ANATOLIAN HIEROGLYPH A269, 83248 +ANATOLIAN HIEROGLYPH A270, 83249 +ANATOLIAN HIEROGLYPH A271, 83250 +ANATOLIAN HIEROGLYPH A272, 83251 +ANATOLIAN HIEROGLYPH A273, 83252 +ANATOLIAN HIEROGLYPH A274, 83253 +ANATOLIAN HIEROGLYPH A275, 83254 +ANATOLIAN HIEROGLYPH A276, 83255 +ANATOLIAN HIEROGLYPH A277, 83256 +ANATOLIAN HIEROGLYPH A278, 83257 +ANATOLIAN HIEROGLYPH A279, 83258 +ANATOLIAN HIEROGLYPH A280, 83259 +ANATOLIAN HIEROGLYPH A281, 83260 +ANATOLIAN HIEROGLYPH A282, 83261 +ANATOLIAN HIEROGLYPH A283, 83262 +ANATOLIAN HIEROGLYPH A284, 83263 +ANATOLIAN HIEROGLYPH A285, 83264 +ANATOLIAN HIEROGLYPH A286, 83265 +ANATOLIAN HIEROGLYPH A287, 83266 +ANATOLIAN HIEROGLYPH A288, 83267 +ANATOLIAN HIEROGLYPH A289, 83268 +ANATOLIAN HIEROGLYPH A289A, 83269 +ANATOLIAN HIEROGLYPH A290, 83270 +ANATOLIAN HIEROGLYPH A291, 83271 +ANATOLIAN HIEROGLYPH A292, 83272 +ANATOLIAN HIEROGLYPH A293, 83273 +ANATOLIAN HIEROGLYPH A294, 83274 +ANATOLIAN HIEROGLYPH A294A, 83275 +ANATOLIAN HIEROGLYPH A295, 83276 +ANATOLIAN HIEROGLYPH A296, 83277 +ANATOLIAN HIEROGLYPH A297, 83278 +ANATOLIAN HIEROGLYPH A298, 83279 +ANATOLIAN HIEROGLYPH A299, 83280 +ANATOLIAN HIEROGLYPH A299A, 83281 +ANATOLIAN HIEROGLYPH A300, 83282 +ANATOLIAN HIEROGLYPH A301, 83283 +ANATOLIAN HIEROGLYPH A302, 83284 +ANATOLIAN HIEROGLYPH A303, 83285 +ANATOLIAN HIEROGLYPH A304, 83286 +ANATOLIAN HIEROGLYPH A305, 83287 +ANATOLIAN HIEROGLYPH A306, 83288 +ANATOLIAN HIEROGLYPH A307, 83289 +ANATOLIAN HIEROGLYPH A308, 83290 +ANATOLIAN HIEROGLYPH A309, 83291 +ANATOLIAN HIEROGLYPH A309A, 83292 +ANATOLIAN HIEROGLYPH A310, 83293 +ANATOLIAN HIEROGLYPH A311, 83294 +ANATOLIAN HIEROGLYPH A312, 83295 +ANATOLIAN HIEROGLYPH A313, 83296 +ANATOLIAN HIEROGLYPH A314, 83297 +ANATOLIAN HIEROGLYPH A315, 83298 +ANATOLIAN HIEROGLYPH A316, 83299 +ANATOLIAN HIEROGLYPH A317, 83300 +ANATOLIAN HIEROGLYPH A318, 83301 +ANATOLIAN HIEROGLYPH A319, 83302 +ANATOLIAN HIEROGLYPH A320, 83303 +ANATOLIAN HIEROGLYPH A321, 83304 +ANATOLIAN HIEROGLYPH A322, 83305 +ANATOLIAN HIEROGLYPH A323, 83306 +ANATOLIAN HIEROGLYPH A324, 83307 +ANATOLIAN HIEROGLYPH A325, 83308 +ANATOLIAN HIEROGLYPH A326, 83309 +ANATOLIAN HIEROGLYPH A327, 83310 +ANATOLIAN HIEROGLYPH A328, 83311 +ANATOLIAN HIEROGLYPH A329, 83312 +ANATOLIAN HIEROGLYPH A329A, 83313 +ANATOLIAN HIEROGLYPH A330, 83314 +ANATOLIAN HIEROGLYPH A331, 83315 +ANATOLIAN HIEROGLYPH A332A, 83316 +ANATOLIAN HIEROGLYPH A332B, 83317 +ANATOLIAN HIEROGLYPH A332C, 83318 +ANATOLIAN HIEROGLYPH A333, 83319 +ANATOLIAN HIEROGLYPH A334, 83320 +ANATOLIAN HIEROGLYPH A335, 83321 +ANATOLIAN HIEROGLYPH A336, 83322 +ANATOLIAN HIEROGLYPH A336A, 83323 +ANATOLIAN HIEROGLYPH A336B, 83324 +ANATOLIAN HIEROGLYPH A336C, 83325 +ANATOLIAN HIEROGLYPH A337, 83326 +ANATOLIAN HIEROGLYPH A338, 83327 +ANATOLIAN HIEROGLYPH A339, 83328 +ANATOLIAN HIEROGLYPH A340, 83329 +ANATOLIAN HIEROGLYPH A341, 83330 +ANATOLIAN HIEROGLYPH A342, 83331 +ANATOLIAN HIEROGLYPH A343, 83332 +ANATOLIAN HIEROGLYPH A344, 83333 +ANATOLIAN HIEROGLYPH A345, 83334 +ANATOLIAN HIEROGLYPH A346, 83335 +ANATOLIAN HIEROGLYPH A347, 83336 +ANATOLIAN HIEROGLYPH A348, 83337 +ANATOLIAN HIEROGLYPH A349, 83338 +ANATOLIAN HIEROGLYPH A350, 83339 +ANATOLIAN HIEROGLYPH A351, 83340 +ANATOLIAN HIEROGLYPH A352, 83341 +ANATOLIAN HIEROGLYPH A353, 83342 +ANATOLIAN HIEROGLYPH A354, 83343 +ANATOLIAN HIEROGLYPH A355, 83344 +ANATOLIAN HIEROGLYPH A356, 83345 +ANATOLIAN HIEROGLYPH A357, 83346 +ANATOLIAN HIEROGLYPH A358, 83347 +ANATOLIAN HIEROGLYPH A359, 83348 +ANATOLIAN HIEROGLYPH A359A, 83349 +ANATOLIAN HIEROGLYPH A360, 83350 +ANATOLIAN HIEROGLYPH A361, 83351 +ANATOLIAN HIEROGLYPH A362, 83352 +ANATOLIAN HIEROGLYPH A363, 83353 +ANATOLIAN HIEROGLYPH A364, 83354 +ANATOLIAN HIEROGLYPH A364A, 83355 +ANATOLIAN HIEROGLYPH A365, 83356 +ANATOLIAN HIEROGLYPH A366, 83357 +ANATOLIAN HIEROGLYPH A367, 83358 +ANATOLIAN HIEROGLYPH A368, 83359 +ANATOLIAN HIEROGLYPH A368A, 83360 +ANATOLIAN HIEROGLYPH A369, 83361 +ANATOLIAN HIEROGLYPH A370, 83362 +ANATOLIAN HIEROGLYPH A371, 83363 +ANATOLIAN HIEROGLYPH A371A, 83364 +ANATOLIAN HIEROGLYPH A372, 83365 +ANATOLIAN HIEROGLYPH A373, 83366 +ANATOLIAN HIEROGLYPH A374, 83367 +ANATOLIAN HIEROGLYPH A375, 83368 +ANATOLIAN HIEROGLYPH A376, 83369 +ANATOLIAN HIEROGLYPH A377, 83370 +ANATOLIAN HIEROGLYPH A378, 83371 +ANATOLIAN HIEROGLYPH A379, 83372 +ANATOLIAN HIEROGLYPH A380, 83373 +ANATOLIAN HIEROGLYPH A381, 83374 +ANATOLIAN HIEROGLYPH A381A, 83375 +ANATOLIAN HIEROGLYPH A382, 83376 +ANATOLIAN HIEROGLYPH A383 RA OR RI, 83377 +ANATOLIAN HIEROGLYPH A383A, 83378 +ANATOLIAN HIEROGLYPH A384, 83379 +ANATOLIAN HIEROGLYPH A385, 83380 +ANATOLIAN HIEROGLYPH A386, 83381 +ANATOLIAN HIEROGLYPH A386A, 83382 +ANATOLIAN HIEROGLYPH A387, 83383 +ANATOLIAN HIEROGLYPH A388, 83384 +ANATOLIAN HIEROGLYPH A389, 83385 +ANATOLIAN HIEROGLYPH A390, 83386 +ANATOLIAN HIEROGLYPH A391, 83387 +ANATOLIAN HIEROGLYPH A392, 83388 +ANATOLIAN HIEROGLYPH A393 EIGHT, 83389 +ANATOLIAN HIEROGLYPH A394, 83390 +ANATOLIAN HIEROGLYPH A395, 83391 +ANATOLIAN HIEROGLYPH A396, 83392 +ANATOLIAN HIEROGLYPH A397, 83393 +ANATOLIAN HIEROGLYPH A398, 83394 +ANATOLIAN HIEROGLYPH A399, 83395 +ANATOLIAN HIEROGLYPH A400, 83396 +ANATOLIAN HIEROGLYPH A401, 83397 +ANATOLIAN HIEROGLYPH A402, 83398 +ANATOLIAN HIEROGLYPH A403, 83399 +ANATOLIAN HIEROGLYPH A404, 83400 +ANATOLIAN HIEROGLYPH A405, 83401 +ANATOLIAN HIEROGLYPH A406, 83402 +ANATOLIAN HIEROGLYPH A407, 83403 +ANATOLIAN HIEROGLYPH A408, 83404 +ANATOLIAN HIEROGLYPH A409, 83405 +ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK, 83406 +ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK, 83407 +ANATOLIAN HIEROGLYPH A411, 83408 +ANATOLIAN HIEROGLYPH A412, 83409 +ANATOLIAN HIEROGLYPH A413, 83410 +ANATOLIAN HIEROGLYPH A414, 83411 +ANATOLIAN HIEROGLYPH A415, 83412 +ANATOLIAN HIEROGLYPH A416, 83413 +ANATOLIAN HIEROGLYPH A417, 83414 +ANATOLIAN HIEROGLYPH A418, 83415 +ANATOLIAN HIEROGLYPH A419, 83416 +ANATOLIAN HIEROGLYPH A420, 83417 +ANATOLIAN HIEROGLYPH A421, 83418 +ANATOLIAN HIEROGLYPH A422, 83419 +ANATOLIAN HIEROGLYPH A423, 83420 +ANATOLIAN HIEROGLYPH A424, 83421 +ANATOLIAN HIEROGLYPH A425, 83422 +ANATOLIAN HIEROGLYPH A426, 83423 +ANATOLIAN HIEROGLYPH A427, 83424 +ANATOLIAN HIEROGLYPH A428, 83425 +ANATOLIAN HIEROGLYPH A429, 83426 +ANATOLIAN HIEROGLYPH A430, 83427 +ANATOLIAN HIEROGLYPH A431, 83428 +ANATOLIAN HIEROGLYPH A432, 83429 +ANATOLIAN HIEROGLYPH A433, 83430 +ANATOLIAN HIEROGLYPH A434, 83431 +ANATOLIAN HIEROGLYPH A435, 83432 +ANATOLIAN HIEROGLYPH A436, 83433 +ANATOLIAN HIEROGLYPH A437, 83434 +ANATOLIAN HIEROGLYPH A438, 83435 +ANATOLIAN HIEROGLYPH A439, 83436 +ANATOLIAN HIEROGLYPH A440, 83437 +ANATOLIAN HIEROGLYPH A441, 83438 +ANATOLIAN HIEROGLYPH A442, 83439 +ANATOLIAN HIEROGLYPH A443, 83440 +ANATOLIAN HIEROGLYPH A444, 83441 +ANATOLIAN HIEROGLYPH A445, 83442 +ANATOLIAN HIEROGLYPH A446, 83443 +ANATOLIAN HIEROGLYPH A447, 83444 +ANATOLIAN HIEROGLYPH A448, 83445 +ANATOLIAN HIEROGLYPH A449, 83446 +ANATOLIAN HIEROGLYPH A450, 83447 +ANATOLIAN HIEROGLYPH A450A, 83448 +ANATOLIAN HIEROGLYPH A451, 83449 +ANATOLIAN HIEROGLYPH A452, 83450 +ANATOLIAN HIEROGLYPH A453, 83451 +ANATOLIAN HIEROGLYPH A454, 83452 +ANATOLIAN HIEROGLYPH A455, 83453 +ANATOLIAN HIEROGLYPH A456, 83454 +ANATOLIAN HIEROGLYPH A457, 83455 +ANATOLIAN HIEROGLYPH A457A, 83456 +ANATOLIAN HIEROGLYPH A458, 83457 +ANATOLIAN HIEROGLYPH A459, 83458 +ANATOLIAN HIEROGLYPH A460, 83459 +ANATOLIAN HIEROGLYPH A461, 83460 +ANATOLIAN HIEROGLYPH A462, 83461 +ANATOLIAN HIEROGLYPH A463, 83462 +ANATOLIAN HIEROGLYPH A464, 83463 +ANATOLIAN HIEROGLYPH A465, 83464 +ANATOLIAN HIEROGLYPH A466, 83465 +ANATOLIAN HIEROGLYPH A467, 83466 +ANATOLIAN HIEROGLYPH A468, 83467 +ANATOLIAN HIEROGLYPH A469, 83468 +ANATOLIAN HIEROGLYPH A470, 83469 +ANATOLIAN HIEROGLYPH A471, 83470 +ANATOLIAN HIEROGLYPH A472, 83471 +ANATOLIAN HIEROGLYPH A473, 83472 +ANATOLIAN HIEROGLYPH A474, 83473 +ANATOLIAN HIEROGLYPH A475, 83474 +ANATOLIAN HIEROGLYPH A476, 83475 +ANATOLIAN HIEROGLYPH A477, 83476 +ANATOLIAN HIEROGLYPH A478, 83477 +ANATOLIAN HIEROGLYPH A479, 83478 +ANATOLIAN HIEROGLYPH A480, 83479 +ANATOLIAN HIEROGLYPH A481, 83480 +ANATOLIAN HIEROGLYPH A482, 83481 +ANATOLIAN HIEROGLYPH A483, 83482 +ANATOLIAN HIEROGLYPH A484, 83483 +ANATOLIAN HIEROGLYPH A485, 83484 +ANATOLIAN HIEROGLYPH A486, 83485 +ANATOLIAN HIEROGLYPH A487, 83486 +ANATOLIAN HIEROGLYPH A488, 83487 +ANATOLIAN HIEROGLYPH A489, 83488 +ANATOLIAN HIEROGLYPH A490, 83489 +ANATOLIAN HIEROGLYPH A491, 83490 +ANATOLIAN HIEROGLYPH A492, 83491 +ANATOLIAN HIEROGLYPH A493, 83492 +ANATOLIAN HIEROGLYPH A494, 83493 +ANATOLIAN HIEROGLYPH A495, 83494 +ANATOLIAN HIEROGLYPH A496, 83495 +ANATOLIAN HIEROGLYPH A497, 83496 +ANATOLIAN HIEROGLYPH A501, 83497 +ANATOLIAN HIEROGLYPH A502, 83498 +ANATOLIAN HIEROGLYPH A503, 83499 +ANATOLIAN HIEROGLYPH A504, 83500 +ANATOLIAN HIEROGLYPH A505, 83501 +ANATOLIAN HIEROGLYPH A506, 83502 +ANATOLIAN HIEROGLYPH A507, 83503 +ANATOLIAN HIEROGLYPH A508, 83504 +ANATOLIAN HIEROGLYPH A509, 83505 +ANATOLIAN HIEROGLYPH A510, 83506 +ANATOLIAN HIEROGLYPH A511, 83507 +ANATOLIAN HIEROGLYPH A512, 83508 +ANATOLIAN HIEROGLYPH A513, 83509 +ANATOLIAN HIEROGLYPH A514, 83510 +ANATOLIAN HIEROGLYPH A515, 83511 +ANATOLIAN HIEROGLYPH A516, 83512 +ANATOLIAN HIEROGLYPH A517, 83513 +ANATOLIAN HIEROGLYPH A518, 83514 +ANATOLIAN HIEROGLYPH A519, 83515 +ANATOLIAN HIEROGLYPH A520, 83516 +ANATOLIAN HIEROGLYPH A521, 83517 +ANATOLIAN HIEROGLYPH A522, 83518 +ANATOLIAN HIEROGLYPH A523, 83519 +ANATOLIAN HIEROGLYPH A524, 83520 +ANATOLIAN HIEROGLYPH A525, 83521 +ANATOLIAN HIEROGLYPH A526, 83522 +ANATOLIAN HIEROGLYPH A527, 83523 +ANATOLIAN HIEROGLYPH A528, 83524 +ANATOLIAN HIEROGLYPH A529, 83525 +ANATOLIAN HIEROGLYPH A530, 83526 +BAMUM LETTER PHASE A NGKUE MFON, 92160 +BAMUM LETTER PHASE A GBIEE FON, 92161 +BAMUM LETTER PHASE A PON MFON PIPAEMGBIEE, 92162 +BAMUM LETTER PHASE A PON MFON PIPAEMBA, 92163 +BAMUM LETTER PHASE A NAA MFON, 92164 +BAMUM LETTER PHASE A SHUENSHUET, 92165 +BAMUM LETTER PHASE A TITA MFON, 92166 +BAMUM LETTER PHASE A NZA MFON, 92167 +BAMUM LETTER PHASE A SHINDA PA NJI, 92168 +BAMUM LETTER PHASE A PON PA NJI PIPAEMGBIEE, 92169 +BAMUM LETTER PHASE A PON PA NJI PIPAEMBA, 92170 +BAMUM LETTER PHASE A MAEMBGBIEE, 92171 +BAMUM LETTER PHASE A TU MAEMBA, 92172 +BAMUM LETTER PHASE A NGANGU, 92173 +BAMUM LETTER PHASE A MAEMVEUX, 92174 +BAMUM LETTER PHASE A MANSUAE, 92175 +BAMUM LETTER PHASE A MVEUAENGAM, 92176 +BAMUM LETTER PHASE A SEUNYAM, 92177 +BAMUM LETTER PHASE A NTOQPEN, 92178 +BAMUM LETTER PHASE A KEUKEUTNDA, 92179 +BAMUM LETTER PHASE A NKINDI, 92180 +BAMUM LETTER PHASE A SUU, 92181 +BAMUM LETTER PHASE A NGKUENZEUM, 92182 +BAMUM LETTER PHASE A LAPAQ, 92183 +BAMUM LETTER PHASE A LET KUT, 92184 +BAMUM LETTER PHASE A NTAP MFAA, 92185 +BAMUM LETTER PHASE A MAEKEUP, 92186 +BAMUM LETTER PHASE A PASHAE, 92187 +BAMUM LETTER PHASE A GHEUAERAE, 92188 +BAMUM LETTER PHASE A PAMSHAE, 92189 +BAMUM LETTER PHASE A MON NGGEUAET, 92190 +BAMUM LETTER PHASE A NZUN MEUT, 92191 +BAMUM LETTER PHASE A U YUQ NAE, 92192 +BAMUM LETTER PHASE A GHEUAEGHEUAE, 92193 +BAMUM LETTER PHASE A NTAP NTAA, 92194 +BAMUM LETTER PHASE A SISA, 92195 +BAMUM LETTER PHASE A MGBASA, 92196 +BAMUM LETTER PHASE A MEUNJOMNDEUQ, 92197 +BAMUM LETTER PHASE A MOOMPUQ, 92198 +BAMUM LETTER PHASE A KAFA, 92199 +BAMUM LETTER PHASE A PA LEERAEWA, 92200 +BAMUM LETTER PHASE A NDA LEERAEWA, 92201 +BAMUM LETTER PHASE A PET, 92202 +BAMUM LETTER PHASE A MAEMKPEN, 92203 +BAMUM LETTER PHASE A NIKA, 92204 +BAMUM LETTER PHASE A PUP, 92205 +BAMUM LETTER PHASE A TUAEP, 92206 +BAMUM LETTER PHASE A LUAEP, 92207 +BAMUM LETTER PHASE A SONJAM, 92208 +BAMUM LETTER PHASE A TEUTEUWEN, 92209 +BAMUM LETTER PHASE A MAENYI, 92210 +BAMUM LETTER PHASE A KET, 92211 +BAMUM LETTER PHASE A NDAANGGEUAET, 92212 +BAMUM LETTER PHASE A KUOQ, 92213 +BAMUM LETTER PHASE A MOOMEUT, 92214 +BAMUM LETTER PHASE A SHUM, 92215 +BAMUM LETTER PHASE A LOMMAE, 92216 +BAMUM LETTER PHASE A FIRI, 92217 +BAMUM LETTER PHASE A ROM, 92218 +BAMUM LETTER PHASE A KPOQ, 92219 +BAMUM LETTER PHASE A SOQ, 92220 +BAMUM LETTER PHASE A MAP PIEET, 92221 +BAMUM LETTER PHASE A SHIRAE, 92222 +BAMUM LETTER PHASE A NTAP, 92223 +BAMUM LETTER PHASE A SHOQ NSHUT YUM, 92224 +BAMUM LETTER PHASE A NYIT MONGKEUAEQ, 92225 +BAMUM LETTER PHASE A PAARAE, 92226 +BAMUM LETTER PHASE A NKAARAE, 92227 +BAMUM LETTER PHASE A UNKNOWN, 92228 +BAMUM LETTER PHASE A NGGEN, 92229 +BAMUM LETTER PHASE A MAESI, 92230 +BAMUM LETTER PHASE A NJAM, 92231 +BAMUM LETTER PHASE A MBANYI, 92232 +BAMUM LETTER PHASE A NYET, 92233 +BAMUM LETTER PHASE A TEUAEN, 92234 +BAMUM LETTER PHASE A SOT, 92235 +BAMUM LETTER PHASE A PAAM, 92236 +BAMUM LETTER PHASE A NSHIEE, 92237 +BAMUM LETTER PHASE A MAEM, 92238 +BAMUM LETTER PHASE A NYI, 92239 +BAMUM LETTER PHASE A KAQ, 92240 +BAMUM LETTER PHASE A NSHA, 92241 +BAMUM LETTER PHASE A VEE, 92242 +BAMUM LETTER PHASE A LU, 92243 +BAMUM LETTER PHASE A NEN, 92244 +BAMUM LETTER PHASE A NAQ, 92245 +BAMUM LETTER PHASE A MBAQ, 92246 +BAMUM LETTER PHASE B NSHUET, 92247 +BAMUM LETTER PHASE B TU MAEMGBIEE, 92248 +BAMUM LETTER PHASE B SIEE, 92249 +BAMUM LETTER PHASE B SET TU, 92250 +BAMUM LETTER PHASE B LOM NTEUM, 92251 +BAMUM LETTER PHASE B MBA MAELEE, 92252 +BAMUM LETTER PHASE B KIEEM, 92253 +BAMUM LETTER PHASE B YEURAE, 92254 +BAMUM LETTER PHASE B MBAARAE, 92255 +BAMUM LETTER PHASE B KAM, 92256 +BAMUM LETTER PHASE B PEESHI, 92257 +BAMUM LETTER PHASE B YAFU LEERAEWA, 92258 +BAMUM LETTER PHASE B LAM NSHUT NYAM, 92259 +BAMUM LETTER PHASE B NTIEE SHEUOQ, 92260 +BAMUM LETTER PHASE B NDU NJAA, 92261 +BAMUM LETTER PHASE B GHEUGHEUAEM, 92262 +BAMUM LETTER PHASE B PIT, 92263 +BAMUM LETTER PHASE B TU NSIEE, 92264 +BAMUM LETTER PHASE B SHET NJAQ, 92265 +BAMUM LETTER PHASE B SHEUAEQTU, 92266 +BAMUM LETTER PHASE B MFON TEUAEQ, 92267 +BAMUM LETTER PHASE B MBIT MBAAKET, 92268 +BAMUM LETTER PHASE B NYI NTEUM, 92269 +BAMUM LETTER PHASE B KEUPUQ, 92270 +BAMUM LETTER PHASE B GHEUGHEN, 92271 +BAMUM LETTER PHASE B KEUYEUX, 92272 +BAMUM LETTER PHASE B LAANAE, 92273 +BAMUM LETTER PHASE B PARUM, 92274 +BAMUM LETTER PHASE B VEUM, 92275 +BAMUM LETTER PHASE B NGKINDI MVOP, 92276 +BAMUM LETTER PHASE B NGGEU MBU, 92277 +BAMUM LETTER PHASE B WUAET, 92278 +BAMUM LETTER PHASE B SAKEUAE, 92279 +BAMUM LETTER PHASE B TAAM, 92280 +BAMUM LETTER PHASE B MEUQ, 92281 +BAMUM LETTER PHASE B NGGUOQ, 92282 +BAMUM LETTER PHASE B NGGUOQ LARGE, 92283 +BAMUM LETTER PHASE B MFIYAQ, 92284 +BAMUM LETTER PHASE B SUE, 92285 +BAMUM LETTER PHASE B MBEURI, 92286 +BAMUM LETTER PHASE B MONTIEEN, 92287 +BAMUM LETTER PHASE B NYAEMAE, 92288 +BAMUM LETTER PHASE B PUNGAAM, 92289 +BAMUM LETTER PHASE B MEUT NGGEET, 92290 +BAMUM LETTER PHASE B FEUX, 92291 +BAMUM LETTER PHASE B MBUOQ, 92292 +BAMUM LETTER PHASE B FEE, 92293 +BAMUM LETTER PHASE B KEUAEM, 92294 +BAMUM LETTER PHASE B MA NJEUAENA, 92295 +BAMUM LETTER PHASE B MA NJUQA, 92296 +BAMUM LETTER PHASE B LET, 92297 +BAMUM LETTER PHASE B NGGAAM, 92298 +BAMUM LETTER PHASE B NSEN, 92299 +BAMUM LETTER PHASE B MA, 92300 +BAMUM LETTER PHASE B KIQ, 92301 +BAMUM LETTER PHASE B NGOM, 92302 +BAMUM LETTER PHASE C NGKUE MAEMBA, 92303 +BAMUM LETTER PHASE C NZA, 92304 +BAMUM LETTER PHASE C YUM, 92305 +BAMUM LETTER PHASE C WANGKUOQ, 92306 +BAMUM LETTER PHASE C NGGEN, 92307 +BAMUM LETTER PHASE C NDEUAEREE, 92308 +BAMUM LETTER PHASE C NGKAQ, 92309 +BAMUM LETTER PHASE C GHARAE, 92310 +BAMUM LETTER PHASE C MBEEKEET, 92311 +BAMUM LETTER PHASE C GBAYI, 92312 +BAMUM LETTER PHASE C NYIR MKPARAQ MEUN, 92313 +BAMUM LETTER PHASE C NTU MBIT, 92314 +BAMUM LETTER PHASE C MBEUM, 92315 +BAMUM LETTER PHASE C PIRIEEN, 92316 +BAMUM LETTER PHASE C NDOMBU, 92317 +BAMUM LETTER PHASE C MBAA CABBAGE TREE, 92318 +BAMUM LETTER PHASE C KEUSHEUAEP, 92319 +BAMUM LETTER PHASE C GHAP, 92320 +BAMUM LETTER PHASE C KEUKAQ, 92321 +BAMUM LETTER PHASE C YU MUOMAE, 92322 +BAMUM LETTER PHASE C NZEUM, 92323 +BAMUM LETTER PHASE C MBUE, 92324 +BAMUM LETTER PHASE C NSEUAEN, 92325 +BAMUM LETTER PHASE C MBIT, 92326 +BAMUM LETTER PHASE C YEUQ, 92327 +BAMUM LETTER PHASE C KPARAQ, 92328 +BAMUM LETTER PHASE C KAA, 92329 +BAMUM LETTER PHASE C SEUX, 92330 +BAMUM LETTER PHASE C NDIDA, 92331 +BAMUM LETTER PHASE C TAASHAE, 92332 +BAMUM LETTER PHASE C NJUEQ, 92333 +BAMUM LETTER PHASE C TITA YUE, 92334 +BAMUM LETTER PHASE C SUAET, 92335 +BAMUM LETTER PHASE C NGGUAEN NYAM, 92336 +BAMUM LETTER PHASE C VEUX, 92337 +BAMUM LETTER PHASE C NANSANAQ, 92338 +BAMUM LETTER PHASE C MA KEUAERI, 92339 +BAMUM LETTER PHASE C NTAA, 92340 +BAMUM LETTER PHASE C NGGUON, 92341 +BAMUM LETTER PHASE C LAP, 92342 +BAMUM LETTER PHASE C MBIRIEEN, 92343 +BAMUM LETTER PHASE C MGBASAQ, 92344 +BAMUM LETTER PHASE C NTEUNGBA, 92345 +BAMUM LETTER PHASE C TEUTEUX, 92346 +BAMUM LETTER PHASE C NGGUM, 92347 +BAMUM LETTER PHASE C FUE, 92348 +BAMUM LETTER PHASE C NDEUT, 92349 +BAMUM LETTER PHASE C NSA, 92350 +BAMUM LETTER PHASE C NSHAQ, 92351 +BAMUM LETTER PHASE C BUNG, 92352 +BAMUM LETTER PHASE C VEUAEPEN, 92353 +BAMUM LETTER PHASE C MBERAE, 92354 +BAMUM LETTER PHASE C RU, 92355 +BAMUM LETTER PHASE C NJAEM, 92356 +BAMUM LETTER PHASE C LAM, 92357 +BAMUM LETTER PHASE C TITUAEP, 92358 +BAMUM LETTER PHASE C NSUOT NGOM, 92359 +BAMUM LETTER PHASE C NJEEEE, 92360 +BAMUM LETTER PHASE C KET, 92361 +BAMUM LETTER PHASE C NGGU, 92362 +BAMUM LETTER PHASE C MAESI, 92363 +BAMUM LETTER PHASE C MBUAEM, 92364 +BAMUM LETTER PHASE C LU, 92365 +BAMUM LETTER PHASE C KUT, 92366 +BAMUM LETTER PHASE C NJAM, 92367 +BAMUM LETTER PHASE C NGOM, 92368 +BAMUM LETTER PHASE C WUP, 92369 +BAMUM LETTER PHASE C NGGUEET, 92370 +BAMUM LETTER PHASE C NSOM, 92371 +BAMUM LETTER PHASE C NTEN, 92372 +BAMUM LETTER PHASE C KUOP NKAARAE, 92373 +BAMUM LETTER PHASE C NSUN, 92374 +BAMUM LETTER PHASE C NDAM, 92375 +BAMUM LETTER PHASE C MA NSIEE, 92376 +BAMUM LETTER PHASE C YAA, 92377 +BAMUM LETTER PHASE C NDAP, 92378 +BAMUM LETTER PHASE C SHUEQ, 92379 +BAMUM LETTER PHASE C SETFON, 92380 +BAMUM LETTER PHASE C MBI, 92381 +BAMUM LETTER PHASE C MAEMBA, 92382 +BAMUM LETTER PHASE C MBANYI, 92383 +BAMUM LETTER PHASE C KEUSEUX, 92384 +BAMUM LETTER PHASE C MBEUX, 92385 +BAMUM LETTER PHASE C KEUM, 92386 +BAMUM LETTER PHASE C MBAA PICKET, 92387 +BAMUM LETTER PHASE C YUWOQ, 92388 +BAMUM LETTER PHASE C NJEUX, 92389 +BAMUM LETTER PHASE C MIEE, 92390 +BAMUM LETTER PHASE C MUAE, 92391 +BAMUM LETTER PHASE C SHIQ, 92392 +BAMUM LETTER PHASE C KEN LAW, 92393 +BAMUM LETTER PHASE C KEN FATIGUE, 92394 +BAMUM LETTER PHASE C NGAQ, 92395 +BAMUM LETTER PHASE C NAQ, 92396 +BAMUM LETTER PHASE C LIQ, 92397 +BAMUM LETTER PHASE C PIN, 92398 +BAMUM LETTER PHASE C PEN, 92399 +BAMUM LETTER PHASE C TET, 92400 +BAMUM LETTER PHASE D MBUO, 92401 +BAMUM LETTER PHASE D WAP, 92402 +BAMUM LETTER PHASE D NJI, 92403 +BAMUM LETTER PHASE D MFON, 92404 +BAMUM LETTER PHASE D NJIEE, 92405 +BAMUM LETTER PHASE D LIEE, 92406 +BAMUM LETTER PHASE D NJEUT, 92407 +BAMUM LETTER PHASE D NSHEE, 92408 +BAMUM LETTER PHASE D NGGAAMAE, 92409 +BAMUM LETTER PHASE D NYAM, 92410 +BAMUM LETTER PHASE D WUAEN, 92411 +BAMUM LETTER PHASE D NGKUN, 92412 +BAMUM LETTER PHASE D SHEE, 92413 +BAMUM LETTER PHASE D NGKAP, 92414 +BAMUM LETTER PHASE D KEUAETMEUN, 92415 +BAMUM LETTER PHASE D TEUT, 92416 +BAMUM LETTER PHASE D SHEUAE, 92417 +BAMUM LETTER PHASE D NJAP, 92418 +BAMUM LETTER PHASE D SUE, 92419 +BAMUM LETTER PHASE D KET, 92420 +BAMUM LETTER PHASE D YAEMMAE, 92421 +BAMUM LETTER PHASE D KUOM, 92422 +BAMUM LETTER PHASE D SAP, 92423 +BAMUM LETTER PHASE D MFEUT, 92424 +BAMUM LETTER PHASE D NDEUX, 92425 +BAMUM LETTER PHASE D MALEERI, 92426 +BAMUM LETTER PHASE D MEUT, 92427 +BAMUM LETTER PHASE D SEUAEQ, 92428 +BAMUM LETTER PHASE D YEN, 92429 +BAMUM LETTER PHASE D NJEUAEM, 92430 +BAMUM LETTER PHASE D KEUOT MBUAE, 92431 +BAMUM LETTER PHASE D NGKEURI, 92432 +BAMUM LETTER PHASE D TU, 92433 +BAMUM LETTER PHASE D GHAA, 92434 +BAMUM LETTER PHASE D NGKYEE, 92435 +BAMUM LETTER PHASE D FEUFEUAET, 92436 +BAMUM LETTER PHASE D NDEE, 92437 +BAMUM LETTER PHASE D MGBOFUM, 92438 +BAMUM LETTER PHASE D LEUAEP, 92439 +BAMUM LETTER PHASE D NDON, 92440 +BAMUM LETTER PHASE D MONI, 92441 +BAMUM LETTER PHASE D MGBEUN, 92442 +BAMUM LETTER PHASE D PUUT, 92443 +BAMUM LETTER PHASE D MGBIEE, 92444 +BAMUM LETTER PHASE D MFO, 92445 +BAMUM LETTER PHASE D LUM, 92446 +BAMUM LETTER PHASE D NSIEEP, 92447 +BAMUM LETTER PHASE D MBAA, 92448 +BAMUM LETTER PHASE D KWAET, 92449 +BAMUM LETTER PHASE D NYET, 92450 +BAMUM LETTER PHASE D TEUAEN, 92451 +BAMUM LETTER PHASE D SOT, 92452 +BAMUM LETTER PHASE D YUWOQ, 92453 +BAMUM LETTER PHASE D KEUM, 92454 +BAMUM LETTER PHASE D RAEM, 92455 +BAMUM LETTER PHASE D TEEEE, 92456 +BAMUM LETTER PHASE D NGKEUAEQ, 92457 +BAMUM LETTER PHASE D MFEUAE, 92458 +BAMUM LETTER PHASE D NSIEET, 92459 +BAMUM LETTER PHASE D KEUP, 92460 +BAMUM LETTER PHASE D PIP, 92461 +BAMUM LETTER PHASE D PEUTAE, 92462 +BAMUM LETTER PHASE D NYUE, 92463 +BAMUM LETTER PHASE D LET, 92464 +BAMUM LETTER PHASE D NGGAAM, 92465 +BAMUM LETTER PHASE D MFIEE, 92466 +BAMUM LETTER PHASE D NGGWAEN, 92467 +BAMUM LETTER PHASE D YUOM, 92468 +BAMUM LETTER PHASE D PAP, 92469 +BAMUM LETTER PHASE D YUOP, 92470 +BAMUM LETTER PHASE D NDAM, 92471 +BAMUM LETTER PHASE D NTEUM, 92472 +BAMUM LETTER PHASE D SUAE, 92473 +BAMUM LETTER PHASE D KUN, 92474 +BAMUM LETTER PHASE D NGGEUX, 92475 +BAMUM LETTER PHASE D NGKIEE, 92476 +BAMUM LETTER PHASE D TUOT, 92477 +BAMUM LETTER PHASE D MEUN, 92478 +BAMUM LETTER PHASE D KUQ, 92479 +BAMUM LETTER PHASE D NSUM, 92480 +BAMUM LETTER PHASE D TEUN, 92481 +BAMUM LETTER PHASE D MAENJET, 92482 +BAMUM LETTER PHASE D NGGAP, 92483 +BAMUM LETTER PHASE D LEUM, 92484 +BAMUM LETTER PHASE D NGGUOM, 92485 +BAMUM LETTER PHASE D NSHUT, 92486 +BAMUM LETTER PHASE D NJUEQ, 92487 +BAMUM LETTER PHASE D GHEUAE, 92488 +BAMUM LETTER PHASE D KU, 92489 +BAMUM LETTER PHASE D REN OLD, 92490 +BAMUM LETTER PHASE D TAE, 92491 +BAMUM LETTER PHASE D TOQ, 92492 +BAMUM LETTER PHASE D NYI, 92493 +BAMUM LETTER PHASE D RII, 92494 +BAMUM LETTER PHASE D LEEEE, 92495 +BAMUM LETTER PHASE D MEEEE, 92496 +BAMUM LETTER PHASE D M, 92497 +BAMUM LETTER PHASE D SUU, 92498 +BAMUM LETTER PHASE D MU, 92499 +BAMUM LETTER PHASE D SHII, 92500 +BAMUM LETTER PHASE D SHEUX, 92501 +BAMUM LETTER PHASE D KYEE, 92502 +BAMUM LETTER PHASE D NU, 92503 +BAMUM LETTER PHASE D SHU, 92504 +BAMUM LETTER PHASE D NTEE, 92505 +BAMUM LETTER PHASE D PEE, 92506 +BAMUM LETTER PHASE D NI, 92507 +BAMUM LETTER PHASE D SHOQ, 92508 +BAMUM LETTER PHASE D PUQ, 92509 +BAMUM LETTER PHASE D MVOP, 92510 +BAMUM LETTER PHASE D LOQ, 92511 +BAMUM LETTER PHASE D REN MUCH, 92512 +BAMUM LETTER PHASE D TI, 92513 +BAMUM LETTER PHASE D NTUU, 92514 +BAMUM LETTER PHASE D MBAA SEVEN, 92515 +BAMUM LETTER PHASE D SAQ, 92516 +BAMUM LETTER PHASE D FAA, 92517 +BAMUM LETTER PHASE E NDAP, 92518 +BAMUM LETTER PHASE E TOON, 92519 +BAMUM LETTER PHASE E MBEUM, 92520 +BAMUM LETTER PHASE E LAP, 92521 +BAMUM LETTER PHASE E VOM, 92522 +BAMUM LETTER PHASE E LOON, 92523 +BAMUM LETTER PHASE E PAA, 92524 +BAMUM LETTER PHASE E SOM, 92525 +BAMUM LETTER PHASE E RAQ, 92526 +BAMUM LETTER PHASE E NSHUOP, 92527 +BAMUM LETTER PHASE E NDUN, 92528 +BAMUM LETTER PHASE E PUAE, 92529 +BAMUM LETTER PHASE E TAM, 92530 +BAMUM LETTER PHASE E NGKA, 92531 +BAMUM LETTER PHASE E KPEUX, 92532 +BAMUM LETTER PHASE E WUO, 92533 +BAMUM LETTER PHASE E SEE, 92534 +BAMUM LETTER PHASE E NGGEUAET, 92535 +BAMUM LETTER PHASE E PAAM, 92536 +BAMUM LETTER PHASE E TOO, 92537 +BAMUM LETTER PHASE E KUOP, 92538 +BAMUM LETTER PHASE E LOM, 92539 +BAMUM LETTER PHASE E NSHIEE, 92540 +BAMUM LETTER PHASE E NGOP, 92541 +BAMUM LETTER PHASE E MAEM, 92542 +BAMUM LETTER PHASE E NGKEUX, 92543 +BAMUM LETTER PHASE E NGOQ, 92544 +BAMUM LETTER PHASE E NSHUE, 92545 +BAMUM LETTER PHASE E RIMGBA, 92546 +BAMUM LETTER PHASE E NJEUX, 92547 +BAMUM LETTER PHASE E PEEM, 92548 +BAMUM LETTER PHASE E SAA, 92549 +BAMUM LETTER PHASE E NGGURAE, 92550 +BAMUM LETTER PHASE E MGBA, 92551 +BAMUM LETTER PHASE E GHEUX, 92552 +BAMUM LETTER PHASE E NGKEUAEM, 92553 +BAMUM LETTER PHASE E NJAEMLI, 92554 +BAMUM LETTER PHASE E MAP, 92555 +BAMUM LETTER PHASE E LOOT, 92556 +BAMUM LETTER PHASE E NGGEEEE, 92557 +BAMUM LETTER PHASE E NDIQ, 92558 +BAMUM LETTER PHASE E TAEN NTEUM, 92559 +BAMUM LETTER PHASE E SET, 92560 +BAMUM LETTER PHASE E PUM, 92561 +BAMUM LETTER PHASE E NDAA SOFTNESS, 92562 +BAMUM LETTER PHASE E NGGUAESHAE NYAM, 92563 +BAMUM LETTER PHASE E YIEE, 92564 +BAMUM LETTER PHASE E GHEUN, 92565 +BAMUM LETTER PHASE E TUAE, 92566 +BAMUM LETTER PHASE E YEUAE, 92567 +BAMUM LETTER PHASE E PO, 92568 +BAMUM LETTER PHASE E TUMAE, 92569 +BAMUM LETTER PHASE E KEUAE, 92570 +BAMUM LETTER PHASE E SUAEN, 92571 +BAMUM LETTER PHASE E TEUAEQ, 92572 +BAMUM LETTER PHASE E VEUAE, 92573 +BAMUM LETTER PHASE E WEUX, 92574 +BAMUM LETTER PHASE E LAAM, 92575 +BAMUM LETTER PHASE E PU, 92576 +BAMUM LETTER PHASE E TAAQ, 92577 +BAMUM LETTER PHASE E GHAAMAE, 92578 +BAMUM LETTER PHASE E NGEUREUT, 92579 +BAMUM LETTER PHASE E SHEUAEQ, 92580 +BAMUM LETTER PHASE E MGBEN, 92581 +BAMUM LETTER PHASE E MBEE, 92582 +BAMUM LETTER PHASE E NZAQ, 92583 +BAMUM LETTER PHASE E NKOM, 92584 +BAMUM LETTER PHASE E GBET, 92585 +BAMUM LETTER PHASE E TUM, 92586 +BAMUM LETTER PHASE E KUET, 92587 +BAMUM LETTER PHASE E YAP, 92588 +BAMUM LETTER PHASE E NYI CLEAVER, 92589 +BAMUM LETTER PHASE E YIT, 92590 +BAMUM LETTER PHASE E MFEUQ, 92591 +BAMUM LETTER PHASE E NDIAQ, 92592 +BAMUM LETTER PHASE E PIEEQ, 92593 +BAMUM LETTER PHASE E YUEQ, 92594 +BAMUM LETTER PHASE E LEUAEM, 92595 +BAMUM LETTER PHASE E FUE, 92596 +BAMUM LETTER PHASE E GBEUX, 92597 +BAMUM LETTER PHASE E NGKUP, 92598 +BAMUM LETTER PHASE E KET, 92599 +BAMUM LETTER PHASE E MAE, 92600 +BAMUM LETTER PHASE E NGKAAMI, 92601 +BAMUM LETTER PHASE E GHET, 92602 +BAMUM LETTER PHASE E FA, 92603 +BAMUM LETTER PHASE E NTUM, 92604 +BAMUM LETTER PHASE E PEUT, 92605 +BAMUM LETTER PHASE E YEUM, 92606 +BAMUM LETTER PHASE E NGGEUAE, 92607 +BAMUM LETTER PHASE E NYI BETWEEN, 92608 +BAMUM LETTER PHASE E NZUQ, 92609 +BAMUM LETTER PHASE E POON, 92610 +BAMUM LETTER PHASE E MIEE, 92611 +BAMUM LETTER PHASE E FUET, 92612 +BAMUM LETTER PHASE E NAE, 92613 +BAMUM LETTER PHASE E MUAE, 92614 +BAMUM LETTER PHASE E GHEUAE, 92615 +BAMUM LETTER PHASE E FU I, 92616 +BAMUM LETTER PHASE E MVI, 92617 +BAMUM LETTER PHASE E PUAQ, 92618 +BAMUM LETTER PHASE E NGKUM, 92619 +BAMUM LETTER PHASE E KUT, 92620 +BAMUM LETTER PHASE E PIET, 92621 +BAMUM LETTER PHASE E NTAP, 92622 +BAMUM LETTER PHASE E YEUAET, 92623 +BAMUM LETTER PHASE E NGGUP, 92624 +BAMUM LETTER PHASE E PA PEOPLE, 92625 +BAMUM LETTER PHASE E FU CALL, 92626 +BAMUM LETTER PHASE E FOM, 92627 +BAMUM LETTER PHASE E NJEE, 92628 +BAMUM LETTER PHASE E A, 92629 +BAMUM LETTER PHASE E TOQ, 92630 +BAMUM LETTER PHASE E O, 92631 +BAMUM LETTER PHASE E I, 92632 +BAMUM LETTER PHASE E LAQ, 92633 +BAMUM LETTER PHASE E PA PLURAL, 92634 +BAMUM LETTER PHASE E TAA, 92635 +BAMUM LETTER PHASE E TAQ, 92636 +BAMUM LETTER PHASE E NDAA MY HOUSE, 92637 +BAMUM LETTER PHASE E SHIQ, 92638 +BAMUM LETTER PHASE E YEUX, 92639 +BAMUM LETTER PHASE E NGUAE, 92640 +BAMUM LETTER PHASE E YUAEN, 92641 +BAMUM LETTER PHASE E YOQ SWIMMING, 92642 +BAMUM LETTER PHASE E YOQ COVER, 92643 +BAMUM LETTER PHASE E YUQ, 92644 +BAMUM LETTER PHASE E YUN, 92645 +BAMUM LETTER PHASE E KEUX, 92646 +BAMUM LETTER PHASE E PEUX, 92647 +BAMUM LETTER PHASE E NJEE EPOCH, 92648 +BAMUM LETTER PHASE E PUE, 92649 +BAMUM LETTER PHASE E WUE, 92650 +BAMUM LETTER PHASE E FEE, 92651 +BAMUM LETTER PHASE E VEE, 92652 +BAMUM LETTER PHASE E LU, 92653 +BAMUM LETTER PHASE E MI, 92654 +BAMUM LETTER PHASE E REUX, 92655 +BAMUM LETTER PHASE E RAE, 92656 +BAMUM LETTER PHASE E NGUAET, 92657 +BAMUM LETTER PHASE E NGA, 92658 +BAMUM LETTER PHASE E SHO, 92659 +BAMUM LETTER PHASE E SHOQ, 92660 +BAMUM LETTER PHASE E FU REMEDY, 92661 +BAMUM LETTER PHASE E NA, 92662 +BAMUM LETTER PHASE E PI, 92663 +BAMUM LETTER PHASE E LOQ, 92664 +BAMUM LETTER PHASE E KO, 92665 +BAMUM LETTER PHASE E MEN, 92666 +BAMUM LETTER PHASE E MA, 92667 +BAMUM LETTER PHASE E MAQ, 92668 +BAMUM LETTER PHASE E TEU, 92669 +BAMUM LETTER PHASE E KI, 92670 +BAMUM LETTER PHASE E MON, 92671 +BAMUM LETTER PHASE E TEN, 92672 +BAMUM LETTER PHASE E FAQ, 92673 +BAMUM LETTER PHASE E GHOM, 92674 +BAMUM LETTER PHASE F KA, 92675 +BAMUM LETTER PHASE F U, 92676 +BAMUM LETTER PHASE F KU, 92677 +BAMUM LETTER PHASE F EE, 92678 +BAMUM LETTER PHASE F REE, 92679 +BAMUM LETTER PHASE F TAE, 92680 +BAMUM LETTER PHASE F NYI, 92681 +BAMUM LETTER PHASE F LA, 92682 +BAMUM LETTER PHASE F RII, 92683 +BAMUM LETTER PHASE F RIEE, 92684 +BAMUM LETTER PHASE F MEEEE, 92685 +BAMUM LETTER PHASE F TAA, 92686 +BAMUM LETTER PHASE F NDAA, 92687 +BAMUM LETTER PHASE F NJAEM, 92688 +BAMUM LETTER PHASE F M, 92689 +BAMUM LETTER PHASE F SUU, 92690 +BAMUM LETTER PHASE F SHII, 92691 +BAMUM LETTER PHASE F SI, 92692 +BAMUM LETTER PHASE F SEUX, 92693 +BAMUM LETTER PHASE F KYEE, 92694 +BAMUM LETTER PHASE F KET, 92695 +BAMUM LETTER PHASE F NUAE, 92696 +BAMUM LETTER PHASE F NU, 92697 +BAMUM LETTER PHASE F NJUAE, 92698 +BAMUM LETTER PHASE F YOQ, 92699 +BAMUM LETTER PHASE F SHU, 92700 +BAMUM LETTER PHASE F YA, 92701 +BAMUM LETTER PHASE F NSHA, 92702 +BAMUM LETTER PHASE F PEUX, 92703 +BAMUM LETTER PHASE F NTEE, 92704 +BAMUM LETTER PHASE F WUE, 92705 +BAMUM LETTER PHASE F PEE, 92706 +BAMUM LETTER PHASE F RU, 92707 +BAMUM LETTER PHASE F NI, 92708 +BAMUM LETTER PHASE F REUX, 92709 +BAMUM LETTER PHASE F KEN, 92710 +BAMUM LETTER PHASE F NGKWAEN, 92711 +BAMUM LETTER PHASE F NGGA, 92712 +BAMUM LETTER PHASE F SHO, 92713 +BAMUM LETTER PHASE F PUAE, 92714 +BAMUM LETTER PHASE F FOM, 92715 +BAMUM LETTER PHASE F WA, 92716 +BAMUM LETTER PHASE F LI, 92717 +BAMUM LETTER PHASE F LOQ, 92718 +BAMUM LETTER PHASE F KO, 92719 +BAMUM LETTER PHASE F MBEN, 92720 +BAMUM LETTER PHASE F REN, 92721 +BAMUM LETTER PHASE F MA, 92722 +BAMUM LETTER PHASE F MO, 92723 +BAMUM LETTER PHASE F MBAA, 92724 +BAMUM LETTER PHASE F TET, 92725 +BAMUM LETTER PHASE F KPA, 92726 +BAMUM LETTER PHASE F SAMBA, 92727 +BAMUM LETTER PHASE F VUEQ, 92728 +MRO LETTER TA, 92736 +MRO LETTER NGI, 92737 +MRO LETTER YO, 92738 +MRO LETTER MIM, 92739 +MRO LETTER BA, 92740 +MRO LETTER DA, 92741 +MRO LETTER A, 92742 +MRO LETTER PHI, 92743 +MRO LETTER KHAI, 92744 +MRO LETTER HAO, 92745 +MRO LETTER DAI, 92746 +MRO LETTER CHU, 92747 +MRO LETTER KEAAE, 92748 +MRO LETTER OL, 92749 +MRO LETTER MAEM, 92750 +MRO LETTER NIN, 92751 +MRO LETTER PA, 92752 +MRO LETTER OO, 92753 +MRO LETTER O, 92754 +MRO LETTER RO, 92755 +MRO LETTER SHI, 92756 +MRO LETTER THEA, 92757 +MRO LETTER EA, 92758 +MRO LETTER WA, 92759 +MRO LETTER E, 92760 +MRO LETTER KO, 92761 +MRO LETTER LAN, 92762 +MRO LETTER LA, 92763 +MRO LETTER HAI, 92764 +MRO LETTER RI, 92765 +MRO LETTER TEK, 92766 +MRO DIGIT ZERO, 92768 +MRO DIGIT ONE, 92769 +MRO DIGIT TWO, 92770 +MRO DIGIT THREE, 92771 +MRO DIGIT FOUR, 92772 +MRO DIGIT FIVE, 92773 +MRO DIGIT SIX, 92774 +MRO DIGIT SEVEN, 92775 +MRO DIGIT EIGHT, 92776 +MRO DIGIT NINE, 92777 +MRO DANDA, 92782 +MRO DOUBLE DANDA, 92783 +BASSA VAH LETTER ENNI, 92880 +BASSA VAH LETTER KA, 92881 +BASSA VAH LETTER SE, 92882 +BASSA VAH LETTER FA, 92883 +BASSA VAH LETTER MBE, 92884 +BASSA VAH LETTER YIE, 92885 +BASSA VAH LETTER GAH, 92886 +BASSA VAH LETTER DHII, 92887 +BASSA VAH LETTER KPAH, 92888 +BASSA VAH LETTER JO, 92889 +BASSA VAH LETTER HWAH, 92890 +BASSA VAH LETTER WA, 92891 +BASSA VAH LETTER ZO, 92892 +BASSA VAH LETTER GBU, 92893 +BASSA VAH LETTER DO, 92894 +BASSA VAH LETTER CE, 92895 +BASSA VAH LETTER UWU, 92896 +BASSA VAH LETTER TO, 92897 +BASSA VAH LETTER BA, 92898 +BASSA VAH LETTER VU, 92899 +BASSA VAH LETTER YEIN, 92900 +BASSA VAH LETTER PA, 92901 +BASSA VAH LETTER WADDA, 92902 +BASSA VAH LETTER A, 92903 +BASSA VAH LETTER O, 92904 +BASSA VAH LETTER OO, 92905 +BASSA VAH LETTER U, 92906 +BASSA VAH LETTER EE, 92907 +BASSA VAH LETTER E, 92908 +BASSA VAH LETTER I, 92909 +BASSA VAH COMBINING HIGH TONE, 92912 +BASSA VAH COMBINING LOW TONE, 92913 +BASSA VAH COMBINING MID TONE, 92914 +BASSA VAH COMBINING LOW MID TONE, 92915 +BASSA VAH COMBINING HIGH LOW TONE, 92916 +BASSA VAH FULL STOP, 92917 +PAHAWH HMONG VOWEL KEEB, 92928 +PAHAWH HMONG VOWEL KEEV, 92929 +PAHAWH HMONG VOWEL KIB, 92930 +PAHAWH HMONG VOWEL KIV, 92931 +PAHAWH HMONG VOWEL KAUB, 92932 +PAHAWH HMONG VOWEL KAUV, 92933 +PAHAWH HMONG VOWEL KUB, 92934 +PAHAWH HMONG VOWEL KUV, 92935 +PAHAWH HMONG VOWEL KEB, 92936 +PAHAWH HMONG VOWEL KEV, 92937 +PAHAWH HMONG VOWEL KAIB, 92938 +PAHAWH HMONG VOWEL KAIV, 92939 +PAHAWH HMONG VOWEL KOOB, 92940 +PAHAWH HMONG VOWEL KOOV, 92941 +PAHAWH HMONG VOWEL KAWB, 92942 +PAHAWH HMONG VOWEL KAWV, 92943 +PAHAWH HMONG VOWEL KUAB, 92944 +PAHAWH HMONG VOWEL KUAV, 92945 +PAHAWH HMONG VOWEL KOB, 92946 +PAHAWH HMONG VOWEL KOV, 92947 +PAHAWH HMONG VOWEL KIAB, 92948 +PAHAWH HMONG VOWEL KIAV, 92949 +PAHAWH HMONG VOWEL KAB, 92950 +PAHAWH HMONG VOWEL KAV, 92951 +PAHAWH HMONG VOWEL KWB, 92952 +PAHAWH HMONG VOWEL KWV, 92953 +PAHAWH HMONG VOWEL KAAB, 92954 +PAHAWH HMONG VOWEL KAAV, 92955 +PAHAWH HMONG CONSONANT VAU, 92956 +PAHAWH HMONG CONSONANT NTSAU, 92957 +PAHAWH HMONG CONSONANT LAU, 92958 +PAHAWH HMONG CONSONANT HAU, 92959 +PAHAWH HMONG CONSONANT NLAU, 92960 +PAHAWH HMONG CONSONANT RAU, 92961 +PAHAWH HMONG CONSONANT NKAU, 92962 +PAHAWH HMONG CONSONANT QHAU, 92963 +PAHAWH HMONG CONSONANT YAU, 92964 +PAHAWH HMONG CONSONANT HLAU, 92965 +PAHAWH HMONG CONSONANT MAU, 92966 +PAHAWH HMONG CONSONANT CHAU, 92967 +PAHAWH HMONG CONSONANT NCHAU, 92968 +PAHAWH HMONG CONSONANT HNAU, 92969 +PAHAWH HMONG CONSONANT PLHAU, 92970 +PAHAWH HMONG CONSONANT NTHAU, 92971 +PAHAWH HMONG CONSONANT NAU, 92972 +PAHAWH HMONG CONSONANT AU, 92973 +PAHAWH HMONG CONSONANT XAU, 92974 +PAHAWH HMONG CONSONANT CAU, 92975 +PAHAWH HMONG MARK CIM TUB, 92976 +PAHAWH HMONG MARK CIM SO, 92977 +PAHAWH HMONG MARK CIM KES, 92978 +PAHAWH HMONG MARK CIM KHAV, 92979 +PAHAWH HMONG MARK CIM SUAM, 92980 +PAHAWH HMONG MARK CIM HOM, 92981 +PAHAWH HMONG MARK CIM TAUM, 92982 +PAHAWH HMONG SIGN VOS THOM, 92983 +PAHAWH HMONG SIGN VOS TSHAB CEEB, 92984 +PAHAWH HMONG SIGN CIM CHEEM, 92985 +PAHAWH HMONG SIGN VOS THIAB, 92986 +PAHAWH HMONG SIGN VOS FEEM, 92987 +PAHAWH HMONG SIGN XYEEM NTXIV, 92988 +PAHAWH HMONG SIGN XYEEM RHO, 92989 +PAHAWH HMONG SIGN XYEEM TOV, 92990 +PAHAWH HMONG SIGN XYEEM FAIB, 92991 +PAHAWH HMONG SIGN VOS SEEV, 92992 +PAHAWH HMONG SIGN MEEJ SUAB, 92993 +PAHAWH HMONG SIGN VOS NRUA, 92994 +PAHAWH HMONG SIGN IB YAM, 92995 +PAHAWH HMONG SIGN XAUS, 92996 +PAHAWH HMONG SIGN CIM TSOV ROG, 92997 +PAHAWH HMONG DIGIT ZERO, 93008 +PAHAWH HMONG DIGIT ONE, 93009 +PAHAWH HMONG DIGIT TWO, 93010 +PAHAWH HMONG DIGIT THREE, 93011 +PAHAWH HMONG DIGIT FOUR, 93012 +PAHAWH HMONG DIGIT FIVE, 93013 +PAHAWH HMONG DIGIT SIX, 93014 +PAHAWH HMONG DIGIT SEVEN, 93015 +PAHAWH HMONG DIGIT EIGHT, 93016 +PAHAWH HMONG DIGIT NINE, 93017 +PAHAWH HMONG NUMBER TENS, 93019 +PAHAWH HMONG NUMBER HUNDREDS, 93020 +PAHAWH HMONG NUMBER TEN THOUSANDS, 93021 +PAHAWH HMONG NUMBER MILLIONS, 93022 +PAHAWH HMONG NUMBER HUNDRED MILLIONS, 93023 +PAHAWH HMONG NUMBER TEN BILLIONS, 93024 +PAHAWH HMONG NUMBER TRILLIONS, 93025 +PAHAWH HMONG SIGN VOS LUB, 93027 +PAHAWH HMONG SIGN XYOO, 93028 +PAHAWH HMONG SIGN HLI, 93029 +PAHAWH HMONG SIGN THIRD STAGE HLI, 93030 +PAHAWH HMONG SIGN ZWJ THAJ, 93031 +PAHAWH HMONG SIGN HNUB, 93032 +PAHAWH HMONG SIGN NQIG, 93033 +PAHAWH HMONG SIGN XIAB, 93034 +PAHAWH HMONG SIGN NTUJ, 93035 +PAHAWH HMONG SIGN AV, 93036 +PAHAWH HMONG SIGN TXHEEJ CEEV, 93037 +PAHAWH HMONG SIGN MEEJ TSEEB, 93038 +PAHAWH HMONG SIGN TAU, 93039 +PAHAWH HMONG SIGN LOS, 93040 +PAHAWH HMONG SIGN MUS, 93041 +PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG, 93042 +PAHAWH HMONG SIGN CIM CUAM TSHOOJ, 93043 +PAHAWH HMONG SIGN CIM TXWV, 93044 +PAHAWH HMONG SIGN CIM TXWV CHWV, 93045 +PAHAWH HMONG SIGN CIM PUB DAWB, 93046 +PAHAWH HMONG SIGN CIM NRES TOS, 93047 +PAHAWH HMONG CLAN SIGN TSHEEJ, 93053 +PAHAWH HMONG CLAN SIGN YEEG, 93054 +PAHAWH HMONG CLAN SIGN LIS, 93055 +PAHAWH HMONG CLAN SIGN LAUJ, 93056 +PAHAWH HMONG CLAN SIGN XYOOJ, 93057 +PAHAWH HMONG CLAN SIGN KOO, 93058 +PAHAWH HMONG CLAN SIGN HAWJ, 93059 +PAHAWH HMONG CLAN SIGN MUAS, 93060 +PAHAWH HMONG CLAN SIGN THOJ, 93061 +PAHAWH HMONG CLAN SIGN TSAB, 93062 +PAHAWH HMONG CLAN SIGN PHAB, 93063 +PAHAWH HMONG CLAN SIGN KHAB, 93064 +PAHAWH HMONG CLAN SIGN HAM, 93065 +PAHAWH HMONG CLAN SIGN VAJ, 93066 +PAHAWH HMONG CLAN SIGN FAJ, 93067 +PAHAWH HMONG CLAN SIGN YAJ, 93068 +PAHAWH HMONG CLAN SIGN TSWB, 93069 +PAHAWH HMONG CLAN SIGN KWM, 93070 +PAHAWH HMONG CLAN SIGN VWJ, 93071 +MIAO LETTER PA, 93952 +MIAO LETTER BA, 93953 +MIAO LETTER YI PA, 93954 +MIAO LETTER PLA, 93955 +MIAO LETTER MA, 93956 +MIAO LETTER MHA, 93957 +MIAO LETTER ARCHAIC MA, 93958 +MIAO LETTER FA, 93959 +MIAO LETTER VA, 93960 +MIAO LETTER VFA, 93961 +MIAO LETTER TA, 93962 +MIAO LETTER DA, 93963 +MIAO LETTER YI TTA, 93964 +MIAO LETTER YI TA, 93965 +MIAO LETTER TTA, 93966 +MIAO LETTER DDA, 93967 +MIAO LETTER NA, 93968 +MIAO LETTER NHA, 93969 +MIAO LETTER YI NNA, 93970 +MIAO LETTER ARCHAIC NA, 93971 +MIAO LETTER NNA, 93972 +MIAO LETTER NNHA, 93973 +MIAO LETTER LA, 93974 +MIAO LETTER LYA, 93975 +MIAO LETTER LHA, 93976 +MIAO LETTER LHYA, 93977 +MIAO LETTER TLHA, 93978 +MIAO LETTER DLHA, 93979 +MIAO LETTER TLHYA, 93980 +MIAO LETTER DLHYA, 93981 +MIAO LETTER KA, 93982 +MIAO LETTER GA, 93983 +MIAO LETTER YI KA, 93984 +MIAO LETTER QA, 93985 +MIAO LETTER QGA, 93986 +MIAO LETTER NGA, 93987 +MIAO LETTER NGHA, 93988 +MIAO LETTER ARCHAIC NGA, 93989 +MIAO LETTER HA, 93990 +MIAO LETTER XA, 93991 +MIAO LETTER GHA, 93992 +MIAO LETTER GHHA, 93993 +MIAO LETTER TSSA, 93994 +MIAO LETTER DZZA, 93995 +MIAO LETTER NYA, 93996 +MIAO LETTER NYHA, 93997 +MIAO LETTER TSHA, 93998 +MIAO LETTER DZHA, 93999 +MIAO LETTER YI TSHA, 94000 +MIAO LETTER YI DZHA, 94001 +MIAO LETTER REFORMED TSHA, 94002 +MIAO LETTER SHA, 94003 +MIAO LETTER SSA, 94004 +MIAO LETTER ZHA, 94005 +MIAO LETTER ZSHA, 94006 +MIAO LETTER TSA, 94007 +MIAO LETTER DZA, 94008 +MIAO LETTER YI TSA, 94009 +MIAO LETTER SA, 94010 +MIAO LETTER ZA, 94011 +MIAO LETTER ZSA, 94012 +MIAO LETTER ZZA, 94013 +MIAO LETTER ZZSA, 94014 +MIAO LETTER ARCHAIC ZZA, 94015 +MIAO LETTER ZZYA, 94016 +MIAO LETTER ZZSYA, 94017 +MIAO LETTER WA, 94018 +MIAO LETTER AH, 94019 +MIAO LETTER HHA, 94020 +MIAO LETTER NASALIZATION, 94032 +MIAO SIGN ASPIRATION, 94033 +MIAO SIGN REFORMED VOICING, 94034 +MIAO SIGN REFORMED ASPIRATION, 94035 +MIAO VOWEL SIGN A, 94036 +MIAO VOWEL SIGN AA, 94037 +MIAO VOWEL SIGN AHH, 94038 +MIAO VOWEL SIGN AN, 94039 +MIAO VOWEL SIGN ANG, 94040 +MIAO VOWEL SIGN O, 94041 +MIAO VOWEL SIGN OO, 94042 +MIAO VOWEL SIGN WO, 94043 +MIAO VOWEL SIGN W, 94044 +MIAO VOWEL SIGN E, 94045 +MIAO VOWEL SIGN EN, 94046 +MIAO VOWEL SIGN ENG, 94047 +MIAO VOWEL SIGN OEY, 94048 +MIAO VOWEL SIGN I, 94049 +MIAO VOWEL SIGN IA, 94050 +MIAO VOWEL SIGN IAN, 94051 +MIAO VOWEL SIGN IANG, 94052 +MIAO VOWEL SIGN IO, 94053 +MIAO VOWEL SIGN IE, 94054 +MIAO VOWEL SIGN II, 94055 +MIAO VOWEL SIGN IU, 94056 +MIAO VOWEL SIGN ING, 94057 +MIAO VOWEL SIGN U, 94058 +MIAO VOWEL SIGN UA, 94059 +MIAO VOWEL SIGN UAN, 94060 +MIAO VOWEL SIGN UANG, 94061 +MIAO VOWEL SIGN UU, 94062 +MIAO VOWEL SIGN UEI, 94063 +MIAO VOWEL SIGN UNG, 94064 +MIAO VOWEL SIGN Y, 94065 +MIAO VOWEL SIGN YI, 94066 +MIAO VOWEL SIGN AE, 94067 +MIAO VOWEL SIGN AEE, 94068 +MIAO VOWEL SIGN ERR, 94069 +MIAO VOWEL SIGN ROUNDED ERR, 94070 +MIAO VOWEL SIGN ER, 94071 +MIAO VOWEL SIGN ROUNDED ER, 94072 +MIAO VOWEL SIGN AI, 94073 +MIAO VOWEL SIGN EI, 94074 +MIAO VOWEL SIGN AU, 94075 +MIAO VOWEL SIGN OU, 94076 +MIAO VOWEL SIGN N, 94077 +MIAO VOWEL SIGN NG, 94078 +MIAO TONE RIGHT, 94095 +MIAO TONE TOP RIGHT, 94096 +MIAO TONE ABOVE, 94097 +MIAO TONE BELOW, 94098 +MIAO LETTER TONE 2, 94099 +MIAO LETTER TONE 3, 94100 +MIAO LETTER TONE 4, 94101 +MIAO LETTER TONE 5, 94102 +MIAO LETTER TONE 6, 94103 +MIAO LETTER TONE 7, 94104 +MIAO LETTER TONE 8, 94105 +MIAO LETTER REFORMED TONE 1, 94106 +MIAO LETTER REFORMED TONE 2, 94107 +MIAO LETTER REFORMED TONE 4, 94108 +MIAO LETTER REFORMED TONE 5, 94109 +MIAO LETTER REFORMED TONE 6, 94110 +MIAO LETTER REFORMED TONE 8, 94111 +TANGUT ITERATION MARK, 94176 +TANGUT COMPONENT 001, 100352 +TANGUT COMPONENT 002, 100353 +TANGUT COMPONENT 003, 100354 +TANGUT COMPONENT 004, 100355 +TANGUT COMPONENT 005, 100356 +TANGUT COMPONENT 006, 100357 +TANGUT COMPONENT 007, 100358 +TANGUT COMPONENT 008, 100359 +TANGUT COMPONENT 009, 100360 +TANGUT COMPONENT 010, 100361 +TANGUT COMPONENT 011, 100362 +TANGUT COMPONENT 012, 100363 +TANGUT COMPONENT 013, 100364 +TANGUT COMPONENT 014, 100365 +TANGUT COMPONENT 015, 100366 +TANGUT COMPONENT 016, 100367 +TANGUT COMPONENT 017, 100368 +TANGUT COMPONENT 018, 100369 +TANGUT COMPONENT 019, 100370 +TANGUT COMPONENT 020, 100371 +TANGUT COMPONENT 021, 100372 +TANGUT COMPONENT 022, 100373 +TANGUT COMPONENT 023, 100374 +TANGUT COMPONENT 024, 100375 +TANGUT COMPONENT 025, 100376 +TANGUT COMPONENT 026, 100377 +TANGUT COMPONENT 027, 100378 +TANGUT COMPONENT 028, 100379 +TANGUT COMPONENT 029, 100380 +TANGUT COMPONENT 030, 100381 +TANGUT COMPONENT 031, 100382 +TANGUT COMPONENT 032, 100383 +TANGUT COMPONENT 033, 100384 +TANGUT COMPONENT 034, 100385 +TANGUT COMPONENT 035, 100386 +TANGUT COMPONENT 036, 100387 +TANGUT COMPONENT 037, 100388 +TANGUT COMPONENT 038, 100389 +TANGUT COMPONENT 039, 100390 +TANGUT COMPONENT 040, 100391 +TANGUT COMPONENT 041, 100392 +TANGUT COMPONENT 042, 100393 +TANGUT COMPONENT 043, 100394 +TANGUT COMPONENT 044, 100395 +TANGUT COMPONENT 045, 100396 +TANGUT COMPONENT 046, 100397 +TANGUT COMPONENT 047, 100398 +TANGUT COMPONENT 048, 100399 +TANGUT COMPONENT 049, 100400 +TANGUT COMPONENT 050, 100401 +TANGUT COMPONENT 051, 100402 +TANGUT COMPONENT 052, 100403 +TANGUT COMPONENT 053, 100404 +TANGUT COMPONENT 054, 100405 +TANGUT COMPONENT 055, 100406 +TANGUT COMPONENT 056, 100407 +TANGUT COMPONENT 057, 100408 +TANGUT COMPONENT 058, 100409 +TANGUT COMPONENT 059, 100410 +TANGUT COMPONENT 060, 100411 +TANGUT COMPONENT 061, 100412 +TANGUT COMPONENT 062, 100413 +TANGUT COMPONENT 063, 100414 +TANGUT COMPONENT 064, 100415 +TANGUT COMPONENT 065, 100416 +TANGUT COMPONENT 066, 100417 +TANGUT COMPONENT 067, 100418 +TANGUT COMPONENT 068, 100419 +TANGUT COMPONENT 069, 100420 +TANGUT COMPONENT 070, 100421 +TANGUT COMPONENT 071, 100422 +TANGUT COMPONENT 072, 100423 +TANGUT COMPONENT 073, 100424 +TANGUT COMPONENT 074, 100425 +TANGUT COMPONENT 075, 100426 +TANGUT COMPONENT 076, 100427 +TANGUT COMPONENT 077, 100428 +TANGUT COMPONENT 078, 100429 +TANGUT COMPONENT 079, 100430 +TANGUT COMPONENT 080, 100431 +TANGUT COMPONENT 081, 100432 +TANGUT COMPONENT 082, 100433 +TANGUT COMPONENT 083, 100434 +TANGUT COMPONENT 084, 100435 +TANGUT COMPONENT 085, 100436 +TANGUT COMPONENT 086, 100437 +TANGUT COMPONENT 087, 100438 +TANGUT COMPONENT 088, 100439 +TANGUT COMPONENT 089, 100440 +TANGUT COMPONENT 090, 100441 +TANGUT COMPONENT 091, 100442 +TANGUT COMPONENT 092, 100443 +TANGUT COMPONENT 093, 100444 +TANGUT COMPONENT 094, 100445 +TANGUT COMPONENT 095, 100446 +TANGUT COMPONENT 096, 100447 +TANGUT COMPONENT 097, 100448 +TANGUT COMPONENT 098, 100449 +TANGUT COMPONENT 099, 100450 +TANGUT COMPONENT 100, 100451 +TANGUT COMPONENT 101, 100452 +TANGUT COMPONENT 102, 100453 +TANGUT COMPONENT 103, 100454 +TANGUT COMPONENT 104, 100455 +TANGUT COMPONENT 105, 100456 +TANGUT COMPONENT 106, 100457 +TANGUT COMPONENT 107, 100458 +TANGUT COMPONENT 108, 100459 +TANGUT COMPONENT 109, 100460 +TANGUT COMPONENT 110, 100461 +TANGUT COMPONENT 111, 100462 +TANGUT COMPONENT 112, 100463 +TANGUT COMPONENT 113, 100464 +TANGUT COMPONENT 114, 100465 +TANGUT COMPONENT 115, 100466 +TANGUT COMPONENT 116, 100467 +TANGUT COMPONENT 117, 100468 +TANGUT COMPONENT 118, 100469 +TANGUT COMPONENT 119, 100470 +TANGUT COMPONENT 120, 100471 +TANGUT COMPONENT 121, 100472 +TANGUT COMPONENT 122, 100473 +TANGUT COMPONENT 123, 100474 +TANGUT COMPONENT 124, 100475 +TANGUT COMPONENT 125, 100476 +TANGUT COMPONENT 126, 100477 +TANGUT COMPONENT 127, 100478 +TANGUT COMPONENT 128, 100479 +TANGUT COMPONENT 129, 100480 +TANGUT COMPONENT 130, 100481 +TANGUT COMPONENT 131, 100482 +TANGUT COMPONENT 132, 100483 +TANGUT COMPONENT 133, 100484 +TANGUT COMPONENT 134, 100485 +TANGUT COMPONENT 135, 100486 +TANGUT COMPONENT 136, 100487 +TANGUT COMPONENT 137, 100488 +TANGUT COMPONENT 138, 100489 +TANGUT COMPONENT 139, 100490 +TANGUT COMPONENT 140, 100491 +TANGUT COMPONENT 141, 100492 +TANGUT COMPONENT 142, 100493 +TANGUT COMPONENT 143, 100494 +TANGUT COMPONENT 144, 100495 +TANGUT COMPONENT 145, 100496 +TANGUT COMPONENT 146, 100497 +TANGUT COMPONENT 147, 100498 +TANGUT COMPONENT 148, 100499 +TANGUT COMPONENT 149, 100500 +TANGUT COMPONENT 150, 100501 +TANGUT COMPONENT 151, 100502 +TANGUT COMPONENT 152, 100503 +TANGUT COMPONENT 153, 100504 +TANGUT COMPONENT 154, 100505 +TANGUT COMPONENT 155, 100506 +TANGUT COMPONENT 156, 100507 +TANGUT COMPONENT 157, 100508 +TANGUT COMPONENT 158, 100509 +TANGUT COMPONENT 159, 100510 +TANGUT COMPONENT 160, 100511 +TANGUT COMPONENT 161, 100512 +TANGUT COMPONENT 162, 100513 +TANGUT COMPONENT 163, 100514 +TANGUT COMPONENT 164, 100515 +TANGUT COMPONENT 165, 100516 +TANGUT COMPONENT 166, 100517 +TANGUT COMPONENT 167, 100518 +TANGUT COMPONENT 168, 100519 +TANGUT COMPONENT 169, 100520 +TANGUT COMPONENT 170, 100521 +TANGUT COMPONENT 171, 100522 +TANGUT COMPONENT 172, 100523 +TANGUT COMPONENT 173, 100524 +TANGUT COMPONENT 174, 100525 +TANGUT COMPONENT 175, 100526 +TANGUT COMPONENT 176, 100527 +TANGUT COMPONENT 177, 100528 +TANGUT COMPONENT 178, 100529 +TANGUT COMPONENT 179, 100530 +TANGUT COMPONENT 180, 100531 +TANGUT COMPONENT 181, 100532 +TANGUT COMPONENT 182, 100533 +TANGUT COMPONENT 183, 100534 +TANGUT COMPONENT 184, 100535 +TANGUT COMPONENT 185, 100536 +TANGUT COMPONENT 186, 100537 +TANGUT COMPONENT 187, 100538 +TANGUT COMPONENT 188, 100539 +TANGUT COMPONENT 189, 100540 +TANGUT COMPONENT 190, 100541 +TANGUT COMPONENT 191, 100542 +TANGUT COMPONENT 192, 100543 +TANGUT COMPONENT 193, 100544 +TANGUT COMPONENT 194, 100545 +TANGUT COMPONENT 195, 100546 +TANGUT COMPONENT 196, 100547 +TANGUT COMPONENT 197, 100548 +TANGUT COMPONENT 198, 100549 +TANGUT COMPONENT 199, 100550 +TANGUT COMPONENT 200, 100551 +TANGUT COMPONENT 201, 100552 +TANGUT COMPONENT 202, 100553 +TANGUT COMPONENT 203, 100554 +TANGUT COMPONENT 204, 100555 +TANGUT COMPONENT 205, 100556 +TANGUT COMPONENT 206, 100557 +TANGUT COMPONENT 207, 100558 +TANGUT COMPONENT 208, 100559 +TANGUT COMPONENT 209, 100560 +TANGUT COMPONENT 210, 100561 +TANGUT COMPONENT 211, 100562 +TANGUT COMPONENT 212, 100563 +TANGUT COMPONENT 213, 100564 +TANGUT COMPONENT 214, 100565 +TANGUT COMPONENT 215, 100566 +TANGUT COMPONENT 216, 100567 +TANGUT COMPONENT 217, 100568 +TANGUT COMPONENT 218, 100569 +TANGUT COMPONENT 219, 100570 +TANGUT COMPONENT 220, 100571 +TANGUT COMPONENT 221, 100572 +TANGUT COMPONENT 222, 100573 +TANGUT COMPONENT 223, 100574 +TANGUT COMPONENT 224, 100575 +TANGUT COMPONENT 225, 100576 +TANGUT COMPONENT 226, 100577 +TANGUT COMPONENT 227, 100578 +TANGUT COMPONENT 228, 100579 +TANGUT COMPONENT 229, 100580 +TANGUT COMPONENT 230, 100581 +TANGUT COMPONENT 231, 100582 +TANGUT COMPONENT 232, 100583 +TANGUT COMPONENT 233, 100584 +TANGUT COMPONENT 234, 100585 +TANGUT COMPONENT 235, 100586 +TANGUT COMPONENT 236, 100587 +TANGUT COMPONENT 237, 100588 +TANGUT COMPONENT 238, 100589 +TANGUT COMPONENT 239, 100590 +TANGUT COMPONENT 240, 100591 +TANGUT COMPONENT 241, 100592 +TANGUT COMPONENT 242, 100593 +TANGUT COMPONENT 243, 100594 +TANGUT COMPONENT 244, 100595 +TANGUT COMPONENT 245, 100596 +TANGUT COMPONENT 246, 100597 +TANGUT COMPONENT 247, 100598 +TANGUT COMPONENT 248, 100599 +TANGUT COMPONENT 249, 100600 +TANGUT COMPONENT 250, 100601 +TANGUT COMPONENT 251, 100602 +TANGUT COMPONENT 252, 100603 +TANGUT COMPONENT 253, 100604 +TANGUT COMPONENT 254, 100605 +TANGUT COMPONENT 255, 100606 +TANGUT COMPONENT 256, 100607 +TANGUT COMPONENT 257, 100608 +TANGUT COMPONENT 258, 100609 +TANGUT COMPONENT 259, 100610 +TANGUT COMPONENT 260, 100611 +TANGUT COMPONENT 261, 100612 +TANGUT COMPONENT 262, 100613 +TANGUT COMPONENT 263, 100614 +TANGUT COMPONENT 264, 100615 +TANGUT COMPONENT 265, 100616 +TANGUT COMPONENT 266, 100617 +TANGUT COMPONENT 267, 100618 +TANGUT COMPONENT 268, 100619 +TANGUT COMPONENT 269, 100620 +TANGUT COMPONENT 270, 100621 +TANGUT COMPONENT 271, 100622 +TANGUT COMPONENT 272, 100623 +TANGUT COMPONENT 273, 100624 +TANGUT COMPONENT 274, 100625 +TANGUT COMPONENT 275, 100626 +TANGUT COMPONENT 276, 100627 +TANGUT COMPONENT 277, 100628 +TANGUT COMPONENT 278, 100629 +TANGUT COMPONENT 279, 100630 +TANGUT COMPONENT 280, 100631 +TANGUT COMPONENT 281, 100632 +TANGUT COMPONENT 282, 100633 +TANGUT COMPONENT 283, 100634 +TANGUT COMPONENT 284, 100635 +TANGUT COMPONENT 285, 100636 +TANGUT COMPONENT 286, 100637 +TANGUT COMPONENT 287, 100638 +TANGUT COMPONENT 288, 100639 +TANGUT COMPONENT 289, 100640 +TANGUT COMPONENT 290, 100641 +TANGUT COMPONENT 291, 100642 +TANGUT COMPONENT 292, 100643 +TANGUT COMPONENT 293, 100644 +TANGUT COMPONENT 294, 100645 +TANGUT COMPONENT 295, 100646 +TANGUT COMPONENT 296, 100647 +TANGUT COMPONENT 297, 100648 +TANGUT COMPONENT 298, 100649 +TANGUT COMPONENT 299, 100650 +TANGUT COMPONENT 300, 100651 +TANGUT COMPONENT 301, 100652 +TANGUT COMPONENT 302, 100653 +TANGUT COMPONENT 303, 100654 +TANGUT COMPONENT 304, 100655 +TANGUT COMPONENT 305, 100656 +TANGUT COMPONENT 306, 100657 +TANGUT COMPONENT 307, 100658 +TANGUT COMPONENT 308, 100659 +TANGUT COMPONENT 309, 100660 +TANGUT COMPONENT 310, 100661 +TANGUT COMPONENT 311, 100662 +TANGUT COMPONENT 312, 100663 +TANGUT COMPONENT 313, 100664 +TANGUT COMPONENT 314, 100665 +TANGUT COMPONENT 315, 100666 +TANGUT COMPONENT 316, 100667 +TANGUT COMPONENT 317, 100668 +TANGUT COMPONENT 318, 100669 +TANGUT COMPONENT 319, 100670 +TANGUT COMPONENT 320, 100671 +TANGUT COMPONENT 321, 100672 +TANGUT COMPONENT 322, 100673 +TANGUT COMPONENT 323, 100674 +TANGUT COMPONENT 324, 100675 +TANGUT COMPONENT 325, 100676 +TANGUT COMPONENT 326, 100677 +TANGUT COMPONENT 327, 100678 +TANGUT COMPONENT 328, 100679 +TANGUT COMPONENT 329, 100680 +TANGUT COMPONENT 330, 100681 +TANGUT COMPONENT 331, 100682 +TANGUT COMPONENT 332, 100683 +TANGUT COMPONENT 333, 100684 +TANGUT COMPONENT 334, 100685 +TANGUT COMPONENT 335, 100686 +TANGUT COMPONENT 336, 100687 +TANGUT COMPONENT 337, 100688 +TANGUT COMPONENT 338, 100689 +TANGUT COMPONENT 339, 100690 +TANGUT COMPONENT 340, 100691 +TANGUT COMPONENT 341, 100692 +TANGUT COMPONENT 342, 100693 +TANGUT COMPONENT 343, 100694 +TANGUT COMPONENT 344, 100695 +TANGUT COMPONENT 345, 100696 +TANGUT COMPONENT 346, 100697 +TANGUT COMPONENT 347, 100698 +TANGUT COMPONENT 348, 100699 +TANGUT COMPONENT 349, 100700 +TANGUT COMPONENT 350, 100701 +TANGUT COMPONENT 351, 100702 +TANGUT COMPONENT 352, 100703 +TANGUT COMPONENT 353, 100704 +TANGUT COMPONENT 354, 100705 +TANGUT COMPONENT 355, 100706 +TANGUT COMPONENT 356, 100707 +TANGUT COMPONENT 357, 100708 +TANGUT COMPONENT 358, 100709 +TANGUT COMPONENT 359, 100710 +TANGUT COMPONENT 360, 100711 +TANGUT COMPONENT 361, 100712 +TANGUT COMPONENT 362, 100713 +TANGUT COMPONENT 363, 100714 +TANGUT COMPONENT 364, 100715 +TANGUT COMPONENT 365, 100716 +TANGUT COMPONENT 366, 100717 +TANGUT COMPONENT 367, 100718 +TANGUT COMPONENT 368, 100719 +TANGUT COMPONENT 369, 100720 +TANGUT COMPONENT 370, 100721 +TANGUT COMPONENT 371, 100722 +TANGUT COMPONENT 372, 100723 +TANGUT COMPONENT 373, 100724 +TANGUT COMPONENT 374, 100725 +TANGUT COMPONENT 375, 100726 +TANGUT COMPONENT 376, 100727 +TANGUT COMPONENT 377, 100728 +TANGUT COMPONENT 378, 100729 +TANGUT COMPONENT 379, 100730 +TANGUT COMPONENT 380, 100731 +TANGUT COMPONENT 381, 100732 +TANGUT COMPONENT 382, 100733 +TANGUT COMPONENT 383, 100734 +TANGUT COMPONENT 384, 100735 +TANGUT COMPONENT 385, 100736 +TANGUT COMPONENT 386, 100737 +TANGUT COMPONENT 387, 100738 +TANGUT COMPONENT 388, 100739 +TANGUT COMPONENT 389, 100740 +TANGUT COMPONENT 390, 100741 +TANGUT COMPONENT 391, 100742 +TANGUT COMPONENT 392, 100743 +TANGUT COMPONENT 393, 100744 +TANGUT COMPONENT 394, 100745 +TANGUT COMPONENT 395, 100746 +TANGUT COMPONENT 396, 100747 +TANGUT COMPONENT 397, 100748 +TANGUT COMPONENT 398, 100749 +TANGUT COMPONENT 399, 100750 +TANGUT COMPONENT 400, 100751 +TANGUT COMPONENT 401, 100752 +TANGUT COMPONENT 402, 100753 +TANGUT COMPONENT 403, 100754 +TANGUT COMPONENT 404, 100755 +TANGUT COMPONENT 405, 100756 +TANGUT COMPONENT 406, 100757 +TANGUT COMPONENT 407, 100758 +TANGUT COMPONENT 408, 100759 +TANGUT COMPONENT 409, 100760 +TANGUT COMPONENT 410, 100761 +TANGUT COMPONENT 411, 100762 +TANGUT COMPONENT 412, 100763 +TANGUT COMPONENT 413, 100764 +TANGUT COMPONENT 414, 100765 +TANGUT COMPONENT 415, 100766 +TANGUT COMPONENT 416, 100767 +TANGUT COMPONENT 417, 100768 +TANGUT COMPONENT 418, 100769 +TANGUT COMPONENT 419, 100770 +TANGUT COMPONENT 420, 100771 +TANGUT COMPONENT 421, 100772 +TANGUT COMPONENT 422, 100773 +TANGUT COMPONENT 423, 100774 +TANGUT COMPONENT 424, 100775 +TANGUT COMPONENT 425, 100776 +TANGUT COMPONENT 426, 100777 +TANGUT COMPONENT 427, 100778 +TANGUT COMPONENT 428, 100779 +TANGUT COMPONENT 429, 100780 +TANGUT COMPONENT 430, 100781 +TANGUT COMPONENT 431, 100782 +TANGUT COMPONENT 432, 100783 +TANGUT COMPONENT 433, 100784 +TANGUT COMPONENT 434, 100785 +TANGUT COMPONENT 435, 100786 +TANGUT COMPONENT 436, 100787 +TANGUT COMPONENT 437, 100788 +TANGUT COMPONENT 438, 100789 +TANGUT COMPONENT 439, 100790 +TANGUT COMPONENT 440, 100791 +TANGUT COMPONENT 441, 100792 +TANGUT COMPONENT 442, 100793 +TANGUT COMPONENT 443, 100794 +TANGUT COMPONENT 444, 100795 +TANGUT COMPONENT 445, 100796 +TANGUT COMPONENT 446, 100797 +TANGUT COMPONENT 447, 100798 +TANGUT COMPONENT 448, 100799 +TANGUT COMPONENT 449, 100800 +TANGUT COMPONENT 450, 100801 +TANGUT COMPONENT 451, 100802 +TANGUT COMPONENT 452, 100803 +TANGUT COMPONENT 453, 100804 +TANGUT COMPONENT 454, 100805 +TANGUT COMPONENT 455, 100806 +TANGUT COMPONENT 456, 100807 +TANGUT COMPONENT 457, 100808 +TANGUT COMPONENT 458, 100809 +TANGUT COMPONENT 459, 100810 +TANGUT COMPONENT 460, 100811 +TANGUT COMPONENT 461, 100812 +TANGUT COMPONENT 462, 100813 +TANGUT COMPONENT 463, 100814 +TANGUT COMPONENT 464, 100815 +TANGUT COMPONENT 465, 100816 +TANGUT COMPONENT 466, 100817 +TANGUT COMPONENT 467, 100818 +TANGUT COMPONENT 468, 100819 +TANGUT COMPONENT 469, 100820 +TANGUT COMPONENT 470, 100821 +TANGUT COMPONENT 471, 100822 +TANGUT COMPONENT 472, 100823 +TANGUT COMPONENT 473, 100824 +TANGUT COMPONENT 474, 100825 +TANGUT COMPONENT 475, 100826 +TANGUT COMPONENT 476, 100827 +TANGUT COMPONENT 477, 100828 +TANGUT COMPONENT 478, 100829 +TANGUT COMPONENT 479, 100830 +TANGUT COMPONENT 480, 100831 +TANGUT COMPONENT 481, 100832 +TANGUT COMPONENT 482, 100833 +TANGUT COMPONENT 483, 100834 +TANGUT COMPONENT 484, 100835 +TANGUT COMPONENT 485, 100836 +TANGUT COMPONENT 486, 100837 +TANGUT COMPONENT 487, 100838 +TANGUT COMPONENT 488, 100839 +TANGUT COMPONENT 489, 100840 +TANGUT COMPONENT 490, 100841 +TANGUT COMPONENT 491, 100842 +TANGUT COMPONENT 492, 100843 +TANGUT COMPONENT 493, 100844 +TANGUT COMPONENT 494, 100845 +TANGUT COMPONENT 495, 100846 +TANGUT COMPONENT 496, 100847 +TANGUT COMPONENT 497, 100848 +TANGUT COMPONENT 498, 100849 +TANGUT COMPONENT 499, 100850 +TANGUT COMPONENT 500, 100851 +TANGUT COMPONENT 501, 100852 +TANGUT COMPONENT 502, 100853 +TANGUT COMPONENT 503, 100854 +TANGUT COMPONENT 504, 100855 +TANGUT COMPONENT 505, 100856 +TANGUT COMPONENT 506, 100857 +TANGUT COMPONENT 507, 100858 +TANGUT COMPONENT 508, 100859 +TANGUT COMPONENT 509, 100860 +TANGUT COMPONENT 510, 100861 +TANGUT COMPONENT 511, 100862 +TANGUT COMPONENT 512, 100863 +TANGUT COMPONENT 513, 100864 +TANGUT COMPONENT 514, 100865 +TANGUT COMPONENT 515, 100866 +TANGUT COMPONENT 516, 100867 +TANGUT COMPONENT 517, 100868 +TANGUT COMPONENT 518, 100869 +TANGUT COMPONENT 519, 100870 +TANGUT COMPONENT 520, 100871 +TANGUT COMPONENT 521, 100872 +TANGUT COMPONENT 522, 100873 +TANGUT COMPONENT 523, 100874 +TANGUT COMPONENT 524, 100875 +TANGUT COMPONENT 525, 100876 +TANGUT COMPONENT 526, 100877 +TANGUT COMPONENT 527, 100878 +TANGUT COMPONENT 528, 100879 +TANGUT COMPONENT 529, 100880 +TANGUT COMPONENT 530, 100881 +TANGUT COMPONENT 531, 100882 +TANGUT COMPONENT 532, 100883 +TANGUT COMPONENT 533, 100884 +TANGUT COMPONENT 534, 100885 +TANGUT COMPONENT 535, 100886 +TANGUT COMPONENT 536, 100887 +TANGUT COMPONENT 537, 100888 +TANGUT COMPONENT 538, 100889 +TANGUT COMPONENT 539, 100890 +TANGUT COMPONENT 540, 100891 +TANGUT COMPONENT 541, 100892 +TANGUT COMPONENT 542, 100893 +TANGUT COMPONENT 543, 100894 +TANGUT COMPONENT 544, 100895 +TANGUT COMPONENT 545, 100896 +TANGUT COMPONENT 546, 100897 +TANGUT COMPONENT 547, 100898 +TANGUT COMPONENT 548, 100899 +TANGUT COMPONENT 549, 100900 +TANGUT COMPONENT 550, 100901 +TANGUT COMPONENT 551, 100902 +TANGUT COMPONENT 552, 100903 +TANGUT COMPONENT 553, 100904 +TANGUT COMPONENT 554, 100905 +TANGUT COMPONENT 555, 100906 +TANGUT COMPONENT 556, 100907 +TANGUT COMPONENT 557, 100908 +TANGUT COMPONENT 558, 100909 +TANGUT COMPONENT 559, 100910 +TANGUT COMPONENT 560, 100911 +TANGUT COMPONENT 561, 100912 +TANGUT COMPONENT 562, 100913 +TANGUT COMPONENT 563, 100914 +TANGUT COMPONENT 564, 100915 +TANGUT COMPONENT 565, 100916 +TANGUT COMPONENT 566, 100917 +TANGUT COMPONENT 567, 100918 +TANGUT COMPONENT 568, 100919 +TANGUT COMPONENT 569, 100920 +TANGUT COMPONENT 570, 100921 +TANGUT COMPONENT 571, 100922 +TANGUT COMPONENT 572, 100923 +TANGUT COMPONENT 573, 100924 +TANGUT COMPONENT 574, 100925 +TANGUT COMPONENT 575, 100926 +TANGUT COMPONENT 576, 100927 +TANGUT COMPONENT 577, 100928 +TANGUT COMPONENT 578, 100929 +TANGUT COMPONENT 579, 100930 +TANGUT COMPONENT 580, 100931 +TANGUT COMPONENT 581, 100932 +TANGUT COMPONENT 582, 100933 +TANGUT COMPONENT 583, 100934 +TANGUT COMPONENT 584, 100935 +TANGUT COMPONENT 585, 100936 +TANGUT COMPONENT 586, 100937 +TANGUT COMPONENT 587, 100938 +TANGUT COMPONENT 588, 100939 +TANGUT COMPONENT 589, 100940 +TANGUT COMPONENT 590, 100941 +TANGUT COMPONENT 591, 100942 +TANGUT COMPONENT 592, 100943 +TANGUT COMPONENT 593, 100944 +TANGUT COMPONENT 594, 100945 +TANGUT COMPONENT 595, 100946 +TANGUT COMPONENT 596, 100947 +TANGUT COMPONENT 597, 100948 +TANGUT COMPONENT 598, 100949 +TANGUT COMPONENT 599, 100950 +TANGUT COMPONENT 600, 100951 +TANGUT COMPONENT 601, 100952 +TANGUT COMPONENT 602, 100953 +TANGUT COMPONENT 603, 100954 +TANGUT COMPONENT 604, 100955 +TANGUT COMPONENT 605, 100956 +TANGUT COMPONENT 606, 100957 +TANGUT COMPONENT 607, 100958 +TANGUT COMPONENT 608, 100959 +TANGUT COMPONENT 609, 100960 +TANGUT COMPONENT 610, 100961 +TANGUT COMPONENT 611, 100962 +TANGUT COMPONENT 612, 100963 +TANGUT COMPONENT 613, 100964 +TANGUT COMPONENT 614, 100965 +TANGUT COMPONENT 615, 100966 +TANGUT COMPONENT 616, 100967 +TANGUT COMPONENT 617, 100968 +TANGUT COMPONENT 618, 100969 +TANGUT COMPONENT 619, 100970 +TANGUT COMPONENT 620, 100971 +TANGUT COMPONENT 621, 100972 +TANGUT COMPONENT 622, 100973 +TANGUT COMPONENT 623, 100974 +TANGUT COMPONENT 624, 100975 +TANGUT COMPONENT 625, 100976 +TANGUT COMPONENT 626, 100977 +TANGUT COMPONENT 627, 100978 +TANGUT COMPONENT 628, 100979 +TANGUT COMPONENT 629, 100980 +TANGUT COMPONENT 630, 100981 +TANGUT COMPONENT 631, 100982 +TANGUT COMPONENT 632, 100983 +TANGUT COMPONENT 633, 100984 +TANGUT COMPONENT 634, 100985 +TANGUT COMPONENT 635, 100986 +TANGUT COMPONENT 636, 100987 +TANGUT COMPONENT 637, 100988 +TANGUT COMPONENT 638, 100989 +TANGUT COMPONENT 639, 100990 +TANGUT COMPONENT 640, 100991 +TANGUT COMPONENT 641, 100992 +TANGUT COMPONENT 642, 100993 +TANGUT COMPONENT 643, 100994 +TANGUT COMPONENT 644, 100995 +TANGUT COMPONENT 645, 100996 +TANGUT COMPONENT 646, 100997 +TANGUT COMPONENT 647, 100998 +TANGUT COMPONENT 648, 100999 +TANGUT COMPONENT 649, 101000 +TANGUT COMPONENT 650, 101001 +TANGUT COMPONENT 651, 101002 +TANGUT COMPONENT 652, 101003 +TANGUT COMPONENT 653, 101004 +TANGUT COMPONENT 654, 101005 +TANGUT COMPONENT 655, 101006 +TANGUT COMPONENT 656, 101007 +TANGUT COMPONENT 657, 101008 +TANGUT COMPONENT 658, 101009 +TANGUT COMPONENT 659, 101010 +TANGUT COMPONENT 660, 101011 +TANGUT COMPONENT 661, 101012 +TANGUT COMPONENT 662, 101013 +TANGUT COMPONENT 663, 101014 +TANGUT COMPONENT 664, 101015 +TANGUT COMPONENT 665, 101016 +TANGUT COMPONENT 666, 101017 +TANGUT COMPONENT 667, 101018 +TANGUT COMPONENT 668, 101019 +TANGUT COMPONENT 669, 101020 +TANGUT COMPONENT 670, 101021 +TANGUT COMPONENT 671, 101022 +TANGUT COMPONENT 672, 101023 +TANGUT COMPONENT 673, 101024 +TANGUT COMPONENT 674, 101025 +TANGUT COMPONENT 675, 101026 +TANGUT COMPONENT 676, 101027 +TANGUT COMPONENT 677, 101028 +TANGUT COMPONENT 678, 101029 +TANGUT COMPONENT 679, 101030 +TANGUT COMPONENT 680, 101031 +TANGUT COMPONENT 681, 101032 +TANGUT COMPONENT 682, 101033 +TANGUT COMPONENT 683, 101034 +TANGUT COMPONENT 684, 101035 +TANGUT COMPONENT 685, 101036 +TANGUT COMPONENT 686, 101037 +TANGUT COMPONENT 687, 101038 +TANGUT COMPONENT 688, 101039 +TANGUT COMPONENT 689, 101040 +TANGUT COMPONENT 690, 101041 +TANGUT COMPONENT 691, 101042 +TANGUT COMPONENT 692, 101043 +TANGUT COMPONENT 693, 101044 +TANGUT COMPONENT 694, 101045 +TANGUT COMPONENT 695, 101046 +TANGUT COMPONENT 696, 101047 +TANGUT COMPONENT 697, 101048 +TANGUT COMPONENT 698, 101049 +TANGUT COMPONENT 699, 101050 +TANGUT COMPONENT 700, 101051 +TANGUT COMPONENT 701, 101052 +TANGUT COMPONENT 702, 101053 +TANGUT COMPONENT 703, 101054 +TANGUT COMPONENT 704, 101055 +TANGUT COMPONENT 705, 101056 +TANGUT COMPONENT 706, 101057 +TANGUT COMPONENT 707, 101058 +TANGUT COMPONENT 708, 101059 +TANGUT COMPONENT 709, 101060 +TANGUT COMPONENT 710, 101061 +TANGUT COMPONENT 711, 101062 +TANGUT COMPONENT 712, 101063 +TANGUT COMPONENT 713, 101064 +TANGUT COMPONENT 714, 101065 +TANGUT COMPONENT 715, 101066 +TANGUT COMPONENT 716, 101067 +TANGUT COMPONENT 717, 101068 +TANGUT COMPONENT 718, 101069 +TANGUT COMPONENT 719, 101070 +TANGUT COMPONENT 720, 101071 +TANGUT COMPONENT 721, 101072 +TANGUT COMPONENT 722, 101073 +TANGUT COMPONENT 723, 101074 +TANGUT COMPONENT 724, 101075 +TANGUT COMPONENT 725, 101076 +TANGUT COMPONENT 726, 101077 +TANGUT COMPONENT 727, 101078 +TANGUT COMPONENT 728, 101079 +TANGUT COMPONENT 729, 101080 +TANGUT COMPONENT 730, 101081 +TANGUT COMPONENT 731, 101082 +TANGUT COMPONENT 732, 101083 +TANGUT COMPONENT 733, 101084 +TANGUT COMPONENT 734, 101085 +TANGUT COMPONENT 735, 101086 +TANGUT COMPONENT 736, 101087 +TANGUT COMPONENT 737, 101088 +TANGUT COMPONENT 738, 101089 +TANGUT COMPONENT 739, 101090 +TANGUT COMPONENT 740, 101091 +TANGUT COMPONENT 741, 101092 +TANGUT COMPONENT 742, 101093 +TANGUT COMPONENT 743, 101094 +TANGUT COMPONENT 744, 101095 +TANGUT COMPONENT 745, 101096 +TANGUT COMPONENT 746, 101097 +TANGUT COMPONENT 747, 101098 +TANGUT COMPONENT 748, 101099 +TANGUT COMPONENT 749, 101100 +TANGUT COMPONENT 750, 101101 +TANGUT COMPONENT 751, 101102 +TANGUT COMPONENT 752, 101103 +TANGUT COMPONENT 753, 101104 +TANGUT COMPONENT 754, 101105 +TANGUT COMPONENT 755, 101106 +KATAKANA LETTER ARCHAIC E, 110592 +HIRAGANA LETTER ARCHAIC YE, 110593 +DUPLOYAN LETTER H, 113664 +DUPLOYAN LETTER X, 113665 +DUPLOYAN LETTER P, 113666 +DUPLOYAN LETTER T, 113667 +DUPLOYAN LETTER F, 113668 +DUPLOYAN LETTER K, 113669 +DUPLOYAN LETTER L, 113670 +DUPLOYAN LETTER B, 113671 +DUPLOYAN LETTER D, 113672 +DUPLOYAN LETTER V, 113673 +DUPLOYAN LETTER G, 113674 +DUPLOYAN LETTER R, 113675 +DUPLOYAN LETTER P N, 113676 +DUPLOYAN LETTER D S, 113677 +DUPLOYAN LETTER F N, 113678 +DUPLOYAN LETTER K M, 113679 +DUPLOYAN LETTER R S, 113680 +DUPLOYAN LETTER TH, 113681 +DUPLOYAN LETTER SLOAN DH, 113682 +DUPLOYAN LETTER DH, 113683 +DUPLOYAN LETTER KK, 113684 +DUPLOYAN LETTER SLOAN J, 113685 +DUPLOYAN LETTER HL, 113686 +DUPLOYAN LETTER LH, 113687 +DUPLOYAN LETTER RH, 113688 +DUPLOYAN LETTER M, 113689 +DUPLOYAN LETTER N, 113690 +DUPLOYAN LETTER J, 113691 +DUPLOYAN LETTER S, 113692 +DUPLOYAN LETTER M N, 113693 +DUPLOYAN LETTER N M, 113694 +DUPLOYAN LETTER J M, 113695 +DUPLOYAN LETTER S J, 113696 +DUPLOYAN LETTER M WITH DOT, 113697 +DUPLOYAN LETTER N WITH DOT, 113698 +DUPLOYAN LETTER J WITH DOT, 113699 +DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE, 113700 +DUPLOYAN LETTER S WITH DOT, 113701 +DUPLOYAN LETTER S WITH DOT BELOW, 113702 +DUPLOYAN LETTER M S, 113703 +DUPLOYAN LETTER N S, 113704 +DUPLOYAN LETTER J S, 113705 +DUPLOYAN LETTER S S, 113706 +DUPLOYAN LETTER M N S, 113707 +DUPLOYAN LETTER N M S, 113708 +DUPLOYAN LETTER J M S, 113709 +DUPLOYAN LETTER S J S, 113710 +DUPLOYAN LETTER J S WITH DOT, 113711 +DUPLOYAN LETTER J N, 113712 +DUPLOYAN LETTER J N S, 113713 +DUPLOYAN LETTER S T, 113714 +DUPLOYAN LETTER S T R, 113715 +DUPLOYAN LETTER S P, 113716 +DUPLOYAN LETTER S P R, 113717 +DUPLOYAN LETTER T S, 113718 +DUPLOYAN LETTER T R S, 113719 +DUPLOYAN LETTER W, 113720 +DUPLOYAN LETTER WH, 113721 +DUPLOYAN LETTER W R, 113722 +DUPLOYAN LETTER S N, 113723 +DUPLOYAN LETTER S M, 113724 +DUPLOYAN LETTER K R S, 113725 +DUPLOYAN LETTER G R S, 113726 +DUPLOYAN LETTER S K, 113727 +DUPLOYAN LETTER S K R, 113728 +DUPLOYAN LETTER A, 113729 +DUPLOYAN LETTER SLOAN OW, 113730 +DUPLOYAN LETTER OA, 113731 +DUPLOYAN LETTER O, 113732 +DUPLOYAN LETTER AOU, 113733 +DUPLOYAN LETTER I, 113734 +DUPLOYAN LETTER E, 113735 +DUPLOYAN LETTER IE, 113736 +DUPLOYAN LETTER SHORT I, 113737 +DUPLOYAN LETTER UI, 113738 +DUPLOYAN LETTER EE, 113739 +DUPLOYAN LETTER SLOAN EH, 113740 +DUPLOYAN LETTER ROMANIAN I, 113741 +DUPLOYAN LETTER SLOAN EE, 113742 +DUPLOYAN LETTER LONG I, 113743 +DUPLOYAN LETTER YE, 113744 +DUPLOYAN LETTER U, 113745 +DUPLOYAN LETTER EU, 113746 +DUPLOYAN LETTER XW, 113747 +DUPLOYAN LETTER U N, 113748 +DUPLOYAN LETTER LONG U, 113749 +DUPLOYAN LETTER ROMANIAN U, 113750 +DUPLOYAN LETTER UH, 113751 +DUPLOYAN LETTER SLOAN U, 113752 +DUPLOYAN LETTER OOH, 113753 +DUPLOYAN LETTER OW, 113754 +DUPLOYAN LETTER OU, 113755 +DUPLOYAN LETTER WA, 113756 +DUPLOYAN LETTER WO, 113757 +DUPLOYAN LETTER WI, 113758 +DUPLOYAN LETTER WEI, 113759 +DUPLOYAN LETTER WOW, 113760 +DUPLOYAN LETTER NASAL U, 113761 +DUPLOYAN LETTER NASAL O, 113762 +DUPLOYAN LETTER NASAL I, 113763 +DUPLOYAN LETTER NASAL A, 113764 +DUPLOYAN LETTER PERNIN AN, 113765 +DUPLOYAN LETTER PERNIN AM, 113766 +DUPLOYAN LETTER SLOAN EN, 113767 +DUPLOYAN LETTER SLOAN AN, 113768 +DUPLOYAN LETTER SLOAN ON, 113769 +DUPLOYAN LETTER VOCALIC M, 113770 +DUPLOYAN AFFIX LEFT HORIZONTAL SECANT, 113776 +DUPLOYAN AFFIX MID HORIZONTAL SECANT, 113777 +DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT, 113778 +DUPLOYAN AFFIX LOW VERTICAL SECANT, 113779 +DUPLOYAN AFFIX MID VERTICAL SECANT, 113780 +DUPLOYAN AFFIX HIGH VERTICAL SECANT, 113781 +DUPLOYAN AFFIX ATTACHED SECANT, 113782 +DUPLOYAN AFFIX ATTACHED LEFT TO RIGHT SECANT, 113783 +DUPLOYAN AFFIX ATTACHED TANGENT, 113784 +DUPLOYAN AFFIX ATTACHED TAIL, 113785 +DUPLOYAN AFFIX ATTACHED E HOOK, 113786 +DUPLOYAN AFFIX ATTACHED I HOOK, 113787 +DUPLOYAN AFFIX ATTACHED TANGENT HOOK, 113788 +DUPLOYAN AFFIX HIGH ACUTE, 113792 +DUPLOYAN AFFIX HIGH TIGHT ACUTE, 113793 +DUPLOYAN AFFIX HIGH GRAVE, 113794 +DUPLOYAN AFFIX HIGH LONG GRAVE, 113795 +DUPLOYAN AFFIX HIGH DOT, 113796 +DUPLOYAN AFFIX HIGH CIRCLE, 113797 +DUPLOYAN AFFIX HIGH LINE, 113798 +DUPLOYAN AFFIX HIGH WAVE, 113799 +DUPLOYAN AFFIX HIGH VERTICAL, 113800 +DUPLOYAN AFFIX LOW ACUTE, 113808 +DUPLOYAN AFFIX LOW TIGHT ACUTE, 113809 +DUPLOYAN AFFIX LOW GRAVE, 113810 +DUPLOYAN AFFIX LOW LONG GRAVE, 113811 +DUPLOYAN AFFIX LOW DOT, 113812 +DUPLOYAN AFFIX LOW CIRCLE, 113813 +DUPLOYAN AFFIX LOW LINE, 113814 +DUPLOYAN AFFIX LOW WAVE, 113815 +DUPLOYAN AFFIX LOW VERTICAL, 113816 +DUPLOYAN AFFIX LOW ARROW, 113817 +DUPLOYAN SIGN O WITH CROSS, 113820 +DUPLOYAN THICK LETTER SELECTOR, 113821 +DUPLOYAN DOUBLE MARK, 113822 +DUPLOYAN PUNCTUATION CHINOOK FULL STOP, 113823 +SHORTHAND FORMAT LETTER OVERLAP, 113824 +SHORTHAND FORMAT CONTINUING OVERLAP, 113825 +SHORTHAND FORMAT DOWN STEP, 113826 +SHORTHAND FORMAT UP STEP, 113827 +BYZANTINE MUSICAL SYMBOL PSILI, 118784 +BYZANTINE MUSICAL SYMBOL DASEIA, 118785 +BYZANTINE MUSICAL SYMBOL PERISPOMENI, 118786 +BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON, 118787 +BYZANTINE MUSICAL SYMBOL OXEIA DIPLI, 118788 +BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON, 118789 +BYZANTINE MUSICAL SYMBOL VAREIA DIPLI, 118790 +BYZANTINE MUSICAL SYMBOL KATHISTI, 118791 +BYZANTINE MUSICAL SYMBOL SYRMATIKI, 118792 +BYZANTINE MUSICAL SYMBOL PARAKLITIKI, 118793 +BYZANTINE MUSICAL SYMBOL YPOKRISIS, 118794 +BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI, 118795 +BYZANTINE MUSICAL SYMBOL KREMASTI, 118796 +BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON, 118797 +BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON, 118798 +BYZANTINE MUSICAL SYMBOL TELEIA, 118799 +BYZANTINE MUSICAL SYMBOL KENTIMATA, 118800 +BYZANTINE MUSICAL SYMBOL APOSTROFOS, 118801 +BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI, 118802 +BYZANTINE MUSICAL SYMBOL SYNEVMA, 118803 +BYZANTINE MUSICAL SYMBOL THITA, 118804 +BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION, 118805 +BYZANTINE MUSICAL SYMBOL GORGON ARCHAION, 118806 +BYZANTINE MUSICAL SYMBOL PSILON, 118807 +BYZANTINE MUSICAL SYMBOL CHAMILON, 118808 +BYZANTINE MUSICAL SYMBOL VATHY, 118809 +BYZANTINE MUSICAL SYMBOL ISON ARCHAION, 118810 +BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION, 118811 +BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION, 118812 +BYZANTINE MUSICAL SYMBOL SAXIMATA, 118813 +BYZANTINE MUSICAL SYMBOL PARICHON, 118814 +BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA, 118815 +BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION, 118816 +BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION, 118817 +BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION, 118818 +BYZANTINE MUSICAL SYMBOL APOTHEMA, 118819 +BYZANTINE MUSICAL SYMBOL KLASMA, 118820 +BYZANTINE MUSICAL SYMBOL REVMA, 118821 +BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION, 118822 +BYZANTINE MUSICAL SYMBOL TINAGMA, 118823 +BYZANTINE MUSICAL SYMBOL ANATRICHISMA, 118824 +BYZANTINE MUSICAL SYMBOL SEISMA, 118825 +BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION, 118826 +BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU, 118827 +BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION, 118828 +BYZANTINE MUSICAL SYMBOL THEMA, 118829 +BYZANTINE MUSICAL SYMBOL LEMOI, 118830 +BYZANTINE MUSICAL SYMBOL DYO, 118831 +BYZANTINE MUSICAL SYMBOL TRIA, 118832 +BYZANTINE MUSICAL SYMBOL TESSERA, 118833 +BYZANTINE MUSICAL SYMBOL KRATIMATA, 118834 +BYZANTINE MUSICAL SYMBOL APESO EXO NEO, 118835 +BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION, 118836 +BYZANTINE MUSICAL SYMBOL IMIFTHORA, 118837 +BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION, 118838 +BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON, 118839 +BYZANTINE MUSICAL SYMBOL PELASTON, 118840 +BYZANTINE MUSICAL SYMBOL PSIFISTON, 118841 +BYZANTINE MUSICAL SYMBOL KONTEVMA, 118842 +BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION, 118843 +BYZANTINE MUSICAL SYMBOL RAPISMA, 118844 +BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION, 118845 +BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION, 118846 +BYZANTINE MUSICAL SYMBOL ICHADIN, 118847 +BYZANTINE MUSICAL SYMBOL NANA, 118848 +BYZANTINE MUSICAL SYMBOL PETASMA, 118849 +BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO, 118850 +BYZANTINE MUSICAL SYMBOL TROMIKON ALLO, 118851 +BYZANTINE MUSICAL SYMBOL STRAGGISMATA, 118852 +BYZANTINE MUSICAL SYMBOL GRONTHISMATA, 118853 +BYZANTINE MUSICAL SYMBOL ISON NEO, 118854 +BYZANTINE MUSICAL SYMBOL OLIGON NEO, 118855 +BYZANTINE MUSICAL SYMBOL OXEIA NEO, 118856 +BYZANTINE MUSICAL SYMBOL PETASTI, 118857 +BYZANTINE MUSICAL SYMBOL KOUFISMA, 118858 +BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA, 118859 +BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA, 118860 +BYZANTINE MUSICAL SYMBOL PELASTON NEO, 118861 +BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO, 118862 +BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO, 118863 +BYZANTINE MUSICAL SYMBOL YPSILI, 118864 +BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO, 118865 +BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO, 118866 +BYZANTINE MUSICAL SYMBOL YPORROI, 118867 +BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON, 118868 +BYZANTINE MUSICAL SYMBOL ELAFRON, 118869 +BYZANTINE MUSICAL SYMBOL CHAMILI, 118870 +BYZANTINE MUSICAL SYMBOL MIKRON ISON, 118871 +BYZANTINE MUSICAL SYMBOL VAREIA NEO, 118872 +BYZANTINE MUSICAL SYMBOL PIASMA NEO, 118873 +BYZANTINE MUSICAL SYMBOL PSIFISTON NEO, 118874 +BYZANTINE MUSICAL SYMBOL OMALON, 118875 +BYZANTINE MUSICAL SYMBOL ANTIKENOMA, 118876 +BYZANTINE MUSICAL SYMBOL LYGISMA, 118877 +BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO, 118878 +BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO, 118879 +BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA, 118880 +BYZANTINE MUSICAL SYMBOL KYLISMA, 118881 +BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA, 118882 +BYZANTINE MUSICAL SYMBOL TROMIKON NEO, 118883 +BYZANTINE MUSICAL SYMBOL EKSTREPTON, 118884 +BYZANTINE MUSICAL SYMBOL SYNAGMA NEO, 118885 +BYZANTINE MUSICAL SYMBOL SYRMA, 118886 +BYZANTINE MUSICAL SYMBOL CHOREVMA NEO, 118887 +BYZANTINE MUSICAL SYMBOL EPEGERMA, 118888 +BYZANTINE MUSICAL SYMBOL SEISMA NEO, 118889 +BYZANTINE MUSICAL SYMBOL XIRON KLASMA, 118890 +BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON, 118891 +BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA, 118892 +BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA, 118893 +BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA, 118894 +BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA, 118895 +BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA, 118896 +BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA, 118897 +BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON, 118898 +BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON, 118899 +BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON, 118900 +BYZANTINE MUSICAL SYMBOL OYRANISMA NEO, 118901 +BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO, 118902 +BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO, 118903 +BYZANTINE MUSICAL SYMBOL THEMA APLOUN, 118904 +BYZANTINE MUSICAL SYMBOL THES KAI APOTHES, 118905 +BYZANTINE MUSICAL SYMBOL KATAVASMA, 118906 +BYZANTINE MUSICAL SYMBOL ENDOFONON, 118907 +BYZANTINE MUSICAL SYMBOL YFEN KATO, 118908 +BYZANTINE MUSICAL SYMBOL YFEN ANO, 118909 +BYZANTINE MUSICAL SYMBOL STAVROS, 118910 +BYZANTINE MUSICAL SYMBOL KLASMA ANO, 118911 +BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION, 118912 +BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION, 118913 +BYZANTINE MUSICAL SYMBOL KRATIMA ALLO, 118914 +BYZANTINE MUSICAL SYMBOL KRATIMA NEO, 118915 +BYZANTINE MUSICAL SYMBOL APODERMA NEO, 118916 +BYZANTINE MUSICAL SYMBOL APLI, 118917 +BYZANTINE MUSICAL SYMBOL DIPLI, 118918 +BYZANTINE MUSICAL SYMBOL TRIPLI, 118919 +BYZANTINE MUSICAL SYMBOL TETRAPLI, 118920 +BYZANTINE MUSICAL SYMBOL KORONIS, 118921 +BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU, 118922 +BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON, 118923 +BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON, 118924 +BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON, 118925 +BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU, 118926 +BYZANTINE MUSICAL SYMBOL GORGON NEO ANO, 118927 +BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA, 118928 +BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA, 118929 +BYZANTINE MUSICAL SYMBOL DIGORGON, 118930 +BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO, 118931 +BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO, 118932 +BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA, 118933 +BYZANTINE MUSICAL SYMBOL TRIGORGON, 118934 +BYZANTINE MUSICAL SYMBOL ARGON, 118935 +BYZANTINE MUSICAL SYMBOL IMIDIARGON, 118936 +BYZANTINE MUSICAL SYMBOL DIARGON, 118937 +BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI, 118938 +BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI, 118939 +BYZANTINE MUSICAL SYMBOL AGOGI ARGI, 118940 +BYZANTINE MUSICAL SYMBOL AGOGI METRIA, 118941 +BYZANTINE MUSICAL SYMBOL AGOGI MESI, 118942 +BYZANTINE MUSICAL SYMBOL AGOGI GORGI, 118943 +BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI, 118944 +BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI, 118945 +BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS, 118946 +BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS, 118947 +BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS, 118948 +BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS, 118949 +BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS, 118950 +BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS, 118951 +BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS, 118952 +BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS, 118953 +BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS, 118954 +BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS, 118955 +BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS, 118956 +BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS, 118957 +BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS, 118958 +BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS, 118959 +BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS, 118960 +BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS, 118961 +BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS, 118962 +BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS, 118963 +BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN, 118964 +BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN, 118965 +BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU, 118966 +BYZANTINE MUSICAL SYMBOL IMIFONON, 118967 +BYZANTINE MUSICAL SYMBOL IMIFTHORON, 118968 +BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU, 118969 +BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA, 118970 +BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA, 118971 +BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS, 118972 +BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI, 118973 +BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI, 118974 +BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE, 118975 +BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO, 118976 +BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO, 118977 +BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO, 118978 +BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS, 118979 +BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS, 118980 +BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS, 118981 +BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI, 118982 +BYZANTINE MUSICAL SYMBOL FTHORA NENANO, 118983 +BYZANTINE MUSICAL SYMBOL CHROA ZYGOS, 118984 +BYZANTINE MUSICAL SYMBOL CHROA KLITON, 118985 +BYZANTINE MUSICAL SYMBOL CHROA SPATHI, 118986 +BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION, 118987 +BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA, 118988 +BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION, 118989 +BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION, 118990 +BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION, 118991 +BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA, 118992 +BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA, 118993 +BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA, 118994 +BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA, 118995 +BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA, 118996 +BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA, 118997 +BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA, 118998 +BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA, 118999 +BYZANTINE MUSICAL SYMBOL GENIKI DIESIS, 119000 +BYZANTINE MUSICAL SYMBOL GENIKI YFESIS, 119001 +BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI, 119002 +BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI, 119003 +BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI, 119004 +BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS, 119005 +BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS, 119006 +BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU, 119007 +BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU, 119008 +BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU, 119009 +BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS, 119010 +BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU, 119011 +BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU, 119012 +BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU, 119013 +BYZANTINE MUSICAL SYMBOL DIGRAMMA GG, 119014 +BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU, 119015 +BYZANTINE MUSICAL SYMBOL STIGMA, 119016 +BYZANTINE MUSICAL SYMBOL ARKTIKO PA, 119017 +BYZANTINE MUSICAL SYMBOL ARKTIKO VOU, 119018 +BYZANTINE MUSICAL SYMBOL ARKTIKO GA, 119019 +BYZANTINE MUSICAL SYMBOL ARKTIKO DI, 119020 +BYZANTINE MUSICAL SYMBOL ARKTIKO KE, 119021 +BYZANTINE MUSICAL SYMBOL ARKTIKO ZO, 119022 +BYZANTINE MUSICAL SYMBOL ARKTIKO NI, 119023 +BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO, 119024 +BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO, 119025 +BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO, 119026 +BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO, 119027 +BYZANTINE MUSICAL SYMBOL KLASMA KATO, 119028 +BYZANTINE MUSICAL SYMBOL GORGON NEO KATO, 119029 +MUSICAL SYMBOL SINGLE BARLINE, 119040 +MUSICAL SYMBOL DOUBLE BARLINE, 119041 +MUSICAL SYMBOL FINAL BARLINE, 119042 +MUSICAL SYMBOL REVERSE FINAL BARLINE, 119043 +MUSICAL SYMBOL DASHED BARLINE, 119044 +MUSICAL SYMBOL SHORT BARLINE, 119045 +MUSICAL SYMBOL LEFT REPEAT SIGN, 119046 +MUSICAL SYMBOL RIGHT REPEAT SIGN, 119047 +MUSICAL SYMBOL REPEAT DOTS, 119048 +MUSICAL SYMBOL DAL SEGNO, 119049 +MUSICAL SYMBOL DA CAPO, 119050 +MUSICAL SYMBOL SEGNO, 119051 +MUSICAL SYMBOL CODA, 119052 +MUSICAL SYMBOL REPEATED FIGURE 1, 119053 +MUSICAL SYMBOL REPEATED FIGURE 2, 119054 +MUSICAL SYMBOL REPEATED FIGURE 3, 119055 +MUSICAL SYMBOL FERMATA, 119056 +MUSICAL SYMBOL FERMATA BELOW, 119057 +MUSICAL SYMBOL BREATH MARK, 119058 +MUSICAL SYMBOL CAESURA, 119059 +MUSICAL SYMBOL BRACE, 119060 +MUSICAL SYMBOL BRACKET, 119061 +MUSICAL SYMBOL ONE LINE STAFF, 119062 +MUSICAL SYMBOL TWO LINE STAFF, 119063 +MUSICAL SYMBOL THREE LINE STAFF, 119064 +MUSICAL SYMBOL FOUR LINE STAFF, 119065 +MUSICAL SYMBOL FIVE LINE STAFF, 119066 +MUSICAL SYMBOL SIX LINE STAFF, 119067 +MUSICAL SYMBOL SIX STRING FRETBOARD, 119068 +MUSICAL SYMBOL FOUR STRING FRETBOARD, 119069 +MUSICAL SYMBOL G CLEF, 119070 +MUSICAL SYMBOL G CLEF OTTAVA ALTA, 119071 +MUSICAL SYMBOL G CLEF OTTAVA BASSA, 119072 +MUSICAL SYMBOL C CLEF, 119073 +MUSICAL SYMBOL F CLEF, 119074 +MUSICAL SYMBOL F CLEF OTTAVA ALTA, 119075 +MUSICAL SYMBOL F CLEF OTTAVA BASSA, 119076 +MUSICAL SYMBOL DRUM CLEF 1, 119077 +MUSICAL SYMBOL DRUM CLEF 2, 119078 +MUSICAL SYMBOL MULTIPLE MEASURE REST, 119081 +MUSICAL SYMBOL DOUBLE SHARP, 119082 +MUSICAL SYMBOL DOUBLE FLAT, 119083 +MUSICAL SYMBOL FLAT UP, 119084 +MUSICAL SYMBOL FLAT DOWN, 119085 +MUSICAL SYMBOL NATURAL UP, 119086 +MUSICAL SYMBOL NATURAL DOWN, 119087 +MUSICAL SYMBOL SHARP UP, 119088 +MUSICAL SYMBOL SHARP DOWN, 119089 +MUSICAL SYMBOL QUARTER TONE SHARP, 119090 +MUSICAL SYMBOL QUARTER TONE FLAT, 119091 +MUSICAL SYMBOL COMMON TIME, 119092 +MUSICAL SYMBOL CUT TIME, 119093 +MUSICAL SYMBOL OTTAVA ALTA, 119094 +MUSICAL SYMBOL OTTAVA BASSA, 119095 +MUSICAL SYMBOL QUINDICESIMA ALTA, 119096 +MUSICAL SYMBOL QUINDICESIMA BASSA, 119097 +MUSICAL SYMBOL MULTI REST, 119098 +MUSICAL SYMBOL WHOLE REST, 119099 +MUSICAL SYMBOL HALF REST, 119100 +MUSICAL SYMBOL QUARTER REST, 119101 +MUSICAL SYMBOL EIGHTH REST, 119102 +MUSICAL SYMBOL SIXTEENTH REST, 119103 +MUSICAL SYMBOL THIRTY SECOND REST, 119104 +MUSICAL SYMBOL SIXTY FOURTH REST, 119105 +MUSICAL SYMBOL ONE HUNDRED TWENTY EIGHTH REST, 119106 +MUSICAL SYMBOL X NOTEHEAD, 119107 +MUSICAL SYMBOL PLUS NOTEHEAD, 119108 +MUSICAL SYMBOL CIRCLE X NOTEHEAD, 119109 +MUSICAL SYMBOL SQUARE NOTEHEAD WHITE, 119110 +MUSICAL SYMBOL SQUARE NOTEHEAD BLACK, 119111 +MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE, 119112 +MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK, 119113 +MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE, 119114 +MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK, 119115 +MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE, 119116 +MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK, 119117 +MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE, 119118 +MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK, 119119 +MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE, 119120 +MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK, 119121 +MUSICAL SYMBOL MOON NOTEHEAD WHITE, 119122 +MUSICAL SYMBOL MOON NOTEHEAD BLACK, 119123 +MUSICAL SYMBOL TRIANGLE ROUND NOTEHEAD DOWN WHITE, 119124 +MUSICAL SYMBOL TRIANGLE ROUND NOTEHEAD DOWN BLACK, 119125 +MUSICAL SYMBOL PARENTHESIS NOTEHEAD, 119126 +MUSICAL SYMBOL VOID NOTEHEAD, 119127 +MUSICAL SYMBOL NOTEHEAD BLACK, 119128 +MUSICAL SYMBOL NULL NOTEHEAD, 119129 +MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE, 119130 +MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK, 119131 +MUSICAL SYMBOL BREVE, 119132 +MUSICAL SYMBOL WHOLE NOTE, 119133 +MUSICAL SYMBOL HALF NOTE, 119134 +MUSICAL SYMBOL QUARTER NOTE, 119135 +MUSICAL SYMBOL EIGHTH NOTE, 119136 +MUSICAL SYMBOL SIXTEENTH NOTE, 119137 +MUSICAL SYMBOL THIRTY SECOND NOTE, 119138 +MUSICAL SYMBOL SIXTY FOURTH NOTE, 119139 +MUSICAL SYMBOL ONE HUNDRED TWENTY EIGHTH NOTE, 119140 +MUSICAL SYMBOL COMBINING STEM, 119141 +MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, 119142 +MUSICAL SYMBOL COMBINING TREMOLO 1, 119143 +MUSICAL SYMBOL COMBINING TREMOLO 2, 119144 +MUSICAL SYMBOL COMBINING TREMOLO 3, 119145 +MUSICAL SYMBOL FINGERED TREMOLO 1, 119146 +MUSICAL SYMBOL FINGERED TREMOLO 2, 119147 +MUSICAL SYMBOL FINGERED TREMOLO 3, 119148 +MUSICAL SYMBOL COMBINING AUGMENTATION DOT, 119149 +MUSICAL SYMBOL COMBINING FLAG 1, 119150 +MUSICAL SYMBOL COMBINING FLAG 2, 119151 +MUSICAL SYMBOL COMBINING FLAG 3, 119152 +MUSICAL SYMBOL COMBINING FLAG 4, 119153 +MUSICAL SYMBOL COMBINING FLAG 5, 119154 +MUSICAL SYMBOL BEGIN BEAM, 119155 +MUSICAL SYMBOL END BEAM, 119156 +MUSICAL SYMBOL BEGIN TIE, 119157 +MUSICAL SYMBOL END TIE, 119158 +MUSICAL SYMBOL BEGIN SLUR, 119159 +MUSICAL SYMBOL END SLUR, 119160 +MUSICAL SYMBOL BEGIN PHRASE, 119161 +MUSICAL SYMBOL END PHRASE, 119162 +MUSICAL SYMBOL COMBINING ACCENT, 119163 +MUSICAL SYMBOL COMBINING STACCATO, 119164 +MUSICAL SYMBOL COMBINING TENUTO, 119165 +MUSICAL SYMBOL COMBINING STACCATISSIMO, 119166 +MUSICAL SYMBOL COMBINING MARCATO, 119167 +MUSICAL SYMBOL COMBINING MARCATO STACCATO, 119168 +MUSICAL SYMBOL COMBINING ACCENT STACCATO, 119169 +MUSICAL SYMBOL COMBINING LOURE, 119170 +MUSICAL SYMBOL ARPEGGIATO UP, 119171 +MUSICAL SYMBOL ARPEGGIATO DOWN, 119172 +MUSICAL SYMBOL COMBINING DOIT, 119173 +MUSICAL SYMBOL COMBINING RIP, 119174 +MUSICAL SYMBOL COMBINING FLIP, 119175 +MUSICAL SYMBOL COMBINING SMEAR, 119176 +MUSICAL SYMBOL COMBINING BEND, 119177 +MUSICAL SYMBOL COMBINING DOUBLE TONGUE, 119178 +MUSICAL SYMBOL COMBINING TRIPLE TONGUE, 119179 +MUSICAL SYMBOL RINFORZANDO, 119180 +MUSICAL SYMBOL SUBITO, 119181 +MUSICAL SYMBOL Z, 119182 +MUSICAL SYMBOL PIANO, 119183 +MUSICAL SYMBOL MEZZO, 119184 +MUSICAL SYMBOL FORTE, 119185 +MUSICAL SYMBOL CRESCENDO, 119186 +MUSICAL SYMBOL DECRESCENDO, 119187 +MUSICAL SYMBOL GRACE NOTE SLASH, 119188 +MUSICAL SYMBOL GRACE NOTE NO SLASH, 119189 +MUSICAL SYMBOL TR, 119190 +MUSICAL SYMBOL TURN, 119191 +MUSICAL SYMBOL INVERTED TURN, 119192 +MUSICAL SYMBOL TURN SLASH, 119193 +MUSICAL SYMBOL TURN UP, 119194 +MUSICAL SYMBOL ORNAMENT STROKE 1, 119195 +MUSICAL SYMBOL ORNAMENT STROKE 2, 119196 +MUSICAL SYMBOL ORNAMENT STROKE 3, 119197 +MUSICAL SYMBOL ORNAMENT STROKE 4, 119198 +MUSICAL SYMBOL ORNAMENT STROKE 5, 119199 +MUSICAL SYMBOL ORNAMENT STROKE 6, 119200 +MUSICAL SYMBOL ORNAMENT STROKE 7, 119201 +MUSICAL SYMBOL ORNAMENT STROKE 8, 119202 +MUSICAL SYMBOL ORNAMENT STROKE 9, 119203 +MUSICAL SYMBOL ORNAMENT STROKE 10, 119204 +MUSICAL SYMBOL ORNAMENT STROKE 11, 119205 +MUSICAL SYMBOL HAUPTSTIMME, 119206 +MUSICAL SYMBOL NEBENSTIMME, 119207 +MUSICAL SYMBOL END OF STIMME, 119208 +MUSICAL SYMBOL DEGREE SLASH, 119209 +MUSICAL SYMBOL COMBINING DOWN BOW, 119210 +MUSICAL SYMBOL COMBINING UP BOW, 119211 +MUSICAL SYMBOL COMBINING HARMONIC, 119212 +MUSICAL SYMBOL COMBINING SNAP PIZZICATO, 119213 +MUSICAL SYMBOL PEDAL MARK, 119214 +MUSICAL SYMBOL PEDAL UP MARK, 119215 +MUSICAL SYMBOL HALF PEDAL MARK, 119216 +MUSICAL SYMBOL GLISSANDO UP, 119217 +MUSICAL SYMBOL GLISSANDO DOWN, 119218 +MUSICAL SYMBOL WITH FINGERNAILS, 119219 +MUSICAL SYMBOL DAMP, 119220 +MUSICAL SYMBOL DAMP ALL, 119221 +MUSICAL SYMBOL MAXIMA, 119222 +MUSICAL SYMBOL LONGA, 119223 +MUSICAL SYMBOL BREVIS, 119224 +MUSICAL SYMBOL SEMIBREVIS WHITE, 119225 +MUSICAL SYMBOL SEMIBREVIS BLACK, 119226 +MUSICAL SYMBOL MINIMA, 119227 +MUSICAL SYMBOL MINIMA BLACK, 119228 +MUSICAL SYMBOL SEMIMINIMA WHITE, 119229 +MUSICAL SYMBOL SEMIMINIMA BLACK, 119230 +MUSICAL SYMBOL FUSA WHITE, 119231 +MUSICAL SYMBOL FUSA BLACK, 119232 +MUSICAL SYMBOL LONGA PERFECTA REST, 119233 +MUSICAL SYMBOL LONGA IMPERFECTA REST, 119234 +MUSICAL SYMBOL BREVIS REST, 119235 +MUSICAL SYMBOL SEMIBREVIS REST, 119236 +MUSICAL SYMBOL MINIMA REST, 119237 +MUSICAL SYMBOL SEMIMINIMA REST, 119238 +MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA, 119239 +MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA, 119240 +MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION 1, 119241 +MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA, 119242 +MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA, 119243 +MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION 1, 119244 +MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION 2, 119245 +MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION 3, 119246 +MUSICAL SYMBOL CROIX, 119247 +MUSICAL SYMBOL GREGORIAN C CLEF, 119248 +MUSICAL SYMBOL GREGORIAN F CLEF, 119249 +MUSICAL SYMBOL SQUARE B, 119250 +MUSICAL SYMBOL VIRGA, 119251 +MUSICAL SYMBOL PODATUS, 119252 +MUSICAL SYMBOL CLIVIS, 119253 +MUSICAL SYMBOL SCANDICUS, 119254 +MUSICAL SYMBOL CLIMACUS, 119255 +MUSICAL SYMBOL TORCULUS, 119256 +MUSICAL SYMBOL PORRECTUS, 119257 +MUSICAL SYMBOL PORRECTUS FLEXUS, 119258 +MUSICAL SYMBOL SCANDICUS FLEXUS, 119259 +MUSICAL SYMBOL TORCULUS RESUPINUS, 119260 +MUSICAL SYMBOL PES SUBPUNCTIS, 119261 +MUSICAL SYMBOL KIEVAN C CLEF, 119262 +MUSICAL SYMBOL KIEVAN END OF PIECE, 119263 +MUSICAL SYMBOL KIEVAN FINAL NOTE, 119264 +MUSICAL SYMBOL KIEVAN RECITATIVE MARK, 119265 +MUSICAL SYMBOL KIEVAN WHOLE NOTE, 119266 +MUSICAL SYMBOL KIEVAN HALF NOTE, 119267 +MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN, 119268 +MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP, 119269 +MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN, 119270 +MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP, 119271 +MUSICAL SYMBOL KIEVAN FLAT SIGN, 119272 +GREEK VOCAL NOTATION SYMBOL 1, 119296 +GREEK VOCAL NOTATION SYMBOL 2, 119297 +GREEK VOCAL NOTATION SYMBOL 3, 119298 +GREEK VOCAL NOTATION SYMBOL 4, 119299 +GREEK VOCAL NOTATION SYMBOL 5, 119300 +GREEK VOCAL NOTATION SYMBOL 6, 119301 +GREEK VOCAL NOTATION SYMBOL 7, 119302 +GREEK VOCAL NOTATION SYMBOL 8, 119303 +GREEK VOCAL NOTATION SYMBOL 9, 119304 +GREEK VOCAL NOTATION SYMBOL 10, 119305 +GREEK VOCAL NOTATION SYMBOL 11, 119306 +GREEK VOCAL NOTATION SYMBOL 12, 119307 +GREEK VOCAL NOTATION SYMBOL 13, 119308 +GREEK VOCAL NOTATION SYMBOL 14, 119309 +GREEK VOCAL NOTATION SYMBOL 15, 119310 +GREEK VOCAL NOTATION SYMBOL 16, 119311 +GREEK VOCAL NOTATION SYMBOL 17, 119312 +GREEK VOCAL NOTATION SYMBOL 18, 119313 +GREEK VOCAL NOTATION SYMBOL 19, 119314 +GREEK VOCAL NOTATION SYMBOL 20, 119315 +GREEK VOCAL NOTATION SYMBOL 21, 119316 +GREEK VOCAL NOTATION SYMBOL 22, 119317 +GREEK VOCAL NOTATION SYMBOL 23, 119318 +GREEK VOCAL NOTATION SYMBOL 24, 119319 +GREEK VOCAL NOTATION SYMBOL 50, 119320 +GREEK VOCAL NOTATION SYMBOL 51, 119321 +GREEK VOCAL NOTATION SYMBOL 52, 119322 +GREEK VOCAL NOTATION SYMBOL 53, 119323 +GREEK VOCAL NOTATION SYMBOL 54, 119324 +GREEK INSTRUMENTAL NOTATION SYMBOL 1, 119325 +GREEK INSTRUMENTAL NOTATION SYMBOL 2, 119326 +GREEK INSTRUMENTAL NOTATION SYMBOL 4, 119327 +GREEK INSTRUMENTAL NOTATION SYMBOL 5, 119328 +GREEK INSTRUMENTAL NOTATION SYMBOL 7, 119329 +GREEK INSTRUMENTAL NOTATION SYMBOL 8, 119330 +GREEK INSTRUMENTAL NOTATION SYMBOL 11, 119331 +GREEK INSTRUMENTAL NOTATION SYMBOL 12, 119332 +GREEK INSTRUMENTAL NOTATION SYMBOL 13, 119333 +GREEK INSTRUMENTAL NOTATION SYMBOL 14, 119334 +GREEK INSTRUMENTAL NOTATION SYMBOL 17, 119335 +GREEK INSTRUMENTAL NOTATION SYMBOL 18, 119336 +GREEK INSTRUMENTAL NOTATION SYMBOL 19, 119337 +GREEK INSTRUMENTAL NOTATION SYMBOL 23, 119338 +GREEK INSTRUMENTAL NOTATION SYMBOL 24, 119339 +GREEK INSTRUMENTAL NOTATION SYMBOL 25, 119340 +GREEK INSTRUMENTAL NOTATION SYMBOL 26, 119341 +GREEK INSTRUMENTAL NOTATION SYMBOL 27, 119342 +GREEK INSTRUMENTAL NOTATION SYMBOL 29, 119343 +GREEK INSTRUMENTAL NOTATION SYMBOL 30, 119344 +GREEK INSTRUMENTAL NOTATION SYMBOL 32, 119345 +GREEK INSTRUMENTAL NOTATION SYMBOL 36, 119346 +GREEK INSTRUMENTAL NOTATION SYMBOL 37, 119347 +GREEK INSTRUMENTAL NOTATION SYMBOL 38, 119348 +GREEK INSTRUMENTAL NOTATION SYMBOL 39, 119349 +GREEK INSTRUMENTAL NOTATION SYMBOL 40, 119350 +GREEK INSTRUMENTAL NOTATION SYMBOL 42, 119351 +GREEK INSTRUMENTAL NOTATION SYMBOL 43, 119352 +GREEK INSTRUMENTAL NOTATION SYMBOL 45, 119353 +GREEK INSTRUMENTAL NOTATION SYMBOL 47, 119354 +GREEK INSTRUMENTAL NOTATION SYMBOL 48, 119355 +GREEK INSTRUMENTAL NOTATION SYMBOL 49, 119356 +GREEK INSTRUMENTAL NOTATION SYMBOL 50, 119357 +GREEK INSTRUMENTAL NOTATION SYMBOL 51, 119358 +GREEK INSTRUMENTAL NOTATION SYMBOL 52, 119359 +GREEK INSTRUMENTAL NOTATION SYMBOL 53, 119360 +GREEK INSTRUMENTAL NOTATION SYMBOL 54, 119361 +COMBINING GREEK MUSICAL TRISEME, 119362 +COMBINING GREEK MUSICAL TETRASEME, 119363 +COMBINING GREEK MUSICAL PENTASEME, 119364 +GREEK MUSICAL LEIMMA, 119365 +MONOGRAM FOR EARTH, 119552 +DIGRAM FOR HEAVENLY EARTH, 119553 +DIGRAM FOR HUMAN EARTH, 119554 +DIGRAM FOR EARTHLY HEAVEN, 119555 +DIGRAM FOR EARTHLY HUMAN, 119556 +DIGRAM FOR EARTH, 119557 +TETRAGRAM FOR CENTRE, 119558 +TETRAGRAM FOR FULL CIRCLE, 119559 +TETRAGRAM FOR MIRED, 119560 +TETRAGRAM FOR BARRIER, 119561 +TETRAGRAM FOR KEEPING SMALL, 119562 +TETRAGRAM FOR CONTRARIETY, 119563 +TETRAGRAM FOR ASCENT, 119564 +TETRAGRAM FOR OPPOSITION, 119565 +TETRAGRAM FOR BRANCHING OUT, 119566 +TETRAGRAM FOR DEFECTIVENESS OR DISTORTION, 119567 +TETRAGRAM FOR DIVERGENCE, 119568 +TETRAGRAM FOR YOUTHFULNESS, 119569 +TETRAGRAM FOR INCREASE, 119570 +TETRAGRAM FOR PENETRATION, 119571 +TETRAGRAM FOR REACH, 119572 +TETRAGRAM FOR CONTACT, 119573 +TETRAGRAM FOR HOLDING BACK, 119574 +TETRAGRAM FOR WAITING, 119575 +TETRAGRAM FOR FOLLOWING, 119576 +TETRAGRAM FOR ADVANCE, 119577 +TETRAGRAM FOR RELEASE, 119578 +TETRAGRAM FOR RESISTANCE, 119579 +TETRAGRAM FOR EASE, 119580 +TETRAGRAM FOR JOY, 119581 +TETRAGRAM FOR CONTENTION, 119582 +TETRAGRAM FOR ENDEAVOUR, 119583 +TETRAGRAM FOR DUTIES, 119584 +TETRAGRAM FOR CHANGE, 119585 +TETRAGRAM FOR DECISIVENESS, 119586 +TETRAGRAM FOR BOLD RESOLUTION, 119587 +TETRAGRAM FOR PACKING, 119588 +TETRAGRAM FOR LEGION, 119589 +TETRAGRAM FOR CLOSENESS, 119590 +TETRAGRAM FOR KINSHIP, 119591 +TETRAGRAM FOR GATHERING, 119592 +TETRAGRAM FOR STRENGTH, 119593 +TETRAGRAM FOR PURITY, 119594 +TETRAGRAM FOR FULLNESS, 119595 +TETRAGRAM FOR RESIDENCE, 119596 +TETRAGRAM FOR LAW OR MODEL, 119597 +TETRAGRAM FOR RESPONSE, 119598 +TETRAGRAM FOR GOING TO MEET, 119599 +TETRAGRAM FOR ENCOUNTERS, 119600 +TETRAGRAM FOR STOVE, 119601 +TETRAGRAM FOR GREATNESS, 119602 +TETRAGRAM FOR ENLARGEMENT, 119603 +TETRAGRAM FOR PATTERN, 119604 +TETRAGRAM FOR RITUAL, 119605 +TETRAGRAM FOR FLIGHT, 119606 +TETRAGRAM FOR VASTNESS OR WASTING, 119607 +TETRAGRAM FOR CONSTANCY, 119608 +TETRAGRAM FOR MEASURE, 119609 +TETRAGRAM FOR ETERNITY, 119610 +TETRAGRAM FOR UNITY, 119611 +TETRAGRAM FOR DIMINISHMENT, 119612 +TETRAGRAM FOR CLOSED MOUTH, 119613 +TETRAGRAM FOR GUARDEDNESS, 119614 +TETRAGRAM FOR GATHERING IN, 119615 +TETRAGRAM FOR MASSING, 119616 +TETRAGRAM FOR ACCUMULATION, 119617 +TETRAGRAM FOR EMBELLISHMENT, 119618 +TETRAGRAM FOR DOUBT, 119619 +TETRAGRAM FOR WATCH, 119620 +TETRAGRAM FOR SINKING, 119621 +TETRAGRAM FOR INNER, 119622 +TETRAGRAM FOR DEPARTURE, 119623 +TETRAGRAM FOR DARKENING, 119624 +TETRAGRAM FOR DIMMING, 119625 +TETRAGRAM FOR EXHAUSTION, 119626 +TETRAGRAM FOR SEVERANCE, 119627 +TETRAGRAM FOR STOPPAGE, 119628 +TETRAGRAM FOR HARDNESS, 119629 +TETRAGRAM FOR COMPLETION, 119630 +TETRAGRAM FOR CLOSURE, 119631 +TETRAGRAM FOR FAILURE, 119632 +TETRAGRAM FOR AGGRAVATION, 119633 +TETRAGRAM FOR COMPLIANCE, 119634 +TETRAGRAM FOR ON THE VERGE, 119635 +TETRAGRAM FOR DIFFICULTIES, 119636 +TETRAGRAM FOR LABOURING, 119637 +TETRAGRAM FOR FOSTERING, 119638 +COUNTING ROD UNIT DIGIT ONE, 119648 +COUNTING ROD UNIT DIGIT TWO, 119649 +COUNTING ROD UNIT DIGIT THREE, 119650 +COUNTING ROD UNIT DIGIT FOUR, 119651 +COUNTING ROD UNIT DIGIT FIVE, 119652 +COUNTING ROD UNIT DIGIT SIX, 119653 +COUNTING ROD UNIT DIGIT SEVEN, 119654 +COUNTING ROD UNIT DIGIT EIGHT, 119655 +COUNTING ROD UNIT DIGIT NINE, 119656 +COUNTING ROD TENS DIGIT ONE, 119657 +COUNTING ROD TENS DIGIT TWO, 119658 +COUNTING ROD TENS DIGIT THREE, 119659 +COUNTING ROD TENS DIGIT FOUR, 119660 +COUNTING ROD TENS DIGIT FIVE, 119661 +COUNTING ROD TENS DIGIT SIX, 119662 +COUNTING ROD TENS DIGIT SEVEN, 119663 +COUNTING ROD TENS DIGIT EIGHT, 119664 +COUNTING ROD TENS DIGIT NINE, 119665 +MATHEMATICAL BOLD CAPITAL A, 119808 +MATHEMATICAL BOLD CAPITAL B, 119809 +MATHEMATICAL BOLD CAPITAL C, 119810 +MATHEMATICAL BOLD CAPITAL D, 119811 +MATHEMATICAL BOLD CAPITAL E, 119812 +MATHEMATICAL BOLD CAPITAL F, 119813 +MATHEMATICAL BOLD CAPITAL G, 119814 +MATHEMATICAL BOLD CAPITAL H, 119815 +MATHEMATICAL BOLD CAPITAL I, 119816 +MATHEMATICAL BOLD CAPITAL J, 119817 +MATHEMATICAL BOLD CAPITAL K, 119818 +MATHEMATICAL BOLD CAPITAL L, 119819 +MATHEMATICAL BOLD CAPITAL M, 119820 +MATHEMATICAL BOLD CAPITAL N, 119821 +MATHEMATICAL BOLD CAPITAL O, 119822 +MATHEMATICAL BOLD CAPITAL P, 119823 +MATHEMATICAL BOLD CAPITAL Q, 119824 +MATHEMATICAL BOLD CAPITAL R, 119825 +MATHEMATICAL BOLD CAPITAL S, 119826 +MATHEMATICAL BOLD CAPITAL T, 119827 +MATHEMATICAL BOLD CAPITAL U, 119828 +MATHEMATICAL BOLD CAPITAL V, 119829 +MATHEMATICAL BOLD CAPITAL W, 119830 +MATHEMATICAL BOLD CAPITAL X, 119831 +MATHEMATICAL BOLD CAPITAL Y, 119832 +MATHEMATICAL BOLD CAPITAL Z, 119833 +MATHEMATICAL BOLD SMALL A, 119834 +MATHEMATICAL BOLD SMALL B, 119835 +MATHEMATICAL BOLD SMALL C, 119836 +MATHEMATICAL BOLD SMALL D, 119837 +MATHEMATICAL BOLD SMALL E, 119838 +MATHEMATICAL BOLD SMALL F, 119839 +MATHEMATICAL BOLD SMALL G, 119840 +MATHEMATICAL BOLD SMALL H, 119841 +MATHEMATICAL BOLD SMALL I, 119842 +MATHEMATICAL BOLD SMALL J, 119843 +MATHEMATICAL BOLD SMALL K, 119844 +MATHEMATICAL BOLD SMALL L, 119845 +MATHEMATICAL BOLD SMALL M, 119846 +MATHEMATICAL BOLD SMALL N, 119847 +MATHEMATICAL BOLD SMALL O, 119848 +MATHEMATICAL BOLD SMALL P, 119849 +MATHEMATICAL BOLD SMALL Q, 119850 +MATHEMATICAL BOLD SMALL R, 119851 +MATHEMATICAL BOLD SMALL S, 119852 +MATHEMATICAL BOLD SMALL T, 119853 +MATHEMATICAL BOLD SMALL U, 119854 +MATHEMATICAL BOLD SMALL V, 119855 +MATHEMATICAL BOLD SMALL W, 119856 +MATHEMATICAL BOLD SMALL X, 119857 +MATHEMATICAL BOLD SMALL Y, 119858 +MATHEMATICAL BOLD SMALL Z, 119859 +MATHEMATICAL ITALIC CAPITAL A, 119860 +MATHEMATICAL ITALIC CAPITAL B, 119861 +MATHEMATICAL ITALIC CAPITAL C, 119862 +MATHEMATICAL ITALIC CAPITAL D, 119863 +MATHEMATICAL ITALIC CAPITAL E, 119864 +MATHEMATICAL ITALIC CAPITAL F, 119865 +MATHEMATICAL ITALIC CAPITAL G, 119866 +MATHEMATICAL ITALIC CAPITAL H, 119867 +MATHEMATICAL ITALIC CAPITAL I, 119868 +MATHEMATICAL ITALIC CAPITAL J, 119869 +MATHEMATICAL ITALIC CAPITAL K, 119870 +MATHEMATICAL ITALIC CAPITAL L, 119871 +MATHEMATICAL ITALIC CAPITAL M, 119872 +MATHEMATICAL ITALIC CAPITAL N, 119873 +MATHEMATICAL ITALIC CAPITAL O, 119874 +MATHEMATICAL ITALIC CAPITAL P, 119875 +MATHEMATICAL ITALIC CAPITAL Q, 119876 +MATHEMATICAL ITALIC CAPITAL R, 119877 +MATHEMATICAL ITALIC CAPITAL S, 119878 +MATHEMATICAL ITALIC CAPITAL T, 119879 +MATHEMATICAL ITALIC CAPITAL U, 119880 +MATHEMATICAL ITALIC CAPITAL V, 119881 +MATHEMATICAL ITALIC CAPITAL W, 119882 +MATHEMATICAL ITALIC CAPITAL X, 119883 +MATHEMATICAL ITALIC CAPITAL Y, 119884 +MATHEMATICAL ITALIC CAPITAL Z, 119885 +MATHEMATICAL ITALIC SMALL A, 119886 +MATHEMATICAL ITALIC SMALL B, 119887 +MATHEMATICAL ITALIC SMALL C, 119888 +MATHEMATICAL ITALIC SMALL D, 119889 +MATHEMATICAL ITALIC SMALL E, 119890 +MATHEMATICAL ITALIC SMALL F, 119891 +MATHEMATICAL ITALIC SMALL G, 119892 +MATHEMATICAL ITALIC SMALL I, 119894 +MATHEMATICAL ITALIC SMALL J, 119895 +MATHEMATICAL ITALIC SMALL K, 119896 +MATHEMATICAL ITALIC SMALL L, 119897 +MATHEMATICAL ITALIC SMALL M, 119898 +MATHEMATICAL ITALIC SMALL N, 119899 +MATHEMATICAL ITALIC SMALL O, 119900 +MATHEMATICAL ITALIC SMALL P, 119901 +MATHEMATICAL ITALIC SMALL Q, 119902 +MATHEMATICAL ITALIC SMALL R, 119903 +MATHEMATICAL ITALIC SMALL S, 119904 +MATHEMATICAL ITALIC SMALL T, 119905 +MATHEMATICAL ITALIC SMALL U, 119906 +MATHEMATICAL ITALIC SMALL V, 119907 +MATHEMATICAL ITALIC SMALL W, 119908 +MATHEMATICAL ITALIC SMALL X, 119909 +MATHEMATICAL ITALIC SMALL Y, 119910 +MATHEMATICAL ITALIC SMALL Z, 119911 +MATHEMATICAL BOLD ITALIC CAPITAL A, 119912 +MATHEMATICAL BOLD ITALIC CAPITAL B, 119913 +MATHEMATICAL BOLD ITALIC CAPITAL C, 119914 +MATHEMATICAL BOLD ITALIC CAPITAL D, 119915 +MATHEMATICAL BOLD ITALIC CAPITAL E, 119916 +MATHEMATICAL BOLD ITALIC CAPITAL F, 119917 +MATHEMATICAL BOLD ITALIC CAPITAL G, 119918 +MATHEMATICAL BOLD ITALIC CAPITAL H, 119919 +MATHEMATICAL BOLD ITALIC CAPITAL I, 119920 +MATHEMATICAL BOLD ITALIC CAPITAL J, 119921 +MATHEMATICAL BOLD ITALIC CAPITAL K, 119922 +MATHEMATICAL BOLD ITALIC CAPITAL L, 119923 +MATHEMATICAL BOLD ITALIC CAPITAL M, 119924 +MATHEMATICAL BOLD ITALIC CAPITAL N, 119925 +MATHEMATICAL BOLD ITALIC CAPITAL O, 119926 +MATHEMATICAL BOLD ITALIC CAPITAL P, 119927 +MATHEMATICAL BOLD ITALIC CAPITAL Q, 119928 +MATHEMATICAL BOLD ITALIC CAPITAL R, 119929 +MATHEMATICAL BOLD ITALIC CAPITAL S, 119930 +MATHEMATICAL BOLD ITALIC CAPITAL T, 119931 +MATHEMATICAL BOLD ITALIC CAPITAL U, 119932 +MATHEMATICAL BOLD ITALIC CAPITAL V, 119933 +MATHEMATICAL BOLD ITALIC CAPITAL W, 119934 +MATHEMATICAL BOLD ITALIC CAPITAL X, 119935 +MATHEMATICAL BOLD ITALIC CAPITAL Y, 119936 +MATHEMATICAL BOLD ITALIC CAPITAL Z, 119937 +MATHEMATICAL BOLD ITALIC SMALL A, 119938 +MATHEMATICAL BOLD ITALIC SMALL B, 119939 +MATHEMATICAL BOLD ITALIC SMALL C, 119940 +MATHEMATICAL BOLD ITALIC SMALL D, 119941 +MATHEMATICAL BOLD ITALIC SMALL E, 119942 +MATHEMATICAL BOLD ITALIC SMALL F, 119943 +MATHEMATICAL BOLD ITALIC SMALL G, 119944 +MATHEMATICAL BOLD ITALIC SMALL H, 119945 +MATHEMATICAL BOLD ITALIC SMALL I, 119946 +MATHEMATICAL BOLD ITALIC SMALL J, 119947 +MATHEMATICAL BOLD ITALIC SMALL K, 119948 +MATHEMATICAL BOLD ITALIC SMALL L, 119949 +MATHEMATICAL BOLD ITALIC SMALL M, 119950 +MATHEMATICAL BOLD ITALIC SMALL N, 119951 +MATHEMATICAL BOLD ITALIC SMALL O, 119952 +MATHEMATICAL BOLD ITALIC SMALL P, 119953 +MATHEMATICAL BOLD ITALIC SMALL Q, 119954 +MATHEMATICAL BOLD ITALIC SMALL R, 119955 +MATHEMATICAL BOLD ITALIC SMALL S, 119956 +MATHEMATICAL BOLD ITALIC SMALL T, 119957 +MATHEMATICAL BOLD ITALIC SMALL U, 119958 +MATHEMATICAL BOLD ITALIC SMALL V, 119959 +MATHEMATICAL BOLD ITALIC SMALL W, 119960 +MATHEMATICAL BOLD ITALIC SMALL X, 119961 +MATHEMATICAL BOLD ITALIC SMALL Y, 119962 +MATHEMATICAL BOLD ITALIC SMALL Z, 119963 +MATHEMATICAL SCRIPT CAPITAL A, 119964 +MATHEMATICAL SCRIPT CAPITAL C, 119966 +MATHEMATICAL SCRIPT CAPITAL D, 119967 +MATHEMATICAL SCRIPT CAPITAL G, 119970 +MATHEMATICAL SCRIPT CAPITAL J, 119973 +MATHEMATICAL SCRIPT CAPITAL K, 119974 +MATHEMATICAL SCRIPT CAPITAL N, 119977 +MATHEMATICAL SCRIPT CAPITAL O, 119978 +MATHEMATICAL SCRIPT CAPITAL P, 119979 +MATHEMATICAL SCRIPT CAPITAL Q, 119980 +MATHEMATICAL SCRIPT CAPITAL S, 119982 +MATHEMATICAL SCRIPT CAPITAL T, 119983 +MATHEMATICAL SCRIPT CAPITAL U, 119984 +MATHEMATICAL SCRIPT CAPITAL V, 119985 +MATHEMATICAL SCRIPT CAPITAL W, 119986 +MATHEMATICAL SCRIPT CAPITAL X, 119987 +MATHEMATICAL SCRIPT CAPITAL Y, 119988 +MATHEMATICAL SCRIPT CAPITAL Z, 119989 +MATHEMATICAL SCRIPT SMALL A, 119990 +MATHEMATICAL SCRIPT SMALL B, 119991 +MATHEMATICAL SCRIPT SMALL C, 119992 +MATHEMATICAL SCRIPT SMALL D, 119993 +MATHEMATICAL SCRIPT SMALL F, 119995 +MATHEMATICAL SCRIPT SMALL H, 119997 +MATHEMATICAL SCRIPT SMALL I, 119998 +MATHEMATICAL SCRIPT SMALL J, 119999 +MATHEMATICAL SCRIPT SMALL K, 120000 +MATHEMATICAL SCRIPT SMALL L, 120001 +MATHEMATICAL SCRIPT SMALL M, 120002 +MATHEMATICAL SCRIPT SMALL N, 120003 +MATHEMATICAL SCRIPT SMALL P, 120005 +MATHEMATICAL SCRIPT SMALL Q, 120006 +MATHEMATICAL SCRIPT SMALL R, 120007 +MATHEMATICAL SCRIPT SMALL S, 120008 +MATHEMATICAL SCRIPT SMALL T, 120009 +MATHEMATICAL SCRIPT SMALL U, 120010 +MATHEMATICAL SCRIPT SMALL V, 120011 +MATHEMATICAL SCRIPT SMALL W, 120012 +MATHEMATICAL SCRIPT SMALL X, 120013 +MATHEMATICAL SCRIPT SMALL Y, 120014 +MATHEMATICAL SCRIPT SMALL Z, 120015 +MATHEMATICAL BOLD SCRIPT CAPITAL A, 120016 +MATHEMATICAL BOLD SCRIPT CAPITAL B, 120017 +MATHEMATICAL BOLD SCRIPT CAPITAL C, 120018 +MATHEMATICAL BOLD SCRIPT CAPITAL D, 120019 +MATHEMATICAL BOLD SCRIPT CAPITAL E, 120020 +MATHEMATICAL BOLD SCRIPT CAPITAL F, 120021 +MATHEMATICAL BOLD SCRIPT CAPITAL G, 120022 +MATHEMATICAL BOLD SCRIPT CAPITAL H, 120023 +MATHEMATICAL BOLD SCRIPT CAPITAL I, 120024 +MATHEMATICAL BOLD SCRIPT CAPITAL J, 120025 +MATHEMATICAL BOLD SCRIPT CAPITAL K, 120026 +MATHEMATICAL BOLD SCRIPT CAPITAL L, 120027 +MATHEMATICAL BOLD SCRIPT CAPITAL M, 120028 +MATHEMATICAL BOLD SCRIPT CAPITAL N, 120029 +MATHEMATICAL BOLD SCRIPT CAPITAL O, 120030 +MATHEMATICAL BOLD SCRIPT CAPITAL P, 120031 +MATHEMATICAL BOLD SCRIPT CAPITAL Q, 120032 +MATHEMATICAL BOLD SCRIPT CAPITAL R, 120033 +MATHEMATICAL BOLD SCRIPT CAPITAL S, 120034 +MATHEMATICAL BOLD SCRIPT CAPITAL T, 120035 +MATHEMATICAL BOLD SCRIPT CAPITAL U, 120036 +MATHEMATICAL BOLD SCRIPT CAPITAL V, 120037 +MATHEMATICAL BOLD SCRIPT CAPITAL W, 120038 +MATHEMATICAL BOLD SCRIPT CAPITAL X, 120039 +MATHEMATICAL BOLD SCRIPT CAPITAL Y, 120040 +MATHEMATICAL BOLD SCRIPT CAPITAL Z, 120041 +MATHEMATICAL BOLD SCRIPT SMALL A, 120042 +MATHEMATICAL BOLD SCRIPT SMALL B, 120043 +MATHEMATICAL BOLD SCRIPT SMALL C, 120044 +MATHEMATICAL BOLD SCRIPT SMALL D, 120045 +MATHEMATICAL BOLD SCRIPT SMALL E, 120046 +MATHEMATICAL BOLD SCRIPT SMALL F, 120047 +MATHEMATICAL BOLD SCRIPT SMALL G, 120048 +MATHEMATICAL BOLD SCRIPT SMALL H, 120049 +MATHEMATICAL BOLD SCRIPT SMALL I, 120050 +MATHEMATICAL BOLD SCRIPT SMALL J, 120051 +MATHEMATICAL BOLD SCRIPT SMALL K, 120052 +MATHEMATICAL BOLD SCRIPT SMALL L, 120053 +MATHEMATICAL BOLD SCRIPT SMALL M, 120054 +MATHEMATICAL BOLD SCRIPT SMALL N, 120055 +MATHEMATICAL BOLD SCRIPT SMALL O, 120056 +MATHEMATICAL BOLD SCRIPT SMALL P, 120057 +MATHEMATICAL BOLD SCRIPT SMALL Q, 120058 +MATHEMATICAL BOLD SCRIPT SMALL R, 120059 +MATHEMATICAL BOLD SCRIPT SMALL S, 120060 +MATHEMATICAL BOLD SCRIPT SMALL T, 120061 +MATHEMATICAL BOLD SCRIPT SMALL U, 120062 +MATHEMATICAL BOLD SCRIPT SMALL V, 120063 +MATHEMATICAL BOLD SCRIPT SMALL W, 120064 +MATHEMATICAL BOLD SCRIPT SMALL X, 120065 +MATHEMATICAL BOLD SCRIPT SMALL Y, 120066 +MATHEMATICAL BOLD SCRIPT SMALL Z, 120067 +MATHEMATICAL FRAKTUR CAPITAL A, 120068 +MATHEMATICAL FRAKTUR CAPITAL B, 120069 +MATHEMATICAL FRAKTUR CAPITAL D, 120071 +MATHEMATICAL FRAKTUR CAPITAL E, 120072 +MATHEMATICAL FRAKTUR CAPITAL F, 120073 +MATHEMATICAL FRAKTUR CAPITAL G, 120074 +MATHEMATICAL FRAKTUR CAPITAL J, 120077 +MATHEMATICAL FRAKTUR CAPITAL K, 120078 +MATHEMATICAL FRAKTUR CAPITAL L, 120079 +MATHEMATICAL FRAKTUR CAPITAL M, 120080 +MATHEMATICAL FRAKTUR CAPITAL N, 120081 +MATHEMATICAL FRAKTUR CAPITAL O, 120082 +MATHEMATICAL FRAKTUR CAPITAL P, 120083 +MATHEMATICAL FRAKTUR CAPITAL Q, 120084 +MATHEMATICAL FRAKTUR CAPITAL S, 120086 +MATHEMATICAL FRAKTUR CAPITAL T, 120087 +MATHEMATICAL FRAKTUR CAPITAL U, 120088 +MATHEMATICAL FRAKTUR CAPITAL V, 120089 +MATHEMATICAL FRAKTUR CAPITAL W, 120090 +MATHEMATICAL FRAKTUR CAPITAL X, 120091 +MATHEMATICAL FRAKTUR CAPITAL Y, 120092 +MATHEMATICAL FRAKTUR SMALL A, 120094 +MATHEMATICAL FRAKTUR SMALL B, 120095 +MATHEMATICAL FRAKTUR SMALL C, 120096 +MATHEMATICAL FRAKTUR SMALL D, 120097 +MATHEMATICAL FRAKTUR SMALL E, 120098 +MATHEMATICAL FRAKTUR SMALL F, 120099 +MATHEMATICAL FRAKTUR SMALL G, 120100 +MATHEMATICAL FRAKTUR SMALL H, 120101 +MATHEMATICAL FRAKTUR SMALL I, 120102 +MATHEMATICAL FRAKTUR SMALL J, 120103 +MATHEMATICAL FRAKTUR SMALL K, 120104 +MATHEMATICAL FRAKTUR SMALL L, 120105 +MATHEMATICAL FRAKTUR SMALL M, 120106 +MATHEMATICAL FRAKTUR SMALL N, 120107 +MATHEMATICAL FRAKTUR SMALL O, 120108 +MATHEMATICAL FRAKTUR SMALL P, 120109 +MATHEMATICAL FRAKTUR SMALL Q, 120110 +MATHEMATICAL FRAKTUR SMALL R, 120111 +MATHEMATICAL FRAKTUR SMALL S, 120112 +MATHEMATICAL FRAKTUR SMALL T, 120113 +MATHEMATICAL FRAKTUR SMALL U, 120114 +MATHEMATICAL FRAKTUR SMALL V, 120115 +MATHEMATICAL FRAKTUR SMALL W, 120116 +MATHEMATICAL FRAKTUR SMALL X, 120117 +MATHEMATICAL FRAKTUR SMALL Y, 120118 +MATHEMATICAL FRAKTUR SMALL Z, 120119 +MATHEMATICAL DOUBLE STRUCK CAPITAL A, 120120 +MATHEMATICAL DOUBLE STRUCK CAPITAL B, 120121 +MATHEMATICAL DOUBLE STRUCK CAPITAL D, 120123 +MATHEMATICAL DOUBLE STRUCK CAPITAL E, 120124 +MATHEMATICAL DOUBLE STRUCK CAPITAL F, 120125 +MATHEMATICAL DOUBLE STRUCK CAPITAL G, 120126 +MATHEMATICAL DOUBLE STRUCK CAPITAL I, 120128 +MATHEMATICAL DOUBLE STRUCK CAPITAL J, 120129 +MATHEMATICAL DOUBLE STRUCK CAPITAL K, 120130 +MATHEMATICAL DOUBLE STRUCK CAPITAL L, 120131 +MATHEMATICAL DOUBLE STRUCK CAPITAL M, 120132 +MATHEMATICAL DOUBLE STRUCK CAPITAL O, 120134 +MATHEMATICAL DOUBLE STRUCK CAPITAL S, 120138 +MATHEMATICAL DOUBLE STRUCK CAPITAL T, 120139 +MATHEMATICAL DOUBLE STRUCK CAPITAL U, 120140 +MATHEMATICAL DOUBLE STRUCK CAPITAL V, 120141 +MATHEMATICAL DOUBLE STRUCK CAPITAL W, 120142 +MATHEMATICAL DOUBLE STRUCK CAPITAL X, 120143 +MATHEMATICAL DOUBLE STRUCK CAPITAL Y, 120144 +MATHEMATICAL DOUBLE STRUCK SMALL A, 120146 +MATHEMATICAL DOUBLE STRUCK SMALL B, 120147 +MATHEMATICAL DOUBLE STRUCK SMALL C, 120148 +MATHEMATICAL DOUBLE STRUCK SMALL D, 120149 +MATHEMATICAL DOUBLE STRUCK SMALL E, 120150 +MATHEMATICAL DOUBLE STRUCK SMALL F, 120151 +MATHEMATICAL DOUBLE STRUCK SMALL G, 120152 +MATHEMATICAL DOUBLE STRUCK SMALL H, 120153 +MATHEMATICAL DOUBLE STRUCK SMALL I, 120154 +MATHEMATICAL DOUBLE STRUCK SMALL J, 120155 +MATHEMATICAL DOUBLE STRUCK SMALL K, 120156 +MATHEMATICAL DOUBLE STRUCK SMALL L, 120157 +MATHEMATICAL DOUBLE STRUCK SMALL M, 120158 +MATHEMATICAL DOUBLE STRUCK SMALL N, 120159 +MATHEMATICAL DOUBLE STRUCK SMALL O, 120160 +MATHEMATICAL DOUBLE STRUCK SMALL P, 120161 +MATHEMATICAL DOUBLE STRUCK SMALL Q, 120162 +MATHEMATICAL DOUBLE STRUCK SMALL R, 120163 +MATHEMATICAL DOUBLE STRUCK SMALL S, 120164 +MATHEMATICAL DOUBLE STRUCK SMALL T, 120165 +MATHEMATICAL DOUBLE STRUCK SMALL U, 120166 +MATHEMATICAL DOUBLE STRUCK SMALL V, 120167 +MATHEMATICAL DOUBLE STRUCK SMALL W, 120168 +MATHEMATICAL DOUBLE STRUCK SMALL X, 120169 +MATHEMATICAL DOUBLE STRUCK SMALL Y, 120170 +MATHEMATICAL DOUBLE STRUCK SMALL Z, 120171 +MATHEMATICAL BOLD FRAKTUR CAPITAL A, 120172 +MATHEMATICAL BOLD FRAKTUR CAPITAL B, 120173 +MATHEMATICAL BOLD FRAKTUR CAPITAL C, 120174 +MATHEMATICAL BOLD FRAKTUR CAPITAL D, 120175 +MATHEMATICAL BOLD FRAKTUR CAPITAL E, 120176 +MATHEMATICAL BOLD FRAKTUR CAPITAL F, 120177 +MATHEMATICAL BOLD FRAKTUR CAPITAL G, 120178 +MATHEMATICAL BOLD FRAKTUR CAPITAL H, 120179 +MATHEMATICAL BOLD FRAKTUR CAPITAL I, 120180 +MATHEMATICAL BOLD FRAKTUR CAPITAL J, 120181 +MATHEMATICAL BOLD FRAKTUR CAPITAL K, 120182 +MATHEMATICAL BOLD FRAKTUR CAPITAL L, 120183 +MATHEMATICAL BOLD FRAKTUR CAPITAL M, 120184 +MATHEMATICAL BOLD FRAKTUR CAPITAL N, 120185 +MATHEMATICAL BOLD FRAKTUR CAPITAL O, 120186 +MATHEMATICAL BOLD FRAKTUR CAPITAL P, 120187 +MATHEMATICAL BOLD FRAKTUR CAPITAL Q, 120188 +MATHEMATICAL BOLD FRAKTUR CAPITAL R, 120189 +MATHEMATICAL BOLD FRAKTUR CAPITAL S, 120190 +MATHEMATICAL BOLD FRAKTUR CAPITAL T, 120191 +MATHEMATICAL BOLD FRAKTUR CAPITAL U, 120192 +MATHEMATICAL BOLD FRAKTUR CAPITAL V, 120193 +MATHEMATICAL BOLD FRAKTUR CAPITAL W, 120194 +MATHEMATICAL BOLD FRAKTUR CAPITAL X, 120195 +MATHEMATICAL BOLD FRAKTUR CAPITAL Y, 120196 +MATHEMATICAL BOLD FRAKTUR CAPITAL Z, 120197 +MATHEMATICAL BOLD FRAKTUR SMALL A, 120198 +MATHEMATICAL BOLD FRAKTUR SMALL B, 120199 +MATHEMATICAL BOLD FRAKTUR SMALL C, 120200 +MATHEMATICAL BOLD FRAKTUR SMALL D, 120201 +MATHEMATICAL BOLD FRAKTUR SMALL E, 120202 +MATHEMATICAL BOLD FRAKTUR SMALL F, 120203 +MATHEMATICAL BOLD FRAKTUR SMALL G, 120204 +MATHEMATICAL BOLD FRAKTUR SMALL H, 120205 +MATHEMATICAL BOLD FRAKTUR SMALL I, 120206 +MATHEMATICAL BOLD FRAKTUR SMALL J, 120207 +MATHEMATICAL BOLD FRAKTUR SMALL K, 120208 +MATHEMATICAL BOLD FRAKTUR SMALL L, 120209 +MATHEMATICAL BOLD FRAKTUR SMALL M, 120210 +MATHEMATICAL BOLD FRAKTUR SMALL N, 120211 +MATHEMATICAL BOLD FRAKTUR SMALL O, 120212 +MATHEMATICAL BOLD FRAKTUR SMALL P, 120213 +MATHEMATICAL BOLD FRAKTUR SMALL Q, 120214 +MATHEMATICAL BOLD FRAKTUR SMALL R, 120215 +MATHEMATICAL BOLD FRAKTUR SMALL S, 120216 +MATHEMATICAL BOLD FRAKTUR SMALL T, 120217 +MATHEMATICAL BOLD FRAKTUR SMALL U, 120218 +MATHEMATICAL BOLD FRAKTUR SMALL V, 120219 +MATHEMATICAL BOLD FRAKTUR SMALL W, 120220 +MATHEMATICAL BOLD FRAKTUR SMALL X, 120221 +MATHEMATICAL BOLD FRAKTUR SMALL Y, 120222 +MATHEMATICAL BOLD FRAKTUR SMALL Z, 120223 +MATHEMATICAL SANS SERIF CAPITAL A, 120224 +MATHEMATICAL SANS SERIF CAPITAL B, 120225 +MATHEMATICAL SANS SERIF CAPITAL C, 120226 +MATHEMATICAL SANS SERIF CAPITAL D, 120227 +MATHEMATICAL SANS SERIF CAPITAL E, 120228 +MATHEMATICAL SANS SERIF CAPITAL F, 120229 +MATHEMATICAL SANS SERIF CAPITAL G, 120230 +MATHEMATICAL SANS SERIF CAPITAL H, 120231 +MATHEMATICAL SANS SERIF CAPITAL I, 120232 +MATHEMATICAL SANS SERIF CAPITAL J, 120233 +MATHEMATICAL SANS SERIF CAPITAL K, 120234 +MATHEMATICAL SANS SERIF CAPITAL L, 120235 +MATHEMATICAL SANS SERIF CAPITAL M, 120236 +MATHEMATICAL SANS SERIF CAPITAL N, 120237 +MATHEMATICAL SANS SERIF CAPITAL O, 120238 +MATHEMATICAL SANS SERIF CAPITAL P, 120239 +MATHEMATICAL SANS SERIF CAPITAL Q, 120240 +MATHEMATICAL SANS SERIF CAPITAL R, 120241 +MATHEMATICAL SANS SERIF CAPITAL S, 120242 +MATHEMATICAL SANS SERIF CAPITAL T, 120243 +MATHEMATICAL SANS SERIF CAPITAL U, 120244 +MATHEMATICAL SANS SERIF CAPITAL V, 120245 +MATHEMATICAL SANS SERIF CAPITAL W, 120246 +MATHEMATICAL SANS SERIF CAPITAL X, 120247 +MATHEMATICAL SANS SERIF CAPITAL Y, 120248 +MATHEMATICAL SANS SERIF CAPITAL Z, 120249 +MATHEMATICAL SANS SERIF SMALL A, 120250 +MATHEMATICAL SANS SERIF SMALL B, 120251 +MATHEMATICAL SANS SERIF SMALL C, 120252 +MATHEMATICAL SANS SERIF SMALL D, 120253 +MATHEMATICAL SANS SERIF SMALL E, 120254 +MATHEMATICAL SANS SERIF SMALL F, 120255 +MATHEMATICAL SANS SERIF SMALL G, 120256 +MATHEMATICAL SANS SERIF SMALL H, 120257 +MATHEMATICAL SANS SERIF SMALL I, 120258 +MATHEMATICAL SANS SERIF SMALL J, 120259 +MATHEMATICAL SANS SERIF SMALL K, 120260 +MATHEMATICAL SANS SERIF SMALL L, 120261 +MATHEMATICAL SANS SERIF SMALL M, 120262 +MATHEMATICAL SANS SERIF SMALL N, 120263 +MATHEMATICAL SANS SERIF SMALL O, 120264 +MATHEMATICAL SANS SERIF SMALL P, 120265 +MATHEMATICAL SANS SERIF SMALL Q, 120266 +MATHEMATICAL SANS SERIF SMALL R, 120267 +MATHEMATICAL SANS SERIF SMALL S, 120268 +MATHEMATICAL SANS SERIF SMALL T, 120269 +MATHEMATICAL SANS SERIF SMALL U, 120270 +MATHEMATICAL SANS SERIF SMALL V, 120271 +MATHEMATICAL SANS SERIF SMALL W, 120272 +MATHEMATICAL SANS SERIF SMALL X, 120273 +MATHEMATICAL SANS SERIF SMALL Y, 120274 +MATHEMATICAL SANS SERIF SMALL Z, 120275 +MATHEMATICAL SANS SERIF BOLD CAPITAL A, 120276 +MATHEMATICAL SANS SERIF BOLD CAPITAL B, 120277 +MATHEMATICAL SANS SERIF BOLD CAPITAL C, 120278 +MATHEMATICAL SANS SERIF BOLD CAPITAL D, 120279 +MATHEMATICAL SANS SERIF BOLD CAPITAL E, 120280 +MATHEMATICAL SANS SERIF BOLD CAPITAL F, 120281 +MATHEMATICAL SANS SERIF BOLD CAPITAL G, 120282 +MATHEMATICAL SANS SERIF BOLD CAPITAL H, 120283 +MATHEMATICAL SANS SERIF BOLD CAPITAL I, 120284 +MATHEMATICAL SANS SERIF BOLD CAPITAL J, 120285 +MATHEMATICAL SANS SERIF BOLD CAPITAL K, 120286 +MATHEMATICAL SANS SERIF BOLD CAPITAL L, 120287 +MATHEMATICAL SANS SERIF BOLD CAPITAL M, 120288 +MATHEMATICAL SANS SERIF BOLD CAPITAL N, 120289 +MATHEMATICAL SANS SERIF BOLD CAPITAL O, 120290 +MATHEMATICAL SANS SERIF BOLD CAPITAL P, 120291 +MATHEMATICAL SANS SERIF BOLD CAPITAL Q, 120292 +MATHEMATICAL SANS SERIF BOLD CAPITAL R, 120293 +MATHEMATICAL SANS SERIF BOLD CAPITAL S, 120294 +MATHEMATICAL SANS SERIF BOLD CAPITAL T, 120295 +MATHEMATICAL SANS SERIF BOLD CAPITAL U, 120296 +MATHEMATICAL SANS SERIF BOLD CAPITAL V, 120297 +MATHEMATICAL SANS SERIF BOLD CAPITAL W, 120298 +MATHEMATICAL SANS SERIF BOLD CAPITAL X, 120299 +MATHEMATICAL SANS SERIF BOLD CAPITAL Y, 120300 +MATHEMATICAL SANS SERIF BOLD CAPITAL Z, 120301 +MATHEMATICAL SANS SERIF BOLD SMALL A, 120302 +MATHEMATICAL SANS SERIF BOLD SMALL B, 120303 +MATHEMATICAL SANS SERIF BOLD SMALL C, 120304 +MATHEMATICAL SANS SERIF BOLD SMALL D, 120305 +MATHEMATICAL SANS SERIF BOLD SMALL E, 120306 +MATHEMATICAL SANS SERIF BOLD SMALL F, 120307 +MATHEMATICAL SANS SERIF BOLD SMALL G, 120308 +MATHEMATICAL SANS SERIF BOLD SMALL H, 120309 +MATHEMATICAL SANS SERIF BOLD SMALL I, 120310 +MATHEMATICAL SANS SERIF BOLD SMALL J, 120311 +MATHEMATICAL SANS SERIF BOLD SMALL K, 120312 +MATHEMATICAL SANS SERIF BOLD SMALL L, 120313 +MATHEMATICAL SANS SERIF BOLD SMALL M, 120314 +MATHEMATICAL SANS SERIF BOLD SMALL N, 120315 +MATHEMATICAL SANS SERIF BOLD SMALL O, 120316 +MATHEMATICAL SANS SERIF BOLD SMALL P, 120317 +MATHEMATICAL SANS SERIF BOLD SMALL Q, 120318 +MATHEMATICAL SANS SERIF BOLD SMALL R, 120319 +MATHEMATICAL SANS SERIF BOLD SMALL S, 120320 +MATHEMATICAL SANS SERIF BOLD SMALL T, 120321 +MATHEMATICAL SANS SERIF BOLD SMALL U, 120322 +MATHEMATICAL SANS SERIF BOLD SMALL V, 120323 +MATHEMATICAL SANS SERIF BOLD SMALL W, 120324 +MATHEMATICAL SANS SERIF BOLD SMALL X, 120325 +MATHEMATICAL SANS SERIF BOLD SMALL Y, 120326 +MATHEMATICAL SANS SERIF BOLD SMALL Z, 120327 +MATHEMATICAL SANS SERIF ITALIC CAPITAL A, 120328 +MATHEMATICAL SANS SERIF ITALIC CAPITAL B, 120329 +MATHEMATICAL SANS SERIF ITALIC CAPITAL C, 120330 +MATHEMATICAL SANS SERIF ITALIC CAPITAL D, 120331 +MATHEMATICAL SANS SERIF ITALIC CAPITAL E, 120332 +MATHEMATICAL SANS SERIF ITALIC CAPITAL F, 120333 +MATHEMATICAL SANS SERIF ITALIC CAPITAL G, 120334 +MATHEMATICAL SANS SERIF ITALIC CAPITAL H, 120335 +MATHEMATICAL SANS SERIF ITALIC CAPITAL I, 120336 +MATHEMATICAL SANS SERIF ITALIC CAPITAL J, 120337 +MATHEMATICAL SANS SERIF ITALIC CAPITAL K, 120338 +MATHEMATICAL SANS SERIF ITALIC CAPITAL L, 120339 +MATHEMATICAL SANS SERIF ITALIC CAPITAL M, 120340 +MATHEMATICAL SANS SERIF ITALIC CAPITAL N, 120341 +MATHEMATICAL SANS SERIF ITALIC CAPITAL O, 120342 +MATHEMATICAL SANS SERIF ITALIC CAPITAL P, 120343 +MATHEMATICAL SANS SERIF ITALIC CAPITAL Q, 120344 +MATHEMATICAL SANS SERIF ITALIC CAPITAL R, 120345 +MATHEMATICAL SANS SERIF ITALIC CAPITAL S, 120346 +MATHEMATICAL SANS SERIF ITALIC CAPITAL T, 120347 +MATHEMATICAL SANS SERIF ITALIC CAPITAL U, 120348 +MATHEMATICAL SANS SERIF ITALIC CAPITAL V, 120349 +MATHEMATICAL SANS SERIF ITALIC CAPITAL W, 120350 +MATHEMATICAL SANS SERIF ITALIC CAPITAL X, 120351 +MATHEMATICAL SANS SERIF ITALIC CAPITAL Y, 120352 +MATHEMATICAL SANS SERIF ITALIC CAPITAL Z, 120353 +MATHEMATICAL SANS SERIF ITALIC SMALL A, 120354 +MATHEMATICAL SANS SERIF ITALIC SMALL B, 120355 +MATHEMATICAL SANS SERIF ITALIC SMALL C, 120356 +MATHEMATICAL SANS SERIF ITALIC SMALL D, 120357 +MATHEMATICAL SANS SERIF ITALIC SMALL E, 120358 +MATHEMATICAL SANS SERIF ITALIC SMALL F, 120359 +MATHEMATICAL SANS SERIF ITALIC SMALL G, 120360 +MATHEMATICAL SANS SERIF ITALIC SMALL H, 120361 +MATHEMATICAL SANS SERIF ITALIC SMALL I, 120362 +MATHEMATICAL SANS SERIF ITALIC SMALL J, 120363 +MATHEMATICAL SANS SERIF ITALIC SMALL K, 120364 +MATHEMATICAL SANS SERIF ITALIC SMALL L, 120365 +MATHEMATICAL SANS SERIF ITALIC SMALL M, 120366 +MATHEMATICAL SANS SERIF ITALIC SMALL N, 120367 +MATHEMATICAL SANS SERIF ITALIC SMALL O, 120368 +MATHEMATICAL SANS SERIF ITALIC SMALL P, 120369 +MATHEMATICAL SANS SERIF ITALIC SMALL Q, 120370 +MATHEMATICAL SANS SERIF ITALIC SMALL R, 120371 +MATHEMATICAL SANS SERIF ITALIC SMALL S, 120372 +MATHEMATICAL SANS SERIF ITALIC SMALL T, 120373 +MATHEMATICAL SANS SERIF ITALIC SMALL U, 120374 +MATHEMATICAL SANS SERIF ITALIC SMALL V, 120375 +MATHEMATICAL SANS SERIF ITALIC SMALL W, 120376 +MATHEMATICAL SANS SERIF ITALIC SMALL X, 120377 +MATHEMATICAL SANS SERIF ITALIC SMALL Y, 120378 +MATHEMATICAL SANS SERIF ITALIC SMALL Z, 120379 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL A, 120380 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL B, 120381 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL C, 120382 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL D, 120383 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL E, 120384 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL F, 120385 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL G, 120386 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL H, 120387 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL I, 120388 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL J, 120389 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL K, 120390 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL L, 120391 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL M, 120392 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL N, 120393 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL O, 120394 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL P, 120395 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL Q, 120396 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL R, 120397 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL S, 120398 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL T, 120399 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL U, 120400 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL V, 120401 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL W, 120402 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL X, 120403 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL Y, 120404 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL Z, 120405 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL A, 120406 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL B, 120407 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL C, 120408 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL D, 120409 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL E, 120410 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL F, 120411 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL G, 120412 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL H, 120413 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL I, 120414 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL J, 120415 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL K, 120416 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL L, 120417 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL M, 120418 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL N, 120419 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL O, 120420 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL P, 120421 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL Q, 120422 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL R, 120423 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL S, 120424 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL T, 120425 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL U, 120426 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL V, 120427 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL W, 120428 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL X, 120429 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL Y, 120430 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL Z, 120431 +MATHEMATICAL MONOSPACE CAPITAL A, 120432 +MATHEMATICAL MONOSPACE CAPITAL B, 120433 +MATHEMATICAL MONOSPACE CAPITAL C, 120434 +MATHEMATICAL MONOSPACE CAPITAL D, 120435 +MATHEMATICAL MONOSPACE CAPITAL E, 120436 +MATHEMATICAL MONOSPACE CAPITAL F, 120437 +MATHEMATICAL MONOSPACE CAPITAL G, 120438 +MATHEMATICAL MONOSPACE CAPITAL H, 120439 +MATHEMATICAL MONOSPACE CAPITAL I, 120440 +MATHEMATICAL MONOSPACE CAPITAL J, 120441 +MATHEMATICAL MONOSPACE CAPITAL K, 120442 +MATHEMATICAL MONOSPACE CAPITAL L, 120443 +MATHEMATICAL MONOSPACE CAPITAL M, 120444 +MATHEMATICAL MONOSPACE CAPITAL N, 120445 +MATHEMATICAL MONOSPACE CAPITAL O, 120446 +MATHEMATICAL MONOSPACE CAPITAL P, 120447 +MATHEMATICAL MONOSPACE CAPITAL Q, 120448 +MATHEMATICAL MONOSPACE CAPITAL R, 120449 +MATHEMATICAL MONOSPACE CAPITAL S, 120450 +MATHEMATICAL MONOSPACE CAPITAL T, 120451 +MATHEMATICAL MONOSPACE CAPITAL U, 120452 +MATHEMATICAL MONOSPACE CAPITAL V, 120453 +MATHEMATICAL MONOSPACE CAPITAL W, 120454 +MATHEMATICAL MONOSPACE CAPITAL X, 120455 +MATHEMATICAL MONOSPACE CAPITAL Y, 120456 +MATHEMATICAL MONOSPACE CAPITAL Z, 120457 +MATHEMATICAL MONOSPACE SMALL A, 120458 +MATHEMATICAL MONOSPACE SMALL B, 120459 +MATHEMATICAL MONOSPACE SMALL C, 120460 +MATHEMATICAL MONOSPACE SMALL D, 120461 +MATHEMATICAL MONOSPACE SMALL E, 120462 +MATHEMATICAL MONOSPACE SMALL F, 120463 +MATHEMATICAL MONOSPACE SMALL G, 120464 +MATHEMATICAL MONOSPACE SMALL H, 120465 +MATHEMATICAL MONOSPACE SMALL I, 120466 +MATHEMATICAL MONOSPACE SMALL J, 120467 +MATHEMATICAL MONOSPACE SMALL K, 120468 +MATHEMATICAL MONOSPACE SMALL L, 120469 +MATHEMATICAL MONOSPACE SMALL M, 120470 +MATHEMATICAL MONOSPACE SMALL N, 120471 +MATHEMATICAL MONOSPACE SMALL O, 120472 +MATHEMATICAL MONOSPACE SMALL P, 120473 +MATHEMATICAL MONOSPACE SMALL Q, 120474 +MATHEMATICAL MONOSPACE SMALL R, 120475 +MATHEMATICAL MONOSPACE SMALL S, 120476 +MATHEMATICAL MONOSPACE SMALL T, 120477 +MATHEMATICAL MONOSPACE SMALL U, 120478 +MATHEMATICAL MONOSPACE SMALL V, 120479 +MATHEMATICAL MONOSPACE SMALL W, 120480 +MATHEMATICAL MONOSPACE SMALL X, 120481 +MATHEMATICAL MONOSPACE SMALL Y, 120482 +MATHEMATICAL MONOSPACE SMALL Z, 120483 +MATHEMATICAL ITALIC SMALL DOTLESS I, 120484 +MATHEMATICAL ITALIC SMALL DOTLESS J, 120485 +MATHEMATICAL BOLD CAPITAL ALPHA, 120488 +MATHEMATICAL BOLD CAPITAL BETA, 120489 +MATHEMATICAL BOLD CAPITAL GAMMA, 120490 +MATHEMATICAL BOLD CAPITAL DELTA, 120491 +MATHEMATICAL BOLD CAPITAL EPSILON, 120492 +MATHEMATICAL BOLD CAPITAL ZETA, 120493 +MATHEMATICAL BOLD CAPITAL ETA, 120494 +MATHEMATICAL BOLD CAPITAL THETA, 120495 +MATHEMATICAL BOLD CAPITAL IOTA, 120496 +MATHEMATICAL BOLD CAPITAL KAPPA, 120497 +MATHEMATICAL BOLD CAPITAL LAMDA, 120498 +MATHEMATICAL BOLD CAPITAL MU, 120499 +MATHEMATICAL BOLD CAPITAL NU, 120500 +MATHEMATICAL BOLD CAPITAL XI, 120501 +MATHEMATICAL BOLD CAPITAL OMICRON, 120502 +MATHEMATICAL BOLD CAPITAL PI, 120503 +MATHEMATICAL BOLD CAPITAL RHO, 120504 +MATHEMATICAL BOLD CAPITAL THETA SYMBOL, 120505 +MATHEMATICAL BOLD CAPITAL SIGMA, 120506 +MATHEMATICAL BOLD CAPITAL TAU, 120507 +MATHEMATICAL BOLD CAPITAL UPSILON, 120508 +MATHEMATICAL BOLD CAPITAL PHI, 120509 +MATHEMATICAL BOLD CAPITAL CHI, 120510 +MATHEMATICAL BOLD CAPITAL PSI, 120511 +MATHEMATICAL BOLD CAPITAL OMEGA, 120512 +MATHEMATICAL BOLD NABLA, 120513 +MATHEMATICAL BOLD SMALL ALPHA, 120514 +MATHEMATICAL BOLD SMALL BETA, 120515 +MATHEMATICAL BOLD SMALL GAMMA, 120516 +MATHEMATICAL BOLD SMALL DELTA, 120517 +MATHEMATICAL BOLD SMALL EPSILON, 120518 +MATHEMATICAL BOLD SMALL ZETA, 120519 +MATHEMATICAL BOLD SMALL ETA, 120520 +MATHEMATICAL BOLD SMALL THETA, 120521 +MATHEMATICAL BOLD SMALL IOTA, 120522 +MATHEMATICAL BOLD SMALL KAPPA, 120523 +MATHEMATICAL BOLD SMALL LAMDA, 120524 +MATHEMATICAL BOLD SMALL MU, 120525 +MATHEMATICAL BOLD SMALL NU, 120526 +MATHEMATICAL BOLD SMALL XI, 120527 +MATHEMATICAL BOLD SMALL OMICRON, 120528 +MATHEMATICAL BOLD SMALL PI, 120529 +MATHEMATICAL BOLD SMALL RHO, 120530 +MATHEMATICAL BOLD SMALL FINAL SIGMA, 120531 +MATHEMATICAL BOLD SMALL SIGMA, 120532 +MATHEMATICAL BOLD SMALL TAU, 120533 +MATHEMATICAL BOLD SMALL UPSILON, 120534 +MATHEMATICAL BOLD SMALL PHI, 120535 +MATHEMATICAL BOLD SMALL CHI, 120536 +MATHEMATICAL BOLD SMALL PSI, 120537 +MATHEMATICAL BOLD SMALL OMEGA, 120538 +MATHEMATICAL BOLD PARTIAL DIFFERENTIAL, 120539 +MATHEMATICAL BOLD EPSILON SYMBOL, 120540 +MATHEMATICAL BOLD THETA SYMBOL, 120541 +MATHEMATICAL BOLD KAPPA SYMBOL, 120542 +MATHEMATICAL BOLD PHI SYMBOL, 120543 +MATHEMATICAL BOLD RHO SYMBOL, 120544 +MATHEMATICAL BOLD PI SYMBOL, 120545 +MATHEMATICAL ITALIC CAPITAL ALPHA, 120546 +MATHEMATICAL ITALIC CAPITAL BETA, 120547 +MATHEMATICAL ITALIC CAPITAL GAMMA, 120548 +MATHEMATICAL ITALIC CAPITAL DELTA, 120549 +MATHEMATICAL ITALIC CAPITAL EPSILON, 120550 +MATHEMATICAL ITALIC CAPITAL ZETA, 120551 +MATHEMATICAL ITALIC CAPITAL ETA, 120552 +MATHEMATICAL ITALIC CAPITAL THETA, 120553 +MATHEMATICAL ITALIC CAPITAL IOTA, 120554 +MATHEMATICAL ITALIC CAPITAL KAPPA, 120555 +MATHEMATICAL ITALIC CAPITAL LAMDA, 120556 +MATHEMATICAL ITALIC CAPITAL MU, 120557 +MATHEMATICAL ITALIC CAPITAL NU, 120558 +MATHEMATICAL ITALIC CAPITAL XI, 120559 +MATHEMATICAL ITALIC CAPITAL OMICRON, 120560 +MATHEMATICAL ITALIC CAPITAL PI, 120561 +MATHEMATICAL ITALIC CAPITAL RHO, 120562 +MATHEMATICAL ITALIC CAPITAL THETA SYMBOL, 120563 +MATHEMATICAL ITALIC CAPITAL SIGMA, 120564 +MATHEMATICAL ITALIC CAPITAL TAU, 120565 +MATHEMATICAL ITALIC CAPITAL UPSILON, 120566 +MATHEMATICAL ITALIC CAPITAL PHI, 120567 +MATHEMATICAL ITALIC CAPITAL CHI, 120568 +MATHEMATICAL ITALIC CAPITAL PSI, 120569 +MATHEMATICAL ITALIC CAPITAL OMEGA, 120570 +MATHEMATICAL ITALIC NABLA, 120571 +MATHEMATICAL ITALIC SMALL ALPHA, 120572 +MATHEMATICAL ITALIC SMALL BETA, 120573 +MATHEMATICAL ITALIC SMALL GAMMA, 120574 +MATHEMATICAL ITALIC SMALL DELTA, 120575 +MATHEMATICAL ITALIC SMALL EPSILON, 120576 +MATHEMATICAL ITALIC SMALL ZETA, 120577 +MATHEMATICAL ITALIC SMALL ETA, 120578 +MATHEMATICAL ITALIC SMALL THETA, 120579 +MATHEMATICAL ITALIC SMALL IOTA, 120580 +MATHEMATICAL ITALIC SMALL KAPPA, 120581 +MATHEMATICAL ITALIC SMALL LAMDA, 120582 +MATHEMATICAL ITALIC SMALL MU, 120583 +MATHEMATICAL ITALIC SMALL NU, 120584 +MATHEMATICAL ITALIC SMALL XI, 120585 +MATHEMATICAL ITALIC SMALL OMICRON, 120586 +MATHEMATICAL ITALIC SMALL PI, 120587 +MATHEMATICAL ITALIC SMALL RHO, 120588 +MATHEMATICAL ITALIC SMALL FINAL SIGMA, 120589 +MATHEMATICAL ITALIC SMALL SIGMA, 120590 +MATHEMATICAL ITALIC SMALL TAU, 120591 +MATHEMATICAL ITALIC SMALL UPSILON, 120592 +MATHEMATICAL ITALIC SMALL PHI, 120593 +MATHEMATICAL ITALIC SMALL CHI, 120594 +MATHEMATICAL ITALIC SMALL PSI, 120595 +MATHEMATICAL ITALIC SMALL OMEGA, 120596 +MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL, 120597 +MATHEMATICAL ITALIC EPSILON SYMBOL, 120598 +MATHEMATICAL ITALIC THETA SYMBOL, 120599 +MATHEMATICAL ITALIC KAPPA SYMBOL, 120600 +MATHEMATICAL ITALIC PHI SYMBOL, 120601 +MATHEMATICAL ITALIC RHO SYMBOL, 120602 +MATHEMATICAL ITALIC PI SYMBOL, 120603 +MATHEMATICAL BOLD ITALIC CAPITAL ALPHA, 120604 +MATHEMATICAL BOLD ITALIC CAPITAL BETA, 120605 +MATHEMATICAL BOLD ITALIC CAPITAL GAMMA, 120606 +MATHEMATICAL BOLD ITALIC CAPITAL DELTA, 120607 +MATHEMATICAL BOLD ITALIC CAPITAL EPSILON, 120608 +MATHEMATICAL BOLD ITALIC CAPITAL ZETA, 120609 +MATHEMATICAL BOLD ITALIC CAPITAL ETA, 120610 +MATHEMATICAL BOLD ITALIC CAPITAL THETA, 120611 +MATHEMATICAL BOLD ITALIC CAPITAL IOTA, 120612 +MATHEMATICAL BOLD ITALIC CAPITAL KAPPA, 120613 +MATHEMATICAL BOLD ITALIC CAPITAL LAMDA, 120614 +MATHEMATICAL BOLD ITALIC CAPITAL MU, 120615 +MATHEMATICAL BOLD ITALIC CAPITAL NU, 120616 +MATHEMATICAL BOLD ITALIC CAPITAL XI, 120617 +MATHEMATICAL BOLD ITALIC CAPITAL OMICRON, 120618 +MATHEMATICAL BOLD ITALIC CAPITAL PI, 120619 +MATHEMATICAL BOLD ITALIC CAPITAL RHO, 120620 +MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL, 120621 +MATHEMATICAL BOLD ITALIC CAPITAL SIGMA, 120622 +MATHEMATICAL BOLD ITALIC CAPITAL TAU, 120623 +MATHEMATICAL BOLD ITALIC CAPITAL UPSILON, 120624 +MATHEMATICAL BOLD ITALIC CAPITAL PHI, 120625 +MATHEMATICAL BOLD ITALIC CAPITAL CHI, 120626 +MATHEMATICAL BOLD ITALIC CAPITAL PSI, 120627 +MATHEMATICAL BOLD ITALIC CAPITAL OMEGA, 120628 +MATHEMATICAL BOLD ITALIC NABLA, 120629 +MATHEMATICAL BOLD ITALIC SMALL ALPHA, 120630 +MATHEMATICAL BOLD ITALIC SMALL BETA, 120631 +MATHEMATICAL BOLD ITALIC SMALL GAMMA, 120632 +MATHEMATICAL BOLD ITALIC SMALL DELTA, 120633 +MATHEMATICAL BOLD ITALIC SMALL EPSILON, 120634 +MATHEMATICAL BOLD ITALIC SMALL ZETA, 120635 +MATHEMATICAL BOLD ITALIC SMALL ETA, 120636 +MATHEMATICAL BOLD ITALIC SMALL THETA, 120637 +MATHEMATICAL BOLD ITALIC SMALL IOTA, 120638 +MATHEMATICAL BOLD ITALIC SMALL KAPPA, 120639 +MATHEMATICAL BOLD ITALIC SMALL LAMDA, 120640 +MATHEMATICAL BOLD ITALIC SMALL MU, 120641 +MATHEMATICAL BOLD ITALIC SMALL NU, 120642 +MATHEMATICAL BOLD ITALIC SMALL XI, 120643 +MATHEMATICAL BOLD ITALIC SMALL OMICRON, 120644 +MATHEMATICAL BOLD ITALIC SMALL PI, 120645 +MATHEMATICAL BOLD ITALIC SMALL RHO, 120646 +MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA, 120647 +MATHEMATICAL BOLD ITALIC SMALL SIGMA, 120648 +MATHEMATICAL BOLD ITALIC SMALL TAU, 120649 +MATHEMATICAL BOLD ITALIC SMALL UPSILON, 120650 +MATHEMATICAL BOLD ITALIC SMALL PHI, 120651 +MATHEMATICAL BOLD ITALIC SMALL CHI, 120652 +MATHEMATICAL BOLD ITALIC SMALL PSI, 120653 +MATHEMATICAL BOLD ITALIC SMALL OMEGA, 120654 +MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL, 120655 +MATHEMATICAL BOLD ITALIC EPSILON SYMBOL, 120656 +MATHEMATICAL BOLD ITALIC THETA SYMBOL, 120657 +MATHEMATICAL BOLD ITALIC KAPPA SYMBOL, 120658 +MATHEMATICAL BOLD ITALIC PHI SYMBOL, 120659 +MATHEMATICAL BOLD ITALIC RHO SYMBOL, 120660 +MATHEMATICAL BOLD ITALIC PI SYMBOL, 120661 +MATHEMATICAL SANS SERIF BOLD CAPITAL ALPHA, 120662 +MATHEMATICAL SANS SERIF BOLD CAPITAL BETA, 120663 +MATHEMATICAL SANS SERIF BOLD CAPITAL GAMMA, 120664 +MATHEMATICAL SANS SERIF BOLD CAPITAL DELTA, 120665 +MATHEMATICAL SANS SERIF BOLD CAPITAL EPSILON, 120666 +MATHEMATICAL SANS SERIF BOLD CAPITAL ZETA, 120667 +MATHEMATICAL SANS SERIF BOLD CAPITAL ETA, 120668 +MATHEMATICAL SANS SERIF BOLD CAPITAL THETA, 120669 +MATHEMATICAL SANS SERIF BOLD CAPITAL IOTA, 120670 +MATHEMATICAL SANS SERIF BOLD CAPITAL KAPPA, 120671 +MATHEMATICAL SANS SERIF BOLD CAPITAL LAMDA, 120672 +MATHEMATICAL SANS SERIF BOLD CAPITAL MU, 120673 +MATHEMATICAL SANS SERIF BOLD CAPITAL NU, 120674 +MATHEMATICAL SANS SERIF BOLD CAPITAL XI, 120675 +MATHEMATICAL SANS SERIF BOLD CAPITAL OMICRON, 120676 +MATHEMATICAL SANS SERIF BOLD CAPITAL PI, 120677 +MATHEMATICAL SANS SERIF BOLD CAPITAL RHO, 120678 +MATHEMATICAL SANS SERIF BOLD CAPITAL THETA SYMBOL, 120679 +MATHEMATICAL SANS SERIF BOLD CAPITAL SIGMA, 120680 +MATHEMATICAL SANS SERIF BOLD CAPITAL TAU, 120681 +MATHEMATICAL SANS SERIF BOLD CAPITAL UPSILON, 120682 +MATHEMATICAL SANS SERIF BOLD CAPITAL PHI, 120683 +MATHEMATICAL SANS SERIF BOLD CAPITAL CHI, 120684 +MATHEMATICAL SANS SERIF BOLD CAPITAL PSI, 120685 +MATHEMATICAL SANS SERIF BOLD CAPITAL OMEGA, 120686 +MATHEMATICAL SANS SERIF BOLD NABLA, 120687 +MATHEMATICAL SANS SERIF BOLD SMALL ALPHA, 120688 +MATHEMATICAL SANS SERIF BOLD SMALL BETA, 120689 +MATHEMATICAL SANS SERIF BOLD SMALL GAMMA, 120690 +MATHEMATICAL SANS SERIF BOLD SMALL DELTA, 120691 +MATHEMATICAL SANS SERIF BOLD SMALL EPSILON, 120692 +MATHEMATICAL SANS SERIF BOLD SMALL ZETA, 120693 +MATHEMATICAL SANS SERIF BOLD SMALL ETA, 120694 +MATHEMATICAL SANS SERIF BOLD SMALL THETA, 120695 +MATHEMATICAL SANS SERIF BOLD SMALL IOTA, 120696 +MATHEMATICAL SANS SERIF BOLD SMALL KAPPA, 120697 +MATHEMATICAL SANS SERIF BOLD SMALL LAMDA, 120698 +MATHEMATICAL SANS SERIF BOLD SMALL MU, 120699 +MATHEMATICAL SANS SERIF BOLD SMALL NU, 120700 +MATHEMATICAL SANS SERIF BOLD SMALL XI, 120701 +MATHEMATICAL SANS SERIF BOLD SMALL OMICRON, 120702 +MATHEMATICAL SANS SERIF BOLD SMALL PI, 120703 +MATHEMATICAL SANS SERIF BOLD SMALL RHO, 120704 +MATHEMATICAL SANS SERIF BOLD SMALL FINAL SIGMA, 120705 +MATHEMATICAL SANS SERIF BOLD SMALL SIGMA, 120706 +MATHEMATICAL SANS SERIF BOLD SMALL TAU, 120707 +MATHEMATICAL SANS SERIF BOLD SMALL UPSILON, 120708 +MATHEMATICAL SANS SERIF BOLD SMALL PHI, 120709 +MATHEMATICAL SANS SERIF BOLD SMALL CHI, 120710 +MATHEMATICAL SANS SERIF BOLD SMALL PSI, 120711 +MATHEMATICAL SANS SERIF BOLD SMALL OMEGA, 120712 +MATHEMATICAL SANS SERIF BOLD PARTIAL DIFFERENTIAL, 120713 +MATHEMATICAL SANS SERIF BOLD EPSILON SYMBOL, 120714 +MATHEMATICAL SANS SERIF BOLD THETA SYMBOL, 120715 +MATHEMATICAL SANS SERIF BOLD KAPPA SYMBOL, 120716 +MATHEMATICAL SANS SERIF BOLD PHI SYMBOL, 120717 +MATHEMATICAL SANS SERIF BOLD RHO SYMBOL, 120718 +MATHEMATICAL SANS SERIF BOLD PI SYMBOL, 120719 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL ALPHA, 120720 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL BETA, 120721 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL GAMMA, 120722 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL DELTA, 120723 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL EPSILON, 120724 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL ZETA, 120725 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL ETA, 120726 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL THETA, 120727 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL IOTA, 120728 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL KAPPA, 120729 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL LAMDA, 120730 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL MU, 120731 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL NU, 120732 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL XI, 120733 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL OMICRON, 120734 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL PI, 120735 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL RHO, 120736 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL THETA SYMBOL, 120737 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL SIGMA, 120738 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL TAU, 120739 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL UPSILON, 120740 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL PHI, 120741 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL CHI, 120742 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL PSI, 120743 +MATHEMATICAL SANS SERIF BOLD ITALIC CAPITAL OMEGA, 120744 +MATHEMATICAL SANS SERIF BOLD ITALIC NABLA, 120745 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL ALPHA, 120746 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL BETA, 120747 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL GAMMA, 120748 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL DELTA, 120749 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL EPSILON, 120750 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL ZETA, 120751 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL ETA, 120752 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL THETA, 120753 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL IOTA, 120754 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL KAPPA, 120755 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL LAMDA, 120756 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL MU, 120757 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL NU, 120758 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL XI, 120759 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL OMICRON, 120760 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL PI, 120761 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL RHO, 120762 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL FINAL SIGMA, 120763 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL SIGMA, 120764 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL TAU, 120765 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL UPSILON, 120766 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL PHI, 120767 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL CHI, 120768 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL PSI, 120769 +MATHEMATICAL SANS SERIF BOLD ITALIC SMALL OMEGA, 120770 +MATHEMATICAL SANS SERIF BOLD ITALIC PARTIAL DIFFERENTIAL, 120771 +MATHEMATICAL SANS SERIF BOLD ITALIC EPSILON SYMBOL, 120772 +MATHEMATICAL SANS SERIF BOLD ITALIC THETA SYMBOL, 120773 +MATHEMATICAL SANS SERIF BOLD ITALIC KAPPA SYMBOL, 120774 +MATHEMATICAL SANS SERIF BOLD ITALIC PHI SYMBOL, 120775 +MATHEMATICAL SANS SERIF BOLD ITALIC RHO SYMBOL, 120776 +MATHEMATICAL SANS SERIF BOLD ITALIC PI SYMBOL, 120777 +MATHEMATICAL BOLD CAPITAL DIGAMMA, 120778 +MATHEMATICAL BOLD SMALL DIGAMMA, 120779 +MATHEMATICAL BOLD DIGIT ZERO, 120782 +MATHEMATICAL BOLD DIGIT ONE, 120783 +MATHEMATICAL BOLD DIGIT TWO, 120784 +MATHEMATICAL BOLD DIGIT THREE, 120785 +MATHEMATICAL BOLD DIGIT FOUR, 120786 +MATHEMATICAL BOLD DIGIT FIVE, 120787 +MATHEMATICAL BOLD DIGIT SIX, 120788 +MATHEMATICAL BOLD DIGIT SEVEN, 120789 +MATHEMATICAL BOLD DIGIT EIGHT, 120790 +MATHEMATICAL BOLD DIGIT NINE, 120791 +MATHEMATICAL DOUBLE STRUCK DIGIT ZERO, 120792 +MATHEMATICAL DOUBLE STRUCK DIGIT ONE, 120793 +MATHEMATICAL DOUBLE STRUCK DIGIT TWO, 120794 +MATHEMATICAL DOUBLE STRUCK DIGIT THREE, 120795 +MATHEMATICAL DOUBLE STRUCK DIGIT FOUR, 120796 +MATHEMATICAL DOUBLE STRUCK DIGIT FIVE, 120797 +MATHEMATICAL DOUBLE STRUCK DIGIT SIX, 120798 +MATHEMATICAL DOUBLE STRUCK DIGIT SEVEN, 120799 +MATHEMATICAL DOUBLE STRUCK DIGIT EIGHT, 120800 +MATHEMATICAL DOUBLE STRUCK DIGIT NINE, 120801 +MATHEMATICAL SANS SERIF DIGIT ZERO, 120802 +MATHEMATICAL SANS SERIF DIGIT ONE, 120803 +MATHEMATICAL SANS SERIF DIGIT TWO, 120804 +MATHEMATICAL SANS SERIF DIGIT THREE, 120805 +MATHEMATICAL SANS SERIF DIGIT FOUR, 120806 +MATHEMATICAL SANS SERIF DIGIT FIVE, 120807 +MATHEMATICAL SANS SERIF DIGIT SIX, 120808 +MATHEMATICAL SANS SERIF DIGIT SEVEN, 120809 +MATHEMATICAL SANS SERIF DIGIT EIGHT, 120810 +MATHEMATICAL SANS SERIF DIGIT NINE, 120811 +MATHEMATICAL SANS SERIF BOLD DIGIT ZERO, 120812 +MATHEMATICAL SANS SERIF BOLD DIGIT ONE, 120813 +MATHEMATICAL SANS SERIF BOLD DIGIT TWO, 120814 +MATHEMATICAL SANS SERIF BOLD DIGIT THREE, 120815 +MATHEMATICAL SANS SERIF BOLD DIGIT FOUR, 120816 +MATHEMATICAL SANS SERIF BOLD DIGIT FIVE, 120817 +MATHEMATICAL SANS SERIF BOLD DIGIT SIX, 120818 +MATHEMATICAL SANS SERIF BOLD DIGIT SEVEN, 120819 +MATHEMATICAL SANS SERIF BOLD DIGIT EIGHT, 120820 +MATHEMATICAL SANS SERIF BOLD DIGIT NINE, 120821 +MATHEMATICAL MONOSPACE DIGIT ZERO, 120822 +MATHEMATICAL MONOSPACE DIGIT ONE, 120823 +MATHEMATICAL MONOSPACE DIGIT TWO, 120824 +MATHEMATICAL MONOSPACE DIGIT THREE, 120825 +MATHEMATICAL MONOSPACE DIGIT FOUR, 120826 +MATHEMATICAL MONOSPACE DIGIT FIVE, 120827 +MATHEMATICAL MONOSPACE DIGIT SIX, 120828 +MATHEMATICAL MONOSPACE DIGIT SEVEN, 120829 +MATHEMATICAL MONOSPACE DIGIT EIGHT, 120830 +MATHEMATICAL MONOSPACE DIGIT NINE, 120831 +SIGNWRITING HAND FIST INDEX, 120832 +SIGNWRITING HAND CIRCLE INDEX, 120833 +SIGNWRITING HAND CUP INDEX, 120834 +SIGNWRITING HAND OVAL INDEX, 120835 +SIGNWRITING HAND HINGE INDEX, 120836 +SIGNWRITING HAND ANGLE INDEX, 120837 +SIGNWRITING HAND FIST INDEX BENT, 120838 +SIGNWRITING HAND CIRCLE INDEX BENT, 120839 +SIGNWRITING HAND FIST THUMB UNDER INDEX BENT, 120840 +SIGNWRITING HAND FIST INDEX RAISED KNUCKLE, 120841 +SIGNWRITING HAND FIST INDEX CUPPED, 120842 +SIGNWRITING HAND FIST INDEX HINGED, 120843 +SIGNWRITING HAND FIST INDEX HINGED LOW, 120844 +SIGNWRITING HAND CIRCLE INDEX HINGE, 120845 +SIGNWRITING HAND FIST INDEX MIDDLE, 120846 +SIGNWRITING HAND CIRCLE INDEX MIDDLE, 120847 +SIGNWRITING HAND FIST INDEX MIDDLE BENT, 120848 +SIGNWRITING HAND FIST INDEX MIDDLE RAISED KNUCKLES, 120849 +SIGNWRITING HAND FIST INDEX MIDDLE HINGED, 120850 +SIGNWRITING HAND FIST INDEX UP MIDDLE HINGED, 120851 +SIGNWRITING HAND FIST INDEX HINGED MIDDLE UP, 120852 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED, 120853 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED INDEX BENT, 120854 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED MIDDLE BENT, 120855 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED CUPPED, 120856 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED HINGED, 120857 +SIGNWRITING HAND FIST INDEX MIDDLE CROSSED, 120858 +SIGNWRITING HAND CIRCLE INDEX MIDDLE CROSSED, 120859 +SIGNWRITING HAND FIST MIDDLE BENT OVER INDEX, 120860 +SIGNWRITING HAND FIST INDEX BENT OVER MIDDLE, 120861 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB, 120862 +SIGNWRITING HAND CIRCLE INDEX MIDDLE THUMB, 120863 +SIGNWRITING HAND FIST INDEX MIDDLE STRAIGHT THUMB BENT, 120864 +SIGNWRITING HAND FIST INDEX MIDDLE BENT THUMB STRAIGHT, 120865 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB BENT, 120866 +SIGNWRITING HAND FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE, 120867 +SIGNWRITING HAND FIST INDEX UP MIDDLE HINGED THUMB SIDE, 120868 +SIGNWRITING HAND FIST INDEX UP MIDDLE HINGED THUMB CONJOINED, 120869 +SIGNWRITING HAND FIST INDEX HINGED MIDDLE UP THUMB SIDE, 120870 +SIGNWRITING HAND FIST INDEX MIDDLE UP SPREAD THUMB FORWARD, 120871 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB CUPPED, 120872 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB CIRCLED, 120873 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB HOOKED, 120874 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB HINGED, 120875 +SIGNWRITING HAND FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT, 120876 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB SIDE, 120877 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED, 120878 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT, 120879 +SIGNWRITING HAND FIST MIDDLE THUMB HOOKED INDEX UP, 120880 +SIGNWRITING HAND FIST INDEX THUMB HOOKED MIDDLE UP, 120881 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE, 120882 +SIGNWRITING HAND FIST INDEX MIDDLE CROSSED THUMB SIDE, 120883 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED THUMB FORWARD, 120884 +SIGNWRITING HAND FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD, 120885 +SIGNWRITING HAND FIST MIDDLE THUMB CUPPED INDEX UP, 120886 +SIGNWRITING HAND FIST INDEX THUMB CUPPED MIDDLE UP, 120887 +SIGNWRITING HAND FIST MIDDLE THUMB CIRCLED INDEX UP, 120888 +SIGNWRITING HAND FIST MIDDLE THUMB CIRCLED INDEX HINGED, 120889 +SIGNWRITING HAND FIST INDEX THUMB ANGLED OUT MIDDLE UP, 120890 +SIGNWRITING HAND FIST INDEX THUMB ANGLED IN MIDDLE UP, 120891 +SIGNWRITING HAND FIST INDEX THUMB CIRCLED MIDDLE UP, 120892 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB CONJOINED HINGED, 120893 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB ANGLED OUT, 120894 +SIGNWRITING HAND FIST INDEX MIDDLE THUMB ANGLED, 120895 +SIGNWRITING HAND FIST MIDDLE THUMB ANGLED OUT INDEX UP, 120896 +SIGNWRITING HAND FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED, 120897 +SIGNWRITING HAND FIST MIDDLE THUMB ANGLED INDEX UP, 120898 +SIGNWRITING HAND FIST INDEX THUMB HOOKED MIDDLE HINGED, 120899 +SIGNWRITING HAND FLAT FOUR FINGERS, 120900 +SIGNWRITING HAND FLAT FOUR FINGERS BENT, 120901 +SIGNWRITING HAND FLAT FOUR FINGERS HINGED, 120902 +SIGNWRITING HAND FLAT FOUR FINGERS CONJOINED, 120903 +SIGNWRITING HAND FLAT FOUR FINGERS CONJOINED SPLIT, 120904 +SIGNWRITING HAND CLAW FOUR FINGERS CONJOINED, 120905 +SIGNWRITING HAND FIST FOUR FINGERS CONJOINED BENT, 120906 +SIGNWRITING HAND HINGE FOUR FINGERS CONJOINED, 120907 +SIGNWRITING HAND FLAT FIVE FINGERS SPREAD, 120908 +SIGNWRITING HAND FLAT HEEL FIVE FINGERS SPREAD, 120909 +SIGNWRITING HAND FLAT FIVE FINGERS SPREAD FOUR BENT, 120910 +SIGNWRITING HAND FLAT HEEL FIVE FINGERS SPREAD FOUR BENT, 120911 +SIGNWRITING HAND FLAT FIVE FINGERS SPREAD BENT, 120912 +SIGNWRITING HAND FLAT HEEL FIVE FINGERS SPREAD BENT, 120913 +SIGNWRITING HAND FLAT FIVE FINGERS SPREAD THUMB FORWARD, 120914 +SIGNWRITING HAND CUP FIVE FINGERS SPREAD, 120915 +SIGNWRITING HAND CUP FIVE FINGERS SPREAD OPEN, 120916 +SIGNWRITING HAND HINGE FIVE FINGERS SPREAD OPEN, 120917 +SIGNWRITING HAND OVAL FIVE FINGERS SPREAD, 120918 +SIGNWRITING HAND FLAT FIVE FINGERS SPREAD HINGED, 120919 +SIGNWRITING HAND FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE, 120920 +SIGNWRITING HAND FLAT FIVE FINGERS SPREAD HINGED NO THUMB, 120921 +SIGNWRITING HAND FLAT, 120922 +SIGNWRITING HAND FLAT BETWEEN PALM FACINGS, 120923 +SIGNWRITING HAND FLAT HEEL, 120924 +SIGNWRITING HAND FLAT THUMB SIDE, 120925 +SIGNWRITING HAND FLAT HEEL THUMB SIDE, 120926 +SIGNWRITING HAND FLAT THUMB BENT, 120927 +SIGNWRITING HAND FLAT THUMB FORWARD, 120928 +SIGNWRITING HAND FLAT SPLIT INDEX THUMB SIDE, 120929 +SIGNWRITING HAND FLAT SPLIT CENTRE, 120930 +SIGNWRITING HAND FLAT SPLIT CENTRE THUMB SIDE, 120931 +SIGNWRITING HAND FLAT SPLIT CENTRE THUMB SIDE BENT, 120932 +SIGNWRITING HAND FLAT SPLIT LITTLE, 120933 +SIGNWRITING HAND CLAW, 120934 +SIGNWRITING HAND CLAW THUMB SIDE, 120935 +SIGNWRITING HAND CLAW NO THUMB, 120936 +SIGNWRITING HAND CLAW THUMB FORWARD, 120937 +SIGNWRITING HAND HOOK CURLICUE, 120938 +SIGNWRITING HAND HOOK, 120939 +SIGNWRITING HAND CUP OPEN, 120940 +SIGNWRITING HAND CUP, 120941 +SIGNWRITING HAND CUP OPEN THUMB SIDE, 120942 +SIGNWRITING HAND CUP THUMB SIDE, 120943 +SIGNWRITING HAND CUP OPEN NO THUMB, 120944 +SIGNWRITING HAND CUP NO THUMB, 120945 +SIGNWRITING HAND CUP OPEN THUMB FORWARD, 120946 +SIGNWRITING HAND CUP THUMB FORWARD, 120947 +SIGNWRITING HAND CURLICUE OPEN, 120948 +SIGNWRITING HAND CURLICUE, 120949 +SIGNWRITING HAND CIRCLE, 120950 +SIGNWRITING HAND OVAL, 120951 +SIGNWRITING HAND OVAL THUMB SIDE, 120952 +SIGNWRITING HAND OVAL NO THUMB, 120953 +SIGNWRITING HAND OVAL THUMB FORWARD, 120954 +SIGNWRITING HAND HINGE OPEN, 120955 +SIGNWRITING HAND HINGE OPEN THUMB FORWARD, 120956 +SIGNWRITING HAND HINGE, 120957 +SIGNWRITING HAND HINGE SMALL, 120958 +SIGNWRITING HAND HINGE OPEN THUMB SIDE, 120959 +SIGNWRITING HAND HINGE THUMB SIDE, 120960 +SIGNWRITING HAND HINGE OPEN NO THUMB, 120961 +SIGNWRITING HAND HINGE NO THUMB, 120962 +SIGNWRITING HAND HINGE THUMB SIDE TOUCHING INDEX, 120963 +SIGNWRITING HAND HINGE THUMB BETWEEN MIDDLE RING, 120964 +SIGNWRITING HAND ANGLE, 120965 +SIGNWRITING HAND FIST INDEX MIDDLE RING, 120966 +SIGNWRITING HAND CIRCLE INDEX MIDDLE RING, 120967 +SIGNWRITING HAND HINGE INDEX MIDDLE RING, 120968 +SIGNWRITING HAND ANGLE INDEX MIDDLE RING, 120969 +SIGNWRITING HAND HINGE LITTLE, 120970 +SIGNWRITING HAND FIST INDEX MIDDLE RING BENT, 120971 +SIGNWRITING HAND FIST INDEX MIDDLE RING CONJOINED, 120972 +SIGNWRITING HAND HINGE INDEX MIDDLE RING CONJOINED, 120973 +SIGNWRITING HAND FIST LITTLE DOWN, 120974 +SIGNWRITING HAND FIST LITTLE DOWN RIPPLE STRAIGHT, 120975 +SIGNWRITING HAND FIST LITTLE DOWN RIPPLE CURVED, 120976 +SIGNWRITING HAND FIST LITTLE DOWN OTHERS CIRCLED, 120977 +SIGNWRITING HAND FIST LITTLE UP, 120978 +SIGNWRITING HAND FIST THUMB UNDER LITTLE UP, 120979 +SIGNWRITING HAND CIRCLE LITTLE UP, 120980 +SIGNWRITING HAND OVAL LITTLE UP, 120981 +SIGNWRITING HAND ANGLE LITTLE UP, 120982 +SIGNWRITING HAND FIST LITTLE RAISED KNUCKLE, 120983 +SIGNWRITING HAND FIST LITTLE BENT, 120984 +SIGNWRITING HAND FIST LITTLE TOUCHES THUMB, 120985 +SIGNWRITING HAND FIST LITTLE THUMB, 120986 +SIGNWRITING HAND HINGE LITTLE THUMB, 120987 +SIGNWRITING HAND FIST LITTLE INDEX THUMB, 120988 +SIGNWRITING HAND HINGE LITTLE INDEX THUMB, 120989 +SIGNWRITING HAND ANGLE LITTLE INDEX THUMB INDEX THUMB OUT, 120990 +SIGNWRITING HAND ANGLE LITTLE INDEX THUMB INDEX THUMB, 120991 +SIGNWRITING HAND FIST LITTLE INDEX, 120992 +SIGNWRITING HAND CIRCLE LITTLE INDEX, 120993 +SIGNWRITING HAND HINGE LITTLE INDEX, 120994 +SIGNWRITING HAND ANGLE LITTLE INDEX, 120995 +SIGNWRITING HAND FIST INDEX MIDDLE LITTLE, 120996 +SIGNWRITING HAND CIRCLE INDEX MIDDLE LITTLE, 120997 +SIGNWRITING HAND HINGE INDEX MIDDLE LITTLE, 120998 +SIGNWRITING HAND HINGE RING, 120999 +SIGNWRITING HAND ANGLE INDEX MIDDLE LITTLE, 121000 +SIGNWRITING HAND FIST INDEX MIDDLE CROSS LITTLE, 121001 +SIGNWRITING HAND CIRCLE INDEX MIDDLE CROSS LITTLE, 121002 +SIGNWRITING HAND FIST RING DOWN, 121003 +SIGNWRITING HAND HINGE RING DOWN INDEX THUMB HOOK MIDDLE, 121004 +SIGNWRITING HAND ANGLE RING DOWN MIDDLE THUMB INDEX CROSS, 121005 +SIGNWRITING HAND FIST RING UP, 121006 +SIGNWRITING HAND FIST RING RAISED KNUCKLE, 121007 +SIGNWRITING HAND FIST RING LITTLE, 121008 +SIGNWRITING HAND CIRCLE RING LITTLE, 121009 +SIGNWRITING HAND OVAL RING LITTLE, 121010 +SIGNWRITING HAND ANGLE RING LITTLE, 121011 +SIGNWRITING HAND FIST RING MIDDLE, 121012 +SIGNWRITING HAND FIST RING MIDDLE CONJOINED, 121013 +SIGNWRITING HAND FIST RING MIDDLE RAISED KNUCKLES, 121014 +SIGNWRITING HAND FIST RING INDEX, 121015 +SIGNWRITING HAND FIST RING THUMB, 121016 +SIGNWRITING HAND HOOK RING THUMB, 121017 +SIGNWRITING HAND FIST INDEX RING LITTLE, 121018 +SIGNWRITING HAND CIRCLE INDEX RING LITTLE, 121019 +SIGNWRITING HAND CURLICUE INDEX RING LITTLE ON, 121020 +SIGNWRITING HAND HOOK INDEX RING LITTLE OUT, 121021 +SIGNWRITING HAND HOOK INDEX RING LITTLE IN, 121022 +SIGNWRITING HAND HOOK INDEX RING LITTLE UNDER, 121023 +SIGNWRITING HAND CUP INDEX RING LITTLE, 121024 +SIGNWRITING HAND HINGE INDEX RING LITTLE, 121025 +SIGNWRITING HAND ANGLE INDEX RING LITTLE OUT, 121026 +SIGNWRITING HAND ANGLE INDEX RING LITTLE, 121027 +SIGNWRITING HAND FIST MIDDLE DOWN, 121028 +SIGNWRITING HAND HINGE MIDDLE, 121029 +SIGNWRITING HAND FIST MIDDLE UP, 121030 +SIGNWRITING HAND CIRCLE MIDDLE UP, 121031 +SIGNWRITING HAND FIST MIDDLE RAISED KNUCKLE, 121032 +SIGNWRITING HAND FIST MIDDLE UP THUMB SIDE, 121033 +SIGNWRITING HAND HOOK MIDDLE THUMB, 121034 +SIGNWRITING HAND FIST MIDDLE THUMB LITTLE, 121035 +SIGNWRITING HAND FIST MIDDLE LITTLE, 121036 +SIGNWRITING HAND FIST MIDDLE RING LITTLE, 121037 +SIGNWRITING HAND CIRCLE MIDDLE RING LITTLE, 121038 +SIGNWRITING HAND CURLICUE MIDDLE RING LITTLE ON, 121039 +SIGNWRITING HAND CUP MIDDLE RING LITTLE, 121040 +SIGNWRITING HAND HINGE MIDDLE RING LITTLE, 121041 +SIGNWRITING HAND ANGLE MIDDLE RING LITTLE OUT, 121042 +SIGNWRITING HAND ANGLE MIDDLE RING LITTLE IN, 121043 +SIGNWRITING HAND ANGLE MIDDLE RING LITTLE, 121044 +SIGNWRITING HAND CIRCLE MIDDLE RING LITTLE BENT, 121045 +SIGNWRITING HAND CLAW MIDDLE RING LITTLE CONJOINED, 121046 +SIGNWRITING HAND CLAW MIDDLE RING LITTLE CONJOINED SIDE, 121047 +SIGNWRITING HAND HOOK MIDDLE RING LITTLE CONJOINED OUT, 121048 +SIGNWRITING HAND HOOK MIDDLE RING LITTLE CONJOINED IN, 121049 +SIGNWRITING HAND HOOK MIDDLE RING LITTLE CONJOINED, 121050 +SIGNWRITING HAND HINGE INDEX HINGED, 121051 +SIGNWRITING HAND FIST INDEX THUMB SIDE, 121052 +SIGNWRITING HAND HINGE INDEX THUMB SIDE, 121053 +SIGNWRITING HAND FIST INDEX THUMB SIDE THUMB DIAGONAL, 121054 +SIGNWRITING HAND FIST INDEX THUMB SIDE THUMB CONJOINED, 121055 +SIGNWRITING HAND FIST INDEX THUMB SIDE THUMB BENT, 121056 +SIGNWRITING HAND FIST INDEX THUMB SIDE INDEX BENT, 121057 +SIGNWRITING HAND FIST INDEX THUMB SIDE BOTH BENT, 121058 +SIGNWRITING HAND FIST INDEX THUMB SIDE INDEX HINGE, 121059 +SIGNWRITING HAND FIST INDEX THUMB FORWARD INDEX STRAIGHT, 121060 +SIGNWRITING HAND FIST INDEX THUMB FORWARD INDEX BENT, 121061 +SIGNWRITING HAND FIST INDEX THUMB HOOK, 121062 +SIGNWRITING HAND FIST INDEX THUMB CURLICUE, 121063 +SIGNWRITING HAND FIST INDEX THUMB CURVE THUMB INSIDE, 121064 +SIGNWRITING HAND CLAW INDEX THUMB CURVE THUMB INSIDE, 121065 +SIGNWRITING HAND FIST INDEX THUMB CURVE THUMB UNDER, 121066 +SIGNWRITING HAND FIST INDEX THUMB CIRCLE, 121067 +SIGNWRITING HAND CUP INDEX THUMB, 121068 +SIGNWRITING HAND CUP INDEX THUMB OPEN, 121069 +SIGNWRITING HAND HINGE INDEX THUMB OPEN, 121070 +SIGNWRITING HAND HINGE INDEX THUMB LARGE, 121071 +SIGNWRITING HAND HINGE INDEX THUMB, 121072 +SIGNWRITING HAND HINGE INDEX THUMB SMALL, 121073 +SIGNWRITING HAND ANGLE INDEX THUMB OUT, 121074 +SIGNWRITING HAND ANGLE INDEX THUMB IN, 121075 +SIGNWRITING HAND ANGLE INDEX THUMB, 121076 +SIGNWRITING HAND FIST THUMB, 121077 +SIGNWRITING HAND FIST THUMB HEEL, 121078 +SIGNWRITING HAND FIST THUMB SIDE DIAGONAL, 121079 +SIGNWRITING HAND FIST THUMB SIDE CONJOINED, 121080 +SIGNWRITING HAND FIST THUMB SIDE BENT, 121081 +SIGNWRITING HAND FIST THUMB FORWARD, 121082 +SIGNWRITING HAND FIST THUMB BETWEEN INDEX MIDDLE, 121083 +SIGNWRITING HAND FIST THUMB BETWEEN MIDDLE RING, 121084 +SIGNWRITING HAND FIST THUMB BETWEEN RING LITTLE, 121085 +SIGNWRITING HAND FIST THUMB UNDER TWO FINGERS, 121086 +SIGNWRITING HAND FIST THUMB OVER TWO FINGERS, 121087 +SIGNWRITING HAND FIST THUMB UNDER THREE FINGERS, 121088 +SIGNWRITING HAND FIST THUMB UNDER FOUR FINGERS, 121089 +SIGNWRITING HAND FIST THUMB OVER FOUR RAISED KNUCKLES, 121090 +SIGNWRITING HAND FIST, 121091 +SIGNWRITING HAND FIST HEEL, 121092 +SIGNWRITING TOUCH SINGLE, 121093 +SIGNWRITING TOUCH MULTIPLE, 121094 +SIGNWRITING TOUCH BETWEEN, 121095 +SIGNWRITING GRASP SINGLE, 121096 +SIGNWRITING GRASP MULTIPLE, 121097 +SIGNWRITING GRASP BETWEEN, 121098 +SIGNWRITING STRIKE SINGLE, 121099 +SIGNWRITING STRIKE MULTIPLE, 121100 +SIGNWRITING STRIKE BETWEEN, 121101 +SIGNWRITING BRUSH SINGLE, 121102 +SIGNWRITING BRUSH MULTIPLE, 121103 +SIGNWRITING BRUSH BETWEEN, 121104 +SIGNWRITING RUB SINGLE, 121105 +SIGNWRITING RUB MULTIPLE, 121106 +SIGNWRITING RUB BETWEEN, 121107 +SIGNWRITING SURFACE SYMBOLS, 121108 +SIGNWRITING SURFACE BETWEEN, 121109 +SIGNWRITING SQUEEZE LARGE SINGLE, 121110 +SIGNWRITING SQUEEZE SMALL SINGLE, 121111 +SIGNWRITING SQUEEZE LARGE MULTIPLE, 121112 +SIGNWRITING SQUEEZE SMALL MULTIPLE, 121113 +SIGNWRITING SQUEEZE SEQUENTIAL, 121114 +SIGNWRITING FLICK LARGE SINGLE, 121115 +SIGNWRITING FLICK SMALL SINGLE, 121116 +SIGNWRITING FLICK LARGE MULTIPLE, 121117 +SIGNWRITING FLICK SMALL MULTIPLE, 121118 +SIGNWRITING FLICK SEQUENTIAL, 121119 +SIGNWRITING SQUEEZE FLICK ALTERNATING, 121120 +SIGNWRITING MOVEMENT HINGE UP DOWN LARGE, 121121 +SIGNWRITING MOVEMENT HINGE UP DOWN SMALL, 121122 +SIGNWRITING MOVEMENT HINGE UP SEQUENTIAL, 121123 +SIGNWRITING MOVEMENT HINGE DOWN SEQUENTIAL, 121124 +SIGNWRITING MOVEMENT HINGE UP DOWN ALTERNATING LARGE, 121125 +SIGNWRITING MOVEMENT HINGE UP DOWN ALTERNATING SMALL, 121126 +SIGNWRITING MOVEMENT HINGE SIDE TO SIDE SCISSORS, 121127 +SIGNWRITING MOVEMENT WALLPLANE FINGER CONTACT, 121128 +SIGNWRITING MOVEMENT FLOORPLANE FINGER CONTACT, 121129 +SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT SMALL, 121130 +SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT MEDIUM, 121131 +SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT LARGE, 121132 +SIGNWRITING MOVEMENT WALLPLANE SINGLE STRAIGHT LARGEST, 121133 +SIGNWRITING MOVEMENT WALLPLANE SINGLE WRIST FLEX, 121134 +SIGNWRITING MOVEMENT WALLPLANE DOUBLE STRAIGHT, 121135 +SIGNWRITING MOVEMENT WALLPLANE DOUBLE WRIST FLEX, 121136 +SIGNWRITING MOVEMENT WALLPLANE DOUBLE ALTERNATING, 121137 +SIGNWRITING MOVEMENT WALLPLANE DOUBLE ALTERNATING WRIST FLEX, 121138 +SIGNWRITING MOVEMENT WALLPLANE CROSS, 121139 +SIGNWRITING MOVEMENT WALLPLANE TRIPLE STRAIGHT MOVEMENT, 121140 +SIGNWRITING MOVEMENT WALLPLANE TRIPLE WRIST FLEX, 121141 +SIGNWRITING MOVEMENT WALLPLANE TRIPLE ALTERNATING, 121142 +SIGNWRITING MOVEMENT WALLPLANE TRIPLE ALTERNATING WRIST FLEX, 121143 +SIGNWRITING MOVEMENT WALLPLANE BEND SMALL, 121144 +SIGNWRITING MOVEMENT WALLPLANE BEND MEDIUM, 121145 +SIGNWRITING MOVEMENT WALLPLANE BEND LARGE, 121146 +SIGNWRITING MOVEMENT WALLPLANE CORNER SMALL, 121147 +SIGNWRITING MOVEMENT WALLPLANE CORNER MEDIUM, 121148 +SIGNWRITING MOVEMENT WALLPLANE CORNER LARGE, 121149 +SIGNWRITING MOVEMENT WALLPLANE CORNER ROTATION, 121150 +SIGNWRITING MOVEMENT WALLPLANE CHECK SMALL, 121151 +SIGNWRITING MOVEMENT WALLPLANE CHECK MEDIUM, 121152 +SIGNWRITING MOVEMENT WALLPLANE CHECK LARGE, 121153 +SIGNWRITING MOVEMENT WALLPLANE BOX SMALL, 121154 +SIGNWRITING MOVEMENT WALLPLANE BOX MEDIUM, 121155 +SIGNWRITING MOVEMENT WALLPLANE BOX LARGE, 121156 +SIGNWRITING MOVEMENT WALLPLANE ZIGZAG SMALL, 121157 +SIGNWRITING MOVEMENT WALLPLANE ZIGZAG MEDIUM, 121158 +SIGNWRITING MOVEMENT WALLPLANE ZIGZAG LARGE, 121159 +SIGNWRITING MOVEMENT WALLPLANE PEAKS SMALL, 121160 +SIGNWRITING MOVEMENT WALLPLANE PEAKS MEDIUM, 121161 +SIGNWRITING MOVEMENT WALLPLANE PEAKS LARGE, 121162 +SIGNWRITING TRAVEL WALLPLANE ROTATION WALLPLANE SINGLE, 121163 +SIGNWRITING TRAVEL WALLPLANE ROTATION WALLPLANE DOUBLE, 121164 +SIGNWRITING TRAVEL WALLPLANE ROTATION WALLPLANE ALTERNATING, 121165 +SIGNWRITING TRAVEL WALLPLANE ROTATION FLOORPLANE SINGLE, 121166 +SIGNWRITING TRAVEL WALLPLANE ROTATION FLOORPLANE DOUBLE, 121167 +SIGNWRITING TRAVEL WALLPLANE ROTATION FLOORPLANE ALTERNATING, 121168 +SIGNWRITING TRAVEL WALLPLANE SHAKING, 121169 +SIGNWRITING TRAVEL WALLPLANE ARM SPIRAL SINGLE, 121170 +SIGNWRITING TRAVEL WALLPLANE ARM SPIRAL DOUBLE, 121171 +SIGNWRITING TRAVEL WALLPLANE ARM SPIRAL TRIPLE, 121172 +SIGNWRITING MOVEMENT DIAGONAL AWAY SMALL, 121173 +SIGNWRITING MOVEMENT DIAGONAL AWAY MEDIUM, 121174 +SIGNWRITING MOVEMENT DIAGONAL AWAY LARGE, 121175 +SIGNWRITING MOVEMENT DIAGONAL AWAY LARGEST, 121176 +SIGNWRITING MOVEMENT DIAGONAL TOWARDS SMALL, 121177 +SIGNWRITING MOVEMENT DIAGONAL TOWARDS MEDIUM, 121178 +SIGNWRITING MOVEMENT DIAGONAL TOWARDS LARGE, 121179 +SIGNWRITING MOVEMENT DIAGONAL TOWARDS LARGEST, 121180 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY SMALL, 121181 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY MEDIUM, 121182 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY LARGE, 121183 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN AWAY LARGEST, 121184 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS SMALL, 121185 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS MEDIUM, 121186 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS LARGE, 121187 +SIGNWRITING MOVEMENT DIAGONAL BETWEEN TOWARDS LARGEST, 121188 +SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT SMALL, 121189 +SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT MEDIUM, 121190 +SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT LARGE, 121191 +SIGNWRITING MOVEMENT FLOORPLANE SINGLE STRAIGHT LARGEST, 121192 +SIGNWRITING MOVEMENT FLOORPLANE SINGLE WRIST FLEX, 121193 +SIGNWRITING MOVEMENT FLOORPLANE DOUBLE STRAIGHT, 121194 +SIGNWRITING MOVEMENT FLOORPLANE DOUBLE WRIST FLEX, 121195 +SIGNWRITING MOVEMENT FLOORPLANE DOUBLE ALTERNATING, 121196 +SIGNWRITING MOVEMENT FLOORPLANE DOUBLE ALTERNATING WRIST FLEX, 121197 +SIGNWRITING MOVEMENT FLOORPLANE CROSS, 121198 +SIGNWRITING MOVEMENT FLOORPLANE TRIPLE STRAIGHT MOVEMENT, 121199 +SIGNWRITING MOVEMENT FLOORPLANE TRIPLE WRIST FLEX, 121200 +SIGNWRITING MOVEMENT FLOORPLANE TRIPLE ALTERNATING MOVEMENT, 121201 +SIGNWRITING MOVEMENT FLOORPLANE TRIPLE ALTERNATING WRIST FLEX, 121202 +SIGNWRITING MOVEMENT FLOORPLANE BEND, 121203 +SIGNWRITING MOVEMENT FLOORPLANE CORNER SMALL, 121204 +SIGNWRITING MOVEMENT FLOORPLANE CORNER MEDIUM, 121205 +SIGNWRITING MOVEMENT FLOORPLANE CORNER LARGE, 121206 +SIGNWRITING MOVEMENT FLOORPLANE CHECK, 121207 +SIGNWRITING MOVEMENT FLOORPLANE BOX SMALL, 121208 +SIGNWRITING MOVEMENT FLOORPLANE BOX MEDIUM, 121209 +SIGNWRITING MOVEMENT FLOORPLANE BOX LARGE, 121210 +SIGNWRITING MOVEMENT FLOORPLANE ZIGZAG SMALL, 121211 +SIGNWRITING MOVEMENT FLOORPLANE ZIGZAG MEDIUM, 121212 +SIGNWRITING MOVEMENT FLOORPLANE ZIGZAG LARGE, 121213 +SIGNWRITING MOVEMENT FLOORPLANE PEAKS SMALL, 121214 +SIGNWRITING MOVEMENT FLOORPLANE PEAKS MEDIUM, 121215 +SIGNWRITING MOVEMENT FLOORPLANE PEAKS LARGE, 121216 +SIGNWRITING TRAVEL FLOORPLANE ROTATION FLOORPLANE SINGLE, 121217 +SIGNWRITING TRAVEL FLOORPLANE ROTATION FLOORPLANE DOUBLE, 121218 +SIGNWRITING TRAVEL FLOORPLANE ROTATION FLOORPLANE ALTERNATING, 121219 +SIGNWRITING TRAVEL FLOORPLANE ROTATION WALLPLANE SINGLE, 121220 +SIGNWRITING TRAVEL FLOORPLANE ROTATION WALLPLANE DOUBLE, 121221 +SIGNWRITING TRAVEL FLOORPLANE ROTATION WALLPLANE ALTERNATING, 121222 +SIGNWRITING TRAVEL FLOORPLANE SHAKING, 121223 +SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER SMALL, 121224 +SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER MEDIUM, 121225 +SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER LARGE, 121226 +SIGNWRITING MOVEMENT WALLPLANE CURVE QUARTER LARGEST, 121227 +SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE SMALL, 121228 +SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE MEDIUM, 121229 +SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE LARGE, 121230 +SIGNWRITING MOVEMENT WALLPLANE CURVE HALF CIRCLE LARGEST, 121231 +SIGNWRITING MOVEMENT WALLPLANE CURVE THREE QUARTER CIRCLE SMALL, 121232 +SIGNWRITING MOVEMENT WALLPLANE CURVE THREE QUARTER CIRCLE MEDIUM, 121233 +SIGNWRITING MOVEMENT WALLPLANE HUMP SMALL, 121234 +SIGNWRITING MOVEMENT WALLPLANE HUMP MEDIUM, 121235 +SIGNWRITING MOVEMENT WALLPLANE HUMP LARGE, 121236 +SIGNWRITING MOVEMENT WALLPLANE LOOP SMALL, 121237 +SIGNWRITING MOVEMENT WALLPLANE LOOP MEDIUM, 121238 +SIGNWRITING MOVEMENT WALLPLANE LOOP LARGE, 121239 +SIGNWRITING MOVEMENT WALLPLANE LOOP SMALL DOUBLE, 121240 +SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE DOUBLE SMALL, 121241 +SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE DOUBLE MEDIUM, 121242 +SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE DOUBLE LARGE, 121243 +SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE TRIPLE SMALL, 121244 +SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE TRIPLE MEDIUM, 121245 +SIGNWRITING MOVEMENT WALLPLANE WAVE CURVE TRIPLE LARGE, 121246 +SIGNWRITING MOVEMENT WALLPLANE CURVE THEN STRAIGHT, 121247 +SIGNWRITING MOVEMENT WALLPLANE CURVED CROSS SMALL, 121248 +SIGNWRITING MOVEMENT WALLPLANE CURVED CROSS MEDIUM, 121249 +SIGNWRITING ROTATION WALLPLANE SINGLE, 121250 +SIGNWRITING ROTATION WALLPLANE DOUBLE, 121251 +SIGNWRITING ROTATION WALLPLANE ALTERNATE, 121252 +SIGNWRITING MOVEMENT WALLPLANE SHAKING, 121253 +SIGNWRITING MOVEMENT WALLPLANE CURVE HITTING FRONT WALL, 121254 +SIGNWRITING MOVEMENT WALLPLANE HUMP HITTING FRONT WALL, 121255 +SIGNWRITING MOVEMENT WALLPLANE LOOP HITTING FRONT WALL, 121256 +SIGNWRITING MOVEMENT WALLPLANE WAVE HITTING FRONT WALL, 121257 +SIGNWRITING ROTATION WALLPLANE SINGLE HITTING FRONT WALL, 121258 +SIGNWRITING ROTATION WALLPLANE DOUBLE HITTING FRONT WALL, 121259 +SIGNWRITING ROTATION WALLPLANE ALTERNATING HITTING FRONT WALL, 121260 +SIGNWRITING MOVEMENT WALLPLANE CURVE HITTING CHEST, 121261 +SIGNWRITING MOVEMENT WALLPLANE HUMP HITTING CHEST, 121262 +SIGNWRITING MOVEMENT WALLPLANE LOOP HITTING CHEST, 121263 +SIGNWRITING MOVEMENT WALLPLANE WAVE HITTING CHEST, 121264 +SIGNWRITING ROTATION WALLPLANE SINGLE HITTING CHEST, 121265 +SIGNWRITING ROTATION WALLPLANE DOUBLE HITTING CHEST, 121266 +SIGNWRITING ROTATION WALLPLANE ALTERNATING HITTING CHEST, 121267 +SIGNWRITING MOVEMENT WALLPLANE WAVE DIAGONAL PATH SMALL, 121268 +SIGNWRITING MOVEMENT WALLPLANE WAVE DIAGONAL PATH MEDIUM, 121269 +SIGNWRITING MOVEMENT WALLPLANE WAVE DIAGONAL PATH LARGE, 121270 +SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING CEILING SMALL, 121271 +SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING CEILING LARGE, 121272 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE, 121273 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE, 121274 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE, 121275 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE, 121276 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING SMALL SINGLE, 121277 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING LARGE SINGLE, 121278 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE, 121279 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE, 121280 +SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING CEILING SMALL, 121281 +SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING CEILING LARGE, 121282 +SIGNWRITING ROTATION FLOORPLANE SINGLE HITTING CEILING, 121283 +SIGNWRITING ROTATION FLOORPLANE DOUBLE HITTING CEILING, 121284 +SIGNWRITING ROTATION FLOORPLANE ALTERNATING HITTING CEILING, 121285 +SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING FLOOR SMALL, 121286 +SIGNWRITING MOVEMENT FLOORPLANE CURVE HITTING FLOOR LARGE, 121287 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE, 121288 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE, 121289 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE, 121290 +SIGNWRITING MOVEMENT FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE, 121291 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE, 121292 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE, 121293 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE, 121294 +SIGNWRITING MOVEMENT FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE, 121295 +SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING FLOOR SMALL, 121296 +SIGNWRITING MOVEMENT FLOORPLANE WAVE HITTING FLOOR LARGE, 121297 +SIGNWRITING ROTATION FLOORPLANE SINGLE HITTING FLOOR, 121298 +SIGNWRITING ROTATION FLOORPLANE DOUBLE HITTING FLOOR, 121299 +SIGNWRITING ROTATION FLOORPLANE ALTERNATING HITTING FLOOR, 121300 +SIGNWRITING MOVEMENT FLOORPLANE CURVE SMALL, 121301 +SIGNWRITING MOVEMENT FLOORPLANE CURVE MEDIUM, 121302 +SIGNWRITING MOVEMENT FLOORPLANE CURVE LARGE, 121303 +SIGNWRITING MOVEMENT FLOORPLANE CURVE LARGEST, 121304 +SIGNWRITING MOVEMENT FLOORPLANE CURVE COMBINED, 121305 +SIGNWRITING MOVEMENT FLOORPLANE HUMP SMALL, 121306 +SIGNWRITING MOVEMENT FLOORPLANE LOOP SMALL, 121307 +SIGNWRITING MOVEMENT FLOORPLANE WAVE SNAKE, 121308 +SIGNWRITING MOVEMENT FLOORPLANE WAVE SMALL, 121309 +SIGNWRITING MOVEMENT FLOORPLANE WAVE LARGE, 121310 +SIGNWRITING ROTATION FLOORPLANE SINGLE, 121311 +SIGNWRITING ROTATION FLOORPLANE DOUBLE, 121312 +SIGNWRITING ROTATION FLOORPLANE ALTERNATING, 121313 +SIGNWRITING MOVEMENT FLOORPLANE SHAKING PARALLEL, 121314 +SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE SMALL SINGLE, 121315 +SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE MEDIUM SINGLE, 121316 +SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE SMALL DOUBLE, 121317 +SIGNWRITING MOVEMENT WALLPLANE ARM CIRCLE MEDIUM DOUBLE, 121318 +SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE, 121319 +SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE, 121320 +SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE, 121321 +SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE, 121322 +SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE, 121323 +SIGNWRITING MOVEMENT FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE, 121324 +SIGNWRITING MOVEMENT WALLPLANE WRIST CIRCLE FRONT SINGLE, 121325 +SIGNWRITING MOVEMENT WALLPLANE WRIST CIRCLE FRONT DOUBLE, 121326 +SIGNWRITING MOVEMENT FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE, 121327 +SIGNWRITING MOVEMENT FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE, 121328 +SIGNWRITING MOVEMENT WALLPLANE FINGER CIRCLES SINGLE, 121329 +SIGNWRITING MOVEMENT WALLPLANE FINGER CIRCLES DOUBLE, 121330 +SIGNWRITING MOVEMENT FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE, 121331 +SIGNWRITING MOVEMENT FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE, 121332 +SIGNWRITING DYNAMIC ARROWHEAD SMALL, 121333 +SIGNWRITING DYNAMIC ARROWHEAD LARGE, 121334 +SIGNWRITING DYNAMIC FAST, 121335 +SIGNWRITING DYNAMIC SLOW, 121336 +SIGNWRITING DYNAMIC TENSE, 121337 +SIGNWRITING DYNAMIC RELAXED, 121338 +SIGNWRITING DYNAMIC SIMULTANEOUS, 121339 +SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING, 121340 +SIGNWRITING DYNAMIC EVERY OTHER TIME, 121341 +SIGNWRITING DYNAMIC GRADUAL, 121342 +SIGNWRITING HEAD, 121343 +SIGNWRITING HEAD RIM, 121344 +SIGNWRITING HEAD MOVEMENT WALLPLANE STRAIGHT, 121345 +SIGNWRITING HEAD MOVEMENT WALLPLANE TILT, 121346 +SIGNWRITING HEAD MOVEMENT FLOORPLANE STRAIGHT, 121347 +SIGNWRITING HEAD MOVEMENT WALLPLANE CURVE, 121348 +SIGNWRITING HEAD MOVEMENT FLOORPLANE CURVE, 121349 +SIGNWRITING HEAD MOVEMENT CIRCLE, 121350 +SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING, 121351 +SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN, 121352 +SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING, 121353 +SIGNWRITING EYEBROWS STRAIGHT UP, 121354 +SIGNWRITING EYEBROWS STRAIGHT NEUTRAL, 121355 +SIGNWRITING EYEBROWS STRAIGHT DOWN, 121356 +SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN, 121357 +SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL, 121358 +SIGNWRITING DREAMY EYEBROWS UP NEUTRAL, 121359 +SIGNWRITING DREAMY EYEBROWS NEUTRAL UP, 121360 +SIGNWRITING FOREHEAD NEUTRAL, 121361 +SIGNWRITING FOREHEAD CONTACT, 121362 +SIGNWRITING FOREHEAD WRINKLED, 121363 +SIGNWRITING EYES OPEN, 121364 +SIGNWRITING EYES SQUEEZED, 121365 +SIGNWRITING EYES CLOSED, 121366 +SIGNWRITING EYE BLINK SINGLE, 121367 +SIGNWRITING EYE BLINK MULTIPLE, 121368 +SIGNWRITING EYES HALF OPEN, 121369 +SIGNWRITING EYES WIDE OPEN, 121370 +SIGNWRITING EYES HALF CLOSED, 121371 +SIGNWRITING EYES WIDENING MOVEMENT, 121372 +SIGNWRITING EYE WINK, 121373 +SIGNWRITING EYELASHES UP, 121374 +SIGNWRITING EYELASHES DOWN, 121375 +SIGNWRITING EYELASHES FLUTTERING, 121376 +SIGNWRITING EYEGAZE WALLPLANE STRAIGHT, 121377 +SIGNWRITING EYEGAZE WALLPLANE STRAIGHT DOUBLE, 121378 +SIGNWRITING EYEGAZE WALLPLANE STRAIGHT ALTERNATING, 121379 +SIGNWRITING EYEGAZE FLOORPLANE STRAIGHT, 121380 +SIGNWRITING EYEGAZE FLOORPLANE STRAIGHT DOUBLE, 121381 +SIGNWRITING EYEGAZE FLOORPLANE STRAIGHT ALTERNATING, 121382 +SIGNWRITING EYEGAZE WALLPLANE CURVED, 121383 +SIGNWRITING EYEGAZE FLOORPLANE CURVED, 121384 +SIGNWRITING EYEGAZE WALLPLANE CIRCLING, 121385 +SIGNWRITING CHEEKS PUFFED, 121386 +SIGNWRITING CHEEKS NEUTRAL, 121387 +SIGNWRITING CHEEKS SUCKED, 121388 +SIGNWRITING TENSE CHEEKS HIGH, 121389 +SIGNWRITING TENSE CHEEKS MIDDLE, 121390 +SIGNWRITING TENSE CHEEKS LOW, 121391 +SIGNWRITING EARS, 121392 +SIGNWRITING NOSE NEUTRAL, 121393 +SIGNWRITING NOSE CONTACT, 121394 +SIGNWRITING NOSE WRINKLES, 121395 +SIGNWRITING NOSE WIGGLES, 121396 +SIGNWRITING AIR BLOWING OUT, 121397 +SIGNWRITING AIR SUCKING IN, 121398 +SIGNWRITING AIR BLOW SMALL ROTATIONS, 121399 +SIGNWRITING AIR SUCK SMALL ROTATIONS, 121400 +SIGNWRITING BREATH INHALE, 121401 +SIGNWRITING BREATH EXHALE, 121402 +SIGNWRITING MOUTH CLOSED NEUTRAL, 121403 +SIGNWRITING MOUTH CLOSED FORWARD, 121404 +SIGNWRITING MOUTH CLOSED CONTACT, 121405 +SIGNWRITING MOUTH SMILE, 121406 +SIGNWRITING MOUTH SMILE WRINKLED, 121407 +SIGNWRITING MOUTH SMILE OPEN, 121408 +SIGNWRITING MOUTH FROWN, 121409 +SIGNWRITING MOUTH FROWN WRINKLED, 121410 +SIGNWRITING MOUTH FROWN OPEN, 121411 +SIGNWRITING MOUTH OPEN CIRCLE, 121412 +SIGNWRITING MOUTH OPEN FORWARD, 121413 +SIGNWRITING MOUTH OPEN WRINKLED, 121414 +SIGNWRITING MOUTH OPEN OVAL, 121415 +SIGNWRITING MOUTH OPEN OVAL WRINKLED, 121416 +SIGNWRITING MOUTH OPEN OVAL YAWN, 121417 +SIGNWRITING MOUTH OPEN RECTANGLE, 121418 +SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED, 121419 +SIGNWRITING MOUTH OPEN RECTANGLE YAWN, 121420 +SIGNWRITING MOUTH KISS, 121421 +SIGNWRITING MOUTH KISS FORWARD, 121422 +SIGNWRITING MOUTH KISS WRINKLED, 121423 +SIGNWRITING MOUTH TENSE, 121424 +SIGNWRITING MOUTH TENSE FORWARD, 121425 +SIGNWRITING MOUTH TENSE SUCKED, 121426 +SIGNWRITING LIPS PRESSED TOGETHER, 121427 +SIGNWRITING LIP LOWER OVER UPPER, 121428 +SIGNWRITING LIP UPPER OVER LOWER, 121429 +SIGNWRITING MOUTH CORNERS, 121430 +SIGNWRITING MOUTH WRINKLES SINGLE, 121431 +SIGNWRITING MOUTH WRINKLES DOUBLE, 121432 +SIGNWRITING TONGUE STICKING OUT FAR, 121433 +SIGNWRITING TONGUE LICKING LIPS, 121434 +SIGNWRITING TONGUE TIP BETWEEN LIPS, 121435 +SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH, 121436 +SIGNWRITING TONGUE INSIDE MOUTH RELAXED, 121437 +SIGNWRITING TONGUE MOVES AGAINST CHEEK, 121438 +SIGNWRITING TONGUE CENTRE STICKING OUT, 121439 +SIGNWRITING TONGUE CENTRE INSIDE MOUTH, 121440 +SIGNWRITING TEETH, 121441 +SIGNWRITING TEETH MOVEMENT, 121442 +SIGNWRITING TEETH ON TONGUE, 121443 +SIGNWRITING TEETH ON TONGUE MOVEMENT, 121444 +SIGNWRITING TEETH ON LIPS, 121445 +SIGNWRITING TEETH ON LIPS MOVEMENT, 121446 +SIGNWRITING TEETH BITE LIPS, 121447 +SIGNWRITING MOVEMENT WALLPLANE JAW, 121448 +SIGNWRITING MOVEMENT FLOORPLANE JAW, 121449 +SIGNWRITING NECK, 121450 +SIGNWRITING HAIR, 121451 +SIGNWRITING EXCITEMENT, 121452 +SIGNWRITING SHOULDER HIP SPINE, 121453 +SIGNWRITING SHOULDER HIP POSITIONS, 121454 +SIGNWRITING WALLPLANE SHOULDER HIP MOVE, 121455 +SIGNWRITING FLOORPLANE SHOULDER HIP MOVE, 121456 +SIGNWRITING SHOULDER TILTING FROM WAIST, 121457 +SIGNWRITING TORSO WALLPLANE STRAIGHT STRETCH, 121458 +SIGNWRITING TORSO WALLPLANE CURVED BEND, 121459 +SIGNWRITING TORSO FLOORPLANE TWISTING, 121460 +SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS, 121461 +SIGNWRITING LIMB COMBINATION, 121462 +SIGNWRITING LIMB LENGTH 1, 121463 +SIGNWRITING LIMB LENGTH 2, 121464 +SIGNWRITING LIMB LENGTH 3, 121465 +SIGNWRITING LIMB LENGTH 4, 121466 +SIGNWRITING LIMB LENGTH 5, 121467 +SIGNWRITING LIMB LENGTH 6, 121468 +SIGNWRITING LIMB LENGTH 7, 121469 +SIGNWRITING FINGER, 121470 +SIGNWRITING LOCATION WALLPLANE SPACE, 121471 +SIGNWRITING LOCATION FLOORPLANE SPACE, 121472 +SIGNWRITING LOCATION HEIGHT, 121473 +SIGNWRITING LOCATION WIDTH, 121474 +SIGNWRITING LOCATION DEPTH, 121475 +SIGNWRITING LOCATION HEAD NECK, 121476 +SIGNWRITING LOCATION TORSO, 121477 +SIGNWRITING LOCATION LIMBS DIGITS, 121478 +SIGNWRITING COMMA, 121479 +SIGNWRITING FULL STOP, 121480 +SIGNWRITING SEMICOLON, 121481 +SIGNWRITING COLON, 121482 +SIGNWRITING PARENTHESIS, 121483 +SIGNWRITING FILL MODIFIER 2, 121499 +SIGNWRITING FILL MODIFIER 3, 121500 +SIGNWRITING FILL MODIFIER 4, 121501 +SIGNWRITING FILL MODIFIER 5, 121502 +SIGNWRITING FILL MODIFIER 6, 121503 +SIGNWRITING ROTATION MODIFIER 2, 121505 +SIGNWRITING ROTATION MODIFIER 3, 121506 +SIGNWRITING ROTATION MODIFIER 4, 121507 +SIGNWRITING ROTATION MODIFIER 5, 121508 +SIGNWRITING ROTATION MODIFIER 6, 121509 +SIGNWRITING ROTATION MODIFIER 7, 121510 +SIGNWRITING ROTATION MODIFIER 8, 121511 +SIGNWRITING ROTATION MODIFIER 9, 121512 +SIGNWRITING ROTATION MODIFIER 10, 121513 +SIGNWRITING ROTATION MODIFIER 11, 121514 +SIGNWRITING ROTATION MODIFIER 12, 121515 +SIGNWRITING ROTATION MODIFIER 13, 121516 +SIGNWRITING ROTATION MODIFIER 14, 121517 +SIGNWRITING ROTATION MODIFIER 15, 121518 +SIGNWRITING ROTATION MODIFIER 16, 121519 +COMBINING GLAGOLITIC LETTER AZU, 122880 +COMBINING GLAGOLITIC LETTER BUKY, 122881 +COMBINING GLAGOLITIC LETTER VEDE, 122882 +COMBINING GLAGOLITIC LETTER GLAGOLI, 122883 +COMBINING GLAGOLITIC LETTER DOBRO, 122884 +COMBINING GLAGOLITIC LETTER YESTU, 122885 +COMBINING GLAGOLITIC LETTER ZHIVETE, 122886 +COMBINING GLAGOLITIC LETTER ZEMLJA, 122888 +COMBINING GLAGOLITIC LETTER IZHE, 122889 +COMBINING GLAGOLITIC LETTER INITIAL IZHE, 122890 +COMBINING GLAGOLITIC LETTER I, 122891 +COMBINING GLAGOLITIC LETTER DJERVI, 122892 +COMBINING GLAGOLITIC LETTER KAKO, 122893 +COMBINING GLAGOLITIC LETTER LJUDIJE, 122894 +COMBINING GLAGOLITIC LETTER MYSLITE, 122895 +COMBINING GLAGOLITIC LETTER NASHI, 122896 +COMBINING GLAGOLITIC LETTER ONU, 122897 +COMBINING GLAGOLITIC LETTER POKOJI, 122898 +COMBINING GLAGOLITIC LETTER RITSI, 122899 +COMBINING GLAGOLITIC LETTER SLOVO, 122900 +COMBINING GLAGOLITIC LETTER TVRIDO, 122901 +COMBINING GLAGOLITIC LETTER UKU, 122902 +COMBINING GLAGOLITIC LETTER FRITU, 122903 +COMBINING GLAGOLITIC LETTER HERU, 122904 +COMBINING GLAGOLITIC LETTER SHTA, 122907 +COMBINING GLAGOLITIC LETTER TSI, 122908 +COMBINING GLAGOLITIC LETTER CHRIVI, 122909 +COMBINING GLAGOLITIC LETTER SHA, 122910 +COMBINING GLAGOLITIC LETTER YERU, 122911 +COMBINING GLAGOLITIC LETTER YERI, 122912 +COMBINING GLAGOLITIC LETTER YATI, 122913 +COMBINING GLAGOLITIC LETTER YU, 122915 +COMBINING GLAGOLITIC LETTER SMALL YUS, 122916 +COMBINING GLAGOLITIC LETTER YO, 122918 +COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS, 122919 +COMBINING GLAGOLITIC LETTER BIG YUS, 122920 +COMBINING GLAGOLITIC LETTER IOTATED BIG YUS, 122921 +COMBINING GLAGOLITIC LETTER FITA, 122922 +MENDE KIKAKUI SYLLABLE M001 KI, 124928 +MENDE KIKAKUI SYLLABLE M002 KA, 124929 +MENDE KIKAKUI SYLLABLE M003 KU, 124930 +MENDE KIKAKUI SYLLABLE M065 KEE, 124931 +MENDE KIKAKUI SYLLABLE M095 KE, 124932 +MENDE KIKAKUI SYLLABLE M076 KOO, 124933 +MENDE KIKAKUI SYLLABLE M048 KO, 124934 +MENDE KIKAKUI SYLLABLE M179 KUA, 124935 +MENDE KIKAKUI SYLLABLE M004 WI, 124936 +MENDE KIKAKUI SYLLABLE M005 WA, 124937 +MENDE KIKAKUI SYLLABLE M006 WU, 124938 +MENDE KIKAKUI SYLLABLE M126 WEE, 124939 +MENDE KIKAKUI SYLLABLE M118 WE, 124940 +MENDE KIKAKUI SYLLABLE M114 WOO, 124941 +MENDE KIKAKUI SYLLABLE M045 WO, 124942 +MENDE KIKAKUI SYLLABLE M194 WUI, 124943 +MENDE KIKAKUI SYLLABLE M143 WEI, 124944 +MENDE KIKAKUI SYLLABLE M061 WVI, 124945 +MENDE KIKAKUI SYLLABLE M049 WVA, 124946 +MENDE KIKAKUI SYLLABLE M139 WVE, 124947 +MENDE KIKAKUI SYLLABLE M007 MIN, 124948 +MENDE KIKAKUI SYLLABLE M008 MAN, 124949 +MENDE KIKAKUI SYLLABLE M009 MUN, 124950 +MENDE KIKAKUI SYLLABLE M059 MEN, 124951 +MENDE KIKAKUI SYLLABLE M094 MON, 124952 +MENDE KIKAKUI SYLLABLE M154 MUAN, 124953 +MENDE KIKAKUI SYLLABLE M189 MUEN, 124954 +MENDE KIKAKUI SYLLABLE M010 BI, 124955 +MENDE KIKAKUI SYLLABLE M011 BA, 124956 +MENDE KIKAKUI SYLLABLE M012 BU, 124957 +MENDE KIKAKUI SYLLABLE M150 BEE, 124958 +MENDE KIKAKUI SYLLABLE M097 BE, 124959 +MENDE KIKAKUI SYLLABLE M103 BOO, 124960 +MENDE KIKAKUI SYLLABLE M138 BO, 124961 +MENDE KIKAKUI SYLLABLE M013 I, 124962 +MENDE KIKAKUI SYLLABLE M014 A, 124963 +MENDE KIKAKUI SYLLABLE M015 U, 124964 +MENDE KIKAKUI SYLLABLE M163 EE, 124965 +MENDE KIKAKUI SYLLABLE M100 E, 124966 +MENDE KIKAKUI SYLLABLE M165 OO, 124967 +MENDE KIKAKUI SYLLABLE M147 O, 124968 +MENDE KIKAKUI SYLLABLE M137 EI, 124969 +MENDE KIKAKUI SYLLABLE M131 IN, 124970 +MENDE KIKAKUI SYLLABLE M135 IN, 124971 +MENDE KIKAKUI SYLLABLE M195 AN, 124972 +MENDE KIKAKUI SYLLABLE M178 EN, 124973 +MENDE KIKAKUI SYLLABLE M019 SI, 124974 +MENDE KIKAKUI SYLLABLE M020 SA, 124975 +MENDE KIKAKUI SYLLABLE M021 SU, 124976 +MENDE KIKAKUI SYLLABLE M162 SEE, 124977 +MENDE KIKAKUI SYLLABLE M116 SE, 124978 +MENDE KIKAKUI SYLLABLE M136 SOO, 124979 +MENDE KIKAKUI SYLLABLE M079 SO, 124980 +MENDE KIKAKUI SYLLABLE M196 SIA, 124981 +MENDE KIKAKUI SYLLABLE M025 LI, 124982 +MENDE KIKAKUI SYLLABLE M026 LA, 124983 +MENDE KIKAKUI SYLLABLE M027 LU, 124984 +MENDE KIKAKUI SYLLABLE M084 LEE, 124985 +MENDE KIKAKUI SYLLABLE M073 LE, 124986 +MENDE KIKAKUI SYLLABLE M054 LOO, 124987 +MENDE KIKAKUI SYLLABLE M153 LO, 124988 +MENDE KIKAKUI SYLLABLE M110 LONG LE, 124989 +MENDE KIKAKUI SYLLABLE M016 DI, 124990 +MENDE KIKAKUI SYLLABLE M017 DA, 124991 +MENDE KIKAKUI SYLLABLE M018 DU, 124992 +MENDE KIKAKUI SYLLABLE M089 DEE, 124993 +MENDE KIKAKUI SYLLABLE M180 DOO, 124994 +MENDE KIKAKUI SYLLABLE M181 DO, 124995 +MENDE KIKAKUI SYLLABLE M022 TI, 124996 +MENDE KIKAKUI SYLLABLE M023 TA, 124997 +MENDE KIKAKUI SYLLABLE M024 TU, 124998 +MENDE KIKAKUI SYLLABLE M091 TEE, 124999 +MENDE KIKAKUI SYLLABLE M055 TE, 125000 +MENDE KIKAKUI SYLLABLE M104 TOO, 125001 +MENDE KIKAKUI SYLLABLE M069 TO, 125002 +MENDE KIKAKUI SYLLABLE M028 JI, 125003 +MENDE KIKAKUI SYLLABLE M029 JA, 125004 +MENDE KIKAKUI SYLLABLE M030 JU, 125005 +MENDE KIKAKUI SYLLABLE M157 JEE, 125006 +MENDE KIKAKUI SYLLABLE M113 JE, 125007 +MENDE KIKAKUI SYLLABLE M160 JOO, 125008 +MENDE KIKAKUI SYLLABLE M063 JO, 125009 +MENDE KIKAKUI SYLLABLE M175 LONG JO, 125010 +MENDE KIKAKUI SYLLABLE M031 YI, 125011 +MENDE KIKAKUI SYLLABLE M032 YA, 125012 +MENDE KIKAKUI SYLLABLE M033 YU, 125013 +MENDE KIKAKUI SYLLABLE M109 YEE, 125014 +MENDE KIKAKUI SYLLABLE M080 YE, 125015 +MENDE KIKAKUI SYLLABLE M141 YOO, 125016 +MENDE KIKAKUI SYLLABLE M121 YO, 125017 +MENDE KIKAKUI SYLLABLE M034 FI, 125018 +MENDE KIKAKUI SYLLABLE M035 FA, 125019 +MENDE KIKAKUI SYLLABLE M036 FU, 125020 +MENDE KIKAKUI SYLLABLE M078 FEE, 125021 +MENDE KIKAKUI SYLLABLE M075 FE, 125022 +MENDE KIKAKUI SYLLABLE M133 FOO, 125023 +MENDE KIKAKUI SYLLABLE M088 FO, 125024 +MENDE KIKAKUI SYLLABLE M197 FUA, 125025 +MENDE KIKAKUI SYLLABLE M101 FAN, 125026 +MENDE KIKAKUI SYLLABLE M037 NIN, 125027 +MENDE KIKAKUI SYLLABLE M038 NAN, 125028 +MENDE KIKAKUI SYLLABLE M039 NUN, 125029 +MENDE KIKAKUI SYLLABLE M117 NEN, 125030 +MENDE KIKAKUI SYLLABLE M169 NON, 125031 +MENDE KIKAKUI SYLLABLE M176 HI, 125032 +MENDE KIKAKUI SYLLABLE M041 HA, 125033 +MENDE KIKAKUI SYLLABLE M186 HU, 125034 +MENDE KIKAKUI SYLLABLE M040 HEE, 125035 +MENDE KIKAKUI SYLLABLE M096 HE, 125036 +MENDE KIKAKUI SYLLABLE M042 HOO, 125037 +MENDE KIKAKUI SYLLABLE M140 HO, 125038 +MENDE KIKAKUI SYLLABLE M083 HEEI, 125039 +MENDE KIKAKUI SYLLABLE M128 HOOU, 125040 +MENDE KIKAKUI SYLLABLE M053 HIN, 125041 +MENDE KIKAKUI SYLLABLE M130 HAN, 125042 +MENDE KIKAKUI SYLLABLE M087 HUN, 125043 +MENDE KIKAKUI SYLLABLE M052 HEN, 125044 +MENDE KIKAKUI SYLLABLE M193 HON, 125045 +MENDE KIKAKUI SYLLABLE M046 HUAN, 125046 +MENDE KIKAKUI SYLLABLE M090 NGGI, 125047 +MENDE KIKAKUI SYLLABLE M043 NGGA, 125048 +MENDE KIKAKUI SYLLABLE M082 NGGU, 125049 +MENDE KIKAKUI SYLLABLE M115 NGGEE, 125050 +MENDE KIKAKUI SYLLABLE M146 NGGE, 125051 +MENDE KIKAKUI SYLLABLE M156 NGGOO, 125052 +MENDE KIKAKUI SYLLABLE M120 NGGO, 125053 +MENDE KIKAKUI SYLLABLE M159 NGGAA, 125054 +MENDE KIKAKUI SYLLABLE M127 NGGUA, 125055 +MENDE KIKAKUI SYLLABLE M086 LONG NGGE, 125056 +MENDE KIKAKUI SYLLABLE M106 LONG NGGOO, 125057 +MENDE KIKAKUI SYLLABLE M183 LONG NGGO, 125058 +MENDE KIKAKUI SYLLABLE M155 GI, 125059 +MENDE KIKAKUI SYLLABLE M111 GA, 125060 +MENDE KIKAKUI SYLLABLE M168 GU, 125061 +MENDE KIKAKUI SYLLABLE M190 GEE, 125062 +MENDE KIKAKUI SYLLABLE M166 GUEI, 125063 +MENDE KIKAKUI SYLLABLE M167 GUAN, 125064 +MENDE KIKAKUI SYLLABLE M184 NGEN, 125065 +MENDE KIKAKUI SYLLABLE M057 NGON, 125066 +MENDE KIKAKUI SYLLABLE M177 NGUAN, 125067 +MENDE KIKAKUI SYLLABLE M068 PI, 125068 +MENDE KIKAKUI SYLLABLE M099 PA, 125069 +MENDE KIKAKUI SYLLABLE M050 PU, 125070 +MENDE KIKAKUI SYLLABLE M081 PEE, 125071 +MENDE KIKAKUI SYLLABLE M051 PE, 125072 +MENDE KIKAKUI SYLLABLE M102 POO, 125073 +MENDE KIKAKUI SYLLABLE M066 PO, 125074 +MENDE KIKAKUI SYLLABLE M145 MBI, 125075 +MENDE KIKAKUI SYLLABLE M062 MBA, 125076 +MENDE KIKAKUI SYLLABLE M122 MBU, 125077 +MENDE KIKAKUI SYLLABLE M047 MBEE, 125078 +MENDE KIKAKUI SYLLABLE M188 MBEE, 125079 +MENDE KIKAKUI SYLLABLE M072 MBE, 125080 +MENDE KIKAKUI SYLLABLE M172 MBOO, 125081 +MENDE KIKAKUI SYLLABLE M174 MBO, 125082 +MENDE KIKAKUI SYLLABLE M187 MBUU, 125083 +MENDE KIKAKUI SYLLABLE M161 LONG MBE, 125084 +MENDE KIKAKUI SYLLABLE M105 LONG MBOO, 125085 +MENDE KIKAKUI SYLLABLE M142 LONG MBO, 125086 +MENDE KIKAKUI SYLLABLE M132 KPI, 125087 +MENDE KIKAKUI SYLLABLE M092 KPA, 125088 +MENDE KIKAKUI SYLLABLE M074 KPU, 125089 +MENDE KIKAKUI SYLLABLE M044 KPEE, 125090 +MENDE KIKAKUI SYLLABLE M108 KPE, 125091 +MENDE KIKAKUI SYLLABLE M112 KPOO, 125092 +MENDE KIKAKUI SYLLABLE M158 KPO, 125093 +MENDE KIKAKUI SYLLABLE M124 GBI, 125094 +MENDE KIKAKUI SYLLABLE M056 GBA, 125095 +MENDE KIKAKUI SYLLABLE M148 GBU, 125096 +MENDE KIKAKUI SYLLABLE M093 GBEE, 125097 +MENDE KIKAKUI SYLLABLE M107 GBE, 125098 +MENDE KIKAKUI SYLLABLE M071 GBOO, 125099 +MENDE KIKAKUI SYLLABLE M070 GBO, 125100 +MENDE KIKAKUI SYLLABLE M171 RA, 125101 +MENDE KIKAKUI SYLLABLE M123 NDI, 125102 +MENDE KIKAKUI SYLLABLE M129 NDA, 125103 +MENDE KIKAKUI SYLLABLE M125 NDU, 125104 +MENDE KIKAKUI SYLLABLE M191 NDEE, 125105 +MENDE KIKAKUI SYLLABLE M119 NDE, 125106 +MENDE KIKAKUI SYLLABLE M067 NDOO, 125107 +MENDE KIKAKUI SYLLABLE M064 NDO, 125108 +MENDE KIKAKUI SYLLABLE M152 NJA, 125109 +MENDE KIKAKUI SYLLABLE M192 NJU, 125110 +MENDE KIKAKUI SYLLABLE M149 NJEE, 125111 +MENDE KIKAKUI SYLLABLE M134 NJOO, 125112 +MENDE KIKAKUI SYLLABLE M182 VI, 125113 +MENDE KIKAKUI SYLLABLE M185 VA, 125114 +MENDE KIKAKUI SYLLABLE M151 VU, 125115 +MENDE KIKAKUI SYLLABLE M173 VEE, 125116 +MENDE KIKAKUI SYLLABLE M085 VE, 125117 +MENDE KIKAKUI SYLLABLE M144 VOO, 125118 +MENDE KIKAKUI SYLLABLE M077 VO, 125119 +MENDE KIKAKUI SYLLABLE M164 NYIN, 125120 +MENDE KIKAKUI SYLLABLE M058 NYAN, 125121 +MENDE KIKAKUI SYLLABLE M170 NYUN, 125122 +MENDE KIKAKUI SYLLABLE M098 NYEN, 125123 +MENDE KIKAKUI SYLLABLE M060 NYON, 125124 +MENDE KIKAKUI DIGIT ONE, 125127 +MENDE KIKAKUI DIGIT TWO, 125128 +MENDE KIKAKUI DIGIT THREE, 125129 +MENDE KIKAKUI DIGIT FOUR, 125130 +MENDE KIKAKUI DIGIT FIVE, 125131 +MENDE KIKAKUI DIGIT SIX, 125132 +MENDE KIKAKUI DIGIT SEVEN, 125133 +MENDE KIKAKUI DIGIT EIGHT, 125134 +MENDE KIKAKUI DIGIT NINE, 125135 +MENDE KIKAKUI COMBINING NUMBER TEENS, 125136 +MENDE KIKAKUI COMBINING NUMBER TENS, 125137 +MENDE KIKAKUI COMBINING NUMBER HUNDREDS, 125138 +MENDE KIKAKUI COMBINING NUMBER THOUSANDS, 125139 +MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS, 125140 +MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, 125141 +MENDE KIKAKUI COMBINING NUMBER MILLIONS, 125142 +ADLAM CAPITAL LETTER ALIF, 125184 +ADLAM CAPITAL LETTER DAALI, 125185 +ADLAM CAPITAL LETTER LAAM, 125186 +ADLAM CAPITAL LETTER MIIM, 125187 +ADLAM CAPITAL LETTER BA, 125188 +ADLAM CAPITAL LETTER SINNYIIYHE, 125189 +ADLAM CAPITAL LETTER PE, 125190 +ADLAM CAPITAL LETTER BHE, 125191 +ADLAM CAPITAL LETTER RA, 125192 +ADLAM CAPITAL LETTER E, 125193 +ADLAM CAPITAL LETTER FA, 125194 +ADLAM CAPITAL LETTER I, 125195 +ADLAM CAPITAL LETTER O, 125196 +ADLAM CAPITAL LETTER DHA, 125197 +ADLAM CAPITAL LETTER YHE, 125198 +ADLAM CAPITAL LETTER WAW, 125199 +ADLAM CAPITAL LETTER NUN, 125200 +ADLAM CAPITAL LETTER KAF, 125201 +ADLAM CAPITAL LETTER YA, 125202 +ADLAM CAPITAL LETTER U, 125203 +ADLAM CAPITAL LETTER JIIM, 125204 +ADLAM CAPITAL LETTER CHI, 125205 +ADLAM CAPITAL LETTER HA, 125206 +ADLAM CAPITAL LETTER QAAF, 125207 +ADLAM CAPITAL LETTER GA, 125208 +ADLAM CAPITAL LETTER NYA, 125209 +ADLAM CAPITAL LETTER TU, 125210 +ADLAM CAPITAL LETTER NHA, 125211 +ADLAM CAPITAL LETTER VA, 125212 +ADLAM CAPITAL LETTER KHA, 125213 +ADLAM CAPITAL LETTER GBE, 125214 +ADLAM CAPITAL LETTER ZAL, 125215 +ADLAM CAPITAL LETTER KPO, 125216 +ADLAM CAPITAL LETTER SHA, 125217 +ADLAM SMALL LETTER ALIF, 125218 +ADLAM SMALL LETTER DAALI, 125219 +ADLAM SMALL LETTER LAAM, 125220 +ADLAM SMALL LETTER MIIM, 125221 +ADLAM SMALL LETTER BA, 125222 +ADLAM SMALL LETTER SINNYIIYHE, 125223 +ADLAM SMALL LETTER PE, 125224 +ADLAM SMALL LETTER BHE, 125225 +ADLAM SMALL LETTER RA, 125226 +ADLAM SMALL LETTER E, 125227 +ADLAM SMALL LETTER FA, 125228 +ADLAM SMALL LETTER I, 125229 +ADLAM SMALL LETTER O, 125230 +ADLAM SMALL LETTER DHA, 125231 +ADLAM SMALL LETTER YHE, 125232 +ADLAM SMALL LETTER WAW, 125233 +ADLAM SMALL LETTER NUN, 125234 +ADLAM SMALL LETTER KAF, 125235 +ADLAM SMALL LETTER YA, 125236 +ADLAM SMALL LETTER U, 125237 +ADLAM SMALL LETTER JIIM, 125238 +ADLAM SMALL LETTER CHI, 125239 +ADLAM SMALL LETTER HA, 125240 +ADLAM SMALL LETTER QAAF, 125241 +ADLAM SMALL LETTER GA, 125242 +ADLAM SMALL LETTER NYA, 125243 +ADLAM SMALL LETTER TU, 125244 +ADLAM SMALL LETTER NHA, 125245 +ADLAM SMALL LETTER VA, 125246 +ADLAM SMALL LETTER KHA, 125247 +ADLAM SMALL LETTER GBE, 125248 +ADLAM SMALL LETTER ZAL, 125249 +ADLAM SMALL LETTER KPO, 125250 +ADLAM SMALL LETTER SHA, 125251 +ADLAM ALIF LENGTHENER, 125252 +ADLAM VOWEL LENGTHENER, 125253 +ADLAM GEMINATION MARK, 125254 +ADLAM HAMZA, 125255 +ADLAM CONSONANT MODIFIER, 125256 +ADLAM GEMINATE CONSONANT MODIFIER, 125257 +ADLAM NUKTA, 125258 +ADLAM DIGIT ZERO, 125264 +ADLAM DIGIT ONE, 125265 +ADLAM DIGIT TWO, 125266 +ADLAM DIGIT THREE, 125267 +ADLAM DIGIT FOUR, 125268 +ADLAM DIGIT FIVE, 125269 +ADLAM DIGIT SIX, 125270 +ADLAM DIGIT SEVEN, 125271 +ADLAM DIGIT EIGHT, 125272 +ADLAM DIGIT NINE, 125273 +ADLAM INITIAL EXCLAMATION MARK, 125278 +ADLAM INITIAL QUESTION MARK, 125279 +ARABIC MATHEMATICAL ALEF, 126464 +ARABIC MATHEMATICAL BEH, 126465 +ARABIC MATHEMATICAL JEEM, 126466 +ARABIC MATHEMATICAL DAL, 126467 +ARABIC MATHEMATICAL WAW, 126469 +ARABIC MATHEMATICAL ZAIN, 126470 +ARABIC MATHEMATICAL HAH, 126471 +ARABIC MATHEMATICAL TAH, 126472 +ARABIC MATHEMATICAL YEH, 126473 +ARABIC MATHEMATICAL KAF, 126474 +ARABIC MATHEMATICAL LAM, 126475 +ARABIC MATHEMATICAL MEEM, 126476 +ARABIC MATHEMATICAL NOON, 126477 +ARABIC MATHEMATICAL SEEN, 126478 +ARABIC MATHEMATICAL AIN, 126479 +ARABIC MATHEMATICAL FEH, 126480 +ARABIC MATHEMATICAL SAD, 126481 +ARABIC MATHEMATICAL QAF, 126482 +ARABIC MATHEMATICAL REH, 126483 +ARABIC MATHEMATICAL SHEEN, 126484 +ARABIC MATHEMATICAL TEH, 126485 +ARABIC MATHEMATICAL THEH, 126486 +ARABIC MATHEMATICAL KHAH, 126487 +ARABIC MATHEMATICAL THAL, 126488 +ARABIC MATHEMATICAL DAD, 126489 +ARABIC MATHEMATICAL ZAH, 126490 +ARABIC MATHEMATICAL GHAIN, 126491 +ARABIC MATHEMATICAL DOTLESS BEH, 126492 +ARABIC MATHEMATICAL DOTLESS NOON, 126493 +ARABIC MATHEMATICAL DOTLESS FEH, 126494 +ARABIC MATHEMATICAL DOTLESS QAF, 126495 +ARABIC MATHEMATICAL INITIAL BEH, 126497 +ARABIC MATHEMATICAL INITIAL JEEM, 126498 +ARABIC MATHEMATICAL INITIAL HEH, 126500 +ARABIC MATHEMATICAL INITIAL HAH, 126503 +ARABIC MATHEMATICAL INITIAL YEH, 126505 +ARABIC MATHEMATICAL INITIAL KAF, 126506 +ARABIC MATHEMATICAL INITIAL LAM, 126507 +ARABIC MATHEMATICAL INITIAL MEEM, 126508 +ARABIC MATHEMATICAL INITIAL NOON, 126509 +ARABIC MATHEMATICAL INITIAL SEEN, 126510 +ARABIC MATHEMATICAL INITIAL AIN, 126511 +ARABIC MATHEMATICAL INITIAL FEH, 126512 +ARABIC MATHEMATICAL INITIAL SAD, 126513 +ARABIC MATHEMATICAL INITIAL QAF, 126514 +ARABIC MATHEMATICAL INITIAL SHEEN, 126516 +ARABIC MATHEMATICAL INITIAL TEH, 126517 +ARABIC MATHEMATICAL INITIAL THEH, 126518 +ARABIC MATHEMATICAL INITIAL KHAH, 126519 +ARABIC MATHEMATICAL INITIAL DAD, 126521 +ARABIC MATHEMATICAL INITIAL GHAIN, 126523 +ARABIC MATHEMATICAL TAILED JEEM, 126530 +ARABIC MATHEMATICAL TAILED HAH, 126535 +ARABIC MATHEMATICAL TAILED YEH, 126537 +ARABIC MATHEMATICAL TAILED LAM, 126539 +ARABIC MATHEMATICAL TAILED NOON, 126541 +ARABIC MATHEMATICAL TAILED SEEN, 126542 +ARABIC MATHEMATICAL TAILED AIN, 126543 +ARABIC MATHEMATICAL TAILED SAD, 126545 +ARABIC MATHEMATICAL TAILED QAF, 126546 +ARABIC MATHEMATICAL TAILED SHEEN, 126548 +ARABIC MATHEMATICAL TAILED KHAH, 126551 +ARABIC MATHEMATICAL TAILED DAD, 126553 +ARABIC MATHEMATICAL TAILED GHAIN, 126555 +ARABIC MATHEMATICAL TAILED DOTLESS NOON, 126557 +ARABIC MATHEMATICAL TAILED DOTLESS QAF, 126559 +ARABIC MATHEMATICAL STRETCHED BEH, 126561 +ARABIC MATHEMATICAL STRETCHED JEEM, 126562 +ARABIC MATHEMATICAL STRETCHED HEH, 126564 +ARABIC MATHEMATICAL STRETCHED HAH, 126567 +ARABIC MATHEMATICAL STRETCHED TAH, 126568 +ARABIC MATHEMATICAL STRETCHED YEH, 126569 +ARABIC MATHEMATICAL STRETCHED KAF, 126570 +ARABIC MATHEMATICAL STRETCHED MEEM, 126572 +ARABIC MATHEMATICAL STRETCHED NOON, 126573 +ARABIC MATHEMATICAL STRETCHED SEEN, 126574 +ARABIC MATHEMATICAL STRETCHED AIN, 126575 +ARABIC MATHEMATICAL STRETCHED FEH, 126576 +ARABIC MATHEMATICAL STRETCHED SAD, 126577 +ARABIC MATHEMATICAL STRETCHED QAF, 126578 +ARABIC MATHEMATICAL STRETCHED SHEEN, 126580 +ARABIC MATHEMATICAL STRETCHED TEH, 126581 +ARABIC MATHEMATICAL STRETCHED THEH, 126582 +ARABIC MATHEMATICAL STRETCHED KHAH, 126583 +ARABIC MATHEMATICAL STRETCHED DAD, 126585 +ARABIC MATHEMATICAL STRETCHED ZAH, 126586 +ARABIC MATHEMATICAL STRETCHED GHAIN, 126587 +ARABIC MATHEMATICAL STRETCHED DOTLESS BEH, 126588 +ARABIC MATHEMATICAL STRETCHED DOTLESS FEH, 126590 +ARABIC MATHEMATICAL LOOPED ALEF, 126592 +ARABIC MATHEMATICAL LOOPED BEH, 126593 +ARABIC MATHEMATICAL LOOPED JEEM, 126594 +ARABIC MATHEMATICAL LOOPED DAL, 126595 +ARABIC MATHEMATICAL LOOPED HEH, 126596 +ARABIC MATHEMATICAL LOOPED WAW, 126597 +ARABIC MATHEMATICAL LOOPED ZAIN, 126598 +ARABIC MATHEMATICAL LOOPED HAH, 126599 +ARABIC MATHEMATICAL LOOPED TAH, 126600 +ARABIC MATHEMATICAL LOOPED YEH, 126601 +ARABIC MATHEMATICAL LOOPED LAM, 126603 +ARABIC MATHEMATICAL LOOPED MEEM, 126604 +ARABIC MATHEMATICAL LOOPED NOON, 126605 +ARABIC MATHEMATICAL LOOPED SEEN, 126606 +ARABIC MATHEMATICAL LOOPED AIN, 126607 +ARABIC MATHEMATICAL LOOPED FEH, 126608 +ARABIC MATHEMATICAL LOOPED SAD, 126609 +ARABIC MATHEMATICAL LOOPED QAF, 126610 +ARABIC MATHEMATICAL LOOPED REH, 126611 +ARABIC MATHEMATICAL LOOPED SHEEN, 126612 +ARABIC MATHEMATICAL LOOPED TEH, 126613 +ARABIC MATHEMATICAL LOOPED THEH, 126614 +ARABIC MATHEMATICAL LOOPED KHAH, 126615 +ARABIC MATHEMATICAL LOOPED THAL, 126616 +ARABIC MATHEMATICAL LOOPED DAD, 126617 +ARABIC MATHEMATICAL LOOPED ZAH, 126618 +ARABIC MATHEMATICAL LOOPED GHAIN, 126619 +ARABIC MATHEMATICAL DOUBLE STRUCK BEH, 126625 +ARABIC MATHEMATICAL DOUBLE STRUCK JEEM, 126626 +ARABIC MATHEMATICAL DOUBLE STRUCK DAL, 126627 +ARABIC MATHEMATICAL DOUBLE STRUCK WAW, 126629 +ARABIC MATHEMATICAL DOUBLE STRUCK ZAIN, 126630 +ARABIC MATHEMATICAL DOUBLE STRUCK HAH, 126631 +ARABIC MATHEMATICAL DOUBLE STRUCK TAH, 126632 +ARABIC MATHEMATICAL DOUBLE STRUCK YEH, 126633 +ARABIC MATHEMATICAL DOUBLE STRUCK LAM, 126635 +ARABIC MATHEMATICAL DOUBLE STRUCK MEEM, 126636 +ARABIC MATHEMATICAL DOUBLE STRUCK NOON, 126637 +ARABIC MATHEMATICAL DOUBLE STRUCK SEEN, 126638 +ARABIC MATHEMATICAL DOUBLE STRUCK AIN, 126639 +ARABIC MATHEMATICAL DOUBLE STRUCK FEH, 126640 +ARABIC MATHEMATICAL DOUBLE STRUCK SAD, 126641 +ARABIC MATHEMATICAL DOUBLE STRUCK QAF, 126642 +ARABIC MATHEMATICAL DOUBLE STRUCK REH, 126643 +ARABIC MATHEMATICAL DOUBLE STRUCK SHEEN, 126644 +ARABIC MATHEMATICAL DOUBLE STRUCK TEH, 126645 +ARABIC MATHEMATICAL DOUBLE STRUCK THEH, 126646 +ARABIC MATHEMATICAL DOUBLE STRUCK KHAH, 126647 +ARABIC MATHEMATICAL DOUBLE STRUCK THAL, 126648 +ARABIC MATHEMATICAL DOUBLE STRUCK DAD, 126649 +ARABIC MATHEMATICAL DOUBLE STRUCK ZAH, 126650 +ARABIC MATHEMATICAL DOUBLE STRUCK GHAIN, 126651 +ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL, 126704 +ARABIC MATHEMATICAL OPERATOR HAH WITH DAL, 126705 +MAHJONG TILE EAST WIND, 126976 +MAHJONG TILE SOUTH WIND, 126977 +MAHJONG TILE WEST WIND, 126978 +MAHJONG TILE NORTH WIND, 126979 +MAHJONG TILE RED DRAGON, 126980 +MAHJONG TILE GREEN DRAGON, 126981 +MAHJONG TILE WHITE DRAGON, 126982 +MAHJONG TILE ONE OF CHARACTERS, 126983 +MAHJONG TILE TWO OF CHARACTERS, 126984 +MAHJONG TILE THREE OF CHARACTERS, 126985 +MAHJONG TILE FOUR OF CHARACTERS, 126986 +MAHJONG TILE FIVE OF CHARACTERS, 126987 +MAHJONG TILE SIX OF CHARACTERS, 126988 +MAHJONG TILE SEVEN OF CHARACTERS, 126989 +MAHJONG TILE EIGHT OF CHARACTERS, 126990 +MAHJONG TILE NINE OF CHARACTERS, 126991 +MAHJONG TILE ONE OF BAMBOOS, 126992 +MAHJONG TILE TWO OF BAMBOOS, 126993 +MAHJONG TILE THREE OF BAMBOOS, 126994 +MAHJONG TILE FOUR OF BAMBOOS, 126995 +MAHJONG TILE FIVE OF BAMBOOS, 126996 +MAHJONG TILE SIX OF BAMBOOS, 126997 +MAHJONG TILE SEVEN OF BAMBOOS, 126998 +MAHJONG TILE EIGHT OF BAMBOOS, 126999 +MAHJONG TILE NINE OF BAMBOOS, 127000 +MAHJONG TILE ONE OF CIRCLES, 127001 +MAHJONG TILE TWO OF CIRCLES, 127002 +MAHJONG TILE THREE OF CIRCLES, 127003 +MAHJONG TILE FOUR OF CIRCLES, 127004 +MAHJONG TILE FIVE OF CIRCLES, 127005 +MAHJONG TILE SIX OF CIRCLES, 127006 +MAHJONG TILE SEVEN OF CIRCLES, 127007 +MAHJONG TILE EIGHT OF CIRCLES, 127008 +MAHJONG TILE NINE OF CIRCLES, 127009 +MAHJONG TILE PLUM, 127010 +MAHJONG TILE ORCHID, 127011 +MAHJONG TILE BAMBOO, 127012 +MAHJONG TILE CHRYSANTHEMUM, 127013 +MAHJONG TILE SPRING, 127014 +MAHJONG TILE SUMMER, 127015 +MAHJONG TILE AUTUMN, 127016 +MAHJONG TILE WINTER, 127017 +MAHJONG TILE JOKER, 127018 +MAHJONG TILE BACK, 127019 +DOMINO TILE HORIZONTAL BACK, 127024 +DOMINO TILE HORIZONTAL 00 00, 127025 +DOMINO TILE HORIZONTAL 00 01, 127026 +DOMINO TILE HORIZONTAL 00 02, 127027 +DOMINO TILE HORIZONTAL 00 03, 127028 +DOMINO TILE HORIZONTAL 00 04, 127029 +DOMINO TILE HORIZONTAL 00 05, 127030 +DOMINO TILE HORIZONTAL 00 06, 127031 +DOMINO TILE HORIZONTAL 01 00, 127032 +DOMINO TILE HORIZONTAL 01 01, 127033 +DOMINO TILE HORIZONTAL 01 02, 127034 +DOMINO TILE HORIZONTAL 01 03, 127035 +DOMINO TILE HORIZONTAL 01 04, 127036 +DOMINO TILE HORIZONTAL 01 05, 127037 +DOMINO TILE HORIZONTAL 01 06, 127038 +DOMINO TILE HORIZONTAL 02 00, 127039 +DOMINO TILE HORIZONTAL 02 01, 127040 +DOMINO TILE HORIZONTAL 02 02, 127041 +DOMINO TILE HORIZONTAL 02 03, 127042 +DOMINO TILE HORIZONTAL 02 04, 127043 +DOMINO TILE HORIZONTAL 02 05, 127044 +DOMINO TILE HORIZONTAL 02 06, 127045 +DOMINO TILE HORIZONTAL 03 00, 127046 +DOMINO TILE HORIZONTAL 03 01, 127047 +DOMINO TILE HORIZONTAL 03 02, 127048 +DOMINO TILE HORIZONTAL 03 03, 127049 +DOMINO TILE HORIZONTAL 03 04, 127050 +DOMINO TILE HORIZONTAL 03 05, 127051 +DOMINO TILE HORIZONTAL 03 06, 127052 +DOMINO TILE HORIZONTAL 04 00, 127053 +DOMINO TILE HORIZONTAL 04 01, 127054 +DOMINO TILE HORIZONTAL 04 02, 127055 +DOMINO TILE HORIZONTAL 04 03, 127056 +DOMINO TILE HORIZONTAL 04 04, 127057 +DOMINO TILE HORIZONTAL 04 05, 127058 +DOMINO TILE HORIZONTAL 04 06, 127059 +DOMINO TILE HORIZONTAL 05 00, 127060 +DOMINO TILE HORIZONTAL 05 01, 127061 +DOMINO TILE HORIZONTAL 05 02, 127062 +DOMINO TILE HORIZONTAL 05 03, 127063 +DOMINO TILE HORIZONTAL 05 04, 127064 +DOMINO TILE HORIZONTAL 05 05, 127065 +DOMINO TILE HORIZONTAL 05 06, 127066 +DOMINO TILE HORIZONTAL 06 00, 127067 +DOMINO TILE HORIZONTAL 06 01, 127068 +DOMINO TILE HORIZONTAL 06 02, 127069 +DOMINO TILE HORIZONTAL 06 03, 127070 +DOMINO TILE HORIZONTAL 06 04, 127071 +DOMINO TILE HORIZONTAL 06 05, 127072 +DOMINO TILE HORIZONTAL 06 06, 127073 +DOMINO TILE VERTICAL BACK, 127074 +DOMINO TILE VERTICAL 00 00, 127075 +DOMINO TILE VERTICAL 00 01, 127076 +DOMINO TILE VERTICAL 00 02, 127077 +DOMINO TILE VERTICAL 00 03, 127078 +DOMINO TILE VERTICAL 00 04, 127079 +DOMINO TILE VERTICAL 00 05, 127080 +DOMINO TILE VERTICAL 00 06, 127081 +DOMINO TILE VERTICAL 01 00, 127082 +DOMINO TILE VERTICAL 01 01, 127083 +DOMINO TILE VERTICAL 01 02, 127084 +DOMINO TILE VERTICAL 01 03, 127085 +DOMINO TILE VERTICAL 01 04, 127086 +DOMINO TILE VERTICAL 01 05, 127087 +DOMINO TILE VERTICAL 01 06, 127088 +DOMINO TILE VERTICAL 02 00, 127089 +DOMINO TILE VERTICAL 02 01, 127090 +DOMINO TILE VERTICAL 02 02, 127091 +DOMINO TILE VERTICAL 02 03, 127092 +DOMINO TILE VERTICAL 02 04, 127093 +DOMINO TILE VERTICAL 02 05, 127094 +DOMINO TILE VERTICAL 02 06, 127095 +DOMINO TILE VERTICAL 03 00, 127096 +DOMINO TILE VERTICAL 03 01, 127097 +DOMINO TILE VERTICAL 03 02, 127098 +DOMINO TILE VERTICAL 03 03, 127099 +DOMINO TILE VERTICAL 03 04, 127100 +DOMINO TILE VERTICAL 03 05, 127101 +DOMINO TILE VERTICAL 03 06, 127102 +DOMINO TILE VERTICAL 04 00, 127103 +DOMINO TILE VERTICAL 04 01, 127104 +DOMINO TILE VERTICAL 04 02, 127105 +DOMINO TILE VERTICAL 04 03, 127106 +DOMINO TILE VERTICAL 04 04, 127107 +DOMINO TILE VERTICAL 04 05, 127108 +DOMINO TILE VERTICAL 04 06, 127109 +DOMINO TILE VERTICAL 05 00, 127110 +DOMINO TILE VERTICAL 05 01, 127111 +DOMINO TILE VERTICAL 05 02, 127112 +DOMINO TILE VERTICAL 05 03, 127113 +DOMINO TILE VERTICAL 05 04, 127114 +DOMINO TILE VERTICAL 05 05, 127115 +DOMINO TILE VERTICAL 05 06, 127116 +DOMINO TILE VERTICAL 06 00, 127117 +DOMINO TILE VERTICAL 06 01, 127118 +DOMINO TILE VERTICAL 06 02, 127119 +DOMINO TILE VERTICAL 06 03, 127120 +DOMINO TILE VERTICAL 06 04, 127121 +DOMINO TILE VERTICAL 06 05, 127122 +DOMINO TILE VERTICAL 06 06, 127123 +PLAYING CARD BACK, 127136 +PLAYING CARD ACE OF SPADES, 127137 +PLAYING CARD TWO OF SPADES, 127138 +PLAYING CARD THREE OF SPADES, 127139 +PLAYING CARD FOUR OF SPADES, 127140 +PLAYING CARD FIVE OF SPADES, 127141 +PLAYING CARD SIX OF SPADES, 127142 +PLAYING CARD SEVEN OF SPADES, 127143 +PLAYING CARD EIGHT OF SPADES, 127144 +PLAYING CARD NINE OF SPADES, 127145 +PLAYING CARD TEN OF SPADES, 127146 +PLAYING CARD JACK OF SPADES, 127147 +PLAYING CARD KNIGHT OF SPADES, 127148 +PLAYING CARD QUEEN OF SPADES, 127149 +PLAYING CARD KING OF SPADES, 127150 +PLAYING CARD ACE OF HEARTS, 127153 +PLAYING CARD TWO OF HEARTS, 127154 +PLAYING CARD THREE OF HEARTS, 127155 +PLAYING CARD FOUR OF HEARTS, 127156 +PLAYING CARD FIVE OF HEARTS, 127157 +PLAYING CARD SIX OF HEARTS, 127158 +PLAYING CARD SEVEN OF HEARTS, 127159 +PLAYING CARD EIGHT OF HEARTS, 127160 +PLAYING CARD NINE OF HEARTS, 127161 +PLAYING CARD TEN OF HEARTS, 127162 +PLAYING CARD JACK OF HEARTS, 127163 +PLAYING CARD KNIGHT OF HEARTS, 127164 +PLAYING CARD QUEEN OF HEARTS, 127165 +PLAYING CARD KING OF HEARTS, 127166 +PLAYING CARD RED JOKER, 127167 +PLAYING CARD ACE OF DIAMONDS, 127169 +PLAYING CARD TWO OF DIAMONDS, 127170 +PLAYING CARD THREE OF DIAMONDS, 127171 +PLAYING CARD FOUR OF DIAMONDS, 127172 +PLAYING CARD FIVE OF DIAMONDS, 127173 +PLAYING CARD SIX OF DIAMONDS, 127174 +PLAYING CARD SEVEN OF DIAMONDS, 127175 +PLAYING CARD EIGHT OF DIAMONDS, 127176 +PLAYING CARD NINE OF DIAMONDS, 127177 +PLAYING CARD TEN OF DIAMONDS, 127178 +PLAYING CARD JACK OF DIAMONDS, 127179 +PLAYING CARD KNIGHT OF DIAMONDS, 127180 +PLAYING CARD QUEEN OF DIAMONDS, 127181 +PLAYING CARD KING OF DIAMONDS, 127182 +PLAYING CARD BLACK JOKER, 127183 +PLAYING CARD ACE OF CLUBS, 127185 +PLAYING CARD TWO OF CLUBS, 127186 +PLAYING CARD THREE OF CLUBS, 127187 +PLAYING CARD FOUR OF CLUBS, 127188 +PLAYING CARD FIVE OF CLUBS, 127189 +PLAYING CARD SIX OF CLUBS, 127190 +PLAYING CARD SEVEN OF CLUBS, 127191 +PLAYING CARD EIGHT OF CLUBS, 127192 +PLAYING CARD NINE OF CLUBS, 127193 +PLAYING CARD TEN OF CLUBS, 127194 +PLAYING CARD JACK OF CLUBS, 127195 +PLAYING CARD KNIGHT OF CLUBS, 127196 +PLAYING CARD QUEEN OF CLUBS, 127197 +PLAYING CARD KING OF CLUBS, 127198 +PLAYING CARD WHITE JOKER, 127199 +PLAYING CARD FOOL, 127200 +PLAYING CARD TRUMP 1, 127201 +PLAYING CARD TRUMP 2, 127202 +PLAYING CARD TRUMP 3, 127203 +PLAYING CARD TRUMP 4, 127204 +PLAYING CARD TRUMP 5, 127205 +PLAYING CARD TRUMP 6, 127206 +PLAYING CARD TRUMP 7, 127207 +PLAYING CARD TRUMP 8, 127208 +PLAYING CARD TRUMP 9, 127209 +PLAYING CARD TRUMP 10, 127210 +PLAYING CARD TRUMP 11, 127211 +PLAYING CARD TRUMP 12, 127212 +PLAYING CARD TRUMP 13, 127213 +PLAYING CARD TRUMP 14, 127214 +PLAYING CARD TRUMP 15, 127215 +PLAYING CARD TRUMP 16, 127216 +PLAYING CARD TRUMP 17, 127217 +PLAYING CARD TRUMP 18, 127218 +PLAYING CARD TRUMP 19, 127219 +PLAYING CARD TRUMP 20, 127220 +PLAYING CARD TRUMP 21, 127221 +DIGIT ZERO FULL STOP, 127232 +DIGIT ZERO COMMA, 127233 +DIGIT ONE COMMA, 127234 +DIGIT TWO COMMA, 127235 +DIGIT THREE COMMA, 127236 +DIGIT FOUR COMMA, 127237 +DIGIT FIVE COMMA, 127238 +DIGIT SIX COMMA, 127239 +DIGIT SEVEN COMMA, 127240 +DIGIT EIGHT COMMA, 127241 +DIGIT NINE COMMA, 127242 +DINGBAT CIRCLED SANS SERIF DIGIT ZERO, 127243 +DINGBAT NEGATIVE CIRCLED SANS SERIF DIGIT ZERO, 127244 +PARENTHESIZED LATIN CAPITAL LETTER A, 127248 +PARENTHESIZED LATIN CAPITAL LETTER B, 127249 +PARENTHESIZED LATIN CAPITAL LETTER C, 127250 +PARENTHESIZED LATIN CAPITAL LETTER D, 127251 +PARENTHESIZED LATIN CAPITAL LETTER E, 127252 +PARENTHESIZED LATIN CAPITAL LETTER F, 127253 +PARENTHESIZED LATIN CAPITAL LETTER G, 127254 +PARENTHESIZED LATIN CAPITAL LETTER H, 127255 +PARENTHESIZED LATIN CAPITAL LETTER I, 127256 +PARENTHESIZED LATIN CAPITAL LETTER J, 127257 +PARENTHESIZED LATIN CAPITAL LETTER K, 127258 +PARENTHESIZED LATIN CAPITAL LETTER L, 127259 +PARENTHESIZED LATIN CAPITAL LETTER M, 127260 +PARENTHESIZED LATIN CAPITAL LETTER N, 127261 +PARENTHESIZED LATIN CAPITAL LETTER O, 127262 +PARENTHESIZED LATIN CAPITAL LETTER P, 127263 +PARENTHESIZED LATIN CAPITAL LETTER Q, 127264 +PARENTHESIZED LATIN CAPITAL LETTER R, 127265 +PARENTHESIZED LATIN CAPITAL LETTER S, 127266 +PARENTHESIZED LATIN CAPITAL LETTER T, 127267 +PARENTHESIZED LATIN CAPITAL LETTER U, 127268 +PARENTHESIZED LATIN CAPITAL LETTER V, 127269 +PARENTHESIZED LATIN CAPITAL LETTER W, 127270 +PARENTHESIZED LATIN CAPITAL LETTER X, 127271 +PARENTHESIZED LATIN CAPITAL LETTER Y, 127272 +PARENTHESIZED LATIN CAPITAL LETTER Z, 127273 +TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S, 127274 +CIRCLED ITALIC LATIN CAPITAL LETTER C, 127275 +CIRCLED ITALIC LATIN CAPITAL LETTER R, 127276 +CIRCLED CD, 127277 +CIRCLED WZ, 127278 +SQUARED LATIN CAPITAL LETTER A, 127280 +SQUARED LATIN CAPITAL LETTER B, 127281 +SQUARED LATIN CAPITAL LETTER C, 127282 +SQUARED LATIN CAPITAL LETTER D, 127283 +SQUARED LATIN CAPITAL LETTER E, 127284 +SQUARED LATIN CAPITAL LETTER F, 127285 +SQUARED LATIN CAPITAL LETTER G, 127286 +SQUARED LATIN CAPITAL LETTER H, 127287 +SQUARED LATIN CAPITAL LETTER I, 127288 +SQUARED LATIN CAPITAL LETTER J, 127289 +SQUARED LATIN CAPITAL LETTER K, 127290 +SQUARED LATIN CAPITAL LETTER L, 127291 +SQUARED LATIN CAPITAL LETTER M, 127292 +SQUARED LATIN CAPITAL LETTER N, 127293 +SQUARED LATIN CAPITAL LETTER O, 127294 +SQUARED LATIN CAPITAL LETTER P, 127295 +SQUARED LATIN CAPITAL LETTER Q, 127296 +SQUARED LATIN CAPITAL LETTER R, 127297 +SQUARED LATIN CAPITAL LETTER S, 127298 +SQUARED LATIN CAPITAL LETTER T, 127299 +SQUARED LATIN CAPITAL LETTER U, 127300 +SQUARED LATIN CAPITAL LETTER V, 127301 +SQUARED LATIN CAPITAL LETTER W, 127302 +SQUARED LATIN CAPITAL LETTER X, 127303 +SQUARED LATIN CAPITAL LETTER Y, 127304 +SQUARED LATIN CAPITAL LETTER Z, 127305 +SQUARED HV, 127306 +SQUARED MV, 127307 +SQUARED SD, 127308 +SQUARED SS, 127309 +SQUARED PPV, 127310 +SQUARED WC, 127311 +NEGATIVE CIRCLED LATIN CAPITAL LETTER A, 127312 +NEGATIVE CIRCLED LATIN CAPITAL LETTER B, 127313 +NEGATIVE CIRCLED LATIN CAPITAL LETTER C, 127314 +NEGATIVE CIRCLED LATIN CAPITAL LETTER D, 127315 +NEGATIVE CIRCLED LATIN CAPITAL LETTER E, 127316 +NEGATIVE CIRCLED LATIN CAPITAL LETTER F, 127317 +NEGATIVE CIRCLED LATIN CAPITAL LETTER G, 127318 +NEGATIVE CIRCLED LATIN CAPITAL LETTER H, 127319 +NEGATIVE CIRCLED LATIN CAPITAL LETTER I, 127320 +NEGATIVE CIRCLED LATIN CAPITAL LETTER J, 127321 +NEGATIVE CIRCLED LATIN CAPITAL LETTER K, 127322 +NEGATIVE CIRCLED LATIN CAPITAL LETTER L, 127323 +NEGATIVE CIRCLED LATIN CAPITAL LETTER M, 127324 +NEGATIVE CIRCLED LATIN CAPITAL LETTER N, 127325 +NEGATIVE CIRCLED LATIN CAPITAL LETTER O, 127326 +NEGATIVE CIRCLED LATIN CAPITAL LETTER P, 127327 +NEGATIVE CIRCLED LATIN CAPITAL LETTER Q, 127328 +NEGATIVE CIRCLED LATIN CAPITAL LETTER R, 127329 +NEGATIVE CIRCLED LATIN CAPITAL LETTER S, 127330 +NEGATIVE CIRCLED LATIN CAPITAL LETTER T, 127331 +NEGATIVE CIRCLED LATIN CAPITAL LETTER U, 127332 +NEGATIVE CIRCLED LATIN CAPITAL LETTER V, 127333 +NEGATIVE CIRCLED LATIN CAPITAL LETTER W, 127334 +NEGATIVE CIRCLED LATIN CAPITAL LETTER X, 127335 +NEGATIVE CIRCLED LATIN CAPITAL LETTER Y, 127336 +NEGATIVE CIRCLED LATIN CAPITAL LETTER Z, 127337 +RAISED MC SIGN, 127338 +RAISED MD SIGN, 127339 +NEGATIVE SQUARED LATIN CAPITAL LETTER A, 127344 +NEGATIVE SQUARED LATIN CAPITAL LETTER B, 127345 +NEGATIVE SQUARED LATIN CAPITAL LETTER C, 127346 +NEGATIVE SQUARED LATIN CAPITAL LETTER D, 127347 +NEGATIVE SQUARED LATIN CAPITAL LETTER E, 127348 +NEGATIVE SQUARED LATIN CAPITAL LETTER F, 127349 +NEGATIVE SQUARED LATIN CAPITAL LETTER G, 127350 +NEGATIVE SQUARED LATIN CAPITAL LETTER H, 127351 +NEGATIVE SQUARED LATIN CAPITAL LETTER I, 127352 +NEGATIVE SQUARED LATIN CAPITAL LETTER J, 127353 +NEGATIVE SQUARED LATIN CAPITAL LETTER K, 127354 +NEGATIVE SQUARED LATIN CAPITAL LETTER L, 127355 +NEGATIVE SQUARED LATIN CAPITAL LETTER M, 127356 +NEGATIVE SQUARED LATIN CAPITAL LETTER N, 127357 +NEGATIVE SQUARED LATIN CAPITAL LETTER O, 127358 +NEGATIVE SQUARED LATIN CAPITAL LETTER P, 127359 +NEGATIVE SQUARED LATIN CAPITAL LETTER Q, 127360 +NEGATIVE SQUARED LATIN CAPITAL LETTER R, 127361 +NEGATIVE SQUARED LATIN CAPITAL LETTER S, 127362 +NEGATIVE SQUARED LATIN CAPITAL LETTER T, 127363 +NEGATIVE SQUARED LATIN CAPITAL LETTER U, 127364 +NEGATIVE SQUARED LATIN CAPITAL LETTER V, 127365 +NEGATIVE SQUARED LATIN CAPITAL LETTER W, 127366 +NEGATIVE SQUARED LATIN CAPITAL LETTER X, 127367 +NEGATIVE SQUARED LATIN CAPITAL LETTER Y, 127368 +NEGATIVE SQUARED LATIN CAPITAL LETTER Z, 127369 +CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P, 127370 +NEGATIVE SQUARED IC, 127371 +NEGATIVE SQUARED PA, 127372 +NEGATIVE SQUARED SA, 127373 +NEGATIVE SQUARED AB, 127374 +NEGATIVE SQUARED WC, 127375 +SQUARE DJ, 127376 +SQUARED CL, 127377 +SQUARED COOL, 127378 +SQUARED FREE, 127379 +SQUARED ID, 127380 +SQUARED NEW, 127381 +SQUARED NG, 127382 +SQUARED OK, 127383 +SQUARED SOS, 127384 +SQUARED UP WITH EXCLAMATION MARK, 127385 +SQUARED VS, 127386 +SQUARED THREE D, 127387 +SQUARED SECOND SCREEN, 127388 +SQUARED TWO K, 127389 +SQUARED FOUR K, 127390 +SQUARED EIGHT K, 127391 +SQUARED FIVE POINT ONE, 127392 +SQUARED SEVEN POINT ONE, 127393 +SQUARED TWENTY TWO POINT TWO, 127394 +SQUARED SIXTY P, 127395 +SQUARED ONE HUNDRED TWENTY P, 127396 +SQUARED LATIN SMALL LETTER D, 127397 +SQUARED HC, 127398 +SQUARED HDR, 127399 +SQUARED HI RES, 127400 +SQUARED LOSSLESS, 127401 +SQUARED SHV, 127402 +SQUARED UHD, 127403 +SQUARED VOD, 127404 +REGIONAL INDICATOR SYMBOL LETTER A, 127462 +REGIONAL INDICATOR SYMBOL LETTER B, 127463 +REGIONAL INDICATOR SYMBOL LETTER C, 127464 +REGIONAL INDICATOR SYMBOL LETTER D, 127465 +REGIONAL INDICATOR SYMBOL LETTER E, 127466 +REGIONAL INDICATOR SYMBOL LETTER F, 127467 +REGIONAL INDICATOR SYMBOL LETTER G, 127468 +REGIONAL INDICATOR SYMBOL LETTER H, 127469 +REGIONAL INDICATOR SYMBOL LETTER I, 127470 +REGIONAL INDICATOR SYMBOL LETTER J, 127471 +REGIONAL INDICATOR SYMBOL LETTER K, 127472 +REGIONAL INDICATOR SYMBOL LETTER L, 127473 +REGIONAL INDICATOR SYMBOL LETTER M, 127474 +REGIONAL INDICATOR SYMBOL LETTER N, 127475 +REGIONAL INDICATOR SYMBOL LETTER O, 127476 +REGIONAL INDICATOR SYMBOL LETTER P, 127477 +REGIONAL INDICATOR SYMBOL LETTER Q, 127478 +REGIONAL INDICATOR SYMBOL LETTER R, 127479 +REGIONAL INDICATOR SYMBOL LETTER S, 127480 +REGIONAL INDICATOR SYMBOL LETTER T, 127481 +REGIONAL INDICATOR SYMBOL LETTER U, 127482 +REGIONAL INDICATOR SYMBOL LETTER V, 127483 +REGIONAL INDICATOR SYMBOL LETTER W, 127484 +REGIONAL INDICATOR SYMBOL LETTER X, 127485 +REGIONAL INDICATOR SYMBOL LETTER Y, 127486 +REGIONAL INDICATOR SYMBOL LETTER Z, 127487 +SQUARE HIRAGANA HOKA, 127488 +SQUARED KATAKANA KOKO, 127489 +SQUARED KATAKANA SA, 127490 +SQUARED CJK UNIFIED IDEOGRAPH 624B, 127504 +SQUARED CJK UNIFIED IDEOGRAPH 5B57, 127505 +SQUARED CJK UNIFIED IDEOGRAPH 53CC, 127506 +SQUARED KATAKANA DE, 127507 +SQUARED CJK UNIFIED IDEOGRAPH 4E8C, 127508 +SQUARED CJK UNIFIED IDEOGRAPH 591A, 127509 +SQUARED CJK UNIFIED IDEOGRAPH 89E3, 127510 +SQUARED CJK UNIFIED IDEOGRAPH 5929, 127511 +SQUARED CJK UNIFIED IDEOGRAPH 4EA4, 127512 +SQUARED CJK UNIFIED IDEOGRAPH 6620, 127513 +SQUARED CJK UNIFIED IDEOGRAPH 7121, 127514 +SQUARED CJK UNIFIED IDEOGRAPH 6599, 127515 +SQUARED CJK UNIFIED IDEOGRAPH 524D, 127516 +SQUARED CJK UNIFIED IDEOGRAPH 5F8C, 127517 +SQUARED CJK UNIFIED IDEOGRAPH 518D, 127518 +SQUARED CJK UNIFIED IDEOGRAPH 65B0, 127519 +SQUARED CJK UNIFIED IDEOGRAPH 521D, 127520 +SQUARED CJK UNIFIED IDEOGRAPH 7D42, 127521 +SQUARED CJK UNIFIED IDEOGRAPH 751F, 127522 +SQUARED CJK UNIFIED IDEOGRAPH 8CA9, 127523 +SQUARED CJK UNIFIED IDEOGRAPH 58F0, 127524 +SQUARED CJK UNIFIED IDEOGRAPH 5439, 127525 +SQUARED CJK UNIFIED IDEOGRAPH 6F14, 127526 +SQUARED CJK UNIFIED IDEOGRAPH 6295, 127527 +SQUARED CJK UNIFIED IDEOGRAPH 6355, 127528 +SQUARED CJK UNIFIED IDEOGRAPH 4E00, 127529 +SQUARED CJK UNIFIED IDEOGRAPH 4E09, 127530 +SQUARED CJK UNIFIED IDEOGRAPH 904A, 127531 +SQUARED CJK UNIFIED IDEOGRAPH 5DE6, 127532 +SQUARED CJK UNIFIED IDEOGRAPH 4E2D, 127533 +SQUARED CJK UNIFIED IDEOGRAPH 53F3, 127534 +SQUARED CJK UNIFIED IDEOGRAPH 6307, 127535 +SQUARED CJK UNIFIED IDEOGRAPH 8D70, 127536 +SQUARED CJK UNIFIED IDEOGRAPH 6253, 127537 +SQUARED CJK UNIFIED IDEOGRAPH 7981, 127538 +SQUARED CJK UNIFIED IDEOGRAPH 7A7A, 127539 +SQUARED CJK UNIFIED IDEOGRAPH 5408, 127540 +SQUARED CJK UNIFIED IDEOGRAPH 6E80, 127541 +SQUARED CJK UNIFIED IDEOGRAPH 6709, 127542 +SQUARED CJK UNIFIED IDEOGRAPH 6708, 127543 +SQUARED CJK UNIFIED IDEOGRAPH 7533, 127544 +SQUARED CJK UNIFIED IDEOGRAPH 5272, 127545 +SQUARED CJK UNIFIED IDEOGRAPH 55B6, 127546 +SQUARED CJK UNIFIED IDEOGRAPH 914D, 127547 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 672C, 127552 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 4E09, 127553 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 4E8C, 127554 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 5B89, 127555 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 70B9, 127556 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 6253, 127557 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 76D7, 127558 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 52DD, 127559 +TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH 6557, 127560 +CIRCLED IDEOGRAPH ADVANTAGE, 127568 +CIRCLED IDEOGRAPH ACCEPT, 127569 +CYCLONE, 127744 +FOGGY, 127745 +CLOSED UMBRELLA, 127746 +NIGHT WITH STARS, 127747 +SUNRISE OVER MOUNTAINS, 127748 +SUNRISE, 127749 +CITYSCAPE AT DUSK, 127750 +SUNSET OVER BUILDINGS, 127751 +RAINBOW, 127752 +BRIDGE AT NIGHT, 127753 +WATER WAVE, 127754 +VOLCANO, 127755 +MILKY WAY, 127756 +EARTH GLOBE EUROPE AFRICA, 127757 +EARTH GLOBE AMERICAS, 127758 +EARTH GLOBE ASIA AUSTRALIA, 127759 +GLOBE WITH MERIDIANS, 127760 +NEW MOON SYMBOL, 127761 +WAXING CRESCENT MOON SYMBOL, 127762 +FIRST QUARTER MOON SYMBOL, 127763 +WAXING GIBBOUS MOON SYMBOL, 127764 +FULL MOON SYMBOL, 127765 +WANING GIBBOUS MOON SYMBOL, 127766 +LAST QUARTER MOON SYMBOL, 127767 +WANING CRESCENT MOON SYMBOL, 127768 +CRESCENT MOON, 127769 +NEW MOON WITH FACE, 127770 +FIRST QUARTER MOON WITH FACE, 127771 +LAST QUARTER MOON WITH FACE, 127772 +FULL MOON WITH FACE, 127773 +SUN WITH FACE, 127774 +GLOWING STAR, 127775 +SHOOTING STAR, 127776 +THERMOMETER, 127777 +BLACK DROPLET, 127778 +WHITE SUN, 127779 +WHITE SUN WITH SMALL CLOUD, 127780 +WHITE SUN BEHIND CLOUD, 127781 +WHITE SUN BEHIND CLOUD WITH RAIN, 127782 +CLOUD WITH RAIN, 127783 +CLOUD WITH SNOW, 127784 +CLOUD WITH LIGHTNING, 127785 +CLOUD WITH TORNADO, 127786 +FOG, 127787 +WIND BLOWING FACE, 127788 +HOT DOG, 127789 +TACO, 127790 +BURRITO, 127791 +CHESTNUT, 127792 +SEEDLING, 127793 +EVERGREEN TREE, 127794 +DECIDUOUS TREE, 127795 +PALM TREE, 127796 +CACTUS, 127797 +HOT PEPPER, 127798 +TULIP, 127799 +CHERRY BLOSSOM, 127800 +ROSE, 127801 +HIBISCUS, 127802 +SUNFLOWER, 127803 +BLOSSOM, 127804 +EAR OF MAIZE, 127805 +EAR OF RICE, 127806 +HERB, 127807 +FOUR LEAF CLOVER, 127808 +MAPLE LEAF, 127809 +FALLEN LEAF, 127810 +LEAF FLUTTERING IN WIND, 127811 +MUSHROOM, 127812 +TOMATO, 127813 +AUBERGINE, 127814 +GRAPES, 127815 +MELON, 127816 +WATERMELON, 127817 +TANGERINE, 127818 +LEMON, 127819 +BANANA, 127820 +PINEAPPLE, 127821 +RED APPLE, 127822 +GREEN APPLE, 127823 +PEAR, 127824 +PEACH, 127825 +CHERRIES, 127826 +STRAWBERRY, 127827 +HAMBURGER, 127828 +SLICE OF PIZZA, 127829 +MEAT ON BONE, 127830 +POULTRY LEG, 127831 +RICE CRACKER, 127832 +RICE BALL, 127833 +COOKED RICE, 127834 +CURRY AND RICE, 127835 +STEAMING BOWL, 127836 +SPAGHETTI, 127837 +BREAD, 127838 +FRENCH FRIES, 127839 +ROASTED SWEET POTATO, 127840 +DANGO, 127841 +ODEN, 127842 +SUSHI, 127843 +FRIED SHRIMP, 127844 +FISH CAKE WITH SWIRL DESIGN, 127845 +SOFT ICE CREAM, 127846 +SHAVED ICE, 127847 +ICE CREAM, 127848 +DOUGHNUT, 127849 +COOKIE, 127850 +CHOCOLATE BAR, 127851 +CANDY, 127852 +LOLLIPOP, 127853 +CUSTARD, 127854 +HONEY POT, 127855 +SHORTCAKE, 127856 +BENTO BOX, 127857 +POT OF FOOD, 127858 +COOKING, 127859 +FORK AND KNIFE, 127860 +TEACUP WITHOUT HANDLE, 127861 +SAKE BOTTLE AND CUP, 127862 +WINE GLASS, 127863 +COCKTAIL GLASS, 127864 +TROPICAL DRINK, 127865 +BEER MUG, 127866 +CLINKING BEER MUGS, 127867 +BABY BOTTLE, 127868 +FORK AND KNIFE WITH PLATE, 127869 +BOTTLE WITH POPPING CORK, 127870 +POPCORN, 127871 +RIBBON, 127872 +WRAPPED PRESENT, 127873 +BIRTHDAY CAKE, 127874 +JACK O LANTERN, 127875 +CHRISTMAS TREE, 127876 +FATHER CHRISTMAS, 127877 +FIREWORKS, 127878 +FIREWORK SPARKLER, 127879 +BALLOON, 127880 +PARTY POPPER, 127881 +CONFETTI BALL, 127882 +TANABATA TREE, 127883 +CROSSED FLAGS, 127884 +PINE DECORATION, 127885 +JAPANESE DOLLS, 127886 +CARP STREAMER, 127887 +WIND CHIME, 127888 +MOON VIEWING CEREMONY, 127889 +SCHOOL SATCHEL, 127890 +GRADUATION CAP, 127891 +HEART WITH TIP ON THE LEFT, 127892 +BOUQUET OF FLOWERS, 127893 +MILITARY MEDAL, 127894 +REMINDER RIBBON, 127895 +MUSICAL KEYBOARD WITH JACKS, 127896 +STUDIO MICROPHONE, 127897 +LEVEL SLIDER, 127898 +CONTROL KNOBS, 127899 +BEAMED ASCENDING MUSICAL NOTES, 127900 +BEAMED DESCENDING MUSICAL NOTES, 127901 +FILM FRAMES, 127902 +ADMISSION TICKETS, 127903 +CAROUSEL HORSE, 127904 +FERRIS WHEEL, 127905 +ROLLER COASTER, 127906 +FISHING POLE AND FISH, 127907 +MICROPHONE, 127908 +MOVIE CAMERA, 127909 +CINEMA, 127910 +HEADPHONE, 127911 +ARTIST PALETTE, 127912 +TOP HAT, 127913 +CIRCUS TENT, 127914 +TICKET, 127915 +CLAPPER BOARD, 127916 +PERFORMING ARTS, 127917 +VIDEO GAME, 127918 +DIRECT HIT, 127919 +SLOT MACHINE, 127920 +BILLIARDS, 127921 +GAME DIE, 127922 +BOWLING, 127923 +FLOWER PLAYING CARDS, 127924 +MUSICAL NOTE, 127925 +MULTIPLE MUSICAL NOTES, 127926 +SAXOPHONE, 127927 +GUITAR, 127928 +MUSICAL KEYBOARD, 127929 +TRUMPET, 127930 +VIOLIN, 127931 +MUSICAL SCORE, 127932 +RUNNING SHIRT WITH SASH, 127933 +TENNIS RACQUET AND BALL, 127934 +SKI AND SKI BOOT, 127935 +BASKETBALL AND HOOP, 127936 +CHEQUERED FLAG, 127937 +SNOWBOARDER, 127938 +RUNNER, 127939 +SURFER, 127940 +SPORTS MEDAL, 127941 +TROPHY, 127942 +HORSE RACING, 127943 +AMERICAN FOOTBALL, 127944 +RUGBY FOOTBALL, 127945 +SWIMMER, 127946 +WEIGHT LIFTER, 127947 +GOLFER, 127948 +RACING MOTORCYCLE, 127949 +RACING CAR, 127950 +CRICKET BAT AND BALL, 127951 +VOLLEYBALL, 127952 +FIELD HOCKEY STICK AND BALL, 127953 +ICE HOCKEY STICK AND PUCK, 127954 +TABLE TENNIS PADDLE AND BALL, 127955 +SNOW CAPPED MOUNTAIN, 127956 +CAMPING, 127957 +BEACH WITH UMBRELLA, 127958 +BUILDING CONSTRUCTION, 127959 +HOUSE BUILDINGS, 127960 +CITYSCAPE, 127961 +DERELICT HOUSE BUILDING, 127962 +CLASSICAL BUILDING, 127963 +DESERT, 127964 +DESERT ISLAND, 127965 +NATIONAL PARK, 127966 +STADIUM, 127967 +HOUSE BUILDING, 127968 +HOUSE WITH GARDEN, 127969 +OFFICE BUILDING, 127970 +JAPANESE POST OFFICE, 127971 +EUROPEAN POST OFFICE, 127972 +HOSPITAL, 127973 +BANK, 127974 +AUTOMATED TELLER MACHINE, 127975 +HOTEL, 127976 +LOVE HOTEL, 127977 +CONVENIENCE STORE, 127978 +SCHOOL, 127979 +DEPARTMENT STORE, 127980 +FACTORY, 127981 +IZAKAYA LANTERN, 127982 +JAPANESE CASTLE, 127983 +EUROPEAN CASTLE, 127984 +WHITE PENNANT, 127985 +BLACK PENNANT, 127986 +WAVING WHITE FLAG, 127987 +WAVING BLACK FLAG, 127988 +ROSETTE, 127989 +BLACK ROSETTE, 127990 +LABEL, 127991 +BADMINTON RACQUET AND SHUTTLECOCK, 127992 +BOW AND ARROW, 127993 +AMPHORA, 127994 +EMOJI MODIFIER FITZPATRICK TYPE 1 2, 127995 +EMOJI MODIFIER FITZPATRICK TYPE 3, 127996 +EMOJI MODIFIER FITZPATRICK TYPE 4, 127997 +EMOJI MODIFIER FITZPATRICK TYPE 5, 127998 +EMOJI MODIFIER FITZPATRICK TYPE 6, 127999 +RAT, 128000 +MOUSE, 128001 +OX, 128002 +WATER BUFFALO, 128003 +COW, 128004 +TIGER, 128005 +LEOPARD, 128006 +RABBIT, 128007 +CAT, 128008 +DRAGON, 128009 +CROCODILE, 128010 +WHALE, 128011 +SNAIL, 128012 +SNAKE, 128013 +HORSE, 128014 +RAM, 128015 +GOAT, 128016 +SHEEP, 128017 +MONKEY, 128018 +ROOSTER, 128019 +CHICKEN, 128020 +DOG, 128021 +PIG, 128022 +BOAR, 128023 +ELEPHANT, 128024 +OCTOPUS, 128025 +SPIRAL SHELL, 128026 +BUG, 128027 +ANT, 128028 +HONEYBEE, 128029 +LADY BEETLE, 128030 +FISH, 128031 +TROPICAL FISH, 128032 +BLOWFISH, 128033 +TURTLE, 128034 +HATCHING CHICK, 128035 +BABY CHICK, 128036 +FRONT FACING BABY CHICK, 128037 +BIRD, 128038 +PENGUIN, 128039 +KOALA, 128040 +POODLE, 128041 +DROMEDARY CAMEL, 128042 +BACTRIAN CAMEL, 128043 +DOLPHIN, 128044 +MOUSE FACE, 128045 +COW FACE, 128046 +TIGER FACE, 128047 +RABBIT FACE, 128048 +CAT FACE, 128049 +DRAGON FACE, 128050 +SPOUTING WHALE, 128051 +HORSE FACE, 128052 +MONKEY FACE, 128053 +DOG FACE, 128054 +PIG FACE, 128055 +FROG FACE, 128056 +HAMSTER FACE, 128057 +WOLF FACE, 128058 +BEAR FACE, 128059 +PANDA FACE, 128060 +PIG NOSE, 128061 +PAW PRINTS, 128062 +CHIPMUNK, 128063 +EYES, 128064 +EYE, 128065 +EAR, 128066 +NOSE, 128067 +MOUTH, 128068 +TONGUE, 128069 +WHITE UP POINTING BACKHAND INDEX, 128070 +WHITE DOWN POINTING BACKHAND INDEX, 128071 +WHITE LEFT POINTING BACKHAND INDEX, 128072 +WHITE RIGHT POINTING BACKHAND INDEX, 128073 +FISTED HAND SIGN, 128074 +WAVING HAND SIGN, 128075 +OK HAND SIGN, 128076 +THUMBS UP SIGN, 128077 +THUMBS DOWN SIGN, 128078 +CLAPPING HANDS SIGN, 128079 +OPEN HANDS SIGN, 128080 +CROWN, 128081 +WOMANS HAT, 128082 +EYEGLASSES, 128083 +NECKTIE, 128084 +T SHIRT, 128085 +JEANS, 128086 +DRESS, 128087 +KIMONO, 128088 +BIKINI, 128089 +WOMANS CLOTHES, 128090 +PURSE, 128091 +HANDBAG, 128092 +POUCH, 128093 +MANS SHOE, 128094 +ATHLETIC SHOE, 128095 +HIGH HEELED SHOE, 128096 +WOMANS SANDAL, 128097 +WOMANS BOOTS, 128098 +FOOTPRINTS, 128099 +BUST IN SILHOUETTE, 128100 +BUSTS IN SILHOUETTE, 128101 +BOY, 128102 +GIRL, 128103 +MAN, 128104 +WOMAN, 128105 +FAMILY, 128106 +MAN AND WOMAN HOLDING HANDS, 128107 +TWO MEN HOLDING HANDS, 128108 +TWO WOMEN HOLDING HANDS, 128109 +POLICE OFFICER, 128110 +WOMAN WITH BUNNY EARS, 128111 +BRIDE WITH VEIL, 128112 +PERSON WITH BLOND HAIR, 128113 +MAN WITH GUA PI MAO, 128114 +MAN WITH TURBAN, 128115 +OLDER MAN, 128116 +OLDER WOMAN, 128117 +BABY, 128118 +CONSTRUCTION WORKER, 128119 +PRINCESS, 128120 +JAPANESE OGRE, 128121 +JAPANESE GOBLIN, 128122 +GHOST, 128123 +BABY ANGEL, 128124 +EXTRATERRESTRIAL ALIEN, 128125 +ALIEN MONSTER, 128126 +IMP, 128127 +SKULL, 128128 +INFORMATION DESK PERSON, 128129 +GUARDSMAN, 128130 +DANCER, 128131 +LIPSTICK, 128132 +NAIL POLISH, 128133 +FACE MASSAGE, 128134 +HAIRCUT, 128135 +BARBER POLE, 128136 +SYRINGE, 128137 +PILL, 128138 +KISS MARK, 128139 +LOVE LETTER, 128140 +RING, 128141 +GEM STONE, 128142 +KISS, 128143 +BOUQUET, 128144 +COUPLE WITH HEART, 128145 +WEDDING, 128146 +BEATING HEART, 128147 +BROKEN HEART, 128148 +TWO HEARTS, 128149 +SPARKLING HEART, 128150 +GROWING HEART, 128151 +HEART WITH ARROW, 128152 +BLUE HEART, 128153 +GREEN HEART, 128154 +YELLOW HEART, 128155 +PURPLE HEART, 128156 +HEART WITH RIBBON, 128157 +REVOLVING HEARTS, 128158 +HEART DECORATION, 128159 +DIAMOND SHAPE WITH A DOT INSIDE, 128160 +ELECTRIC LIGHT BULB, 128161 +ANGER SYMBOL, 128162 +BOMB, 128163 +SLEEPING SYMBOL, 128164 +COLLISION SYMBOL, 128165 +SPLASHING SWEAT SYMBOL, 128166 +DROPLET, 128167 +DASH SYMBOL, 128168 +PILE OF POO, 128169 +FLEXED BICEPS, 128170 +DIZZY SYMBOL, 128171 +SPEECH BALLOON, 128172 +THOUGHT BALLOON, 128173 +WHITE FLOWER, 128174 +HUNDRED POINTS SYMBOL, 128175 +MONEY BAG, 128176 +CURRENCY EXCHANGE, 128177 +HEAVY DOLLAR SIGN, 128178 +CREDIT CARD, 128179 +BANKNOTE WITH YEN SIGN, 128180 +BANKNOTE WITH DOLLAR SIGN, 128181 +BANKNOTE WITH EURO SIGN, 128182 +BANKNOTE WITH POUND SIGN, 128183 +MONEY WITH WINGS, 128184 +CHART WITH UPWARDS TREND AND YEN SIGN, 128185 +SEAT, 128186 +PERSONAL COMPUTER, 128187 +BRIEFCASE, 128188 +MINIDISC, 128189 +FLOPPY DISK, 128190 +OPTICAL DISC, 128191 +DVD, 128192 +FILE FOLDER, 128193 +OPEN FILE FOLDER, 128194 +PAGE WITH CURL, 128195 +PAGE FACING UP, 128196 +CALENDAR, 128197 +TEAR OFF CALENDAR, 128198 +CARD INDEX, 128199 +CHART WITH UPWARDS TREND, 128200 +CHART WITH DOWNWARDS TREND, 128201 +BAR CHART, 128202 +CLIPBOARD, 128203 +PUSHPIN, 128204 +ROUND PUSHPIN, 128205 +PAPERCLIP, 128206 +STRAIGHT RULER, 128207 +TRIANGULAR RULER, 128208 +BOOKMARK TABS, 128209 +LEDGER, 128210 +NOTEBOOK, 128211 +NOTEBOOK WITH DECORATIVE COVER, 128212 +CLOSED BOOK, 128213 +OPEN BOOK, 128214 +GREEN BOOK, 128215 +BLUE BOOK, 128216 +ORANGE BOOK, 128217 +BOOKS, 128218 +NAME BADGE, 128219 +SCROLL, 128220 +MEMO, 128221 +TELEPHONE RECEIVER, 128222 +PAGER, 128223 +FAX MACHINE, 128224 +SATELLITE ANTENNA, 128225 +PUBLIC ADDRESS LOUDSPEAKER, 128226 +CHEERING MEGAPHONE, 128227 +OUTBOX TRAY, 128228 +INBOX TRAY, 128229 +PACKAGE, 128230 +E MAIL SYMBOL, 128231 +INCOMING ENVELOPE, 128232 +ENVELOPE WITH DOWNWARDS ARROW ABOVE, 128233 +CLOSED MAILBOX WITH LOWERED FLAG, 128234 +CLOSED MAILBOX WITH RAISED FLAG, 128235 +OPEN MAILBOX WITH RAISED FLAG, 128236 +OPEN MAILBOX WITH LOWERED FLAG, 128237 +POSTBOX, 128238 +POSTAL HORN, 128239 +NEWSPAPER, 128240 +MOBILE PHONE, 128241 +MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT, 128242 +VIBRATION MODE, 128243 +MOBILE PHONE OFF, 128244 +NO MOBILE PHONES, 128245 +ANTENNA WITH BARS, 128246 +CAMERA, 128247 +CAMERA WITH FLASH, 128248 +VIDEO CAMERA, 128249 +TELEVISION, 128250 +RADIO, 128251 +VIDEOCASSETTE, 128252 +FILM PROJECTOR, 128253 +PORTABLE STEREO, 128254 +PRAYER BEADS, 128255 +TWISTED RIGHTWARDS ARROWS, 128256 +CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS, 128257 +CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY, 128258 +CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS, 128259 +ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS, 128260 +LOW BRIGHTNESS SYMBOL, 128261 +HIGH BRIGHTNESS SYMBOL, 128262 +SPEAKER WITH CANCELLATION STROKE, 128263 +SPEAKER, 128264 +SPEAKER WITH ONE SOUND WAVE, 128265 +SPEAKER WITH THREE SOUND WAVES, 128266 +BATTERY, 128267 +ELECTRIC PLUG, 128268 +LEFT POINTING MAGNIFYING GLASS, 128269 +RIGHT POINTING MAGNIFYING GLASS, 128270 +LOCK WITH INK PEN, 128271 +CLOSED LOCK WITH KEY, 128272 +KEY, 128273 +LOCK, 128274 +OPEN LOCK, 128275 +BELL, 128276 +BELL WITH CANCELLATION STROKE, 128277 +BOOKMARK, 128278 +LINK SYMBOL, 128279 +RADIO BUTTON, 128280 +BACK WITH LEFTWARDS ARROW ABOVE, 128281 +END WITH LEFTWARDS ARROW ABOVE, 128282 +ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE, 128283 +SOON WITH RIGHTWARDS ARROW ABOVE, 128284 +TOP WITH UPWARDS ARROW ABOVE, 128285 +NO ONE UNDER EIGHTEEN SYMBOL, 128286 +KEYCAP TEN, 128287 +INPUT SYMBOL FOR LATIN CAPITAL LETTERS, 128288 +INPUT SYMBOL FOR LATIN SMALL LETTERS, 128289 +INPUT SYMBOL FOR NUMBERS, 128290 +INPUT SYMBOL FOR SYMBOLS, 128291 +INPUT SYMBOL FOR LATIN LETTERS, 128292 +FIRE, 128293 +ELECTRIC TORCH, 128294 +WRENCH, 128295 +HAMMER, 128296 +NUT AND BOLT, 128297 +HOCHO, 128298 +PISTOL, 128299 +MICROSCOPE, 128300 +TELESCOPE, 128301 +CRYSTAL BALL, 128302 +SIX POINTED STAR WITH MIDDLE DOT, 128303 +JAPANESE SYMBOL FOR BEGINNER, 128304 +TRIDENT EMBLEM, 128305 +BLACK SQUARE BUTTON, 128306 +WHITE SQUARE BUTTON, 128307 +LARGE RED CIRCLE, 128308 +LARGE BLUE CIRCLE, 128309 +LARGE ORANGE DIAMOND, 128310 +LARGE BLUE DIAMOND, 128311 +SMALL ORANGE DIAMOND, 128312 +SMALL BLUE DIAMOND, 128313 +UP POINTING RED TRIANGLE, 128314 +DOWN POINTING RED TRIANGLE, 128315 +UP POINTING SMALL RED TRIANGLE, 128316 +DOWN POINTING SMALL RED TRIANGLE, 128317 +LOWER RIGHT SHADOWED WHITE CIRCLE, 128318 +UPPER RIGHT SHADOWED WHITE CIRCLE, 128319 +CIRCLED CROSS POMMEE, 128320 +CROSS POMMEE WITH HALF CIRCLE BELOW, 128321 +CROSS POMMEE, 128322 +NOTCHED LEFT SEMICIRCLE WITH THREE DOTS, 128323 +NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS, 128324 +SYMBOL FOR MARKS CHAPTER, 128325 +WHITE LATIN CROSS, 128326 +HEAVY LATIN CROSS, 128327 +CELTIC CROSS, 128328 +OM SYMBOL, 128329 +DOVE OF PEACE, 128330 +KAABA, 128331 +MOSQUE, 128332 +SYNAGOGUE, 128333 +MENORAH WITH NINE BRANCHES, 128334 +BOWL OF HYGIEIA, 128335 +CLOCK FACE ONE OCLOCK, 128336 +CLOCK FACE TWO OCLOCK, 128337 +CLOCK FACE THREE OCLOCK, 128338 +CLOCK FACE FOUR OCLOCK, 128339 +CLOCK FACE FIVE OCLOCK, 128340 +CLOCK FACE SIX OCLOCK, 128341 +CLOCK FACE SEVEN OCLOCK, 128342 +CLOCK FACE EIGHT OCLOCK, 128343 +CLOCK FACE NINE OCLOCK, 128344 +CLOCK FACE TEN OCLOCK, 128345 +CLOCK FACE ELEVEN OCLOCK, 128346 +CLOCK FACE TWELVE OCLOCK, 128347 +CLOCK FACE ONE THIRTY, 128348 +CLOCK FACE TWO THIRTY, 128349 +CLOCK FACE THREE THIRTY, 128350 +CLOCK FACE FOUR THIRTY, 128351 +CLOCK FACE FIVE THIRTY, 128352 +CLOCK FACE SIX THIRTY, 128353 +CLOCK FACE SEVEN THIRTY, 128354 +CLOCK FACE EIGHT THIRTY, 128355 +CLOCK FACE NINE THIRTY, 128356 +CLOCK FACE TEN THIRTY, 128357 +CLOCK FACE ELEVEN THIRTY, 128358 +CLOCK FACE TWELVE THIRTY, 128359 +RIGHT SPEAKER, 128360 +RIGHT SPEAKER WITH ONE SOUND WAVE, 128361 +RIGHT SPEAKER WITH THREE SOUND WAVES, 128362 +BULLHORN, 128363 +BULLHORN WITH SOUND WAVES, 128364 +RINGING BELL, 128365 +BOOK, 128366 +CANDLE, 128367 +MANTELPIECE CLOCK, 128368 +BLACK SKULL AND CROSSBONES, 128369 +NO PIRACY, 128370 +HOLE, 128371 +MAN IN BUSINESS SUIT LEVITATING, 128372 +SLEUTH OR SPY, 128373 +DARK SUNGLASSES, 128374 +SPIDER, 128375 +SPIDER WEB, 128376 +JOYSTICK, 128377 +MAN DANCING, 128378 +LEFT HAND TELEPHONE RECEIVER, 128379 +TELEPHONE RECEIVER WITH PAGE, 128380 +RIGHT HAND TELEPHONE RECEIVER, 128381 +WHITE TOUCHTONE TELEPHONE, 128382 +BLACK TOUCHTONE TELEPHONE, 128383 +TELEPHONE ON TOP OF MODEM, 128384 +CLAMSHELL MOBILE PHONE, 128385 +BACK OF ENVELOPE, 128386 +STAMPED ENVELOPE, 128387 +ENVELOPE WITH LIGHTNING, 128388 +FLYING ENVELOPE, 128389 +PEN OVER STAMPED ENVELOPE, 128390 +LINKED PAPERCLIPS, 128391 +BLACK PUSHPIN, 128392 +LOWER LEFT PENCIL, 128393 +LOWER LEFT BALLPOINT PEN, 128394 +LOWER LEFT FOUNTAIN PEN, 128395 +LOWER LEFT PAINTBRUSH, 128396 +LOWER LEFT CRAYON, 128397 +LEFT WRITING HAND, 128398 +TURNED OK HAND SIGN, 128399 +RAISED HAND WITH FINGERS SPLAYED, 128400 +REVERSED RAISED HAND WITH FINGERS SPLAYED, 128401 +REVERSED THUMBS UP SIGN, 128402 +REVERSED THUMBS DOWN SIGN, 128403 +REVERSED VICTORY HAND, 128404 +REVERSED HAND WITH MIDDLE FINGER EXTENDED, 128405 +RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, 128406 +WHITE DOWN POINTING LEFT HAND INDEX, 128407 +SIDEWAYS WHITE LEFT POINTING INDEX, 128408 +SIDEWAYS WHITE RIGHT POINTING INDEX, 128409 +SIDEWAYS BLACK LEFT POINTING INDEX, 128410 +SIDEWAYS BLACK RIGHT POINTING INDEX, 128411 +BLACK LEFT POINTING BACKHAND INDEX, 128412 +BLACK RIGHT POINTING BACKHAND INDEX, 128413 +SIDEWAYS WHITE UP POINTING INDEX, 128414 +SIDEWAYS WHITE DOWN POINTING INDEX, 128415 +SIDEWAYS BLACK UP POINTING INDEX, 128416 +SIDEWAYS BLACK DOWN POINTING INDEX, 128417 +BLACK UP POINTING BACKHAND INDEX, 128418 +BLACK DOWN POINTING BACKHAND INDEX, 128419 +BLACK HEART, 128420 +DESKTOP COMPUTER, 128421 +KEYBOARD AND MOUSE, 128422 +THREE NETWORKED COMPUTERS, 128423 +PRINTER, 128424 +POCKET CALCULATOR, 128425 +BLACK HARD SHELL FLOPPY DISK, 128426 +WHITE HARD SHELL FLOPPY DISK, 128427 +SOFT SHELL FLOPPY DISK, 128428 +TAPE CARTRIDGE, 128429 +WIRED KEYBOARD, 128430 +ONE BUTTON MOUSE, 128431 +TWO BUTTON MOUSE, 128432 +THREE BUTTON MOUSE, 128433 +TRACKBALL, 128434 +OLD PERSONAL COMPUTER, 128435 +HARD DISK, 128436 +SCREEN, 128437 +PRINTER ICON, 128438 +FAX ICON, 128439 +OPTICAL DISC ICON, 128440 +DOCUMENT WITH TEXT, 128441 +DOCUMENT WITH TEXT AND PICTURE, 128442 +DOCUMENT WITH PICTURE, 128443 +FRAME WITH PICTURE, 128444 +FRAME WITH TILES, 128445 +FRAME WITH AN X, 128446 +BLACK FOLDER, 128447 +FOLDER, 128448 +OPEN FOLDER, 128449 +CARD INDEX DIVIDERS, 128450 +CARD FILE BOX, 128451 +FILE CABINET, 128452 +EMPTY NOTE, 128453 +EMPTY NOTE PAGE, 128454 +EMPTY NOTE PAD, 128455 +NOTE, 128456 +NOTE PAGE, 128457 +NOTE PAD, 128458 +EMPTY DOCUMENT, 128459 +EMPTY PAGE, 128460 +EMPTY PAGES, 128461 +DOCUMENT, 128462 +PAGE, 128463 +PAGES, 128464 +WASTEBASKET, 128465 +SPIRAL NOTE PAD, 128466 +SPIRAL CALENDAR PAD, 128467 +DESKTOP WINDOW, 128468 +MINIMIZE, 128469 +MAXIMIZE, 128470 +OVERLAP, 128471 +CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS, 128472 +CANCELLATION X, 128473 +INCREASE FONT SIZE SYMBOL, 128474 +DECREASE FONT SIZE SYMBOL, 128475 +COMPRESSION, 128476 +OLD KEY, 128477 +ROLLED UP NEWSPAPER, 128478 +PAGE WITH CIRCLED TEXT, 128479 +STOCK CHART, 128480 +DAGGER KNIFE, 128481 +LIPS, 128482 +SPEAKING HEAD IN SILHOUETTE, 128483 +THREE RAYS ABOVE, 128484 +THREE RAYS BELOW, 128485 +THREE RAYS LEFT, 128486 +THREE RAYS RIGHT, 128487 +LEFT SPEECH BUBBLE, 128488 +RIGHT SPEECH BUBBLE, 128489 +TWO SPEECH BUBBLES, 128490 +THREE SPEECH BUBBLES, 128491 +LEFT THOUGHT BUBBLE, 128492 +RIGHT THOUGHT BUBBLE, 128493 +LEFT ANGER BUBBLE, 128494 +RIGHT ANGER BUBBLE, 128495 +MOOD BUBBLE, 128496 +LIGHTNING MOOD BUBBLE, 128497 +LIGHTNING MOOD, 128498 +BALLOT BOX WITH BALLOT, 128499 +BALLOT SCRIPT X, 128500 +BALLOT BOX WITH SCRIPT X, 128501 +BALLOT BOLD SCRIPT X, 128502 +BALLOT BOX WITH BOLD SCRIPT X, 128503 +LIGHT CHECK MARK, 128504 +BALLOT BOX WITH BOLD CHECK, 128505 +WORLD MAP, 128506 +MOUNT FUJI, 128507 +TOKYO TOWER, 128508 +STATUE OF LIBERTY, 128509 +SILHOUETTE OF JAPAN, 128510 +MOYAI, 128511 +GRINNING FACE, 128512 +GRINNING FACE WITH SMILING EYES, 128513 +FACE WITH TEARS OF JOY, 128514 +SMILING FACE WITH OPEN MOUTH, 128515 +SMILING FACE WITH OPEN MOUTH AND SMILING EYES, 128516 +SMILING FACE WITH OPEN MOUTH AND COLD SWEAT, 128517 +SMILING FACE WITH OPEN MOUTH AND TIGHTLY CLOSED EYES, 128518 +SMILING FACE WITH HALO, 128519 +SMILING FACE WITH HORNS, 128520 +WINKING FACE, 128521 +SMILING FACE WITH SMILING EYES, 128522 +FACE SAVOURING DELICIOUS FOOD, 128523 +RELIEVED FACE, 128524 +SMILING FACE WITH HEART SHAPED EYES, 128525 +SMILING FACE WITH SUNGLASSES, 128526 +SMIRKING FACE, 128527 +NEUTRAL FACE, 128528 +EXPRESSIONLESS FACE, 128529 +UNAMUSED FACE, 128530 +FACE WITH COLD SWEAT, 128531 +PENSIVE FACE, 128532 +CONFUSED FACE, 128533 +CONFOUNDED FACE, 128534 +KISSING FACE, 128535 +FACE THROWING A KISS, 128536 +KISSING FACE WITH SMILING EYES, 128537 +KISSING FACE WITH CLOSED EYES, 128538 +FACE WITH STUCK OUT TONGUE, 128539 +FACE WITH STUCK OUT TONGUE AND WINKING EYE, 128540 +FACE WITH STUCK OUT TONGUE AND TIGHTLY CLOSED EYES, 128541 +DISAPPOINTED FACE, 128542 +WORRIED FACE, 128543 +ANGRY FACE, 128544 +POUTING FACE, 128545 +CRYING FACE, 128546 +PERSEVERING FACE, 128547 +FACE WITH LOOK OF TRIUMPH, 128548 +DISAPPOINTED BUT RELIEVED FACE, 128549 +FROWNING FACE WITH OPEN MOUTH, 128550 +ANGUISHED FACE, 128551 +FEARFUL FACE, 128552 +WEARY FACE, 128553 +SLEEPY FACE, 128554 +TIRED FACE, 128555 +GRIMACING FACE, 128556 +LOUDLY CRYING FACE, 128557 +FACE WITH OPEN MOUTH, 128558 +HUSHED FACE, 128559 +FACE WITH OPEN MOUTH AND COLD SWEAT, 128560 +FACE SCREAMING IN FEAR, 128561 +ASTONISHED FACE, 128562 +FLUSHED FACE, 128563 +SLEEPING FACE, 128564 +DIZZY FACE, 128565 +FACE WITHOUT MOUTH, 128566 +FACE WITH MEDICAL MASK, 128567 +GRINNING CAT FACE WITH SMILING EYES, 128568 +CAT FACE WITH TEARS OF JOY, 128569 +SMILING CAT FACE WITH OPEN MOUTH, 128570 +SMILING CAT FACE WITH HEART SHAPED EYES, 128571 +CAT FACE WITH WRY SMILE, 128572 +KISSING CAT FACE WITH CLOSED EYES, 128573 +POUTING CAT FACE, 128574 +CRYING CAT FACE, 128575 +WEARY CAT FACE, 128576 +SLIGHTLY FROWNING FACE, 128577 +SLIGHTLY SMILING FACE, 128578 +UPSIDE DOWN FACE, 128579 +FACE WITH ROLLING EYES, 128580 +FACE WITH NO GOOD GESTURE, 128581 +FACE WITH OK GESTURE, 128582 +PERSON BOWING DEEPLY, 128583 +SEE NO EVIL MONKEY, 128584 +HEAR NO EVIL MONKEY, 128585 +SPEAK NO EVIL MONKEY, 128586 +HAPPY PERSON RAISING ONE HAND, 128587 +PERSON RAISING BOTH HANDS IN CELEBRATION, 128588 +PERSON FROWNING, 128589 +PERSON WITH POUTING FACE, 128590 +PERSON WITH FOLDED HANDS, 128591 +NORTH WEST POINTING LEAF, 128592 +SOUTH WEST POINTING LEAF, 128593 +NORTH EAST POINTING LEAF, 128594 +SOUTH EAST POINTING LEAF, 128595 +TURNED NORTH WEST POINTING LEAF, 128596 +TURNED SOUTH WEST POINTING LEAF, 128597 +TURNED NORTH EAST POINTING LEAF, 128598 +TURNED SOUTH EAST POINTING LEAF, 128599 +NORTH WEST POINTING VINE LEAF, 128600 +SOUTH WEST POINTING VINE LEAF, 128601 +NORTH EAST POINTING VINE LEAF, 128602 +SOUTH EAST POINTING VINE LEAF, 128603 +HEAVY NORTH WEST POINTING VINE LEAF, 128604 +HEAVY SOUTH WEST POINTING VINE LEAF, 128605 +HEAVY NORTH EAST POINTING VINE LEAF, 128606 +HEAVY SOUTH EAST POINTING VINE LEAF, 128607 +NORTH WEST POINTING BUD, 128608 +SOUTH WEST POINTING BUD, 128609 +NORTH EAST POINTING BUD, 128610 +SOUTH EAST POINTING BUD, 128611 +HEAVY NORTH WEST POINTING BUD, 128612 +HEAVY SOUTH WEST POINTING BUD, 128613 +HEAVY NORTH EAST POINTING BUD, 128614 +HEAVY SOUTH EAST POINTING BUD, 128615 +HOLLOW QUILT SQUARE ORNAMENT, 128616 +HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE, 128617 +SOLID QUILT SQUARE ORNAMENT, 128618 +SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE, 128619 +LEFTWARDS ROCKET, 128620 +UPWARDS ROCKET, 128621 +RIGHTWARDS ROCKET, 128622 +DOWNWARDS ROCKET, 128623 +SCRIPT LIGATURE ET ORNAMENT, 128624 +HEAVY SCRIPT LIGATURE ET ORNAMENT, 128625 +LIGATURE OPEN ET ORNAMENT, 128626 +HEAVY LIGATURE OPEN ET ORNAMENT, 128627 +HEAVY AMPERSAND ORNAMENT, 128628 +SWASH AMPERSAND ORNAMENT, 128629 +SANS SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT, 128630 +SANS SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT, 128631 +SANS SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT, 128632 +HEAVY INTERROBANG ORNAMENT, 128633 +SANS SERIF INTERROBANG ORNAMENT, 128634 +HEAVY SANS SERIF INTERROBANG ORNAMENT, 128635 +VERY HEAVY SOLIDUS, 128636 +VERY HEAVY REVERSE SOLIDUS, 128637 +CHECKER BOARD, 128638 +REVERSE CHECKER BOARD, 128639 +ROCKET, 128640 +HELICOPTER, 128641 +STEAM LOCOMOTIVE, 128642 +RAILWAY CAR, 128643 +HIGH SPEED TRAIN, 128644 +HIGH SPEED TRAIN WITH BULLET NOSE, 128645 +TRAIN, 128646 +METRO, 128647 +LIGHT RAIL, 128648 +STATION, 128649 +TRAM, 128650 +TRAM CAR, 128651 +BUS, 128652 +ONCOMING BUS, 128653 +TROLLEYBUS, 128654 +BUS STOP, 128655 +MINIBUS, 128656 +AMBULANCE, 128657 +FIRE ENGINE, 128658 +POLICE CAR, 128659 +ONCOMING POLICE CAR, 128660 +TAXI, 128661 +ONCOMING TAXI, 128662 +AUTOMOBILE, 128663 +ONCOMING AUTOMOBILE, 128664 +RECREATIONAL VEHICLE, 128665 +DELIVERY TRUCK, 128666 +ARTICULATED LORRY, 128667 +TRACTOR, 128668 +MONORAIL, 128669 +MOUNTAIN RAILWAY, 128670 +SUSPENSION RAILWAY, 128671 +MOUNTAIN CABLEWAY, 128672 +AERIAL TRAMWAY, 128673 +SHIP, 128674 +ROWBOAT, 128675 +SPEEDBOAT, 128676 +HORIZONTAL TRAFFIC LIGHT, 128677 +VERTICAL TRAFFIC LIGHT, 128678 +CONSTRUCTION SIGN, 128679 +POLICE CARS REVOLVING LIGHT, 128680 +TRIANGULAR FLAG ON POST, 128681 +DOOR, 128682 +NO ENTRY SIGN, 128683 +SMOKING SYMBOL, 128684 +NO SMOKING SYMBOL, 128685 +PUT LITTER IN ITS PLACE SYMBOL, 128686 +DO NOT LITTER SYMBOL, 128687 +POTABLE WATER SYMBOL, 128688 +NON POTABLE WATER SYMBOL, 128689 +BICYCLE, 128690 +NO BICYCLES, 128691 +BICYCLIST, 128692 +MOUNTAIN BICYCLIST, 128693 +PEDESTRIAN, 128694 +NO PEDESTRIANS, 128695 +CHILDREN CROSSING, 128696 +MENS SYMBOL, 128697 +WOMENS SYMBOL, 128698 +RESTROOM, 128699 +BABY SYMBOL, 128700 +TOILET, 128701 +WATER CLOSET, 128702 +SHOWER, 128703 +BATH, 128704 +BATHTUB, 128705 +PASSPORT CONTROL, 128706 +CUSTOMS, 128707 +BAGGAGE CLAIM, 128708 +LEFT LUGGAGE, 128709 +TRIANGLE WITH ROUNDED CORNERS, 128710 +PROHIBITED SIGN, 128711 +CIRCLED INFORMATION SOURCE, 128712 +BOYS SYMBOL, 128713 +GIRLS SYMBOL, 128714 +COUCH AND LAMP, 128715 +SLEEPING ACCOMMODATION, 128716 +SHOPPING BAGS, 128717 +BELLHOP BELL, 128718 +BED, 128719 +PLACE OF WORSHIP, 128720 +OCTAGONAL SIGN, 128721 +SHOPPING TROLLEY, 128722 +HAMMER AND WRENCH, 128736 +SHIELD, 128737 +OIL DRUM, 128738 +MOTORWAY, 128739 +RAILWAY TRACK, 128740 +MOTOR BOAT, 128741 +UP POINTING MILITARY AIRPLANE, 128742 +UP POINTING AIRPLANE, 128743 +UP POINTING SMALL AIRPLANE, 128744 +SMALL AIRPLANE, 128745 +NORTHEAST POINTING AIRPLANE, 128746 +AIRPLANE DEPARTURE, 128747 +AIRPLANE ARRIVING, 128748 +SATELLITE, 128752 +ONCOMING FIRE ENGINE, 128753 +DIESEL LOCOMOTIVE, 128754 +PASSENGER SHIP, 128755 +SCOOTER, 128756 +MOTOR SCOOTER, 128757 +CANOE, 128758 +ALCHEMICAL SYMBOL FOR QUINTESSENCE, 128768 +ALCHEMICAL SYMBOL FOR AIR, 128769 +ALCHEMICAL SYMBOL FOR FIRE, 128770 +ALCHEMICAL SYMBOL FOR EARTH, 128771 +ALCHEMICAL SYMBOL FOR WATER, 128772 +ALCHEMICAL SYMBOL FOR AQUAFORTIS, 128773 +ALCHEMICAL SYMBOL FOR AQUA REGIA, 128774 +ALCHEMICAL SYMBOL FOR AQUA REGIA 2, 128775 +ALCHEMICAL SYMBOL FOR AQUA VITAE, 128776 +ALCHEMICAL SYMBOL FOR AQUA VITAE 2, 128777 +ALCHEMICAL SYMBOL FOR VINEGAR, 128778 +ALCHEMICAL SYMBOL FOR VINEGAR 2, 128779 +ALCHEMICAL SYMBOL FOR VINEGAR 3, 128780 +ALCHEMICAL SYMBOL FOR SULFUR, 128781 +ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR, 128782 +ALCHEMICAL SYMBOL FOR BLACK SULFUR, 128783 +ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE, 128784 +ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE 2, 128785 +ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE 3, 128786 +ALCHEMICAL SYMBOL FOR CINNABAR, 128787 +ALCHEMICAL SYMBOL FOR SALT, 128788 +ALCHEMICAL SYMBOL FOR NITRE, 128789 +ALCHEMICAL SYMBOL FOR VITRIOL, 128790 +ALCHEMICAL SYMBOL FOR VITRIOL 2, 128791 +ALCHEMICAL SYMBOL FOR ROCK SALT, 128792 +ALCHEMICAL SYMBOL FOR ROCK SALT 2, 128793 +ALCHEMICAL SYMBOL FOR GOLD, 128794 +ALCHEMICAL SYMBOL FOR SILVER, 128795 +ALCHEMICAL SYMBOL FOR IRON ORE, 128796 +ALCHEMICAL SYMBOL FOR IRON ORE 2, 128797 +ALCHEMICAL SYMBOL FOR CROCUS OF IRON, 128798 +ALCHEMICAL SYMBOL FOR REGULUS OF IRON, 128799 +ALCHEMICAL SYMBOL FOR COPPER ORE, 128800 +ALCHEMICAL SYMBOL FOR IRON COPPER ORE, 128801 +ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER, 128802 +ALCHEMICAL SYMBOL FOR CROCUS OF COPPER, 128803 +ALCHEMICAL SYMBOL FOR CROCUS OF COPPER 2, 128804 +ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE, 128805 +ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE, 128806 +ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER, 128807 +ALCHEMICAL SYMBOL FOR VERDIGRIS, 128808 +ALCHEMICAL SYMBOL FOR TIN ORE, 128809 +ALCHEMICAL SYMBOL FOR LEAD ORE, 128810 +ALCHEMICAL SYMBOL FOR ANTIMONY ORE, 128811 +ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY, 128812 +ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY, 128813 +ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY, 128814 +ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY, 128815 +ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY, 128816 +ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY 2, 128817 +ALCHEMICAL SYMBOL FOR REGULUS, 128818 +ALCHEMICAL SYMBOL FOR REGULUS 2, 128819 +ALCHEMICAL SYMBOL FOR REGULUS 3, 128820 +ALCHEMICAL SYMBOL FOR REGULUS 4, 128821 +ALCHEMICAL SYMBOL FOR ALKALI, 128822 +ALCHEMICAL SYMBOL FOR ALKALI 2, 128823 +ALCHEMICAL SYMBOL FOR MARCASITE, 128824 +ALCHEMICAL SYMBOL FOR SAL AMMONIAC, 128825 +ALCHEMICAL SYMBOL FOR ARSENIC, 128826 +ALCHEMICAL SYMBOL FOR REALGAR, 128827 +ALCHEMICAL SYMBOL FOR REALGAR 2, 128828 +ALCHEMICAL SYMBOL FOR AURIPIGMENT, 128829 +ALCHEMICAL SYMBOL FOR BISMUTH ORE, 128830 +ALCHEMICAL SYMBOL FOR TARTAR, 128831 +ALCHEMICAL SYMBOL FOR TARTAR 2, 128832 +ALCHEMICAL SYMBOL FOR QUICK LIME, 128833 +ALCHEMICAL SYMBOL FOR BORAX, 128834 +ALCHEMICAL SYMBOL FOR BORAX 2, 128835 +ALCHEMICAL SYMBOL FOR BORAX 3, 128836 +ALCHEMICAL SYMBOL FOR ALUM, 128837 +ALCHEMICAL SYMBOL FOR OIL, 128838 +ALCHEMICAL SYMBOL FOR SPIRIT, 128839 +ALCHEMICAL SYMBOL FOR TINCTURE, 128840 +ALCHEMICAL SYMBOL FOR GUM, 128841 +ALCHEMICAL SYMBOL FOR WAX, 128842 +ALCHEMICAL SYMBOL FOR POWDER, 128843 +ALCHEMICAL SYMBOL FOR CALX, 128844 +ALCHEMICAL SYMBOL FOR TUTTY, 128845 +ALCHEMICAL SYMBOL FOR CAPUT MORTUUM, 128846 +ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE, 128847 +ALCHEMICAL SYMBOL FOR CADUCEUS, 128848 +ALCHEMICAL SYMBOL FOR TRIDENT, 128849 +ALCHEMICAL SYMBOL FOR STARRED TRIDENT, 128850 +ALCHEMICAL SYMBOL FOR LODESTONE, 128851 +ALCHEMICAL SYMBOL FOR SOAP, 128852 +ALCHEMICAL SYMBOL FOR URINE, 128853 +ALCHEMICAL SYMBOL FOR HORSE DUNG, 128854 +ALCHEMICAL SYMBOL FOR ASHES, 128855 +ALCHEMICAL SYMBOL FOR POT ASHES, 128856 +ALCHEMICAL SYMBOL FOR BRICK, 128857 +ALCHEMICAL SYMBOL FOR POWDERED BRICK, 128858 +ALCHEMICAL SYMBOL FOR AMALGAM, 128859 +ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM, 128860 +ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM 2, 128861 +ALCHEMICAL SYMBOL FOR SUBLIMATION, 128862 +ALCHEMICAL SYMBOL FOR PRECIPITATE, 128863 +ALCHEMICAL SYMBOL FOR DISTILL, 128864 +ALCHEMICAL SYMBOL FOR DISSOLVE, 128865 +ALCHEMICAL SYMBOL FOR DISSOLVE 2, 128866 +ALCHEMICAL SYMBOL FOR PURIFY, 128867 +ALCHEMICAL SYMBOL FOR PUTREFACTION, 128868 +ALCHEMICAL SYMBOL FOR CRUCIBLE, 128869 +ALCHEMICAL SYMBOL FOR CRUCIBLE 2, 128870 +ALCHEMICAL SYMBOL FOR CRUCIBLE 3, 128871 +ALCHEMICAL SYMBOL FOR CRUCIBLE 4, 128872 +ALCHEMICAL SYMBOL FOR CRUCIBLE 5, 128873 +ALCHEMICAL SYMBOL FOR ALEMBIC, 128874 +ALCHEMICAL SYMBOL FOR BATH OF MARY, 128875 +ALCHEMICAL SYMBOL FOR BATH OF VAPOURS, 128876 +ALCHEMICAL SYMBOL FOR RETORT, 128877 +ALCHEMICAL SYMBOL FOR HOUR, 128878 +ALCHEMICAL SYMBOL FOR NIGHT, 128879 +ALCHEMICAL SYMBOL FOR DAY NIGHT, 128880 +ALCHEMICAL SYMBOL FOR MONTH, 128881 +ALCHEMICAL SYMBOL FOR HALF DRAM, 128882 +ALCHEMICAL SYMBOL FOR HALF OUNCE, 128883 +BLACK LEFT POINTING ISOSCELES RIGHT TRIANGLE, 128896 +BLACK UP POINTING ISOSCELES RIGHT TRIANGLE, 128897 +BLACK RIGHT POINTING ISOSCELES RIGHT TRIANGLE, 128898 +BLACK DOWN POINTING ISOSCELES RIGHT TRIANGLE, 128899 +BLACK SLIGHTLY SMALL CIRCLE, 128900 +MEDIUM BOLD WHITE CIRCLE, 128901 +BOLD WHITE CIRCLE, 128902 +HEAVY WHITE CIRCLE, 128903 +VERY HEAVY WHITE CIRCLE, 128904 +EXTREMELY HEAVY WHITE CIRCLE, 128905 +WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE, 128906 +ROUND TARGET, 128907 +BLACK TINY SQUARE, 128908 +BLACK SLIGHTLY SMALL SQUARE, 128909 +LIGHT WHITE SQUARE, 128910 +MEDIUM WHITE SQUARE, 128911 +BOLD WHITE SQUARE, 128912 +HEAVY WHITE SQUARE, 128913 +VERY HEAVY WHITE SQUARE, 128914 +EXTREMELY HEAVY WHITE SQUARE, 128915 +WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE, 128916 +WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE, 128917 +SQUARE TARGET, 128918 +BLACK TINY DIAMOND, 128919 +BLACK VERY SMALL DIAMOND, 128920 +BLACK MEDIUM SMALL DIAMOND, 128921 +WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND, 128922 +WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND, 128923 +DIAMOND TARGET, 128924 +BLACK TINY LOZENGE, 128925 +BLACK VERY SMALL LOZENGE, 128926 +BLACK MEDIUM SMALL LOZENGE, 128927 +WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE, 128928 +THIN GREEK CROSS, 128929 +LIGHT GREEK CROSS, 128930 +MEDIUM GREEK CROSS, 128931 +BOLD GREEK CROSS, 128932 +VERY BOLD GREEK CROSS, 128933 +VERY HEAVY GREEK CROSS, 128934 +EXTREMELY HEAVY GREEK CROSS, 128935 +THIN SALTIRE, 128936 +LIGHT SALTIRE, 128937 +MEDIUM SALTIRE, 128938 +BOLD SALTIRE, 128939 +HEAVY SALTIRE, 128940 +VERY HEAVY SALTIRE, 128941 +EXTREMELY HEAVY SALTIRE, 128942 +LIGHT FIVE SPOKED ASTERISK, 128943 +MEDIUM FIVE SPOKED ASTERISK, 128944 +BOLD FIVE SPOKED ASTERISK, 128945 +HEAVY FIVE SPOKED ASTERISK, 128946 +VERY HEAVY FIVE SPOKED ASTERISK, 128947 +EXTREMELY HEAVY FIVE SPOKED ASTERISK, 128948 +LIGHT SIX SPOKED ASTERISK, 128949 +MEDIUM SIX SPOKED ASTERISK, 128950 +BOLD SIX SPOKED ASTERISK, 128951 +HEAVY SIX SPOKED ASTERISK, 128952 +VERY HEAVY SIX SPOKED ASTERISK, 128953 +EXTREMELY HEAVY SIX SPOKED ASTERISK, 128954 +LIGHT EIGHT SPOKED ASTERISK, 128955 +MEDIUM EIGHT SPOKED ASTERISK, 128956 +BOLD EIGHT SPOKED ASTERISK, 128957 +HEAVY EIGHT SPOKED ASTERISK, 128958 +VERY HEAVY EIGHT SPOKED ASTERISK, 128959 +LIGHT THREE POINTED BLACK STAR, 128960 +MEDIUM THREE POINTED BLACK STAR, 128961 +THREE POINTED BLACK STAR, 128962 +MEDIUM THREE POINTED PINWHEEL STAR, 128963 +LIGHT FOUR POINTED BLACK STAR, 128964 +MEDIUM FOUR POINTED BLACK STAR, 128965 +FOUR POINTED BLACK STAR, 128966 +MEDIUM FOUR POINTED PINWHEEL STAR, 128967 +REVERSE LIGHT FOUR POINTED PINWHEEL STAR, 128968 +LIGHT FIVE POINTED BLACK STAR, 128969 +HEAVY FIVE POINTED BLACK STAR, 128970 +MEDIUM SIX POINTED BLACK STAR, 128971 +HEAVY SIX POINTED BLACK STAR, 128972 +SIX POINTED PINWHEEL STAR, 128973 +MEDIUM EIGHT POINTED BLACK STAR, 128974 +HEAVY EIGHT POINTED BLACK STAR, 128975 +VERY HEAVY EIGHT POINTED BLACK STAR, 128976 +HEAVY EIGHT POINTED PINWHEEL STAR, 128977 +LIGHT TWELVE POINTED BLACK STAR, 128978 +HEAVY TWELVE POINTED BLACK STAR, 128979 +HEAVY TWELVE POINTED PINWHEEL STAR, 128980 +LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD, 129024 +UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD, 129025 +RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD, 129026 +DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD, 129027 +LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD, 129028 +UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD, 129029 +RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD, 129030 +DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD, 129031 +LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD, 129032 +UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD, 129033 +RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD, 129034 +DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD, 129035 +LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD, 129040 +UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD, 129041 +RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD, 129042 +DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD, 129043 +LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129044 +UPWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129045 +RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129046 +DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129047 +HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129048 +HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129049 +HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129050 +HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD, 129051 +HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD, 129052 +HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD, 129053 +HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD, 129054 +HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD, 129055 +LEFTWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT, 129056 +UPWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT, 129057 +RIGHTWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT, 129058 +DOWNWARDS TRIANGLE HEADED ARROW WITH NARROW SHAFT, 129059 +LEFTWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT, 129060 +UPWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT, 129061 +RIGHTWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT, 129062 +DOWNWARDS TRIANGLE HEADED ARROW WITH MEDIUM SHAFT, 129063 +LEFTWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT, 129064 +UPWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT, 129065 +RIGHTWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT, 129066 +DOWNWARDS TRIANGLE HEADED ARROW WITH BOLD SHAFT, 129067 +LEFTWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT, 129068 +UPWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT, 129069 +RIGHTWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT, 129070 +DOWNWARDS TRIANGLE HEADED ARROW WITH HEAVY SHAFT, 129071 +LEFTWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT, 129072 +UPWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT, 129073 +RIGHTWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT, 129074 +DOWNWARDS TRIANGLE HEADED ARROW WITH VERY HEAVY SHAFT, 129075 +LEFTWARDS FINGER POST ARROW, 129076 +UPWARDS FINGER POST ARROW, 129077 +RIGHTWARDS FINGER POST ARROW, 129078 +DOWNWARDS FINGER POST ARROW, 129079 +LEFTWARDS SQUARED ARROW, 129080 +UPWARDS SQUARED ARROW, 129081 +RIGHTWARDS SQUARED ARROW, 129082 +DOWNWARDS SQUARED ARROW, 129083 +LEFTWARDS COMPRESSED ARROW, 129084 +UPWARDS COMPRESSED ARROW, 129085 +RIGHTWARDS COMPRESSED ARROW, 129086 +DOWNWARDS COMPRESSED ARROW, 129087 +LEFTWARDS HEAVY COMPRESSED ARROW, 129088 +UPWARDS HEAVY COMPRESSED ARROW, 129089 +RIGHTWARDS HEAVY COMPRESSED ARROW, 129090 +DOWNWARDS HEAVY COMPRESSED ARROW, 129091 +LEFTWARDS HEAVY ARROW, 129092 +UPWARDS HEAVY ARROW, 129093 +RIGHTWARDS HEAVY ARROW, 129094 +DOWNWARDS HEAVY ARROW, 129095 +LEFTWARDS SANS SERIF ARROW, 129104 +UPWARDS SANS SERIF ARROW, 129105 +RIGHTWARDS SANS SERIF ARROW, 129106 +DOWNWARDS SANS SERIF ARROW, 129107 +NORTH WEST SANS SERIF ARROW, 129108 +NORTH EAST SANS SERIF ARROW, 129109 +SOUTH EAST SANS SERIF ARROW, 129110 +SOUTH WEST SANS SERIF ARROW, 129111 +LEFT RIGHT SANS SERIF ARROW, 129112 +UP DOWN SANS SERIF ARROW, 129113 +WIDE HEADED LEFTWARDS LIGHT BARB ARROW, 129120 +WIDE HEADED UPWARDS LIGHT BARB ARROW, 129121 +WIDE HEADED RIGHTWARDS LIGHT BARB ARROW, 129122 +WIDE HEADED DOWNWARDS LIGHT BARB ARROW, 129123 +WIDE HEADED NORTH WEST LIGHT BARB ARROW, 129124 +WIDE HEADED NORTH EAST LIGHT BARB ARROW, 129125 +WIDE HEADED SOUTH EAST LIGHT BARB ARROW, 129126 +WIDE HEADED SOUTH WEST LIGHT BARB ARROW, 129127 +WIDE HEADED LEFTWARDS BARB ARROW, 129128 +WIDE HEADED UPWARDS BARB ARROW, 129129 +WIDE HEADED RIGHTWARDS BARB ARROW, 129130 +WIDE HEADED DOWNWARDS BARB ARROW, 129131 +WIDE HEADED NORTH WEST BARB ARROW, 129132 +WIDE HEADED NORTH EAST BARB ARROW, 129133 +WIDE HEADED SOUTH EAST BARB ARROW, 129134 +WIDE HEADED SOUTH WEST BARB ARROW, 129135 +WIDE HEADED LEFTWARDS MEDIUM BARB ARROW, 129136 +WIDE HEADED UPWARDS MEDIUM BARB ARROW, 129137 +WIDE HEADED RIGHTWARDS MEDIUM BARB ARROW, 129138 +WIDE HEADED DOWNWARDS MEDIUM BARB ARROW, 129139 +WIDE HEADED NORTH WEST MEDIUM BARB ARROW, 129140 +WIDE HEADED NORTH EAST MEDIUM BARB ARROW, 129141 +WIDE HEADED SOUTH EAST MEDIUM BARB ARROW, 129142 +WIDE HEADED SOUTH WEST MEDIUM BARB ARROW, 129143 +WIDE HEADED LEFTWARDS HEAVY BARB ARROW, 129144 +WIDE HEADED UPWARDS HEAVY BARB ARROW, 129145 +WIDE HEADED RIGHTWARDS HEAVY BARB ARROW, 129146 +WIDE HEADED DOWNWARDS HEAVY BARB ARROW, 129147 +WIDE HEADED NORTH WEST HEAVY BARB ARROW, 129148 +WIDE HEADED NORTH EAST HEAVY BARB ARROW, 129149 +WIDE HEADED SOUTH EAST HEAVY BARB ARROW, 129150 +WIDE HEADED SOUTH WEST HEAVY BARB ARROW, 129151 +WIDE HEADED LEFTWARDS VERY HEAVY BARB ARROW, 129152 +WIDE HEADED UPWARDS VERY HEAVY BARB ARROW, 129153 +WIDE HEADED RIGHTWARDS VERY HEAVY BARB ARROW, 129154 +WIDE HEADED DOWNWARDS VERY HEAVY BARB ARROW, 129155 +WIDE HEADED NORTH WEST VERY HEAVY BARB ARROW, 129156 +WIDE HEADED NORTH EAST VERY HEAVY BARB ARROW, 129157 +WIDE HEADED SOUTH EAST VERY HEAVY BARB ARROW, 129158 +WIDE HEADED SOUTH WEST VERY HEAVY BARB ARROW, 129159 +LEFTWARDS TRIANGLE ARROWHEAD, 129168 +UPWARDS TRIANGLE ARROWHEAD, 129169 +RIGHTWARDS TRIANGLE ARROWHEAD, 129170 +DOWNWARDS TRIANGLE ARROWHEAD, 129171 +LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD, 129172 +UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD, 129173 +RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD, 129174 +DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD, 129175 +LEFTWARDS ARROW WITH NOTCHED TAIL, 129176 +UPWARDS ARROW WITH NOTCHED TAIL, 129177 +RIGHTWARDS ARROW WITH NOTCHED TAIL, 129178 +DOWNWARDS ARROW WITH NOTCHED TAIL, 129179 +HEAVY ARROW SHAFT WIDTH ONE, 129180 +HEAVY ARROW SHAFT WIDTH TWO THIRDS, 129181 +HEAVY ARROW SHAFT WIDTH ONE HALF, 129182 +HEAVY ARROW SHAFT WIDTH ONE THIRD, 129183 +LEFTWARDS BOTTOM SHADED WHITE ARROW, 129184 +RIGHTWARDS BOTTOM SHADED WHITE ARROW, 129185 +LEFTWARDS TOP SHADED WHITE ARROW, 129186 +RIGHTWARDS TOP SHADED WHITE ARROW, 129187 +LEFTWARDS LEFT SHADED WHITE ARROW, 129188 +RIGHTWARDS RIGHT SHADED WHITE ARROW, 129189 +LEFTWARDS RIGHT SHADED WHITE ARROW, 129190 +RIGHTWARDS LEFT SHADED WHITE ARROW, 129191 +LEFTWARDS BACK TILTED SHADOWED WHITE ARROW, 129192 +RIGHTWARDS BACK TILTED SHADOWED WHITE ARROW, 129193 +LEFTWARDS FRONT TILTED SHADOWED WHITE ARROW, 129194 +RIGHTWARDS FRONT TILTED SHADOWED WHITE ARROW, 129195 +WHITE ARROW SHAFT WIDTH ONE, 129196 +WHITE ARROW SHAFT WIDTH TWO THIRDS, 129197 +ZIPPER MOUTH FACE, 129296 +MONEY MOUTH FACE, 129297 +FACE WITH THERMOMETER, 129298 +NERD FACE, 129299 +THINKING FACE, 129300 +FACE WITH HEAD BANDAGE, 129301 +ROBOT FACE, 129302 +HUGGING FACE, 129303 +SIGN OF THE HORNS, 129304 +CALL ME HAND, 129305 +RAISED BACK OF HAND, 129306 +LEFT FACING FIST, 129307 +RIGHT FACING FIST, 129308 +HANDSHAKE, 129309 +HAND WITH INDEX AND MIDDLE FINGERS CROSSED, 129310 +FACE WITH COWBOY HAT, 129312 +CLOWN FACE, 129313 +NAUSEATED FACE, 129314 +ROLLING ON THE FLOOR LAUGHING, 129315 +DROOLING FACE, 129316 +LYING FACE, 129317 +FACE PALM, 129318 +SNEEZING FACE, 129319 +PREGNANT WOMAN, 129328 +SELFIE, 129331 +PRINCE, 129332 +MAN IN TUXEDO, 129333 +MOTHER CHRISTMAS, 129334 +SHRUG, 129335 +PERSON DOING CARTWHEEL, 129336 +JUGGLING, 129337 +FENCER, 129338 +MODERN PENTATHLON, 129339 +WRESTLERS, 129340 +WATER POLO, 129341 +HANDBALL, 129342 +WILTED FLOWER, 129344 +DRUM WITH DRUMSTICKS, 129345 +CLINKING GLASSES, 129346 +TUMBLER GLASS, 129347 +SPOON, 129348 +GOAL NET, 129349 +RIFLE, 129350 +FIRST PLACE MEDAL, 129351 +SECOND PLACE MEDAL, 129352 +THIRD PLACE MEDAL, 129353 +BOXING GLOVE, 129354 +MARTIAL ARTS UNIFORM, 129355 +CROISSANT, 129360 +AVOCADO, 129361 +CUCUMBER, 129362 +BACON, 129363 +POTATO, 129364 +CARROT, 129365 +BAGUETTE BREAD, 129366 +GREEN SALAD, 129367 +SHALLOW PAN OF FOOD, 129368 +STUFFED FLATBREAD, 129369 +EGG, 129370 +GLASS OF MILK, 129371 +PEANUTS, 129372 +KIWIFRUIT, 129373 +PANCAKES, 129374 +CRAB, 129408 +LION FACE, 129409 +SCORPION, 129410 +TURKEY, 129411 +UNICORN FACE, 129412 +EAGLE, 129413 +DUCK, 129414 +BAT, 129415 +SHARK, 129416 +OWL, 129417 +FOX FACE, 129418 +BUTTERFLY, 129419 +DEER, 129420 +GORILLA, 129421 +LIZARD, 129422 +RHINOCEROS, 129423 +SHRIMP, 129424 +SQUID, 129425 +CHEESE WEDGE, 129472 +CJK COMPATIBILITY IDEOGRAPH 2F800, 194560 +CJK COMPATIBILITY IDEOGRAPH 2F801, 194561 +CJK COMPATIBILITY IDEOGRAPH 2F802, 194562 +CJK COMPATIBILITY IDEOGRAPH 2F803, 194563 +CJK COMPATIBILITY IDEOGRAPH 2F804, 194564 +CJK COMPATIBILITY IDEOGRAPH 2F805, 194565 +CJK COMPATIBILITY IDEOGRAPH 2F806, 194566 +CJK COMPATIBILITY IDEOGRAPH 2F807, 194567 +CJK COMPATIBILITY IDEOGRAPH 2F808, 194568 +CJK COMPATIBILITY IDEOGRAPH 2F809, 194569 +CJK COMPATIBILITY IDEOGRAPH 2F80A, 194570 +CJK COMPATIBILITY IDEOGRAPH 2F80B, 194571 +CJK COMPATIBILITY IDEOGRAPH 2F80C, 194572 +CJK COMPATIBILITY IDEOGRAPH 2F80D, 194573 +CJK COMPATIBILITY IDEOGRAPH 2F80E, 194574 +CJK COMPATIBILITY IDEOGRAPH 2F80F, 194575 +CJK COMPATIBILITY IDEOGRAPH 2F810, 194576 +CJK COMPATIBILITY IDEOGRAPH 2F811, 194577 +CJK COMPATIBILITY IDEOGRAPH 2F812, 194578 +CJK COMPATIBILITY IDEOGRAPH 2F813, 194579 +CJK COMPATIBILITY IDEOGRAPH 2F814, 194580 +CJK COMPATIBILITY IDEOGRAPH 2F815, 194581 +CJK COMPATIBILITY IDEOGRAPH 2F816, 194582 +CJK COMPATIBILITY IDEOGRAPH 2F817, 194583 +CJK COMPATIBILITY IDEOGRAPH 2F818, 194584 +CJK COMPATIBILITY IDEOGRAPH 2F819, 194585 +CJK COMPATIBILITY IDEOGRAPH 2F81A, 194586 +CJK COMPATIBILITY IDEOGRAPH 2F81B, 194587 +CJK COMPATIBILITY IDEOGRAPH 2F81C, 194588 +CJK COMPATIBILITY IDEOGRAPH 2F81D, 194589 +CJK COMPATIBILITY IDEOGRAPH 2F81E, 194590 +CJK COMPATIBILITY IDEOGRAPH 2F81F, 194591 +CJK COMPATIBILITY IDEOGRAPH 2F820, 194592 +CJK COMPATIBILITY IDEOGRAPH 2F821, 194593 +CJK COMPATIBILITY IDEOGRAPH 2F822, 194594 +CJK COMPATIBILITY IDEOGRAPH 2F823, 194595 +CJK COMPATIBILITY IDEOGRAPH 2F824, 194596 +CJK COMPATIBILITY IDEOGRAPH 2F825, 194597 +CJK COMPATIBILITY IDEOGRAPH 2F826, 194598 +CJK COMPATIBILITY IDEOGRAPH 2F827, 194599 +CJK COMPATIBILITY IDEOGRAPH 2F828, 194600 +CJK COMPATIBILITY IDEOGRAPH 2F829, 194601 +CJK COMPATIBILITY IDEOGRAPH 2F82A, 194602 +CJK COMPATIBILITY IDEOGRAPH 2F82B, 194603 +CJK COMPATIBILITY IDEOGRAPH 2F82C, 194604 +CJK COMPATIBILITY IDEOGRAPH 2F82D, 194605 +CJK COMPATIBILITY IDEOGRAPH 2F82E, 194606 +CJK COMPATIBILITY IDEOGRAPH 2F82F, 194607 +CJK COMPATIBILITY IDEOGRAPH 2F830, 194608 +CJK COMPATIBILITY IDEOGRAPH 2F831, 194609 +CJK COMPATIBILITY IDEOGRAPH 2F832, 194610 +CJK COMPATIBILITY IDEOGRAPH 2F833, 194611 +CJK COMPATIBILITY IDEOGRAPH 2F834, 194612 +CJK COMPATIBILITY IDEOGRAPH 2F835, 194613 +CJK COMPATIBILITY IDEOGRAPH 2F836, 194614 +CJK COMPATIBILITY IDEOGRAPH 2F837, 194615 +CJK COMPATIBILITY IDEOGRAPH 2F838, 194616 +CJK COMPATIBILITY IDEOGRAPH 2F839, 194617 +CJK COMPATIBILITY IDEOGRAPH 2F83A, 194618 +CJK COMPATIBILITY IDEOGRAPH 2F83B, 194619 +CJK COMPATIBILITY IDEOGRAPH 2F83C, 194620 +CJK COMPATIBILITY IDEOGRAPH 2F83D, 194621 +CJK COMPATIBILITY IDEOGRAPH 2F83E, 194622 +CJK COMPATIBILITY IDEOGRAPH 2F83F, 194623 +CJK COMPATIBILITY IDEOGRAPH 2F840, 194624 +CJK COMPATIBILITY IDEOGRAPH 2F841, 194625 +CJK COMPATIBILITY IDEOGRAPH 2F842, 194626 +CJK COMPATIBILITY IDEOGRAPH 2F843, 194627 +CJK COMPATIBILITY IDEOGRAPH 2F844, 194628 +CJK COMPATIBILITY IDEOGRAPH 2F845, 194629 +CJK COMPATIBILITY IDEOGRAPH 2F846, 194630 +CJK COMPATIBILITY IDEOGRAPH 2F847, 194631 +CJK COMPATIBILITY IDEOGRAPH 2F848, 194632 +CJK COMPATIBILITY IDEOGRAPH 2F849, 194633 +CJK COMPATIBILITY IDEOGRAPH 2F84A, 194634 +CJK COMPATIBILITY IDEOGRAPH 2F84B, 194635 +CJK COMPATIBILITY IDEOGRAPH 2F84C, 194636 +CJK COMPATIBILITY IDEOGRAPH 2F84D, 194637 +CJK COMPATIBILITY IDEOGRAPH 2F84E, 194638 +CJK COMPATIBILITY IDEOGRAPH 2F84F, 194639 +CJK COMPATIBILITY IDEOGRAPH 2F850, 194640 +CJK COMPATIBILITY IDEOGRAPH 2F851, 194641 +CJK COMPATIBILITY IDEOGRAPH 2F852, 194642 +CJK COMPATIBILITY IDEOGRAPH 2F853, 194643 +CJK COMPATIBILITY IDEOGRAPH 2F854, 194644 +CJK COMPATIBILITY IDEOGRAPH 2F855, 194645 +CJK COMPATIBILITY IDEOGRAPH 2F856, 194646 +CJK COMPATIBILITY IDEOGRAPH 2F857, 194647 +CJK COMPATIBILITY IDEOGRAPH 2F858, 194648 +CJK COMPATIBILITY IDEOGRAPH 2F859, 194649 +CJK COMPATIBILITY IDEOGRAPH 2F85A, 194650 +CJK COMPATIBILITY IDEOGRAPH 2F85B, 194651 +CJK COMPATIBILITY IDEOGRAPH 2F85C, 194652 +CJK COMPATIBILITY IDEOGRAPH 2F85D, 194653 +CJK COMPATIBILITY IDEOGRAPH 2F85E, 194654 +CJK COMPATIBILITY IDEOGRAPH 2F85F, 194655 +CJK COMPATIBILITY IDEOGRAPH 2F860, 194656 +CJK COMPATIBILITY IDEOGRAPH 2F861, 194657 +CJK COMPATIBILITY IDEOGRAPH 2F862, 194658 +CJK COMPATIBILITY IDEOGRAPH 2F863, 194659 +CJK COMPATIBILITY IDEOGRAPH 2F864, 194660 +CJK COMPATIBILITY IDEOGRAPH 2F865, 194661 +CJK COMPATIBILITY IDEOGRAPH 2F866, 194662 +CJK COMPATIBILITY IDEOGRAPH 2F867, 194663 +CJK COMPATIBILITY IDEOGRAPH 2F868, 194664 +CJK COMPATIBILITY IDEOGRAPH 2F869, 194665 +CJK COMPATIBILITY IDEOGRAPH 2F86A, 194666 +CJK COMPATIBILITY IDEOGRAPH 2F86B, 194667 +CJK COMPATIBILITY IDEOGRAPH 2F86C, 194668 +CJK COMPATIBILITY IDEOGRAPH 2F86D, 194669 +CJK COMPATIBILITY IDEOGRAPH 2F86E, 194670 +CJK COMPATIBILITY IDEOGRAPH 2F86F, 194671 +CJK COMPATIBILITY IDEOGRAPH 2F870, 194672 +CJK COMPATIBILITY IDEOGRAPH 2F871, 194673 +CJK COMPATIBILITY IDEOGRAPH 2F872, 194674 +CJK COMPATIBILITY IDEOGRAPH 2F873, 194675 +CJK COMPATIBILITY IDEOGRAPH 2F874, 194676 +CJK COMPATIBILITY IDEOGRAPH 2F875, 194677 +CJK COMPATIBILITY IDEOGRAPH 2F876, 194678 +CJK COMPATIBILITY IDEOGRAPH 2F877, 194679 +CJK COMPATIBILITY IDEOGRAPH 2F878, 194680 +CJK COMPATIBILITY IDEOGRAPH 2F879, 194681 +CJK COMPATIBILITY IDEOGRAPH 2F87A, 194682 +CJK COMPATIBILITY IDEOGRAPH 2F87B, 194683 +CJK COMPATIBILITY IDEOGRAPH 2F87C, 194684 +CJK COMPATIBILITY IDEOGRAPH 2F87D, 194685 +CJK COMPATIBILITY IDEOGRAPH 2F87E, 194686 +CJK COMPATIBILITY IDEOGRAPH 2F87F, 194687 +CJK COMPATIBILITY IDEOGRAPH 2F880, 194688 +CJK COMPATIBILITY IDEOGRAPH 2F881, 194689 +CJK COMPATIBILITY IDEOGRAPH 2F882, 194690 +CJK COMPATIBILITY IDEOGRAPH 2F883, 194691 +CJK COMPATIBILITY IDEOGRAPH 2F884, 194692 +CJK COMPATIBILITY IDEOGRAPH 2F885, 194693 +CJK COMPATIBILITY IDEOGRAPH 2F886, 194694 +CJK COMPATIBILITY IDEOGRAPH 2F887, 194695 +CJK COMPATIBILITY IDEOGRAPH 2F888, 194696 +CJK COMPATIBILITY IDEOGRAPH 2F889, 194697 +CJK COMPATIBILITY IDEOGRAPH 2F88A, 194698 +CJK COMPATIBILITY IDEOGRAPH 2F88B, 194699 +CJK COMPATIBILITY IDEOGRAPH 2F88C, 194700 +CJK COMPATIBILITY IDEOGRAPH 2F88D, 194701 +CJK COMPATIBILITY IDEOGRAPH 2F88E, 194702 +CJK COMPATIBILITY IDEOGRAPH 2F88F, 194703 +CJK COMPATIBILITY IDEOGRAPH 2F890, 194704 +CJK COMPATIBILITY IDEOGRAPH 2F891, 194705 +CJK COMPATIBILITY IDEOGRAPH 2F892, 194706 +CJK COMPATIBILITY IDEOGRAPH 2F893, 194707 +CJK COMPATIBILITY IDEOGRAPH 2F894, 194708 +CJK COMPATIBILITY IDEOGRAPH 2F895, 194709 +CJK COMPATIBILITY IDEOGRAPH 2F896, 194710 +CJK COMPATIBILITY IDEOGRAPH 2F897, 194711 +CJK COMPATIBILITY IDEOGRAPH 2F898, 194712 +CJK COMPATIBILITY IDEOGRAPH 2F899, 194713 +CJK COMPATIBILITY IDEOGRAPH 2F89A, 194714 +CJK COMPATIBILITY IDEOGRAPH 2F89B, 194715 +CJK COMPATIBILITY IDEOGRAPH 2F89C, 194716 +CJK COMPATIBILITY IDEOGRAPH 2F89D, 194717 +CJK COMPATIBILITY IDEOGRAPH 2F89E, 194718 +CJK COMPATIBILITY IDEOGRAPH 2F89F, 194719 +CJK COMPATIBILITY IDEOGRAPH 2F8A0, 194720 +CJK COMPATIBILITY IDEOGRAPH 2F8A1, 194721 +CJK COMPATIBILITY IDEOGRAPH 2F8A2, 194722 +CJK COMPATIBILITY IDEOGRAPH 2F8A3, 194723 +CJK COMPATIBILITY IDEOGRAPH 2F8A4, 194724 +CJK COMPATIBILITY IDEOGRAPH 2F8A5, 194725 +CJK COMPATIBILITY IDEOGRAPH 2F8A6, 194726 +CJK COMPATIBILITY IDEOGRAPH 2F8A7, 194727 +CJK COMPATIBILITY IDEOGRAPH 2F8A8, 194728 +CJK COMPATIBILITY IDEOGRAPH 2F8A9, 194729 +CJK COMPATIBILITY IDEOGRAPH 2F8AA, 194730 +CJK COMPATIBILITY IDEOGRAPH 2F8AB, 194731 +CJK COMPATIBILITY IDEOGRAPH 2F8AC, 194732 +CJK COMPATIBILITY IDEOGRAPH 2F8AD, 194733 +CJK COMPATIBILITY IDEOGRAPH 2F8AE, 194734 +CJK COMPATIBILITY IDEOGRAPH 2F8AF, 194735 +CJK COMPATIBILITY IDEOGRAPH 2F8B0, 194736 +CJK COMPATIBILITY IDEOGRAPH 2F8B1, 194737 +CJK COMPATIBILITY IDEOGRAPH 2F8B2, 194738 +CJK COMPATIBILITY IDEOGRAPH 2F8B3, 194739 +CJK COMPATIBILITY IDEOGRAPH 2F8B4, 194740 +CJK COMPATIBILITY IDEOGRAPH 2F8B5, 194741 +CJK COMPATIBILITY IDEOGRAPH 2F8B6, 194742 +CJK COMPATIBILITY IDEOGRAPH 2F8B7, 194743 +CJK COMPATIBILITY IDEOGRAPH 2F8B8, 194744 +CJK COMPATIBILITY IDEOGRAPH 2F8B9, 194745 +CJK COMPATIBILITY IDEOGRAPH 2F8BA, 194746 +CJK COMPATIBILITY IDEOGRAPH 2F8BB, 194747 +CJK COMPATIBILITY IDEOGRAPH 2F8BC, 194748 +CJK COMPATIBILITY IDEOGRAPH 2F8BD, 194749 +CJK COMPATIBILITY IDEOGRAPH 2F8BE, 194750 +CJK COMPATIBILITY IDEOGRAPH 2F8BF, 194751 +CJK COMPATIBILITY IDEOGRAPH 2F8C0, 194752 +CJK COMPATIBILITY IDEOGRAPH 2F8C1, 194753 +CJK COMPATIBILITY IDEOGRAPH 2F8C2, 194754 +CJK COMPATIBILITY IDEOGRAPH 2F8C3, 194755 +CJK COMPATIBILITY IDEOGRAPH 2F8C4, 194756 +CJK COMPATIBILITY IDEOGRAPH 2F8C5, 194757 +CJK COMPATIBILITY IDEOGRAPH 2F8C6, 194758 +CJK COMPATIBILITY IDEOGRAPH 2F8C7, 194759 +CJK COMPATIBILITY IDEOGRAPH 2F8C8, 194760 +CJK COMPATIBILITY IDEOGRAPH 2F8C9, 194761 +CJK COMPATIBILITY IDEOGRAPH 2F8CA, 194762 +CJK COMPATIBILITY IDEOGRAPH 2F8CB, 194763 +CJK COMPATIBILITY IDEOGRAPH 2F8CC, 194764 +CJK COMPATIBILITY IDEOGRAPH 2F8CD, 194765 +CJK COMPATIBILITY IDEOGRAPH 2F8CE, 194766 +CJK COMPATIBILITY IDEOGRAPH 2F8CF, 194767 +CJK COMPATIBILITY IDEOGRAPH 2F8D0, 194768 +CJK COMPATIBILITY IDEOGRAPH 2F8D1, 194769 +CJK COMPATIBILITY IDEOGRAPH 2F8D2, 194770 +CJK COMPATIBILITY IDEOGRAPH 2F8D3, 194771 +CJK COMPATIBILITY IDEOGRAPH 2F8D4, 194772 +CJK COMPATIBILITY IDEOGRAPH 2F8D5, 194773 +CJK COMPATIBILITY IDEOGRAPH 2F8D6, 194774 +CJK COMPATIBILITY IDEOGRAPH 2F8D7, 194775 +CJK COMPATIBILITY IDEOGRAPH 2F8D8, 194776 +CJK COMPATIBILITY IDEOGRAPH 2F8D9, 194777 +CJK COMPATIBILITY IDEOGRAPH 2F8DA, 194778 +CJK COMPATIBILITY IDEOGRAPH 2F8DB, 194779 +CJK COMPATIBILITY IDEOGRAPH 2F8DC, 194780 +CJK COMPATIBILITY IDEOGRAPH 2F8DD, 194781 +CJK COMPATIBILITY IDEOGRAPH 2F8DE, 194782 +CJK COMPATIBILITY IDEOGRAPH 2F8DF, 194783 +CJK COMPATIBILITY IDEOGRAPH 2F8E0, 194784 +CJK COMPATIBILITY IDEOGRAPH 2F8E1, 194785 +CJK COMPATIBILITY IDEOGRAPH 2F8E2, 194786 +CJK COMPATIBILITY IDEOGRAPH 2F8E3, 194787 +CJK COMPATIBILITY IDEOGRAPH 2F8E4, 194788 +CJK COMPATIBILITY IDEOGRAPH 2F8E5, 194789 +CJK COMPATIBILITY IDEOGRAPH 2F8E6, 194790 +CJK COMPATIBILITY IDEOGRAPH 2F8E7, 194791 +CJK COMPATIBILITY IDEOGRAPH 2F8E8, 194792 +CJK COMPATIBILITY IDEOGRAPH 2F8E9, 194793 +CJK COMPATIBILITY IDEOGRAPH 2F8EA, 194794 +CJK COMPATIBILITY IDEOGRAPH 2F8EB, 194795 +CJK COMPATIBILITY IDEOGRAPH 2F8EC, 194796 +CJK COMPATIBILITY IDEOGRAPH 2F8ED, 194797 +CJK COMPATIBILITY IDEOGRAPH 2F8EE, 194798 +CJK COMPATIBILITY IDEOGRAPH 2F8EF, 194799 +CJK COMPATIBILITY IDEOGRAPH 2F8F0, 194800 +CJK COMPATIBILITY IDEOGRAPH 2F8F1, 194801 +CJK COMPATIBILITY IDEOGRAPH 2F8F2, 194802 +CJK COMPATIBILITY IDEOGRAPH 2F8F3, 194803 +CJK COMPATIBILITY IDEOGRAPH 2F8F4, 194804 +CJK COMPATIBILITY IDEOGRAPH 2F8F5, 194805 +CJK COMPATIBILITY IDEOGRAPH 2F8F6, 194806 +CJK COMPATIBILITY IDEOGRAPH 2F8F7, 194807 +CJK COMPATIBILITY IDEOGRAPH 2F8F8, 194808 +CJK COMPATIBILITY IDEOGRAPH 2F8F9, 194809 +CJK COMPATIBILITY IDEOGRAPH 2F8FA, 194810 +CJK COMPATIBILITY IDEOGRAPH 2F8FB, 194811 +CJK COMPATIBILITY IDEOGRAPH 2F8FC, 194812 +CJK COMPATIBILITY IDEOGRAPH 2F8FD, 194813 +CJK COMPATIBILITY IDEOGRAPH 2F8FE, 194814 +CJK COMPATIBILITY IDEOGRAPH 2F8FF, 194815 +CJK COMPATIBILITY IDEOGRAPH 2F900, 194816 +CJK COMPATIBILITY IDEOGRAPH 2F901, 194817 +CJK COMPATIBILITY IDEOGRAPH 2F902, 194818 +CJK COMPATIBILITY IDEOGRAPH 2F903, 194819 +CJK COMPATIBILITY IDEOGRAPH 2F904, 194820 +CJK COMPATIBILITY IDEOGRAPH 2F905, 194821 +CJK COMPATIBILITY IDEOGRAPH 2F906, 194822 +CJK COMPATIBILITY IDEOGRAPH 2F907, 194823 +CJK COMPATIBILITY IDEOGRAPH 2F908, 194824 +CJK COMPATIBILITY IDEOGRAPH 2F909, 194825 +CJK COMPATIBILITY IDEOGRAPH 2F90A, 194826 +CJK COMPATIBILITY IDEOGRAPH 2F90B, 194827 +CJK COMPATIBILITY IDEOGRAPH 2F90C, 194828 +CJK COMPATIBILITY IDEOGRAPH 2F90D, 194829 +CJK COMPATIBILITY IDEOGRAPH 2F90E, 194830 +CJK COMPATIBILITY IDEOGRAPH 2F90F, 194831 +CJK COMPATIBILITY IDEOGRAPH 2F910, 194832 +CJK COMPATIBILITY IDEOGRAPH 2F911, 194833 +CJK COMPATIBILITY IDEOGRAPH 2F912, 194834 +CJK COMPATIBILITY IDEOGRAPH 2F913, 194835 +CJK COMPATIBILITY IDEOGRAPH 2F914, 194836 +CJK COMPATIBILITY IDEOGRAPH 2F915, 194837 +CJK COMPATIBILITY IDEOGRAPH 2F916, 194838 +CJK COMPATIBILITY IDEOGRAPH 2F917, 194839 +CJK COMPATIBILITY IDEOGRAPH 2F918, 194840 +CJK COMPATIBILITY IDEOGRAPH 2F919, 194841 +CJK COMPATIBILITY IDEOGRAPH 2F91A, 194842 +CJK COMPATIBILITY IDEOGRAPH 2F91B, 194843 +CJK COMPATIBILITY IDEOGRAPH 2F91C, 194844 +CJK COMPATIBILITY IDEOGRAPH 2F91D, 194845 +CJK COMPATIBILITY IDEOGRAPH 2F91E, 194846 +CJK COMPATIBILITY IDEOGRAPH 2F91F, 194847 +CJK COMPATIBILITY IDEOGRAPH 2F920, 194848 +CJK COMPATIBILITY IDEOGRAPH 2F921, 194849 +CJK COMPATIBILITY IDEOGRAPH 2F922, 194850 +CJK COMPATIBILITY IDEOGRAPH 2F923, 194851 +CJK COMPATIBILITY IDEOGRAPH 2F924, 194852 +CJK COMPATIBILITY IDEOGRAPH 2F925, 194853 +CJK COMPATIBILITY IDEOGRAPH 2F926, 194854 +CJK COMPATIBILITY IDEOGRAPH 2F927, 194855 +CJK COMPATIBILITY IDEOGRAPH 2F928, 194856 +CJK COMPATIBILITY IDEOGRAPH 2F929, 194857 +CJK COMPATIBILITY IDEOGRAPH 2F92A, 194858 +CJK COMPATIBILITY IDEOGRAPH 2F92B, 194859 +CJK COMPATIBILITY IDEOGRAPH 2F92C, 194860 +CJK COMPATIBILITY IDEOGRAPH 2F92D, 194861 +CJK COMPATIBILITY IDEOGRAPH 2F92E, 194862 +CJK COMPATIBILITY IDEOGRAPH 2F92F, 194863 +CJK COMPATIBILITY IDEOGRAPH 2F930, 194864 +CJK COMPATIBILITY IDEOGRAPH 2F931, 194865 +CJK COMPATIBILITY IDEOGRAPH 2F932, 194866 +CJK COMPATIBILITY IDEOGRAPH 2F933, 194867 +CJK COMPATIBILITY IDEOGRAPH 2F934, 194868 +CJK COMPATIBILITY IDEOGRAPH 2F935, 194869 +CJK COMPATIBILITY IDEOGRAPH 2F936, 194870 +CJK COMPATIBILITY IDEOGRAPH 2F937, 194871 +CJK COMPATIBILITY IDEOGRAPH 2F938, 194872 +CJK COMPATIBILITY IDEOGRAPH 2F939, 194873 +CJK COMPATIBILITY IDEOGRAPH 2F93A, 194874 +CJK COMPATIBILITY IDEOGRAPH 2F93B, 194875 +CJK COMPATIBILITY IDEOGRAPH 2F93C, 194876 +CJK COMPATIBILITY IDEOGRAPH 2F93D, 194877 +CJK COMPATIBILITY IDEOGRAPH 2F93E, 194878 +CJK COMPATIBILITY IDEOGRAPH 2F93F, 194879 +CJK COMPATIBILITY IDEOGRAPH 2F940, 194880 +CJK COMPATIBILITY IDEOGRAPH 2F941, 194881 +CJK COMPATIBILITY IDEOGRAPH 2F942, 194882 +CJK COMPATIBILITY IDEOGRAPH 2F943, 194883 +CJK COMPATIBILITY IDEOGRAPH 2F944, 194884 +CJK COMPATIBILITY IDEOGRAPH 2F945, 194885 +CJK COMPATIBILITY IDEOGRAPH 2F946, 194886 +CJK COMPATIBILITY IDEOGRAPH 2F947, 194887 +CJK COMPATIBILITY IDEOGRAPH 2F948, 194888 +CJK COMPATIBILITY IDEOGRAPH 2F949, 194889 +CJK COMPATIBILITY IDEOGRAPH 2F94A, 194890 +CJK COMPATIBILITY IDEOGRAPH 2F94B, 194891 +CJK COMPATIBILITY IDEOGRAPH 2F94C, 194892 +CJK COMPATIBILITY IDEOGRAPH 2F94D, 194893 +CJK COMPATIBILITY IDEOGRAPH 2F94E, 194894 +CJK COMPATIBILITY IDEOGRAPH 2F94F, 194895 +CJK COMPATIBILITY IDEOGRAPH 2F950, 194896 +CJK COMPATIBILITY IDEOGRAPH 2F951, 194897 +CJK COMPATIBILITY IDEOGRAPH 2F952, 194898 +CJK COMPATIBILITY IDEOGRAPH 2F953, 194899 +CJK COMPATIBILITY IDEOGRAPH 2F954, 194900 +CJK COMPATIBILITY IDEOGRAPH 2F955, 194901 +CJK COMPATIBILITY IDEOGRAPH 2F956, 194902 +CJK COMPATIBILITY IDEOGRAPH 2F957, 194903 +CJK COMPATIBILITY IDEOGRAPH 2F958, 194904 +CJK COMPATIBILITY IDEOGRAPH 2F959, 194905 +CJK COMPATIBILITY IDEOGRAPH 2F95A, 194906 +CJK COMPATIBILITY IDEOGRAPH 2F95B, 194907 +CJK COMPATIBILITY IDEOGRAPH 2F95C, 194908 +CJK COMPATIBILITY IDEOGRAPH 2F95D, 194909 +CJK COMPATIBILITY IDEOGRAPH 2F95E, 194910 +CJK COMPATIBILITY IDEOGRAPH 2F95F, 194911 +CJK COMPATIBILITY IDEOGRAPH 2F960, 194912 +CJK COMPATIBILITY IDEOGRAPH 2F961, 194913 +CJK COMPATIBILITY IDEOGRAPH 2F962, 194914 +CJK COMPATIBILITY IDEOGRAPH 2F963, 194915 +CJK COMPATIBILITY IDEOGRAPH 2F964, 194916 +CJK COMPATIBILITY IDEOGRAPH 2F965, 194917 +CJK COMPATIBILITY IDEOGRAPH 2F966, 194918 +CJK COMPATIBILITY IDEOGRAPH 2F967, 194919 +CJK COMPATIBILITY IDEOGRAPH 2F968, 194920 +CJK COMPATIBILITY IDEOGRAPH 2F969, 194921 +CJK COMPATIBILITY IDEOGRAPH 2F96A, 194922 +CJK COMPATIBILITY IDEOGRAPH 2F96B, 194923 +CJK COMPATIBILITY IDEOGRAPH 2F96C, 194924 +CJK COMPATIBILITY IDEOGRAPH 2F96D, 194925 +CJK COMPATIBILITY IDEOGRAPH 2F96E, 194926 +CJK COMPATIBILITY IDEOGRAPH 2F96F, 194927 +CJK COMPATIBILITY IDEOGRAPH 2F970, 194928 +CJK COMPATIBILITY IDEOGRAPH 2F971, 194929 +CJK COMPATIBILITY IDEOGRAPH 2F972, 194930 +CJK COMPATIBILITY IDEOGRAPH 2F973, 194931 +CJK COMPATIBILITY IDEOGRAPH 2F974, 194932 +CJK COMPATIBILITY IDEOGRAPH 2F975, 194933 +CJK COMPATIBILITY IDEOGRAPH 2F976, 194934 +CJK COMPATIBILITY IDEOGRAPH 2F977, 194935 +CJK COMPATIBILITY IDEOGRAPH 2F978, 194936 +CJK COMPATIBILITY IDEOGRAPH 2F979, 194937 +CJK COMPATIBILITY IDEOGRAPH 2F97A, 194938 +CJK COMPATIBILITY IDEOGRAPH 2F97B, 194939 +CJK COMPATIBILITY IDEOGRAPH 2F97C, 194940 +CJK COMPATIBILITY IDEOGRAPH 2F97D, 194941 +CJK COMPATIBILITY IDEOGRAPH 2F97E, 194942 +CJK COMPATIBILITY IDEOGRAPH 2F97F, 194943 +CJK COMPATIBILITY IDEOGRAPH 2F980, 194944 +CJK COMPATIBILITY IDEOGRAPH 2F981, 194945 +CJK COMPATIBILITY IDEOGRAPH 2F982, 194946 +CJK COMPATIBILITY IDEOGRAPH 2F983, 194947 +CJK COMPATIBILITY IDEOGRAPH 2F984, 194948 +CJK COMPATIBILITY IDEOGRAPH 2F985, 194949 +CJK COMPATIBILITY IDEOGRAPH 2F986, 194950 +CJK COMPATIBILITY IDEOGRAPH 2F987, 194951 +CJK COMPATIBILITY IDEOGRAPH 2F988, 194952 +CJK COMPATIBILITY IDEOGRAPH 2F989, 194953 +CJK COMPATIBILITY IDEOGRAPH 2F98A, 194954 +CJK COMPATIBILITY IDEOGRAPH 2F98B, 194955 +CJK COMPATIBILITY IDEOGRAPH 2F98C, 194956 +CJK COMPATIBILITY IDEOGRAPH 2F98D, 194957 +CJK COMPATIBILITY IDEOGRAPH 2F98E, 194958 +CJK COMPATIBILITY IDEOGRAPH 2F98F, 194959 +CJK COMPATIBILITY IDEOGRAPH 2F990, 194960 +CJK COMPATIBILITY IDEOGRAPH 2F991, 194961 +CJK COMPATIBILITY IDEOGRAPH 2F992, 194962 +CJK COMPATIBILITY IDEOGRAPH 2F993, 194963 +CJK COMPATIBILITY IDEOGRAPH 2F994, 194964 +CJK COMPATIBILITY IDEOGRAPH 2F995, 194965 +CJK COMPATIBILITY IDEOGRAPH 2F996, 194966 +CJK COMPATIBILITY IDEOGRAPH 2F997, 194967 +CJK COMPATIBILITY IDEOGRAPH 2F998, 194968 +CJK COMPATIBILITY IDEOGRAPH 2F999, 194969 +CJK COMPATIBILITY IDEOGRAPH 2F99A, 194970 +CJK COMPATIBILITY IDEOGRAPH 2F99B, 194971 +CJK COMPATIBILITY IDEOGRAPH 2F99C, 194972 +CJK COMPATIBILITY IDEOGRAPH 2F99D, 194973 +CJK COMPATIBILITY IDEOGRAPH 2F99E, 194974 +CJK COMPATIBILITY IDEOGRAPH 2F99F, 194975 +CJK COMPATIBILITY IDEOGRAPH 2F9A0, 194976 +CJK COMPATIBILITY IDEOGRAPH 2F9A1, 194977 +CJK COMPATIBILITY IDEOGRAPH 2F9A2, 194978 +CJK COMPATIBILITY IDEOGRAPH 2F9A3, 194979 +CJK COMPATIBILITY IDEOGRAPH 2F9A4, 194980 +CJK COMPATIBILITY IDEOGRAPH 2F9A5, 194981 +CJK COMPATIBILITY IDEOGRAPH 2F9A6, 194982 +CJK COMPATIBILITY IDEOGRAPH 2F9A7, 194983 +CJK COMPATIBILITY IDEOGRAPH 2F9A8, 194984 +CJK COMPATIBILITY IDEOGRAPH 2F9A9, 194985 +CJK COMPATIBILITY IDEOGRAPH 2F9AA, 194986 +CJK COMPATIBILITY IDEOGRAPH 2F9AB, 194987 +CJK COMPATIBILITY IDEOGRAPH 2F9AC, 194988 +CJK COMPATIBILITY IDEOGRAPH 2F9AD, 194989 +CJK COMPATIBILITY IDEOGRAPH 2F9AE, 194990 +CJK COMPATIBILITY IDEOGRAPH 2F9AF, 194991 +CJK COMPATIBILITY IDEOGRAPH 2F9B0, 194992 +CJK COMPATIBILITY IDEOGRAPH 2F9B1, 194993 +CJK COMPATIBILITY IDEOGRAPH 2F9B2, 194994 +CJK COMPATIBILITY IDEOGRAPH 2F9B3, 194995 +CJK COMPATIBILITY IDEOGRAPH 2F9B4, 194996 +CJK COMPATIBILITY IDEOGRAPH 2F9B5, 194997 +CJK COMPATIBILITY IDEOGRAPH 2F9B6, 194998 +CJK COMPATIBILITY IDEOGRAPH 2F9B7, 194999 +CJK COMPATIBILITY IDEOGRAPH 2F9B8, 195000 +CJK COMPATIBILITY IDEOGRAPH 2F9B9, 195001 +CJK COMPATIBILITY IDEOGRAPH 2F9BA, 195002 +CJK COMPATIBILITY IDEOGRAPH 2F9BB, 195003 +CJK COMPATIBILITY IDEOGRAPH 2F9BC, 195004 +CJK COMPATIBILITY IDEOGRAPH 2F9BD, 195005 +CJK COMPATIBILITY IDEOGRAPH 2F9BE, 195006 +CJK COMPATIBILITY IDEOGRAPH 2F9BF, 195007 +CJK COMPATIBILITY IDEOGRAPH 2F9C0, 195008 +CJK COMPATIBILITY IDEOGRAPH 2F9C1, 195009 +CJK COMPATIBILITY IDEOGRAPH 2F9C2, 195010 +CJK COMPATIBILITY IDEOGRAPH 2F9C3, 195011 +CJK COMPATIBILITY IDEOGRAPH 2F9C4, 195012 +CJK COMPATIBILITY IDEOGRAPH 2F9C5, 195013 +CJK COMPATIBILITY IDEOGRAPH 2F9C6, 195014 +CJK COMPATIBILITY IDEOGRAPH 2F9C7, 195015 +CJK COMPATIBILITY IDEOGRAPH 2F9C8, 195016 +CJK COMPATIBILITY IDEOGRAPH 2F9C9, 195017 +CJK COMPATIBILITY IDEOGRAPH 2F9CA, 195018 +CJK COMPATIBILITY IDEOGRAPH 2F9CB, 195019 +CJK COMPATIBILITY IDEOGRAPH 2F9CC, 195020 +CJK COMPATIBILITY IDEOGRAPH 2F9CD, 195021 +CJK COMPATIBILITY IDEOGRAPH 2F9CE, 195022 +CJK COMPATIBILITY IDEOGRAPH 2F9CF, 195023 +CJK COMPATIBILITY IDEOGRAPH 2F9D0, 195024 +CJK COMPATIBILITY IDEOGRAPH 2F9D1, 195025 +CJK COMPATIBILITY IDEOGRAPH 2F9D2, 195026 +CJK COMPATIBILITY IDEOGRAPH 2F9D3, 195027 +CJK COMPATIBILITY IDEOGRAPH 2F9D4, 195028 +CJK COMPATIBILITY IDEOGRAPH 2F9D5, 195029 +CJK COMPATIBILITY IDEOGRAPH 2F9D6, 195030 +CJK COMPATIBILITY IDEOGRAPH 2F9D7, 195031 +CJK COMPATIBILITY IDEOGRAPH 2F9D8, 195032 +CJK COMPATIBILITY IDEOGRAPH 2F9D9, 195033 +CJK COMPATIBILITY IDEOGRAPH 2F9DA, 195034 +CJK COMPATIBILITY IDEOGRAPH 2F9DB, 195035 +CJK COMPATIBILITY IDEOGRAPH 2F9DC, 195036 +CJK COMPATIBILITY IDEOGRAPH 2F9DD, 195037 +CJK COMPATIBILITY IDEOGRAPH 2F9DE, 195038 +CJK COMPATIBILITY IDEOGRAPH 2F9DF, 195039 +CJK COMPATIBILITY IDEOGRAPH 2F9E0, 195040 +CJK COMPATIBILITY IDEOGRAPH 2F9E1, 195041 +CJK COMPATIBILITY IDEOGRAPH 2F9E2, 195042 +CJK COMPATIBILITY IDEOGRAPH 2F9E3, 195043 +CJK COMPATIBILITY IDEOGRAPH 2F9E4, 195044 +CJK COMPATIBILITY IDEOGRAPH 2F9E5, 195045 +CJK COMPATIBILITY IDEOGRAPH 2F9E6, 195046 +CJK COMPATIBILITY IDEOGRAPH 2F9E7, 195047 +CJK COMPATIBILITY IDEOGRAPH 2F9E8, 195048 +CJK COMPATIBILITY IDEOGRAPH 2F9E9, 195049 +CJK COMPATIBILITY IDEOGRAPH 2F9EA, 195050 +CJK COMPATIBILITY IDEOGRAPH 2F9EB, 195051 +CJK COMPATIBILITY IDEOGRAPH 2F9EC, 195052 +CJK COMPATIBILITY IDEOGRAPH 2F9ED, 195053 +CJK COMPATIBILITY IDEOGRAPH 2F9EE, 195054 +CJK COMPATIBILITY IDEOGRAPH 2F9EF, 195055 +CJK COMPATIBILITY IDEOGRAPH 2F9F0, 195056 +CJK COMPATIBILITY IDEOGRAPH 2F9F1, 195057 +CJK COMPATIBILITY IDEOGRAPH 2F9F2, 195058 +CJK COMPATIBILITY IDEOGRAPH 2F9F3, 195059 +CJK COMPATIBILITY IDEOGRAPH 2F9F4, 195060 +CJK COMPATIBILITY IDEOGRAPH 2F9F5, 195061 +CJK COMPATIBILITY IDEOGRAPH 2F9F6, 195062 +CJK COMPATIBILITY IDEOGRAPH 2F9F7, 195063 +CJK COMPATIBILITY IDEOGRAPH 2F9F8, 195064 +CJK COMPATIBILITY IDEOGRAPH 2F9F9, 195065 +CJK COMPATIBILITY IDEOGRAPH 2F9FA, 195066 +CJK COMPATIBILITY IDEOGRAPH 2F9FB, 195067 +CJK COMPATIBILITY IDEOGRAPH 2F9FC, 195068 +CJK COMPATIBILITY IDEOGRAPH 2F9FD, 195069 +CJK COMPATIBILITY IDEOGRAPH 2F9FE, 195070 +CJK COMPATIBILITY IDEOGRAPH 2F9FF, 195071 +CJK COMPATIBILITY IDEOGRAPH 2FA00, 195072 +CJK COMPATIBILITY IDEOGRAPH 2FA01, 195073 +CJK COMPATIBILITY IDEOGRAPH 2FA02, 195074 +CJK COMPATIBILITY IDEOGRAPH 2FA03, 195075 +CJK COMPATIBILITY IDEOGRAPH 2FA04, 195076 +CJK COMPATIBILITY IDEOGRAPH 2FA05, 195077 +CJK COMPATIBILITY IDEOGRAPH 2FA06, 195078 +CJK COMPATIBILITY IDEOGRAPH 2FA07, 195079 +CJK COMPATIBILITY IDEOGRAPH 2FA08, 195080 +CJK COMPATIBILITY IDEOGRAPH 2FA09, 195081 +CJK COMPATIBILITY IDEOGRAPH 2FA0A, 195082 +CJK COMPATIBILITY IDEOGRAPH 2FA0B, 195083 +CJK COMPATIBILITY IDEOGRAPH 2FA0C, 195084 +CJK COMPATIBILITY IDEOGRAPH 2FA0D, 195085 +CJK COMPATIBILITY IDEOGRAPH 2FA0E, 195086 +CJK COMPATIBILITY IDEOGRAPH 2FA0F, 195087 +CJK COMPATIBILITY IDEOGRAPH 2FA10, 195088 +CJK COMPATIBILITY IDEOGRAPH 2FA11, 195089 +CJK COMPATIBILITY IDEOGRAPH 2FA12, 195090 +CJK COMPATIBILITY IDEOGRAPH 2FA13, 195091 +CJK COMPATIBILITY IDEOGRAPH 2FA14, 195092 +CJK COMPATIBILITY IDEOGRAPH 2FA15, 195093 +CJK COMPATIBILITY IDEOGRAPH 2FA16, 195094 +CJK COMPATIBILITY IDEOGRAPH 2FA17, 195095 +CJK COMPATIBILITY IDEOGRAPH 2FA18, 195096 +CJK COMPATIBILITY IDEOGRAPH 2FA19, 195097 +CJK COMPATIBILITY IDEOGRAPH 2FA1A, 195098 +CJK COMPATIBILITY IDEOGRAPH 2FA1B, 195099 +CJK COMPATIBILITY IDEOGRAPH 2FA1C, 195100 +CJK COMPATIBILITY IDEOGRAPH 2FA1D, 195101 +LANGUAGE TAG, 917505 +TAG SPACE, 917536 +TAG EXCLAMATION MARK, 917537 +TAG QUOTATION MARK, 917538 +TAG NUMBER SIGN, 917539 +TAG DOLLAR SIGN, 917540 +TAG PERCENT SIGN, 917541 +TAG AMPERSAND, 917542 +TAG APOSTROPHE, 917543 +TAG LEFT PARENTHESIS, 917544 +TAG RIGHT PARENTHESIS, 917545 +TAG ASTERISK, 917546 +TAG PLUS SIGN, 917547 +TAG COMMA, 917548 +TAG HYPHEN MINUS, 917549 +TAG FULL STOP, 917550 +TAG SOLIDUS, 917551 +TAG DIGIT ZERO, 917552 +TAG DIGIT ONE, 917553 +TAG DIGIT TWO, 917554 +TAG DIGIT THREE, 917555 +TAG DIGIT FOUR, 917556 +TAG DIGIT FIVE, 917557 +TAG DIGIT SIX, 917558 +TAG DIGIT SEVEN, 917559 +TAG DIGIT EIGHT, 917560 +TAG DIGIT NINE, 917561 +TAG COLON, 917562 +TAG SEMICOLON, 917563 +TAG LESS THAN SIGN, 917564 +TAG EQUALS SIGN, 917565 +TAG GREATER THAN SIGN, 917566 +TAG QUESTION MARK, 917567 +TAG COMMERCIAL AT, 917568 +TAG LATIN CAPITAL LETTER A, 917569 +TAG LATIN CAPITAL LETTER B, 917570 +TAG LATIN CAPITAL LETTER C, 917571 +TAG LATIN CAPITAL LETTER D, 917572 +TAG LATIN CAPITAL LETTER E, 917573 +TAG LATIN CAPITAL LETTER F, 917574 +TAG LATIN CAPITAL LETTER G, 917575 +TAG LATIN CAPITAL LETTER H, 917576 +TAG LATIN CAPITAL LETTER I, 917577 +TAG LATIN CAPITAL LETTER J, 917578 +TAG LATIN CAPITAL LETTER K, 917579 +TAG LATIN CAPITAL LETTER L, 917580 +TAG LATIN CAPITAL LETTER M, 917581 +TAG LATIN CAPITAL LETTER N, 917582 +TAG LATIN CAPITAL LETTER O, 917583 +TAG LATIN CAPITAL LETTER P, 917584 +TAG LATIN CAPITAL LETTER Q, 917585 +TAG LATIN CAPITAL LETTER R, 917586 +TAG LATIN CAPITAL LETTER S, 917587 +TAG LATIN CAPITAL LETTER T, 917588 +TAG LATIN CAPITAL LETTER U, 917589 +TAG LATIN CAPITAL LETTER V, 917590 +TAG LATIN CAPITAL LETTER W, 917591 +TAG LATIN CAPITAL LETTER X, 917592 +TAG LATIN CAPITAL LETTER Y, 917593 +TAG LATIN CAPITAL LETTER Z, 917594 +TAG LEFT SQUARE BRACKET, 917595 +TAG REVERSE SOLIDUS, 917596 +TAG RIGHT SQUARE BRACKET, 917597 +TAG CIRCUMFLEX ACCENT, 917598 +TAG LOW LINE, 917599 +TAG GRAVE ACCENT, 917600 +TAG LATIN SMALL LETTER A, 917601 +TAG LATIN SMALL LETTER B, 917602 +TAG LATIN SMALL LETTER C, 917603 +TAG LATIN SMALL LETTER D, 917604 +TAG LATIN SMALL LETTER E, 917605 +TAG LATIN SMALL LETTER F, 917606 +TAG LATIN SMALL LETTER G, 917607 +TAG LATIN SMALL LETTER H, 917608 +TAG LATIN SMALL LETTER I, 917609 +TAG LATIN SMALL LETTER J, 917610 +TAG LATIN SMALL LETTER K, 917611 +TAG LATIN SMALL LETTER L, 917612 +TAG LATIN SMALL LETTER M, 917613 +TAG LATIN SMALL LETTER N, 917614 +TAG LATIN SMALL LETTER O, 917615 +TAG LATIN SMALL LETTER P, 917616 +TAG LATIN SMALL LETTER Q, 917617 +TAG LATIN SMALL LETTER R, 917618 +TAG LATIN SMALL LETTER S, 917619 +TAG LATIN SMALL LETTER T, 917620 +TAG LATIN SMALL LETTER U, 917621 +TAG LATIN SMALL LETTER V, 917622 +TAG LATIN SMALL LETTER W, 917623 +TAG LATIN SMALL LETTER X, 917624 +TAG LATIN SMALL LETTER Y, 917625 +TAG LATIN SMALL LETTER Z, 917626 +TAG LEFT CURLY BRACKET, 917627 +TAG VERTICAL LINE, 917628 +TAG RIGHT CURLY BRACKET, 917629 +TAG TILDE, 917630 +CANCEL TAG, 917631 +VARIATION SELECTOR 17, 917760 +VARIATION SELECTOR 18, 917761 +VARIATION SELECTOR 19, 917762 +VARIATION SELECTOR 20, 917763 +VARIATION SELECTOR 21, 917764 +VARIATION SELECTOR 22, 917765 +VARIATION SELECTOR 23, 917766 +VARIATION SELECTOR 24, 917767 +VARIATION SELECTOR 25, 917768 +VARIATION SELECTOR 26, 917769 +VARIATION SELECTOR 27, 917770 +VARIATION SELECTOR 28, 917771 +VARIATION SELECTOR 29, 917772 +VARIATION SELECTOR 30, 917773 +VARIATION SELECTOR 31, 917774 +VARIATION SELECTOR 32, 917775 +VARIATION SELECTOR 33, 917776 +VARIATION SELECTOR 34, 917777 +VARIATION SELECTOR 35, 917778 +VARIATION SELECTOR 36, 917779 +VARIATION SELECTOR 37, 917780 +VARIATION SELECTOR 38, 917781 +VARIATION SELECTOR 39, 917782 +VARIATION SELECTOR 40, 917783 +VARIATION SELECTOR 41, 917784 +VARIATION SELECTOR 42, 917785 +VARIATION SELECTOR 43, 917786 +VARIATION SELECTOR 44, 917787 +VARIATION SELECTOR 45, 917788 +VARIATION SELECTOR 46, 917789 +VARIATION SELECTOR 47, 917790 +VARIATION SELECTOR 48, 917791 +VARIATION SELECTOR 49, 917792 +VARIATION SELECTOR 50, 917793 +VARIATION SELECTOR 51, 917794 +VARIATION SELECTOR 52, 917795 +VARIATION SELECTOR 53, 917796 +VARIATION SELECTOR 54, 917797 +VARIATION SELECTOR 55, 917798 +VARIATION SELECTOR 56, 917799 +VARIATION SELECTOR 57, 917800 +VARIATION SELECTOR 58, 917801 +VARIATION SELECTOR 59, 917802 +VARIATION SELECTOR 60, 917803 +VARIATION SELECTOR 61, 917804 +VARIATION SELECTOR 62, 917805 +VARIATION SELECTOR 63, 917806 +VARIATION SELECTOR 64, 917807 +VARIATION SELECTOR 65, 917808 +VARIATION SELECTOR 66, 917809 +VARIATION SELECTOR 67, 917810 +VARIATION SELECTOR 68, 917811 +VARIATION SELECTOR 69, 917812 +VARIATION SELECTOR 70, 917813 +VARIATION SELECTOR 71, 917814 +VARIATION SELECTOR 72, 917815 +VARIATION SELECTOR 73, 917816 +VARIATION SELECTOR 74, 917817 +VARIATION SELECTOR 75, 917818 +VARIATION SELECTOR 76, 917819 +VARIATION SELECTOR 77, 917820 +VARIATION SELECTOR 78, 917821 +VARIATION SELECTOR 79, 917822 +VARIATION SELECTOR 80, 917823 +VARIATION SELECTOR 81, 917824 +VARIATION SELECTOR 82, 917825 +VARIATION SELECTOR 83, 917826 +VARIATION SELECTOR 84, 917827 +VARIATION SELECTOR 85, 917828 +VARIATION SELECTOR 86, 917829 +VARIATION SELECTOR 87, 917830 +VARIATION SELECTOR 88, 917831 +VARIATION SELECTOR 89, 917832 +VARIATION SELECTOR 90, 917833 +VARIATION SELECTOR 91, 917834 +VARIATION SELECTOR 92, 917835 +VARIATION SELECTOR 93, 917836 +VARIATION SELECTOR 94, 917837 +VARIATION SELECTOR 95, 917838 +VARIATION SELECTOR 96, 917839 +VARIATION SELECTOR 97, 917840 +VARIATION SELECTOR 98, 917841 +VARIATION SELECTOR 99, 917842 +VARIATION SELECTOR 100, 917843 +VARIATION SELECTOR 101, 917844 +VARIATION SELECTOR 102, 917845 +VARIATION SELECTOR 103, 917846 +VARIATION SELECTOR 104, 917847 +VARIATION SELECTOR 105, 917848 +VARIATION SELECTOR 106, 917849 +VARIATION SELECTOR 107, 917850 +VARIATION SELECTOR 108, 917851 +VARIATION SELECTOR 109, 917852 +VARIATION SELECTOR 110, 917853 +VARIATION SELECTOR 111, 917854 +VARIATION SELECTOR 112, 917855 +VARIATION SELECTOR 113, 917856 +VARIATION SELECTOR 114, 917857 +VARIATION SELECTOR 115, 917858 +VARIATION SELECTOR 116, 917859 +VARIATION SELECTOR 117, 917860 +VARIATION SELECTOR 118, 917861 +VARIATION SELECTOR 119, 917862 +VARIATION SELECTOR 120, 917863 +VARIATION SELECTOR 121, 917864 +VARIATION SELECTOR 122, 917865 +VARIATION SELECTOR 123, 917866 +VARIATION SELECTOR 124, 917867 +VARIATION SELECTOR 125, 917868 +VARIATION SELECTOR 126, 917869 +VARIATION SELECTOR 127, 917870 +VARIATION SELECTOR 128, 917871 +VARIATION SELECTOR 129, 917872 +VARIATION SELECTOR 130, 917873 +VARIATION SELECTOR 131, 917874 +VARIATION SELECTOR 132, 917875 +VARIATION SELECTOR 133, 917876 +VARIATION SELECTOR 134, 917877 +VARIATION SELECTOR 135, 917878 +VARIATION SELECTOR 136, 917879 +VARIATION SELECTOR 137, 917880 +VARIATION SELECTOR 138, 917881 +VARIATION SELECTOR 139, 917882 +VARIATION SELECTOR 140, 917883 +VARIATION SELECTOR 141, 917884 +VARIATION SELECTOR 142, 917885 +VARIATION SELECTOR 143, 917886 +VARIATION SELECTOR 144, 917887 +VARIATION SELECTOR 145, 917888 +VARIATION SELECTOR 146, 917889 +VARIATION SELECTOR 147, 917890 +VARIATION SELECTOR 148, 917891 +VARIATION SELECTOR 149, 917892 +VARIATION SELECTOR 150, 917893 +VARIATION SELECTOR 151, 917894 +VARIATION SELECTOR 152, 917895 +VARIATION SELECTOR 153, 917896 +VARIATION SELECTOR 154, 917897 +VARIATION SELECTOR 155, 917898 +VARIATION SELECTOR 156, 917899 +VARIATION SELECTOR 157, 917900 +VARIATION SELECTOR 158, 917901 +VARIATION SELECTOR 159, 917902 +VARIATION SELECTOR 160, 917903 +VARIATION SELECTOR 161, 917904 +VARIATION SELECTOR 162, 917905 +VARIATION SELECTOR 163, 917906 +VARIATION SELECTOR 164, 917907 +VARIATION SELECTOR 165, 917908 +VARIATION SELECTOR 166, 917909 +VARIATION SELECTOR 167, 917910 +VARIATION SELECTOR 168, 917911 +VARIATION SELECTOR 169, 917912 +VARIATION SELECTOR 170, 917913 +VARIATION SELECTOR 171, 917914 +VARIATION SELECTOR 172, 917915 +VARIATION SELECTOR 173, 917916 +VARIATION SELECTOR 174, 917917 +VARIATION SELECTOR 175, 917918 +VARIATION SELECTOR 176, 917919 +VARIATION SELECTOR 177, 917920 +VARIATION SELECTOR 178, 917921 +VARIATION SELECTOR 179, 917922 +VARIATION SELECTOR 180, 917923 +VARIATION SELECTOR 181, 917924 +VARIATION SELECTOR 182, 917925 +VARIATION SELECTOR 183, 917926 +VARIATION SELECTOR 184, 917927 +VARIATION SELECTOR 185, 917928 +VARIATION SELECTOR 186, 917929 +VARIATION SELECTOR 187, 917930 +VARIATION SELECTOR 188, 917931 +VARIATION SELECTOR 189, 917932 +VARIATION SELECTOR 190, 917933 +VARIATION SELECTOR 191, 917934 +VARIATION SELECTOR 192, 917935 +VARIATION SELECTOR 193, 917936 +VARIATION SELECTOR 194, 917937 +VARIATION SELECTOR 195, 917938 +VARIATION SELECTOR 196, 917939 +VARIATION SELECTOR 197, 917940 +VARIATION SELECTOR 198, 917941 +VARIATION SELECTOR 199, 917942 +VARIATION SELECTOR 200, 917943 +VARIATION SELECTOR 201, 917944 +VARIATION SELECTOR 202, 917945 +VARIATION SELECTOR 203, 917946 +VARIATION SELECTOR 204, 917947 +VARIATION SELECTOR 205, 917948 +VARIATION SELECTOR 206, 917949 +VARIATION SELECTOR 207, 917950 +VARIATION SELECTOR 208, 917951 +VARIATION SELECTOR 209, 917952 +VARIATION SELECTOR 210, 917953 +VARIATION SELECTOR 211, 917954 +VARIATION SELECTOR 212, 917955 +VARIATION SELECTOR 213, 917956 +VARIATION SELECTOR 214, 917957 +VARIATION SELECTOR 215, 917958 +VARIATION SELECTOR 216, 917959 +VARIATION SELECTOR 217, 917960 +VARIATION SELECTOR 218, 917961 +VARIATION SELECTOR 219, 917962 +VARIATION SELECTOR 220, 917963 +VARIATION SELECTOR 221, 917964 +VARIATION SELECTOR 222, 917965 +VARIATION SELECTOR 223, 917966 +VARIATION SELECTOR 224, 917967 +VARIATION SELECTOR 225, 917968 +VARIATION SELECTOR 226, 917969 +VARIATION SELECTOR 227, 917970 +VARIATION SELECTOR 228, 917971 +VARIATION SELECTOR 229, 917972 +VARIATION SELECTOR 230, 917973 +VARIATION SELECTOR 231, 917974 +VARIATION SELECTOR 232, 917975 +VARIATION SELECTOR 233, 917976 +VARIATION SELECTOR 234, 917977 +VARIATION SELECTOR 235, 917978 +VARIATION SELECTOR 236, 917979 +VARIATION SELECTOR 237, 917980 +VARIATION SELECTOR 238, 917981 +VARIATION SELECTOR 239, 917982 +VARIATION SELECTOR 240, 917983 +VARIATION SELECTOR 241, 917984 +VARIATION SELECTOR 242, 917985 +VARIATION SELECTOR 243, 917986 +VARIATION SELECTOR 244, 917987 +VARIATION SELECTOR 245, 917988 +VARIATION SELECTOR 246, 917989 +VARIATION SELECTOR 247, 917990 +VARIATION SELECTOR 248, 917991 +VARIATION SELECTOR 249, 917992 +VARIATION SELECTOR 250, 917993 +VARIATION SELECTOR 251, 917994 +VARIATION SELECTOR 252, 917995 +VARIATION SELECTOR 253, 917996 +VARIATION SELECTOR 254, 917997 +VARIATION SELECTOR 255, 917998 +VARIATION SELECTOR 256, 917999 \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionParameter.cs b/Rant/Core/Framework/RantFunctionParameter.cs index 1fc1e62..f37bddb 100644 --- a/Rant/Core/Framework/RantFunctionParameter.cs +++ b/Rant/Core/Framework/RantFunctionParameter.cs @@ -36,7 +36,7 @@ internal class RantFunctionParameter : IRantParameter { public RantFunctionParameter(string name, Type nativeType, RantFunctionParameterType rantType, bool isParams = false) { - Name = name; + Name = Util.CamelToSnake(name); NativeType = nativeType; RantType = rantType; IsParams = isParams; @@ -54,7 +54,7 @@ public IEnumerable GetEnumValues() if (!NativeType.IsEnum) yield break; foreach (string value in Enum.GetNames(NativeType)) yield return new RantModeValue(Util.CamelToSnake(value), - (NativeType.GetMember(value)[0].GetCustomAttributes(typeof(RantDescriptionAttribute), true).First() as + (NativeType.GetMember(value)[0].GetCustomAttributes(typeof(RantDescriptionAttribute), true).FirstOrDefault() as RantDescriptionAttribute)?.Description ?? string.Empty); } } diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 18049f6..b57b39d 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -37,6 +37,7 @@ using Rant.Core.Utilities; using Rant.Metadata; using Rant.Vocabulary.Utilities; +// ReSharper disable UnusedMember.Local namespace Rant.Core.Framework { @@ -911,6 +912,8 @@ private static void ReverseEx(Sandbox sb, private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); [RantFunction("char")] - private static void Character(Sandbox sb, string name) => sb.Print(Unicode.GetByName(name)); + [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] + private static void Character(Sandbox sb, + [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index 8ad2c8e..8a3bf6e 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -238,7 +238,9 @@ public static char ReverseChar(char c) return '{'; case '<': return '>'; - case '«': + case '>': + return '<'; + case '«': return '»'; case '»': return '«'; diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 1bc0ee7..4c10db2 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -313,7 +313,9 @@ - + + + diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index 0a2168c..0af6efb 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -58,13 +58,12 @@ public RantDictionary(IEnumerable tables) if (tables == null) return; - RantDictionaryTable table; - foreach (var list in tables) - if (_tables.TryGetValue(list.Name, out table)) - table.Merge(list); - else - _tables[list.Name] = list; - } + foreach (var list in tables) + if (_tables.TryGetValue(list.Name, out RantDictionaryTable table)) + table.Merge(list); + else + _tables[list.Name] = list; + } /// /// Gets all currently exposed hidden classes. @@ -110,17 +109,16 @@ public bool ClassExposed(string className) /// The table to add. public void AddTable(RantDictionaryTable table) { - RantDictionaryTable oldTable; - if (_tables.TryGetValue(table.Name, out oldTable)) - { - if (ReferenceEquals(table, oldTable)) return; - oldTable.Merge(table); - } - else - { - _tables[table.Name] = table; - } - } + if (_tables.TryGetValue(table.Name, out RantDictionaryTable oldTable)) + { + if (ReferenceEquals(table, oldTable)) return; + oldTable.Merge(table); + } + else + { + _tables[table.Name] = table; + } + } /// /// Enumerates the tables contained in the current RantDictionary instance. @@ -140,10 +138,9 @@ public IEnumerable GetTables() /// internal RantDictionaryTerm Query(Sandbox sb, Query query, CarrierState syncState) { - RantDictionaryTable table; - return !_tables.TryGetValue(query.Name, out table) - ? null - : table.Query(this, sb, query, syncState); - } + return !_tables.TryGetValue(query.Name, out RantDictionaryTable table) + ? null + : table.Query(this, sb, query, syncState); + } } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryEntry.cs b/Rant/Vocabulary/RantDictionaryEntry.cs index e962957..7589451 100644 --- a/Rant/Vocabulary/RantDictionaryEntry.cs +++ b/Rant/Vocabulary/RantDictionaryEntry.cs @@ -221,9 +221,8 @@ public IEnumerable GetMetadataKeys() public object GetMetadata(string key) { if (_metadata == null) return null; - object result; - return !_metadata.TryGetValue(key, out result) ? null : result; - } + return !_metadata.TryGetValue(key, out object result) ? null : result; + } /// /// Determines if the entry contains metadata attached to the specified key. diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index 078c919..09c3cfe 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -81,15 +81,13 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) case '@': { // Read directive name - string directiveName; int dPos = i; - if (!Tools.ReadDirectiveName(l, len, ref i, out directiveName)) + if (!Tools.ReadDirectiveName(l, len, ref i, out string directiveName)) throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-directive-name"); // Read arguments var args = new List(); - Argument arg; - while (Tools.ReadArg(origin, l, len, line, ref i, out arg)) args.Add(arg); + while (Tools.ReadArg(origin, l, len, line, ref i, out Argument arg)) args.Add(arg); switch (directiveName.ToLowerInvariant()) { @@ -122,9 +120,8 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) if (args.Count == 0) throw new RantTableLoadException(origin, line, dPos + 1, "err-table-subtype-args"); - int termIndex; // If the first argument is a number, use it as the subtype index. - if (int.TryParse(args[0].Value, out termIndex)) + if (int.TryParse(args[0].Value, out int termIndex)) { // Disallow negative term indices if (termIndex < 0) @@ -239,15 +236,13 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) Tools.SkipSpace(l, len, ref i); // Read property name - string propName; int dPos = i; - if (!Tools.ReadDirectiveName(l, len, ref i, out propName)) + if (!Tools.ReadDirectiveName(l, len, ref i, out string propName)) throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-property-name"); // Read arguments var args = new List(); - Argument arg; - while (Tools.ReadArg(origin, l, len, line, ref i, out arg)) args.Add(arg); + while (Tools.ReadArg(origin, l, len, line, ref i, out Argument arg)) args.Add(arg); // No args? Skip it. if (args.Count == 0) @@ -265,8 +260,7 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) break; case "weight": { - int weight; - if (!int.TryParse(args[0].Value, out weight) || weight <= 0) + if (!int.TryParse(args[0].Value, out int weight) || weight <= 0) throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-weight", args[0].Value); currentEntry.Weight = weight; break; @@ -391,7 +385,6 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i if (i >= len) throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); int start = i; - int termIndex = -1; if (white.Length > 0) { buffer.Append(white); @@ -437,8 +430,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i // It's just a template ID. case 1: { - RantDictionaryEntry entry; - if (!templates.TryGetValue(id[0], out entry)) + if (!templates.TryGetValue(id[0], out RantDictionaryEntry entry)) throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); // Append term value to buffer buffer.Append(entry[t].Value); @@ -447,8 +439,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i // Template ID and custom subtype case 2: { - RantDictionaryEntry entry; - if (!templates.TryGetValue(id[0], out entry)) + if (!templates.TryGetValue(id[0], out RantDictionaryEntry entry)) throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); int templateSubIndex = table.GetSubtypeIndex(id[1]); if (templateSubIndex == -1 || templateSubIndex >= table.TermsPerEntry) @@ -500,8 +491,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i case 'u': { if (i + 4 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - ushort codePoint; - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); buffer.Append((char)codePoint); i += 4; @@ -510,8 +500,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i case 'U': { if (i + 8 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - char high, low; - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); buffer.Append(high).Append(low); i += 8; @@ -629,8 +618,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int case 'u': { if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - ushort codePoint; - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); buffer.Append((char)codePoint); i += 4; @@ -639,8 +627,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int case 'U': { if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - char high, low; - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); buffer.Append(high).Append(low); i += 8; @@ -704,8 +691,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int case 'u': { if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - ushort codePoint; - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); buffer.Append((char)codePoint); i += 4; @@ -714,8 +700,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int case 'U': { if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - char high, low; - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out high, out low)) + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); buffer.Append(high).Append(low); i += 8; diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 65310e3..352dc1f 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -206,10 +206,9 @@ public bool AddSubtype(string subtypeName, int index) if (subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); if (!Util.ValidateName(subtypeName)) return false; _subtypes[subtypeName] = index; - HashSet subs; - if (!_subtypeIndexMap.TryGetValue(index, out subs)) - _subtypeIndexMap[index] = subs = new HashSet(); - subs.Add(subtypeName); + if (!_subtypeIndexMap.TryGetValue(index, out HashSet subs)) + _subtypeIndexMap[index] = subs = new HashSet(); + subs.Add(subtypeName); return true; } @@ -223,10 +222,9 @@ public bool RemoveSubtype(string subtypeName) { if (Util.IsNullOrWhiteSpace(subtypeName)) return false; if (!_subtypes.ContainsKey(subtypeName)) return false; - HashSet subs; - if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out subs)) - return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); - return false; + if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out HashSet subs)) + return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); + return false; } /// @@ -240,9 +238,8 @@ public int GetSubtypeIndex(string subtype) { if (Util.IsNullOrWhiteSpace(subtype)) return 0; if (!Util.ValidateName(subtype)) return -1; - int index; - if (int.TryParse(subtype, out index) && index >= 0) return index; - return _subtypes.TryGetValue(subtype, out index) ? index : -1; + if (int.TryParse(subtype, out int index) && index >= 0) return index; + return _subtypes.TryGetValue(subtype, out index) ? index : -1; } /// @@ -253,9 +250,8 @@ public int GetSubtypeIndex(string subtype) public IEnumerable GetSubtypesForIndex(int index) { if (index < 0 || index >= TermsPerEntry) yield break; - HashSet subs; - if (!_subtypeIndexMap.TryGetValue(index, out subs)) yield break; - foreach (string sub in subs) yield return sub; + if (!_subtypeIndexMap.TryGetValue(index, out HashSet subs)) yield break; + foreach (string sub in subs) yield return sub; } /// diff --git a/Rant/Vocabulary/Utilities/VocabUtils.cs b/Rant/Vocabulary/Utilities/VocabUtils.cs index a042f3f..997c7ea 100644 --- a/Rant/Vocabulary/Utilities/VocabUtils.cs +++ b/Rant/Vocabulary/Utilities/VocabUtils.cs @@ -84,9 +84,8 @@ public static IEnumerable GetArgs(string argString) public static string GetString(string str) { - string cstr; - if (!StringCache.TryGetValue(str, out cstr)) cstr = StringCache[str] = str; - return cstr; + if (!StringCache.TryGetValue(str, out string cstr)) cstr = StringCache[str] = str; + return cstr; } public static bool AssociatesWith(this RantDictionaryEntry a, RantDictionaryEntry b) From ec5d8e9f11e5a9bd5585f33b4e17412037f144d1 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 10 Mar 2017 00:06:03 -0600 Subject: [PATCH 121/213] Fix code formatting --- Rant/Core/Compiler/CompileContext.cs | 76 +- Rant/Core/Compiler/LineCol.cs | 26 +- Rant/Core/Compiler/Parsing/BlockParser.cs | 142 +- Rant/Core/Compiler/Parsing/Parser.cs | 26 +- Rant/Core/Compiler/Parsing/QueryParser.cs | 548 ++- Rant/Core/Compiler/Parsing/SequenceParser.cs | 390 +-- Rant/Core/Compiler/Parsing/TagParser.cs | 426 ++- Rant/Core/Compiler/R.cs | 78 +- Rant/Core/Compiler/RantCompiler.cs | 194 +- Rant/Core/Compiler/RantLexer.cs | 1070 +++--- .../Compiler/Syntax/DeserializeRequest.cs | 10 +- Rant/Core/Compiler/Syntax/RST.cs | 252 +- Rant/Core/Compiler/Syntax/RSTAttribute.cs | 20 +- Rant/Core/Compiler/Syntax/RstBlock.cs | 456 ++- .../Core/Compiler/Syntax/RstCallSubroutine.cs | 174 +- .../Compiler/Syntax/RstDefineSubroutine.cs | 84 +- Rant/Core/Compiler/Syntax/RstEscape.cs | 246 +- Rant/Core/Compiler/Syntax/RstFunction.cs | 288 +- Rant/Core/Compiler/Syntax/RstQuery.cs | 266 +- Rant/Core/Compiler/Syntax/RstReplacer.cs | 118 +- Rant/Core/Compiler/Syntax/RstSequence.cs | 74 +- .../Core/Compiler/Syntax/RstSubroutineBase.cs | 60 +- Rant/Core/Compiler/Syntax/RstText.cs | 70 +- Rant/Core/Compiler/Token.cs | 54 +- Rant/Core/Compiler/TokenReader.cs | 946 +++--- Rant/Core/Constructs/AttribPersistence.cs | 82 +- Rant/Core/Constructs/BlockAttribs.cs | 112 +- Rant/Core/Constructs/BlockManager.cs | 118 +- Rant/Core/Constructs/BlockState.cs | 36 +- Rant/Core/Constructs/Comparison.cs | 68 +- Rant/Core/Constructs/SyncManager.cs | 112 +- Rant/Core/Constructs/SyncType.cs | 58 +- Rant/Core/Constructs/Synchronizer.cs | 276 +- Rant/Core/Formatting/Accent.cs | 22 +- Rant/Core/Formatting/Capitalization.cs | 34 +- Rant/Core/Formatting/Emoji.cs | 1716 +++++----- Rant/Core/Formatting/Endianness.cs | 18 +- Rant/Core/Formatting/HexFormat.cs | 18 +- Rant/Core/Formatting/NumberFormat.cs | 54 +- Rant/Core/Formatting/NumberFormatter.cs | 220 +- Rant/Core/Formatting/Numerals.cs | 334 +- Rant/Core/Formatting/Unicode.cs | 58 +- Rant/Core/Framework/RantFunction.cs | 76 +- Rant/Core/Framework/RantFunctionParameter.cs | 50 +- .../Framework/RantFunctionParameterType.cs | 70 +- .../Framework/RantFunctionRegistry.Loader.cs | 178 +- Rant/Core/Framework/RantFunctionRegistry.cs | 1741 +++++----- Rant/Core/Framework/RantFunctionSignature.cs | 210 +- Rant/Core/IO/BitField.cs | 270 +- Rant/Core/IO/Bson/BsonDocument.cs | 666 ++-- Rant/Core/IO/Bson/BsonItem.cs | 520 +-- Rant/Core/IO/Bson/BsonStringTableMode.cs | 36 +- Rant/Core/IO/Compression/CRC.cs | 98 +- Rant/Core/IO/Compression/EasyCompressor.cs | 116 +- Rant/Core/IO/Compression/ICoder.cs | 332 +- Rant/Core/IO/Compression/LZ/IMatchFinder.cs | 32 +- Rant/Core/IO/Compression/LZ/LzBinTree.cs | 756 ++--- Rant/Core/IO/Compression/LZ/LzInWindow.cs | 278 +- Rant/Core/IO/Compression/LZ/LzOutWindow.cs | 186 +- Rant/Core/IO/Compression/LZMA/LzmaBase.cs | 148 +- Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs | 738 ++-- Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs | 2964 ++++++++--------- .../IO/Compression/RangeCoder/RangeCoder.cs | 448 ++- .../Compression/RangeCoder/RangeCoderBit.cs | 220 +- .../RangeCoder/RangeCoderBitTree.cs | 304 +- Rant/Core/IO/EasyReader.cs | 1622 ++++----- Rant/Core/IO/EasyWriter.cs | 900 ++--- Rant/Core/IO/Endian.cs | 28 +- Rant/Core/IO/EndiannessAttribute.cs | 38 +- Rant/Core/IO/IOExtensions.cs | 38 +- Rant/Core/IO/IOUtil.cs | 176 +- Rant/Core/ObjectModel/ObjectStack.cs | 134 +- Rant/Core/ObjectModel/ObjectTable.cs | 46 +- Rant/Core/ObjectModel/RantObject.cs | 872 +++-- Rant/Core/ObjectModel/RantObjectType.cs | 76 +- Rant/Core/Output/ChannelVisibility.cs | 42 +- Rant/Core/Output/OutputChain.cs | 196 +- Rant/Core/Output/OutputChainArticleBuffer.cs | 130 +- Rant/Core/Output/OutputChainBuffer.cs | 534 +-- Rant/Core/Output/OutputWriter.cs | 146 +- Rant/Core/Sandbox.cs | 722 ++-- Rant/Core/Utilities/Extensions.cs | 64 +- Rant/Core/Utilities/Limit.cs | 28 +- Rant/Core/Utilities/Util.cs | 488 +-- Rant/Core/Utilities/Witchcraft.cs | 714 ++-- Rant/Formats/EnglishPluralizer.cs | 202 +- Rant/Formats/Pluralizer.cs | 24 +- Rant/Formats/RantFormat.cs | 408 +-- Rant/Localization/Txtres.cs | 318 +- Rant/Metadata/IRantFunction.cs | 62 +- Rant/Metadata/IRantFunctionGroup.cs | 28 +- Rant/Metadata/IRantModeValue.cs | 28 +- Rant/Metadata/IRantParameter.cs | 62 +- Rant/Metadata/RantDescriptionAttribute.cs | 22 +- Rant/Metadata/RantFunctionAttribute.cs | 42 +- Rant/Metadata/RantModeValue.cs | 20 +- Rant/RNG.cs | 808 ++--- Rant/RantArgAttribute.cs | 40 +- Rant/RantCompilerException.cs | 176 +- Rant/RantCompilerMessage.cs | 110 +- Rant/RantCompilerMessageType.cs | 28 +- Rant/RantEngine.cs | 1062 +++--- Rant/RantInternalException.cs | 38 +- Rant/RantOutput.cs | 164 +- Rant/RantOutputEntry.cs | 48 +- Rant/RantProgram.cs | 384 +-- Rant/RantProgramArgs.cs | 184 +- Rant/RantProgramOrigin.cs | 28 +- Rant/RantRuntimeException.cs | 98 +- Rant/RantUtils.cs | 104 +- Rant/Resources/RantDependencyResolver.cs | 98 +- Rant/Resources/RantModule.cs | 80 +- Rant/Resources/RantPackage.cs | 642 ++-- Rant/Resources/RantPackageDependency.cs | 202 +- Rant/Resources/RantPackageVersion.cs | 350 +- Rant/Resources/RantResource.cs | 86 +- Rant/Tuple.cs | 1328 ++++---- Rant/Vocabulary/ClassTree.cs | 268 +- Rant/Vocabulary/Legacy/DicLexer.cs | 218 +- .../Legacy/RantDictionaryTable.Loader.cs | 534 +-- Rant/Vocabulary/Querying/Carrier.cs | 170 +- Rant/Vocabulary/Querying/CarrierComponent.cs | 108 +- Rant/Vocabulary/Querying/CarrierState.cs | 380 ++- Rant/Vocabulary/Querying/ClassFilter.cs | 182 +- Rant/Vocabulary/Querying/ClassFilterRule.cs | 64 +- Rant/Vocabulary/Querying/Filter.cs | 74 +- Rant/Vocabulary/Querying/Query.cs | 112 +- Rant/Vocabulary/Querying/RangeFilter.cs | 264 +- Rant/Vocabulary/Querying/RegexFilter.cs | 60 +- Rant/Vocabulary/RantDictionary.cs | 178 +- Rant/Vocabulary/RantDictionaryEntry.cs | 402 +-- .../RantDictionaryTable.Importer.cs | 714 ++-- Rant/Vocabulary/RantDictionaryTable.cs | 818 +++-- Rant/Vocabulary/RantDictionaryTerm.cs | 252 +- Rant/Vocabulary/RantTableLoadException.cs | 56 +- Rant/Vocabulary/SyllableBuckets.cs | 112 +- Rant/Vocabulary/Utilities/Diff.cs | 940 +++--- Rant/Vocabulary/Utilities/DoubleMetaphone.cs | 1592 ++++----- Rant/Vocabulary/Utilities/Rhymer.cs | 360 +- Rant/Vocabulary/Utilities/VocabUtils.cs | 195 +- 140 files changed, 21148 insertions(+), 21040 deletions(-) diff --git a/Rant/Core/Compiler/CompileContext.cs b/Rant/Core/Compiler/CompileContext.cs index 21eac67..1ba17a8 100644 --- a/Rant/Core/Compiler/CompileContext.cs +++ b/Rant/Core/Compiler/CompileContext.cs @@ -25,49 +25,49 @@ namespace Rant.Core.Compiler { - /// - /// Distinguishes execution contexts to the compiler to make it aware of context-specific token behaviors. - /// - internal enum CompileContext - { - /// - /// Point of execution is outside of any specialized constructs. - /// - DefaultSequence, + /// + /// Distinguishes execution contexts to the compiler to make it aware of context-specific token behaviors. + /// + internal enum CompileContext + { + /// + /// Point of execution is outside of any specialized constructs. + /// + DefaultSequence, - /// - /// Point of execution is inside a tag argument. - /// - ArgumentSequence, + /// + /// Point of execution is inside a tag argument. + /// + ArgumentSequence, - /// - /// Point of execution is inside of a block. - /// - BlockSequence, + /// + /// Point of execution is inside of a block. + /// + BlockSequence, - /// - /// We're reading a block weight. - /// - BlockWeight, + /// + /// We're reading a block weight. + /// + BlockWeight, - /// - /// We're reading a subroutine body. - /// - SubroutineBody, + /// + /// We're reading a subroutine body. + /// + SubroutineBody, - /// - /// The end of a block. - /// - BlockEndSequence, + /// + /// The end of a block. + /// + BlockEndSequence, - /// - /// The end of function arguments. - /// - FunctionEndContext, + /// + /// The end of function arguments. + /// + FunctionEndContext, - /// - /// Complement pattern for queries. - /// - QueryComplement - } + /// + /// Complement pattern for queries. + /// + QueryComplement + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/LineCol.cs b/Rant/Core/Compiler/LineCol.cs index e0df140..f2b592a 100644 --- a/Rant/Core/Compiler/LineCol.cs +++ b/Rant/Core/Compiler/LineCol.cs @@ -25,18 +25,18 @@ namespace Rant.Core.Compiler { - internal struct LineCol - { - public static readonly LineCol Unknown = new LineCol(-1, -1, -1); - public int Column; - public int Index; - public int Line; + internal struct LineCol + { + public static readonly LineCol Unknown = new LineCol(-1, -1, -1); + public int Column; + public int Index; + public int Line; - public LineCol(int line, int column, int index) - { - Line = line; - Column = column; - Index = index; - } - } + public LineCol(int line, int column, int index) + { + Line = line; + Column = column; + Index = index; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index db23595..8af9de6 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -30,75 +30,75 @@ namespace Rant.Core.Compiler.Parsing { - internal class BlockParser : Parser - { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - var blockStartToken = reader.PrevLooseToken; - var items = new List(); - var actions = new List(); - - // "why are these not lists or arrays" i yell into the void, too lazy to find out why - List<_> constantWeights = null; - List<_> dynamicWeights = null; - int blockNumber = 0; - Action itemCallback = action => actions.Add(action); - - compiler.AddContext(CompileContext.BlockEndSequence); - compiler.AddContext(CompileContext.BlockSequence); - - while (compiler.NextContext == CompileContext.BlockSequence) - { - // block weight - if (reader.PeekLooseToken().Type == R.LeftParen) - { - constantWeights = constantWeights ?? (constantWeights = new List<_>()); - dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); - - var firstToken = reader.ReadLooseToken(); - - // constant weight - if (reader.PeekLooseToken().Type == R.Text) - { - string value = reader.ReadLooseToken().Value; - double doubleValue; - if (!double.TryParse(value, out doubleValue)) - compiler.SyntaxError(reader.PrevLooseToken, false, "err-compiler-invalid-constweight"); - else - constantWeights.Add(new _(blockNumber, doubleValue)); - reader.Read(R.RightParen); - } - // dynamic weight - else - { - var weightActions = new List(); - - Action weightActionCallback = rst => weightActions.Add(rst); - - compiler.SetNextActionCallback(weightActionCallback); - compiler.AddContext(CompileContext.BlockWeight); - yield return Get(); - - if (weightActions.Count == 0) - compiler.SyntaxError(firstToken, false, "err-compiler-empty-weight"); - else - dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); - } - } - - compiler.SetNextActionCallback(itemCallback); - var startToken = reader.PeekToken(); - yield return Get(); - items.Add(new RstSequence(actions, startToken.ToLocation())); - actions.Clear(); - blockNumber++; - } - - compiler.LeaveContext(); - compiler.SetNextActionCallback(actionCallback); - - actionCallback(new RstBlock(blockStartToken.ToLocation(), items, dynamicWeights, constantWeights)); - } - } + internal class BlockParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + var blockStartToken = reader.PrevLooseToken; + var items = new List(); + var actions = new List(); + + // "why are these not lists or arrays" i yell into the void, too lazy to find out why + List<_> constantWeights = null; + List<_> dynamicWeights = null; + int blockNumber = 0; + Action itemCallback = action => actions.Add(action); + + compiler.AddContext(CompileContext.BlockEndSequence); + compiler.AddContext(CompileContext.BlockSequence); + + while (compiler.NextContext == CompileContext.BlockSequence) + { + // block weight + if (reader.PeekLooseToken().Type == R.LeftParen) + { + constantWeights = constantWeights ?? (constantWeights = new List<_>()); + dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); + + var firstToken = reader.ReadLooseToken(); + + // constant weight + if (reader.PeekLooseToken().Type == R.Text) + { + string value = reader.ReadLooseToken().Value; + double doubleValue; + if (!double.TryParse(value, out doubleValue)) + compiler.SyntaxError(reader.PrevLooseToken, false, "err-compiler-invalid-constweight"); + else + constantWeights.Add(new _(blockNumber, doubleValue)); + reader.Read(R.RightParen); + } + // dynamic weight + else + { + var weightActions = new List(); + + Action weightActionCallback = rst => weightActions.Add(rst); + + compiler.SetNextActionCallback(weightActionCallback); + compiler.AddContext(CompileContext.BlockWeight); + yield return Get(); + + if (weightActions.Count == 0) + compiler.SyntaxError(firstToken, false, "err-compiler-empty-weight"); + else + dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); + } + } + + compiler.SetNextActionCallback(itemCallback); + var startToken = reader.PeekToken(); + yield return Get(); + items.Add(new RstSequence(actions, startToken.ToLocation())); + actions.Clear(); + blockNumber++; + } + + compiler.LeaveContext(); + compiler.SetNextActionCallback(actionCallback); + + actionCallback(new RstBlock(blockStartToken.ToLocation(), items, dynamicWeights, constantWeights)); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/Parser.cs b/Rant/Core/Compiler/Parsing/Parser.cs index f0737f5..573d4e1 100644 --- a/Rant/Core/Compiler/Parsing/Parser.cs +++ b/Rant/Core/Compiler/Parsing/Parser.cs @@ -30,19 +30,19 @@ namespace Rant.Core.Compiler.Parsing { - internal abstract class Parser - { - private static readonly Dictionary _parserMap = new Dictionary(); + internal abstract class Parser + { + private static readonly Dictionary _parserMap = new Dictionary(); - public static T Get() where T : Parser - { - Parser parser; - if (!_parserMap.TryGetValue(typeof(T), out parser)) - parser = _parserMap[typeof(T)] = Activator.CreateInstance(typeof(T)) as T; - return parser as T; - } + public static T Get() where T : Parser + { + Parser parser; + if (!_parserMap.TryGetValue(typeof(T), out parser)) + parser = _parserMap[typeof(T)] = Activator.CreateInstance(typeof(T)) as T; + return parser as T; + } - public abstract IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback); - } + public abstract IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback); + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 5fddf4d..d9e3618 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -33,306 +33,302 @@ namespace Rant.Core.Compiler.Parsing { - internal class QueryParser : Parser - { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - var tableName = reader.ReadLoose(R.Text, "acc-table-name"); - var query = new Query(); - query.Name = tableName.Value; - query.Carrier = new Carrier(); - query.Exclusive = reader.TakeLoose(R.Dollar); - bool subtypeRead = false; - bool pluralSubtypeRead = false; - bool complementRead = false; - bool endOfQueryReached = false; + internal class QueryParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + var tableName = reader.ReadLoose(R.Text, "acc-table-name"); + var query = new Query(); + query.Name = tableName.Value; + query.Carrier = new Carrier(); + query.Exclusive = reader.TakeLoose(R.Dollar); + bool subtypeRead = false; + bool pluralSubtypeRead = false; + bool complementRead = false; + bool endOfQueryReached = false; - while (!reader.End && !endOfQueryReached) - { - var token = reader.ReadLooseToken(); + while (!reader.End && !endOfQueryReached) + { + var token = reader.ReadLooseToken(); - switch (token.Type) - { - // read subtype - case R.Period: - if (reader.Take(R.Period)) // Plural subtype - { - if (pluralSubtypeRead) - { - compiler.SyntaxError(token, false, "err-compiler-multiple-pl-subtypes"); - reader.Read(R.Text, "acc-pl-subtype-name"); - break; - } + switch (token.Type) + { + // read subtype + case R.Period: + if (reader.Take(R.Period)) // Plural subtype + { + if (pluralSubtypeRead) + { + compiler.SyntaxError(token, false, "err-compiler-multiple-pl-subtypes"); + reader.Read(R.Text, "acc-pl-subtype-name"); + break; + } - query.PluralSubtype = reader.Read(R.Text, "acc-pl-subtype-name").Value; - pluralSubtypeRead = true; - break; - } - // if there's already a subtype, throw an error and ignore it - if (subtypeRead) - { - compiler.SyntaxError(token, false, "err-compiler-multiple-subtypes"); - reader.Read(R.Text, "acc-subtype-name"); - break; - } - query.Subtype = reader.Read(R.Text, "acc-subtype-name").Value; - subtypeRead = true; - break; - // complement - case R.LeftSquare: - { - if (complementRead) compiler.SyntaxError(token, false, "err-compiler-multiple-complements"); - var seq = new List(); - compiler.AddContext(CompileContext.QueryComplement); - compiler.SetNextActionCallback(seq.Add); - yield return Get(); - compiler.SetNextActionCallback(actionCallback); - query.Complement = new RstSequence(seq, token.ToLocation()); - complementRead = true; - } - break; - // read class filter - case R.Hyphen: - { - var classFilter = new ClassFilter(); - do - { - reader.SkipSpace(); - bool blacklist = false; - // check if it's a blacklist filter - if (reader.PeekType() == R.Exclamation) - { - blacklist = true; - reader.ReadToken(); - } - var classFilterName = reader.Read(R.Text, "acc-class-filter-rule"); - if (classFilterName.Value == null) continue; - var rule = new ClassFilterRule(classFilterName.Value, !blacklist); - classFilter.AddRule(rule); - } while (reader.TakeLoose(R.Pipe)); //fyi: this feature is undocumented + query.PluralSubtype = reader.Read(R.Text, "acc-pl-subtype-name").Value; + pluralSubtypeRead = true; + break; + } + // if there's already a subtype, throw an error and ignore it + if (subtypeRead) + { + compiler.SyntaxError(token, false, "err-compiler-multiple-subtypes"); + reader.Read(R.Text, "acc-subtype-name"); + break; + } + query.Subtype = reader.Read(R.Text, "acc-subtype-name").Value; + subtypeRead = true; + break; + // complement + case R.LeftSquare: + { + if (complementRead) compiler.SyntaxError(token, false, "err-compiler-multiple-complements"); + var seq = new List(); + compiler.AddContext(CompileContext.QueryComplement); + compiler.SetNextActionCallback(seq.Add); + yield return Get(); + compiler.SetNextActionCallback(actionCallback); + query.Complement = new RstSequence(seq, token.ToLocation()); + complementRead = true; + } + break; + // read class filter + case R.Hyphen: + { + var classFilter = new ClassFilter(); + do + { + reader.SkipSpace(); + bool blacklist = false; + // check if it's a blacklist filter + if (reader.PeekType() == R.Exclamation) + { + blacklist = true; + reader.ReadToken(); + } + var classFilterName = reader.Read(R.Text, "acc-class-filter-rule"); + if (classFilterName.Value == null) continue; + var rule = new ClassFilterRule(classFilterName.Value, !blacklist); + classFilter.AddRule(rule); + } while (reader.TakeLoose(R.Pipe)); //fyi: this feature is undocumented - query.AddFilter(classFilter); - break; - } - // read regex filter - case R.Without: - case R.Question: - { - reader.SkipSpace(); - bool blacklist = token.Type == R.Without; + query.AddFilter(classFilter); + break; + } + // read regex filter + case R.Without: + case R.Question: + { + reader.SkipSpace(); + bool blacklist = token.Type == R.Without; - var regexFilter = reader.Read(R.Regex, "regex filter rule"); - var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; - if (reader.IsNext(R.RegexFlags)) - { - var flagsToken = reader.ReadToken(); - foreach (char flag in flagsToken.Value) - switch (flag) - { - case 'i': - options |= RegexOptions.IgnoreCase; - break; - case 'm': - options |= RegexOptions.Multiline; - break; - } - } - if (regexFilter.Value == null) break; - query.AddFilter(new RegexFilter(new Regex(regexFilter.Value, options), !blacklist)); - } - break; + var regexFilter = reader.Read(R.Regex, "regex filter rule"); + var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; + if (reader.IsNext(R.RegexFlags)) + { + var flagsToken = reader.ReadToken(); + foreach (char flag in flagsToken.Value) + { + switch (flag) + { + case 'i': + options |= RegexOptions.IgnoreCase; + break; + case 'm': + options |= RegexOptions.Multiline; + break; + } + } + } + if (regexFilter.Value == null) break; + query.AddFilter(new RegexFilter(new Regex(regexFilter.Value, options), !blacklist)); + } + break; - // read syllable range - case R.LeftParen: - // There are four possible types of values in a syllable range: - // (a), (a-), (-b), (a-b) + // read syllable range + case R.LeftParen: + // There are four possible types of values in a syllable range: + // (a), (a-), (-b), (a-b) - // either (a), (a-), or (a-b) - if (reader.PeekLooseToken().Type == R.Text) - { - var firstNumberToken = reader.ReadLooseToken(); - int firstNumber; - if (!Util.ParseInt(firstNumberToken.Value, out firstNumber)) - compiler.SyntaxError(firstNumberToken, false, "err-compiler-bad-sylrange-value"); + // either (a), (a-), or (a-b) + if (reader.PeekLooseToken().Type == R.Text) + { + var firstNumberToken = reader.ReadLooseToken(); + int firstNumber; + if (!Util.ParseInt(firstNumberToken.Value, out firstNumber)) + compiler.SyntaxError(firstNumberToken, false, "err-compiler-bad-sylrange-value"); - // (a-) or (a-b) - if (reader.PeekLooseToken().Type == R.Hyphen) - { - reader.ReadLooseToken(); - // (a-b) - if (reader.PeekLooseToken().Type == R.Text) - { - var secondNumberToken = reader.ReadLooseToken(); - int secondNumber; - if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) - compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); + // (a-) or (a-b) + if (reader.PeekLooseToken().Type == R.Hyphen) + { + reader.ReadLooseToken(); + // (a-b) + if (reader.PeekLooseToken().Type == R.Text) + { + var secondNumberToken = reader.ReadLooseToken(); + int secondNumber; + if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); - query.AddFilter(new RangeFilter(firstNumber, secondNumber)); - } - // (a-) - else - { - query.AddFilter(new RangeFilter(firstNumber, null)); - } - } - // (a) - else - { - query.AddFilter(new RangeFilter(firstNumber, firstNumber)); - } - } - // (-b) - else if (reader.PeekLooseToken().Type == R.Hyphen) - { - reader.ReadLooseToken(); - var secondNumberToken = reader.ReadLoose(R.Text, "acc-syllable-range-value"); - int secondNumber; - if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) - compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); - query.AddFilter(new RangeFilter(null, secondNumber)); - } - // () - else if (reader.PeekLooseToken().Type == R.RightParen) - { - compiler.SyntaxError(token, false, "err-compiler-empty-sylrange"); - } - // (something else) - else - { - var errorToken = reader.ReadLooseToken(); - compiler.SyntaxError(errorToken, false, "err-compiler-unknown-sylrange-token", errorToken.Value); - reader.TakeAllWhile(t => !reader.IsNext(R.RightParen)); - } + query.AddFilter(new RangeFilter(firstNumber, secondNumber)); + } + // (a-) + else + query.AddFilter(new RangeFilter(firstNumber, null)); + } + // (a) + else + query.AddFilter(new RangeFilter(firstNumber, firstNumber)); + } + // (-b) + else if (reader.PeekLooseToken().Type == R.Hyphen) + { + reader.ReadLooseToken(); + var secondNumberToken = reader.ReadLoose(R.Text, "acc-syllable-range-value"); + int secondNumber; + if (!Util.ParseInt(secondNumberToken.Value, out secondNumber)) + compiler.SyntaxError(secondNumberToken, false, "err-compiler-bad-sylrange-value"); + query.AddFilter(new RangeFilter(null, secondNumber)); + } + // () + else if (reader.PeekLooseToken().Type == R.RightParen) + compiler.SyntaxError(token, false, "err-compiler-empty-sylrange"); + // (something else) + else + { + var errorToken = reader.ReadLooseToken(); + compiler.SyntaxError(errorToken, false, "err-compiler-unknown-sylrange-token", errorToken.Value); + reader.TakeAllWhile(t => !reader.IsNext(R.RightParen)); + } - reader.ReadLoose(R.RightParen); - break; + reader.ReadLoose(R.RightParen); + break; - // read carriers - case R.DoubleColon: - ReadCarriers(reader, query.Carrier, compiler); - // this should be the last part of the query, so go to the end - endOfQueryReached = true; - break; + // read carriers + case R.DoubleColon: + ReadCarriers(reader, query.Carrier, compiler); + // this should be the last part of the query, so go to the end + endOfQueryReached = true; + break; - // end of query - case R.RightAngle: - endOfQueryReached = true; - break; + // end of query + case R.RightAngle: + endOfQueryReached = true; + break; - case R.Whitespace: - break; + case R.Whitespace: + break; - default: - compiler.SyntaxError(token, false, "err-compiler-unexpected-token"); - break; - } - } + default: + compiler.SyntaxError(token, false, "err-compiler-unexpected-token"); + break; + } + } - if (!endOfQueryReached) - compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); + if (!endOfQueryReached) + compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); - if (tableName.Value != null) - actionCallback(new RstQuery(query, tableName.ToLocation())); - } + if (tableName.Value != null) + actionCallback(new RstQuery(query, tableName.ToLocation())); + } - private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler compiler) - { - while (!reader.End) - { - var token = reader.ReadLooseToken(); + private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler compiler) + { + while (!reader.End) + { + var token = reader.ReadLooseToken(); - switch (token.Type) - { - // match carrier - case R.Equal: - { - var name = reader.Read(R.Text, "acc-carrier-name"); - if (name.Value != null) - carrier.AddComponent(CarrierComponentType.Match, name.Value); - } - break; + switch (token.Type) + { + // match carrier + case R.Equal: + { + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name.Value != null) + carrier.AddComponent(CarrierComponentType.Match, name.Value); + } + break; - // associative and match associative, - // disassociative and match disassociative - // divergent and match-divergent - // relational and match-relational - case R.At: - { - var carrierType = CarrierComponentType.Associative; - // disassociative - if (reader.PeekToken().Type == R.Exclamation) - { - carrierType = CarrierComponentType.Dissociative; - reader.ReadToken(); - } - // divergent - else if (reader.PeekToken().Type == R.Plus) - { - carrierType = CarrierComponentType.Divergent; - reader.ReadToken(); - } - else if (reader.PeekToken().Type == R.Question) - { - carrierType = CarrierComponentType.Relational; - reader.ReadToken(); - } + // associative and match associative, + // disassociative and match disassociative + // divergent and match-divergent + // relational and match-relational + case R.At: + { + var carrierType = CarrierComponentType.Associative; + // disassociative + if (reader.PeekToken().Type == R.Exclamation) + { + carrierType = CarrierComponentType.Dissociative; + reader.ReadToken(); + } + // divergent + else if (reader.PeekToken().Type == R.Plus) + { + carrierType = CarrierComponentType.Divergent; + reader.ReadToken(); + } + else if (reader.PeekToken().Type == R.Question) + { + carrierType = CarrierComponentType.Relational; + reader.ReadToken(); + } - // match - if (reader.PeekToken().Type == R.Equal) - { - if (carrierType == CarrierComponentType.Associative) - carrierType = CarrierComponentType.MatchAssociative; - else if (carrierType == CarrierComponentType.Dissociative) - carrierType = CarrierComponentType.MatchDissociative; - else if (carrierType == CarrierComponentType.Divergent) - carrierType = CarrierComponentType.MatchDivergent; - else if (carrierType == CarrierComponentType.Relational) - carrierType = CarrierComponentType.MatchRelational; - reader.ReadToken(); - } + // match + if (reader.PeekToken().Type == R.Equal) + { + if (carrierType == CarrierComponentType.Associative) + carrierType = CarrierComponentType.MatchAssociative; + else if (carrierType == CarrierComponentType.Dissociative) + carrierType = CarrierComponentType.MatchDissociative; + else if (carrierType == CarrierComponentType.Divergent) + carrierType = CarrierComponentType.MatchDivergent; + else if (carrierType == CarrierComponentType.Relational) + carrierType = CarrierComponentType.MatchRelational; + reader.ReadToken(); + } - var name = reader.Read(R.Text, "acc-carrier-name"); - if (name.Value != null) - carrier.AddComponent(carrierType, name.Value); - } - break; + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name.Value != null) + carrier.AddComponent(carrierType, name.Value); + } + break; - // unique and match unique - case R.Exclamation: - { - var carrierType = CarrierComponentType.Unique; - // match unique - if (reader.PeekToken().Type == R.Equal) - { - carrierType = CarrierComponentType.MatchUnique; - reader.ReadToken(); - } + // unique and match unique + case R.Exclamation: + { + var carrierType = CarrierComponentType.Unique; + // match unique + if (reader.PeekToken().Type == R.Equal) + { + carrierType = CarrierComponentType.MatchUnique; + reader.ReadToken(); + } - var name = reader.Read(R.Text, "acc-carrier-name"); - if (name.Value != null) - carrier.AddComponent(carrierType, name.Value); - } - break; + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name.Value != null) + carrier.AddComponent(carrierType, name.Value); + } + break; - // rhyming - case R.Ampersand: - { - var name = reader.Read(R.Text, "acc-carrier-name"); - if (name.Value != null) - carrier.AddComponent(CarrierComponentType.Rhyme, name.Value); - } - break; + // rhyming + case R.Ampersand: + { + var name = reader.Read(R.Text, "acc-carrier-name"); + if (name.Value != null) + carrier.AddComponent(CarrierComponentType.Rhyme, name.Value); + } + break; - // we're done, go away - case R.RightAngle: - return; + // we're done, go away + case R.RightAngle: + return; - default: - compiler.SyntaxError(token, false, "err-compiler-unexpected-token"); - break; - } - } - } - } + default: + compiler.SyntaxError(token, false, "err-compiler-unexpected-token"); + break; + } + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 62b8c60..9c96a78 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -31,199 +31,199 @@ namespace Rant.Core.Compiler.Parsing { - internal class SequenceParser : Parser - { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - Token token; - - while (!reader.End) - { - token = reader.ReadToken(); - - switch (token.Type) - { - case R.LeftAngle: - yield return Get(); - break; - - case R.LeftSquare: - yield return Get(); - break; - - case R.LeftCurly: - reader.SkipSpace(); - yield return Get(); - break; - - case R.Pipe: - if (context == CompileContext.BlockSequence) - yield break; - goto default; // Print it if we're not in a block - - case R.RightCurly: - if (context == CompileContext.BlockSequence) - { - compiler.LeaveContext(); - yield break; - } - compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); - break; - - // end of argument - case R.Semicolon: - if (context == CompileContext.ArgumentSequence) - yield break; - // this is probably just a semicolon in text - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - - case R.RightSquare: - // end of arguments / direct object in query - switch (context) - { - case CompileContext.ArgumentSequence: - case CompileContext.SubroutineBody: - case CompileContext.QueryComplement: - compiler.LeaveContext(); - yield break; - } - compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); - break; - - case R.RightAngle: - compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); - break; - - // the end of a block weight, maybe - case R.RightParen: - if (context == CompileContext.BlockWeight) - { - reader.SkipSpace(); - compiler.LeaveContext(); - yield break; - } - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - - case R.Whitespace: - switch (context) - { - case CompileContext.BlockSequence: - switch (reader.PeekType()) - { - case R.Pipe: - case R.RightCurly: - continue; // Ignore whitespace at the end of block elements - } - goto default; - default: - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - } - break; - - case R.EscapeSequenceChar: // Handle escape sequences - actionCallback(new RstEscape(token.ToLocation(), 1, false, token.Value[0])); - break; - case R.EscapeSequenceUnicode: - { - short codePoint; - if (!short.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), 1, true, Convert.ToChar(codePoint))); - break; - } - case R.EscapeSequenceSurrogatePair: - { - uint surrogatePairCodePoint; - if (!uint.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) - || surrogatePairCodePoint < 0x10000) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); - break; - } - - surrogatePairCodePoint -= 0x10000; - ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); - ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x003FF)); - char low, high; - if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), 1, true, high, low)); - break; - } - case R.EscapeSequenceQuantifier: - { - int quantity; - if (!int.TryParse(token.Value, out quantity) || quantity <= 0) - { - compiler.SyntaxError(token, false, "err-compiler-escape-bad-quantity"); - break; - } - switch (reader.PeekType()) - { - case R.EscapeSequenceChar: - actionCallback(new RstEscape(token.ToLocation(), quantity, false, reader.ReadToken().Value[0])); - break; - case R.EscapeSequenceUnicode: - { - short codePoint; - if (!short.TryParse(reader.ReadToken().Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), quantity, true, Convert.ToChar(codePoint))); - break; - } - case R.EscapeSequenceSurrogatePair: - { - var pairToken = reader.ReadToken(); - uint surrogatePairCodePoint; - if (!uint.TryParse(pairToken.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) - || surrogatePairCodePoint < 0x10000) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); - break; - } - - surrogatePairCodePoint -= 0x10000; - ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); - ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x3FF)); - char low, high; - if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), quantity, true, high, low)); - break; - } - } - break; - } - - case R.EOF: - if (context != CompileContext.DefaultSequence) - compiler.SyntaxError(token, true, "err-compiler-eof"); - yield break; - - default: // Handle text - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - } - } - - if (reader.End && context != CompileContext.DefaultSequence) - compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); - } - } + internal class SequenceParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + Token token; + + while (!reader.End) + { + token = reader.ReadToken(); + + switch (token.Type) + { + case R.LeftAngle: + yield return Get(); + break; + + case R.LeftSquare: + yield return Get(); + break; + + case R.LeftCurly: + reader.SkipSpace(); + yield return Get(); + break; + + case R.Pipe: + if (context == CompileContext.BlockSequence) + yield break; + goto default; // Print it if we're not in a block + + case R.RightCurly: + if (context == CompileContext.BlockSequence) + { + compiler.LeaveContext(); + yield break; + } + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); + break; + + // end of argument + case R.Semicolon: + if (context == CompileContext.ArgumentSequence) + yield break; + // this is probably just a semicolon in text + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + + case R.RightSquare: + // end of arguments / direct object in query + switch (context) + { + case CompileContext.ArgumentSequence: + case CompileContext.SubroutineBody: + case CompileContext.QueryComplement: + compiler.LeaveContext(); + yield break; + } + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); + break; + + case R.RightAngle: + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); + break; + + // the end of a block weight, maybe + case R.RightParen: + if (context == CompileContext.BlockWeight) + { + reader.SkipSpace(); + compiler.LeaveContext(); + yield break; + } + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + + case R.Whitespace: + switch (context) + { + case CompileContext.BlockSequence: + switch (reader.PeekType()) + { + case R.Pipe: + case R.RightCurly: + continue; // Ignore whitespace at the end of block elements + } + goto default; + default: + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + } + break; + + case R.EscapeSequenceChar: // Handle escape sequences + actionCallback(new RstEscape(token.ToLocation(), 1, false, token.Value[0])); + break; + case R.EscapeSequenceUnicode: + { + short codePoint; + if (!short.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), 1, true, Convert.ToChar(codePoint))); + break; + } + case R.EscapeSequenceSurrogatePair: + { + uint surrogatePairCodePoint; + if (!uint.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) + || surrogatePairCodePoint < 0x10000) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); + break; + } + + surrogatePairCodePoint -= 0x10000; + ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); + ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x003FF)); + char low, high; + if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), 1, true, high, low)); + break; + } + case R.EscapeSequenceQuantifier: + { + int quantity; + if (!int.TryParse(token.Value, out quantity) || quantity <= 0) + { + compiler.SyntaxError(token, false, "err-compiler-escape-bad-quantity"); + break; + } + switch (reader.PeekType()) + { + case R.EscapeSequenceChar: + actionCallback(new RstEscape(token.ToLocation(), quantity, false, reader.ReadToken().Value[0])); + break; + case R.EscapeSequenceUnicode: + { + short codePoint; + if (!short.TryParse(reader.ReadToken().Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), quantity, true, Convert.ToChar(codePoint))); + break; + } + case R.EscapeSequenceSurrogatePair: + { + var pairToken = reader.ReadToken(); + uint surrogatePairCodePoint; + if (!uint.TryParse(pairToken.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) + || surrogatePairCodePoint < 0x10000) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); + break; + } + + surrogatePairCodePoint -= 0x10000; + ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); + ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x3FF)); + char low, high; + if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), quantity, true, high, low)); + break; + } + } + break; + } + + case R.EOF: + if (context != CompileContext.DefaultSequence) + compiler.SyntaxError(token, true, "err-compiler-eof"); + yield break; + + default: // Handle text + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + } + } + + if (reader.End && context != CompileContext.DefaultSequence) + compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index df20d01..bcc56a5 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -32,218 +32,216 @@ namespace Rant.Core.Compiler.Parsing { - internal class TagParser : Parser - { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - var nextType = reader.PeekType(); - - var tagStart = reader.PrevToken; - - // replacer - switch (nextType) - { - case R.Regex: - { - var regex = reader.Read(R.Regex, "acc-replacer-regex"); - var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; - if (reader.IsNext(R.RegexFlags)) - { - var flagsToken = reader.ReadToken(); - foreach (char flag in flagsToken.Value) - switch (flag) - { - case 'i': - options |= RegexOptions.IgnoreCase; - break; - case 'm': - options |= RegexOptions.Multiline; - break; - } - } - - reader.Read(R.Colon); - - var arguments = new List(); - - var iterator = ReadArguments(compiler, reader, arguments); - while (iterator.MoveNext()) - yield return iterator.Current; - - compiler.SetNextActionCallback(actionCallback); - - if (arguments.Count != 2) - { - compiler.SyntaxError(tagStart, reader.PrevToken, false, "err-compiler-replacer-argcount"); - yield break; - } - - actionCallback(new RstReplacer(regex.ToLocation(), new Regex(regex.Value, options), arguments[0], arguments[1])); - } - break; - case R.Dollar: - { - reader.ReadToken(); - var e = ParseSubroutine(compiler, context, reader, actionCallback); - while (e.MoveNext()) - yield return e.Current; - } - break; - default: - { - var e = ParseFunction(compiler, context, reader, actionCallback); - while (e.MoveNext()) - yield return e.Current; - } - break; - } - } - - private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - var functionName = reader.Read(R.Text, "acc-function-name"); - - var arguments = new List(); - - if (reader.PeekType() == R.Colon) - { - reader.ReadToken(); - - var iterator = ReadArguments(compiler, reader, arguments); - while (iterator.MoveNext()) - yield return iterator.Current; - - compiler.SetNextActionCallback(actionCallback); - } - else - { - reader.Read(R.RightSquare); - } - - RantFunctionSignature sig = null; - - if (functionName.Value != null) - { - if (!RantFunctionRegistry.FunctionExists(functionName.Value)) - { - compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-function", functionName.Value); - yield break; - } - - if ((sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count)) == null) - { - compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-overload", functionName.Value, arguments.Count); - yield break; - } - - actionCallback(new RstFunction(functionName.ToLocation(), sig, arguments)); - } - } - - private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - // subroutine definition - if (reader.TakeLoose(R.LeftSquare, false)) - { - bool inModule = false; - - if (reader.TakeLoose(R.Period)) - { - inModule = true; - compiler.HasModule = true; - } - var subroutineName = reader.ReadLoose(R.Text, "acc-subroutine-name"); - var subroutine = new RstDefineSubroutine(subroutineName.ToLocation()) - { - Parameters = new Dictionary(), - Name = subroutineName.Value - }; - - if (reader.PeekLooseToken().Type == R.Colon) - { - reader.ReadLooseToken(); - - do - { - var type = SubroutineParameterType.Greedy; - if (reader.TakeLoose(R.At)) - type = SubroutineParameterType.Loose; - - subroutine.Parameters[reader.ReadLoose(R.Text, "argument name").Value] = type; - } while (reader.TakeLoose(R.Semicolon, false)); - } - - reader.ReadLoose(R.RightSquare); - - var bodyStart = reader.ReadLoose(R.Colon); - - var actions = new List(); - Action bodyActionCallback = action => actions.Add(action); - - compiler.AddContext(CompileContext.SubroutineBody); - compiler.SetNextActionCallback(bodyActionCallback); - yield return Get(); - compiler.SetNextActionCallback(actionCallback); - - subroutine.Body = new RstSequence(actions, bodyStart.ToLocation()); - if (inModule) - compiler.Module.AddActionFunction(subroutineName.Value, subroutine); - actionCallback(subroutine); - } - else - { - // subroutine call - var subroutineName = reader.Read(R.Text, "acc-subroutine-name"); - string moduleFunctionName = null; - - if (reader.TakeLoose(R.Period, false)) - moduleFunctionName = reader.Read(R.Text, "module function name").Value; - - var arguments = new List(); - - if (reader.PeekType() == R.Colon) - { - reader.ReadToken(); - - var iterator = ReadArguments(compiler, reader, arguments); - while (iterator.MoveNext()) - yield return iterator.Current; - - compiler.SetNextActionCallback(actionCallback); - } - else - { - reader.Read(R.RightSquare); - } - - var subroutine = new RstCallSubroutine(subroutineName.Value, subroutineName.ToLocation(), moduleFunctionName) { Arguments = arguments }; - - actionCallback(subroutine); - } - } - - private IEnumerator ReadArguments(RantCompiler compiler, TokenReader reader, List arguments) - { - var actions = new List(); - - Action argActionCallback = action => actions.Add(action); - compiler.SetNextActionCallback(argActionCallback); - compiler.AddContext(CompileContext.FunctionEndContext); - compiler.AddContext(CompileContext.ArgumentSequence); - - while (compiler.NextContext == CompileContext.ArgumentSequence) - { - reader.SkipSpace(); - var startToken = reader.PeekToken(); - yield return Get(); - arguments.Add(new RstSequence(actions, startToken.ToLocation())); - actions.Clear(); - } - - compiler.LeaveContext(); - } - } + internal class TagParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + var nextType = reader.PeekType(); + + var tagStart = reader.PrevToken; + + // replacer + switch (nextType) + { + case R.Regex: + { + var regex = reader.Read(R.Regex, "acc-replacer-regex"); + var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; + if (reader.IsNext(R.RegexFlags)) + { + var flagsToken = reader.ReadToken(); + foreach (char flag in flagsToken.Value) + { + switch (flag) + { + case 'i': + options |= RegexOptions.IgnoreCase; + break; + case 'm': + options |= RegexOptions.Multiline; + break; + } + } + } + + reader.Read(R.Colon); + + var arguments = new List(); + + var iterator = ReadArguments(compiler, reader, arguments); + while (iterator.MoveNext()) + yield return iterator.Current; + + compiler.SetNextActionCallback(actionCallback); + + if (arguments.Count != 2) + { + compiler.SyntaxError(tagStart, reader.PrevToken, false, "err-compiler-replacer-argcount"); + yield break; + } + + actionCallback(new RstReplacer(regex.ToLocation(), new Regex(regex.Value, options), arguments[0], arguments[1])); + } + break; + case R.Dollar: + { + reader.ReadToken(); + var e = ParseSubroutine(compiler, context, reader, actionCallback); + while (e.MoveNext()) + yield return e.Current; + } + break; + default: + { + var e = ParseFunction(compiler, context, reader, actionCallback); + while (e.MoveNext()) + yield return e.Current; + } + break; + } + } + + private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + var functionName = reader.Read(R.Text, "acc-function-name"); + + var arguments = new List(); + + if (reader.PeekType() == R.Colon) + { + reader.ReadToken(); + + var iterator = ReadArguments(compiler, reader, arguments); + while (iterator.MoveNext()) + yield return iterator.Current; + + compiler.SetNextActionCallback(actionCallback); + } + else + reader.Read(R.RightSquare); + + RantFunctionSignature sig = null; + + if (functionName.Value != null) + { + if (!RantFunctionRegistry.FunctionExists(functionName.Value)) + { + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-function", functionName.Value); + yield break; + } + + if ((sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count)) == null) + { + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-overload", functionName.Value, arguments.Count); + yield break; + } + + actionCallback(new RstFunction(functionName.ToLocation(), sig, arguments)); + } + } + + private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + // subroutine definition + if (reader.TakeLoose(R.LeftSquare, false)) + { + bool inModule = false; + + if (reader.TakeLoose(R.Period)) + { + inModule = true; + compiler.HasModule = true; + } + var subroutineName = reader.ReadLoose(R.Text, "acc-subroutine-name"); + var subroutine = new RstDefineSubroutine(subroutineName.ToLocation()) + { + Parameters = new Dictionary(), + Name = subroutineName.Value + }; + + if (reader.PeekLooseToken().Type == R.Colon) + { + reader.ReadLooseToken(); + + do + { + var type = SubroutineParameterType.Greedy; + if (reader.TakeLoose(R.At)) + type = SubroutineParameterType.Loose; + + subroutine.Parameters[reader.ReadLoose(R.Text, "argument name").Value] = type; + } while (reader.TakeLoose(R.Semicolon, false)); + } + + reader.ReadLoose(R.RightSquare); + + var bodyStart = reader.ReadLoose(R.Colon); + + var actions = new List(); + Action bodyActionCallback = action => actions.Add(action); + + compiler.AddContext(CompileContext.SubroutineBody); + compiler.SetNextActionCallback(bodyActionCallback); + yield return Get(); + compiler.SetNextActionCallback(actionCallback); + + subroutine.Body = new RstSequence(actions, bodyStart.ToLocation()); + if (inModule) + compiler.Module.AddActionFunction(subroutineName.Value, subroutine); + actionCallback(subroutine); + } + else + { + // subroutine call + var subroutineName = reader.Read(R.Text, "acc-subroutine-name"); + string moduleFunctionName = null; + + if (reader.TakeLoose(R.Period, false)) + moduleFunctionName = reader.Read(R.Text, "module function name").Value; + + var arguments = new List(); + + if (reader.PeekType() == R.Colon) + { + reader.ReadToken(); + + var iterator = ReadArguments(compiler, reader, arguments); + while (iterator.MoveNext()) + yield return iterator.Current; + + compiler.SetNextActionCallback(actionCallback); + } + else + reader.Read(R.RightSquare); + + var subroutine = new RstCallSubroutine(subroutineName.Value, subroutineName.ToLocation(), moduleFunctionName) { Arguments = arguments }; + + actionCallback(subroutine); + } + } + + private IEnumerator ReadArguments(RantCompiler compiler, TokenReader reader, List arguments) + { + var actions = new List(); + + Action argActionCallback = action => actions.Add(action); + compiler.SetNextActionCallback(argActionCallback); + compiler.AddContext(CompileContext.FunctionEndContext); + compiler.AddContext(CompileContext.ArgumentSequence); + + while (compiler.NextContext == CompileContext.ArgumentSequence) + { + reader.SkipSpace(); + var startToken = reader.PeekToken(); + yield return Get(); + arguments.Add(new RstSequence(actions, startToken.ToLocation())); + actions.Clear(); + } + + compiler.LeaveContext(); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/R.cs b/Rant/Core/Compiler/R.cs index 326ee89..8b98459 100644 --- a/Rant/Core/Compiler/R.cs +++ b/Rant/Core/Compiler/R.cs @@ -25,78 +25,78 @@ namespace Rant.Core.Compiler { - internal enum R - { - Text, + internal enum R + { + Text, - EscapeSequenceChar, + EscapeSequenceChar, - EscapeSequenceQuantifier, + EscapeSequenceQuantifier, - EscapeSequenceUnicode, + EscapeSequenceUnicode, - EscapeSequenceSurrogatePair, + EscapeSequenceSurrogatePair, - LeftSquare, + LeftSquare, - RightSquare, + RightSquare, - LeftCurly, + LeftCurly, - RightCurly, + RightCurly, - LeftAngle, + LeftAngle, - RightAngle, + RightAngle, - LeftParen, + LeftParen, - RightParen, + RightParen, - Pipe, + Pipe, - Colon, + Colon, - Semicolon, + Semicolon, - DoubleColon, + DoubleColon, - At, + At, - Question, + Question, - ForwardSlash, + ForwardSlash, - Exclamation, + Exclamation, - Dollar, + Dollar, - Hyphen, + Hyphen, - Comma, + Comma, - Without, + Without, - Regex, + Regex, - RegexFlags, + RegexFlags, - VerbatimString, + VerbatimString, - Whitespace, + Whitespace, - Equal, + Equal, - Ampersand, + Ampersand, - Caret, + Caret, - Plus, + Plus, - Number, + Number, - Period, + Period, - EOF - } + EOF + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index d9c787f..2c427a5 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -34,103 +34,103 @@ namespace Rant.Core.Compiler { - internal class RantCompiler - { - private readonly Stack _contextStack = new Stack(); - private readonly TokenReader _reader; - private readonly string _sourceName; - internal readonly RantModule Module; - private List _errors; - private Action _nextActionCallback = null; - // private List _warnings; - internal bool HasModule = false; - - public RantCompiler(string sourceName, string source) - { - Module = new RantModule(sourceName); - - _sourceName = sourceName; - Source = source; - _reader = new TokenReader(sourceName, RantLexer.Lex(this, source), this); - } - - internal CompileContext NextContext => _contextStack.Peek(); - public string Source { get; } - public void AddContext(CompileContext context) => _contextStack.Push(context); - public void LeaveContext() => _contextStack.Pop(); - public void SetNextActionCallback(Action callback) => _nextActionCallback = callback; - - public RST Compile() - { - try - { - var parser = Parser.Get(); - var stack = new Stack>(); - var actionList = new List(); - _contextStack.Push(CompileContext.DefaultSequence); - - _nextActionCallback = a => actionList.Add(a); - - stack.Push(parser.Parse(this, NextContext, _reader, _nextActionCallback)); - - top: - while (stack.Count > 0) - { - var p = stack.Peek(); - - while (p.MoveNext()) - { - if (p.Current == null) continue; - - stack.Push(p.Current.Parse(this, NextContext, _reader, _nextActionCallback)); - goto top; - } - - stack.Pop(); - } - - if (_errors?.Count > 0) - throw new RantCompilerException(_sourceName, _errors); - - return new RstSequence(actionList, _reader.BaseLocation); - } - catch (RantCompilerException) - { - throw; - } + internal class RantCompiler + { + private readonly Stack _contextStack = new Stack(); + private readonly TokenReader _reader; + private readonly string _sourceName; + internal readonly RantModule Module; + private List _errors; + private Action _nextActionCallback = null; + // private List _warnings; + internal bool HasModule = false; + + public RantCompiler(string sourceName, string source) + { + Module = new RantModule(sourceName); + + _sourceName = sourceName; + Source = source; + _reader = new TokenReader(sourceName, RantLexer.Lex(this, source), this); + } + + internal CompileContext NextContext => _contextStack.Peek(); + public string Source { get; } + public void AddContext(CompileContext context) => _contextStack.Push(context); + public void LeaveContext() => _contextStack.Pop(); + public void SetNextActionCallback(Action callback) => _nextActionCallback = callback; + + public RST Compile() + { + try + { + var parser = Parser.Get(); + var stack = new Stack>(); + var actionList = new List(); + _contextStack.Push(CompileContext.DefaultSequence); + + _nextActionCallback = a => actionList.Add(a); + + stack.Push(parser.Parse(this, NextContext, _reader, _nextActionCallback)); + + top: + while (stack.Count > 0) + { + var p = stack.Peek(); + + while (p.MoveNext()) + { + if (p.Current == null) continue; + + stack.Push(p.Current.Parse(this, NextContext, _reader, _nextActionCallback)); + goto top; + } + + stack.Pop(); + } + + if (_errors?.Count > 0) + throw new RantCompilerException(_sourceName, _errors); + + return new RstSequence(actionList, _reader.BaseLocation); + } + catch (RantCompilerException) + { + throw; + } #if !DEBUG - catch (Exception ex) - { - throw new RantCompilerException(_sourceName, _errors, ex); - } + catch (Exception ex) + { + throw new RantCompilerException(_sourceName, _errors, ex); + } #endif - } - - public void SyntaxError(Token token, bool fatal, string errorMessageType, params object[] errorMessageArgs) - { - (_errors ?? (_errors = new List())) - .Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, - GetString(errorMessageType, errorMessageArgs), - token.Line, token.Column, token.Index, token.Value?.Length ?? 0)); - if (fatal) throw new RantCompilerException(_sourceName, _errors); - } - - public void SyntaxError(int line, int lastLineStart, int index, int length, bool fatal, string errorMessageType, params object[] errorMessageArgs) - { - (_errors ?? (_errors = new List())) - .Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, - GetString(errorMessageType, errorMessageArgs), - line, index - lastLineStart + 1, index, length)); - if (fatal) throw new RantCompilerException(_sourceName, _errors); - } - - public void SyntaxError(Token start, Token end, bool fatal, string errorMessageType, params object[] errorMessageArgs) - { - (_errors ?? (_errors = new List())) - .Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, - GetString(errorMessageType, errorMessageArgs), - start.Line, start.Column, start.Index, end.Index - start.Index + end.Length)); - if (fatal) throw new RantCompilerException(_sourceName, _errors); - } - } + } + + public void SyntaxError(Token token, bool fatal, string errorMessageType, params object[] errorMessageArgs) + { + (_errors ?? (_errors = new List())) + .Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, + GetString(errorMessageType, errorMessageArgs), + token.Line, token.Column, token.Index, token.Value?.Length ?? 0)); + if (fatal) throw new RantCompilerException(_sourceName, _errors); + } + + public void SyntaxError(int line, int lastLineStart, int index, int length, bool fatal, string errorMessageType, params object[] errorMessageArgs) + { + (_errors ?? (_errors = new List())) + .Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, + GetString(errorMessageType, errorMessageArgs), + line, index - lastLineStart + 1, index, length)); + if (fatal) throw new RantCompilerException(_sourceName, _errors); + } + + public void SyntaxError(Token start, Token end, bool fatal, string errorMessageType, params object[] errorMessageArgs) + { + (_errors ?? (_errors = new List())) + .Add(new RantCompilerMessage(RantCompilerMessageType.Error, _sourceName, + GetString(errorMessageType, errorMessageArgs), + start.Line, start.Column, start.Index, end.Index - start.Index + end.Length)); + if (fatal) throw new RantCompilerException(_sourceName, _errors); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/RantLexer.cs b/Rant/Core/Compiler/RantLexer.cs index 5d56220..8cb5e48 100644 --- a/Rant/Core/Compiler/RantLexer.cs +++ b/Rant/Core/Compiler/RantLexer.cs @@ -30,540 +30,538 @@ namespace Rant.Core.Compiler { - internal static class RantLexer - { - public static string GetSymbolForType(R type) - { - switch (type) - { - case R.Ampersand: - return "&"; - case R.At: - return "@"; - case R.Caret: - return "^"; - case R.Colon: - return ":"; - case R.Comma: - return ","; - case R.Dollar: - return "$"; - case R.DoubleColon: - return "::"; - case R.Equal: - return "="; - case R.Exclamation: - return "!"; - case R.Hyphen: - return "-"; - case R.LeftParen: - return "("; - case R.RightParen: - return ")"; - case R.LeftSquare: - return "["; - case R.RightSquare: - return "]"; - case R.LeftCurly: - return "{"; - case R.RightCurly: - return "}"; - case R.LeftAngle: - return "<"; - case R.RightAngle: - return ">"; - case R.Semicolon: - return ";"; - case R.Question: - return "?"; - case R.Period: - return "."; - case R.Without: - return "?!"; - case R.Plus: - return "+"; - case R.VerbatimString: - return "\"...\""; - default: - return ""; - } - } - - public static IEnumerable Lex(RantCompiler compiler, string input) - { - if (Util.IsNullOrWhiteSpace(input)) yield break; - - int line = 1; // Pretty self-explanatory - int i = 0; // The iterator index - int len = input.Length; // The length of the input string - int li = len - 1; // The last character index available in the input string, precalculated for your pleasure - char c; // Currently scanned character - bool lineStart = true; // Indicates if all characters so far on this line have been whitespace - int lastLineStart = 0; // Index of last line start. Use to calculate columns lazily. - var text = new StringBuilder(64); // Buffer for text token content - var whitespace = new StringBuilder(16); // Buffer for whitespace - bool cycleWroteText = false; // Determines if the last loop cycle wrote to the text buffer - int lastTextIndex = 0; // The last initial character index recorded for the text buffer - int lastTextLine = 1; // The last initial line number recorded for the text buffer - int lastTextLineStart = 0; // The last initial line start character index recorded for the text buffer - - while (i < len) - { - // No text was written on this cycle yet, so set this to false - cycleWroteText = false; - - // Set the current scanned character - c = input[i]; - - // If a newline is detected, update all line state variables - if (c == '\n') - { - line++; - lastLineStart = i + 1; - lineStart = true; - whitespace.Length = 0; - goto iterate; - } - - // Skip carriage returns too - if (c == '\r') goto iterate; - - // If whitespace, capture it all before moving on - if (char.IsWhiteSpace(c)) - { - if (!lineStart) whitespace.Append(input[i]); - goto iterate; - } - - // At this point, a non-whitespace character has been read. - - // Emit whitespace if queued - if (whitespace.Length > 0) - { - // If it's a line breaking character, a comment, or at the start of a line, skip it. - if (!lineStart && c != '#') - yield return new Token(R.Whitespace, line, lastLineStart, i, whitespace.ToString()); - whitespace.Length = 0; - } - - lineStart = false; - - switch (c) - { - // Comment - case '#': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - // Just eat the line and ignore it - while (i < len && input[i] != '\n') i++; - goto iterate; - - // Escape sequence - case '\\': - { - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - if (i == li) - { - // This is the last character! Blasphemy! - compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-incomplete-escape"); - yield break; - } - - // At this point we know there's at least one character. Great! - - int escStart = i++; // Skip the slash - - // No escaping whitespace. - if (char.IsWhiteSpace(input[i])) - { - compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-incomplete-escape"); - break; - } - - // There's a quantifier here. - if (char.IsDigit(input[i])) - { - int qStart = i++; // Skip past the digit - while (i < len && char.IsDigit(input[i])) i++; - if (i >= li) - { - compiler.SyntaxError(line, lastLineStart, escStart, i - escStart, false, "err-compiler-incomplete-escape"); - break; - } - // We need a comma after a quantifier - if (input[i] != ',') - { - compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-missing-quantity-comma"); - break; - } - yield return new Token(R.EscapeSequenceQuantifier, line, lastLineStart, qStart, input.Substring(qStart, i - qStart)); - i++; // Skip past the comma - } - - // At this point we need to make sure that there are more characters - if (i >= len) - { - compiler.SyntaxError(line, lastLineStart, escStart, i - escStart, false, "err-compiler-incomplete-escape"); - break; - } - - switch (input[i]) - { - case 'u': // Unicode code point - // This will require 4 characters - if (len - ++i < 4) - { - compiler.SyntaxError(line, lastLineStart, escStart, len - escStart, false, "err-compiler-incomplete-escape"); - yield break; - } - yield return new Token(R.EscapeSequenceUnicode, line, lastLineStart, escStart, input.Substring(i, 4)); - i += 4; - goto loop; - case 'U': // Unicode surrogate pair - // This will require 8 characters - if (len - ++i < 8) - { - compiler.SyntaxError(line, lastLineStart, escStart, len - escStart, false, "err-compiler-incomplete-escape"); - yield break; - } - yield return new Token(R.EscapeSequenceSurrogatePair, line, lastLineStart, escStart, input.Substring(i, 8)); - i += 8; - goto loop; - default: - // Spit out the escape char token - yield return new Token(R.EscapeSequenceChar, line, lastLineStart, i, input[i]); - goto iterate; - } - } - - // Verbatim string - case '\"': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - // Make sure we have at least a pair of quotes - if (len - i >= 2) - { - int vstrStart = ++i; // Skip past starting quote - var buffer = new StringBuilder(); - while (i < len) - { - // Found a matching quote? - if (input[i] == '\"') - { - // Oh, it's just an escaped quote. (two in a row) - if (i < li && input[i + 1] == '\"') - { - buffer.Append('\"'); - i += 2; // Skip past current and second quote - continue; - } - - // Neato, looks like it's the end of the string literal. - - // We don't need a new token for this, so just add it to the text buffer. - if (text.Length == 0) - { - lastTextLine = line; - lastTextIndex = i; - lastTextLineStart = lastLineStart; - } - text.Append(buffer); - cycleWroteText = true; - - i++; - goto loop; - } - buffer.Append(input[i]); - i++; - } - compiler.SyntaxError(line, lastLineStart, vstrStart - 1, i - vstrStart, false, "err-compiler-incomplete-verbatim"); - } - else - { - compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-incomplete-verbatim"); - } - break; - - // Regular expression - case '`': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - // Make sure we have at least a pair of apostrophes - if (li - i >= 2) - { - int regStart = ++i; // Skip past starting apostrophe - var buffer = new StringBuilder(); - - while (i < len) - { - // Found an escape sequence in the regex? - if (input[i] == '\\') - { - buffer.Append('\\'); - - // Make sure there's room for an escape code and the end of the literal - if (li - i >= 2) - { - if (input[i + 1] == '`') - { - buffer.Append('`'); - i += 2; // Skip past current and second quote - continue; - } - i++; - continue; - } - - // If we don't have enough room for an escape char and an ending apostrophe, error. - compiler.SyntaxError(line, lastLineStart, regStart - 1, i - regStart + 1, false, "err-compiler-incomplete-regex"); - break; - } - - // Found another apostrophe that isn't escaped? - if (input[i] == '`') - { - yield return new Token(R.Regex, line, lastLineStart, regStart - 1, buffer.ToString()); - - // Read flags - if (++i < len && char.IsLetter(input[i])) - { - int flagsStart = i++; - while (i < len && char.IsLetter(input[i])) i++; - yield return new Token(R.RegexFlags, line, lastLineStart, flagsStart, input.Substring(flagsStart, i - flagsStart)); - } - goto loop; - } - - // Add character to buffer - buffer.Append(input[i]); - i++; - } - - // Reached EOF - compiler.SyntaxError(line, lastLineStart, regStart, i - regStart, false, "err-compiler-incomplete-regex"); - } - else - { - // Impossible to create regex here because there are too few characters remaining - compiler.SyntaxError(line, lastLineStart, i, len - i, false, "err-compiler-incomplete-regex"); - } - break; - - case '[': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.LeftSquare, line, lastLineStart, i, c); - break; - case ']': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.RightSquare, line, lastLineStart, i, c); - break; - case '{': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.LeftCurly, line, lastLineStart, i, c); - break; - case '}': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.RightCurly, line, lastLineStart, i, c); - break; - case '(': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.LeftParen, line, lastLineStart, i, c); - break; - case ')': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.RightParen, line, lastLineStart, i, c); - break; - case '<': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.LeftAngle, line, lastLineStart, i, c); - break; - case '>': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.RightAngle, line, lastLineStart, i, c); - break; - case '|': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Pipe, line, lastLineStart, i, c); - break; - case '?': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - if (li - i > 0 && input[i + 1] == '!') - { - yield return new Token(R.Without, line, lastLineStart, i, "?!"); - i++; - break; - } - yield return new Token(R.Question, line, lastLineStart, i, c); - break; - case '!': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Exclamation, line, lastLineStart, i, c); - break; - case '@': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.At, line, lastLineStart, i, c); - break; - case '-': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Hyphen, line, lastLineStart, i, c); - break; - case '$': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Dollar, line, lastLineStart, i, c); - break; - case '=': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Equal, line, lastLineStart, i, c); - break; - case '&': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Ampersand, line, lastLineStart, i, c); - break; - case '+': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Plus, line, lastLineStart, i, c); - break; - case '.': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Period, line, lastLineStart, i, c); - break; - case ':': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - // Check for double-colon - if (li - i > 0 && input[i + 1] == ':') - { - yield return new Token(R.DoubleColon, line, lastLineStart, i, "::"); - i += 2; - goto loop; - } - yield return new Token(R.Colon, line, lastLineStart, i, c); - break; - case ';': - if (text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - yield return new Token(R.Semicolon, line, lastLineStart, i, c); - break; - default: - if (text.Length == 0) - { - lastTextLine = line; - lastTextIndex = i; - lastTextLineStart = lastLineStart; - } - text.Append(c); - cycleWroteText = true; - break; - } - - // Iterates the index - iterate: - i++; - - loop: // Skips iteration of the index - - // Emit text token if appropriate - if (!cycleWroteText && text.Length > 0) - { - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - text.Length = 0; - } - } - - // Spit out any last text that remains - if (text.Length > 0) - yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); - } - } + internal static class RantLexer + { + public static string GetSymbolForType(R type) + { + switch (type) + { + case R.Ampersand: + return "&"; + case R.At: + return "@"; + case R.Caret: + return "^"; + case R.Colon: + return ":"; + case R.Comma: + return ","; + case R.Dollar: + return "$"; + case R.DoubleColon: + return "::"; + case R.Equal: + return "="; + case R.Exclamation: + return "!"; + case R.Hyphen: + return "-"; + case R.LeftParen: + return "("; + case R.RightParen: + return ")"; + case R.LeftSquare: + return "["; + case R.RightSquare: + return "]"; + case R.LeftCurly: + return "{"; + case R.RightCurly: + return "}"; + case R.LeftAngle: + return "<"; + case R.RightAngle: + return ">"; + case R.Semicolon: + return ";"; + case R.Question: + return "?"; + case R.Period: + return "."; + case R.Without: + return "?!"; + case R.Plus: + return "+"; + case R.VerbatimString: + return "\"...\""; + default: + return ""; + } + } + + public static IEnumerable Lex(RantCompiler compiler, string input) + { + if (Util.IsNullOrWhiteSpace(input)) yield break; + + int line = 1; // Pretty self-explanatory + int i = 0; // The iterator index + int len = input.Length; // The length of the input string + int li = len - 1; // The last character index available in the input string, precalculated for your pleasure + char c; // Currently scanned character + bool lineStart = true; // Indicates if all characters so far on this line have been whitespace + int lastLineStart = 0; // Index of last line start. Use to calculate columns lazily. + var text = new StringBuilder(64); // Buffer for text token content + var whitespace = new StringBuilder(16); // Buffer for whitespace + bool cycleWroteText = false; // Determines if the last loop cycle wrote to the text buffer + int lastTextIndex = 0; // The last initial character index recorded for the text buffer + int lastTextLine = 1; // The last initial line number recorded for the text buffer + int lastTextLineStart = 0; // The last initial line start character index recorded for the text buffer + + while (i < len) + { + // No text was written on this cycle yet, so set this to false + cycleWroteText = false; + + // Set the current scanned character + c = input[i]; + + // If a newline is detected, update all line state variables + if (c == '\n') + { + line++; + lastLineStart = i + 1; + lineStart = true; + whitespace.Length = 0; + goto iterate; + } + + // Skip carriage returns too + if (c == '\r') goto iterate; + + // If whitespace, capture it all before moving on + if (char.IsWhiteSpace(c)) + { + if (!lineStart) whitespace.Append(input[i]); + goto iterate; + } + + // At this point, a non-whitespace character has been read. + + // Emit whitespace if queued + if (whitespace.Length > 0) + { + // If it's a line breaking character, a comment, or at the start of a line, skip it. + if (!lineStart && c != '#') + yield return new Token(R.Whitespace, line, lastLineStart, i, whitespace.ToString()); + whitespace.Length = 0; + } + + lineStart = false; + + switch (c) + { + // Comment + case '#': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + // Just eat the line and ignore it + while (i < len && input[i] != '\n') i++; + goto iterate; + + // Escape sequence + case '\\': + { + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + if (i == li) + { + // This is the last character! Blasphemy! + compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-incomplete-escape"); + yield break; + } + + // At this point we know there's at least one character. Great! + + int escStart = i++; // Skip the slash + + // No escaping whitespace. + if (char.IsWhiteSpace(input[i])) + { + compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-incomplete-escape"); + break; + } + + // There's a quantifier here. + if (char.IsDigit(input[i])) + { + int qStart = i++; // Skip past the digit + while (i < len && char.IsDigit(input[i])) i++; + if (i >= li) + { + compiler.SyntaxError(line, lastLineStart, escStart, i - escStart, false, "err-compiler-incomplete-escape"); + break; + } + // We need a comma after a quantifier + if (input[i] != ',') + { + compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-missing-quantity-comma"); + break; + } + yield return new Token(R.EscapeSequenceQuantifier, line, lastLineStart, qStart, input.Substring(qStart, i - qStart)); + i++; // Skip past the comma + } + + // At this point we need to make sure that there are more characters + if (i >= len) + { + compiler.SyntaxError(line, lastLineStart, escStart, i - escStart, false, "err-compiler-incomplete-escape"); + break; + } + + switch (input[i]) + { + case 'u': // Unicode code point + // This will require 4 characters + if (len - ++i < 4) + { + compiler.SyntaxError(line, lastLineStart, escStart, len - escStart, false, "err-compiler-incomplete-escape"); + yield break; + } + yield return new Token(R.EscapeSequenceUnicode, line, lastLineStart, escStart, input.Substring(i, 4)); + i += 4; + goto loop; + case 'U': // Unicode surrogate pair + // This will require 8 characters + if (len - ++i < 8) + { + compiler.SyntaxError(line, lastLineStart, escStart, len - escStart, false, "err-compiler-incomplete-escape"); + yield break; + } + yield return new Token(R.EscapeSequenceSurrogatePair, line, lastLineStart, escStart, input.Substring(i, 8)); + i += 8; + goto loop; + default: + // Spit out the escape char token + yield return new Token(R.EscapeSequenceChar, line, lastLineStart, i, input[i]); + goto iterate; + } + } + + // Verbatim string + case '\"': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + // Make sure we have at least a pair of quotes + if (len - i >= 2) + { + int vstrStart = ++i; // Skip past starting quote + var buffer = new StringBuilder(); + while (i < len) + { + // Found a matching quote? + if (input[i] == '\"') + { + // Oh, it's just an escaped quote. (two in a row) + if (i < li && input[i + 1] == '\"') + { + buffer.Append('\"'); + i += 2; // Skip past current and second quote + continue; + } + + // Neato, looks like it's the end of the string literal. + + // We don't need a new token for this, so just add it to the text buffer. + if (text.Length == 0) + { + lastTextLine = line; + lastTextIndex = i; + lastTextLineStart = lastLineStart; + } + text.Append(buffer); + cycleWroteText = true; + + i++; + goto loop; + } + buffer.Append(input[i]); + i++; + } + compiler.SyntaxError(line, lastLineStart, vstrStart - 1, i - vstrStart, false, "err-compiler-incomplete-verbatim"); + } + else + compiler.SyntaxError(line, lastLineStart, i, 1, false, "err-compiler-incomplete-verbatim"); + break; + + // Regular expression + case '`': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + // Make sure we have at least a pair of apostrophes + if (li - i >= 2) + { + int regStart = ++i; // Skip past starting apostrophe + var buffer = new StringBuilder(); + + while (i < len) + { + // Found an escape sequence in the regex? + if (input[i] == '\\') + { + buffer.Append('\\'); + + // Make sure there's room for an escape code and the end of the literal + if (li - i >= 2) + { + if (input[i + 1] == '`') + { + buffer.Append('`'); + i += 2; // Skip past current and second quote + continue; + } + i++; + continue; + } + + // If we don't have enough room for an escape char and an ending apostrophe, error. + compiler.SyntaxError(line, lastLineStart, regStart - 1, i - regStart + 1, false, "err-compiler-incomplete-regex"); + break; + } + + // Found another apostrophe that isn't escaped? + if (input[i] == '`') + { + yield return new Token(R.Regex, line, lastLineStart, regStart - 1, buffer.ToString()); + + // Read flags + if (++i < len && char.IsLetter(input[i])) + { + int flagsStart = i++; + while (i < len && char.IsLetter(input[i])) i++; + yield return new Token(R.RegexFlags, line, lastLineStart, flagsStart, input.Substring(flagsStart, i - flagsStart)); + } + goto loop; + } + + // Add character to buffer + buffer.Append(input[i]); + i++; + } + + // Reached EOF + compiler.SyntaxError(line, lastLineStart, regStart, i - regStart, false, "err-compiler-incomplete-regex"); + } + else + { + // Impossible to create regex here because there are too few characters remaining + compiler.SyntaxError(line, lastLineStart, i, len - i, false, "err-compiler-incomplete-regex"); + } + break; + + case '[': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.LeftSquare, line, lastLineStart, i, c); + break; + case ']': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.RightSquare, line, lastLineStart, i, c); + break; + case '{': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.LeftCurly, line, lastLineStart, i, c); + break; + case '}': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.RightCurly, line, lastLineStart, i, c); + break; + case '(': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.LeftParen, line, lastLineStart, i, c); + break; + case ')': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.RightParen, line, lastLineStart, i, c); + break; + case '<': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.LeftAngle, line, lastLineStart, i, c); + break; + case '>': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.RightAngle, line, lastLineStart, i, c); + break; + case '|': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Pipe, line, lastLineStart, i, c); + break; + case '?': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + if (li - i > 0 && input[i + 1] == '!') + { + yield return new Token(R.Without, line, lastLineStart, i, "?!"); + i++; + break; + } + yield return new Token(R.Question, line, lastLineStart, i, c); + break; + case '!': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Exclamation, line, lastLineStart, i, c); + break; + case '@': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.At, line, lastLineStart, i, c); + break; + case '-': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Hyphen, line, lastLineStart, i, c); + break; + case '$': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Dollar, line, lastLineStart, i, c); + break; + case '=': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Equal, line, lastLineStart, i, c); + break; + case '&': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Ampersand, line, lastLineStart, i, c); + break; + case '+': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Plus, line, lastLineStart, i, c); + break; + case '.': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Period, line, lastLineStart, i, c); + break; + case ':': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + // Check for double-colon + if (li - i > 0 && input[i + 1] == ':') + { + yield return new Token(R.DoubleColon, line, lastLineStart, i, "::"); + i += 2; + goto loop; + } + yield return new Token(R.Colon, line, lastLineStart, i, c); + break; + case ';': + if (text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + yield return new Token(R.Semicolon, line, lastLineStart, i, c); + break; + default: + if (text.Length == 0) + { + lastTextLine = line; + lastTextIndex = i; + lastTextLineStart = lastLineStart; + } + text.Append(c); + cycleWroteText = true; + break; + } + + // Iterates the index + iterate: + i++; + + loop: // Skips iteration of the index + + // Emit text token if appropriate + if (!cycleWroteText && text.Length > 0) + { + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + text.Length = 0; + } + } + + // Spit out any last text that remains + if (text.Length > 0) + yield return new Token(R.Text, lastTextLine, lastTextLineStart, lastTextIndex, text.ToString()); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/DeserializeRequest.cs b/Rant/Core/Compiler/Syntax/DeserializeRequest.cs index 160eb42..3a3f40b 100644 --- a/Rant/Core/Compiler/Syntax/DeserializeRequest.cs +++ b/Rant/Core/Compiler/Syntax/DeserializeRequest.cs @@ -25,9 +25,9 @@ namespace Rant.Core.Compiler.Syntax { - internal sealed class DeserializeRequest - { - public RST Result { get; private set; } - public void SetResult(RST rst) => Result = rst; - } + internal sealed class DeserializeRequest + { + public RST Result { get; private set; } + public void SetResult(RST rst) => Result = rst; + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RST.cs b/Rant/Core/Compiler/Syntax/RST.cs index c0d342e..b56865b 100644 --- a/Rant/Core/Compiler/Syntax/RST.cs +++ b/Rant/Core/Compiler/Syntax/RST.cs @@ -35,130 +35,130 @@ namespace Rant.Core.Compiler.Syntax { - /// - /// Represents a Rant Syntax Tree (RST) node for a Rant pattern. This is the base class for all Rant actions. - /// - internal abstract class RST - { - private const uint NullRST = 0x4e554c4c; - private static readonly Dictionary _rstTypeMap = new Dictionary(); - private static readonly Dictionary _rstIDMap = new Dictionary(); - internal LineCol Location; - - static RST() - { - foreach (var type in Assembly.GetExecutingAssembly().GetTypes() - .Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(RST)))) - { - var attr = type.GetCustomAttributes(typeof(RSTAttribute), false).FirstOrDefault() as RSTAttribute; - if (attr == null) continue; - _rstTypeMap[attr.TypeCode] = type; - _rstIDMap[type] = attr.TypeCode; - } - } - - public RST(LineCol location) - { - Location = location; - } - - public static void SerializeRST(RST rst, EasyWriter output) - { - var stack = new Stack>(10); - stack.Push(rst.SerializeObject(output)); - top: - while (stack.Count > 0) - { - var serializer = stack.Peek(); - - while (serializer.MoveNext()) - if (serializer.Current == null) - { - output.Write(NullRST); - } - else - { - stack.Push(serializer.Current.SerializeObject(output)); - goto top; - } - - stack.Pop(); - } - } - - public static RST DeserializeRST(EasyReader input) - { - Type rootType; - if (!_rstTypeMap.TryGetValue(input.ReadUInt32(), out rootType) || rootType != typeof(RstSequence)) - throw new InvalidDataException(GetString("err-pgmload-invalid-rst-root")); - - int rootLine = input.ReadInt32(); - int rootCol = input.ReadInt32(); - int rootIndex = input.ReadInt32(); - var rootRST = Activator.CreateInstance(rootType, new LineCol(rootLine, rootCol, rootIndex)) as RstSequence; - if (rootRST == null) throw new InvalidDataException(GetString("err-pgmload-root-instance-fail")); - - var stack = new Stack>(10); - stack.Push(rootRST.DeserializeObject(input)); - - top: - while (stack.Count > 0) - { - var deserializer = stack.Peek(); - - while (deserializer.MoveNext()) - { - uint code = input.ReadUInt32(); - - if (code == NullRST) - { - deserializer.Current.SetResult(null); - continue; - } - - Type type; - if (!_rstTypeMap.TryGetValue(code, out type)) - throw new InvalidDataException(GetString("err-pgmload-bad-type", code)); - - int line = input.ReadInt32(); - int col = input.ReadInt32(); - int index = input.ReadInt32(); - var rst = Activator.CreateInstance(type, new LineCol(line, col, index)) as RST; - if (rst == null) throw new InvalidDataException(GetString("err-pgmload-rst-creation-fail", type.Name)); - deserializer.Current.SetResult(rst); - stack.Push(rst.DeserializeObject(input)); - goto top; - } - - stack.Pop(); - } - - return rootRST; - } - - /// - /// Performs the operations defined in the RST, given a specific sandbox to operate upon. - /// - /// The sandbox on which to operate. - /// - public abstract IEnumerator Run(Sandbox sb); - - private IEnumerator SerializeObject(EasyWriter output) - { - output.Write(_rstIDMap[GetType()]); - output.Write(Location.Line); - output.Write(Location.Column); - output.Write(Location.Index); - return Serialize(output); - } - - private IEnumerator DeserializeObject(EasyReader input) - { - // Type code and location have already been read - return Deserialize(input); - } - - protected abstract IEnumerator Serialize(EasyWriter output); - protected abstract IEnumerator Deserialize(EasyReader input); - } + /// + /// Represents a Rant Syntax Tree (RST) node for a Rant pattern. This is the base class for all Rant actions. + /// + internal abstract class RST + { + private const uint NullRST = 0x4e554c4c; + private static readonly Dictionary _rstTypeMap = new Dictionary(); + private static readonly Dictionary _rstIDMap = new Dictionary(); + internal LineCol Location; + + static RST() + { + foreach (var type in Assembly.GetExecutingAssembly().GetTypes() + .Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(RST)))) + { + var attr = type.GetCustomAttributes(typeof(RSTAttribute), false).FirstOrDefault() as RSTAttribute; + if (attr == null) continue; + _rstTypeMap[attr.TypeCode] = type; + _rstIDMap[type] = attr.TypeCode; + } + } + + public RST(LineCol location) + { + Location = location; + } + + public static void SerializeRST(RST rst, EasyWriter output) + { + var stack = new Stack>(10); + stack.Push(rst.SerializeObject(output)); + top: + while (stack.Count > 0) + { + var serializer = stack.Peek(); + + while (serializer.MoveNext()) + { + if (serializer.Current == null) + output.Write(NullRST); + else + { + stack.Push(serializer.Current.SerializeObject(output)); + goto top; + } + } + + stack.Pop(); + } + } + + public static RST DeserializeRST(EasyReader input) + { + Type rootType; + if (!_rstTypeMap.TryGetValue(input.ReadUInt32(), out rootType) || rootType != typeof(RstSequence)) + throw new InvalidDataException(GetString("err-pgmload-invalid-rst-root")); + + int rootLine = input.ReadInt32(); + int rootCol = input.ReadInt32(); + int rootIndex = input.ReadInt32(); + var rootRST = Activator.CreateInstance(rootType, new LineCol(rootLine, rootCol, rootIndex)) as RstSequence; + if (rootRST == null) throw new InvalidDataException(GetString("err-pgmload-root-instance-fail")); + + var stack = new Stack>(10); + stack.Push(rootRST.DeserializeObject(input)); + + top: + while (stack.Count > 0) + { + var deserializer = stack.Peek(); + + while (deserializer.MoveNext()) + { + uint code = input.ReadUInt32(); + + if (code == NullRST) + { + deserializer.Current.SetResult(null); + continue; + } + + Type type; + if (!_rstTypeMap.TryGetValue(code, out type)) + throw new InvalidDataException(GetString("err-pgmload-bad-type", code)); + + int line = input.ReadInt32(); + int col = input.ReadInt32(); + int index = input.ReadInt32(); + var rst = Activator.CreateInstance(type, new LineCol(line, col, index)) as RST; + if (rst == null) throw new InvalidDataException(GetString("err-pgmload-rst-creation-fail", type.Name)); + deserializer.Current.SetResult(rst); + stack.Push(rst.DeserializeObject(input)); + goto top; + } + + stack.Pop(); + } + + return rootRST; + } + + /// + /// Performs the operations defined in the RST, given a specific sandbox to operate upon. + /// + /// The sandbox on which to operate. + /// + public abstract IEnumerator Run(Sandbox sb); + + private IEnumerator SerializeObject(EasyWriter output) + { + output.Write(_rstIDMap[GetType()]); + output.Write(Location.Line); + output.Write(Location.Column); + output.Write(Location.Index); + return Serialize(output); + } + + private IEnumerator DeserializeObject(EasyReader input) + { + // Type code and location have already been read + return Deserialize(input); + } + + protected abstract IEnumerator Serialize(EasyWriter output); + protected abstract IEnumerator Deserialize(EasyReader input); + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RSTAttribute.cs b/Rant/Core/Compiler/Syntax/RSTAttribute.cs index d0b295c..5e51554 100644 --- a/Rant/Core/Compiler/Syntax/RSTAttribute.cs +++ b/Rant/Core/Compiler/Syntax/RSTAttribute.cs @@ -28,15 +28,15 @@ namespace Rant.Core.Compiler.Syntax { - internal sealed class RSTAttribute : Attribute - { - public RSTAttribute(string typeCodeString) - { - if (typeCodeString == null) throw new ArgumentNullException(nameof(typeCodeString)); - if (typeCodeString.Length != 4) throw new ArgumentException("Type code must be four characters long."); - TypeCode = BitConverter.ToUInt32(Encoding.ASCII.GetBytes(typeCodeString), 0); - } + internal sealed class RSTAttribute : Attribute + { + public RSTAttribute(string typeCodeString) + { + if (typeCodeString == null) throw new ArgumentNullException(nameof(typeCodeString)); + if (typeCodeString.Length != 4) throw new ArgumentException("Type code must be four characters long."); + TypeCode = BitConverter.ToUInt32(Encoding.ASCII.GetBytes(typeCodeString), 0); + } - public uint TypeCode { get; } - } + public uint TypeCode { get; } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index 6e59ecc..3b84106 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -33,234 +33,230 @@ namespace Rant.Core.Compiler.Syntax { - /// - /// Represents a block construct, which provides multiple options to the interpreter for the next sequence, one of which is - /// chosen. - /// - [RST("bloc")] - internal class RstBlock : RST - { - private double _constantWeightSum; - private int _count; - private List<_> _dynamicWeights = null; - private List _elements = new List(); - private bool _weighted = false; - // Item weights. - // Dynamic weights are patterns that must be run to get the weight value. - // Constant weights can be used directly. This is used for optimization. - // TODO: Move _weights to local scope for thread safety - private double[] _weights = null; - - public RstBlock(LineCol location) : base(location) - { - // Used by serializer - } - - public RstBlock(LineCol location, List items, - List<_> dynamicWeights, List<_> constantWeights) - : base(location) - { - _elements.AddRange(items); - _count = items.Count; - if (dynamicWeights != null && constantWeights != null) - { - _dynamicWeights = dynamicWeights; - _weights = new double[_count]; - for (int i = 0; i < _count; i++) _weights[i] = 1; - foreach (var cw in constantWeights) - _weights[cw.Item1] = cw.Item2; - _constantWeightSum = _weights.Sum() - _dynamicWeights.Count; - _weighted = true; - } - } - - public override IEnumerator Run(Sandbox sb) - { - var attribs = sb.NextAttribs(this); - - // Skip if chance doesn't fall within range - if (attribs.Chance < 100 && sb.RNG.NextDouble(0, 100) > attribs.Chance) - yield break; - - int next = -1; - int reps = attribs.RepEach ? _elements.Count : attribs.Repetitions; - var block = new BlockState(attribs.Repetitions); - double weightSum = _constantWeightSum; - - if (attribs.Start != null) yield return attribs.Start; - - if (_weighted && attribs.Sync == null) - foreach (var dw in _dynamicWeights) - { - sb.AddOutputWriter(); - yield return dw.Item2; - string strWeight = sb.Return().Main; - if (!double.TryParse(strWeight, out _weights[dw.Item1])) - throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, - GetString("err-runtime-invalid-dynamic-weight", strWeight)); - - weightSum += _weights[dw.Item1]; - } - - if (attribs.Sync?.Index == 0 && attribs.StartIndex >= 0) - attribs.Sync.Index = attribs.StartIndex; - - sb.Blocks.Push(block); - for (int i = 0; i < reps; i++) - { - if (i == 0 && attribs.StartIndex >= 0 && attribs.Sync == null) - { - next = attribs.StartIndex > _count ? _count - 1 : attribs.StartIndex; - } - else if (_weighted) - { - double choice = sb.RNG.NextDouble(weightSum); - for (int j = 0; j < _count; j++) - { - if (choice < _weights[j]) - { - next = j; - break; - } - choice -= _weights[j]; - } - } - else - { - next = attribs.NextIndex(_count, sb.RNG); - } - - if (next == -1) break; - - block.Next(next); // Set next block index - - sb.Blocks.Pop(); // Don't allow separator to access block state - - // Separator - if (i > 0 && attribs.Separator != null) - if (attribs.IsSeries) - { - // Check if we're on the last separator in a series - if (i == reps - 1) - { - // Add the oxford comma if specified - if (attribs.EndSeparator != null) - if (reps > 2) yield return attribs.EndSeparator; - - sb.Print(sb.Format.StandardSpace); - - // Add conjunction if specified (it normally should be, if it's a series) - if (attribs.EndConjunction != null) - { - yield return attribs.EndConjunction; - sb.Print(sb.Format.StandardSpace); - } - } - else if (reps > 2) - { - yield return attribs.Separator; - sb.Print(sb.Format.StandardSpace); - } - } - else - { - yield return attribs.Separator; - } - sb.Blocks.Push(block); // Now put it back - - // Prefix - if (attribs.Before != null) yield return attribs.Before; - - // Content - sb.Objects.EnterScope(); - yield return _elements[next]; - sb.Objects.ExitScope(); - - // Affix - if (attribs.After != null) yield return attribs.After; - } - sb.Blocks.Pop(); - - if (attribs.End != null) yield return attribs.End; - } - - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(_count); - output.Write(_weighted); - if (_weighted) - { - // Write constant weights - if (_weights != null) - { - output.Write(true); - output.Write(_constantWeightSum); - for (int i = 0; i < _count; i++) - output.Write(_weights[i]); - } - else - { - output.Write(false); - } - - // Write dynamic weights - if (_dynamicWeights != null) - { - output.Write(_dynamicWeights.Count); - foreach (var dw in _dynamicWeights) - { - output.Write(dw.Item1); - yield return dw.Item2; - } - } - else - { - output.Write(0); - } - } - - // Block elements - foreach (var e in _elements) yield return e; - } - - protected override IEnumerator Deserialize(EasyReader input) - { - input.ReadInt32(out _count); - input.ReadBoolean(out _weighted); - if (_weighted) - { - // Read constant weights - if (input.ReadBoolean()) - { - input.ReadDouble(out _constantWeightSum); - _weights = new double[_count]; - for (int i = 0; i < _count; i++) - input.ReadDouble(out _weights[i]); - } - - // Read dynamic weights - int numDW = input.ReadInt32(); - if (numDW > 0) - { - _dynamicWeights = new List<_>(numDW); - for (int i = 0; i < numDW; i++) - { - int index = input.ReadInt32(); - var request = new DeserializeRequest(); - yield return request; - _dynamicWeights.Add(new _(index, request.Result)); - } - } - } - - // Read elements - _elements = new List(_count); - for (int i = 0; i < _count; i++) - { - var request = new DeserializeRequest(); - yield return request; - _elements.Add(request.Result); - } - } - } + /// + /// Represents a block construct, which provides multiple options to the interpreter for the next sequence, one of which is + /// chosen. + /// + [RST("bloc")] + internal class RstBlock : RST + { + private double _constantWeightSum; + private int _count; + private List<_> _dynamicWeights = null; + private List _elements = new List(); + private bool _weighted = false; + // Item weights. + // Dynamic weights are patterns that must be run to get the weight value. + // Constant weights can be used directly. This is used for optimization. + // TODO: Move _weights to local scope for thread safety + private double[] _weights = null; + + public RstBlock(LineCol location) : base(location) + { + // Used by serializer + } + + public RstBlock(LineCol location, List items, + List<_> dynamicWeights, List<_> constantWeights) + : base(location) + { + _elements.AddRange(items); + _count = items.Count; + if (dynamicWeights != null && constantWeights != null) + { + _dynamicWeights = dynamicWeights; + _weights = new double[_count]; + for (int i = 0; i < _count; i++) _weights[i] = 1; + foreach (var cw in constantWeights) + _weights[cw.Item1] = cw.Item2; + _constantWeightSum = _weights.Sum() - _dynamicWeights.Count; + _weighted = true; + } + } + + public override IEnumerator Run(Sandbox sb) + { + var attribs = sb.NextAttribs(this); + + // Skip if chance doesn't fall within range + if (attribs.Chance < 100 && sb.RNG.NextDouble(0, 100) > attribs.Chance) + yield break; + + int next = -1; + int reps = attribs.RepEach ? _elements.Count : attribs.Repetitions; + var block = new BlockState(attribs.Repetitions); + double weightSum = _constantWeightSum; + + if (attribs.Start != null) yield return attribs.Start; + + if (_weighted && attribs.Sync == null) + { + foreach (var dw in _dynamicWeights) + { + sb.AddOutputWriter(); + yield return dw.Item2; + string strWeight = sb.Return().Main; + if (!double.TryParse(strWeight, out _weights[dw.Item1])) + { + throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, + GetString("err-runtime-invalid-dynamic-weight", strWeight)); + } + + weightSum += _weights[dw.Item1]; + } + } + + if (attribs.Sync?.Index == 0 && attribs.StartIndex >= 0) + attribs.Sync.Index = attribs.StartIndex; + + sb.Blocks.Push(block); + for (int i = 0; i < reps; i++) + { + if (i == 0 && attribs.StartIndex >= 0 && attribs.Sync == null) + next = attribs.StartIndex > _count ? _count - 1 : attribs.StartIndex; + else if (_weighted) + { + double choice = sb.RNG.NextDouble(weightSum); + for (int j = 0; j < _count; j++) + { + if (choice < _weights[j]) + { + next = j; + break; + } + choice -= _weights[j]; + } + } + else + next = attribs.NextIndex(_count, sb.RNG); + + if (next == -1) break; + + block.Next(next); // Set next block index + + sb.Blocks.Pop(); // Don't allow separator to access block state + + // Separator + if (i > 0 && attribs.Separator != null) + { + if (attribs.IsSeries) + { + // Check if we're on the last separator in a series + if (i == reps - 1) + { + // Add the oxford comma if specified + if (attribs.EndSeparator != null) + if (reps > 2) yield return attribs.EndSeparator; + + sb.Print(sb.Format.StandardSpace); + + // Add conjunction if specified (it normally should be, if it's a series) + if (attribs.EndConjunction != null) + { + yield return attribs.EndConjunction; + sb.Print(sb.Format.StandardSpace); + } + } + else if (reps > 2) + { + yield return attribs.Separator; + sb.Print(sb.Format.StandardSpace); + } + } + else + yield return attribs.Separator; + } + sb.Blocks.Push(block); // Now put it back + + // Prefix + if (attribs.Before != null) yield return attribs.Before; + + // Content + sb.Objects.EnterScope(); + yield return _elements[next]; + sb.Objects.ExitScope(); + + // Affix + if (attribs.After != null) yield return attribs.After; + } + sb.Blocks.Pop(); + + if (attribs.End != null) yield return attribs.End; + } + + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(_count); + output.Write(_weighted); + if (_weighted) + { + // Write constant weights + if (_weights != null) + { + output.Write(true); + output.Write(_constantWeightSum); + for (int i = 0; i < _count; i++) + output.Write(_weights[i]); + } + else + output.Write(false); + + // Write dynamic weights + if (_dynamicWeights != null) + { + output.Write(_dynamicWeights.Count); + foreach (var dw in _dynamicWeights) + { + output.Write(dw.Item1); + yield return dw.Item2; + } + } + else + output.Write(0); + } + + // Block elements + foreach (var e in _elements) yield return e; + } + + protected override IEnumerator Deserialize(EasyReader input) + { + input.ReadInt32(out _count); + input.ReadBoolean(out _weighted); + if (_weighted) + { + // Read constant weights + if (input.ReadBoolean()) + { + input.ReadDouble(out _constantWeightSum); + _weights = new double[_count]; + for (int i = 0; i < _count; i++) + input.ReadDouble(out _weights[i]); + } + + // Read dynamic weights + int numDW = input.ReadInt32(); + if (numDW > 0) + { + _dynamicWeights = new List<_>(numDW); + for (int i = 0; i < numDW; i++) + { + int index = input.ReadInt32(); + var request = new DeserializeRequest(); + yield return request; + _dynamicWeights.Add(new _(index, request.Result)); + } + } + } + + // Read elements + _elements = new List(_count); + for (int i = 0; i < _count; i++) + { + var request = new DeserializeRequest(); + yield return request; + _elements.Add(request.Result); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs index a6c8bcd..4e2c9e6 100644 --- a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs @@ -30,95 +30,97 @@ namespace Rant.Core.Compiler.Syntax { - [RST("csub")] - internal class RstCallSubroutine : RstSubroutineBase - { - private bool _inModule = false; - private string _moduleFunctionName = null; - public List Arguments; + [RST("csub")] + internal class RstCallSubroutine : RstSubroutineBase + { + private bool _inModule = false; + private string _moduleFunctionName = null; + public List Arguments; - public RstCallSubroutine(string name, LineCol location, string moduleFunctionName = null) - : base(location) - { - if (moduleFunctionName != null) - _inModule = true; - _moduleFunctionName = moduleFunctionName; - Name = name; - } + public RstCallSubroutine(string name, LineCol location, string moduleFunctionName = null) + : base(location) + { + if (moduleFunctionName != null) + _inModule = true; + _moduleFunctionName = moduleFunctionName; + Name = name; + } - public RstCallSubroutine(LineCol location) : base(location) - { - // Used by serializer - } + public RstCallSubroutine(LineCol location) : base(location) + { + // Used by serializer + } - public override IEnumerator Run(Sandbox sb) - { - if (_inModule) - { - if (!sb.Modules.ContainsKey(Name)) - throw new RantRuntimeException( - sb.Pattern, - this, - $"The module '{Name}' does not exist or has not been imported." - ); - if (sb.Modules[Name][_moduleFunctionName] == null) - throw new RantRuntimeException( - sb.Pattern, - this, - $"The function '{_moduleFunctionName}' cannot be found in the module '{Name}'." - ); - } - else if (sb.Objects[Name] == null) - { - throw new RantRuntimeException(sb.Pattern, this, $"The subroutine '{Name}' does not exist."); - } - var sub = (RstDefineSubroutine)(_inModule ? sb.Modules[Name][_moduleFunctionName] : sb.Objects[Name].Value); - if (sub.Parameters.Keys.Count != Arguments.Count) - throw new RantRuntimeException(sb.Pattern, this, "Argument mismatch on subroutine call."); - var action = sub.Body; - var args = new Dictionary(); - var parameters = sub.Parameters.Keys.ToArray(); - for (int i = 0; i < Arguments.Count; i++) - if (sub.Parameters[parameters[i]] == SubroutineParameterType.Greedy) - { - sb.AddOutputWriter(); - yield return Arguments[i]; - var output = sb.Return(); - args[parameters[i]] = new RstText(Location, output.Main); - } - else - { - args[parameters[i]] = Arguments[i]; - } - sb.SubroutineArgs.Push(args); - yield return action; - sb.SubroutineArgs.Pop(); - } + public override IEnumerator Run(Sandbox sb) + { + if (_inModule) + { + if (!sb.Modules.ContainsKey(Name)) + { + throw new RantRuntimeException( + sb.Pattern, + this, + $"The module '{Name}' does not exist or has not been imported." + ); + } + if (sb.Modules[Name][_moduleFunctionName] == null) + { + throw new RantRuntimeException( + sb.Pattern, + this, + $"The function '{_moduleFunctionName}' cannot be found in the module '{Name}'." + ); + } + } + else if (sb.Objects[Name] == null) + throw new RantRuntimeException(sb.Pattern, this, $"The subroutine '{Name}' does not exist."); + var sub = (RstDefineSubroutine)(_inModule ? sb.Modules[Name][_moduleFunctionName] : sb.Objects[Name].Value); + if (sub.Parameters.Keys.Count != Arguments.Count) + throw new RantRuntimeException(sb.Pattern, this, "Argument mismatch on subroutine call."); + var action = sub.Body; + var args = new Dictionary(); + var parameters = sub.Parameters.Keys.ToArray(); + for (int i = 0; i < Arguments.Count; i++) + { + if (sub.Parameters[parameters[i]] == SubroutineParameterType.Greedy) + { + sb.AddOutputWriter(); + yield return Arguments[i]; + var output = sb.Return(); + args[parameters[i]] = new RstText(Location, output.Main); + } + else + args[parameters[i]] = Arguments[i]; + } + sb.SubroutineArgs.Push(args); + yield return action; + sb.SubroutineArgs.Pop(); + } - protected override IEnumerator Serialize(EasyWriter output) - { - var iterMain = base.Serialize(output); - while (iterMain.MoveNext()) yield return iterMain.Current; - output.Write(_inModule); - output.Write(_moduleFunctionName); - output.Write(Arguments.Count); - foreach (var arg in Arguments) yield return arg; - } + protected override IEnumerator Serialize(EasyWriter output) + { + var iterMain = base.Serialize(output); + while (iterMain.MoveNext()) yield return iterMain.Current; + output.Write(_inModule); + output.Write(_moduleFunctionName); + output.Write(Arguments.Count); + foreach (var arg in Arguments) yield return arg; + } - protected override IEnumerator Deserialize(EasyReader input) - { - var iterMain = base.Deserialize(input); - while (iterMain.MoveNext()) yield return iterMain.Current; - input.ReadBoolean(out _inModule); - input.ReadString(out _moduleFunctionName); - int argc = input.ReadInt32(); - if (Arguments == null) Arguments = new List(argc); - for (int i = 0; i < argc; i++) - { - var request = new DeserializeRequest(); - yield return request; - Arguments.Add(request.Result); - } - } - } + protected override IEnumerator Deserialize(EasyReader input) + { + var iterMain = base.Deserialize(input); + while (iterMain.MoveNext()) yield return iterMain.Current; + input.ReadBoolean(out _inModule); + input.ReadString(out _moduleFunctionName); + int argc = input.ReadInt32(); + if (Arguments == null) Arguments = new List(argc); + for (int i = 0; i < argc; i++) + { + var request = new DeserializeRequest(); + yield return request; + Arguments.Add(request.Result); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs index 6433235..457c003 100644 --- a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs @@ -30,51 +30,51 @@ namespace Rant.Core.Compiler.Syntax { - [RST("dsub")] - internal class RstDefineSubroutine : RstSubroutineBase - { - public Dictionary Parameters; + [RST("dsub")] + internal class RstDefineSubroutine : RstSubroutineBase + { + public Dictionary Parameters; - public RstDefineSubroutine(LineCol location) : base(location) - { - // Used by serializer - } + public RstDefineSubroutine(LineCol location) : base(location) + { + // Used by serializer + } - public override IEnumerator Run(Sandbox sb) - { - sb.Objects[Name] = new RantObject(this); - yield break; - } + public override IEnumerator Run(Sandbox sb) + { + sb.Objects[Name] = new RantObject(this); + yield break; + } - protected override IEnumerator Serialize(EasyWriter output) - { - var iterMain = base.Serialize(output); - while (iterMain.MoveNext()) yield return iterMain.Current; - output.Write(Parameters.Count); - foreach (var kv in Parameters) - { - output.Write(kv.Key); - output.Write((byte)kv.Value); - } - } + protected override IEnumerator Serialize(EasyWriter output) + { + var iterMain = base.Serialize(output); + while (iterMain.MoveNext()) yield return iterMain.Current; + output.Write(Parameters.Count); + foreach (var kv in Parameters) + { + output.Write(kv.Key); + output.Write((byte)kv.Value); + } + } - protected override IEnumerator Deserialize(EasyReader input) - { - var iterMain = base.Deserialize(input); - while (iterMain.MoveNext()) yield return iterMain.Current; - int pCount = input.ReadInt32(); - if (Parameters == null) Parameters = new Dictionary(pCount); - for (int i = 0; i < pCount; i++) - { - string key = input.ReadString(); - Parameters[key] = (SubroutineParameterType)input.ReadByte(); - } - } - } + protected override IEnumerator Deserialize(EasyReader input) + { + var iterMain = base.Deserialize(input); + while (iterMain.MoveNext()) yield return iterMain.Current; + int pCount = input.ReadInt32(); + if (Parameters == null) Parameters = new Dictionary(pCount); + for (int i = 0; i < pCount; i++) + { + string key = input.ReadString(); + Parameters[key] = (SubroutineParameterType)input.ReadByte(); + } + } + } - internal enum SubroutineParameterType : byte - { - Loose, - Greedy - } + internal enum SubroutineParameterType : byte + { + Loose, + Greedy + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstEscape.cs b/Rant/Core/Compiler/Syntax/RstEscape.cs index 2ea04a2..b26757f 100644 --- a/Rant/Core/Compiler/Syntax/RstEscape.cs +++ b/Rant/Core/Compiler/Syntax/RstEscape.cs @@ -31,132 +31,134 @@ namespace Rant.Core.Compiler.Syntax { - [RST("eseq")] - internal class RstEscape : RST - { - private static readonly Dictionary> EscapeTable = new Dictionary - > - { - { 'n', (sb, c) => sb.Print(new string('\n', c)) }, - { - 'N', (sb, c) => - { - var b = new StringBuilder(); - for (int i = 0; i < c; i++) b.Append(Environment.NewLine); - sb.Print(b); - } - }, - { 'r', (sb, c) => sb.Print(new string('\r', c)) }, - { 't', (sb, c) => sb.Print(new string('\t', c)) }, - { 'b', (sb, c) => sb.Print(new string('\b', c)) }, - { 'f', (sb, c) => sb.Print(new string('\f', c)) }, - { 'v', (sb, c) => sb.Print(new string('\v', c)) }, - { 's', (sb, c) => sb.Print(new string(' ', c)) }, - { 'd', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(48, 58)), c) }, - { 'D', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(49, 58)), c) }, - { - 'c', - (sb, c) => - sb.PrintMany( - () => char.ToLowerInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) - }, - { - 'C', - (sb, c) => - sb.PrintMany( - () => char.ToUpperInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) - }, - { 'x', (sb, c) => sb.PrintMany(() => "0123456789abcdef"[sb.RNG.Next(16)], c) }, - { 'X', (sb, c) => sb.PrintMany(() => "0123456789ABCDEF"[sb.RNG.Next(16)], c) }, - { - 'w', (sb, c) => - { - int i; - sb.PrintMany(() => - { - i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); - return i >= 10 - ? char.ToLowerInvariant(sb.Format.LettersInternal[i - 10]) - : Convert.ToChar(i + 48); - }, c); - } - }, - { - 'W', (sb, c) => - { - int i; - sb.PrintMany(() => - { - i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); - return i >= 10 - ? char.ToUpperInvariant(sb.Format.LettersInternal[i - 10]) - : Convert.ToChar(i + 48); - }, c); - } - }, - { - 'a', (sb, c) => sb.Output.Do(chain => chain.AddArticleBuffer()) - } - }; + [RST("eseq")] + internal class RstEscape : RST + { + private static readonly Dictionary> EscapeTable = new Dictionary + > + { + { 'n', (sb, c) => sb.Print(new string('\n', c)) }, + { + 'N', (sb, c) => + { + var b = new StringBuilder(); + for (int i = 0; i < c; i++) b.Append(Environment.NewLine); + sb.Print(b); + } + }, + { 'r', (sb, c) => sb.Print(new string('\r', c)) }, + { 't', (sb, c) => sb.Print(new string('\t', c)) }, + { 'b', (sb, c) => sb.Print(new string('\b', c)) }, + { 'f', (sb, c) => sb.Print(new string('\f', c)) }, + { 'v', (sb, c) => sb.Print(new string('\v', c)) }, + { 's', (sb, c) => sb.Print(new string(' ', c)) }, + { 'd', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(48, 58)), c) }, + { 'D', (sb, c) => sb.PrintMany(() => Convert.ToChar(sb.RNG.Next(49, 58)), c) }, + { + 'c', + (sb, c) => + sb.PrintMany( + () => char.ToLowerInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) + }, + { + 'C', + (sb, c) => + sb.PrintMany( + () => char.ToUpperInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) + }, + { 'x', (sb, c) => sb.PrintMany(() => "0123456789abcdef"[sb.RNG.Next(16)], c) }, + { 'X', (sb, c) => sb.PrintMany(() => "0123456789ABCDEF"[sb.RNG.Next(16)], c) }, + { + 'w', (sb, c) => + { + int i; + sb.PrintMany(() => + { + i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); + return i >= 10 + ? char.ToLowerInvariant(sb.Format.LettersInternal[i - 10]) + : Convert.ToChar(i + 48); + }, c); + } + }, + { + 'W', (sb, c) => + { + int i; + sb.PrintMany(() => + { + i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); + return i >= 10 + ? char.ToUpperInvariant(sb.Format.LettersInternal[i - 10]) + : Convert.ToChar(i + 48); + }, c); + } + }, + { + 'a', (sb, c) => sb.Output.Do(chain => chain.AddArticleBuffer()) + } + }; - private char _codeLow, _codeHigh; - private int _times; - private bool _unicode; + private char _codeLow, _codeHigh; + private int _times; + private bool _unicode; - public RstEscape(LineCol location, int quantity, bool unicode, char codeHighSurrogate, char codeLowSurrogate = '\0') - : base(location) - { - _codeLow = codeLowSurrogate; - _codeHigh = codeHighSurrogate; - _times = quantity; - _unicode = unicode; - } + public RstEscape(LineCol location, int quantity, bool unicode, char codeHighSurrogate, char codeLowSurrogate = '\0') + : base(location) + { + _codeLow = codeLowSurrogate; + _codeHigh = codeHighSurrogate; + _times = quantity; + _unicode = unicode; + } - public RstEscape(LineCol location) : base(location) - { - // Used by serializer - } + public RstEscape(LineCol location) : base(location) + { + // Used by serializer + } - public override IEnumerator Run(Sandbox sb) - { - if (_unicode) - { - if (_codeLow != '\0') - for (int i = 0; i < _times; i++) - { - sb.Print(_codeHigh); - sb.Print(_codeLow); - } - else - sb.Print(new string(_codeHigh, _times)); - } - else - { - Action func; - if (!EscapeTable.TryGetValue(_codeHigh, out func)) - sb.Print(new string(_codeHigh, _times)); - else - func(sb, _times); - } - yield break; - } + public override IEnumerator Run(Sandbox sb) + { + if (_unicode) + { + if (_codeLow != '\0') + { + for (int i = 0; i < _times; i++) + { + sb.Print(_codeHigh); + sb.Print(_codeLow); + } + } + else + sb.Print(new string(_codeHigh, _times)); + } + else + { + Action func; + if (!EscapeTable.TryGetValue(_codeHigh, out func)) + sb.Print(new string(_codeHigh, _times)); + else + func(sb, _times); + } + yield break; + } - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(_codeHigh); - output.Write(_codeLow); - output.Write(_times); - output.Write(_unicode); - yield break; - } + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(_codeHigh); + output.Write(_codeLow); + output.Write(_times); + output.Write(_unicode); + yield break; + } - protected override IEnumerator Deserialize(EasyReader input) - { - input.ReadChar(out _codeHigh); - input.ReadChar(out _codeLow); - input.ReadInt32(out _times); - input.ReadBoolean(out _unicode); - yield break; - } - } + protected override IEnumerator Deserialize(EasyReader input) + { + input.ReadChar(out _codeHigh); + input.ReadChar(out _codeLow); + input.ReadInt32(out _times); + input.ReadBoolean(out _unicode); + yield break; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index ed66cfa..b6c46f9 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -33,147 +33,149 @@ namespace Rant.Core.Compiler.Syntax { - [RST("nfnc")] - internal class RstFunction : RST - { - private int _argc; - private List _args; - private RantFunctionSignature _funcInfo; - - public RstFunction(LineCol location, RantFunctionSignature funcInfo, List args) - : base(location) - { - _funcInfo = funcInfo; - _args = args; - _argc = args.Count; - } - - public RstFunction(LineCol location) : base(location) - { - // Used by serializer - } - - private RantFunctionParameter GetParameter(int index) - { - if (index >= _funcInfo.Parameters.Length - 1 && _funcInfo.HasParamArray) - return _funcInfo.Parameters[_funcInfo.Parameters.Length - 1]; - return _funcInfo.Parameters[index]; - } - - public override IEnumerator Run(Sandbox sb) - { - // Convert arguments to their native types - int paramc = _funcInfo.Parameters.Length; - var args = new object[_argc]; - double d; - RantFunctionParameter p; - for (int i = 0; i < _argc; i++) - { - p = GetParameter(i); - switch (p.RantType) - { - // Patterns are passed right to the method - case RantFunctionParameterType.Pattern: - args[i] = _args[i]; - break; - - // Strings are evaluated - case RantFunctionParameterType.String: - sb.AddOutputWriter(); - yield return _args[i]; - args[i] = sb.Return().Main; - break; - - // Numbers are evaluated, verified, and converted - case RantFunctionParameterType.Number: - { - sb.AddOutputWriter(); - yield return _args[i]; - string strNum = sb.Return().Main; - if (!double.TryParse(strNum, out d)) - { - d = 0; - int n; - if (Util.ParseInt(strNum, out n)) d = n; - } - args[i] = Convert.ChangeType(d, p.NativeType); - break; - } - - // Modes are parsed into enumeration members - case RantFunctionParameterType.Mode: - { - sb.AddOutputWriter(); - yield return _args[i]; - string strMode = sb.Return().Main; - object value; - if (!Util.TryParseEnum(p.NativeType, strMode, out value)) - throw new RantRuntimeException(sb.Pattern, _args[i].Location, - $"Unknown mode value '{strMode}'."); - args[i] = value; - break; - } - - // Flags are parsed from strings to enum members and combined with OR. - case RantFunctionParameterType.Flags: - { - var enumType = p.NativeType; - sb.AddOutputWriter(); - yield return _args[i]; - long flags = 0; - string strFlags = sb.Return().Main; - object value; - foreach (string flag in strFlags.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) - { - if (!Util.TryParseEnum(enumType, flag, out value)) - throw new RantRuntimeException(sb.Pattern, _args[i].Location, - $"Unknown flag value '{flag}'."); - flags |= Convert.ToInt64(value); - } - args[i] = Enum.ToObject(enumType, flags); - break; - } - } - } - - // Invoke the function - IEnumerator requester; - if (_funcInfo.HasParamArray) - { - int required = paramc - 1; - int parrayCount = _argc - required; - var parray = Array.CreateInstance(_funcInfo.Parameters[required].NativeType, parrayCount); - Array.Copy(args, required, parray, 0, parrayCount); - requester = _funcInfo.Invoke(sb, args.Take(required).Concat(new[] { parray }).ToArray()); - } - else - { - requester = _funcInfo.Invoke(sb, args); - } - - while (requester.MoveNext()) - yield return requester.Current; - } - - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(_argc); - output.Write(_funcInfo.Name); - foreach (var arg in _args) yield return arg; - } - - protected override IEnumerator Deserialize(EasyReader input) - { - input.ReadInt32(out _argc); - string funcName = input.ReadString(); - _funcInfo = RantFunctionRegistry.GetFunction(funcName, _argc); - if (_args == null) _args = new List(_argc); - for (int i = 0; i < _argc; i++) - { - var request = new DeserializeRequest(); - yield return request; - _args.Add(request.Result); - } - } - } + [RST("nfnc")] + internal class RstFunction : RST + { + private int _argc; + private List _args; + private RantFunctionSignature _funcInfo; + + public RstFunction(LineCol location, RantFunctionSignature funcInfo, List args) + : base(location) + { + _funcInfo = funcInfo; + _args = args; + _argc = args.Count; + } + + public RstFunction(LineCol location) : base(location) + { + // Used by serializer + } + + private RantFunctionParameter GetParameter(int index) + { + if (index >= _funcInfo.Parameters.Length - 1 && _funcInfo.HasParamArray) + return _funcInfo.Parameters[_funcInfo.Parameters.Length - 1]; + return _funcInfo.Parameters[index]; + } + + public override IEnumerator Run(Sandbox sb) + { + // Convert arguments to their native types + int paramc = _funcInfo.Parameters.Length; + var args = new object[_argc]; + double d; + RantFunctionParameter p; + for (int i = 0; i < _argc; i++) + { + p = GetParameter(i); + switch (p.RantType) + { + // Patterns are passed right to the method + case RantFunctionParameterType.Pattern: + args[i] = _args[i]; + break; + + // Strings are evaluated + case RantFunctionParameterType.String: + sb.AddOutputWriter(); + yield return _args[i]; + args[i] = sb.Return().Main; + break; + + // Numbers are evaluated, verified, and converted + case RantFunctionParameterType.Number: + { + sb.AddOutputWriter(); + yield return _args[i]; + string strNum = sb.Return().Main; + if (!double.TryParse(strNum, out d)) + { + d = 0; + int n; + if (Util.ParseInt(strNum, out n)) d = n; + } + args[i] = Convert.ChangeType(d, p.NativeType); + break; + } + + // Modes are parsed into enumeration members + case RantFunctionParameterType.Mode: + { + sb.AddOutputWriter(); + yield return _args[i]; + string strMode = sb.Return().Main; + object value; + if (!Util.TryParseEnum(p.NativeType, strMode, out value)) + { + throw new RantRuntimeException(sb.Pattern, _args[i].Location, + $"Unknown mode value '{strMode}'."); + } + args[i] = value; + break; + } + + // Flags are parsed from strings to enum members and combined with OR. + case RantFunctionParameterType.Flags: + { + var enumType = p.NativeType; + sb.AddOutputWriter(); + yield return _args[i]; + long flags = 0; + string strFlags = sb.Return().Main; + object value; + foreach (string flag in strFlags.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) + { + if (!Util.TryParseEnum(enumType, flag, out value)) + { + throw new RantRuntimeException(sb.Pattern, _args[i].Location, + $"Unknown flag value '{flag}'."); + } + flags |= Convert.ToInt64(value); + } + args[i] = Enum.ToObject(enumType, flags); + break; + } + } + } + + // Invoke the function + IEnumerator requester; + if (_funcInfo.HasParamArray) + { + int required = paramc - 1; + int parrayCount = _argc - required; + var parray = Array.CreateInstance(_funcInfo.Parameters[required].NativeType, parrayCount); + Array.Copy(args, required, parray, 0, parrayCount); + requester = _funcInfo.Invoke(sb, args.Take(required).Concat(new[] { parray }).ToArray()); + } + else + requester = _funcInfo.Invoke(sb, args); + + while (requester.MoveNext()) + yield return requester.Current; + } + + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(_argc); + output.Write(_funcInfo.Name); + foreach (var arg in _args) yield return arg; + } + + protected override IEnumerator Deserialize(EasyReader input) + { + input.ReadInt32(out _argc); + string funcName = input.ReadString(); + _funcInfo = RantFunctionRegistry.GetFunction(funcName, _argc); + if (_args == null) _args = new List(_argc); + for (int i = 0; i < _argc; i++) + { + var request = new DeserializeRequest(); + yield return request; + _args.Add(request.Result); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstQuery.cs b/Rant/Core/Compiler/Syntax/RstQuery.cs index 971d16b..b9389a2 100644 --- a/Rant/Core/Compiler/Syntax/RstQuery.cs +++ b/Rant/Core/Compiler/Syntax/RstQuery.cs @@ -32,139 +32,135 @@ namespace Rant.Core.Compiler.Syntax { - [RST("quer")] - internal class RstQuery : RST - { - private Query _query; - - public RstQuery(Query query, LineCol location) - : base(location) - { - _query = query; - } - - public RstQuery(LineCol location) : base(location) - { - // Used by serializer - } - - public override IEnumerator Run(Sandbox sb) - { - if (sb.Engine.Dictionary == null) - { - sb.Print(Txtres.GetString("missing-table")); - yield break; - } - // carrier erase query - if (_query.Name == null) - { - foreach (CarrierComponentType type in Enum.GetValues(typeof(CarrierComponentType))) - foreach (string name in _query.Carrier.GetComponentsOfType(type)) - sb.CarrierState.RemoveType(type, name); - yield break; - } - - var result = sb.Engine.Dictionary.Query(sb, _query, sb.CarrierState); - - if (result == null) - { - sb.Print("[No Match]"); - } - else - { - if (result.IsSplit) - { - if (_query.Complement == null) - { - sb.Print(result.Value.Substring(0, result.ValueSplitIndex)); - sb.Print(' '); - sb.Print(result.Value.Substring(result.ValueSplitIndex)); - } - else if (result.ValueSplitIndex == 0) // Pushes complement to the left of the query result - { - yield return _query.Complement; - sb.Print(' '); - sb.Print(result.Value); - } - else if (result.ValueSplitIndex == result.Value.Length) - { - sb.Print(result.Value); - sb.Print(' '); - yield return _query.Complement; - } - else // Complement goes inside phrase - { - sb.Print(result.Value.Substring(0, result.ValueSplitIndex)); - sb.Print(' '); - yield return _query.Complement; - sb.Print(' '); - sb.Print(result.Value.Substring(result.ValueSplitIndex)); - } - } - else - { - sb.Print(result.Value); - if (_query.Complement != null) - { - sb.Print(' '); // TODO: Pull phrasal separator from format info - yield return _query.Complement; - } - } - } - } - - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(_query.Name); - output.Write(_query.Subtype); - output.Write(_query.Exclusive); - output.Write(_query.FilterCount); - foreach (var filter in _query.GetFilters()) - filter.Serialize(output); - - // Carrier - if (_query.Carrier != null) - { - output.Write(true); - _query.Carrier.Serialize(output); - } - else - { - output.Write(false); - } - - // Complement - yield return _query.Complement; - } - - protected override IEnumerator Deserialize(EasyReader input) - { - _query = new Query(); - - _query.Name = input.ReadString(); - _query.Subtype = input.ReadString(); - _query.Exclusive = input.ReadBoolean(); - - // Read filters - int filterCount = input.ReadInt32(); - for (int i = 0; i < filterCount; i++) - { - var filter = Filter.GetFilterInstance(input.ReadUInt16()); - if (filter == null) continue; - filter.Deserialize(input); - _query.AddFilter(filter); - } - - // Carrier - if (input.ReadBoolean()) - { - _query.Carrier = new Carrier(); - _query.Carrier.Deserialize(input); - } - - var complementRequest = new DeserializeRequest(); - yield return complementRequest; - _query.Complement = complementRequest.Result; - } - } + [RST("quer")] + internal class RstQuery : RST + { + private Query _query; + + public RstQuery(Query query, LineCol location) + : base(location) + { + _query = query; + } + + public RstQuery(LineCol location) : base(location) + { + // Used by serializer + } + + public override IEnumerator Run(Sandbox sb) + { + if (sb.Engine.Dictionary == null) + { + sb.Print(Txtres.GetString("missing-table")); + yield break; + } + // carrier erase query + if (_query.Name == null) + { + foreach (CarrierComponentType type in Enum.GetValues(typeof(CarrierComponentType))) + foreach (string name in _query.Carrier.GetComponentsOfType(type)) + sb.CarrierState.RemoveType(type, name); + yield break; + } + + var result = sb.Engine.Dictionary.Query(sb, _query, sb.CarrierState); + + if (result == null) + sb.Print("[No Match]"); + else + { + if (result.IsSplit) + { + if (_query.Complement == null) + { + sb.Print(result.Value.Substring(0, result.ValueSplitIndex)); + sb.Print(' '); + sb.Print(result.Value.Substring(result.ValueSplitIndex)); + } + else if (result.ValueSplitIndex == 0) // Pushes complement to the left of the query result + { + yield return _query.Complement; + sb.Print(' '); + sb.Print(result.Value); + } + else if (result.ValueSplitIndex == result.Value.Length) + { + sb.Print(result.Value); + sb.Print(' '); + yield return _query.Complement; + } + else // Complement goes inside phrase + { + sb.Print(result.Value.Substring(0, result.ValueSplitIndex)); + sb.Print(' '); + yield return _query.Complement; + sb.Print(' '); + sb.Print(result.Value.Substring(result.ValueSplitIndex)); + } + } + else + { + sb.Print(result.Value); + if (_query.Complement != null) + { + sb.Print(' '); // TODO: Pull phrasal separator from format info + yield return _query.Complement; + } + } + } + } + + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(_query.Name); + output.Write(_query.Subtype); + output.Write(_query.Exclusive); + output.Write(_query.FilterCount); + foreach (var filter in _query.GetFilters()) + filter.Serialize(output); + + // Carrier + if (_query.Carrier != null) + { + output.Write(true); + _query.Carrier.Serialize(output); + } + else + output.Write(false); + + // Complement + yield return _query.Complement; + } + + protected override IEnumerator Deserialize(EasyReader input) + { + _query = new Query(); + + _query.Name = input.ReadString(); + _query.Subtype = input.ReadString(); + _query.Exclusive = input.ReadBoolean(); + + // Read filters + int filterCount = input.ReadInt32(); + for (int i = 0; i < filterCount; i++) + { + var filter = Filter.GetFilterInstance(input.ReadUInt16()); + if (filter == null) continue; + filter.Deserialize(input); + _query.AddFilter(filter); + } + + // Carrier + if (input.ReadBoolean()) + { + _query.Carrier = new Carrier(); + _query.Carrier.Deserialize(input); + } + + var complementRequest = new DeserializeRequest(); + yield return complementRequest; + _query.Complement = complementRequest.Result; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstReplacer.cs b/Rant/Core/Compiler/Syntax/RstReplacer.cs index da04357..722234f 100644 --- a/Rant/Core/Compiler/Syntax/RstReplacer.cs +++ b/Rant/Core/Compiler/Syntax/RstReplacer.cs @@ -30,68 +30,68 @@ namespace Rant.Core.Compiler.Syntax { - /// - /// Replaces text in a pattern output according to a regular expression and evaluator pattern. - /// - [RST("repl")] - internal class RstReplacer : RST - { - private Regex _regex; - private RST _rstMatchEval; - private RST _rstSource; + /// + /// Replaces text in a pattern output according to a regular expression and evaluator pattern. + /// + [RST("repl")] + internal class RstReplacer : RST + { + private Regex _regex; + private RST _rstMatchEval; + private RST _rstSource; - public RstReplacer(LineCol location, Regex regex, RST rstSource, RST rstMatchEval) : base(location) - { - _regex = regex; - _rstSource = rstSource; - _rstMatchEval = rstMatchEval; - } + public RstReplacer(LineCol location, Regex regex, RST rstSource, RST rstMatchEval) : base(location) + { + _regex = regex; + _rstSource = rstSource; + _rstMatchEval = rstMatchEval; + } - public RstReplacer(LineCol location) : base(location) - { - // Used by serializer - } + public RstReplacer(LineCol location) : base(location) + { + // Used by serializer + } - public override IEnumerator Run(Sandbox sb) - { - sb.AddOutputWriter(); - yield return _rstSource; - string input = sb.Return().Main; - var matches = _regex.Matches(input); - int start = 0; - foreach (Match match in matches) - { - sb.RegexMatches.Push(match); - sb.AddOutputWriter(); - yield return _rstMatchEval; - string result = sb.Return().Main; - sb.Print(input.Substring(start, match.Index - start)); - sb.Print(result); - sb.RegexMatches.Pop(); - start = match.Index + match.Length; - } - sb.Print(input.Substring(start, input.Length - start)); - } + public override IEnumerator Run(Sandbox sb) + { + sb.AddOutputWriter(); + yield return _rstSource; + string input = sb.Return().Main; + var matches = _regex.Matches(input); + int start = 0; + foreach (Match match in matches) + { + sb.RegexMatches.Push(match); + sb.AddOutputWriter(); + yield return _rstMatchEval; + string result = sb.Return().Main; + sb.Print(input.Substring(start, match.Index - start)); + sb.Print(result); + sb.RegexMatches.Pop(); + start = match.Index + match.Length; + } + sb.Print(input.Substring(start, input.Length - start)); + } - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write((_regex.Options & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase); // Ignore case? - output.Write(_regex.ToString()); - yield return _rstSource; - yield return _rstMatchEval; - } + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write((_regex.Options & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase); // Ignore case? + output.Write(_regex.ToString()); + yield return _rstSource; + yield return _rstMatchEval; + } - protected override IEnumerator Deserialize(EasyReader input) - { - var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; - if (input.ReadBoolean()) options |= RegexOptions.IgnoreCase; - _regex = new Regex(input.ReadString(), options); - var request = new DeserializeRequest(); - yield return request; - _rstSource = request.Result; - request = new DeserializeRequest(); - yield return request; - _rstMatchEval = request.Result; - } - } + protected override IEnumerator Deserialize(EasyReader input) + { + var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; + if (input.ReadBoolean()) options |= RegexOptions.IgnoreCase; + _regex = new Regex(input.ReadString(), options); + var request = new DeserializeRequest(); + yield return request; + _rstSource = request.Result; + request = new DeserializeRequest(); + yield return request; + _rstMatchEval = request.Result; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstSequence.cs b/Rant/Core/Compiler/Syntax/RstSequence.cs index 29dc1d7..ff64a77 100644 --- a/Rant/Core/Compiler/Syntax/RstSequence.cs +++ b/Rant/Core/Compiler/Syntax/RstSequence.cs @@ -30,46 +30,46 @@ namespace Rant.Core.Compiler.Syntax { - /// - /// Performs a sequence of actions. - /// - [RST("patt")] - internal class RstSequence : RST - { - public RstSequence(List actions, LineCol loc) - : base(actions.Any() ? actions[0].Location : loc) - { - if (actions == null) return; - Actions.AddRange(actions); - } + /// + /// Performs a sequence of actions. + /// + [RST("patt")] + internal class RstSequence : RST + { + public RstSequence(List actions, LineCol loc) + : base(actions.Any() ? actions[0].Location : loc) + { + if (actions == null) return; + Actions.AddRange(actions); + } - public RstSequence(LineCol location) : base(location) - { - // Used by serializer - } + public RstSequence(LineCol location) : base(location) + { + // Used by serializer + } - public List Actions { get; } = new List(); + public List Actions { get; } = new List(); - public override IEnumerator Run(Sandbox sb) - { - return Actions.GetEnumerator(); - } + public override IEnumerator Run(Sandbox sb) + { + return Actions.GetEnumerator(); + } - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(Actions.Count); - foreach (var action in Actions) yield return action; - } + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(Actions.Count); + foreach (var action in Actions) yield return action; + } - protected override IEnumerator Deserialize(EasyReader input) - { - int count = input.ReadInt32(); - for (int i = 0; i < count; i++) - { - var request = new DeserializeRequest(); - yield return request; - Actions.Add(request.Result); - } - } - } + protected override IEnumerator Deserialize(EasyReader input) + { + int count = input.ReadInt32(); + for (int i = 0; i < count; i++) + { + var request = new DeserializeRequest(); + yield return request; + Actions.Add(request.Result); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs b/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs index ffe117e..3213ecf 100644 --- a/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs +++ b/Rant/Core/Compiler/Syntax/RstSubroutineBase.cs @@ -29,34 +29,34 @@ namespace Rant.Core.Compiler.Syntax { - internal abstract class RstSubroutineBase : RST - { - public RST Body; - public string Name; - - public RstSubroutineBase(string name, LineCol location) - : base(location) - { - Name = name; - } - - public RstSubroutineBase(LineCol location) : base(location) - { - // Used by serializer - } - - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(Name); - yield return Body; - } - - protected override IEnumerator Deserialize(EasyReader input) - { - input.ReadString(out Name); - var bodyRequest = new DeserializeRequest(); - yield return bodyRequest; - Body = bodyRequest.Result; - } - } + internal abstract class RstSubroutineBase : RST + { + public RST Body; + public string Name; + + public RstSubroutineBase(string name, LineCol location) + : base(location) + { + Name = name; + } + + public RstSubroutineBase(LineCol location) : base(location) + { + // Used by serializer + } + + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(Name); + yield return Body; + } + + protected override IEnumerator Deserialize(EasyReader input) + { + input.ReadString(out Name); + var bodyRequest = new DeserializeRequest(); + yield return bodyRequest; + Body = bodyRequest.Result; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstText.cs b/Rant/Core/Compiler/Syntax/RstText.cs index 2bda377..5e6e0be 100644 --- a/Rant/Core/Compiler/Syntax/RstText.cs +++ b/Rant/Core/Compiler/Syntax/RstText.cs @@ -29,45 +29,45 @@ namespace Rant.Core.Compiler.Syntax { - /// - /// Prints a string constant to the output. - /// - [RST("text")] - internal class RstText : RST - { - public RstText(string value, LineCol location) : base(location) - { - Text = value ?? string.Empty; - } + /// + /// Prints a string constant to the output. + /// + [RST("text")] + internal class RstText : RST + { + public RstText(string value, LineCol location) : base(location) + { + Text = value ?? string.Empty; + } - public RstText(LineCol location, string text) : base(location) - { - Text = text ?? string.Empty; - } + public RstText(LineCol location, string text) : base(location) + { + Text = text ?? string.Empty; + } - public RstText(LineCol location) : base(location) - { - // Used by serializer - } + public RstText(LineCol location) : base(location) + { + // Used by serializer + } - public string Text { get; set; } + public string Text { get; set; } - public override IEnumerator Run(Sandbox sb) - { - sb.Print(Text); - yield break; - } + public override IEnumerator Run(Sandbox sb) + { + sb.Print(Text); + yield break; + } - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(Text); - yield break; - } + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(Text); + yield break; + } - protected override IEnumerator Deserialize(EasyReader input) - { - Text = input.ReadString(); - yield break; - } - } + protected override IEnumerator Deserialize(EasyReader input) + { + Text = input.ReadString(); + yield break; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Token.cs b/Rant/Core/Compiler/Token.cs index e16fb55..671d9aa 100644 --- a/Rant/Core/Compiler/Token.cs +++ b/Rant/Core/Compiler/Token.cs @@ -27,34 +27,34 @@ namespace Rant.Core.Compiler { - internal struct Token - { - public static readonly Token None = new Token(R.Text, 0, -1, -1, null); - public int Column; - public int Index; - public int Line; - public R Type; - public string Value; + internal struct Token + { + public static readonly Token None = new Token(R.Text, 0, -1, -1, null); + public int Column; + public int Index; + public int Line; + public R Type; + public string Value; - public Token(R type, int line, int lastLineStart, int index, string value) - { - Type = type; - Line = line; - Column = index - lastLineStart + 1; - Index = index; - Value = value; - } + public Token(R type, int line, int lastLineStart, int index, string value) + { + Type = type; + Line = line; + Column = index - lastLineStart + 1; + Index = index; + Value = value; + } - public Token(R type, int line, int lastLineStart, int index, char value) - { - Type = type; - Line = line; - Column = index - lastLineStart + 1; - Index = index; - Value = value.ToString(CultureInfo.InvariantCulture); - } + public Token(R type, int line, int lastLineStart, int index, char value) + { + Type = type; + Line = line; + Column = index - lastLineStart + 1; + Index = index; + Value = value.ToString(CultureInfo.InvariantCulture); + } - public int Length => Value?.Length ?? 0; - public LineCol ToLocation() => new LineCol(Line, Column, Index); - } + public int Length => Value?.Length ?? 0; + public LineCol ToLocation() => new LineCol(Line, Column, Index); + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/TokenReader.cs b/Rant/Core/Compiler/TokenReader.cs index 34b670b..7e8506f 100644 --- a/Rant/Core/Compiler/TokenReader.cs +++ b/Rant/Core/Compiler/TokenReader.cs @@ -31,477 +31,477 @@ namespace Rant.Core.Compiler { - internal class TokenReader - { - private readonly RantCompiler _compiler; - private readonly Token[] _tokens; - - public TokenReader(string sourceName, IEnumerable tokens, RantCompiler compiler) - { - SourceName = sourceName; - _compiler = compiler; - _tokens = tokens.ToArray(); - Position = 0; - } - - public string SourceName { get; } - public int Position { get; set; } - - /// - /// Determines whether the reader has reached the end of the token stream. - /// - public bool End => Position >= _tokens.Length; - - /// - /// The last token that was read. - /// - public Token PrevToken => Position == 0 ? Token.None : _tokens[Position - 1]; - - public LineCol BaseLocation => _tokens.Length > 0 ? _tokens[0].ToLocation() : new LineCol(1, 1, 0); - - /// - /// The last non-whitespace token before the current reader position. - /// - public Token PrevLooseToken - { - get - { - if (Position == 0) return Token.None; - int tempPos = Position - 1; - while (tempPos > 0 && _tokens[tempPos].Type == R.Whitespace) - tempPos--; - return _tokens[tempPos].Type != R.Whitespace ? _tokens[tempPos] : Token.None; - } - } - - /// - /// The last non-whitespace token type. - /// - public R LastNonSpaceType - { - get - { - if (Position == 0) return R.EOF; - R Type; - for (int i = Position; i >= 0; i--) - if ((Type = _tokens[i].Type) != R.Whitespace) return Type; - return R.EOF; - } - } - - public Token this[int pos] => _tokens[pos]; - - /// - /// Reads the next available token. - /// - /// - public Token ReadToken() - { - if (End) - { - _compiler.SyntaxError(Token.None, true, GetString("err-compiler-eof")); - return Token.None; - } - return _tokens[Position++]; - } - - /// - /// Returns the next available token, but does not consume it. - /// - /// - public Token PeekToken() - { - return End ? Token.None : _tokens[Position]; - } - - /// - /// Returns the next available non-whitespace token, but does not consume it. - /// - /// - public Token PeekLooseToken() - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return Token.None; - } - int pos = Position; - SkipSpace(); - var token = _tokens[Position]; - Position = pos; - return token; - } - - /// - /// Returns the type of the next available token. - /// - /// - public R PeekType() => End ? R.EOF : _tokens[Position].Type; - - /// - /// Determines whether the next token is of the specified type. - /// - /// The type to check for. - /// - public bool IsNext(R type) - { - return !End && _tokens[Position].Type == type; - } - - /// - /// Consumes the next token if its type matches the specified type. Returns true if it matches. - /// - /// The type to consume. - /// Allow end-of-file tokens. Specifying False will throw an exception instead. - /// - public bool Take(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - if (_tokens[Position].Type != type) return false; - Position++; - return true; - } - - /// - /// Consumes the next non-whitespace token if its type matches the specified type. Returns true if it matches. - /// - /// The type to consume. - /// Allow end-of-file tokens. Specifying False will throw an exception instead. - /// - public bool TakeLoose(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - SkipSpace(); - if (_tokens[Position].Type != type) return false; - Position++; - SkipSpace(); - return true; - } - - /// - /// Consumes the next token if its type matches any of the specified types. Returns true if a match was found. - /// - /// The types to consume. - /// - public bool TakeAny(params R[] types) - { - if (End) return false; - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - Position++; - return true; - } - return false; - } - - /// - /// Consumes the next token if its type matches any of the specified types, and outputs the matching type. Returns true if - /// a match was found. - /// - /// The matched type. - /// The types to consume. - /// - public bool TakeAny(out R result, params R[] types) - { - result = default(R); - if (End) return false; - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - result = type; - Position++; - return true; - } - return false; - } - - /// - /// Consumes the next non-whitespace token if its type matches any of the specified types. Returns true if a match was - /// found. - /// - /// The types to consume. - /// - public bool TakeAnyLoose(params R[] types) - { - if (End) return false; - SkipSpace(); - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - Position++; - SkipSpace(); - return true; - } - return false; - } - - /// - /// Consumes the next non-whitespace token if its type matches any of the specified types, and outputs the matching type. - /// Returns true if a match was found. - /// - /// The matched type. - /// The types to consume. - /// - public bool TakeAnyLoose(out R result, params R[] types) - { - result = default(R); - if (End) return false; - SkipSpace(); - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - result = type; - Position++; - SkipSpace(); - return true; - } - return false; - } - - /// - /// Consumes as many tokens as possible, as long as they match the specified type. Returns true if at least one was found. - /// - /// The type to consume. - /// Allow end-of-file tokens. Specifying False will throw an exception instead. - /// - public bool TakeAll(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - if (_tokens[Position].Type != type) return false; - do - { - Position++; - } while (!End && _tokens[Position].Type == type); - return true; - } - - /// - /// Consumes as many non-whitespace tokens as possible, as long as they match the specified type. Returns true if at least - /// one was found. - /// - /// The type to consume. - /// Allow end-of-file tokens. Specifying False will throw an exception instead. - /// - public bool TakeAllLoose(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - SkipSpace(); - if (_tokens[Position].Type != type) return false; - do - { - SkipSpace(); - Position++; - } while (!End && _tokens[Position].Type == type); - return true; - } - - /// - /// Reads and returns the next token if its type matches the specified type. - /// If it does not match, a RantCompilerException is thrown with the expected token name. - /// - /// The token type to read. - /// A display name describing what the token is for. - /// - public Token Read(R type, string expectedTokenName = null) - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - if (_tokens[Position].Type != type) - { - _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - return _tokens[Position++]; - } - - /// - /// Reads and returns the next token if its type matches any of the given types - /// If it does not match, a RantCompilerException is thrown with the expected token names. - /// - /// The token types accepted for the read token. - /// - public Token ReadAny(params R[] types) - { - if (End) - { - _compiler.SyntaxError(Token.None, true, - "err-compiler-missing-token-any-eof", - string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); - return Token.None; - } - - if (!types.Contains(_tokens[Position].Type)) // NOTE: .Contains isn't too fast but does it matter in this case? - { - _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token-any", - string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); - return Token.None; - } - - return _tokens[Position++]; - } - - /// - /// Reads and returns the next non-whitespace token if its type matches the specified type. - /// If it does not match, a RantCompilerException is thrown with the expected token name. - /// - /// The token type to read. - /// A display name describing what the token is for. - /// - public Token ReadLoose(R type, string expectedTokenName = null) - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - SkipSpace(); - if (_tokens[Position].Type != type) - { - _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - var t = _tokens[Position++]; - SkipSpace(); - return t; - } - - /// - /// Reads a series of tokens into a buffer as long as they match the types specified in an array, in the order they appear. - /// Returns True if reading was successful. - /// - /// The buffer to read into. - /// The offset at which to begin writing tokens into the buffer. - /// The required types. - /// - public bool TakeSeries(Token[] buffer, int offset, params R[] types) - { - if (Position >= _tokens.Length) return types.Length == 0; - if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) - return false; - for (int i = 0; i < types.Length; i++) - { - if (_tokens[Position + i].Type != types[i]) return false; - buffer[i + offset] = _tokens[Position + i]; - } - Position += types.Length; - return true; - } - - /// - /// Reads a series of non-whitespace tokens into a buffer as long as they match the types specified in an array, in the - /// order they appear. Returns True if reading was successful. - /// - /// The buffer to read into. - /// The offset at which to begin writing tokens into the buffer. - /// The required types. - /// - public bool TakeSeriesLoose(Token[] buffer, int offset, params R[] types) - { - if (Position >= _tokens.Length) return types.Length == 0; - if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) - return false; - int i = 0; - int j = 0; - while (i < types.Length) - { - if (Position + j >= _tokens.Length) return false; - while (_tokens[Position + j].Type == R.Whitespace) j++; - if (Position + j >= _tokens.Length) return false; - - if (_tokens[Position + j].Type != types[i]) return false; - buffer[i + offset] = _tokens[Position + i]; - j++; - i++; - } - Position += j; - return true; - } - - /// - /// Reads and returns the next non-whitespace token. - /// - /// - public Token ReadLooseToken() - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return Token.None; - } - SkipSpace(); - var token = _tokens[Position++]; - //SkipSpace(); - return token; - } - - /// - /// Consumes as many token as possible while they satisfy the specified predicate. - /// - /// The predicate to test tokens with. - /// Allow end-of-file tokens. Specifying False will throw an exception instead. - /// - public bool TakeAllWhile(Func predicate, bool allowEof = true) - { - if (predicate == null) throw new ArgumentNullException(nameof(predicate)); - if (End) - { - if (!allowEof) - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - - int i = Position; - Token t; - while (Position < _tokens.Length) - { - t = _tokens[Position]; - if (!predicate(t)) - return Position > i; - Position++; - } - return true; - } - - public bool SkipSpace() => TakeAll(R.Whitespace); - } + internal class TokenReader + { + private readonly RantCompiler _compiler; + private readonly Token[] _tokens; + + public TokenReader(string sourceName, IEnumerable tokens, RantCompiler compiler) + { + SourceName = sourceName; + _compiler = compiler; + _tokens = tokens.ToArray(); + Position = 0; + } + + public string SourceName { get; } + public int Position { get; set; } + + /// + /// Determines whether the reader has reached the end of the token stream. + /// + public bool End => Position >= _tokens.Length; + + /// + /// The last token that was read. + /// + public Token PrevToken => Position == 0 ? Token.None : _tokens[Position - 1]; + + public LineCol BaseLocation => _tokens.Length > 0 ? _tokens[0].ToLocation() : new LineCol(1, 1, 0); + + /// + /// The last non-whitespace token before the current reader position. + /// + public Token PrevLooseToken + { + get + { + if (Position == 0) return Token.None; + int tempPos = Position - 1; + while (tempPos > 0 && _tokens[tempPos].Type == R.Whitespace) + tempPos--; + return _tokens[tempPos].Type != R.Whitespace ? _tokens[tempPos] : Token.None; + } + } + + /// + /// The last non-whitespace token type. + /// + public R LastNonSpaceType + { + get + { + if (Position == 0) return R.EOF; + R Type; + for (int i = Position; i >= 0; i--) + if ((Type = _tokens[i].Type) != R.Whitespace) return Type; + return R.EOF; + } + } + + public Token this[int pos] => _tokens[pos]; + + /// + /// Reads the next available token. + /// + /// + public Token ReadToken() + { + if (End) + { + _compiler.SyntaxError(Token.None, true, GetString("err-compiler-eof")); + return Token.None; + } + return _tokens[Position++]; + } + + /// + /// Returns the next available token, but does not consume it. + /// + /// + public Token PeekToken() + { + return End ? Token.None : _tokens[Position]; + } + + /// + /// Returns the next available non-whitespace token, but does not consume it. + /// + /// + public Token PeekLooseToken() + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return Token.None; + } + int pos = Position; + SkipSpace(); + var token = _tokens[Position]; + Position = pos; + return token; + } + + /// + /// Returns the type of the next available token. + /// + /// + public R PeekType() => End ? R.EOF : _tokens[Position].Type; + + /// + /// Determines whether the next token is of the specified type. + /// + /// The type to check for. + /// + public bool IsNext(R type) + { + return !End && _tokens[Position].Type == type; + } + + /// + /// Consumes the next token if its type matches the specified type. Returns true if it matches. + /// + /// The type to consume. + /// Allow end-of-file tokens. Specifying False will throw an exception instead. + /// + public bool Take(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + if (_tokens[Position].Type != type) return false; + Position++; + return true; + } + + /// + /// Consumes the next non-whitespace token if its type matches the specified type. Returns true if it matches. + /// + /// The type to consume. + /// Allow end-of-file tokens. Specifying False will throw an exception instead. + /// + public bool TakeLoose(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + SkipSpace(); + if (_tokens[Position].Type != type) return false; + Position++; + SkipSpace(); + return true; + } + + /// + /// Consumes the next token if its type matches any of the specified types. Returns true if a match was found. + /// + /// The types to consume. + /// + public bool TakeAny(params R[] types) + { + if (End) return false; + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + Position++; + return true; + } + return false; + } + + /// + /// Consumes the next token if its type matches any of the specified types, and outputs the matching type. Returns true if + /// a match was found. + /// + /// The matched type. + /// The types to consume. + /// + public bool TakeAny(out R result, params R[] types) + { + result = default(R); + if (End) return false; + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + result = type; + Position++; + return true; + } + return false; + } + + /// + /// Consumes the next non-whitespace token if its type matches any of the specified types. Returns true if a match was + /// found. + /// + /// The types to consume. + /// + public bool TakeAnyLoose(params R[] types) + { + if (End) return false; + SkipSpace(); + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + Position++; + SkipSpace(); + return true; + } + return false; + } + + /// + /// Consumes the next non-whitespace token if its type matches any of the specified types, and outputs the matching type. + /// Returns true if a match was found. + /// + /// The matched type. + /// The types to consume. + /// + public bool TakeAnyLoose(out R result, params R[] types) + { + result = default(R); + if (End) return false; + SkipSpace(); + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + result = type; + Position++; + SkipSpace(); + return true; + } + return false; + } + + /// + /// Consumes as many tokens as possible, as long as they match the specified type. Returns true if at least one was found. + /// + /// The type to consume. + /// Allow end-of-file tokens. Specifying False will throw an exception instead. + /// + public bool TakeAll(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + if (_tokens[Position].Type != type) return false; + do + { + Position++; + } while (!End && _tokens[Position].Type == type); + return true; + } + + /// + /// Consumes as many non-whitespace tokens as possible, as long as they match the specified type. Returns true if at least + /// one was found. + /// + /// The type to consume. + /// Allow end-of-file tokens. Specifying False will throw an exception instead. + /// + public bool TakeAllLoose(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + SkipSpace(); + if (_tokens[Position].Type != type) return false; + do + { + SkipSpace(); + Position++; + } while (!End && _tokens[Position].Type == type); + return true; + } + + /// + /// Reads and returns the next token if its type matches the specified type. + /// If it does not match, a RantCompilerException is thrown with the expected token name. + /// + /// The token type to read. + /// A display name describing what the token is for. + /// + public Token Read(R type, string expectedTokenName = null) + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + if (_tokens[Position].Type != type) + { + _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + return _tokens[Position++]; + } + + /// + /// Reads and returns the next token if its type matches any of the given types + /// If it does not match, a RantCompilerException is thrown with the expected token names. + /// + /// The token types accepted for the read token. + /// + public Token ReadAny(params R[] types) + { + if (End) + { + _compiler.SyntaxError(Token.None, true, + "err-compiler-missing-token-any-eof", + string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); + return Token.None; + } + + if (!types.Contains(_tokens[Position].Type)) // NOTE: .Contains isn't too fast but does it matter in this case? + { + _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token-any", + string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); + return Token.None; + } + + return _tokens[Position++]; + } + + /// + /// Reads and returns the next non-whitespace token if its type matches the specified type. + /// If it does not match, a RantCompilerException is thrown with the expected token name. + /// + /// The token type to read. + /// A display name describing what the token is for. + /// + public Token ReadLoose(R type, string expectedTokenName = null) + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + SkipSpace(); + if (_tokens[Position].Type != type) + { + _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + var t = _tokens[Position++]; + SkipSpace(); + return t; + } + + /// + /// Reads a series of tokens into a buffer as long as they match the types specified in an array, in the order they appear. + /// Returns True if reading was successful. + /// + /// The buffer to read into. + /// The offset at which to begin writing tokens into the buffer. + /// The required types. + /// + public bool TakeSeries(Token[] buffer, int offset, params R[] types) + { + if (Position >= _tokens.Length) return types.Length == 0; + if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) + return false; + for (int i = 0; i < types.Length; i++) + { + if (_tokens[Position + i].Type != types[i]) return false; + buffer[i + offset] = _tokens[Position + i]; + } + Position += types.Length; + return true; + } + + /// + /// Reads a series of non-whitespace tokens into a buffer as long as they match the types specified in an array, in the + /// order they appear. Returns True if reading was successful. + /// + /// The buffer to read into. + /// The offset at which to begin writing tokens into the buffer. + /// The required types. + /// + public bool TakeSeriesLoose(Token[] buffer, int offset, params R[] types) + { + if (Position >= _tokens.Length) return types.Length == 0; + if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) + return false; + int i = 0; + int j = 0; + while (i < types.Length) + { + if (Position + j >= _tokens.Length) return false; + while (_tokens[Position + j].Type == R.Whitespace) j++; + if (Position + j >= _tokens.Length) return false; + + if (_tokens[Position + j].Type != types[i]) return false; + buffer[i + offset] = _tokens[Position + i]; + j++; + i++; + } + Position += j; + return true; + } + + /// + /// Reads and returns the next non-whitespace token. + /// + /// + public Token ReadLooseToken() + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return Token.None; + } + SkipSpace(); + var token = _tokens[Position++]; + //SkipSpace(); + return token; + } + + /// + /// Consumes as many token as possible while they satisfy the specified predicate. + /// + /// The predicate to test tokens with. + /// Allow end-of-file tokens. Specifying False will throw an exception instead. + /// + public bool TakeAllWhile(Func predicate, bool allowEof = true) + { + if (predicate == null) throw new ArgumentNullException(nameof(predicate)); + if (End) + { + if (!allowEof) + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + + int i = Position; + Token t; + while (Position < _tokens.Length) + { + t = _tokens[Position]; + if (!predicate(t)) + return Position > i; + Position++; + } + return true; + } + + public bool SkipSpace() => TakeAll(R.Whitespace); + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/AttribPersistence.cs b/Rant/Core/Constructs/AttribPersistence.cs index d2b452c..8cf20a3 100644 --- a/Rant/Core/Constructs/AttribPersistence.cs +++ b/Rant/Core/Constructs/AttribPersistence.cs @@ -25,52 +25,52 @@ namespace Rant.Core.Constructs { - /// - /// Defines persistence modes for block attributes. - /// - internal enum AttribPersistence - { - /// - /// The next block consumes attributes immediately. - /// - Off, + /// + /// Defines persistence modes for block attributes. + /// + internal enum AttribPersistence + { + /// + /// The next block consumes attributes immediately. + /// + Off, - /// - /// The next block consumes attributes and restores them when finished. - /// - Outer, + /// + /// The next block consumes attributes and restores them when finished. + /// + Outer, - /// - /// The next block uses but does not consume attributes. - /// They are inherited by and restored at the end of each child block. - /// - OuterShared, + /// + /// The next block uses but does not consume attributes. + /// They are inherited by and restored at the end of each child block. + /// + OuterShared, - /// - /// The current attributes are inherited by all blocks inside the current block. - /// They are consumed at the end of the block. - /// - Inner, + /// + /// The current attributes are inherited by all blocks inside the current block. + /// They are consumed at the end of the block. + /// + Inner, - /// - /// The current attributes are inherited by all blocks inside the current block, as well as their children. - /// They are consumed at the end of the block. - /// - InnerShared, + /// + /// The current attributes are inherited by all blocks inside the current block, as well as their children. + /// They are consumed at the end of the block. + /// + InnerShared, - /// - /// Disable changes to the current block attributes until the persistence mode is changed. - /// - ReadOnly, + /// + /// Disable changes to the current block attributes until the persistence mode is changed. + /// + ReadOnly, - /// - /// Attributes will persist over the next block, but any block after or inside it will consume them. - /// - Once, + /// + /// Attributes will persist over the next block, but any block after or inside it will consume them. + /// + Once, - /// - /// The next block uses but does not consume attributes. This also affects child blocks. - /// - On - } + /// + /// The next block uses but does not consume attributes. This also affects child blocks. + /// + On + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/BlockAttribs.cs b/Rant/Core/Constructs/BlockAttribs.cs index 534f500..9b50aeb 100644 --- a/Rant/Core/Constructs/BlockAttribs.cs +++ b/Rant/Core/Constructs/BlockAttribs.cs @@ -27,65 +27,65 @@ namespace Rant.Core.Constructs { - internal class BlockAttribs - { - private int _reps = 1; + internal class BlockAttribs + { + private int _reps = 1; - public int Repetitions - { - get { return _reps; } - set - { - _reps = value; - RepEach = false; - } - } + public int Repetitions + { + get { return _reps; } + set + { + _reps = value; + RepEach = false; + } + } - public int StartIndex { get; set; } = -1; - public bool IsSeries { get; set; } - public bool RepEach { get; set; } - public RST Separator { get; set; } - public RST EndSeparator { get; set; } - public RST EndConjunction { get; set; } - public RST Start { get; set; } - public RST Before { get; set; } - public RST After { get; set; } - public RST End { get; set; } - public Synchronizer Sync { get; set; } - public double Chance { get; set; } = 100.0; - public AttribPersistence Persistence { get; set; } = AttribPersistence.Off; + public int StartIndex { get; set; } = -1; + public bool IsSeries { get; set; } + public bool RepEach { get; set; } + public RST Separator { get; set; } + public RST EndSeparator { get; set; } + public RST EndConjunction { get; set; } + public RST Start { get; set; } + public RST Before { get; set; } + public RST After { get; set; } + public RST End { get; set; } + public Synchronizer Sync { get; set; } + public double Chance { get; set; } = 100.0; + public AttribPersistence Persistence { get; set; } = AttribPersistence.Off; - public void SetDefaults() - { - Repetitions = 1; - StartIndex = -1; - RepEach = false; - IsSeries = false; - Chance = 100; - Separator = null; - EndSeparator = null; - EndConjunction = null; - Before = null; - After = null; - Sync = null; - Start = null; - End = null; - Persistence = AttribPersistence.Off; - } + public void SetDefaults() + { + Repetitions = 1; + StartIndex = -1; + RepEach = false; + IsSeries = false; + Chance = 100; + Separator = null; + EndSeparator = null; + EndConjunction = null; + Before = null; + After = null; + Sync = null; + Start = null; + End = null; + Persistence = AttribPersistence.Off; + } - /// - /// Calculates the index of the next block item to execute. - /// - /// The number of items in the block. - /// The random number generator to use with index calculation. - /// - public int NextIndex(int blockItemCount, RNG rng) - { - // Use synchronizer if available - if (Sync != null) - return Sync.NextItem(blockItemCount); + /// + /// Calculates the index of the next block item to execute. + /// + /// The number of items in the block. + /// The random number generator to use with index calculation. + /// + public int NextIndex(int blockItemCount, RNG rng) + { + // Use synchronizer if available + if (Sync != null) + return Sync.NextItem(blockItemCount); - return rng.Next(blockItemCount); - } - } + return rng.Next(blockItemCount); + } + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/BlockManager.cs b/Rant/Core/Constructs/BlockManager.cs index b690efa..8eea27f 100644 --- a/Rant/Core/Constructs/BlockManager.cs +++ b/Rant/Core/Constructs/BlockManager.cs @@ -31,63 +31,63 @@ namespace Rant.Core.Constructs { - internal class BlockManager - { - private readonly Dictionary> _blockList; - private BlockAttribs _prevAttribs; - private int _prevCount = 0; - - public BlockManager() - { - _blockList = new Dictionary>(); - } - - public BlockAttribs SetPrevAttribs(BlockAttribs attribs) - { - _prevAttribs = attribs; - return attribs; - } - - public BlockAttribs GetPrevious(int repeatMaximum) - { - if (repeatMaximum < 0) return _prevAttribs; - - if (_prevCount < repeatMaximum - 1) - { - _prevCount += 1; - return _prevAttribs; - } - _prevCount = 0; - return new BlockAttribs(); - } - - public void Add(BlockAttribs attribs, RstBlock block) - { - if (!_blockList.ContainsKey(attribs)) - _blockList.Add(attribs, new List { block }); - else - _blockList[attribs].Add(block); - } - - public void RemoveAttribs(BlockAttribs attribs) - { - if (!_blockList.ContainsKey(attribs)) - throw new InvalidOperationException("Attribs don't exist"); - - _blockList.Remove(attribs); - } - - public void RemoveBlock(BlockAttribs attribs, RstBlock block) - { - if (!_blockList.ContainsKey(attribs)) - throw new InvalidOperationException("Attribs don't exist"); - - if (!_blockList[attribs].Contains(block)) - throw new InvalidOperationException("Block doesn't exist"); - - _blockList[attribs].Remove(block); - } - - public BlockAttribs GetAttribs(RstBlock block) => _blockList.Single(p => p.Value.Contains(block)).Key; - } + internal class BlockManager + { + private readonly Dictionary> _blockList; + private BlockAttribs _prevAttribs; + private int _prevCount = 0; + + public BlockManager() + { + _blockList = new Dictionary>(); + } + + public BlockAttribs SetPrevAttribs(BlockAttribs attribs) + { + _prevAttribs = attribs; + return attribs; + } + + public BlockAttribs GetPrevious(int repeatMaximum) + { + if (repeatMaximum < 0) return _prevAttribs; + + if (_prevCount < repeatMaximum - 1) + { + _prevCount += 1; + return _prevAttribs; + } + _prevCount = 0; + return new BlockAttribs(); + } + + public void Add(BlockAttribs attribs, RstBlock block) + { + if (!_blockList.ContainsKey(attribs)) + _blockList.Add(attribs, new List { block }); + else + _blockList[attribs].Add(block); + } + + public void RemoveAttribs(BlockAttribs attribs) + { + if (!_blockList.ContainsKey(attribs)) + throw new InvalidOperationException("Attribs don't exist"); + + _blockList.Remove(attribs); + } + + public void RemoveBlock(BlockAttribs attribs, RstBlock block) + { + if (!_blockList.ContainsKey(attribs)) + throw new InvalidOperationException("Attribs don't exist"); + + if (!_blockList[attribs].Contains(block)) + throw new InvalidOperationException("Block doesn't exist"); + + _blockList[attribs].Remove(block); + } + + public BlockAttribs GetAttribs(RstBlock block) => _blockList.Single(p => p.Value.Contains(block)).Key; + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/BlockState.cs b/Rant/Core/Constructs/BlockState.cs index a509398..c2d0bff 100644 --- a/Rant/Core/Constructs/BlockState.cs +++ b/Rant/Core/Constructs/BlockState.cs @@ -25,24 +25,24 @@ namespace Rant.Core.Constructs { - /// - /// Supplies state information about an active block, such as the iteration, item count, and current index. - /// - internal class BlockState - { - public BlockState(int count) - { - Count = count; - } + /// + /// Supplies state information about an active block, such as the iteration, item count, and current index. + /// + internal class BlockState + { + public BlockState(int count) + { + Count = count; + } - public int Count { get; } - public int Iteration { get; private set; } - public int Index { get; private set; } + public int Count { get; } + public int Iteration { get; private set; } + public int Index { get; private set; } - public void Next(int index) - { - Index = index; - Iteration++; - } - } + public void Next(int index) + { + Index = index; + Iteration++; + } + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/Comparison.cs b/Rant/Core/Constructs/Comparison.cs index 413cac7..c8d1357 100644 --- a/Rant/Core/Constructs/Comparison.cs +++ b/Rant/Core/Constructs/Comparison.cs @@ -29,42 +29,42 @@ namespace Rant.Core.Constructs { - internal class Comparison - { - public Comparison(string a, string b) - { - A = a; - B = b; - double na, nb; - if (!double.TryParse(a, out na)) na = double.NaN; - if (!double.TryParse(b, out nb)) nb = double.NaN; - bool ba = Util.BooleanRep(a); - bool bb = Util.BooleanRep(b); + internal class Comparison + { + public Comparison(string a, string b) + { + A = a; + B = b; + double na, nb; + if (!double.TryParse(a, out na)) na = double.NaN; + if (!double.TryParse(b, out nb)) nb = double.NaN; + bool ba = Util.BooleanRep(a); + bool bb = Util.BooleanRep(b); - Result |= a == b ? ComparisonResult.Equal : ComparisonResult.NotEqual; + Result |= a == b ? ComparisonResult.Equal : ComparisonResult.NotEqual; - Result |= ba && bb ? ComparisonResult.All : ba || bb ? ComparisonResult.Any : ComparisonResult.None; - if (ba != bb) Result |= ComparisonResult.One; - if (na < nb) Result |= ComparisonResult.Less; - if (na > nb) Result |= ComparisonResult.Greater; - } + Result |= ba && bb ? ComparisonResult.All : ba || bb ? ComparisonResult.Any : ComparisonResult.None; + if (ba != bb) Result |= ComparisonResult.One; + if (na < nb) Result |= ComparisonResult.Less; + if (na > nb) Result |= ComparisonResult.Greater; + } - public ComparisonResult Result { get; } - public string A { get; } - public string B { get; } - } + public ComparisonResult Result { get; } + public string A { get; } + public string B { get; } + } - [Flags] - internal enum ComparisonResult - { - NotEqual = 0x01, - Different = NotEqual, - Equal = 0x02, - Less = 0x04, - Greater = 0x08, - All = 0x10, - Any = 0x20, - One = 0x40, - None = 0x80 - } + [Flags] + internal enum ComparisonResult + { + NotEqual = 0x01, + Different = NotEqual, + Equal = 0x02, + Less = 0x04, + Greater = 0x08, + All = 0x10, + Any = 0x20, + One = 0x40, + None = 0x80 + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/SyncManager.cs b/Rant/Core/Constructs/SyncManager.cs index d93f31b..a11b019 100644 --- a/Rant/Core/Constructs/SyncManager.cs +++ b/Rant/Core/Constructs/SyncManager.cs @@ -27,68 +27,70 @@ namespace Rant.Core.Constructs { - internal class SyncManager - { - private readonly HashSet _pinQueue = new HashSet(); - private readonly Sandbox _sb; + internal class SyncManager + { + private readonly HashSet _pinQueue = new HashSet(); + private readonly Sandbox _sb; - private readonly Dictionary _syncTable = - new Dictionary(); + private readonly Dictionary _syncTable = + new Dictionary(); - public SyncManager(Sandbox sb) - { - _sb = sb; - } + public SyncManager(Sandbox sb) + { + _sb = sb; + } - public Synchronizer this[string name] - { - get { return _syncTable[name]; } - } + public Synchronizer this[string name] + { + get { return _syncTable[name]; } + } - public bool SynchronizerExists(string name) => _syncTable.ContainsKey(name); + public bool SynchronizerExists(string name) => _syncTable.ContainsKey(name); - public void Create(string name, SyncType type, bool apply) - { - Synchronizer sync; - if (!_syncTable.TryGetValue(name, out sync)) - sync = _syncTable[name] = - new Synchronizer(type, _sb.RNG.NextRaw()) - { - Pinned = _pinQueue.Remove(name) - }; - if (apply) _sb.CurrentBlockAttribs.Sync = sync; - } + public void Create(string name, SyncType type, bool apply) + { + Synchronizer sync; + if (!_syncTable.TryGetValue(name, out sync)) + { + sync = _syncTable[name] = + new Synchronizer(type, _sb.RNG.NextRaw()) + { + Pinned = _pinQueue.Remove(name) + }; + } + if (apply) _sb.CurrentBlockAttribs.Sync = sync; + } - public void Apply(string name) - { - Synchronizer sync; - if (_syncTable.TryGetValue(name, out sync)) - _sb.CurrentBlockAttribs.Sync = sync; - } + public void Apply(string name) + { + Synchronizer sync; + if (_syncTable.TryGetValue(name, out sync)) + _sb.CurrentBlockAttribs.Sync = sync; + } - public void SetPinned(string name, bool isPinned) - { - Synchronizer sync; - if (_syncTable.TryGetValue(name, out sync)) - sync.Pinned = isPinned; - else if (isPinned) - _pinQueue.Add(name); - else - _pinQueue.Remove(name); - } + public void SetPinned(string name, bool isPinned) + { + Synchronizer sync; + if (_syncTable.TryGetValue(name, out sync)) + sync.Pinned = isPinned; + else if (isPinned) + _pinQueue.Add(name); + else + _pinQueue.Remove(name); + } - public void Step(string name) - { - Synchronizer sync; - if (_syncTable.TryGetValue(name, out sync)) - sync.Step(true); - } + public void Step(string name) + { + Synchronizer sync; + if (_syncTable.TryGetValue(name, out sync)) + sync.Step(true); + } - public void Reset(string name) - { - Synchronizer sync; - if (_syncTable.TryGetValue(name, out sync)) - sync.Reset(); - } - } + public void Reset(string name) + { + Synchronizer sync; + if (_syncTable.TryGetValue(name, out sync)) + sync.Reset(); + } + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/SyncType.cs b/Rant/Core/Constructs/SyncType.cs index 3a1b849..c2cc9fb 100644 --- a/Rant/Core/Constructs/SyncType.cs +++ b/Rant/Core/Constructs/SyncType.cs @@ -27,33 +27,33 @@ namespace Rant.Core.Constructs { - internal enum SyncType - { - [RantDescription("A random element is selected each time.")] - None, - - [RantDescription("Executes from left to right.")] - Forward, - - [RantDescription("Executes from right to left.")] - Reverse, - //[RantDescription("Executes from left to right, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] - //ForwardSkip, - //[RantDescription("Executes from right to left, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] - //ReverseSkip, - [RantDescription("Shuffles items and executes in order. Re-shuffled each time all items are used up.")] - Deck, - - [RantDescription("Shuffles items and executes in order. The same order is reused for each traversal.")] - Cdeck, - - [RantDescription("Chosen randomly, the same element is selected each time.")] - Locked, - - [RantDescription("Starting at the first item, iterates through all elements in order and then reverses without repeating boundary elements.")] - Ping, - - [RantDescription("Starting at the last item, iterates through all elements backwards and then reverses without repeating boundary elements.")] - Pong - } + internal enum SyncType + { + [RantDescription("A random element is selected each time.")] + None, + + [RantDescription("Executes from left to right.")] + Forward, + + [RantDescription("Executes from right to left.")] + Reverse, + //[RantDescription("Executes from left to right, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] + //ForwardSkip, + //[RantDescription("Executes from right to left, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] + //ReverseSkip, + [RantDescription("Shuffles items and executes in order. Re-shuffled each time all items are used up.")] + Deck, + + [RantDescription("Shuffles items and executes in order. The same order is reused for each traversal.")] + Cdeck, + + [RantDescription("Chosen randomly, the same element is selected each time.")] + Locked, + + [RantDescription("Starting at the first item, iterates through all elements in order and then reverses without repeating boundary elements.")] + Ping, + + [RantDescription("Starting at the last item, iterates through all elements backwards and then reverses without repeating boundary elements.")] + Pong + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/Synchronizer.cs b/Rant/Core/Constructs/Synchronizer.cs index 9e210cb..8ed4017 100644 --- a/Rant/Core/Constructs/Synchronizer.cs +++ b/Rant/Core/Constructs/Synchronizer.cs @@ -29,141 +29,143 @@ namespace Rant.Core.Constructs { - internal class Synchronizer - { - private readonly RNG _rng; - private bool _bounce; - private int[] _state; - - public Synchronizer(SyncType type, long seed) - { - Type = type; - _rng = new RNG(seed); - Index = 0; - _state = null; - Pinned = false; - } - - public bool Pinned { get; set; } - public SyncType Type { get; set; } - public int Index { get; set; } - - public void Reset() - { - _rng.Reset(); - Index = 0; - if (_state == null) return; - FillSlots(); - } - - public void Reseed(string id) - { - _rng.Reset(id.Hash()); - Index = 0; - if (_state == null) return; - FillSlots(); - } - - public int NextItem(int count) - { - if (_state == null) - { - _state = new int[count]; - FillSlots(); - } - else if (count != _state.Length) - { - Array.Resize(ref _state, count); - FillSlots(); - } - - return Step(false); - } - - public int Step(bool force) - { - if (Type == SyncType.Locked) return _state[0]; - if (Index >= _state.Length) - switch (Type) - { - case SyncType.Deck: - ScrambleSlots(); - goto default; - case SyncType.Ping: - case SyncType.Pong: - _bounce = !_bounce; - Index = 1; - break; - default: - Index = 0; - break; - } - if (Pinned && !force) return _state[Index]; - - switch (Type) - { - case SyncType.Ping: - case SyncType.Pong: - return _bounce ? _state[_state.Length - 1 - Index++] : _state[Index++]; - default: - return _state[Index++]; - } - } - - private void FillSlots() - { - switch (Type) - { - case SyncType.Forward: - case SyncType.Ping: - for (int i = 0; i < _state.Length; _state[i] = i++) - { - } - break; - case SyncType.Reverse: - case SyncType.Pong: - for (int i = 0; i < _state.Length; _state[_state.Length - 1 - i] = i++) - { - } - break; - case SyncType.Locked: - case SyncType.Deck: - case SyncType.Cdeck: - for (int i = 0; i < _state.Length; _state[i] = i++) - { - } - ScrambleSlots(); - break; - } - } - - private void ScrambleSlots() - { - if (_state.Length == 1) return; - - int t; - - if (_state.Length == 2) // Handle 2-item scenario - { - if (_rng.Next(0, 2) != 0) return; - t = _state[0]; - _state[0] = _state[1]; - _state[1] = t; - return; - } - - int s; - - for (int i = 0; i < _state.Length; i++) - { - t = _state[i]; - do - { - s = _rng.Next(_state.Length); - } while (s == t && _state.Length < 3); - _state[i] = _state[s]; - _state[s] = t; - } - } - } + internal class Synchronizer + { + private readonly RNG _rng; + private bool _bounce; + private int[] _state; + + public Synchronizer(SyncType type, long seed) + { + Type = type; + _rng = new RNG(seed); + Index = 0; + _state = null; + Pinned = false; + } + + public bool Pinned { get; set; } + public SyncType Type { get; set; } + public int Index { get; set; } + + public void Reset() + { + _rng.Reset(); + Index = 0; + if (_state == null) return; + FillSlots(); + } + + public void Reseed(string id) + { + _rng.Reset(id.Hash()); + Index = 0; + if (_state == null) return; + FillSlots(); + } + + public int NextItem(int count) + { + if (_state == null) + { + _state = new int[count]; + FillSlots(); + } + else if (count != _state.Length) + { + Array.Resize(ref _state, count); + FillSlots(); + } + + return Step(false); + } + + public int Step(bool force) + { + if (Type == SyncType.Locked) return _state[0]; + if (Index >= _state.Length) + { + switch (Type) + { + case SyncType.Deck: + ScrambleSlots(); + goto default; + case SyncType.Ping: + case SyncType.Pong: + _bounce = !_bounce; + Index = 1; + break; + default: + Index = 0; + break; + } + } + if (Pinned && !force) return _state[Index]; + + switch (Type) + { + case SyncType.Ping: + case SyncType.Pong: + return _bounce ? _state[_state.Length - 1 - Index++] : _state[Index++]; + default: + return _state[Index++]; + } + } + + private void FillSlots() + { + switch (Type) + { + case SyncType.Forward: + case SyncType.Ping: + for (int i = 0; i < _state.Length; _state[i] = i++) + { + } + break; + case SyncType.Reverse: + case SyncType.Pong: + for (int i = 0; i < _state.Length; _state[_state.Length - 1 - i] = i++) + { + } + break; + case SyncType.Locked: + case SyncType.Deck: + case SyncType.Cdeck: + for (int i = 0; i < _state.Length; _state[i] = i++) + { + } + ScrambleSlots(); + break; + } + } + + private void ScrambleSlots() + { + if (_state.Length == 1) return; + + int t; + + if (_state.Length == 2) // Handle 2-item scenario + { + if (_rng.Next(0, 2) != 0) return; + t = _state[0]; + _state[0] = _state[1]; + _state[1] = t; + return; + } + + int s; + + for (int i = 0; i < _state.Length; i++) + { + t = _state[i]; + do + { + s = _rng.Next(_state.Length); + } while (s == t && _state.Length < 3); + _state[i] = _state[s]; + _state[s] = t; + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/Accent.cs b/Rant/Core/Formatting/Accent.cs index c854a48..72e0f4d 100644 --- a/Rant/Core/Formatting/Accent.cs +++ b/Rant/Core/Formatting/Accent.cs @@ -25,15 +25,15 @@ namespace Rant.Core.Formatting { - internal enum Accent - { - Acute, - Grave, - Circumflex, - Tilde, - Ring, - Diaeresis, - Caron, - Macron - } + internal enum Accent + { + Acute, + Grave, + Circumflex, + Tilde, + Ring, + Diaeresis, + Caron, + Macron + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/Capitalization.cs b/Rant/Core/Formatting/Capitalization.cs index 39ed56f..c050610 100644 --- a/Rant/Core/Formatting/Capitalization.cs +++ b/Rant/Core/Formatting/Capitalization.cs @@ -27,27 +27,27 @@ namespace Rant.Core.Formatting { - internal enum Capitalization - { - [RantDescription("No capitalization.")] - None, + internal enum Capitalization + { + [RantDescription("No capitalization.")] + None, - [RantDescription("Convert to lowercase.")] - Lower, + [RantDescription("Convert to lowercase.")] + Lower, - [RantDescription("Convert to uppercase.")] - Upper, + [RantDescription("Convert to uppercase.")] + Upper, - [RantDescription("Convert to title case.")] - Title, + [RantDescription("Convert to title case.")] + Title, - [RantDescription("Capitalize the first letter.")] - First, + [RantDescription("Capitalize the first letter.")] + First, - [RantDescription("Capitalize the first letter of every sentence.")] - Sentence, + [RantDescription("Capitalize the first letter of every sentence.")] + Sentence, - [RantDescription("Capitalize the first letter of every word.")] - Word - } + [RantDescription("Capitalize the first letter of every word.")] + Word + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/Emoji.cs b/Rant/Core/Formatting/Emoji.cs index 190403d..0b82b7a 100644 --- a/Rant/Core/Formatting/Emoji.cs +++ b/Rant/Core/Formatting/Emoji.cs @@ -27,862 +27,862 @@ namespace Rant.Core.Formatting { - /// - /// A list of emoji. - /// I don't know where to put this other than a class, so uh, here you go. - /// - internal static class Emoji - { - /// - /// Maps Emoji shortcodes to Unicode code points. - /// - internal static readonly Dictionary Shortcodes = new Dictionary - { - { "+1", 0x1f44d }, - { "-1", 0x1f44e }, - { "100", 0x1f4af }, - { "1234", 0x1f522 }, - { "8ball", 0x1f3b1 }, - { "a", 0x1f170 }, - { "ab", 0x1f18e }, - { "abc", 0x1f524 }, - { "abcd", 0x1f521 }, - { "accept", 0x1f251 }, - { "aerial_tramway", 0x1f6a1 }, - { "airplane", 0x02708 }, - { "alarm_clock", 0x023f0 }, - { "alien", 0x1f47d }, - { "ambulance", 0x1f691 }, - { "anchor", 0x02693 }, - { "angel", 0x1f47c }, - { "anger", 0x1f4a2 }, - { "angry", 0x1f620 }, - { "anguished", 0x1f627 }, - { "ant", 0x1f41c }, - { "apple", 0x1f34e }, - { "aquarius", 0x02652 }, - { "aries", 0x02648 }, - { "arrow_backward", 0x025c0 }, - { "arrow_double_down", 0x023ec }, - { "arrow_double_up", 0x023eb }, - { "arrow_down", 0x02b07 }, - { "arrow_down_small", 0x1f53d }, - { "arrow_forward", 0x025b6 }, - { "arrow_heading_down", 0x02935 }, - { "arrow_heading_up", 0x02934 }, - { "arrow_left", 0x02b05 }, - { "arrow_lower_left", 0x02199 }, - { "arrow_lower_right", 0x02198 }, - { "arrow_right", 0x027a1 }, - { "arrow_right_hook", 0x021aa }, - { "arrow_up", 0x02b06 }, - { "arrow_up_down", 0x02195 }, - { "arrow_up_small", 0x1f53c }, - { "arrow_upper_left", 0x02196 }, - { "arrow_upper_right", 0x02197 }, - { "arrows_clockwise", 0x1f503 }, - { "arrows_counterclockwise", 0x1f504 }, - { "art", 0x1f3a8 }, - { "articulated_lorry", 0x1f69b }, - { "astonished", 0x1f632 }, - { "athletic_shoe", 0x1f45f }, - { "atm", 0x1f3e7 }, - { "b", 0x1f171 }, - { "baby", 0x1f476 }, - { "baby_bottle", 0x1f37c }, - { "baby_chick", 0x1f424 }, - { "baby_symbol", 0x1f6bc }, - { "back", 0x1f519 }, - { "baggage_claim", 0x1f6c4 }, - { "balloon", 0x1f388 }, - { "ballot_box_with_check", 0x02611 }, - { "bamboo", 0x1f38d }, - { "banana", 0x1f34c }, - { "bangbang", 0x0203c }, - { "bank", 0x1f3e6 }, - { "bar_chart", 0x1f4ca }, - { "barber", 0x1f488 }, - { "baseball", 0x026be }, - { "basketball", 0x1f3c0 }, - { "bath", 0x1f6c0 }, - { "bathtub", 0x1f6c1 }, - { "battery", 0x1f50b }, - { "bear", 0x1f43b }, - { "bee", 0x1f41d }, - { "beer", 0x1f37a }, - { "beers", 0x1f37b }, - { "beetle", 0x1f41e }, - { "beginner", 0x1f530 }, - { "bell", 0x1f514 }, - { "bento", 0x1f371 }, - { "bicyclist", 0x1f6b4 }, - { "bike", 0x1f6b2 }, - { "bikini", 0x1f459 }, - { "bird", 0x1f426 }, - { "birthday", 0x1f382 }, - { "black_circle", 0x026ab }, - { "black_joker", 0x1f0cf }, - { "black_large_square", 0x02b1b }, - { "black_medium_small_square", 0x025fe }, - { "black_medium_square", 0x025fc }, - { "black_nib", 0x02712 }, - { "black_small_square", 0x025aa }, - { "black_square_button", 0x1f532 }, - { "blossom", 0x1f33c }, - { "blowfish", 0x1f421 }, - { "blue_book", 0x1f4d8 }, - { "blue_car", 0x1f699 }, - { "blue_heart", 0x1f499 }, - { "blush", 0x1f60a }, - { "boar", 0x1f417 }, - { "boat", 0x026f5 }, - { "bomb", 0x1f4a3 }, - { "book", 0x1f4d6 }, - { "bookmark", 0x1f516 }, - { "bookmark_tabs", 0x1f4d1 }, - { "books", 0x1f4da }, - { "boom", 0x1f4a5 }, - { "boot", 0x1f462 }, - { "bouquet", 0x1f490 }, - { "bow", 0x1f647 }, - { "bowling", 0x1f3b3 }, - { "boy", 0x1f466 }, - { "bread", 0x1f35e }, - { "bride_with_veil", 0x1f470 }, - { "bridge_at_night", 0x1f309 }, - { "briefcase", 0x1f4bc }, - { "broken_heart", 0x1f494 }, - { "bug", 0x1f41b }, - { "bulb", 0x1f4a1 }, - { "bullettrain_front", 0x1f685 }, - { "bullettrain_side", 0x1f684 }, - { "bus", 0x1f68c }, - { "busstop", 0x1f68f }, - { "bust_in_silhouette", 0x1f464 }, - { "busts_in_silhouette", 0x1f465 }, - { "cactus", 0x1f335 }, - { "cake", 0x1f370 }, - { "calendar", 0x1f4c6 }, - { "calling", 0x1f4f2 }, - { "camel", 0x1f42b }, - { "camera", 0x1f4f7 }, - { "cancer", 0x0264b }, - { "candy", 0x1f36c }, - { "capital_abcd", 0x1f520 }, - { "capricorn", 0x02651 }, - { "car", 0x1f697 }, - { "card_index", 0x1f4c7 }, - { "carousel_horse", 0x1f3a0 }, - { "cat", 0x1f431 }, - { "cat2", 0x1f408 }, - { "cd", 0x1f4bf }, - { "chart", 0x1f4b9 }, - { "chart_with_downwards_trend", 0x1f4c9 }, - { "chart_with_upwards_trend", 0x1f4c8 }, - { "checkered_flag", 0x1f3c1 }, - { "cherries", 0x1f352 }, - { "cherry_blossom", 0x1f338 }, - { "chestnut", 0x1f330 }, - { "chicken", 0x1f414 }, - { "children_crossing", 0x1f6b8 }, - { "chocolate_bar", 0x1f36b }, - { "christmas_tree", 0x1f384 }, - { "church", 0x026ea }, - { "cinema", 0x1f3a6 }, - { "circus_tent", 0x1f3aa }, - { "city_sunrise", 0x1f307 }, - { "city_sunset", 0x1f306 }, - { "cl", 0x1f191 }, - { "clap", 0x1f44f }, - { "clapper", 0x1f3ac }, - { "clipboard", 0x1f4cb }, - { "clock1", 0x1f550 }, - { "clock10", 0x1f559 }, - { "clock1030", 0x1f565 }, - { "clock11", 0x1f55a }, - { "clock1130", 0x1f566 }, - { "clock12", 0x1f55b }, - { "clock1230", 0x1f567 }, - { "clock130", 0x1f55c }, - { "clock2", 0x1f551 }, - { "clock230", 0x1f55d }, - { "clock3", 0x1f552 }, - { "clock330", 0x1f55e }, - { "clock4", 0x1f553 }, - { "clock430", 0x1f55f }, - { "clock5", 0x1f554 }, - { "clock530", 0x1f560 }, - { "clock6", 0x1f555 }, - { "clock630", 0x1f561 }, - { "clock7", 0x1f556 }, - { "clock730", 0x1f562 }, - { "clock8", 0x1f557 }, - { "clock830", 0x1f563 }, - { "clock9", 0x1f558 }, - { "clock930", 0x1f564 }, - { "closed_book", 0x1f4d5 }, - { "closed_lock_with_key", 0x1f510 }, - { "closed_umbrella", 0x1f302 }, - { "cloud", 0x02601 }, - { "clubs", 0x02663 }, - { "cocktail", 0x1f378 }, - { "coffee", 0x02615 }, - { "cold_sweat", 0x1f630 }, - { "collision", 0x1f4a5 }, - { "computer", 0x1f4bb }, - { "confetti_ball", 0x1f38a }, - { "confounded", 0x1f616 }, - { "confused", 0x1f615 }, - { "congratulations", 0x03297 }, - { "construction", 0x1f6a7 }, - { "construction_worker", 0x1f477 }, - { "convenience_store", 0x1f3ea }, - { "cookie", 0x1f36a }, - { "cool", 0x1f192 }, - { "cop", 0x1f46e }, - { "copyright", 0x000a9 }, - { "corn", 0x1f33d }, - { "couple", 0x1f46b }, - { "couple_with_heart", 0x1f491 }, - { "couplekiss", 0x1f48f }, - { "cow", 0x1f42e }, - { "cow2", 0x1f404 }, - { "credit_card", 0x1f4b3 }, - { "crescent_moon", 0x1f319 }, - { "crocodile", 0x1f40a }, - { "crossed_flags", 0x1f38c }, - { "crown", 0x1f451 }, - { "cry", 0x1f622 }, - { "crying_cat_face", 0x1f63f }, - { "crystal_ball", 0x1f52e }, - { "cupid", 0x1f498 }, - { "curly_loop", 0x027b0 }, - { "currency_exchange", 0x1f4b1 }, - { "curry", 0x1f35b }, - { "custard", 0x1f36e }, - { "customs", 0x1f6c3 }, - { "cyclone", 0x1f300 }, - { "dancer", 0x1f483 }, - { "dancers", 0x1f46f }, - { "dango", 0x1f361 }, - { "dart", 0x1f3af }, - { "dash", 0x1f4a8 }, - { "date", 0x1f4c5 }, - { "deciduous_tree", 0x1f333 }, - { "department_store", 0x1f3ec }, - { "diamond_shape_with_a_dot_inside", 0x1f4a0 }, - { "diamonds", 0x02666 }, - { "disappointed", 0x1f61e }, - { "disappointed_relieved", 0x1f625 }, - { "dizzy", 0x1f4ab }, - { "dizzy_face", 0x1f635 }, - { "do_not_litter", 0x1f6af }, - { "dog", 0x1f436 }, - { "dog2", 0x1f415 }, - { "dollar", 0x1f4b5 }, - { "dolls", 0x1f38e }, - { "dolphin", 0x1f42c }, - { "door", 0x1f6aa }, - { "doughnut", 0x1f369 }, - { "dragon", 0x1f409 }, - { "dragon_face", 0x1f432 }, - { "dress", 0x1f457 }, - { "dromedary_camel", 0x1f42a }, - { "droplet", 0x1f4a7 }, - { "dvd", 0x1f4c0 }, - { "e-mail", 0x1f4e7 }, - { "ear", 0x1f442 }, - { "ear_of_rice", 0x1f33e }, - { "earth_africa", 0x1f30d }, - { "earth_americas", 0x1f30e }, - { "earth_asia", 0x1f30f }, - { "egg", 0x1f373 }, - { "eggplant", 0x1f346 }, - { "eight_pointed_black_star", 0x02734 }, - { "eight_spoked_asterisk", 0x02733 }, - { "electric_plug", 0x1f50c }, - { "elephant", 0x1f418 }, - { "email", 0x02709 }, - { "end", 0x1f51a }, - { "envelope", 0x02709 }, - { "envelope_with_arrow", 0x1f4e9 }, - { "euro", 0x1f4b6 }, - { "european_castle", 0x1f3f0 }, - { "european_post_office", 0x1f3e4 }, - { "evergreen_tree", 0x1f332 }, - { "exclamation", 0x02757 }, - { "expressionless", 0x1f611 }, - { "eyeglasses", 0x1f453 }, - { "eyes", 0x1f440 }, - { "facepunch", 0x1f44a }, - { "factory", 0x1f3ed }, - { "fallen_leaf", 0x1f342 }, - { "family", 0x1f46a }, - { "fast_forward", 0x023e9 }, - { "fax", 0x1f4e0 }, - { "fearful", 0x1f628 }, - { "feet", 0x1f43e }, - { "ferris_wheel", 0x1f3a1 }, - { "file_folder", 0x1f4c1 }, - { "fire", 0x1f525 }, - { "fire_engine", 0x1f692 }, - { "fireworks", 0x1f386 }, - { "first_quarter_moon", 0x1f313 }, - { "first_quarter_moon_with_face", 0x1f31b }, - { "fish", 0x1f41f }, - { "fish_cake", 0x1f365 }, - { "fishing_pole_and_fish", 0x1f3a3 }, - { "fist", 0x0270a }, - { "flags", 0x1f38f }, - { "flashlight", 0x1f526 }, - { "flipper", 0x1f42c }, - { "floppy_disk", 0x1f4be }, - { "flower_playing_cards", 0x1f3b4 }, - { "flushed", 0x1f633 }, - { "foggy", 0x1f301 }, - { "football", 0x1f3c8 }, - { "footprints", 0x1f463 }, - { "fork_and_knife", 0x1f374 }, - { "fountain", 0x026f2 }, - { "four_leaf_clover", 0x1f340 }, - { "free", 0x1f193 }, - { "fried_shrimp", 0x1f364 }, - { "fries", 0x1f35f }, - { "frog", 0x1f438 }, - { "frowning", 0x1f626 }, - { "fuelpump", 0x026fd }, - { "full_moon", 0x1f315 }, - { "full_moon_with_face", 0x1f31d }, - { "game_die", 0x1f3b2 }, - { "gem", 0x1f48e }, - { "gemini", 0x0264a }, - { "ghost", 0x1f47b }, - { "gift", 0x1f381 }, - { "gift_heart", 0x1f49d }, - { "girl", 0x1f467 }, - { "globe_with_meridians", 0x1f310 }, - { "goat", 0x1f410 }, - { "golf", 0x026f3 }, - { "grapes", 0x1f347 }, - { "green_apple", 0x1f34f }, - { "green_book", 0x1f4d7 }, - { "green_heart", 0x1f49a }, - { "grey_exclamation", 0x02755 }, - { "grey_question", 0x02754 }, - { "grimacing", 0x1f62c }, - { "grin", 0x1f601 }, - { "grinning", 0x1f600 }, - { "guardsman", 0x1f482 }, - { "guitar", 0x1f3b8 }, - { "gun", 0x1f52b }, - { "haircut", 0x1f487 }, - { "hamburger", 0x1f354 }, - { "hammer", 0x1f528 }, - { "hamster", 0x1f439 }, - { "hand", 0x0270b }, - { "handbag", 0x1f45c }, - { "hankey", 0x1f4a9 }, - { "hatched_chick", 0x1f425 }, - { "hatching_chick", 0x1f423 }, - { "headphones", 0x1f3a7 }, - { "hear_no_evil", 0x1f649 }, - { "heart", 0x02764 }, - { "heart_decoration", 0x1f49f }, - { "heart_eyes", 0x1f60d }, - { "heart_eyes_cat", 0x1f63b }, - { "heartbeat", 0x1f493 }, - { "heartpulse", 0x1f497 }, - { "hearts", 0x02665 }, - { "heavy_check_mark", 0x02714 }, - { "heavy_division_sign", 0x02797 }, - { "heavy_dollar_sign", 0x1f4b2 }, - { "heavy_exclamation_mark", 0x02757 }, - { "heavy_minus_sign", 0x02796 }, - { "heavy_multiplication_x", 0x02716 }, - { "heavy_plus_sign", 0x02795 }, - { "helicopter", 0x1f681 }, - { "herb", 0x1f33f }, - { "hibiscus", 0x1f33a }, - { "high_brightness", 0x1f506 }, - { "high_heel", 0x1f460 }, - { "hocho", 0x1f52a }, - { "honey_pot", 0x1f36f }, - { "honeybee", 0x1f41d }, - { "horse", 0x1f434 }, - { "horse_racing", 0x1f3c7 }, - { "hospital", 0x1f3e5 }, - { "hotel", 0x1f3e8 }, - { "hotsprings", 0x02668 }, - { "hourglass", 0x0231b }, - { "hourglass_flowing_sand", 0x023f3 }, - { "house", 0x1f3e0 }, - { "house_with_garden", 0x1f3e1 }, - { "hushed", 0x1f62f }, - { "ice_cream", 0x1f368 }, - { "icecream", 0x1f366 }, - { "id", 0x1f194 }, - { "ideograph_advantage", 0x1f250 }, - { "imp", 0x1f47f }, - { "inbox_tray", 0x1f4e5 }, - { "incoming_envelope", 0x1f4e8 }, - { "information_desk_person", 0x1f481 }, - { "information_source", 0x02139 }, - { "innocent", 0x1f607 }, - { "interrobang", 0x02049 }, - { "iphone", 0x1f4f1 }, - { "izakaya_lantern", 0x1f3ee }, - { "jack_o_lantern", 0x1f383 }, - { "japan", 0x1f5fe }, - { "japanese_castle", 0x1f3ef }, - { "japanese_goblin", 0x1f47a }, - { "japanese_ogre", 0x1f479 }, - { "jeans", 0x1f456 }, - { "joy", 0x1f602 }, - { "joy_cat", 0x1f639 }, - { "key", 0x1f511 }, - { "keycap_ten", 0x1f51f }, - { "kimono", 0x1f458 }, - { "kiss", 0x1f48b }, - { "kissing", 0x1f617 }, - { "kissing_cat", 0x1f63d }, - { "kissing_closed_eyes", 0x1f61a }, - { "kissing_heart", 0x1f618 }, - { "kissing_smiling_eyes", 0x1f619 }, - { "koala", 0x1f428 }, - { "koko", 0x1f201 }, - { "lantern", 0x1f3ee }, - { "large_blue_circle", 0x1f535 }, - { "large_blue_diamond", 0x1f537 }, - { "large_orange_diamond", 0x1f536 }, - { "last_quarter_moon", 0x1f317 }, - { "last_quarter_moon_with_face", 0x1f31c }, - { "laughing", 0x1f606 }, - { "leaves", 0x1f343 }, - { "ledger", 0x1f4d2 }, - { "left_luggage", 0x1f6c5 }, - { "left_right_arrow", 0x02194 }, - { "leftwards_arrow_with_hook", 0x021a9 }, - { "lemon", 0x1f34b }, - { "leo", 0x0264c }, - { "leopard", 0x1f406 }, - { "libra", 0x0264e }, - { "light_rail", 0x1f688 }, - { "link", 0x1f517 }, - { "lips", 0x1f444 }, - { "lipstick", 0x1f484 }, - { "lock", 0x1f512 }, - { "lock_with_ink_pen", 0x1f50f }, - { "lollipop", 0x1f36d }, - { "loop", 0x027bf }, - { "loudspeaker", 0x1f4e2 }, - { "love_hotel", 0x1f3e9 }, - { "love_letter", 0x1f48c }, - { "low_brightness", 0x1f505 }, - { "m", 0x024c2 }, - { "mag", 0x1f50d }, - { "mag_right", 0x1f50e }, - { "mahjong", 0x1f004 }, - { "mailbox", 0x1f4eb }, - { "mailbox_closed", 0x1f4ea }, - { "mailbox_with_mail", 0x1f4ec }, - { "mailbox_with_no_mail", 0x1f4ed }, - { "man", 0x1f468 }, - { "man_with_gua_pi_mao", 0x1f472 }, - { "man_with_turban", 0x1f473 }, - { "mans_shoe", 0x1f45e }, - { "maple_leaf", 0x1f341 }, - { "mask", 0x1f637 }, - { "massage", 0x1f486 }, - { "meat_on_bone", 0x1f356 }, - { "mega", 0x1f4e3 }, - { "melon", 0x1f348 }, - { "memo", 0x1f4dd }, - { "mens", 0x1f6b9 }, - { "metro", 0x1f687 }, - { "microphone", 0x1f3a4 }, - { "microscope", 0x1f52c }, - { "milky_way", 0x1f30c }, - { "minibus", 0x1f690 }, - { "minidisc", 0x1f4bd }, - { "mobile_phone_off", 0x1f4f4 }, - { "money_with_wings", 0x1f4b8 }, - { "moneybag", 0x1f4b0 }, - { "monkey", 0x1f412 }, - { "monkey_face", 0x1f435 }, - { "monorail", 0x1f69d }, - { "moon", 0x1f314 }, - { "mortar_board", 0x1f393 }, - { "mount_fuji", 0x1f5fb }, - { "mountain_bicyclist", 0x1f6b5 }, - { "mountain_cableway", 0x1f6a0 }, - { "mountain_railway", 0x1f69e }, - { "mouse", 0x1f42d }, - { "mouse2", 0x1f401 }, - { "movie_camera", 0x1f3a5 }, - { "moyai", 0x1f5ff }, - { "muscle", 0x1f4aa }, - { "mushroom", 0x1f344 }, - { "musical_keyboard", 0x1f3b9 }, - { "musical_note", 0x1f3b5 }, - { "musical_score", 0x1f3bc }, - { "mute", 0x1f507 }, - { "nail_care", 0x1f485 }, - { "name_badge", 0x1f4db }, - { "necktie", 0x1f454 }, - { "negative_squared_cross_mark", 0x0274e }, - { "neutral_face", 0x1f610 }, - { "new", 0x1f195 }, - { "new_moon", 0x1f311 }, - { "new_moon_with_face", 0x1f31a }, - { "newspaper", 0x1f4f0 }, - { "ng", 0x1f196 }, - { "no_bell", 0x1f515 }, - { "no_bicycles", 0x1f6b3 }, - { "no_entry", 0x026d4 }, - { "no_entry_sign", 0x1f6ab }, - { "no_good", 0x1f645 }, - { "no_mobile_phones", 0x1f4f5 }, - { "no_mouth", 0x1f636 }, - { "no_pedestrians", 0x1f6b7 }, - { "no_smoking", 0x1f6ad }, - { "non-potable_water", 0x1f6b1 }, - { "nose", 0x1f443 }, - { "notebook", 0x1f4d3 }, - { "notebook_with_decorative_cover", 0x1f4d4 }, - { "notes", 0x1f3b6 }, - { "nut_and_bolt", 0x1f529 }, - { "o", 0x02b55 }, - { "o2", 0x1f17e }, - { "ocean", 0x1f30a }, - { "octopus", 0x1f419 }, - { "oden", 0x1f362 }, - { "office", 0x1f3e2 }, - { "ok", 0x1f197 }, - { "ok_hand", 0x1f44c }, - { "ok_woman", 0x1f646 }, - { "older_man", 0x1f474 }, - { "older_woman", 0x1f475 }, - { "on", 0x1f51b }, - { "oncoming_automobile", 0x1f698 }, - { "oncoming_bus", 0x1f68d }, - { "oncoming_police_car", 0x1f694 }, - { "oncoming_taxi", 0x1f696 }, - { "open_book", 0x1f4d6 }, - { "open_file_folder", 0x1f4c2 }, - { "open_hands", 0x1f450 }, - { "open_mouth", 0x1f62e }, - { "ophiuchus", 0x026ce }, - { "orange_book", 0x1f4d9 }, - { "outbox_tray", 0x1f4e4 }, - { "ox", 0x1f402 }, - { "package", 0x1f4e6 }, - { "page_facing_up", 0x1f4c4 }, - { "page_with_curl", 0x1f4c3 }, - { "pager", 0x1f4df }, - { "palm_tree", 0x1f334 }, - { "panda_face", 0x1f43c }, - { "paperclip", 0x1f4ce }, - { "parking", 0x1f17f }, - { "part_alternation_mark", 0x0303d }, - { "partly_sunny", 0x026c5 }, - { "passport_control", 0x1f6c2 }, - { "paw_prints", 0x1f43e }, - { "peach", 0x1f351 }, - { "pear", 0x1f350 }, - { "pencil", 0x1f4dd }, - { "pencil2", 0x0270f }, - { "penguin", 0x1f427 }, - { "pensive", 0x1f614 }, - { "performing_arts", 0x1f3ad }, - { "persevere", 0x1f623 }, - { "person_frowning", 0x1f64d }, - { "person_with_blond_hair", 0x1f471 }, - { "person_with_pouting_face", 0x1f64e }, - { "phone", 0x0260e }, - { "pig", 0x1f437 }, - { "pig2", 0x1f416 }, - { "pig_nose", 0x1f43d }, - { "pill", 0x1f48a }, - { "pineapple", 0x1f34d }, - { "pisces", 0x02653 }, - { "pizza", 0x1f355 }, - { "point_down", 0x1f447 }, - { "point_left", 0x1f448 }, - { "point_right", 0x1f449 }, - { "point_up", 0x0261d }, - { "point_up_2", 0x1f446 }, - { "police_car", 0x1f693 }, - { "poodle", 0x1f429 }, - { "poop", 0x1f4a9 }, - { "post_office", 0x1f3e3 }, - { "postal_horn", 0x1f4ef }, - { "postbox", 0x1f4ee }, - { "potable_water", 0x1f6b0 }, - { "pouch", 0x1f45d }, - { "poultry_leg", 0x1f357 }, - { "pound", 0x1f4b7 }, - { "pouting_cat", 0x1f63e }, - { "pray", 0x1f64f }, - { "princess", 0x1f478 }, - { "punch", 0x1f44a }, - { "purple_heart", 0x1f49c }, - { "purse", 0x1f45b }, - { "pushpin", 0x1f4cc }, - { "put_litter_in_its_place", 0x1f6ae }, - { "question", 0x02753 }, - { "rabbit", 0x1f430 }, - { "rabbit2", 0x1f407 }, - { "racehorse", 0x1f40e }, - { "radio", 0x1f4fb }, - { "radio_button", 0x1f518 }, - { "rage", 0x1f621 }, - { "railway_car", 0x1f683 }, - { "rainbow", 0x1f308 }, - { "raised_hand", 0x0270b }, - { "raised_hands", 0x1f64c }, - { "raising_hand", 0x1f64b }, - { "ram", 0x1f40f }, - { "ramen", 0x1f35c }, - { "rat", 0x1f400 }, - { "recycle", 0x0267b }, - { "red_car", 0x1f697 }, - { "red_circle", 0x1f534 }, - { "registered", 0x000ae }, - { "relaxed", 0x0263a }, - { "relieved", 0x1f60c }, - { "repeat", 0x1f501 }, - { "repeat_one", 0x1f502 }, - { "restroom", 0x1f6bb }, - { "revolving_hearts", 0x1f49e }, - { "rewind", 0x023ea }, - { "ribbon", 0x1f380 }, - { "rice", 0x1f35a }, - { "rice_ball", 0x1f359 }, - { "rice_cracker", 0x1f358 }, - { "rice_scene", 0x1f391 }, - { "ring", 0x1f48d }, - { "rocket", 0x1f680 }, - { "roller_coaster", 0x1f3a2 }, - { "rooster", 0x1f413 }, - { "rose", 0x1f339 }, - { "rotating_light", 0x1f6a8 }, - { "round_pushpin", 0x1f4cd }, - { "rowboat", 0x1f6a3 }, - { "rugby_football", 0x1f3c9 }, - { "runner", 0x1f3c3 }, - { "running", 0x1f3c3 }, - { "running_shirt_with_sash", 0x1f3bd }, - { "sa", 0x1f202 }, - { "sagittarius", 0x02650 }, - { "sailboat", 0x026f5 }, - { "sake", 0x1f376 }, - { "sandal", 0x1f461 }, - { "santa", 0x1f385 }, - { "satellite", 0x1f4e1 }, - { "satisfied", 0x1f606 }, - { "saxophone", 0x1f3b7 }, - { "school", 0x1f3eb }, - { "school_satchel", 0x1f392 }, - { "scissors", 0x02702 }, - { "scorpius", 0x0264f }, - { "scream", 0x1f631 }, - { "scream_cat", 0x1f640 }, - { "scroll", 0x1f4dc }, - { "seat", 0x1f4ba }, - { "secret", 0x03299 }, - { "see_no_evil", 0x1f648 }, - { "seedling", 0x1f331 }, - { "shaved_ice", 0x1f367 }, - { "sheep", 0x1f411 }, - { "shell", 0x1f41a }, - { "ship", 0x1f6a2 }, - { "shirt", 0x1f455 }, - { "shit", 0x1f4a9 }, - { "shoe", 0x1f45e }, - { "shower", 0x1f6bf }, - { "signal_strength", 0x1f4f6 }, - { "six_pointed_star", 0x1f52f }, - { "ski", 0x1f3bf }, - { "skull", 0x1f480 }, - { "sleeping", 0x1f634 }, - { "sleepy", 0x1f62a }, - { "slot_machine", 0x1f3b0 }, - { "small_blue_diamond", 0x1f539 }, - { "small_orange_diamond", 0x1f538 }, - { "small_red_triangle", 0x1f53a }, - { "small_red_triangle_down", 0x1f53b }, - { "smile", 0x1f604 }, - { "smile_cat", 0x1f638 }, - { "smiley", 0x1f603 }, - { "smiley_cat", 0x1f63a }, - { "smiling_imp", 0x1f608 }, - { "smirk", 0x1f60f }, - { "smirk_cat", 0x1f63c }, - { "smoking", 0x1f6ac }, - { "snail", 0x1f40c }, - { "snake", 0x1f40d }, - { "snowboarder", 0x1f3c2 }, - { "snowflake", 0x02744 }, - { "snowman", 0x026c4 }, - { "sob", 0x1f62d }, - { "soccer", 0x026bd }, - { "soon", 0x1f51c }, - { "sos", 0x1f198 }, - { "sound", 0x1f509 }, - { "space_invader", 0x1f47e }, - { "spades", 0x02660 }, - { "spaghetti", 0x1f35d }, - { "sparkle", 0x02747 }, - { "sparkler", 0x1f387 }, - { "sparkles", 0x02728 }, - { "sparkling_heart", 0x1f496 }, - { "speak_no_evil", 0x1f64a }, - { "speaker", 0x1f50a }, - { "speech_balloon", 0x1f4ac }, - { "speedboat", 0x1f6a4 }, - { "star", 0x02b50 }, - { "star2", 0x1f31f }, - { "stars", 0x1f303 }, - { "station", 0x1f689 }, - { "statue_of_liberty", 0x1f5fd }, - { "steam_locomotive", 0x1f682 }, - { "stew", 0x1f372 }, - { "straight_ruler", 0x1f4cf }, - { "strawberry", 0x1f353 }, - { "stuck_out_tongue", 0x1f61b }, - { "stuck_out_tongue_closed_eyes", 0x1f61d }, - { "stuck_out_tongue_winking_eye", 0x1f61c }, - { "sun_with_face", 0x1f31e }, - { "sunflower", 0x1f33b }, - { "sunglasses", 0x1f60e }, - { "sunny", 0x02600 }, - { "sunrise", 0x1f305 }, - { "sunrise_over_mountains", 0x1f304 }, - { "surfer", 0x1f3c4 }, - { "sushi", 0x1f363 }, - { "suspension_railway", 0x1f69f }, - { "sweat", 0x1f613 }, - { "sweat_drops", 0x1f4a6 }, - { "sweat_smile", 0x1f605 }, - { "sweet_potato", 0x1f360 }, - { "swimmer", 0x1f3ca }, - { "symbols", 0x1f523 }, - { "syringe", 0x1f489 }, - { "tada", 0x1f389 }, - { "tanabata_tree", 0x1f38b }, - { "tangerine", 0x1f34a }, - { "taurus", 0x02649 }, - { "taxi", 0x1f695 }, - { "tea", 0x1f375 }, - { "telephone", 0x0260e }, - { "telephone_receiver", 0x1f4de }, - { "telescope", 0x1f52d }, - { "tennis", 0x1f3be }, - { "tent", 0x026fa }, - { "thought_balloon", 0x1f4ad }, - { "thumbsdown", 0x1f44e }, - { "thumbsup", 0x1f44d }, - { "ticket", 0x1f3ab }, - { "tiger", 0x1f42f }, - { "tiger2", 0x1f405 }, - { "tired_face", 0x1f62b }, - { "tm", 0x02122 }, - { "toilet", 0x1f6bd }, - { "tokyo_tower", 0x1f5fc }, - { "tomato", 0x1f345 }, - { "tongue", 0x1f445 }, - { "top", 0x1f51d }, - { "tophat", 0x1f3a9 }, - { "tractor", 0x1f69c }, - { "traffic_light", 0x1f6a5 }, - { "train", 0x1f683 }, - { "train2", 0x1f686 }, - { "tram", 0x1f68a }, - { "triangular_flag_on_post", 0x1f6a9 }, - { "triangular_ruler", 0x1f4d0 }, - { "trident", 0x1f531 }, - { "triumph", 0x1f624 }, - { "trolleybus", 0x1f68e }, - { "trophy", 0x1f3c6 }, - { "tropical_drink", 0x1f379 }, - { "tropical_fish", 0x1f420 }, - { "truck", 0x1f69a }, - { "trumpet", 0x1f3ba }, - { "tshirt", 0x1f455 }, - { "tulip", 0x1f337 }, - { "turtle", 0x1f422 }, - { "tv", 0x1f4fa }, - { "twisted_rightwards_arrows", 0x1f500 }, - { "two_hearts", 0x1f495 }, - { "two_men_holding_hands", 0x1f46c }, - { "two_women_holding_hands", 0x1f46d }, - { "u5272", 0x1f239 }, - { "u5408", 0x1f234 }, - { "u55b6", 0x1f23a }, - { "u6307", 0x1f22f }, - { "u6708", 0x1f237 }, - { "u6709", 0x1f236 }, - { "u6e80", 0x1f235 }, - { "u7121", 0x1f21a }, - { "u7533", 0x1f238 }, - { "u7981", 0x1f232 }, - { "u7a7a", 0x1f233 }, - { "umbrella", 0x02614 }, - { "unamused", 0x1f612 }, - { "underage", 0x1f51e }, - { "unlock", 0x1f513 }, - { "up", 0x1f199 }, - { "v", 0x0270c }, - { "vertical_traffic_light", 0x1f6a6 }, - { "vhs", 0x1f4fc }, - { "vibration_mode", 0x1f4f3 }, - { "video_camera", 0x1f4f9 }, - { "video_game", 0x1f3ae }, - { "violin", 0x1f3bb }, - { "virgo", 0x0264d }, - { "volcano", 0x1f30b }, - { "vs", 0x1f19a }, - { "walking", 0x1f6b6 }, - { "waning_crescent_moon", 0x1f318 }, - { "waning_gibbous_moon", 0x1f316 }, - { "warning", 0x026a0 }, - { "watch", 0x0231a }, - { "water_buffalo", 0x1f403 }, - { "watermelon", 0x1f349 }, - { "wave", 0x1f44b }, - { "wavy_dash", 0x03030 }, - { "waxing_crescent_moon", 0x1f312 }, - { "waxing_gibbous_moon", 0x1f314 }, - { "wc", 0x1f6be }, - { "weary", 0x1f629 }, - { "wedding", 0x1f492 }, - { "whale", 0x1f433 }, - { "whale2", 0x1f40b }, - { "wheelchair", 0x0267f }, - { "white_check_mark", 0x02705 }, - { "white_circle", 0x026aa }, - { "white_flower", 0x1f4ae }, - { "white_large_square", 0x02b1c }, - { "white_medium_small_square", 0x025fd }, - { "white_medium_square", 0x025fb }, - { "white_small_square", 0x025ab }, - { "white_square_button", 0x1f533 }, - { "wind_chime", 0x1f390 }, - { "wine_glass", 0x1f377 }, - { "wink", 0x1f609 }, - { "wolf", 0x1f43a }, - { "woman", 0x1f469 }, - { "womans_clothes", 0x1f45a }, - { "womans_hat", 0x1f452 }, - { "womens", 0x1f6ba }, - { "worried", 0x1f61f }, - { "wrench", 0x1f527 }, - { "x", 0x0274c }, - { "yellow_heart", 0x1f49b }, - { "yen", 0x1f4b4 }, - { "yum", 0x1f60b }, - { "zap", 0x026a1 }, - { "zzz", 0x1f4a4 } - }; - } + /// + /// A list of emoji. + /// I don't know where to put this other than a class, so uh, here you go. + /// + internal static class Emoji + { + /// + /// Maps Emoji shortcodes to Unicode code points. + /// + internal static readonly Dictionary Shortcodes = new Dictionary + { + { "+1", 0x1f44d }, + { "-1", 0x1f44e }, + { "100", 0x1f4af }, + { "1234", 0x1f522 }, + { "8ball", 0x1f3b1 }, + { "a", 0x1f170 }, + { "ab", 0x1f18e }, + { "abc", 0x1f524 }, + { "abcd", 0x1f521 }, + { "accept", 0x1f251 }, + { "aerial_tramway", 0x1f6a1 }, + { "airplane", 0x02708 }, + { "alarm_clock", 0x023f0 }, + { "alien", 0x1f47d }, + { "ambulance", 0x1f691 }, + { "anchor", 0x02693 }, + { "angel", 0x1f47c }, + { "anger", 0x1f4a2 }, + { "angry", 0x1f620 }, + { "anguished", 0x1f627 }, + { "ant", 0x1f41c }, + { "apple", 0x1f34e }, + { "aquarius", 0x02652 }, + { "aries", 0x02648 }, + { "arrow_backward", 0x025c0 }, + { "arrow_double_down", 0x023ec }, + { "arrow_double_up", 0x023eb }, + { "arrow_down", 0x02b07 }, + { "arrow_down_small", 0x1f53d }, + { "arrow_forward", 0x025b6 }, + { "arrow_heading_down", 0x02935 }, + { "arrow_heading_up", 0x02934 }, + { "arrow_left", 0x02b05 }, + { "arrow_lower_left", 0x02199 }, + { "arrow_lower_right", 0x02198 }, + { "arrow_right", 0x027a1 }, + { "arrow_right_hook", 0x021aa }, + { "arrow_up", 0x02b06 }, + { "arrow_up_down", 0x02195 }, + { "arrow_up_small", 0x1f53c }, + { "arrow_upper_left", 0x02196 }, + { "arrow_upper_right", 0x02197 }, + { "arrows_clockwise", 0x1f503 }, + { "arrows_counterclockwise", 0x1f504 }, + { "art", 0x1f3a8 }, + { "articulated_lorry", 0x1f69b }, + { "astonished", 0x1f632 }, + { "athletic_shoe", 0x1f45f }, + { "atm", 0x1f3e7 }, + { "b", 0x1f171 }, + { "baby", 0x1f476 }, + { "baby_bottle", 0x1f37c }, + { "baby_chick", 0x1f424 }, + { "baby_symbol", 0x1f6bc }, + { "back", 0x1f519 }, + { "baggage_claim", 0x1f6c4 }, + { "balloon", 0x1f388 }, + { "ballot_box_with_check", 0x02611 }, + { "bamboo", 0x1f38d }, + { "banana", 0x1f34c }, + { "bangbang", 0x0203c }, + { "bank", 0x1f3e6 }, + { "bar_chart", 0x1f4ca }, + { "barber", 0x1f488 }, + { "baseball", 0x026be }, + { "basketball", 0x1f3c0 }, + { "bath", 0x1f6c0 }, + { "bathtub", 0x1f6c1 }, + { "battery", 0x1f50b }, + { "bear", 0x1f43b }, + { "bee", 0x1f41d }, + { "beer", 0x1f37a }, + { "beers", 0x1f37b }, + { "beetle", 0x1f41e }, + { "beginner", 0x1f530 }, + { "bell", 0x1f514 }, + { "bento", 0x1f371 }, + { "bicyclist", 0x1f6b4 }, + { "bike", 0x1f6b2 }, + { "bikini", 0x1f459 }, + { "bird", 0x1f426 }, + { "birthday", 0x1f382 }, + { "black_circle", 0x026ab }, + { "black_joker", 0x1f0cf }, + { "black_large_square", 0x02b1b }, + { "black_medium_small_square", 0x025fe }, + { "black_medium_square", 0x025fc }, + { "black_nib", 0x02712 }, + { "black_small_square", 0x025aa }, + { "black_square_button", 0x1f532 }, + { "blossom", 0x1f33c }, + { "blowfish", 0x1f421 }, + { "blue_book", 0x1f4d8 }, + { "blue_car", 0x1f699 }, + { "blue_heart", 0x1f499 }, + { "blush", 0x1f60a }, + { "boar", 0x1f417 }, + { "boat", 0x026f5 }, + { "bomb", 0x1f4a3 }, + { "book", 0x1f4d6 }, + { "bookmark", 0x1f516 }, + { "bookmark_tabs", 0x1f4d1 }, + { "books", 0x1f4da }, + { "boom", 0x1f4a5 }, + { "boot", 0x1f462 }, + { "bouquet", 0x1f490 }, + { "bow", 0x1f647 }, + { "bowling", 0x1f3b3 }, + { "boy", 0x1f466 }, + { "bread", 0x1f35e }, + { "bride_with_veil", 0x1f470 }, + { "bridge_at_night", 0x1f309 }, + { "briefcase", 0x1f4bc }, + { "broken_heart", 0x1f494 }, + { "bug", 0x1f41b }, + { "bulb", 0x1f4a1 }, + { "bullettrain_front", 0x1f685 }, + { "bullettrain_side", 0x1f684 }, + { "bus", 0x1f68c }, + { "busstop", 0x1f68f }, + { "bust_in_silhouette", 0x1f464 }, + { "busts_in_silhouette", 0x1f465 }, + { "cactus", 0x1f335 }, + { "cake", 0x1f370 }, + { "calendar", 0x1f4c6 }, + { "calling", 0x1f4f2 }, + { "camel", 0x1f42b }, + { "camera", 0x1f4f7 }, + { "cancer", 0x0264b }, + { "candy", 0x1f36c }, + { "capital_abcd", 0x1f520 }, + { "capricorn", 0x02651 }, + { "car", 0x1f697 }, + { "card_index", 0x1f4c7 }, + { "carousel_horse", 0x1f3a0 }, + { "cat", 0x1f431 }, + { "cat2", 0x1f408 }, + { "cd", 0x1f4bf }, + { "chart", 0x1f4b9 }, + { "chart_with_downwards_trend", 0x1f4c9 }, + { "chart_with_upwards_trend", 0x1f4c8 }, + { "checkered_flag", 0x1f3c1 }, + { "cherries", 0x1f352 }, + { "cherry_blossom", 0x1f338 }, + { "chestnut", 0x1f330 }, + { "chicken", 0x1f414 }, + { "children_crossing", 0x1f6b8 }, + { "chocolate_bar", 0x1f36b }, + { "christmas_tree", 0x1f384 }, + { "church", 0x026ea }, + { "cinema", 0x1f3a6 }, + { "circus_tent", 0x1f3aa }, + { "city_sunrise", 0x1f307 }, + { "city_sunset", 0x1f306 }, + { "cl", 0x1f191 }, + { "clap", 0x1f44f }, + { "clapper", 0x1f3ac }, + { "clipboard", 0x1f4cb }, + { "clock1", 0x1f550 }, + { "clock10", 0x1f559 }, + { "clock1030", 0x1f565 }, + { "clock11", 0x1f55a }, + { "clock1130", 0x1f566 }, + { "clock12", 0x1f55b }, + { "clock1230", 0x1f567 }, + { "clock130", 0x1f55c }, + { "clock2", 0x1f551 }, + { "clock230", 0x1f55d }, + { "clock3", 0x1f552 }, + { "clock330", 0x1f55e }, + { "clock4", 0x1f553 }, + { "clock430", 0x1f55f }, + { "clock5", 0x1f554 }, + { "clock530", 0x1f560 }, + { "clock6", 0x1f555 }, + { "clock630", 0x1f561 }, + { "clock7", 0x1f556 }, + { "clock730", 0x1f562 }, + { "clock8", 0x1f557 }, + { "clock830", 0x1f563 }, + { "clock9", 0x1f558 }, + { "clock930", 0x1f564 }, + { "closed_book", 0x1f4d5 }, + { "closed_lock_with_key", 0x1f510 }, + { "closed_umbrella", 0x1f302 }, + { "cloud", 0x02601 }, + { "clubs", 0x02663 }, + { "cocktail", 0x1f378 }, + { "coffee", 0x02615 }, + { "cold_sweat", 0x1f630 }, + { "collision", 0x1f4a5 }, + { "computer", 0x1f4bb }, + { "confetti_ball", 0x1f38a }, + { "confounded", 0x1f616 }, + { "confused", 0x1f615 }, + { "congratulations", 0x03297 }, + { "construction", 0x1f6a7 }, + { "construction_worker", 0x1f477 }, + { "convenience_store", 0x1f3ea }, + { "cookie", 0x1f36a }, + { "cool", 0x1f192 }, + { "cop", 0x1f46e }, + { "copyright", 0x000a9 }, + { "corn", 0x1f33d }, + { "couple", 0x1f46b }, + { "couple_with_heart", 0x1f491 }, + { "couplekiss", 0x1f48f }, + { "cow", 0x1f42e }, + { "cow2", 0x1f404 }, + { "credit_card", 0x1f4b3 }, + { "crescent_moon", 0x1f319 }, + { "crocodile", 0x1f40a }, + { "crossed_flags", 0x1f38c }, + { "crown", 0x1f451 }, + { "cry", 0x1f622 }, + { "crying_cat_face", 0x1f63f }, + { "crystal_ball", 0x1f52e }, + { "cupid", 0x1f498 }, + { "curly_loop", 0x027b0 }, + { "currency_exchange", 0x1f4b1 }, + { "curry", 0x1f35b }, + { "custard", 0x1f36e }, + { "customs", 0x1f6c3 }, + { "cyclone", 0x1f300 }, + { "dancer", 0x1f483 }, + { "dancers", 0x1f46f }, + { "dango", 0x1f361 }, + { "dart", 0x1f3af }, + { "dash", 0x1f4a8 }, + { "date", 0x1f4c5 }, + { "deciduous_tree", 0x1f333 }, + { "department_store", 0x1f3ec }, + { "diamond_shape_with_a_dot_inside", 0x1f4a0 }, + { "diamonds", 0x02666 }, + { "disappointed", 0x1f61e }, + { "disappointed_relieved", 0x1f625 }, + { "dizzy", 0x1f4ab }, + { "dizzy_face", 0x1f635 }, + { "do_not_litter", 0x1f6af }, + { "dog", 0x1f436 }, + { "dog2", 0x1f415 }, + { "dollar", 0x1f4b5 }, + { "dolls", 0x1f38e }, + { "dolphin", 0x1f42c }, + { "door", 0x1f6aa }, + { "doughnut", 0x1f369 }, + { "dragon", 0x1f409 }, + { "dragon_face", 0x1f432 }, + { "dress", 0x1f457 }, + { "dromedary_camel", 0x1f42a }, + { "droplet", 0x1f4a7 }, + { "dvd", 0x1f4c0 }, + { "e-mail", 0x1f4e7 }, + { "ear", 0x1f442 }, + { "ear_of_rice", 0x1f33e }, + { "earth_africa", 0x1f30d }, + { "earth_americas", 0x1f30e }, + { "earth_asia", 0x1f30f }, + { "egg", 0x1f373 }, + { "eggplant", 0x1f346 }, + { "eight_pointed_black_star", 0x02734 }, + { "eight_spoked_asterisk", 0x02733 }, + { "electric_plug", 0x1f50c }, + { "elephant", 0x1f418 }, + { "email", 0x02709 }, + { "end", 0x1f51a }, + { "envelope", 0x02709 }, + { "envelope_with_arrow", 0x1f4e9 }, + { "euro", 0x1f4b6 }, + { "european_castle", 0x1f3f0 }, + { "european_post_office", 0x1f3e4 }, + { "evergreen_tree", 0x1f332 }, + { "exclamation", 0x02757 }, + { "expressionless", 0x1f611 }, + { "eyeglasses", 0x1f453 }, + { "eyes", 0x1f440 }, + { "facepunch", 0x1f44a }, + { "factory", 0x1f3ed }, + { "fallen_leaf", 0x1f342 }, + { "family", 0x1f46a }, + { "fast_forward", 0x023e9 }, + { "fax", 0x1f4e0 }, + { "fearful", 0x1f628 }, + { "feet", 0x1f43e }, + { "ferris_wheel", 0x1f3a1 }, + { "file_folder", 0x1f4c1 }, + { "fire", 0x1f525 }, + { "fire_engine", 0x1f692 }, + { "fireworks", 0x1f386 }, + { "first_quarter_moon", 0x1f313 }, + { "first_quarter_moon_with_face", 0x1f31b }, + { "fish", 0x1f41f }, + { "fish_cake", 0x1f365 }, + { "fishing_pole_and_fish", 0x1f3a3 }, + { "fist", 0x0270a }, + { "flags", 0x1f38f }, + { "flashlight", 0x1f526 }, + { "flipper", 0x1f42c }, + { "floppy_disk", 0x1f4be }, + { "flower_playing_cards", 0x1f3b4 }, + { "flushed", 0x1f633 }, + { "foggy", 0x1f301 }, + { "football", 0x1f3c8 }, + { "footprints", 0x1f463 }, + { "fork_and_knife", 0x1f374 }, + { "fountain", 0x026f2 }, + { "four_leaf_clover", 0x1f340 }, + { "free", 0x1f193 }, + { "fried_shrimp", 0x1f364 }, + { "fries", 0x1f35f }, + { "frog", 0x1f438 }, + { "frowning", 0x1f626 }, + { "fuelpump", 0x026fd }, + { "full_moon", 0x1f315 }, + { "full_moon_with_face", 0x1f31d }, + { "game_die", 0x1f3b2 }, + { "gem", 0x1f48e }, + { "gemini", 0x0264a }, + { "ghost", 0x1f47b }, + { "gift", 0x1f381 }, + { "gift_heart", 0x1f49d }, + { "girl", 0x1f467 }, + { "globe_with_meridians", 0x1f310 }, + { "goat", 0x1f410 }, + { "golf", 0x026f3 }, + { "grapes", 0x1f347 }, + { "green_apple", 0x1f34f }, + { "green_book", 0x1f4d7 }, + { "green_heart", 0x1f49a }, + { "grey_exclamation", 0x02755 }, + { "grey_question", 0x02754 }, + { "grimacing", 0x1f62c }, + { "grin", 0x1f601 }, + { "grinning", 0x1f600 }, + { "guardsman", 0x1f482 }, + { "guitar", 0x1f3b8 }, + { "gun", 0x1f52b }, + { "haircut", 0x1f487 }, + { "hamburger", 0x1f354 }, + { "hammer", 0x1f528 }, + { "hamster", 0x1f439 }, + { "hand", 0x0270b }, + { "handbag", 0x1f45c }, + { "hankey", 0x1f4a9 }, + { "hatched_chick", 0x1f425 }, + { "hatching_chick", 0x1f423 }, + { "headphones", 0x1f3a7 }, + { "hear_no_evil", 0x1f649 }, + { "heart", 0x02764 }, + { "heart_decoration", 0x1f49f }, + { "heart_eyes", 0x1f60d }, + { "heart_eyes_cat", 0x1f63b }, + { "heartbeat", 0x1f493 }, + { "heartpulse", 0x1f497 }, + { "hearts", 0x02665 }, + { "heavy_check_mark", 0x02714 }, + { "heavy_division_sign", 0x02797 }, + { "heavy_dollar_sign", 0x1f4b2 }, + { "heavy_exclamation_mark", 0x02757 }, + { "heavy_minus_sign", 0x02796 }, + { "heavy_multiplication_x", 0x02716 }, + { "heavy_plus_sign", 0x02795 }, + { "helicopter", 0x1f681 }, + { "herb", 0x1f33f }, + { "hibiscus", 0x1f33a }, + { "high_brightness", 0x1f506 }, + { "high_heel", 0x1f460 }, + { "hocho", 0x1f52a }, + { "honey_pot", 0x1f36f }, + { "honeybee", 0x1f41d }, + { "horse", 0x1f434 }, + { "horse_racing", 0x1f3c7 }, + { "hospital", 0x1f3e5 }, + { "hotel", 0x1f3e8 }, + { "hotsprings", 0x02668 }, + { "hourglass", 0x0231b }, + { "hourglass_flowing_sand", 0x023f3 }, + { "house", 0x1f3e0 }, + { "house_with_garden", 0x1f3e1 }, + { "hushed", 0x1f62f }, + { "ice_cream", 0x1f368 }, + { "icecream", 0x1f366 }, + { "id", 0x1f194 }, + { "ideograph_advantage", 0x1f250 }, + { "imp", 0x1f47f }, + { "inbox_tray", 0x1f4e5 }, + { "incoming_envelope", 0x1f4e8 }, + { "information_desk_person", 0x1f481 }, + { "information_source", 0x02139 }, + { "innocent", 0x1f607 }, + { "interrobang", 0x02049 }, + { "iphone", 0x1f4f1 }, + { "izakaya_lantern", 0x1f3ee }, + { "jack_o_lantern", 0x1f383 }, + { "japan", 0x1f5fe }, + { "japanese_castle", 0x1f3ef }, + { "japanese_goblin", 0x1f47a }, + { "japanese_ogre", 0x1f479 }, + { "jeans", 0x1f456 }, + { "joy", 0x1f602 }, + { "joy_cat", 0x1f639 }, + { "key", 0x1f511 }, + { "keycap_ten", 0x1f51f }, + { "kimono", 0x1f458 }, + { "kiss", 0x1f48b }, + { "kissing", 0x1f617 }, + { "kissing_cat", 0x1f63d }, + { "kissing_closed_eyes", 0x1f61a }, + { "kissing_heart", 0x1f618 }, + { "kissing_smiling_eyes", 0x1f619 }, + { "koala", 0x1f428 }, + { "koko", 0x1f201 }, + { "lantern", 0x1f3ee }, + { "large_blue_circle", 0x1f535 }, + { "large_blue_diamond", 0x1f537 }, + { "large_orange_diamond", 0x1f536 }, + { "last_quarter_moon", 0x1f317 }, + { "last_quarter_moon_with_face", 0x1f31c }, + { "laughing", 0x1f606 }, + { "leaves", 0x1f343 }, + { "ledger", 0x1f4d2 }, + { "left_luggage", 0x1f6c5 }, + { "left_right_arrow", 0x02194 }, + { "leftwards_arrow_with_hook", 0x021a9 }, + { "lemon", 0x1f34b }, + { "leo", 0x0264c }, + { "leopard", 0x1f406 }, + { "libra", 0x0264e }, + { "light_rail", 0x1f688 }, + { "link", 0x1f517 }, + { "lips", 0x1f444 }, + { "lipstick", 0x1f484 }, + { "lock", 0x1f512 }, + { "lock_with_ink_pen", 0x1f50f }, + { "lollipop", 0x1f36d }, + { "loop", 0x027bf }, + { "loudspeaker", 0x1f4e2 }, + { "love_hotel", 0x1f3e9 }, + { "love_letter", 0x1f48c }, + { "low_brightness", 0x1f505 }, + { "m", 0x024c2 }, + { "mag", 0x1f50d }, + { "mag_right", 0x1f50e }, + { "mahjong", 0x1f004 }, + { "mailbox", 0x1f4eb }, + { "mailbox_closed", 0x1f4ea }, + { "mailbox_with_mail", 0x1f4ec }, + { "mailbox_with_no_mail", 0x1f4ed }, + { "man", 0x1f468 }, + { "man_with_gua_pi_mao", 0x1f472 }, + { "man_with_turban", 0x1f473 }, + { "mans_shoe", 0x1f45e }, + { "maple_leaf", 0x1f341 }, + { "mask", 0x1f637 }, + { "massage", 0x1f486 }, + { "meat_on_bone", 0x1f356 }, + { "mega", 0x1f4e3 }, + { "melon", 0x1f348 }, + { "memo", 0x1f4dd }, + { "mens", 0x1f6b9 }, + { "metro", 0x1f687 }, + { "microphone", 0x1f3a4 }, + { "microscope", 0x1f52c }, + { "milky_way", 0x1f30c }, + { "minibus", 0x1f690 }, + { "minidisc", 0x1f4bd }, + { "mobile_phone_off", 0x1f4f4 }, + { "money_with_wings", 0x1f4b8 }, + { "moneybag", 0x1f4b0 }, + { "monkey", 0x1f412 }, + { "monkey_face", 0x1f435 }, + { "monorail", 0x1f69d }, + { "moon", 0x1f314 }, + { "mortar_board", 0x1f393 }, + { "mount_fuji", 0x1f5fb }, + { "mountain_bicyclist", 0x1f6b5 }, + { "mountain_cableway", 0x1f6a0 }, + { "mountain_railway", 0x1f69e }, + { "mouse", 0x1f42d }, + { "mouse2", 0x1f401 }, + { "movie_camera", 0x1f3a5 }, + { "moyai", 0x1f5ff }, + { "muscle", 0x1f4aa }, + { "mushroom", 0x1f344 }, + { "musical_keyboard", 0x1f3b9 }, + { "musical_note", 0x1f3b5 }, + { "musical_score", 0x1f3bc }, + { "mute", 0x1f507 }, + { "nail_care", 0x1f485 }, + { "name_badge", 0x1f4db }, + { "necktie", 0x1f454 }, + { "negative_squared_cross_mark", 0x0274e }, + { "neutral_face", 0x1f610 }, + { "new", 0x1f195 }, + { "new_moon", 0x1f311 }, + { "new_moon_with_face", 0x1f31a }, + { "newspaper", 0x1f4f0 }, + { "ng", 0x1f196 }, + { "no_bell", 0x1f515 }, + { "no_bicycles", 0x1f6b3 }, + { "no_entry", 0x026d4 }, + { "no_entry_sign", 0x1f6ab }, + { "no_good", 0x1f645 }, + { "no_mobile_phones", 0x1f4f5 }, + { "no_mouth", 0x1f636 }, + { "no_pedestrians", 0x1f6b7 }, + { "no_smoking", 0x1f6ad }, + { "non-potable_water", 0x1f6b1 }, + { "nose", 0x1f443 }, + { "notebook", 0x1f4d3 }, + { "notebook_with_decorative_cover", 0x1f4d4 }, + { "notes", 0x1f3b6 }, + { "nut_and_bolt", 0x1f529 }, + { "o", 0x02b55 }, + { "o2", 0x1f17e }, + { "ocean", 0x1f30a }, + { "octopus", 0x1f419 }, + { "oden", 0x1f362 }, + { "office", 0x1f3e2 }, + { "ok", 0x1f197 }, + { "ok_hand", 0x1f44c }, + { "ok_woman", 0x1f646 }, + { "older_man", 0x1f474 }, + { "older_woman", 0x1f475 }, + { "on", 0x1f51b }, + { "oncoming_automobile", 0x1f698 }, + { "oncoming_bus", 0x1f68d }, + { "oncoming_police_car", 0x1f694 }, + { "oncoming_taxi", 0x1f696 }, + { "open_book", 0x1f4d6 }, + { "open_file_folder", 0x1f4c2 }, + { "open_hands", 0x1f450 }, + { "open_mouth", 0x1f62e }, + { "ophiuchus", 0x026ce }, + { "orange_book", 0x1f4d9 }, + { "outbox_tray", 0x1f4e4 }, + { "ox", 0x1f402 }, + { "package", 0x1f4e6 }, + { "page_facing_up", 0x1f4c4 }, + { "page_with_curl", 0x1f4c3 }, + { "pager", 0x1f4df }, + { "palm_tree", 0x1f334 }, + { "panda_face", 0x1f43c }, + { "paperclip", 0x1f4ce }, + { "parking", 0x1f17f }, + { "part_alternation_mark", 0x0303d }, + { "partly_sunny", 0x026c5 }, + { "passport_control", 0x1f6c2 }, + { "paw_prints", 0x1f43e }, + { "peach", 0x1f351 }, + { "pear", 0x1f350 }, + { "pencil", 0x1f4dd }, + { "pencil2", 0x0270f }, + { "penguin", 0x1f427 }, + { "pensive", 0x1f614 }, + { "performing_arts", 0x1f3ad }, + { "persevere", 0x1f623 }, + { "person_frowning", 0x1f64d }, + { "person_with_blond_hair", 0x1f471 }, + { "person_with_pouting_face", 0x1f64e }, + { "phone", 0x0260e }, + { "pig", 0x1f437 }, + { "pig2", 0x1f416 }, + { "pig_nose", 0x1f43d }, + { "pill", 0x1f48a }, + { "pineapple", 0x1f34d }, + { "pisces", 0x02653 }, + { "pizza", 0x1f355 }, + { "point_down", 0x1f447 }, + { "point_left", 0x1f448 }, + { "point_right", 0x1f449 }, + { "point_up", 0x0261d }, + { "point_up_2", 0x1f446 }, + { "police_car", 0x1f693 }, + { "poodle", 0x1f429 }, + { "poop", 0x1f4a9 }, + { "post_office", 0x1f3e3 }, + { "postal_horn", 0x1f4ef }, + { "postbox", 0x1f4ee }, + { "potable_water", 0x1f6b0 }, + { "pouch", 0x1f45d }, + { "poultry_leg", 0x1f357 }, + { "pound", 0x1f4b7 }, + { "pouting_cat", 0x1f63e }, + { "pray", 0x1f64f }, + { "princess", 0x1f478 }, + { "punch", 0x1f44a }, + { "purple_heart", 0x1f49c }, + { "purse", 0x1f45b }, + { "pushpin", 0x1f4cc }, + { "put_litter_in_its_place", 0x1f6ae }, + { "question", 0x02753 }, + { "rabbit", 0x1f430 }, + { "rabbit2", 0x1f407 }, + { "racehorse", 0x1f40e }, + { "radio", 0x1f4fb }, + { "radio_button", 0x1f518 }, + { "rage", 0x1f621 }, + { "railway_car", 0x1f683 }, + { "rainbow", 0x1f308 }, + { "raised_hand", 0x0270b }, + { "raised_hands", 0x1f64c }, + { "raising_hand", 0x1f64b }, + { "ram", 0x1f40f }, + { "ramen", 0x1f35c }, + { "rat", 0x1f400 }, + { "recycle", 0x0267b }, + { "red_car", 0x1f697 }, + { "red_circle", 0x1f534 }, + { "registered", 0x000ae }, + { "relaxed", 0x0263a }, + { "relieved", 0x1f60c }, + { "repeat", 0x1f501 }, + { "repeat_one", 0x1f502 }, + { "restroom", 0x1f6bb }, + { "revolving_hearts", 0x1f49e }, + { "rewind", 0x023ea }, + { "ribbon", 0x1f380 }, + { "rice", 0x1f35a }, + { "rice_ball", 0x1f359 }, + { "rice_cracker", 0x1f358 }, + { "rice_scene", 0x1f391 }, + { "ring", 0x1f48d }, + { "rocket", 0x1f680 }, + { "roller_coaster", 0x1f3a2 }, + { "rooster", 0x1f413 }, + { "rose", 0x1f339 }, + { "rotating_light", 0x1f6a8 }, + { "round_pushpin", 0x1f4cd }, + { "rowboat", 0x1f6a3 }, + { "rugby_football", 0x1f3c9 }, + { "runner", 0x1f3c3 }, + { "running", 0x1f3c3 }, + { "running_shirt_with_sash", 0x1f3bd }, + { "sa", 0x1f202 }, + { "sagittarius", 0x02650 }, + { "sailboat", 0x026f5 }, + { "sake", 0x1f376 }, + { "sandal", 0x1f461 }, + { "santa", 0x1f385 }, + { "satellite", 0x1f4e1 }, + { "satisfied", 0x1f606 }, + { "saxophone", 0x1f3b7 }, + { "school", 0x1f3eb }, + { "school_satchel", 0x1f392 }, + { "scissors", 0x02702 }, + { "scorpius", 0x0264f }, + { "scream", 0x1f631 }, + { "scream_cat", 0x1f640 }, + { "scroll", 0x1f4dc }, + { "seat", 0x1f4ba }, + { "secret", 0x03299 }, + { "see_no_evil", 0x1f648 }, + { "seedling", 0x1f331 }, + { "shaved_ice", 0x1f367 }, + { "sheep", 0x1f411 }, + { "shell", 0x1f41a }, + { "ship", 0x1f6a2 }, + { "shirt", 0x1f455 }, + { "shit", 0x1f4a9 }, + { "shoe", 0x1f45e }, + { "shower", 0x1f6bf }, + { "signal_strength", 0x1f4f6 }, + { "six_pointed_star", 0x1f52f }, + { "ski", 0x1f3bf }, + { "skull", 0x1f480 }, + { "sleeping", 0x1f634 }, + { "sleepy", 0x1f62a }, + { "slot_machine", 0x1f3b0 }, + { "small_blue_diamond", 0x1f539 }, + { "small_orange_diamond", 0x1f538 }, + { "small_red_triangle", 0x1f53a }, + { "small_red_triangle_down", 0x1f53b }, + { "smile", 0x1f604 }, + { "smile_cat", 0x1f638 }, + { "smiley", 0x1f603 }, + { "smiley_cat", 0x1f63a }, + { "smiling_imp", 0x1f608 }, + { "smirk", 0x1f60f }, + { "smirk_cat", 0x1f63c }, + { "smoking", 0x1f6ac }, + { "snail", 0x1f40c }, + { "snake", 0x1f40d }, + { "snowboarder", 0x1f3c2 }, + { "snowflake", 0x02744 }, + { "snowman", 0x026c4 }, + { "sob", 0x1f62d }, + { "soccer", 0x026bd }, + { "soon", 0x1f51c }, + { "sos", 0x1f198 }, + { "sound", 0x1f509 }, + { "space_invader", 0x1f47e }, + { "spades", 0x02660 }, + { "spaghetti", 0x1f35d }, + { "sparkle", 0x02747 }, + { "sparkler", 0x1f387 }, + { "sparkles", 0x02728 }, + { "sparkling_heart", 0x1f496 }, + { "speak_no_evil", 0x1f64a }, + { "speaker", 0x1f50a }, + { "speech_balloon", 0x1f4ac }, + { "speedboat", 0x1f6a4 }, + { "star", 0x02b50 }, + { "star2", 0x1f31f }, + { "stars", 0x1f303 }, + { "station", 0x1f689 }, + { "statue_of_liberty", 0x1f5fd }, + { "steam_locomotive", 0x1f682 }, + { "stew", 0x1f372 }, + { "straight_ruler", 0x1f4cf }, + { "strawberry", 0x1f353 }, + { "stuck_out_tongue", 0x1f61b }, + { "stuck_out_tongue_closed_eyes", 0x1f61d }, + { "stuck_out_tongue_winking_eye", 0x1f61c }, + { "sun_with_face", 0x1f31e }, + { "sunflower", 0x1f33b }, + { "sunglasses", 0x1f60e }, + { "sunny", 0x02600 }, + { "sunrise", 0x1f305 }, + { "sunrise_over_mountains", 0x1f304 }, + { "surfer", 0x1f3c4 }, + { "sushi", 0x1f363 }, + { "suspension_railway", 0x1f69f }, + { "sweat", 0x1f613 }, + { "sweat_drops", 0x1f4a6 }, + { "sweat_smile", 0x1f605 }, + { "sweet_potato", 0x1f360 }, + { "swimmer", 0x1f3ca }, + { "symbols", 0x1f523 }, + { "syringe", 0x1f489 }, + { "tada", 0x1f389 }, + { "tanabata_tree", 0x1f38b }, + { "tangerine", 0x1f34a }, + { "taurus", 0x02649 }, + { "taxi", 0x1f695 }, + { "tea", 0x1f375 }, + { "telephone", 0x0260e }, + { "telephone_receiver", 0x1f4de }, + { "telescope", 0x1f52d }, + { "tennis", 0x1f3be }, + { "tent", 0x026fa }, + { "thought_balloon", 0x1f4ad }, + { "thumbsdown", 0x1f44e }, + { "thumbsup", 0x1f44d }, + { "ticket", 0x1f3ab }, + { "tiger", 0x1f42f }, + { "tiger2", 0x1f405 }, + { "tired_face", 0x1f62b }, + { "tm", 0x02122 }, + { "toilet", 0x1f6bd }, + { "tokyo_tower", 0x1f5fc }, + { "tomato", 0x1f345 }, + { "tongue", 0x1f445 }, + { "top", 0x1f51d }, + { "tophat", 0x1f3a9 }, + { "tractor", 0x1f69c }, + { "traffic_light", 0x1f6a5 }, + { "train", 0x1f683 }, + { "train2", 0x1f686 }, + { "tram", 0x1f68a }, + { "triangular_flag_on_post", 0x1f6a9 }, + { "triangular_ruler", 0x1f4d0 }, + { "trident", 0x1f531 }, + { "triumph", 0x1f624 }, + { "trolleybus", 0x1f68e }, + { "trophy", 0x1f3c6 }, + { "tropical_drink", 0x1f379 }, + { "tropical_fish", 0x1f420 }, + { "truck", 0x1f69a }, + { "trumpet", 0x1f3ba }, + { "tshirt", 0x1f455 }, + { "tulip", 0x1f337 }, + { "turtle", 0x1f422 }, + { "tv", 0x1f4fa }, + { "twisted_rightwards_arrows", 0x1f500 }, + { "two_hearts", 0x1f495 }, + { "two_men_holding_hands", 0x1f46c }, + { "two_women_holding_hands", 0x1f46d }, + { "u5272", 0x1f239 }, + { "u5408", 0x1f234 }, + { "u55b6", 0x1f23a }, + { "u6307", 0x1f22f }, + { "u6708", 0x1f237 }, + { "u6709", 0x1f236 }, + { "u6e80", 0x1f235 }, + { "u7121", 0x1f21a }, + { "u7533", 0x1f238 }, + { "u7981", 0x1f232 }, + { "u7a7a", 0x1f233 }, + { "umbrella", 0x02614 }, + { "unamused", 0x1f612 }, + { "underage", 0x1f51e }, + { "unlock", 0x1f513 }, + { "up", 0x1f199 }, + { "v", 0x0270c }, + { "vertical_traffic_light", 0x1f6a6 }, + { "vhs", 0x1f4fc }, + { "vibration_mode", 0x1f4f3 }, + { "video_camera", 0x1f4f9 }, + { "video_game", 0x1f3ae }, + { "violin", 0x1f3bb }, + { "virgo", 0x0264d }, + { "volcano", 0x1f30b }, + { "vs", 0x1f19a }, + { "walking", 0x1f6b6 }, + { "waning_crescent_moon", 0x1f318 }, + { "waning_gibbous_moon", 0x1f316 }, + { "warning", 0x026a0 }, + { "watch", 0x0231a }, + { "water_buffalo", 0x1f403 }, + { "watermelon", 0x1f349 }, + { "wave", 0x1f44b }, + { "wavy_dash", 0x03030 }, + { "waxing_crescent_moon", 0x1f312 }, + { "waxing_gibbous_moon", 0x1f314 }, + { "wc", 0x1f6be }, + { "weary", 0x1f629 }, + { "wedding", 0x1f492 }, + { "whale", 0x1f433 }, + { "whale2", 0x1f40b }, + { "wheelchair", 0x0267f }, + { "white_check_mark", 0x02705 }, + { "white_circle", 0x026aa }, + { "white_flower", 0x1f4ae }, + { "white_large_square", 0x02b1c }, + { "white_medium_small_square", 0x025fd }, + { "white_medium_square", 0x025fb }, + { "white_small_square", 0x025ab }, + { "white_square_button", 0x1f533 }, + { "wind_chime", 0x1f390 }, + { "wine_glass", 0x1f377 }, + { "wink", 0x1f609 }, + { "wolf", 0x1f43a }, + { "woman", 0x1f469 }, + { "womans_clothes", 0x1f45a }, + { "womans_hat", 0x1f452 }, + { "womens", 0x1f6ba }, + { "worried", 0x1f61f }, + { "wrench", 0x1f527 }, + { "x", 0x0274c }, + { "yellow_heart", 0x1f49b }, + { "yen", 0x1f4b4 }, + { "yum", 0x1f60b }, + { "zap", 0x026a1 }, + { "zzz", 0x1f4a4 } + }; + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/Endianness.cs b/Rant/Core/Formatting/Endianness.cs index 0ecf11a..63ed1be 100644 --- a/Rant/Core/Formatting/Endianness.cs +++ b/Rant/Core/Formatting/Endianness.cs @@ -27,15 +27,15 @@ namespace Rant.Core.Formatting { - internal enum Endianness - { - [RantDescription("Big endian.")] - Big, + internal enum Endianness + { + [RantDescription("Big endian.")] + Big, - [RantDescription("Little endian.")] - Little, + [RantDescription("Little endian.")] + Little, - [RantDescription("Whatever endianness your system uses.")] - Default - } + [RantDescription("Whatever endianness your system uses.")] + Default + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/HexFormat.cs b/Rant/Core/Formatting/HexFormat.cs index efffea6..b57a8d3 100644 --- a/Rant/Core/Formatting/HexFormat.cs +++ b/Rant/Core/Formatting/HexFormat.cs @@ -27,15 +27,15 @@ namespace Rant.Core.Formatting { - internal enum BinaryFormat - { - [RantDescription("Use as many digits as necessary to accomodate the number.")] - Normal, + internal enum BinaryFormat + { + [RantDescription("Use as many digits as necessary to accomodate the number.")] + Normal, - [RantDescription("Pad numbers to a specific number of digits.")] - Pad, + [RantDescription("Pad numbers to a specific number of digits.")] + Pad, - [RantDescription("Truncate numbers over a specific number of digits.")] - Truncate - } + [RantDescription("Truncate numbers over a specific number of digits.")] + Truncate + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/NumberFormat.cs b/Rant/Core/Formatting/NumberFormat.cs index 88b7e9f..b84658a 100644 --- a/Rant/Core/Formatting/NumberFormat.cs +++ b/Rant/Core/Formatting/NumberFormat.cs @@ -27,42 +27,42 @@ namespace Rant.Core.Formatting { - internal enum NumberFormat - { - [RantDescription("No special formatting.")] - Normal, + internal enum NumberFormat + { + [RantDescription("No special formatting.")] + Normal, - [RantDescription("Group digits with the system's digit separator.")] - Group, + [RantDescription("Group digits with the system's digit separator.")] + Group, - [RantDescription("Group digits by commas.")] - GroupCommas, + [RantDescription("Group digits by commas.")] + GroupCommas, - [RantDescription("Group digits by dots.")] - GroupDots, + [RantDescription("Group digits by dots.")] + GroupDots, - [RantDescription("Uppercase Roman numerals.")] - Roman, + [RantDescription("Uppercase Roman numerals.")] + Roman, - [RantDescription("Uppercase Roman numerals.")] - RomanUpper, + [RantDescription("Uppercase Roman numerals.")] + RomanUpper, - [RantDescription("Lowercase Roman numerals.")] - RomanLower, + [RantDescription("Lowercase Roman numerals.")] + RomanLower, - [RantDescription("US English spellings of numbers. Only works with integers.")] - VerbalEn, + [RantDescription("US English spellings of numbers. Only works with integers.")] + VerbalEn, - [RantDescription("Uppercase hexadecimal.")] - Hex, + [RantDescription("Uppercase hexadecimal.")] + Hex, - [RantDescription("Uppercase hexadecimal.")] - HexUpper, + [RantDescription("Uppercase hexadecimal.")] + HexUpper, - [RantDescription("Lowercase hexadecimal.")] - HexLower, + [RantDescription("Lowercase hexadecimal.")] + HexLower, - [RantDescription("Robot language.")] - Binary - } + [RantDescription("Robot language.")] + Binary + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/NumberFormatter.cs b/Rant/Core/Formatting/NumberFormatter.cs index 047535b..bf151c3 100644 --- a/Rant/Core/Formatting/NumberFormatter.cs +++ b/Rant/Core/Formatting/NumberFormatter.cs @@ -29,113 +29,115 @@ namespace Rant.Core.Formatting { - internal class NumberFormatter - { - private static readonly NumberFormatInfo CommaGroupFormat = new NumberFormatInfo - { - NumberGroupSizes = new[] { 3 }, - NumberGroupSeparator = ",", - NumberDecimalSeparator = "." - }; - - private static readonly NumberFormatInfo DotGroupFormat = new NumberFormatInfo - { - NumberGroupSizes = new[] { 3 }, - NumberGroupSeparator = ".", - NumberDecimalSeparator = "," - }; - - public Endianness Endianness { get; set; } = Endianness.Default; - public BinaryFormat BinaryFormat { get; set; } = BinaryFormat.Normal; - public NumberFormat NumberFormat { get; set; } = NumberFormat.Normal; - public int BinaryFormatDigits { get; set; } = 8; - - public string FormatNumber(double number) - { - switch (NumberFormat) - { - case NumberFormat.Normal: - return number.ToString(CultureInfo.InvariantCulture); - case NumberFormat.Group: - return $"{number:n0}"; - case NumberFormat.GroupCommas: - return number.ToString("n0", CommaGroupFormat); - case NumberFormat.GroupDots: - return number.ToString("n0", DotGroupFormat); - case NumberFormat.Roman: - case NumberFormat.RomanUpper: - return Numerals.ToRoman(number); - case NumberFormat.RomanLower: - return Numerals.ToRoman(number, true); - case NumberFormat.VerbalEn: - return number % 1 > 0 ? "?" : Numerals.ToVerbal((long)number); - case NumberFormat.Hex: - case NumberFormat.HexUpper: - return GetHex((long)number, true); - case NumberFormat.HexLower: - return GetHex((long)number, false); - case NumberFormat.Binary: - return GetBinary((long)number); - } - return number.ToString(CultureInfo.InvariantCulture); - } - - private string GetHex(long number, bool uppercase) - { - string hexString = Convert.ToString(number, 16); - int targetLength = BinaryFormat == BinaryFormat.Pad && hexString.Length < BinaryFormatDigits - ? BinaryFormatDigits - : hexString.Length; - int numBytes = targetLength % 2 != 0 ? (int)Math.Ceiling((double)targetLength / 2) : targetLength / 2; - var bytes = new string[numBytes]; - if (BinaryFormat == BinaryFormat.Pad && hexString.Length < BinaryFormatDigits) - for (int i = hexString.Length; i < BinaryFormatDigits; i++) - hexString = '0' + hexString; - if (hexString.Length % 2 != 0) - hexString = "0" + hexString; - - for (int i = 0; i < bytes.Length; i++) - bytes[i] = hexString[i * 2].ToString() + hexString[i * 2 + 1].ToString(); - - if (Endianness != Endianness.Default && BitConverter.IsLittleEndian != (Endianness == Endianness.Little)) - bytes = bytes.Reverse().ToArray(); - - string finalString = string.Join("", bytes); - - return uppercase ? finalString.ToUpper() : finalString; - } - - private string GetBinary(long number) - { - bool needsReverse = Endianness != Endianness.Default && - BitConverter.IsLittleEndian != (Endianness == Endianness.Little); - string hexString = Convert.ToString(number, 2); - if (needsReverse && hexString.Length % 8 != 0) hexString = new string('0', hexString.Length % 8) + hexString; - - int origLength = hexString.Length; - int finalLength = - BinaryFormat == BinaryFormat.Pad - ? (origLength < BinaryFormatDigits * 4 ? BinaryFormatDigits * 4 : origLength) - : BinaryFormat == BinaryFormat.Truncate - ? (origLength < BinaryFormatDigits * 4 ? origLength : BinaryFormatDigits * 4) - : origLength; - - var chars = new char[finalLength]; - for (int i = 0; i < finalLength; i++) chars[i] = '0'; - - if (needsReverse) - { - for (int i = 0; i < origLength; i += 8) - for (int j = 0; j < 8; j++) - chars[finalLength - i - (8 - j)] = hexString[i + j]; - } - else - { - int truncatedOrigin = origLength > finalLength ? origLength - finalLength : 0; - int truncatedLength = origLength > finalLength ? finalLength : origLength; - hexString.CopyTo(truncatedOrigin, chars, finalLength - truncatedLength, truncatedLength); - } - return new string(chars); - } - } + internal class NumberFormatter + { + private static readonly NumberFormatInfo CommaGroupFormat = new NumberFormatInfo + { + NumberGroupSizes = new[] { 3 }, + NumberGroupSeparator = ",", + NumberDecimalSeparator = "." + }; + + private static readonly NumberFormatInfo DotGroupFormat = new NumberFormatInfo + { + NumberGroupSizes = new[] { 3 }, + NumberGroupSeparator = ".", + NumberDecimalSeparator = "," + }; + + public Endianness Endianness { get; set; } = Endianness.Default; + public BinaryFormat BinaryFormat { get; set; } = BinaryFormat.Normal; + public NumberFormat NumberFormat { get; set; } = NumberFormat.Normal; + public int BinaryFormatDigits { get; set; } = 8; + + public string FormatNumber(double number) + { + switch (NumberFormat) + { + case NumberFormat.Normal: + return number.ToString(CultureInfo.InvariantCulture); + case NumberFormat.Group: + return $"{number:n0}"; + case NumberFormat.GroupCommas: + return number.ToString("n0", CommaGroupFormat); + case NumberFormat.GroupDots: + return number.ToString("n0", DotGroupFormat); + case NumberFormat.Roman: + case NumberFormat.RomanUpper: + return Numerals.ToRoman(number); + case NumberFormat.RomanLower: + return Numerals.ToRoman(number, true); + case NumberFormat.VerbalEn: + return number % 1 > 0 ? "?" : Numerals.ToVerbal((long)number); + case NumberFormat.Hex: + case NumberFormat.HexUpper: + return GetHex((long)number, true); + case NumberFormat.HexLower: + return GetHex((long)number, false); + case NumberFormat.Binary: + return GetBinary((long)number); + } + return number.ToString(CultureInfo.InvariantCulture); + } + + private string GetHex(long number, bool uppercase) + { + string hexString = Convert.ToString(number, 16); + int targetLength = BinaryFormat == BinaryFormat.Pad && hexString.Length < BinaryFormatDigits + ? BinaryFormatDigits + : hexString.Length; + int numBytes = targetLength % 2 != 0 ? (int)Math.Ceiling((double)targetLength / 2) : targetLength / 2; + var bytes = new string[numBytes]; + if (BinaryFormat == BinaryFormat.Pad && hexString.Length < BinaryFormatDigits) + { + for (int i = hexString.Length; i < BinaryFormatDigits; i++) + hexString = '0' + hexString; + } + if (hexString.Length % 2 != 0) + hexString = "0" + hexString; + + for (int i = 0; i < bytes.Length; i++) + bytes[i] = hexString[i * 2].ToString() + hexString[i * 2 + 1].ToString(); + + if (Endianness != Endianness.Default && BitConverter.IsLittleEndian != (Endianness == Endianness.Little)) + bytes = bytes.Reverse().ToArray(); + + string finalString = string.Join("", bytes); + + return uppercase ? finalString.ToUpper() : finalString; + } + + private string GetBinary(long number) + { + bool needsReverse = Endianness != Endianness.Default && + BitConverter.IsLittleEndian != (Endianness == Endianness.Little); + string hexString = Convert.ToString(number, 2); + if (needsReverse && hexString.Length % 8 != 0) hexString = new string('0', hexString.Length % 8) + hexString; + + int origLength = hexString.Length; + int finalLength = + BinaryFormat == BinaryFormat.Pad + ? (origLength < BinaryFormatDigits * 4 ? BinaryFormatDigits * 4 : origLength) + : BinaryFormat == BinaryFormat.Truncate + ? (origLength < BinaryFormatDigits * 4 ? origLength : BinaryFormatDigits * 4) + : origLength; + + var chars = new char[finalLength]; + for (int i = 0; i < finalLength; i++) chars[i] = '0'; + + if (needsReverse) + { + for (int i = 0; i < origLength; i += 8) + for (int j = 0; j < 8; j++) + chars[finalLength - i - (8 - j)] = hexString[i + j]; + } + else + { + int truncatedOrigin = origLength > finalLength ? origLength - finalLength : 0; + int truncatedLength = origLength > finalLength ? finalLength : origLength; + hexString.CopyTo(truncatedOrigin, chars, finalLength - truncatedLength, truncatedLength); + } + return new string(chars); + } + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/Numerals.cs b/Rant/Core/Formatting/Numerals.cs index 16b52f1..2142257 100644 --- a/Rant/Core/Formatting/Numerals.cs +++ b/Rant/Core/Formatting/Numerals.cs @@ -30,170 +30,172 @@ namespace Rant.Core.Formatting { - internal static class Numerals - { - public const int MaxRomanValue = 3999; - - private static readonly string[][] RomanNumerals = - { - new[] { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }, - new[] { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" }, - new[] { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" }, - new[] { "", "M", "MM", "MMM" } - }; - - private static readonly List<_> Powers; - private static readonly List<_> Hundreds; - private static readonly List<_> TenUnits; - private static readonly List<_> Tens; - - static Numerals() - { - Powers = new List<_> - { - _.Create(100L, "hundred"), - _.Create(1000L, "thousand"), - _.Create(1000000L, "million"), - _.Create(1000000000L, "billion"), - _.Create(1000000000000L, "trillion"), - _.Create(1000000000000000L, "quadrillion"), - _.Create(1000000000000000000L, "quintillion") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - - Hundreds = new List<_> - { - _.Create(100L, "one hundred"), - _.Create(200L, "two hundred"), - _.Create(300L, "three hundred"), - _.Create(400L, "four hundred"), - _.Create(500L, "five hundred"), - _.Create(600L, "six hundred"), - _.Create(700L, "seven hundred"), - _.Create(800L, "eight hundred"), - _.Create(900L, "nine hundred") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - - TenUnits = new List<_> - { - _.Create(90, "ninety"), - _.Create(80, "eighty"), - _.Create(70, "seventy"), - _.Create(60, "sixty"), - _.Create(50, "fifty"), - _.Create(40, "forty"), - _.Create(30, "thirty"), - _.Create(20, "twenty") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - - Tens = new List<_> - { - _.Create(19, "nineteen"), - _.Create(18, "eighteen"), - _.Create(17, "seventeen"), - _.Create(16, "sixteen"), - _.Create(15, "fifteen"), - _.Create(14, "fourteen"), - _.Create(13, "thirteen"), - _.Create(12, "twelve"), - _.Create(11, "eleven"), - _.Create(10, "ten"), - _.Create(9, "nine"), - _.Create(8, "eight"), - _.Create(7, "seven"), - _.Create(6, "six"), - _.Create(5, "five"), - _.Create(4, "four"), - _.Create(3, "three"), - _.Create(2, "two"), - _.Create(1, "one") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - } - - public static string ToRoman(double number, bool lowerCase = false) - { - if (number <= 0 || number > MaxRomanValue || number % 1 > 0) return "?"; - var intArr = - number.ToString(CultureInfo.InvariantCulture) - .Reverse() - .Select(c => int.Parse(c.ToString(CultureInfo.InvariantCulture))) - .ToArray(); - var sb = new StringBuilder(); - for (int i = intArr.Length; i-- > 0;) - sb.Append(RomanNumerals[i][intArr[i]]); - return lowerCase ? sb.ToString().ToLower() : sb.ToString(); - } - - public static string ToVerbal(long number) - { - if (number == 0) return "zero"; - - var numBuilder = new StringBuilder(); - - if (number < 0) - { - numBuilder.Append("negative "); - number *= -1; - } - - // The input stack contains number units for the loop to translate - var input = new Queue<_>(); - - long unit = 0; - - foreach (var power in Powers) - { - if (number < power.Item1) continue; - unit = number / power.Item1; // Count of current unit (1-999) - number -= unit * power.Item1; // Strip the units from the number - input.Enqueue(_.Create(unit, power.Item2)); - } - - input.Enqueue(_.Create(number, "")); - - var buffer = new StringBuilder(); - - while (input.Any()) - { - var pair = input.Dequeue(); - long value = pair.Item1; - if (value == 0) continue; - - if (numBuilder.Length > 0) - if (input.Any()) - numBuilder.Append(", "); - else if (value > 0) - numBuilder.Append(" and "); - - buffer.Length = 0; - - foreach (var hundred in Hundreds) - { - if (value < hundred.Item1) continue; - value -= hundred.Item1; - buffer.AppendFormat("{0}{1}{2}", buffer.Length > 0 ? " " : string.Empty, hundred.Item2, - value > 0 ? " and" : string.Empty); - } - - foreach (var tenunit in TenUnits) - { - if (value < tenunit.Item1) continue; - value -= tenunit.Item1; - buffer.AppendFormat("{0}{1}", buffer.Length > 0 ? " " : string.Empty, tenunit.Item2); - break; - } - - foreach (var ten in Tens) - { - if (value != ten.Item1) continue; - buffer.AppendFormat("{0}{1}", buffer.Length > 0 ? " " : string.Empty, ten.Item2); - break; - } - - numBuilder.Append(buffer); - if (pair.Item2.Length > 0) - numBuilder.Append(" ").Append(pair.Item2); - } - return numBuilder.ToString(); - } - } + internal static class Numerals + { + public const int MaxRomanValue = 3999; + + private static readonly string[][] RomanNumerals = + { + new[] { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }, + new[] { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" }, + new[] { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" }, + new[] { "", "M", "MM", "MMM" } + }; + + private static readonly List<_> Powers; + private static readonly List<_> Hundreds; + private static readonly List<_> TenUnits; + private static readonly List<_> Tens; + + static Numerals() + { + Powers = new List<_> + { + _.Create(100L, "hundred"), + _.Create(1000L, "thousand"), + _.Create(1000000L, "million"), + _.Create(1000000000L, "billion"), + _.Create(1000000000000L, "trillion"), + _.Create(1000000000000000L, "quadrillion"), + _.Create(1000000000000000000L, "quintillion") + }.OrderByDescending(tuple => tuple.Item1).ToList(); + + Hundreds = new List<_> + { + _.Create(100L, "one hundred"), + _.Create(200L, "two hundred"), + _.Create(300L, "three hundred"), + _.Create(400L, "four hundred"), + _.Create(500L, "five hundred"), + _.Create(600L, "six hundred"), + _.Create(700L, "seven hundred"), + _.Create(800L, "eight hundred"), + _.Create(900L, "nine hundred") + }.OrderByDescending(tuple => tuple.Item1).ToList(); + + TenUnits = new List<_> + { + _.Create(90, "ninety"), + _.Create(80, "eighty"), + _.Create(70, "seventy"), + _.Create(60, "sixty"), + _.Create(50, "fifty"), + _.Create(40, "forty"), + _.Create(30, "thirty"), + _.Create(20, "twenty") + }.OrderByDescending(tuple => tuple.Item1).ToList(); + + Tens = new List<_> + { + _.Create(19, "nineteen"), + _.Create(18, "eighteen"), + _.Create(17, "seventeen"), + _.Create(16, "sixteen"), + _.Create(15, "fifteen"), + _.Create(14, "fourteen"), + _.Create(13, "thirteen"), + _.Create(12, "twelve"), + _.Create(11, "eleven"), + _.Create(10, "ten"), + _.Create(9, "nine"), + _.Create(8, "eight"), + _.Create(7, "seven"), + _.Create(6, "six"), + _.Create(5, "five"), + _.Create(4, "four"), + _.Create(3, "three"), + _.Create(2, "two"), + _.Create(1, "one") + }.OrderByDescending(tuple => tuple.Item1).ToList(); + } + + public static string ToRoman(double number, bool lowerCase = false) + { + if (number <= 0 || number > MaxRomanValue || number % 1 > 0) return "?"; + var intArr = + number.ToString(CultureInfo.InvariantCulture) + .Reverse() + .Select(c => int.Parse(c.ToString(CultureInfo.InvariantCulture))) + .ToArray(); + var sb = new StringBuilder(); + for (int i = intArr.Length; i-- > 0;) + sb.Append(RomanNumerals[i][intArr[i]]); + return lowerCase ? sb.ToString().ToLower() : sb.ToString(); + } + + public static string ToVerbal(long number) + { + if (number == 0) return "zero"; + + var numBuilder = new StringBuilder(); + + if (number < 0) + { + numBuilder.Append("negative "); + number *= -1; + } + + // The input stack contains number units for the loop to translate + var input = new Queue<_>(); + + long unit = 0; + + foreach (var power in Powers) + { + if (number < power.Item1) continue; + unit = number / power.Item1; // Count of current unit (1-999) + number -= unit * power.Item1; // Strip the units from the number + input.Enqueue(_.Create(unit, power.Item2)); + } + + input.Enqueue(_.Create(number, "")); + + var buffer = new StringBuilder(); + + while (input.Any()) + { + var pair = input.Dequeue(); + long value = pair.Item1; + if (value == 0) continue; + + if (numBuilder.Length > 0) + { + if (input.Any()) + numBuilder.Append(", "); + else if (value > 0) + numBuilder.Append(" and "); + } + + buffer.Length = 0; + + foreach (var hundred in Hundreds) + { + if (value < hundred.Item1) continue; + value -= hundred.Item1; + buffer.AppendFormat("{0}{1}{2}", buffer.Length > 0 ? " " : string.Empty, hundred.Item2, + value > 0 ? " and" : string.Empty); + } + + foreach (var tenunit in TenUnits) + { + if (value < tenunit.Item1) continue; + value -= tenunit.Item1; + buffer.AppendFormat("{0}{1}", buffer.Length > 0 ? " " : string.Empty, tenunit.Item2); + break; + } + + foreach (var ten in Tens) + { + if (value != ten.Item1) continue; + buffer.AppendFormat("{0}{1}", buffer.Length > 0 ? " " : string.Empty, ten.Item2); + break; + } + + numBuilder.Append(buffer); + if (pair.Item2.Length > 0) + numBuilder.Append(" ").Append(pair.Item2); + } + return numBuilder.ToString(); + } + } } \ No newline at end of file diff --git a/Rant/Core/Formatting/Unicode.cs b/Rant/Core/Formatting/Unicode.cs index d402623..1e73f82 100644 --- a/Rant/Core/Formatting/Unicode.cs +++ b/Rant/Core/Formatting/Unicode.cs @@ -31,32 +31,32 @@ namespace Rant.Core.Formatting { - internal static class Unicode - { - private static readonly Dictionary _cache = new Dictionary(); + internal static class Unicode + { + private static readonly Dictionary _cache = new Dictionary(); - private static readonly Dictionary _unicodeCharacterMap; + private static readonly Dictionary _unicodeCharacterMap; - static Unicode() - { + static Unicode() + { _unicodeCharacterMap = new Dictionary(); - var ass = Assembly.GetExecutingAssembly(); + var ass = Assembly.GetExecutingAssembly(); using (var stream = ass.GetManifestResourceStream("Rant.Core.Formatting.unicode_code_points.dat")) - using(var reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { while (!reader.EndOfStream) { - var line = reader.ReadLine(); + string line = reader.ReadLine(); if (String.IsNullOrWhiteSpace(line)) continue; var entry = line.Split(','); _unicodeCharacterMap[entry[0].Trim()] = Convert.ToUInt32(entry[1].Trim()); } } - } + } - public static string GetByName(string name) - { - if (name == null) throw new ArgumentNullException(nameof(name)); + public static string GetByName(string name) + { + if (name == null) throw new ArgumentNullException(nameof(name)); if (!_unicodeCharacterMap.TryGetValue(name, out uint codePoint)) { var sb = new StringBuilder(); @@ -83,24 +83,24 @@ public static string GetByName(string name) if (_cache.TryGetValue(codePoint, out string result)) return result; - const uint minSurrogateCodePoint = 0x10000; - const uint lowSurrogateMask = 0x3ff; - const uint highSurrogateMask = lowSurrogateMask << 10; - const uint lowSurrogateOffset = 0xDC00; - const uint highSurrogateOffset = 0xD800; + const uint minSurrogateCodePoint = 0x10000; + const uint lowSurrogateMask = 0x3ff; + const uint highSurrogateMask = lowSurrogateMask << 10; + const uint lowSurrogateOffset = 0xDC00; + const uint highSurrogateOffset = 0xD800; - if (codePoint < minSurrogateCodePoint) - return _cache[codePoint] = ((char)codePoint).ToString(); + if (codePoint < minSurrogateCodePoint) + return _cache[codePoint] = ((char)codePoint).ToString(); - uint sp = codePoint - minSurrogateCodePoint; + uint sp = codePoint - minSurrogateCodePoint; - result = _cache[codePoint] = new string(new[] - { - (char)(((sp & highSurrogateMask) >> 10) + highSurrogateOffset), - (char)((sp & lowSurrogateMask) + lowSurrogateOffset) - }); + result = _cache[codePoint] = new string(new[] + { + (char)(((sp & highSurrogateMask) >> 10) + highSurrogateOffset), + (char)((sp & lowSurrogateMask) + lowSurrogateOffset) + }); - return result; - } - } + return result; + } + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunction.cs b/Rant/Core/Framework/RantFunction.cs index fb18617..851b634 100644 --- a/Rant/Core/Framework/RantFunction.cs +++ b/Rant/Core/Framework/RantFunction.cs @@ -31,44 +31,50 @@ namespace Rant.Core.Framework { - internal class RantFunction : IRantFunctionGroup - { - private readonly Dictionary _overloads = new Dictionary(); - private RantFunctionSignature _paramsArrayFunc = null; + internal class RantFunction : IRantFunctionGroup + { + private readonly Dictionary _overloads = new Dictionary(); + private RantFunctionSignature _paramsArrayFunc = null; - public RantFunction(string name) - { - Name = name; - } + public RantFunction(string name) + { + Name = name; + } - public string Name { get; } - public IEnumerable Overloads => _overloads.Select(fn => fn.Value as IRantFunction); + public string Name { get; } + public IEnumerable Overloads => _overloads.Select(fn => fn.Value as IRantFunction); - public void Add(RantFunctionSignature func) - { - RantFunctionSignature existing; - if (_overloads.TryGetValue(func.Parameters.Length, out existing)) - throw new ArgumentException( - $"Cannot load function {func} becaue its signature is ambiguous with existing function {existing}."); - if (_paramsArrayFunc != null) - { - if (func.HasParamArray) - throw new ArgumentException( - $"Cannot load function {func} because another function with a parameter array was already loaded."); - if (func.Parameters.Length >= _paramsArrayFunc.Parameters.Length) - throw new ArgumentException( - $"Cannot load function {func} because its signature is ambiguous with {_paramsArrayFunc}."); - } + public void Add(RantFunctionSignature func) + { + RantFunctionSignature existing; + if (_overloads.TryGetValue(func.Parameters.Length, out existing)) + { + throw new ArgumentException( + $"Cannot load function {func} becaue its signature is ambiguous with existing function {existing}."); + } + if (_paramsArrayFunc != null) + { + if (func.HasParamArray) + { + throw new ArgumentException( + $"Cannot load function {func} because another function with a parameter array was already loaded."); + } + if (func.Parameters.Length >= _paramsArrayFunc.Parameters.Length) + { + throw new ArgumentException( + $"Cannot load function {func} because its signature is ambiguous with {_paramsArrayFunc}."); + } + } - _overloads[func.Parameters.Length] = func; - if (func.HasParamArray) _paramsArrayFunc = func; - } + _overloads[func.Parameters.Length] = func; + if (func.HasParamArray) _paramsArrayFunc = func; + } - public RantFunctionSignature GetFunction(int argc) - { - if (_paramsArrayFunc != null && argc >= _paramsArrayFunc.Parameters.Length - 1) return _paramsArrayFunc; - RantFunctionSignature func; - return _overloads.TryGetValue(argc, out func) ? func : null; - } - } + public RantFunctionSignature GetFunction(int argc) + { + if (_paramsArrayFunc != null && argc >= _paramsArrayFunc.Parameters.Length - 1) return _paramsArrayFunc; + RantFunctionSignature func; + return _overloads.TryGetValue(argc, out func) ? func : null; + } + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionParameter.cs b/Rant/Core/Framework/RantFunctionParameter.cs index f37bddb..bff608b 100644 --- a/Rant/Core/Framework/RantFunctionParameter.cs +++ b/Rant/Core/Framework/RantFunctionParameter.cs @@ -32,30 +32,32 @@ namespace Rant.Core.Framework { - internal class RantFunctionParameter : IRantParameter - { - public RantFunctionParameter(string name, Type nativeType, RantFunctionParameterType rantType, bool isParams = false) - { - Name = Util.CamelToSnake(name); - NativeType = nativeType; - RantType = rantType; - IsParams = isParams; - Description = string.Empty; - } + internal class RantFunctionParameter : IRantParameter + { + public RantFunctionParameter(string name, Type nativeType, RantFunctionParameterType rantType, bool isParams = false) + { + Name = Util.CamelToSnake(name); + NativeType = nativeType; + RantType = rantType; + IsParams = isParams; + Description = string.Empty; + } - public Type NativeType { get; } - public RantFunctionParameterType RantType { get; } - public string Name { get; } - public bool IsParams { get; } - public string Description { get; set; } + public Type NativeType { get; } + public RantFunctionParameterType RantType { get; } + public string Name { get; } + public bool IsParams { get; } + public string Description { get; set; } - public IEnumerable GetEnumValues() - { - if (!NativeType.IsEnum) yield break; - foreach (string value in Enum.GetNames(NativeType)) - yield return new RantModeValue(Util.CamelToSnake(value), - (NativeType.GetMember(value)[0].GetCustomAttributes(typeof(RantDescriptionAttribute), true).FirstOrDefault() as - RantDescriptionAttribute)?.Description ?? string.Empty); - } - } + public IEnumerable GetEnumValues() + { + if (!NativeType.IsEnum) yield break; + foreach (string value in Enum.GetNames(NativeType)) + { + yield return new RantModeValue(Util.CamelToSnake(value), + (NativeType.GetMember(value)[0].GetCustomAttributes(typeof(RantDescriptionAttribute), true).FirstOrDefault() as + RantDescriptionAttribute)?.Description ?? string.Empty); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionParameterType.cs b/Rant/Core/Framework/RantFunctionParameterType.cs index 387e7fe..767e07c 100644 --- a/Rant/Core/Framework/RantFunctionParameterType.cs +++ b/Rant/Core/Framework/RantFunctionParameterType.cs @@ -25,39 +25,39 @@ namespace Rant.Core.Framework { - /// - /// Defines parameter types for Rant functions. - /// - public enum RantFunctionParameterType - { - /// - /// Parameter is a static string. - /// - String, - - /// - /// Parameter is a lazily evaluated pattern. - /// - Pattern, - - /// - /// Parameter is numeric. - /// - Number, - - /// - /// Parameter describes a mode, which is one of a specific set of allowed values. - /// - Mode, - - /// - /// Parameter uses combinable flags. - /// - Flags, - - /// - /// Parameter is a RantObject. - /// - RantObject - } + /// + /// Defines parameter types for Rant functions. + /// + public enum RantFunctionParameterType + { + /// + /// Parameter is a static string. + /// + String, + + /// + /// Parameter is a lazily evaluated pattern. + /// + Pattern, + + /// + /// Parameter is numeric. + /// + Number, + + /// + /// Parameter describes a mode, which is one of a specific set of allowed values. + /// + Mode, + + /// + /// Parameter uses combinable flags. + /// + Flags, + + /// + /// Parameter is a RantObject. + /// + RantObject + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs index 56cd42b..a153dd8 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs @@ -33,93 +33,93 @@ namespace Rant.Core.Framework { - internal static partial class RantFunctionRegistry - { - private static bool _loaded = false; - - private static readonly Dictionary FunctionTable = - new Dictionary(StringComparer.InvariantCultureIgnoreCase); - - private static readonly Dictionary AliasTable = - new Dictionary(StringComparer.InvariantCultureIgnoreCase); - - static RantFunctionRegistry() - { - Load(); - } - - internal static void Load() - { - if (_loaded) return; - - // Get every single private static method in the RantFunctions class - foreach (var method in typeof(RantFunctionRegistry).GetMethods(BindingFlags.Static | BindingFlags.NonPublic)) - { - if (!method.IsStatic) continue; - var attr = - method.GetCustomAttributes(typeof(RantFunctionAttribute), false).FirstOrDefault() as RantFunctionAttribute; - if (attr == null) continue; // Discard methods without a [RantFunction] attribute - - // Compile metadata into RantFunctionInfo - string name = string.IsNullOrEmpty(attr.Name) ? method.Name.ToLower() : attr.Name; - var descAttr = - method.GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as RantDescriptionAttribute; - var info = new RantFunctionSignature(name, descAttr?.Description ?? string.Empty, method); - - if (Util.ValidateName(name)) RegisterFunction(info); - - foreach (string alias in attr.Aliases.Where(Util.ValidateName)) - RegisterAlias(alias, info.Name); - } - _loaded = true; - } - - private static void RegisterFunction(RantFunctionSignature func) - { - RantFunction group; - if (!FunctionTable.TryGetValue(func.Name, out group)) - group = FunctionTable[func.Name] = new RantFunction(func.Name); - group.Add(func); - } - - private static void RegisterAlias(string alias, string funcName) - { - AliasTable[alias] = funcName; - } - - public static IEnumerable GetAliases(string funcName) => - AliasTable.Where(pair => string.Equals(funcName, pair.Value, StringComparison.InvariantCultureIgnoreCase)) - .Select(pair => pair.Key); - - private static string ResolveAlias(string alias) - { - string name; - return AliasTable.TryGetValue(alias, out name) ? name : alias; - } - - public static bool FunctionExists(string name) => - AliasTable.ContainsKey(name) || FunctionTable.ContainsKey(name); - - public static IEnumerable GetFunctions() - => FunctionTable.Select(item => item.Value as IRantFunctionGroup); - - public static IEnumerable GetFunctionNames() => - FunctionTable.Select(item => item.Key); - - public static IEnumerable GetFunctionNamesAndAliases() => - FunctionTable.Select(item => item.Key).Concat(AliasTable.Keys); - - public static string GetFunctionDescription(string funcName, int paramc) => - GetFunctionGroup(funcName)?.GetFunction(paramc)?.Description ?? string.Empty; - - public static RantFunction GetFunctionGroup(string name) - { - if (name == null) return null; - RantFunction group; - return !FunctionTable.TryGetValue(ResolveAlias(name), out group) ? null : group; - } - - public static RantFunctionSignature GetFunction(string name, int paramc) => - GetFunctionGroup(name)?.GetFunction(paramc); - } + internal static partial class RantFunctionRegistry + { + private static bool _loaded = false; + + private static readonly Dictionary FunctionTable = + new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + private static readonly Dictionary AliasTable = + new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + static RantFunctionRegistry() + { + Load(); + } + + internal static void Load() + { + if (_loaded) return; + + // Get every single private static method in the RantFunctions class + foreach (var method in typeof(RantFunctionRegistry).GetMethods(BindingFlags.Static | BindingFlags.NonPublic)) + { + if (!method.IsStatic) continue; + var attr = + method.GetCustomAttributes(typeof(RantFunctionAttribute), false).FirstOrDefault() as RantFunctionAttribute; + if (attr == null) continue; // Discard methods without a [RantFunction] attribute + + // Compile metadata into RantFunctionInfo + string name = string.IsNullOrEmpty(attr.Name) ? method.Name.ToLower() : attr.Name; + var descAttr = + method.GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as RantDescriptionAttribute; + var info = new RantFunctionSignature(name, descAttr?.Description ?? string.Empty, method); + + if (Util.ValidateName(name)) RegisterFunction(info); + + foreach (string alias in attr.Aliases.Where(Util.ValidateName)) + RegisterAlias(alias, info.Name); + } + _loaded = true; + } + + private static void RegisterFunction(RantFunctionSignature func) + { + RantFunction group; + if (!FunctionTable.TryGetValue(func.Name, out group)) + group = FunctionTable[func.Name] = new RantFunction(func.Name); + group.Add(func); + } + + private static void RegisterAlias(string alias, string funcName) + { + AliasTable[alias] = funcName; + } + + public static IEnumerable GetAliases(string funcName) => + AliasTable.Where(pair => string.Equals(funcName, pair.Value, StringComparison.InvariantCultureIgnoreCase)) + .Select(pair => pair.Key); + + private static string ResolveAlias(string alias) + { + string name; + return AliasTable.TryGetValue(alias, out name) ? name : alias; + } + + public static bool FunctionExists(string name) => + AliasTable.ContainsKey(name) || FunctionTable.ContainsKey(name); + + public static IEnumerable GetFunctions() + => FunctionTable.Select(item => item.Value as IRantFunctionGroup); + + public static IEnumerable GetFunctionNames() => + FunctionTable.Select(item => item.Key); + + public static IEnumerable GetFunctionNamesAndAliases() => + FunctionTable.Select(item => item.Key).Concat(AliasTable.Keys); + + public static string GetFunctionDescription(string funcName, int paramc) => + GetFunctionGroup(funcName)?.GetFunction(paramc)?.Description ?? string.Empty; + + public static RantFunction GetFunctionGroup(string name) + { + if (name == null) return null; + RantFunction group; + return !FunctionTable.TryGetValue(ResolveAlias(name), out group) ? null : group; + } + + public static RantFunctionSignature GetFunction(string name, int paramc) => + GetFunctionGroup(name)?.GetFunction(paramc); + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index b57b39d..376bc82 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -37,883 +37,878 @@ using Rant.Core.Utilities; using Rant.Metadata; using Rant.Vocabulary.Utilities; + // ReSharper disable UnusedMember.Local namespace Rant.Core.Framework { - // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. - // They may return either void or IEnumerator depending on your needs. - internal static partial class RantFunctionRegistry - { - [RantFunction("num", "n")] - [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] - private static void Number(Sandbox sb, - [RantDescription("The minimum value of the number to generate.")] int min, - [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); - - [RantFunction("num")] - [RantDescription("Formats an input string using the current number format settings and prints the result.")] - private static void Number(Sandbox sb, - [RantDescription("The string to convert into a number.")] string input) - { - double number; - sb.Print(double.TryParse(input, out number) ? number : 0); - } - - [RantFunction("numfmt")] - [RantDescription("Sets the current number formatting mode.")] - private static void NumberFormat(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); - - [RantFunction("numfmt")] - [RantDescription("Runs the specified pattern under a specific number formatting mode.")] - private static IEnumerator NumberFormatRange(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format, - [RantDescription("The pattern to run.")] RST rangeAction) - { - var oldFmtMap = new Dictionary(); - - sb.Output.Do(chain => - { - oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; - chain.Last.NumberFormatter.NumberFormat = format; - }); - - yield return rangeAction; - - NumberFormat fmt; - sb.Output.Do(chain => - { - if (!oldFmtMap.TryGetValue(chain, out fmt)) return; - chain.Last.NumberFormatter.NumberFormat = fmt; - }); - } - - [RantFunction] - [RantDescription("Specifies the current digit formatting mode for numbers.")] - private static void Digits(Sandbox sb, - [RantDescription("The digit format to use.")] BinaryFormat format, - [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => - { - chain.Last.NumberFormatter.BinaryFormat = format; - chain.Last.NumberFormatter.BinaryFormatDigits = digits; - }); - - [RantFunction] - [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] - private static void Endian(Sandbox sb, - [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); - - [RantFunction("init")] - [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] - private static void Initial(Sandbox sb, int index) => sb.CurrentBlockAttribs.StartIndex = index; - - [RantFunction("rep", "r")] - [RantDescription("Sets the repetition count for the next block.")] - private static void Rep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times) => sb.CurrentBlockAttribs.Repetitions = times; - - [RantFunction] - [RantDescription("Sets the repetition count to the number of items in the next block.")] - private static void RepEach(Sandbox sb) => sb.CurrentBlockAttribs.RepEach = true; - - [RantFunction("sep", "s")] - [RantDescription("Sets the separator pattern for the next block.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.CurrentBlockAttribs.IsSeries = false; - sb.CurrentBlockAttribs.Separator = separator; - } - - [RantFunction("sep", "s")] - [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) - { - sb.CurrentBlockAttribs.IsSeries = true; - sb.CurrentBlockAttribs.Separator = separator; - sb.CurrentBlockAttribs.EndConjunction = conjunction; - } - - [RantFunction("sep", "s")] - [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, - [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) - { - sb.CurrentBlockAttribs.IsSeries = true; - sb.CurrentBlockAttribs.Separator = separator; - sb.CurrentBlockAttribs.EndSeparator = oxford; - sb.CurrentBlockAttribs.EndConjunction = conjunction; - } - - [RantFunction("rs")] - [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] - private static void RepSep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.CurrentBlockAttribs.IsSeries = false; - sb.CurrentBlockAttribs.Repetitions = times; - sb.CurrentBlockAttribs.Separator = separator; - } - - [RantFunction] - [RantDescription("Sets the prefix pattern for the next block.")] - private static void Before(Sandbox sb, - [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.CurrentBlockAttribs.Before = beforeAction; - - [RantFunction] - [RantDescription("Sets the postfix pattern for the next block.")] - private static void After(Sandbox sb, - [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.CurrentBlockAttribs.After = afterAction; - - [RantFunction] - [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] - private static void Chance(Sandbox sb, - [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.CurrentBlockAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; - - [RantFunction("case", "caps")] - [RantDescription("Changes the capitalization mode for all open channels.")] - private static void Case(Sandbox sb, - [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); - - [RantFunction] - [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] - private static void CapsInfer(Sandbox sb, - [RantDescription("A string that is capitalized in the format to be set.")] string sample) - { - var output = sb.Output; - if (string.IsNullOrEmpty(sample)) - { - output.Capitalize(Capitalization.None); - return; - } - var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (words.Length == 1) - { - string word = words[0]; - if (word.Length == 1) - output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); - else if (Util.IsUppercase(word)) - output.Capitalize(Capitalization.Upper); - else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - else - { - // No letters? Forget it. - if (!sample.Any(char.IsLetter)) - { - output.Capitalize(Capitalization.None); - return; - } - - // Is all-caps? - if (Util.IsUppercase(sample)) - { - output.Capitalize(Capitalization.Upper); - return; - } - - var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) - .Select(str => str.Trim()) - .Where(str => - !string.IsNullOrEmpty(str) - && !char.IsDigit(str[0])).ToArray(); - - // All words capitalized? - var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); - if (lwords.Any() && - (sentences.Length == 1 || - sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) - { - if (lwords.All(lw => char.IsUpper(lw[0]))) - { - output.Capitalize(Capitalization.Word); - return; - } - - if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) - { - output.Capitalize(Capitalization.Title); - return; - } - } - - // All sentences capitalized? - bool all = true; - bool none = true; - foreach (string sentence in sentences) - { - bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); - all = all && isCapitalized; - none = none && !isCapitalized; - } - - if (sentences.Length > 1 && all) - output.Capitalize(Capitalization.Sentence); - else if (none) - output.Capitalize(Capitalization.Lower); - else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the first.")] - private static IEnumerator First(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration == 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the first.")] - private static IEnumerator NotFirst(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration > 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the last.")] - private static IEnumerator Last(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == block.Count) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the last.")] - private static IEnumerator NotLast(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration < block.Count) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] - private static IEnumerator Middle(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration > 1 && block.Iteration < block.Count) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] - private static IEnumerator Ends(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == 1 || block.Iteration == block.Count) yield return action; - } - - [RantFunction("repnum", "rn")] - [RantDescription("Prints the iteration number of the current block.")] - private static void RepNum(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration); - } - - [RantFunction("repelapsed", "re")] - [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] - private static void RepElapsed(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration - 1); - } - - [RantFunction("repcount", "rc")] - [RantDescription("Prints the repetition count of the current block.")] - private static void RepCount(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Count); - } - - [RantFunction("reprem", "rr")] - [RantDescription("Prints the number of remaining repetitions queued after the current one.")] - private static void RepRem(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Count - block.Iteration); - } - - [RantFunction("repqueued", "rq")] - [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] - private static void RepQueued(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Count - (block.Iteration - 1)); - } - - [RantFunction] - [RantDescription("Prints the number of currently active blocks.")] - private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); - - [RantFunction("index", "i")] - [RantDescription("Prints the zero-based index of the block item currently being executed.")] - private static void Index(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index); - } - - [RantFunction("index1", "i1")] - [RantDescription("Prints the one-based index of the block item currently being executed.")] - private static void IndexOne(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index + 1); - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an odd number.")] - private static IEnumerator Odd(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an even number.")] - private static IEnumerator Even(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; - } - - [RantFunction] - [RantDescription("Returns the specified argument from the current subroutine.")] - private static IEnumerator Arg(Sandbox sb, - [RantDescription("The name of the argument to retrieve.")] string name) - { - if (!sb.SubroutineArgs.Any()) yield break; - var args = sb.SubroutineArgs.Peek(); - if (args.ContainsKey(name)) - yield return args[name]; - } - - [RantFunction] - [RantDescription("Retrieves and prints the current match string of the active replacer.")] - private static void Match(Sandbox sb) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Value); - } - - [RantFunction] - [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] - private static void Group(Sandbox sb, - [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); - } - - [RantFunction] - [RantDescription("Sets the current rhyming mode for queries.")] - private static void Rhyme(Sandbox sb, - [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; - - [RantFunction("sync", "x")] - [RantDescription("Creates and applies a synchronizer with the specified name and type.")] - private static void Sync(Sandbox sb, - [RantDescription("The name of the synchronizer.")] string name, - [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); - - [RantFunction("xpin")] - [RantDescription("Pins a synchronizer.")] - private static void SyncPin(Sandbox sb, - [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); - - [RantFunction("xunpin")] - [RantDescription("Unpins a synchronizer.")] - private static void SyncUnpin(Sandbox sb, - [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); - - [RantFunction("xstep")] - [RantDescription("Iterates a synchronizer.")] - private static void SyncStep(Sandbox sb, - [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); - - [RantFunction("xreset")] - [RantDescription("Resets a synchronizer to its initial state.")] - private static void SyncReset(Sandbox sb, - [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); - - [RantFunction("quote", "q")] - [RantDescription( - "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] - private static IEnumerator Quote(Sandbox sb, - [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) - { - sb.IncreaseQuote(); - sb.PrintOpeningQuote(); - yield return quoteAction; - sb.PrintClosingQuote(); - sb.DecreaseQuote(); - } - - [RantFunction] - [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] - private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) - { - sb.Output.OpenChannel(channelName, visibility); - yield return pattern; - sb.Output.CloseChannel(); - } - - [RantFunction("target", "t")] - [RantDescription("Places a target with the specified name at the current write position.")] - private static void Target(Sandbox sb, - [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); - - [RantFunction] - [RantDescription("Appends a string to the specified target's contents.")] - private static void Send(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); - - [RantFunction] - [RantDescription("Overwrites the specified target's contents with the provided value.")] - private static void SendOver(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) - { - sb.Output.Do(chain => chain.ClearTarget(targetName)); - sb.Output.PrintToTarget(targetName, value); - } - - [RantFunction("targetval")] - [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] - private static void GetTargetValue(Sandbox sb, - [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); - - [RantFunction("clrt")] - [RantDescription("Clears the contents of the specified target.")] - private static void ClearTarget(Sandbox sb, - [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] - private static IEnumerator Nth(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] - private static IEnumerator NthO(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] - private static IEnumerator NotNth(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." - )] - private static IEnumerator NotNthO(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Sets a pattern that will run before the next block.")] - private static void Start(Sandbox sb, - [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.CurrentBlockAttribs.Start = beforePattern; - - [RantFunction] - [RantDescription("Sets a pattern that will run after the next block.")] - private static void End(Sandbox sb, - [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.CurrentBlockAttribs.End = endPattern; - - // TODO: Finish [persist]. - //[RantFunction] - [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] - private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.CurrentBlockAttribs.Persistence = persistence; - - [RantFunction] - [RantDescription("Loads and runs a pattern from cache or file.")] - private static IEnumerator Import(Sandbox sb, - [RantDescription("The name or path of the pattern to load.")] string name) - { - RST action; - - try - { - action = sb.Engine.GetProgramInternal(name).SyntaxTree; - } - catch (RantCompilerException e) - { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, - $"Failed to compile imported pattern '{name}':\n{e.Message}"); - } - catch (Exception e) - { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, - $"Failed to import '{name}':\n{e.Message}"); - } - - yield return action; - } - - [RantFunction] - [RantDescription("Defines the specified flags.")] - private static void Define(Sandbox sb, - [RantDescription("The list of flags to define.")] params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.Engine.Flags.Add(flag); - } - - [RantFunction] - [RantDescription("Undefines the specified flags.")] - private static void Undef(Sandbox sb, - [RantDescription("The list of flags to undefine.")] params string[] flags) - { - foreach (string flag in flags) sb.Engine.Flags.Remove(flag); - } - - [RantFunction] - [RantDescription("Toggles the specified flags.")] - private static void Toggle(Sandbox sb, params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - if (sb.Engine.Flags.Contains(flag)) - sb.Engine.Flags.Remove(flag); - else - sb.Engine.Flags.Add(flag); - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] - private static void IfDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = true; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] - private static void IfNDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = false; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition passes.")] - private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) - { - if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) - yield return conditionPassPattern; - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition fails.")] - private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) - { - if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) - yield return conditionFailPattern; - } - - [RantFunction] - [RantDescription("Yields the currenty written output.")] - private static void Yield(Sandbox sb) => sb.SetYield(); - - [RantFunction] - [RantDescription("Branches the internal RNG according to a seed.")] - private static void Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); - - [RantFunction] - [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] - private static IEnumerator Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed, - [RantDescription("The pattern to run on the branch.")] RST branchAction) - { - sb.RNG.Branch(seed.Hash()); - yield return branchAction; - sb.RNG.Merge(); - } - - [RantFunction] - [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] - private static void Merge(Sandbox sb) => sb.RNG.Merge(); - - [RantFunction("in")] - [RantDescription("Prints the value of the specified pattern argument.")] - private static void PatternArg(Sandbox sb, - [RantDescription("The name of the argument to access.")] string argName) - { - if (sb.PatternArgs == null) return; - sb.Output.Print(sb.PatternArgs[argName]); - } - - [RantFunction("tm")] - [RantDescription("Prints the trademark symbol.")] - private static void Trademark(Sandbox sb) => sb.Print("\x2122"); - - [RantFunction("reg")] - [RantDescription("Prints the registered trademark symbol.")] - private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); - - [RantFunction("c")] - [RantDescription("Prints the copyright symbol.")] - private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); - - [RantFunction("em")] - [RantDescription("Prints an emdash.")] - private static void Emdash(Sandbox sb) => sb.Print("\x2014"); - - [RantFunction("en")] - [RantDescription("Prints an endash.")] - private static void Endash(Sandbox sb) => sb.Print("\x2013"); - - [RantFunction("b")] - [RantDescription("Prints a bullet character.")] - private static void Bullet(Sandbox sb) => sb.Print("\x2022"); - - [RantFunction("ss")] - [RantDescription("Prints an eszett (ß).")] - private static void Eszett(Sandbox sb) => sb.Print("\x00df"); - - [RantFunction("emoji")] - [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] - private static void PrintEmoji(Sandbox sb, - [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) - { - shortcode = shortcode.ToLower(); - if (!Emoji.Shortcodes.ContainsKey(shortcode)) - { - sb.Print("[missing emoji]"); - return; - } - sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); - } - - [RantFunction("plural", "pl")] - [RantDescription("Infers and prints the plural form of the specified word.")] - private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); - - [RantFunction("use")] - [RantDescription("Loads a module from the file name.module.rant, name.rant, or name, in that order.")] - private static void Use(Sandbox sb, string name) - { - if (sb.UserModules.ContainsKey(name)) - { - sb.Modules[name] = sb.UserModules[name]; - return; - } - if (sb.PackageModules.ContainsKey(name)) - { - sb.Modules[name] = sb.PackageModules[name]; - return; - } - string file; - if (File.Exists(name + ".module.rant")) - file = name + ".module.rant"; - else if (File.Exists(name + ".rant")) - file = name + ".rant"; - else if (File.Exists(name)) - file = name; - else - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Could not find module '{name}'."); - var pattern = RantProgram.CompileFile(file); - if (pattern.Module == null) - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"No module is defined in {file}."); - sb.Modules[Path.GetFileNameWithoutExtension(name)] = pattern.Module; - } - - [RantFunction] - [RantDescription("Prints the current length of the specified channel, in characters.")] - private static void Len(Sandbox sb, - [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); - - [RantFunction("rev")] - [RantDescription("Reverses the specified string and prints it to the output.")] - private static void Reverse(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = input[i]; - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - { - buffer[lastIndex - i + 1] = input[i]; - } - else if (char.IsHighSurrogate(input[i])) - { - buffer[lastIndex - i - 1] = input[i]; - } - else - { - buffer[lastIndex - i] = input[i]; - } - sb.Print(new string(buffer)); - } - - [RantFunction("revx")] - [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] - private static void ReverseEx(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - { - buffer[lastIndex - i + 1] = input[i]; - } - else if (char.IsHighSurrogate(input[i])) - { - buffer[lastIndex - i - 1] = input[i]; - } - else - { - buffer[lastIndex - i] = Util.ReverseChar(input[i]); - } - sb.Print(new string(buffer)); - } - - [RantFunction("accent")] - [RantDescription("Accents the previous character.")] - private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); - - [RantFunction("accent")] - [RantDescription("Accents the specified character.")] - private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); - - [RantFunction("acute", "act")] - [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] - private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); - - [RantFunction("circumflex", "cflex")] - [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] - private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); - - [RantFunction("grave", "grv")] - [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] - private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); - - [RantFunction("ring")] - [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] - private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); - - [RantFunction("tilde", "tld")] - [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] - private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); - - [RantFunction("diaeresis", "dia")] - [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] - private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); - - [RantFunction("caron", "crn")] - [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] - private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); - - [RantFunction("macron", "mcn")] - [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] - private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); - - [RantFunction("cedilla", "ced")] - [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] - private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); - - [RantFunction("char")] + // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. + // They may return either void or IEnumerator depending on your needs. + internal static partial class RantFunctionRegistry + { + [RantFunction("num", "n")] + [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] + private static void Number(Sandbox sb, + [RantDescription("The minimum value of the number to generate.")] int min, + [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); + + [RantFunction("num")] + [RantDescription("Formats an input string using the current number format settings and prints the result.")] + private static void Number(Sandbox sb, + [RantDescription("The string to convert into a number.")] string input) + { + double number; + sb.Print(double.TryParse(input, out number) ? number : 0); + } + + [RantFunction("numfmt")] + [RantDescription("Sets the current number formatting mode.")] + private static void NumberFormat(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); + + [RantFunction("numfmt")] + [RantDescription("Runs the specified pattern under a specific number formatting mode.")] + private static IEnumerator NumberFormatRange(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format, + [RantDescription("The pattern to run.")] RST rangeAction) + { + var oldFmtMap = new Dictionary(); + + sb.Output.Do(chain => + { + oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; + chain.Last.NumberFormatter.NumberFormat = format; + }); + + yield return rangeAction; + + NumberFormat fmt; + sb.Output.Do(chain => + { + if (!oldFmtMap.TryGetValue(chain, out fmt)) return; + chain.Last.NumberFormatter.NumberFormat = fmt; + }); + } + + [RantFunction] + [RantDescription("Specifies the current digit formatting mode for numbers.")] + private static void Digits(Sandbox sb, + [RantDescription("The digit format to use.")] BinaryFormat format, + [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => + { + chain.Last.NumberFormatter.BinaryFormat = format; + chain.Last.NumberFormatter.BinaryFormatDigits = digits; + }); + + [RantFunction] + [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] + private static void Endian(Sandbox sb, + [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); + + [RantFunction("init")] + [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] + private static void Initial(Sandbox sb, int index) => sb.CurrentBlockAttribs.StartIndex = index; + + [RantFunction("rep", "r")] + [RantDescription("Sets the repetition count for the next block.")] + private static void Rep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times) => sb.CurrentBlockAttribs.Repetitions = times; + + [RantFunction] + [RantDescription("Sets the repetition count to the number of items in the next block.")] + private static void RepEach(Sandbox sb) => sb.CurrentBlockAttribs.RepEach = true; + + [RantFunction("sep", "s")] + [RantDescription("Sets the separator pattern for the next block.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.CurrentBlockAttribs.IsSeries = false; + sb.CurrentBlockAttribs.Separator = separator; + } + + [RantFunction("sep", "s")] + [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) + { + sb.CurrentBlockAttribs.IsSeries = true; + sb.CurrentBlockAttribs.Separator = separator; + sb.CurrentBlockAttribs.EndConjunction = conjunction; + } + + [RantFunction("sep", "s")] + [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, + [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) + { + sb.CurrentBlockAttribs.IsSeries = true; + sb.CurrentBlockAttribs.Separator = separator; + sb.CurrentBlockAttribs.EndSeparator = oxford; + sb.CurrentBlockAttribs.EndConjunction = conjunction; + } + + [RantFunction("rs")] + [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] + private static void RepSep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.CurrentBlockAttribs.IsSeries = false; + sb.CurrentBlockAttribs.Repetitions = times; + sb.CurrentBlockAttribs.Separator = separator; + } + + [RantFunction] + [RantDescription("Sets the prefix pattern for the next block.")] + private static void Before(Sandbox sb, + [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.CurrentBlockAttribs.Before = beforeAction; + + [RantFunction] + [RantDescription("Sets the postfix pattern for the next block.")] + private static void After(Sandbox sb, + [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.CurrentBlockAttribs.After = afterAction; + + [RantFunction] + [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] + private static void Chance(Sandbox sb, + [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.CurrentBlockAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; + + [RantFunction("case", "caps")] + [RantDescription("Changes the capitalization mode for all open channels.")] + private static void Case(Sandbox sb, + [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); + + [RantFunction] + [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] + private static void CapsInfer(Sandbox sb, + [RantDescription("A string that is capitalized in the format to be set.")] string sample) + { + var output = sb.Output; + if (string.IsNullOrEmpty(sample)) + { + output.Capitalize(Capitalization.None); + return; + } + var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (words.Length == 1) + { + string word = words[0]; + if (word.Length == 1) + output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); + else if (Util.IsUppercase(word)) + output.Capitalize(Capitalization.Upper); + else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + else + { + // No letters? Forget it. + if (!sample.Any(char.IsLetter)) + { + output.Capitalize(Capitalization.None); + return; + } + + // Is all-caps? + if (Util.IsUppercase(sample)) + { + output.Capitalize(Capitalization.Upper); + return; + } + + var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) + .Select(str => str.Trim()) + .Where(str => + !string.IsNullOrEmpty(str) + && !char.IsDigit(str[0])).ToArray(); + + // All words capitalized? + var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); + if (lwords.Any() && + (sentences.Length == 1 || + sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) + { + if (lwords.All(lw => char.IsUpper(lw[0]))) + { + output.Capitalize(Capitalization.Word); + return; + } + + if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) + { + output.Capitalize(Capitalization.Title); + return; + } + } + + // All sentences capitalized? + bool all = true; + bool none = true; + foreach (string sentence in sentences) + { + bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); + all = all && isCapitalized; + none = none && !isCapitalized; + } + + if (sentences.Length > 1 && all) + output.Capitalize(Capitalization.Sentence); + else if (none) + output.Capitalize(Capitalization.Lower); + else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the first.")] + private static IEnumerator First(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration == 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the first.")] + private static IEnumerator NotFirst(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration > 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the last.")] + private static IEnumerator Last(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == block.Count) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the last.")] + private static IEnumerator NotLast(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration < block.Count) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] + private static IEnumerator Middle(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration > 1 && block.Iteration < block.Count) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] + private static IEnumerator Ends(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == 1 || block.Iteration == block.Count) yield return action; + } + + [RantFunction("repnum", "rn")] + [RantDescription("Prints the iteration number of the current block.")] + private static void RepNum(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration); + } + + [RantFunction("repelapsed", "re")] + [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] + private static void RepElapsed(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration - 1); + } + + [RantFunction("repcount", "rc")] + [RantDescription("Prints the repetition count of the current block.")] + private static void RepCount(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Count); + } + + [RantFunction("reprem", "rr")] + [RantDescription("Prints the number of remaining repetitions queued after the current one.")] + private static void RepRem(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Count - block.Iteration); + } + + [RantFunction("repqueued", "rq")] + [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] + private static void RepQueued(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Count - (block.Iteration - 1)); + } + + [RantFunction] + [RantDescription("Prints the number of currently active blocks.")] + private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); + + [RantFunction("index", "i")] + [RantDescription("Prints the zero-based index of the block item currently being executed.")] + private static void Index(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index); + } + + [RantFunction("index1", "i1")] + [RantDescription("Prints the one-based index of the block item currently being executed.")] + private static void IndexOne(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index + 1); + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an odd number.")] + private static IEnumerator Odd(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an even number.")] + private static IEnumerator Even(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; + } + + [RantFunction] + [RantDescription("Returns the specified argument from the current subroutine.")] + private static IEnumerator Arg(Sandbox sb, + [RantDescription("The name of the argument to retrieve.")] string name) + { + if (!sb.SubroutineArgs.Any()) yield break; + var args = sb.SubroutineArgs.Peek(); + if (args.ContainsKey(name)) + yield return args[name]; + } + + [RantFunction] + [RantDescription("Retrieves and prints the current match string of the active replacer.")] + private static void Match(Sandbox sb) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Value); + } + + [RantFunction] + [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] + private static void Group(Sandbox sb, + [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); + } + + [RantFunction] + [RantDescription("Sets the current rhyming mode for queries.")] + private static void Rhyme(Sandbox sb, + [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; + + [RantFunction("sync", "x")] + [RantDescription("Creates and applies a synchronizer with the specified name and type.")] + private static void Sync(Sandbox sb, + [RantDescription("The name of the synchronizer.")] string name, + [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); + + [RantFunction("xpin")] + [RantDescription("Pins a synchronizer.")] + private static void SyncPin(Sandbox sb, + [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); + + [RantFunction("xunpin")] + [RantDescription("Unpins a synchronizer.")] + private static void SyncUnpin(Sandbox sb, + [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); + + [RantFunction("xstep")] + [RantDescription("Iterates a synchronizer.")] + private static void SyncStep(Sandbox sb, + [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); + + [RantFunction("xreset")] + [RantDescription("Resets a synchronizer to its initial state.")] + private static void SyncReset(Sandbox sb, + [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); + + [RantFunction("quote", "q")] + [RantDescription( + "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] + private static IEnumerator Quote(Sandbox sb, + [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) + { + sb.IncreaseQuote(); + sb.PrintOpeningQuote(); + yield return quoteAction; + sb.PrintClosingQuote(); + sb.DecreaseQuote(); + } + + [RantFunction] + [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] + private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) + { + sb.Output.OpenChannel(channelName, visibility); + yield return pattern; + sb.Output.CloseChannel(); + } + + [RantFunction("target", "t")] + [RantDescription("Places a target with the specified name at the current write position.")] + private static void Target(Sandbox sb, + [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); + + [RantFunction] + [RantDescription("Appends a string to the specified target's contents.")] + private static void Send(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); + + [RantFunction] + [RantDescription("Overwrites the specified target's contents with the provided value.")] + private static void SendOver(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) + { + sb.Output.Do(chain => chain.ClearTarget(targetName)); + sb.Output.PrintToTarget(targetName, value); + } + + [RantFunction("targetval")] + [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] + private static void GetTargetValue(Sandbox sb, + [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); + + [RantFunction("clrt")] + [RantDescription("Clears the contents of the specified target.")] + private static void ClearTarget(Sandbox sb, + [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] + private static IEnumerator Nth(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] + private static IEnumerator NthO(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] + private static IEnumerator NotNth(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." + )] + private static IEnumerator NotNthO(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Sets a pattern that will run before the next block.")] + private static void Start(Sandbox sb, + [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.CurrentBlockAttribs.Start = beforePattern; + + [RantFunction] + [RantDescription("Sets a pattern that will run after the next block.")] + private static void End(Sandbox sb, + [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.CurrentBlockAttribs.End = endPattern; + + // TODO: Finish [persist]. + //[RantFunction] + [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] + private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.CurrentBlockAttribs.Persistence = persistence; + + [RantFunction] + [RantDescription("Loads and runs a pattern from cache or file.")] + private static IEnumerator Import(Sandbox sb, + [RantDescription("The name or path of the pattern to load.")] string name) + { + RST action; + + try + { + action = sb.Engine.GetProgramInternal(name).SyntaxTree; + } + catch (RantCompilerException e) + { + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, + $"Failed to compile imported pattern '{name}':\n{e.Message}"); + } + catch (Exception e) + { + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, + $"Failed to import '{name}':\n{e.Message}"); + } + + yield return action; + } + + [RantFunction] + [RantDescription("Defines the specified flags.")] + private static void Define(Sandbox sb, + [RantDescription("The list of flags to define.")] params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.Engine.Flags.Add(flag); + } + + [RantFunction] + [RantDescription("Undefines the specified flags.")] + private static void Undef(Sandbox sb, + [RantDescription("The list of flags to undefine.")] params string[] flags) + { + foreach (string flag in flags) sb.Engine.Flags.Remove(flag); + } + + [RantFunction] + [RantDescription("Toggles the specified flags.")] + private static void Toggle(Sandbox sb, params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + { + if (sb.Engine.Flags.Contains(flag)) + sb.Engine.Flags.Remove(flag); + else + sb.Engine.Flags.Add(flag); + } + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] + private static void IfDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = true; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] + private static void IfNDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = false; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition passes.")] + private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) + { + if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) + yield return conditionPassPattern; + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition fails.")] + private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) + { + if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) + yield return conditionFailPattern; + } + + [RantFunction] + [RantDescription("Yields the currenty written output.")] + private static void Yield(Sandbox sb) => sb.SetYield(); + + [RantFunction] + [RantDescription("Branches the internal RNG according to a seed.")] + private static void Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); + + [RantFunction] + [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] + private static IEnumerator Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed, + [RantDescription("The pattern to run on the branch.")] RST branchAction) + { + sb.RNG.Branch(seed.Hash()); + yield return branchAction; + sb.RNG.Merge(); + } + + [RantFunction] + [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] + private static void Merge(Sandbox sb) => sb.RNG.Merge(); + + [RantFunction("in")] + [RantDescription("Prints the value of the specified pattern argument.")] + private static void PatternArg(Sandbox sb, + [RantDescription("The name of the argument to access.")] string argName) + { + if (sb.PatternArgs == null) return; + sb.Output.Print(sb.PatternArgs[argName]); + } + + [RantFunction("tm")] + [RantDescription("Prints the trademark symbol.")] + private static void Trademark(Sandbox sb) => sb.Print("\x2122"); + + [RantFunction("reg")] + [RantDescription("Prints the registered trademark symbol.")] + private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); + + [RantFunction("c")] + [RantDescription("Prints the copyright symbol.")] + private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); + + [RantFunction("em")] + [RantDescription("Prints an emdash.")] + private static void Emdash(Sandbox sb) => sb.Print("\x2014"); + + [RantFunction("en")] + [RantDescription("Prints an endash.")] + private static void Endash(Sandbox sb) => sb.Print("\x2013"); + + [RantFunction("b")] + [RantDescription("Prints a bullet character.")] + private static void Bullet(Sandbox sb) => sb.Print("\x2022"); + + [RantFunction("ss")] + [RantDescription("Prints an eszett (ß).")] + private static void Eszett(Sandbox sb) => sb.Print("\x00df"); + + [RantFunction("emoji")] + [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] + private static void PrintEmoji(Sandbox sb, + [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) + { + shortcode = shortcode.ToLower(); + if (!Emoji.Shortcodes.ContainsKey(shortcode)) + { + sb.Print("[missing emoji]"); + return; + } + sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); + } + + [RantFunction("plural", "pl")] + [RantDescription("Infers and prints the plural form of the specified word.")] + private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); + + [RantFunction("use")] + [RantDescription("Loads a module from the file name.module.rant, name.rant, or name, in that order.")] + private static void Use(Sandbox sb, string name) + { + if (sb.UserModules.ContainsKey(name)) + { + sb.Modules[name] = sb.UserModules[name]; + return; + } + if (sb.PackageModules.ContainsKey(name)) + { + sb.Modules[name] = sb.PackageModules[name]; + return; + } + string file; + if (File.Exists(name + ".module.rant")) + file = name + ".module.rant"; + else if (File.Exists(name + ".rant")) + file = name + ".rant"; + else if (File.Exists(name)) + file = name; + else + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Could not find module '{name}'."); + var pattern = RantProgram.CompileFile(file); + if (pattern.Module == null) + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"No module is defined in {file}."); + sb.Modules[Path.GetFileNameWithoutExtension(name)] = pattern.Module; + } + + [RantFunction] + [RantDescription("Prints the current length of the specified channel, in characters.")] + private static void Len(Sandbox sb, + [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); + + [RantFunction("rev")] + [RantDescription("Reverses the specified string and prints it to the output.")] + private static void Reverse(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = input[i]; + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = input[i]; + } + sb.Print(new string(buffer)); + } + + [RantFunction("revx")] + [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] + private static void ReverseEx(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = Util.ReverseChar(input[i]); + } + sb.Print(new string(buffer)); + } + + [RantFunction("accent")] + [RantDescription("Accents the previous character.")] + private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); + + [RantFunction("accent")] + [RantDescription("Accents the specified character.")] + private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); + + [RantFunction("acute", "act")] + [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] + private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); + + [RantFunction("circumflex", "cflex")] + [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] + private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); + + [RantFunction("grave", "grv")] + [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] + private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); + + [RantFunction("ring")] + [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] + private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); + + [RantFunction("tilde", "tld")] + [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] + private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); + + [RantFunction("diaeresis", "dia")] + [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] + private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); + + [RantFunction("caron", "crn")] + [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] + private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); + + [RantFunction("macron", "mcn")] + [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] + private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); + + [RantFunction("cedilla", "ced")] + [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] + private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); + + [RantFunction("char")] [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] - private static void Character(Sandbox sb, + private static void Character(Sandbox sb, [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); - } + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionSignature.cs b/Rant/Core/Framework/RantFunctionSignature.cs index 714f8b1..22ca0da 100644 --- a/Rant/Core/Framework/RantFunctionSignature.cs +++ b/Rant/Core/Framework/RantFunctionSignature.cs @@ -37,107 +37,111 @@ namespace Rant.Core.Framework { - /// - /// Contains information for associating a delegate with a Rant function. - /// - internal class RantFunctionSignature : IRantFunction - { - private readonly Witchcraft _delegate; - public bool TreatAsRichardFunction = false; - - public RantFunctionSignature(string name, string description, MethodInfo method) - { - // Sanity checks - if (method == null) throw new ArgumentNullException(nameof(method)); - if (!method.IsStatic) throw new ArgumentException($"({method.Name}) Method is not static."); - - RawMethod = method; - - var parameters = method.GetParameters(); - if (!parameters.Any()) - throw new ArgumentException($"({method.Name}) Cannot use a parameter-less method for a function."); - if (parameters[0].ParameterType != typeof(Sandbox)) - throw new ArgumentException($"({method.Name}) The first parameter must be of type '{typeof(Sandbox)}'."); - - // Sort out the parameter types for the function - Parameters = new RantFunctionParameter[parameters.Length - 1]; - RawParameters = parameters; - Type type; - RantFunctionParameterType rantType; - for (int i = 1; i < parameters.Length; i++) - { - // Resolve Rant parameter type from .NET type - type = parameters[i].ParameterType; - if (type.IsArray && i == parameters.Length - 1) - type = type.GetElementType(); - - if (type == typeof(RST) || type.IsSubclassOf(typeof(RST))) - rantType = RantFunctionParameterType.Pattern; - else if (type == typeof(string)) - rantType = RantFunctionParameterType.String; - else if (type.IsEnum) - rantType = type.GetCustomAttributes(typeof(FlagsAttribute), false).Any() - ? RantFunctionParameterType.Flags - : RantFunctionParameterType.Mode; - else if (IOUtil.IsNumericType(type)) - rantType = RantFunctionParameterType.Number; - else if (type == typeof(RantObject)) - rantType = RantFunctionParameterType.RantObject; - else - throw new ArgumentException( - $"({method.Name}) Unsupported type '{type}' for parameter '{parameters[i].Name}'. Must be a string, number, or RantAction."); - - // If there is a [RantDescription] attribute on the parameter, retrieve its value. Default to empty string if there isn't one. - string paramDescription = - (parameters[i].GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as - RantDescriptionAttribute)?.Description ?? ""; - - // Create Rant parameter - Parameters[i - 1] = new RantFunctionParameter(parameters[i].Name, type, rantType, - HasParamArray = - i == parameters.Length - 1 && - parameters[i].GetCustomAttributes(typeof(ParamArrayAttribute), false).FirstOrDefault() != null) - { - Description = paramDescription - }; - } - _delegate = Witchcraft.Create(method); - Name = name; - Description = description; - } - - public RantFunctionParameter[] Parameters { get; } - public ParameterInfo[] RawParameters { get; } - public MethodInfo RawMethod { get; } - public string Name { get; } - public string Description { get; } - public bool HasParamArray { get; } - public int ParamCount => Parameters.Length; - public IEnumerable GetParameters() => Parameters; - - public IEnumerator Invoke(Sandbox sb, object[] arguments) - { - return _delegate.Invoke(sb, arguments) as IEnumerator ?? CreateEmptyIterator(); - } - - private static IEnumerator CreateEmptyIterator() - { - yield break; - } - - public override string ToString() - { - var sb = new StringBuilder(); - sb.Append('[').Append(Name); - for (int i = 0; i < Parameters.Length; i++) - { - sb.Append(i == 0 ? ':' : ';').Append(' '); - sb.Append(Parameters[i].Name); - if (i == Parameters.Length - 1 && Parameters[i].IsParams) - sb.Append("..."); - } - sb.Append(']'); - return sb.ToString(); - } - } + /// + /// Contains information for associating a delegate with a Rant function. + /// + internal class RantFunctionSignature : IRantFunction + { + private readonly Witchcraft _delegate; + public bool TreatAsRichardFunction = false; + + public RantFunctionSignature(string name, string description, MethodInfo method) + { + // Sanity checks + if (method == null) throw new ArgumentNullException(nameof(method)); + if (!method.IsStatic) throw new ArgumentException($"({method.Name}) Method is not static."); + + RawMethod = method; + + var parameters = method.GetParameters(); + if (!parameters.Any()) + throw new ArgumentException($"({method.Name}) Cannot use a parameter-less method for a function."); + if (parameters[0].ParameterType != typeof(Sandbox)) + throw new ArgumentException($"({method.Name}) The first parameter must be of type '{typeof(Sandbox)}'."); + + // Sort out the parameter types for the function + Parameters = new RantFunctionParameter[parameters.Length - 1]; + RawParameters = parameters; + Type type; + RantFunctionParameterType rantType; + for (int i = 1; i < parameters.Length; i++) + { + // Resolve Rant parameter type from .NET type + type = parameters[i].ParameterType; + if (type.IsArray && i == parameters.Length - 1) + type = type.GetElementType(); + + if (type == typeof(RST) || type.IsSubclassOf(typeof(RST))) + rantType = RantFunctionParameterType.Pattern; + else if (type == typeof(string)) + rantType = RantFunctionParameterType.String; + else if (type.IsEnum) + { + rantType = type.GetCustomAttributes(typeof(FlagsAttribute), false).Any() + ? RantFunctionParameterType.Flags + : RantFunctionParameterType.Mode; + } + else if (IOUtil.IsNumericType(type)) + rantType = RantFunctionParameterType.Number; + else if (type == typeof(RantObject)) + rantType = RantFunctionParameterType.RantObject; + else + { + throw new ArgumentException( + $"({method.Name}) Unsupported type '{type}' for parameter '{parameters[i].Name}'. Must be a string, number, or RantAction."); + } + + // If there is a [RantDescription] attribute on the parameter, retrieve its value. Default to empty string if there isn't one. + string paramDescription = + (parameters[i].GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as + RantDescriptionAttribute)?.Description ?? ""; + + // Create Rant parameter + Parameters[i - 1] = new RantFunctionParameter(parameters[i].Name, type, rantType, + HasParamArray = + i == parameters.Length - 1 && + parameters[i].GetCustomAttributes(typeof(ParamArrayAttribute), false).FirstOrDefault() != null) + { + Description = paramDescription + }; + } + _delegate = Witchcraft.Create(method); + Name = name; + Description = description; + } + + public RantFunctionParameter[] Parameters { get; } + public ParameterInfo[] RawParameters { get; } + public MethodInfo RawMethod { get; } + public string Name { get; } + public string Description { get; } + public bool HasParamArray { get; } + public int ParamCount => Parameters.Length; + public IEnumerable GetParameters() => Parameters; + + public IEnumerator Invoke(Sandbox sb, object[] arguments) + { + return _delegate.Invoke(sb, arguments) as IEnumerator ?? CreateEmptyIterator(); + } + + private static IEnumerator CreateEmptyIterator() + { + yield break; + } + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append('[').Append(Name); + for (int i = 0; i < Parameters.Length; i++) + { + sb.Append(i == 0 ? ':' : ';').Append(' '); + sb.Append(Parameters[i].Name); + if (i == Parameters.Length - 1 && Parameters[i].IsParams) + sb.Append("..."); + } + sb.Append(']'); + return sb.ToString(); + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/BitField.cs b/Rant/Core/IO/BitField.cs index 4c3cb3d..16134f8 100644 --- a/Rant/Core/IO/BitField.cs +++ b/Rant/Core/IO/BitField.cs @@ -28,139 +28,139 @@ namespace Rant.Core.IO { - /// - /// Represents a bit field of arbitrary length. - /// - internal class BitField - { - internal byte[] _field; - - /// - /// Creates a new instance of the Rant.IO.BitField class with the specified number of bits. - /// - /// The number of bits in the bit field. This value must be a multiple of 8. - public BitField(int bits) - { - if (bits % 8 != 0) - throw new ArgumentException("Bit count must be a multiple of 8."); - - _field = new byte[bits / 8]; - } - - internal BitField(byte[] data) - { - _field = data; - } - - /// - /// Accesses the bit at the specified index in the bit field. - /// - /// The index of the bit to access. - /// - public bool this[int i] - { - get { return ((_field[i / 8] >> (i % 8)) & 1) == 1; } - set { _field[i / 8] = (byte)((_field[i / 8] & ~(1 << (i % 8))) | (value ? 1 << (i % 8) : 0)); } - } - - /// - /// The number of bits in the BitField. - /// - public int Bits - { - get { return _field.Length * 8; } - } - - /// - /// The number of bytes in the BitField. - /// - public int Bytes - { - get { return _field.Length; } - } - - /// - /// Creates a BitField object from the specified data. - /// - /// The type of data to pass. - /// The data to pass to the BitField. - /// - public static BitField FromValue(T value) where T : struct - { - int size = Marshal.SizeOf(typeof(T)); - var data = new byte[size]; - var ptr = Marshal.AllocHGlobal(size); - Marshal.StructureToPtr(value, ptr, false); - Marshal.Copy(ptr, data, 0, size); - return new BitField(data); - } - - /// - /// Unsets all the flags in the bitfield. - /// - public void UnsetAll() - { - Array.Clear(_field, 0, _field.Length); - } - - /// - /// Sets all the flags in the bitfield. - /// - public void SetAll() - { - for (int i = 0; i < _field.Length; i++) - _field[i] = 0xFF; - } - - /// - /// Returns the number of set bits. - /// - /// The number of set bits. - public int GetSetCount() - { - int n = 0; - foreach (byte b in _field) - n += IOUtil.NumberOfSetBits(b); - return n; - } - - /// - /// Returns the number of unset bits. - /// - /// The number of unset bits. - public int GetUnsetCount() - { - return Bits - GetSetCount(); - } - - /// - /// Inverts the flags in the bit field. - /// - public void Invert() - { - for (int i = 0; i < _field.Length; i++) - _field[i] = (byte)~_field[i]; - } - - /// - /// Creates a new BitField from the specified array of bytes. - /// - /// The array of bytes to create the BitField from. - /// - public static BitField FromBytes(byte[] data) - { - var bf = new BitField(data.Length * 8); - Array.Copy(data, bf._field, data.Length); - return bf; - } - - /// - /// Returns the BitField as an array of bytes. - /// - /// - public byte[] GetBytes() - { - return _field; - } - } + /// + /// Represents a bit field of arbitrary length. + /// + internal class BitField + { + internal byte[] _field; + + /// + /// Creates a new instance of the Rant.IO.BitField class with the specified number of bits. + /// + /// The number of bits in the bit field. This value must be a multiple of 8. + public BitField(int bits) + { + if (bits % 8 != 0) + throw new ArgumentException("Bit count must be a multiple of 8."); + + _field = new byte[bits / 8]; + } + + internal BitField(byte[] data) + { + _field = data; + } + + /// + /// Accesses the bit at the specified index in the bit field. + /// + /// The index of the bit to access. + /// + public bool this[int i] + { + get { return ((_field[i / 8] >> (i % 8)) & 1) == 1; } + set { _field[i / 8] = (byte)((_field[i / 8] & ~(1 << (i % 8))) | (value ? 1 << (i % 8) : 0)); } + } + + /// + /// The number of bits in the BitField. + /// + public int Bits + { + get { return _field.Length * 8; } + } + + /// + /// The number of bytes in the BitField. + /// + public int Bytes + { + get { return _field.Length; } + } + + /// + /// Creates a BitField object from the specified data. + /// + /// The type of data to pass. + /// The data to pass to the BitField. + /// + public static BitField FromValue(T value) where T : struct + { + int size = Marshal.SizeOf(typeof(T)); + var data = new byte[size]; + var ptr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(value, ptr, false); + Marshal.Copy(ptr, data, 0, size); + return new BitField(data); + } + + /// + /// Unsets all the flags in the bitfield. + /// + public void UnsetAll() + { + Array.Clear(_field, 0, _field.Length); + } + + /// + /// Sets all the flags in the bitfield. + /// + public void SetAll() + { + for (int i = 0; i < _field.Length; i++) + _field[i] = 0xFF; + } + + /// + /// Returns the number of set bits. + /// + /// The number of set bits. + public int GetSetCount() + { + int n = 0; + foreach (byte b in _field) + n += IOUtil.NumberOfSetBits(b); + return n; + } + + /// + /// Returns the number of unset bits. + /// + /// The number of unset bits. + public int GetUnsetCount() + { + return Bits - GetSetCount(); + } + + /// + /// Inverts the flags in the bit field. + /// + public void Invert() + { + for (int i = 0; i < _field.Length; i++) + _field[i] = (byte)~_field[i]; + } + + /// + /// Creates a new BitField from the specified array of bytes. + /// + /// The array of bytes to create the BitField from. + /// + public static BitField FromBytes(byte[] data) + { + var bf = new BitField(data.Length * 8); + Array.Copy(data, bf._field, data.Length); + return bf; + } + + /// + /// Returns the BitField as an array of bytes. + /// + /// + public byte[] GetBytes() + { + return _field; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs index ceedcf4..bc0b2f4 100644 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ b/Rant/Core/IO/Bson/BsonDocument.cs @@ -30,357 +30,357 @@ namespace Rant.Core.IO.Bson { - /// - /// Represents a document encoded in BSON. - /// - internal class BsonDocument - { - /// - /// The current string table version. - /// At some point we might want to make modifications to the format, - /// and we'll want a way to maintain backwards compatibility. - /// - public const int STRING_TABLE_VERSION = 1; + /// + /// Represents a document encoded in BSON. + /// + internal class BsonDocument + { + /// + /// The current string table version. + /// At some point we might want to make modifications to the format, + /// and we'll want a way to maintain backwards compatibility. + /// + public const int STRING_TABLE_VERSION = 1; - private readonly Dictionary _stringTable; - private int _stringTableIndex = 0; + private readonly Dictionary _stringTable; + private int _stringTableIndex = 0; - /// - /// The top item of this BSON document. - /// - public BsonItem Top; + /// + /// The top item of this BSON document. + /// + public BsonItem Top; - /// - /// Creates an empty BSON document. - /// Whether or not to generate and use a string table. - /// - public BsonDocument( - BsonStringTableMode mode = BsonStringTableMode.None, - Dictionary reverseStringTable = null) - { - StringTableMode = mode; - _stringTable = new Dictionary(); - ReverseStringTable = reverseStringTable; - Top = new BsonItem(); - } + /// + /// Creates an empty BSON document. + /// Whether or not to generate and use a string table. + /// + public BsonDocument( + BsonStringTableMode mode = BsonStringTableMode.None, + Dictionary reverseStringTable = null) + { + StringTableMode = mode; + _stringTable = new Dictionary(); + ReverseStringTable = reverseStringTable; + Top = new BsonItem(); + } - /// - /// Retreives the value of the given key if it exists. - /// - /// The key to retrieve. - /// The value of the given key, or null if it does not exist. - public BsonItem this[string key] - { - get { return Top.HasKey(key) ? Top[key] : null; } - set { Top[key] = value; } - } + /// + /// Retreives the value of the given key if it exists. + /// + /// The key to retrieve. + /// The value of the given key, or null if it does not exist. + public BsonItem this[string key] + { + get { return Top.HasKey(key) ? Top[key] : null; } + set { Top[key] = value; } + } - public BsonStringTableMode StringTableMode { get; } = BsonStringTableMode.None; - public Dictionary ReverseStringTable { get; } + public BsonStringTableMode StringTableMode { get; } = BsonStringTableMode.None; + public Dictionary ReverseStringTable { get; } - /// - /// Returns this document encoded in BSON as a byte array. - /// - /// This document converted to BSON. - public byte[] ToByteArray(bool includeStringTable = false) - { - var stream = new MemoryStream(); - Write(stream, includeStringTable); - stream.Close(); - return stream.ToArray(); - } + /// + /// Returns this document encoded in BSON as a byte array. + /// + /// This document converted to BSON. + public byte[] ToByteArray(bool includeStringTable = false) + { + var stream = new MemoryStream(); + Write(stream, includeStringTable); + stream.Close(); + return stream.ToArray(); + } - public byte[] GenerateStringTable() - { - var stream = new MemoryStream(); - var writer = new EasyWriter(stream); - writer.Write(_stringTable.Count); - foreach (string key in _stringTable.Keys) - { - writer.Write(_stringTable[key]); - writer.Write(key, Encoding.UTF8); - } - writer.Close(); - stream.Close(); - return stream.ToArray(); - } + public byte[] GenerateStringTable() + { + var stream = new MemoryStream(); + var writer = new EasyWriter(stream); + writer.Write(_stringTable.Count); + foreach (string key in _stringTable.Keys) + { + writer.Write(_stringTable[key]); + writer.Write(key, Encoding.UTF8); + } + writer.Close(); + stream.Close(); + return stream.ToArray(); + } - /// - /// Writes this BSON document to the specified path. - /// - /// The path to write to. - /// - public void Write(string path, bool includeStringTable = false) - { - var stream = File.Open(path, FileMode.Create); - var writer = new EasyWriter(stream); - Write(writer); - writer.Close(); - stream.Close(); - } + /// + /// Writes this BSON document to the specified path. + /// + /// The path to write to. + /// + public void Write(string path, bool includeStringTable = false) + { + var stream = File.Open(path, FileMode.Create); + var writer = new EasyWriter(stream); + Write(writer); + writer.Close(); + stream.Close(); + } - /// - /// Writes this document as BSON to the specified stream. - /// - /// The stream that will be written to. - /// Specifies whether to include the string table. - public void Write(Stream stream, bool includeStringTable = false) - { - var memoryStream = new MemoryStream(); - using (var writer = new EasyWriter(memoryStream)) - { - Write(writer); - } - memoryStream.Close(); - var bytes = memoryStream.ToArray(); - var tableWriter = new EasyWriter(stream); - WriteStringTable(tableWriter, includeStringTable); - stream.Write(bytes, 0, bytes.Length); - } + /// + /// Writes this document as BSON to the specified stream. + /// + /// The stream that will be written to. + /// Specifies whether to include the string table. + public void Write(Stream stream, bool includeStringTable = false) + { + var memoryStream = new MemoryStream(); + using (var writer = new EasyWriter(memoryStream)) + { + Write(writer); + } + memoryStream.Close(); + var bytes = memoryStream.ToArray(); + var tableWriter = new EasyWriter(stream); + WriteStringTable(tableWriter, includeStringTable); + stream.Write(bytes, 0, bytes.Length); + } - /// - /// Writes this document using the specified EasyWriter. - /// - /// The writer that will be used to write this document. - internal void Write(EasyWriter writer) - { - _stringTableIndex = 0; - _stringTable.Clear(); - WriteItem(writer, Top, null, true); - writer.Close(); - } + /// + /// Writes this document using the specified EasyWriter. + /// + /// The writer that will be used to write this document. + internal void Write(EasyWriter writer) + { + _stringTableIndex = 0; + _stringTable.Clear(); + WriteItem(writer, Top, null, true); + writer.Close(); + } - internal void WriteStringTable(EasyWriter writer, bool include) - { - writer.Write(include); - if (!include) return; - writer.Write((byte)StringTableMode); - writer.Write((byte)STRING_TABLE_VERSION); - var stringTableBytes = GenerateStringTable(); - writer.Write(stringTableBytes.Length); - writer.Write(stringTableBytes); - } + internal void WriteStringTable(EasyWriter writer, bool include) + { + writer.Write(include); + if (!include) return; + writer.Write((byte)StringTableMode); + writer.Write((byte)STRING_TABLE_VERSION); + var stringTableBytes = GenerateStringTable(); + writer.Write(stringTableBytes.Length); + writer.Write(stringTableBytes); + } - private void WriteItem(EasyWriter writer, BsonItem item, string name, bool isTop = false, bool isArray = false) - { - if (!isTop) - { - writer.Write(item.Type); - writer.Write(isArray ? name : GetKeyName(name), Encoding.UTF8, true); - } + private void WriteItem(EasyWriter writer, BsonItem item, string name, bool isTop = false, bool isArray = false) + { + if (!isTop) + { + writer.Write(item.Type); + writer.Write(isArray ? name : GetKeyName(name), Encoding.UTF8, true); + } - if (item.HasValues) // object or array - we need to write a document - { - var stream = new MemoryStream(); - var vWriter = new EasyWriter(stream); - foreach (string key in item.Keys) - WriteItem(vWriter, item[key], key, false, item.IsArray); - vWriter.Close(); - var data = stream.ToArray(); - // length of data + length of length + null terminator - writer.Write(data.Length + 4 + 1); - writer.Write(data); - writer.Write((byte)0x00); - return; - } + if (item.HasValues) // object or array - we need to write a document + { + var stream = new MemoryStream(); + var vWriter = new EasyWriter(stream); + foreach (string key in item.Keys) + WriteItem(vWriter, item[key], key, false, item.IsArray); + vWriter.Close(); + var data = stream.ToArray(); + // length of data + length of length + null terminator + writer.Write(data.Length + 4 + 1); + writer.Write(data); + writer.Write((byte)0x00); + return; + } - switch (item.Type) - { - case 0x01: // double - writer.Write((double)item.Value); - break; - case 0x02: // string - var bytes = Encoding.UTF8.GetBytes(GetKeyName((string)item.Value, true)); - writer.Write(bytes.Length + 1); // includes null terminator - writer.WriteBytes(bytes); - writer.Write((byte)0x00); - break; - case 0x05: // binary - var byteArray = (byte[])item.Value; - writer.Write(byteArray.Length); - writer.Write((byte)0x00); - writer.Write(byteArray); - break; - case 0x07: // objectid - writer.Write((byte[])item.Value); - break; - case 0x08: // bool - writer.Write((bool)item.Value); - break; - case 0x09: // UTC datetime - case 0x11: // timestamp - case 0x12: // 64 bit int - writer.Write((long)item.Value); - break; - case 0x10: // 32 bit int - writer.Write((int)item.Value); - break; - default: - Console.WriteLine(item.Value); - throw new NotSupportedException($"Item type {item.Value.GetType()} (code {item.Type}) not supported."); - } - } + switch (item.Type) + { + case 0x01: // double + writer.Write((double)item.Value); + break; + case 0x02: // string + var bytes = Encoding.UTF8.GetBytes(GetKeyName((string)item.Value, true)); + writer.Write(bytes.Length + 1); // includes null terminator + writer.WriteBytes(bytes); + writer.Write((byte)0x00); + break; + case 0x05: // binary + var byteArray = (byte[])item.Value; + writer.Write(byteArray.Length); + writer.Write((byte)0x00); + writer.Write(byteArray); + break; + case 0x07: // objectid + writer.Write((byte[])item.Value); + break; + case 0x08: // bool + writer.Write((bool)item.Value); + break; + case 0x09: // UTC datetime + case 0x11: // timestamp + case 0x12: // 64 bit int + writer.Write((long)item.Value); + break; + case 0x10: // 32 bit int + writer.Write((int)item.Value); + break; + default: + Console.WriteLine(item.Value); + throw new NotSupportedException($"Item type {item.Value.GetType()} (code {item.Type}) not supported."); + } + } - /// - /// Determines the correct name for the provided key. - /// This will return the string table key instead if it's enabled. - /// - /// The name of the key. - /// Determines whether the original key string should be used. - /// The correct name for the provided key. - private string GetKeyName(string name, bool value = false) - { - if (StringTableMode == BsonStringTableMode.None || - value && StringTableMode == BsonStringTableMode.Keys) - return name; - if (_stringTable.ContainsKey(name)) - return _stringTable[name].ToString(); - _stringTable[name] = _stringTableIndex++; - return _stringTable[name].ToString(); - } + /// + /// Determines the correct name for the provided key. + /// This will return the string table key instead if it's enabled. + /// + /// The name of the key. + /// Determines whether the original key string should be used. + /// The correct name for the provided key. + private string GetKeyName(string name, bool value = false) + { + if (StringTableMode == BsonStringTableMode.None || + value && StringTableMode == BsonStringTableMode.Keys) + return name; + if (_stringTable.ContainsKey(name)) + return _stringTable[name].ToString(); + _stringTable[name] = _stringTableIndex++; + return _stringTable[name].ToString(); + } - /// - /// Reads a BSON document from the specified byte array. - /// - /// The byte array that this document will be read from. - /// The document that was read. - public static BsonDocument Read(byte[] data) - { - return Read(new EasyReader(data)); - } + /// + /// Reads a BSON document from the specified byte array. + /// + /// The byte array that this document will be read from. + /// The document that was read. + public static BsonDocument Read(byte[] data) + { + return Read(new EasyReader(data)); + } - /// - /// Reads a BSON document from the specified stream. - /// - /// The stream that this document will be read from. - /// The document that was read. - public static BsonDocument Read(Stream data) - { - return Read(new EasyReader(data)); - } + /// + /// Reads a BSON document from the specified stream. + /// + /// The stream that this document will be read from. + /// The document that was read. + public static BsonDocument Read(Stream data) + { + return Read(new EasyReader(data)); + } - /// - /// Reads a BSON document from the specified EasyReader. - /// - /// The reader that will be used to read this document. - /// The parent document. - /// Specifies whether the document belongs to an array. - /// The document that was read. - internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) - { - var stringTableMode = BsonStringTableMode.None; - Dictionary stringTable = null; - if (parent == null) - { - bool includesStringTable = reader.ReadBoolean(); - if (includesStringTable) - { - stringTable = new Dictionary(); - stringTableMode = (BsonStringTableMode)reader.ReadByte(); - byte version = reader.ReadByte(); - if (version != STRING_TABLE_VERSION) - throw new InvalidDataException("Unsupported string table version: " + version); - int tableLength = reader.ReadInt32(); - int tableEntries = reader.ReadInt32(); - for (int i = 0; i < tableEntries; i++) - { - int num = reader.ReadInt32(); - string val = reader.ReadString(Encoding.UTF8); - stringTable[num] = val; - } - } - } - else - { - stringTable = parent.ReverseStringTable; - stringTableMode = parent.StringTableMode; - } - var document = new BsonDocument(stringTableMode, stringTable); + /// + /// Reads a BSON document from the specified EasyReader. + /// + /// The reader that will be used to read this document. + /// The parent document. + /// Specifies whether the document belongs to an array. + /// The document that was read. + internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) + { + var stringTableMode = BsonStringTableMode.None; + Dictionary stringTable = null; + if (parent == null) + { + bool includesStringTable = reader.ReadBoolean(); + if (includesStringTable) + { + stringTable = new Dictionary(); + stringTableMode = (BsonStringTableMode)reader.ReadByte(); + byte version = reader.ReadByte(); + if (version != STRING_TABLE_VERSION) + throw new InvalidDataException("Unsupported string table version: " + version); + int tableLength = reader.ReadInt32(); + int tableEntries = reader.ReadInt32(); + for (int i = 0; i < tableEntries; i++) + { + int num = reader.ReadInt32(); + string val = reader.ReadString(Encoding.UTF8); + stringTable[num] = val; + } + } + } + else + { + stringTable = parent.ReverseStringTable; + stringTableMode = parent.StringTableMode; + } + var document = new BsonDocument(stringTableMode, stringTable); - int length = reader.ReadInt32(); - while (!reader.EndOfStream) - { - byte code = reader.ReadByte(); - if (code == 0x00) // end of document - break; - string name = reader.ReadCString(); - if (!inArray && document.StringTableMode != BsonStringTableMode.None) - name = document.ReverseStringTable[int.Parse(name)]; - var data = ReadItem(code, document, reader); - document.Top[name] = data; - } - return document; - } + int length = reader.ReadInt32(); + while (!reader.EndOfStream) + { + byte code = reader.ReadByte(); + if (code == 0x00) // end of document + break; + string name = reader.ReadCString(); + if (!inArray && document.StringTableMode != BsonStringTableMode.None) + name = document.ReverseStringTable[int.Parse(name)]; + var data = ReadItem(code, document, reader); + document.Top[name] = data; + } + return document; + } - private static BsonItem ReadItem(byte code, BsonDocument document, EasyReader reader) - { - object val = null; - switch (code) - { - case 0x01: // double - val = reader.ReadDouble(); - break; - case 0x02: // string - val = reader.ReadString(Encoding.UTF8).TrimEnd('\x00'); - if (document.StringTableMode == BsonStringTableMode.KeysAndValues) - val = document.ReverseStringTable[int.Parse((string)val)]; - break; - case 0x03: // document - val = Read(reader, document).Top; - break; - case 0x04: // array - val = Read(reader, document, true).Top; - break; - case 0x05: // binary - int length = reader.ReadInt32(); - byte subtype = reader.ReadByte(); - if (subtype != 0x00) - throw new NotSupportedException("BSON subtypes other than 'generic binary data' are not supported."); - val = reader.ReadBytes(length); - break; - case 0x06: // undefined - break; - case 0x07: // ObjectId - // why does this parser support ObjectIds and not other binary data? - // shhhhh - val = Encoding.ASCII.GetString(reader.ReadBytes(12)); - break; - case 0x08: // boolean - val = reader.ReadBoolean(); - break; - case 0x09: // UTC datetime - val = reader.ReadInt64(); - break; - case 0x0A: // null - break; - case 0x0B: // regex - // why are you using regex in a Rant package? - throw new NotSupportedException("Regular expressions are not supported."); - case 0x0C: // db pointer - throw new NotSupportedException("DB pointers are not supported."); - case 0x0D: // Javascript code - case 0x0F: // JS code with scope - throw new NotSupportedException("Javascript in BSON is not supported."); - case 0x0E: // depreceated - val = reader.ReadString(Encoding.UTF8); - break; - case 0x10: // 32 bit integer - val = reader.ReadInt32(); - break; - case 0x11: // timestamp - case 0x12: // 64 bit integer - val = reader.ReadInt64(); - break; - case 0xFF: // min key - case 0x7F: // max key - // we don't care about these so let's just skip em - break; - } - if (!(val is BsonItem)) - return new BsonItem(val) { Type = code }; - var i = (BsonItem)val; - i.Type = code; - return i; - } - } + private static BsonItem ReadItem(byte code, BsonDocument document, EasyReader reader) + { + object val = null; + switch (code) + { + case 0x01: // double + val = reader.ReadDouble(); + break; + case 0x02: // string + val = reader.ReadString(Encoding.UTF8).TrimEnd('\x00'); + if (document.StringTableMode == BsonStringTableMode.KeysAndValues) + val = document.ReverseStringTable[int.Parse((string)val)]; + break; + case 0x03: // document + val = Read(reader, document).Top; + break; + case 0x04: // array + val = Read(reader, document, true).Top; + break; + case 0x05: // binary + int length = reader.ReadInt32(); + byte subtype = reader.ReadByte(); + if (subtype != 0x00) + throw new NotSupportedException("BSON subtypes other than 'generic binary data' are not supported."); + val = reader.ReadBytes(length); + break; + case 0x06: // undefined + break; + case 0x07: // ObjectId + // why does this parser support ObjectIds and not other binary data? + // shhhhh + val = Encoding.ASCII.GetString(reader.ReadBytes(12)); + break; + case 0x08: // boolean + val = reader.ReadBoolean(); + break; + case 0x09: // UTC datetime + val = reader.ReadInt64(); + break; + case 0x0A: // null + break; + case 0x0B: // regex + // why are you using regex in a Rant package? + throw new NotSupportedException("Regular expressions are not supported."); + case 0x0C: // db pointer + throw new NotSupportedException("DB pointers are not supported."); + case 0x0D: // Javascript code + case 0x0F: // JS code with scope + throw new NotSupportedException("Javascript in BSON is not supported."); + case 0x0E: // depreceated + val = reader.ReadString(Encoding.UTF8); + break; + case 0x10: // 32 bit integer + val = reader.ReadInt32(); + break; + case 0x11: // timestamp + case 0x12: // 64 bit integer + val = reader.ReadInt64(); + break; + case 0xFF: // min key + case 0x7F: // max key + // we don't care about these so let's just skip em + break; + } + if (!(val is BsonItem)) + return new BsonItem(val) { Type = code }; + var i = (BsonItem)val; + i.Type = code; + return i; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Bson/BsonItem.cs b/Rant/Core/IO/Bson/BsonItem.cs index 7e6f585..4576877 100644 --- a/Rant/Core/IO/Bson/BsonItem.cs +++ b/Rant/Core/IO/Bson/BsonItem.cs @@ -30,263 +30,265 @@ namespace Rant.Core.IO.Bson { - /// - /// One item in a BSON document. - /// - internal class BsonItem - { - private Dictionary _objectValues; - private byte _type = 0; - private bool _typeSet = false; - private object _value; - - /// - /// Creates a new BsonItem with the specified value. - /// - /// The value of this BSON item. - public BsonItem(object value) - { - _value = value; - _objectValues = new Dictionary(); - PossiblyCreateArray(); - } - - /// - /// Creates a new empty BsonItem. - /// - public BsonItem() - { - _value = null; - _objectValues = new Dictionary(); - } - - public bool IsArray => _type == 0x04; - - /// - /// The BSON type code of this object. If not explicitly specified, it will guess. - /// - public byte Type - { - get - { - if (!_typeSet) - DetermineType(); - - return _type; - } - set - { - _typeSet = true; - _type = value; - } - } - - /// - /// The value of this item, if it is not a document or array. - /// - public object Value - { - get { return _value ?? _objectValues; } - set - { - _value = value; - DetermineType(); - PossiblyCreateArray(); - } - } - - /// - /// Whether or not this item has sub values (is a document or array). - /// - public bool HasValues - { - get { return _value == null; } - } - - /// - /// The number of items in this BsonItem, if it's a collection. - /// - public int Count => _objectValues.Keys.Count; - - /// - /// An array of the keys in this BsonItem. - /// - public string[] Keys => _objectValues.Keys.ToArray(); - - public IEnumerable Values => _objectValues.Values; - - /// - /// Accesses the value of the specified key. - /// - /// The key whose value will be accessed. - /// The value of the specified key. - public BsonItem this[string key] - { - get - { - if (!HasKey(key)) - return null; - return _objectValues[key]; - } - set { _objectValues[key] = value; } - } - - /// - /// Accesses the value of the specified key. - /// - /// The key whose value will be accessed. - /// The value of the specified key. - public BsonItem this[int key] - { - get { return _objectValues[key.ToString()]; } - set { _objectValues[key.ToString()] = value; } - } - - /// - /// Converts this BsonItem to a double. - /// - /// The BsonItem to convert. - public static implicit operator double(BsonItem a) - { - return (double)a.Value; - } - - /// - /// Converts this BsonItem to an int. - /// - /// The BsonItem to convert. - public static implicit operator int(BsonItem a) - { - return (int)a.Value; - } - - /// - /// Convers this BsonItem to a string. - /// - /// The BsonItem to convert. - public static implicit operator string(BsonItem a) - { - return (string)a?.Value; - } - - public static explicit operator string[](BsonItem a) - { - return a?.Values?.Select(i => (string)i).ToArray() ?? new string[] { }; - } - - /// - /// Converts this double to a BsonItem. - /// - /// The double to convert. - public static implicit operator BsonItem(double a) - { - return new BsonItem(a); - } - - /// - /// Converts this string to a BsonItem. - /// - /// The string to convert. - public static implicit operator BsonItem(string a) - { - return new BsonItem(a); - } - - /// - /// Converts this bool to a BsonItem. - /// - /// The bool to convert. - public static implicit operator BsonItem(bool a) - { - return new BsonItem(a); - } - - /// - /// Converts this int to a BsonItem. - /// - /// The int to convert. - public static implicit operator BsonItem(int a) - { - return new BsonItem(a); - } - - /// - /// Converts this long to a BsonItem. - /// - /// The long to convert. - public static implicit operator BsonItem(long a) - { - return new BsonItem(a); - } - - /// - /// Checks whether or not this item has the specified key. - /// - /// The key to check for. - /// Whether or not this item has the specified key. - public bool HasKey(string key) - { - return _objectValues.ContainsKey(key); - } - - public object[] ToValueArray() - { - if (!IsArray) - throw new Exception("Can't convert a non-array to an array."); - var list = new List(); - for (int i = 0; i < Count; i++) - list.Add(this[i].Value); - return list.ToArray(); - } - - private void PossiblyCreateArray() - { - if (_value == null) return; - var type = _value.GetType(); - object[] arr; - - if (type.IsArray) - arr = _value as object[]; - else if (_value is IList) - arr = (_value as IList).OfType().ToArray(); - else - return; - - if (arr == null) return; - _type = 0x04; // array - _typeSet = true; - _objectValues = new Dictionary(); - _value = null; - for (int i = 0; i < arr.Length; i++) - _objectValues[i.ToString()] = arr[i] is BsonItem - ? (BsonItem)arr[i] - : new BsonItem(arr[i]); - } - - private void DetermineType() - { - if (_value == null) - { - _type = 0x03; // document - return; - } - - // i apologize for this if statement - - if (_value is double || _value is float) - _type = 0x01; - else if (_value is string) - _type = 0x02; - else if (_value is byte[]) - _type = 0x05; - else if (_value is bool) - _type = 0x08; - else if (_value is long) - _type = 0x09; - else if (_value is int) - _type = 0x10; - else - _type = 0x00; - } - } + /// + /// One item in a BSON document. + /// + internal class BsonItem + { + private Dictionary _objectValues; + private byte _type = 0; + private bool _typeSet = false; + private object _value; + + /// + /// Creates a new BsonItem with the specified value. + /// + /// The value of this BSON item. + public BsonItem(object value) + { + _value = value; + _objectValues = new Dictionary(); + PossiblyCreateArray(); + } + + /// + /// Creates a new empty BsonItem. + /// + public BsonItem() + { + _value = null; + _objectValues = new Dictionary(); + } + + public bool IsArray => _type == 0x04; + + /// + /// The BSON type code of this object. If not explicitly specified, it will guess. + /// + public byte Type + { + get + { + if (!_typeSet) + DetermineType(); + + return _type; + } + set + { + _typeSet = true; + _type = value; + } + } + + /// + /// The value of this item, if it is not a document or array. + /// + public object Value + { + get { return _value ?? _objectValues; } + set + { + _value = value; + DetermineType(); + PossiblyCreateArray(); + } + } + + /// + /// Whether or not this item has sub values (is a document or array). + /// + public bool HasValues + { + get { return _value == null; } + } + + /// + /// The number of items in this BsonItem, if it's a collection. + /// + public int Count => _objectValues.Keys.Count; + + /// + /// An array of the keys in this BsonItem. + /// + public string[] Keys => _objectValues.Keys.ToArray(); + + public IEnumerable Values => _objectValues.Values; + + /// + /// Accesses the value of the specified key. + /// + /// The key whose value will be accessed. + /// The value of the specified key. + public BsonItem this[string key] + { + get + { + if (!HasKey(key)) + return null; + return _objectValues[key]; + } + set { _objectValues[key] = value; } + } + + /// + /// Accesses the value of the specified key. + /// + /// The key whose value will be accessed. + /// The value of the specified key. + public BsonItem this[int key] + { + get { return _objectValues[key.ToString()]; } + set { _objectValues[key.ToString()] = value; } + } + + /// + /// Converts this BsonItem to a double. + /// + /// The BsonItem to convert. + public static implicit operator double(BsonItem a) + { + return (double)a.Value; + } + + /// + /// Converts this BsonItem to an int. + /// + /// The BsonItem to convert. + public static implicit operator int(BsonItem a) + { + return (int)a.Value; + } + + /// + /// Convers this BsonItem to a string. + /// + /// The BsonItem to convert. + public static implicit operator string(BsonItem a) + { + return (string)a?.Value; + } + + public static explicit operator string[](BsonItem a) + { + return a?.Values?.Select(i => (string)i).ToArray() ?? new string[] { }; + } + + /// + /// Converts this double to a BsonItem. + /// + /// The double to convert. + public static implicit operator BsonItem(double a) + { + return new BsonItem(a); + } + + /// + /// Converts this string to a BsonItem. + /// + /// The string to convert. + public static implicit operator BsonItem(string a) + { + return new BsonItem(a); + } + + /// + /// Converts this bool to a BsonItem. + /// + /// The bool to convert. + public static implicit operator BsonItem(bool a) + { + return new BsonItem(a); + } + + /// + /// Converts this int to a BsonItem. + /// + /// The int to convert. + public static implicit operator BsonItem(int a) + { + return new BsonItem(a); + } + + /// + /// Converts this long to a BsonItem. + /// + /// The long to convert. + public static implicit operator BsonItem(long a) + { + return new BsonItem(a); + } + + /// + /// Checks whether or not this item has the specified key. + /// + /// The key to check for. + /// Whether or not this item has the specified key. + public bool HasKey(string key) + { + return _objectValues.ContainsKey(key); + } + + public object[] ToValueArray() + { + if (!IsArray) + throw new Exception("Can't convert a non-array to an array."); + var list = new List(); + for (int i = 0; i < Count; i++) + list.Add(this[i].Value); + return list.ToArray(); + } + + private void PossiblyCreateArray() + { + if (_value == null) return; + var type = _value.GetType(); + object[] arr; + + if (type.IsArray) + arr = _value as object[]; + else if (_value is IList) + arr = (_value as IList).OfType().ToArray(); + else + return; + + if (arr == null) return; + _type = 0x04; // array + _typeSet = true; + _objectValues = new Dictionary(); + _value = null; + for (int i = 0; i < arr.Length; i++) + { + _objectValues[i.ToString()] = arr[i] is BsonItem + ? (BsonItem)arr[i] + : new BsonItem(arr[i]); + } + } + + private void DetermineType() + { + if (_value == null) + { + _type = 0x03; // document + return; + } + + // i apologize for this if statement + + if (_value is double || _value is float) + _type = 0x01; + else if (_value is string) + _type = 0x02; + else if (_value is byte[]) + _type = 0x05; + else if (_value is bool) + _type = 0x08; + else if (_value is long) + _type = 0x09; + else if (_value is int) + _type = 0x10; + else + _type = 0x00; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Bson/BsonStringTableMode.cs b/Rant/Core/IO/Bson/BsonStringTableMode.cs index cc4366f..c9b06aa 100644 --- a/Rant/Core/IO/Bson/BsonStringTableMode.cs +++ b/Rant/Core/IO/Bson/BsonStringTableMode.cs @@ -25,24 +25,24 @@ namespace Rant.Core.IO.Bson { - /// - /// Defines the available string table types for BSON documents. - /// - public enum BsonStringTableMode - { - /// - /// Don't use a string table. - /// - None = 0, + /// + /// Defines the available string table types for BSON documents. + /// + public enum BsonStringTableMode + { + /// + /// Don't use a string table. + /// + None = 0, - /// - /// Store only keys. - /// - Keys = 1, + /// + /// Store only keys. + /// + Keys = 1, - /// - /// Store keys and values. - /// - KeysAndValues = 2 - } + /// + /// Store keys and values. + /// + KeysAndValues = 2 + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/CRC.cs b/Rant/Core/IO/Compression/CRC.cs index 8f59dd5..469dbdc 100644 --- a/Rant/Core/IO/Compression/CRC.cs +++ b/Rant/Core/IO/Compression/CRC.cs @@ -25,59 +25,61 @@ namespace Rant.Core.IO.Compression { - internal class CRC - { - public static readonly uint[] Table; - private uint _value = 0xFFFFFFFF; + internal class CRC + { + public static readonly uint[] Table; + private uint _value = 0xFFFFFFFF; - static CRC() - { - Table = new uint[256]; - const uint kPoly = 0xEDB88320; - for (uint i = 0; i < 256; i++) - { - uint r = i; - for (int j = 0; j < 8; j++) - if ((r & 1) != 0) - r = (r >> 1) ^ kPoly; - else - r >>= 1; - Table[i] = r; - } - } + static CRC() + { + Table = new uint[256]; + const uint kPoly = 0xEDB88320; + for (uint i = 0; i < 256; i++) + { + uint r = i; + for (int j = 0; j < 8; j++) + { + if ((r & 1) != 0) + r = (r >> 1) ^ kPoly; + else + r >>= 1; + } + Table[i] = r; + } + } - public void Init() - { - _value = 0xFFFFFFFF; - } + public void Init() + { + _value = 0xFFFFFFFF; + } - public void UpdateByte(byte b) - { - _value = Table[(byte)_value ^ b] ^ (_value >> 8); - } + public void UpdateByte(byte b) + { + _value = Table[(byte)_value ^ b] ^ (_value >> 8); + } - public void Update(byte[] data, uint offset, uint size) - { - for (uint i = 0; i < size; i++) - _value = Table[(byte)_value ^ data[offset + i]] ^ (_value >> 8); - } + public void Update(byte[] data, uint offset, uint size) + { + for (uint i = 0; i < size; i++) + _value = Table[(byte)_value ^ data[offset + i]] ^ (_value >> 8); + } - public uint GetDigest() - { - return _value ^ 0xFFFFFFFF; - } + public uint GetDigest() + { + return _value ^ 0xFFFFFFFF; + } - private static uint CalculateDigest(byte[] data, uint offset, uint size) - { - var crc = new CRC(); - // crc.Init(); - crc.Update(data, offset, size); - return crc.GetDigest(); - } + private static uint CalculateDigest(byte[] data, uint offset, uint size) + { + var crc = new CRC(); + // crc.Init(); + crc.Update(data, offset, size); + return crc.GetDigest(); + } - private static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) - { - return CalculateDigest(data, offset, size) == digest; - } - } + private static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) + { + return CalculateDigest(data, offset, size) == digest; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/EasyCompressor.cs b/Rant/Core/IO/Compression/EasyCompressor.cs index c606a39..aff6b1c 100644 --- a/Rant/Core/IO/Compression/EasyCompressor.cs +++ b/Rant/Core/IO/Compression/EasyCompressor.cs @@ -30,72 +30,72 @@ namespace Rant.Core.IO.Compression { - internal static class EasyCompressor - { - internal static event ProgressUpdateEvent ProgressUpdate; + internal static class EasyCompressor + { + internal static event ProgressUpdateEvent ProgressUpdate; - public static byte[] Compress(byte[] data) - { - var inStream = new MemoryStream(data); - var stream = new MemoryStream(); + public static byte[] Compress(byte[] data) + { + var inStream = new MemoryStream(data); + var stream = new MemoryStream(); - var enc = new Encoder(); + var enc = new Encoder(); - enc.WriteCoderProperties(stream); - EasyCompressorProgress progress = null; - if (ProgressUpdate != null) - progress = new EasyCompressorProgress(ProgressUpdate); - long dataSize = data.Length; - for (int i = 0; i < 8; i++) - stream.WriteByte((byte)(dataSize >> (8 * i))); - enc.Code(inStream, stream, data.Length, -1, progress); - inStream.Close(); - stream.Close(); - return stream.ToArray(); - } + enc.WriteCoderProperties(stream); + EasyCompressorProgress progress = null; + if (ProgressUpdate != null) + progress = new EasyCompressorProgress(ProgressUpdate); + long dataSize = data.Length; + for (int i = 0; i < 8; i++) + stream.WriteByte((byte)(dataSize >> (8 * i))); + enc.Code(inStream, stream, data.Length, -1, progress); + inStream.Close(); + stream.Close(); + return stream.ToArray(); + } - public static byte[] Decompress(byte[] data) - { - var inStream = new MemoryStream(data); - var outStream = new MemoryStream(); + public static byte[] Decompress(byte[] data) + { + var inStream = new MemoryStream(data); + var outStream = new MemoryStream(); - var dec = new Decoder(); - EasyCompressorProgress progress = null; - if (ProgressUpdate != null) - progress = new EasyCompressorProgress(ProgressUpdate); - var props = new byte[5]; - inStream.Read(props, 0, 5); - dec.SetDecoderProperties(props); - long outSize = 0; - for (int i = 0; i < 8; i++) - outSize |= (long)(byte)inStream.ReadByte() << (8 * i); - long compressedSize = inStream.Length - inStream.Position; - dec.Code(inStream, outStream, compressedSize, outSize, progress); - inStream.Close(); - outStream.Close(); - return outStream.ToArray(); - } + var dec = new Decoder(); + EasyCompressorProgress progress = null; + if (ProgressUpdate != null) + progress = new EasyCompressorProgress(ProgressUpdate); + var props = new byte[5]; + inStream.Read(props, 0, 5); + dec.SetDecoderProperties(props); + long outSize = 0; + for (int i = 0; i < 8; i++) + outSize |= (long)(byte)inStream.ReadByte() << (8 * i); + long compressedSize = inStream.Length - inStream.Position; + dec.Code(inStream, outStream, compressedSize, outSize, progress); + inStream.Close(); + outStream.Close(); + return outStream.ToArray(); + } - internal delegate void ProgressUpdateEvent(object sender, CompressionProgressEventArgs e); - } + internal delegate void ProgressUpdateEvent(object sender, CompressionProgressEventArgs e); + } - internal class EasyCompressorProgress : ICodeProgress - { - private readonly EasyCompressor.ProgressUpdateEvent _handler; + internal class EasyCompressorProgress : ICodeProgress + { + private readonly EasyCompressor.ProgressUpdateEvent _handler; - internal EasyCompressorProgress(EasyCompressor.ProgressUpdateEvent handler) - { - _handler = handler; - } + internal EasyCompressorProgress(EasyCompressor.ProgressUpdateEvent handler) + { + _handler = handler; + } - public void SetProgress(long inSize, long outSize) - { - _handler.Invoke(null, new CompressionProgressEventArgs { Progress = inSize / outSize }); - } - } + public void SetProgress(long inSize, long outSize) + { + _handler.Invoke(null, new CompressionProgressEventArgs { Progress = inSize / outSize }); + } + } - internal class CompressionProgressEventArgs : EventArgs - { - public double Progress; - } + internal class CompressionProgressEventArgs : EventArgs + { + public double Progress; + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/ICoder.cs b/Rant/Core/IO/Compression/ICoder.cs index d673da8..77f7dab 100644 --- a/Rant/Core/IO/Compression/ICoder.cs +++ b/Rant/Core/IO/Compression/ICoder.cs @@ -28,172 +28,172 @@ namespace Rant.Core.IO.Compression { - /// - /// The exception that is thrown when an error in input stream occurs during decoding. - /// - internal class DataErrorException : ApplicationException - { - public DataErrorException() : base("Data Error") - { - } - } - - /// - /// The exception that is thrown when the value of an argument is outside the allowable range. - /// - internal class InvalidParamException : ApplicationException - { - public InvalidParamException() : base("Invalid Parameter") - { - } - } - - internal interface ICodeProgress - { - /// - /// Callback progress. - /// - /// - /// input size. -1 if unknown. - /// - /// - /// output size. -1 if unknown. - /// - void SetProgress(long inSize, long outSize); - } - - internal interface ICoder - { - /// - /// Codes streams. - /// - /// - /// input Stream. - /// - /// - /// output Stream. - /// - /// - /// input Size. -1 if unknown. - /// - /// - /// output Size. -1 if unknown. - /// - /// - /// callback progress reference. - /// - /// - /// if input stream is not valid - /// - void Code(Stream inStream, Stream outStream, - long inSize, long outSize, ICodeProgress progress); - } - - /* - public interface ICoder2 - { - void Code(ISequentialInStream []inStreams, - const UInt64 []inSizes, - ISequentialOutStream []outStreams, - UInt64 []outSizes, - ICodeProgress progress); - }; + /// + /// The exception that is thrown when an error in input stream occurs during decoding. + /// + internal class DataErrorException : ApplicationException + { + public DataErrorException() : base("Data Error") + { + } + } + + /// + /// The exception that is thrown when the value of an argument is outside the allowable range. + /// + internal class InvalidParamException : ApplicationException + { + public InvalidParamException() : base("Invalid Parameter") + { + } + } + + internal interface ICodeProgress + { + /// + /// Callback progress. + /// + /// + /// input size. -1 if unknown. + /// + /// + /// output size. -1 if unknown. + /// + void SetProgress(long inSize, long outSize); + } + + internal interface ICoder + { + /// + /// Codes streams. + /// + /// + /// input Stream. + /// + /// + /// output Stream. + /// + /// + /// input Size. -1 if unknown. + /// + /// + /// output Size. -1 if unknown. + /// + /// + /// callback progress reference. + /// + /// + /// if input stream is not valid + /// + void Code(Stream inStream, Stream outStream, + long inSize, long outSize, ICodeProgress progress); + } + + /* + public interface ICoder2 + { + void Code(ISequentialInStream []inStreams, + const UInt64 []inSizes, + ISequentialOutStream []outStreams, + UInt64 []outSizes, + ICodeProgress progress); + }; */ - /// - /// Provides the fields that represent properties idenitifiers for compressing. - /// - internal enum CoderPropID - { - /// - /// Specifies default property. - /// - DefaultProp = 0, - - /// - /// Specifies size of dictionary. - /// - DictionarySize, - - /// - /// Specifies size of memory for PPM*. - /// - UsedMemorySize, - - /// - /// Specifies order for PPM methods. - /// - Order, - - /// - /// Specifies Block Size. - /// - BlockSize, - - /// - /// Specifies number of postion state bits for LZMA (0 <= x <= 4). - /// - PosStateBits, - - /// - /// Specifies number of literal context bits for LZMA (0 <= x <= 8). - /// - LitContextBits, - - /// - /// Specifies number of literal position bits for LZMA (0 <= x <= 4). - /// - LitPosBits, - - /// - /// Specifies number of fast bytes for LZ*. - /// - NumFastBytes, - - /// - /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B". - /// - MatchFinder, - - /// - /// Specifies the number of match finder cyckes. - /// - MatchFinderCycles, - - /// - /// Specifies number of passes. - /// - NumPasses, - - /// - /// Specifies number of algorithm. - /// - Algorithm, - - /// - /// Specifies the number of threads. - /// - NumThreads, - - /// - /// Specifies mode with end marker. - /// - EndMarker - } - - - internal interface ISetCoderProperties - { - void SetCoderProperties(CoderPropID[] propIDs, object[] properties); - } - - internal interface IWriteCoderProperties - { - void WriteCoderProperties(Stream outStream); - } - - internal interface ISetDecoderProperties - { - void SetDecoderProperties(byte[] properties); - } + /// + /// Provides the fields that represent properties idenitifiers for compressing. + /// + internal enum CoderPropID + { + /// + /// Specifies default property. + /// + DefaultProp = 0, + + /// + /// Specifies size of dictionary. + /// + DictionarySize, + + /// + /// Specifies size of memory for PPM*. + /// + UsedMemorySize, + + /// + /// Specifies order for PPM methods. + /// + Order, + + /// + /// Specifies Block Size. + /// + BlockSize, + + /// + /// Specifies number of postion state bits for LZMA (0 <= x <= 4). + /// + PosStateBits, + + /// + /// Specifies number of literal context bits for LZMA (0 <= x <= 8). + /// + LitContextBits, + + /// + /// Specifies number of literal position bits for LZMA (0 <= x <= 4). + /// + LitPosBits, + + /// + /// Specifies number of fast bytes for LZ*. + /// + NumFastBytes, + + /// + /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B". + /// + MatchFinder, + + /// + /// Specifies the number of match finder cyckes. + /// + MatchFinderCycles, + + /// + /// Specifies number of passes. + /// + NumPasses, + + /// + /// Specifies number of algorithm. + /// + Algorithm, + + /// + /// Specifies the number of threads. + /// + NumThreads, + + /// + /// Specifies mode with end marker. + /// + EndMarker + } + + + internal interface ISetCoderProperties + { + void SetCoderProperties(CoderPropID[] propIDs, object[] properties); + } + + internal interface IWriteCoderProperties + { + void WriteCoderProperties(Stream outStream); + } + + internal interface ISetDecoderProperties + { + void SetDecoderProperties(byte[] properties); + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/IMatchFinder.cs b/Rant/Core/IO/Compression/LZ/IMatchFinder.cs index 1a4cc58..21dc131 100644 --- a/Rant/Core/IO/Compression/LZ/IMatchFinder.cs +++ b/Rant/Core/IO/Compression/LZ/IMatchFinder.cs @@ -27,22 +27,22 @@ namespace Rant.Core.IO.Compression.LZ { - internal interface IInWindowStream - { - void SetStream(Stream inStream); - void Init(); - void ReleaseStream(); - byte GetIndexByte(int index); - uint GetMatchLen(int index, uint distance, uint limit); - uint GetNumAvailableBytes(); - } + internal interface IInWindowStream + { + void SetStream(Stream inStream); + void Init(); + void ReleaseStream(); + byte GetIndexByte(int index); + uint GetMatchLen(int index, uint distance, uint limit); + uint GetNumAvailableBytes(); + } - internal interface IMatchFinder : IInWindowStream - { - void Create(uint historySize, uint keepAddBufferBefore, - uint matchMaxLen, uint keepAddBufferAfter); + internal interface IMatchFinder : IInWindowStream + { + void Create(uint historySize, uint keepAddBufferBefore, + uint matchMaxLen, uint keepAddBufferAfter); - uint GetMatches(uint[] distances); - void Skip(uint num); - } + uint GetMatches(uint[] distances); + void Skip(uint num); + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/LzBinTree.cs b/Rant/Core/IO/Compression/LZ/LzBinTree.cs index d286842..6285933 100644 --- a/Rant/Core/IO/Compression/LZ/LzBinTree.cs +++ b/Rant/Core/IO/Compression/LZ/LzBinTree.cs @@ -28,380 +28,384 @@ namespace Rant.Core.IO.Compression.LZ { - internal class BinTree : InWindow, IMatchFinder - { - private const uint kHash2Size = 1 << 10; - private const uint kHash3Size = 1 << 16; - private const uint kBT2HashSize = 1 << 16; - private const uint kStartMaxLen = 1; - private const uint kHash3Offset = kHash2Size; - private const uint kEmptyHashValue = 0; - private const uint kMaxValForNormalize = ((uint)1 << 31) - 1; - private uint _cutValue = 0xFF; - private uint _cyclicBufferPos; - private uint _cyclicBufferSize = 0; - private uint[] _hash; - private uint _hashMask; - private uint _hashSizeSum = 0; - private uint _matchMaxLen; - private uint[] _son; - private bool HASH_ARRAY = true; - private uint kFixHashSize = kHash2Size + kHash3Size; - private uint kMinMatchCheck = 4; - private uint kNumHashDirectBytes = 0; - - public new void SetStream(Stream stream) - { - base.SetStream(stream); - } - - public new void ReleaseStream() - { - base.ReleaseStream(); - } - - public new void Init() - { - base.Init(); - for (uint i = 0; i < _hashSizeSum; i++) - _hash[i] = kEmptyHashValue; - _cyclicBufferPos = 0; - ReduceOffsets(-1); - } - - public new byte GetIndexByte(int index) - { - return base.GetIndexByte(index); - } - - public new uint GetMatchLen(int index, uint distance, uint limit) - { - return base.GetMatchLen(index, distance, limit); - } - - public new uint GetNumAvailableBytes() - { - return base.GetNumAvailableBytes(); - } - - public void Create(uint historySize, uint keepAddBufferBefore, - uint matchMaxLen, uint keepAddBufferAfter) - { - if (historySize > kMaxValForNormalize - 256) - throw new Exception(); - _cutValue = 16 + (matchMaxLen >> 1); - - uint windowReservSize = (historySize + keepAddBufferBefore + - matchMaxLen + keepAddBufferAfter) / 2 + 256; - - base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); - - _matchMaxLen = matchMaxLen; - - uint cyclicBufferSize = historySize + 1; - if (_cyclicBufferSize != cyclicBufferSize) - _son = new uint[(_cyclicBufferSize = cyclicBufferSize) * 2]; - - uint hs = kBT2HashSize; - - if (HASH_ARRAY) - { - hs = historySize - 1; - hs |= hs >> 1; - hs |= hs >> 2; - hs |= hs >> 4; - hs |= hs >> 8; - hs >>= 1; - hs |= 0xFFFF; - if (hs > 1 << 24) - hs >>= 1; - _hashMask = hs; - hs++; - hs += kFixHashSize; - } - if (hs != _hashSizeSum) - _hash = new uint[_hashSizeSum = hs]; - } - - public uint GetMatches(uint[] distances) - { - uint lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - { - lenLimit = _matchMaxLen; - } - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - return 0; - } - } - - uint offset = 0; - uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; - uint cur = _bufferOffset + _pos; - uint maxLen = kStartMaxLen; // to avoid items for len < hashSize; - uint hashValue, hash2Value = 0, hash3Value = 0; - - if (HASH_ARRAY) - { - uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - hash2Value = temp & (kHash2Size - 1); - temp ^= (uint)_bufferBase[cur + 2] << 8; - hash3Value = temp & (kHash3Size - 1); - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - { - hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); - } - - uint curMatch = _hash[kFixHashSize + hashValue]; - if (HASH_ARRAY) - { - uint curMatch2 = _hash[hash2Value]; - uint curMatch3 = _hash[kHash3Offset + hash3Value]; - _hash[hash2Value] = _pos; - _hash[kHash3Offset + hash3Value] = _pos; - if (curMatch2 > matchMinPos) - if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) - { - distances[offset++] = maxLen = 2; - distances[offset++] = _pos - curMatch2 - 1; - } - if (curMatch3 > matchMinPos) - if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) - { - if (curMatch3 == curMatch2) - offset -= 2; - distances[offset++] = maxLen = 3; - distances[offset++] = _pos - curMatch3 - 1; - curMatch2 = curMatch3; - } - if (offset != 0 && curMatch2 == curMatch) - { - offset -= 2; - maxLen = kStartMaxLen; - } - } - - _hash[kFixHashSize + hashValue] = _pos; - - uint ptr0 = (_cyclicBufferPos << 1) + 1; - uint ptr1 = _cyclicBufferPos << 1; - - uint len0, len1; - len0 = len1 = kNumHashDirectBytes; - - if (kNumHashDirectBytes != 0) - if (curMatch > matchMinPos) - if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != - _bufferBase[cur + kNumHashDirectBytes]) - { - distances[offset++] = maxLen = kNumHashDirectBytes; - distances[offset++] = _pos - curMatch - 1; - } - - uint count = _cutValue; - - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - uint delta = _pos - curMatch; - uint cyclicPos = (delta <= _cyclicBufferPos - ? _cyclicBufferPos - delta - : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; - - uint pby1 = _bufferOffset + curMatch; - uint len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - if (maxLen < len) - { - distances[offset++] = maxLen = len; - distances[offset++] = delta - 1; - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - return offset; - } - - public void Skip(uint num) - { - do - { - uint lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - { - lenLimit = _matchMaxLen; - } - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - continue; - } - } - - uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; - uint cur = _bufferOffset + _pos; - - uint hashValue; - - if (HASH_ARRAY) - { - uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - uint hash2Value = temp & (kHash2Size - 1); - _hash[hash2Value] = _pos; - temp ^= (uint)_bufferBase[cur + 2] << 8; - uint hash3Value = temp & (kHash3Size - 1); - _hash[kHash3Offset + hash3Value] = _pos; - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - { - hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); - } - - uint curMatch = _hash[kFixHashSize + hashValue]; - _hash[kFixHashSize + hashValue] = _pos; - - uint ptr0 = (_cyclicBufferPos << 1) + 1; - uint ptr1 = _cyclicBufferPos << 1; - - uint len0, len1; - len0 = len1 = kNumHashDirectBytes; - - uint count = _cutValue; - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - - uint delta = _pos - curMatch; - uint cyclicPos = (delta <= _cyclicBufferPos - ? _cyclicBufferPos - delta - : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; - - uint pby1 = _bufferOffset + curMatch; - uint len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - } while (--num != 0); - } - - public void SetType(int numHashBytes) - { - HASH_ARRAY = numHashBytes > 2; - if (HASH_ARRAY) - { - kNumHashDirectBytes = 0; - kMinMatchCheck = 4; - kFixHashSize = kHash2Size + kHash3Size; - } - else - { - kNumHashDirectBytes = 2; - kMinMatchCheck = 2 + 1; - kFixHashSize = 0; - } - } - - public new void MovePos() - { - if (++_cyclicBufferPos >= _cyclicBufferSize) - _cyclicBufferPos = 0; - base.MovePos(); - if (_pos == kMaxValForNormalize) - Normalize(); - } - - private void NormalizeLinks(uint[] items, uint numItems, uint subValue) - { - for (uint i = 0; i < numItems; i++) - { - uint value = items[i]; - if (value <= subValue) - value = kEmptyHashValue; - else - value -= subValue; - items[i] = value; - } - } - - private void Normalize() - { - uint subValue = _pos - _cyclicBufferSize; - NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); - NormalizeLinks(_hash, _hashSizeSum, subValue); - ReduceOffsets((int)subValue); - } - - public void SetCutValue(uint cutValue) - { - _cutValue = cutValue; - } - } + internal class BinTree : InWindow, IMatchFinder + { + private const uint kHash2Size = 1 << 10; + private const uint kHash3Size = 1 << 16; + private const uint kBT2HashSize = 1 << 16; + private const uint kStartMaxLen = 1; + private const uint kHash3Offset = kHash2Size; + private const uint kEmptyHashValue = 0; + private const uint kMaxValForNormalize = ((uint)1 << 31) - 1; + private uint _cutValue = 0xFF; + private uint _cyclicBufferPos; + private uint _cyclicBufferSize = 0; + private uint[] _hash; + private uint _hashMask; + private uint _hashSizeSum = 0; + private uint _matchMaxLen; + private uint[] _son; + private bool HASH_ARRAY = true; + private uint kFixHashSize = kHash2Size + kHash3Size; + private uint kMinMatchCheck = 4; + private uint kNumHashDirectBytes = 0; + + public new void SetStream(Stream stream) + { + base.SetStream(stream); + } + + public new void ReleaseStream() + { + base.ReleaseStream(); + } + + public new void Init() + { + base.Init(); + for (uint i = 0; i < _hashSizeSum; i++) + _hash[i] = kEmptyHashValue; + _cyclicBufferPos = 0; + ReduceOffsets(-1); + } + + public new byte GetIndexByte(int index) + { + return base.GetIndexByte(index); + } + + public new uint GetMatchLen(int index, uint distance, uint limit) + { + return base.GetMatchLen(index, distance, limit); + } + + public new uint GetNumAvailableBytes() + { + return base.GetNumAvailableBytes(); + } + + public void Create(uint historySize, uint keepAddBufferBefore, + uint matchMaxLen, uint keepAddBufferAfter) + { + if (historySize > kMaxValForNormalize - 256) + throw new Exception(); + _cutValue = 16 + (matchMaxLen >> 1); + + uint windowReservSize = (historySize + keepAddBufferBefore + + matchMaxLen + keepAddBufferAfter) / 2 + 256; + + base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); + + _matchMaxLen = matchMaxLen; + + uint cyclicBufferSize = historySize + 1; + if (_cyclicBufferSize != cyclicBufferSize) + _son = new uint[(_cyclicBufferSize = cyclicBufferSize) * 2]; + + uint hs = kBT2HashSize; + + if (HASH_ARRAY) + { + hs = historySize - 1; + hs |= hs >> 1; + hs |= hs >> 2; + hs |= hs >> 4; + hs |= hs >> 8; + hs >>= 1; + hs |= 0xFFFF; + if (hs > 1 << 24) + hs >>= 1; + _hashMask = hs; + hs++; + hs += kFixHashSize; + } + if (hs != _hashSizeSum) + _hash = new uint[_hashSizeSum = hs]; + } + + public uint GetMatches(uint[] distances) + { + uint lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + return 0; + } + } + + uint offset = 0; + uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; + uint cur = _bufferOffset + _pos; + uint maxLen = kStartMaxLen; // to avoid items for len < hashSize; + uint hashValue, hash2Value = 0, hash3Value = 0; + + if (HASH_ARRAY) + { + uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; + hash2Value = temp & (kHash2Size - 1); + temp ^= (uint)_bufferBase[cur + 2] << 8; + hash3Value = temp & (kHash3Size - 1); + hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; + } + else + hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); + + uint curMatch = _hash[kFixHashSize + hashValue]; + if (HASH_ARRAY) + { + uint curMatch2 = _hash[hash2Value]; + uint curMatch3 = _hash[kHash3Offset + hash3Value]; + _hash[hash2Value] = _pos; + _hash[kHash3Offset + hash3Value] = _pos; + if (curMatch2 > matchMinPos) + { + if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) + { + distances[offset++] = maxLen = 2; + distances[offset++] = _pos - curMatch2 - 1; + } + } + if (curMatch3 > matchMinPos) + { + if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) + { + if (curMatch3 == curMatch2) + offset -= 2; + distances[offset++] = maxLen = 3; + distances[offset++] = _pos - curMatch3 - 1; + curMatch2 = curMatch3; + } + } + if (offset != 0 && curMatch2 == curMatch) + { + offset -= 2; + maxLen = kStartMaxLen; + } + } + + _hash[kFixHashSize + hashValue] = _pos; + + uint ptr0 = (_cyclicBufferPos << 1) + 1; + uint ptr1 = _cyclicBufferPos << 1; + + uint len0, len1; + len0 = len1 = kNumHashDirectBytes; + + if (kNumHashDirectBytes != 0) + { + if (curMatch > matchMinPos) + { + if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != + _bufferBase[cur + kNumHashDirectBytes]) + { + distances[offset++] = maxLen = kNumHashDirectBytes; + distances[offset++] = _pos - curMatch - 1; + } + } + } + + uint count = _cutValue; + + while (true) + { + if (curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + uint delta = _pos - curMatch; + uint cyclicPos = (delta <= _cyclicBufferPos + ? _cyclicBufferPos - delta + : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; + + uint pby1 = _bufferOffset + curMatch; + uint len = Math.Min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while (++len != lenLimit) + { + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + } + if (maxLen < len) + { + distances[offset++] = maxLen = len; + distances[offset++] = delta - 1; + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + } + if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + return offset; + } + + public void Skip(uint num) + { + do + { + uint lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + continue; + } + } + + uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; + uint cur = _bufferOffset + _pos; + + uint hashValue; + + if (HASH_ARRAY) + { + uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; + uint hash2Value = temp & (kHash2Size - 1); + _hash[hash2Value] = _pos; + temp ^= (uint)_bufferBase[cur + 2] << 8; + uint hash3Value = temp & (kHash3Size - 1); + _hash[kHash3Offset + hash3Value] = _pos; + hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; + } + else + hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); + + uint curMatch = _hash[kFixHashSize + hashValue]; + _hash[kFixHashSize + hashValue] = _pos; + + uint ptr0 = (_cyclicBufferPos << 1) + 1; + uint ptr1 = _cyclicBufferPos << 1; + + uint len0, len1; + len0 = len1 = kNumHashDirectBytes; + + uint count = _cutValue; + while (true) + { + if (curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + + uint delta = _pos - curMatch; + uint cyclicPos = (delta <= _cyclicBufferPos + ? _cyclicBufferPos - delta + : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; + + uint pby1 = _bufferOffset + curMatch; + uint len = Math.Min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while (++len != lenLimit) + { + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + } + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + } while (--num != 0); + } + + public void SetType(int numHashBytes) + { + HASH_ARRAY = numHashBytes > 2; + if (HASH_ARRAY) + { + kNumHashDirectBytes = 0; + kMinMatchCheck = 4; + kFixHashSize = kHash2Size + kHash3Size; + } + else + { + kNumHashDirectBytes = 2; + kMinMatchCheck = 2 + 1; + kFixHashSize = 0; + } + } + + public new void MovePos() + { + if (++_cyclicBufferPos >= _cyclicBufferSize) + _cyclicBufferPos = 0; + base.MovePos(); + if (_pos == kMaxValForNormalize) + Normalize(); + } + + private void NormalizeLinks(uint[] items, uint numItems, uint subValue) + { + for (uint i = 0; i < numItems; i++) + { + uint value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } + } + + private void Normalize() + { + uint subValue = _pos - _cyclicBufferSize; + NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); + NormalizeLinks(_hash, _hashSizeSum, subValue); + ReduceOffsets((int)subValue); + } + + public void SetCutValue(uint cutValue) + { + _cutValue = cutValue; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/LzInWindow.cs b/Rant/Core/IO/Compression/LZ/LzInWindow.cs index 360e72e..854b0a3 100644 --- a/Rant/Core/IO/Compression/LZ/LzInWindow.cs +++ b/Rant/Core/IO/Compression/LZ/LzInWindow.cs @@ -27,142 +27,144 @@ namespace Rant.Core.IO.Compression.LZ { - internal class InWindow - { - public uint _blockSize; // Size of Allocated memory block - public byte[] _bufferBase = null; // pointer to buffer with data - public uint _bufferOffset; - private uint _keepSizeAfter; // how many BYTEs must be kept buffer after _pos - private uint _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos - private uint _pointerToLastSafePosition; - public uint _pos; // offset (from _buffer) of curent byte - private uint _posLimit; // offset (from _buffer) of first byte when new block reading must be done - private Stream _stream; - private bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream - public uint _streamPos; // offset (from _buffer) of first not read byte from Stream - - public void MoveBlock() - { - uint offset = _bufferOffset + _pos - _keepSizeBefore; - // we need one additional byte, since MovePos moves on 1 byte. - if (offset > 0) - offset--; - - uint numBytes = _bufferOffset + _streamPos - offset; - - // check negative offset ???? - for (uint i = 0; i < numBytes; i++) - _bufferBase[i] = _bufferBase[offset + i]; - _bufferOffset -= offset; - } - - public virtual void ReadBlock() - { - if (_streamEndWasReached) - return; - while (true) - { - int size = (int)(0 - _bufferOffset + _blockSize - _streamPos); - if (size == 0) - return; - int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size); - if (numReadBytes == 0) - { - _posLimit = _streamPos; - uint pointerToPostion = _bufferOffset + _posLimit; - if (pointerToPostion > _pointerToLastSafePosition) - _posLimit = _pointerToLastSafePosition - _bufferOffset; - - _streamEndWasReached = true; - return; - } - _streamPos += (uint)numReadBytes; - if (_streamPos >= _pos + _keepSizeAfter) - _posLimit = _streamPos - _keepSizeAfter; - } - } - - private void Free() - { - _bufferBase = null; - } - - public void Create(uint keepSizeBefore, uint keepSizeAfter, uint keepSizeReserv) - { - _keepSizeBefore = keepSizeBefore; - _keepSizeAfter = keepSizeAfter; - uint blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; - if (_bufferBase == null || _blockSize != blockSize) - { - Free(); - _blockSize = blockSize; - _bufferBase = new byte[_blockSize]; - } - _pointerToLastSafePosition = _blockSize - keepSizeAfter; - } - - public void SetStream(Stream stream) - { - _stream = stream; - } - - public void ReleaseStream() - { - _stream = null; - } - - public void Init() - { - _bufferOffset = 0; - _pos = 0; - _streamPos = 0; - _streamEndWasReached = false; - ReadBlock(); - } - - public void MovePos() - { - _pos++; - if (_pos > _posLimit) - { - uint pointerToPostion = _bufferOffset + _pos; - if (pointerToPostion > _pointerToLastSafePosition) - MoveBlock(); - ReadBlock(); - } - } - - public byte GetIndexByte(int index) - { - return _bufferBase[_bufferOffset + _pos + index]; - } - - // index + limit have not to exceed _keepSizeAfter; - public uint GetMatchLen(int index, uint distance, uint limit) - { - if (_streamEndWasReached) - if (_pos + index + limit > _streamPos) - limit = _streamPos - (uint)(_pos + index); - distance++; - // Byte *pby = _buffer + (size_t)_pos + index; - uint pby = _bufferOffset + _pos + (uint)index; - - uint i; - for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++) ; - return i; - } - - public uint GetNumAvailableBytes() - { - return _streamPos - _pos; - } - - public void ReduceOffsets(int subValue) - { - _bufferOffset += (uint)subValue; - _posLimit -= (uint)subValue; - _pos -= (uint)subValue; - _streamPos -= (uint)subValue; - } - } + internal class InWindow + { + public uint _blockSize; // Size of Allocated memory block + public byte[] _bufferBase = null; // pointer to buffer with data + public uint _bufferOffset; + private uint _keepSizeAfter; // how many BYTEs must be kept buffer after _pos + private uint _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos + private uint _pointerToLastSafePosition; + public uint _pos; // offset (from _buffer) of curent byte + private uint _posLimit; // offset (from _buffer) of first byte when new block reading must be done + private Stream _stream; + private bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream + public uint _streamPos; // offset (from _buffer) of first not read byte from Stream + + public void MoveBlock() + { + uint offset = _bufferOffset + _pos - _keepSizeBefore; + // we need one additional byte, since MovePos moves on 1 byte. + if (offset > 0) + offset--; + + uint numBytes = _bufferOffset + _streamPos - offset; + + // check negative offset ???? + for (uint i = 0; i < numBytes; i++) + _bufferBase[i] = _bufferBase[offset + i]; + _bufferOffset -= offset; + } + + public virtual void ReadBlock() + { + if (_streamEndWasReached) + return; + while (true) + { + int size = (int)(0 - _bufferOffset + _blockSize - _streamPos); + if (size == 0) + return; + int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size); + if (numReadBytes == 0) + { + _posLimit = _streamPos; + uint pointerToPostion = _bufferOffset + _posLimit; + if (pointerToPostion > _pointerToLastSafePosition) + _posLimit = _pointerToLastSafePosition - _bufferOffset; + + _streamEndWasReached = true; + return; + } + _streamPos += (uint)numReadBytes; + if (_streamPos >= _pos + _keepSizeAfter) + _posLimit = _streamPos - _keepSizeAfter; + } + } + + private void Free() + { + _bufferBase = null; + } + + public void Create(uint keepSizeBefore, uint keepSizeAfter, uint keepSizeReserv) + { + _keepSizeBefore = keepSizeBefore; + _keepSizeAfter = keepSizeAfter; + uint blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; + if (_bufferBase == null || _blockSize != blockSize) + { + Free(); + _blockSize = blockSize; + _bufferBase = new byte[_blockSize]; + } + _pointerToLastSafePosition = _blockSize - keepSizeAfter; + } + + public void SetStream(Stream stream) + { + _stream = stream; + } + + public void ReleaseStream() + { + _stream = null; + } + + public void Init() + { + _bufferOffset = 0; + _pos = 0; + _streamPos = 0; + _streamEndWasReached = false; + ReadBlock(); + } + + public void MovePos() + { + _pos++; + if (_pos > _posLimit) + { + uint pointerToPostion = _bufferOffset + _pos; + if (pointerToPostion > _pointerToLastSafePosition) + MoveBlock(); + ReadBlock(); + } + } + + public byte GetIndexByte(int index) + { + return _bufferBase[_bufferOffset + _pos + index]; + } + + // index + limit have not to exceed _keepSizeAfter; + public uint GetMatchLen(int index, uint distance, uint limit) + { + if (_streamEndWasReached) + { + if (_pos + index + limit > _streamPos) + limit = _streamPos - (uint)(_pos + index); + } + distance++; + // Byte *pby = _buffer + (size_t)_pos + index; + uint pby = _bufferOffset + _pos + (uint)index; + + uint i; + for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++) ; + return i; + } + + public uint GetNumAvailableBytes() + { + return _streamPos - _pos; + } + + public void ReduceOffsets(int subValue) + { + _bufferOffset += (uint)subValue; + _posLimit -= (uint)subValue; + _pos -= (uint)subValue; + _streamPos -= (uint)subValue; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/LzOutWindow.cs b/Rant/Core/IO/Compression/LZ/LzOutWindow.cs index 6116b74..b41636f 100644 --- a/Rant/Core/IO/Compression/LZ/LzOutWindow.cs +++ b/Rant/Core/IO/Compression/LZ/LzOutWindow.cs @@ -27,105 +27,105 @@ namespace Rant.Core.IO.Compression.LZ { - internal class OutWindow - { - private byte[] _buffer = null; - private uint _pos; - private Stream _stream; - private uint _streamPos; - private uint _windowSize = 0; - public uint TrainSize = 0; + internal class OutWindow + { + private byte[] _buffer = null; + private uint _pos; + private Stream _stream; + private uint _streamPos; + private uint _windowSize = 0; + public uint TrainSize = 0; - public void Create(uint windowSize) - { - if (_windowSize != windowSize) - _buffer = new byte[windowSize]; - _windowSize = windowSize; - _pos = 0; - _streamPos = 0; - } + public void Create(uint windowSize) + { + if (_windowSize != windowSize) + _buffer = new byte[windowSize]; + _windowSize = windowSize; + _pos = 0; + _streamPos = 0; + } - public void Init(Stream stream, bool solid) - { - ReleaseStream(); - _stream = stream; - if (!solid) - { - _streamPos = 0; - _pos = 0; - TrainSize = 0; - } - } + public void Init(Stream stream, bool solid) + { + ReleaseStream(); + _stream = stream; + if (!solid) + { + _streamPos = 0; + _pos = 0; + TrainSize = 0; + } + } - public bool Train(Stream stream) - { - long len = stream.Length; - uint size = len < _windowSize ? (uint)len : _windowSize; - TrainSize = size; - stream.Position = len - size; - _streamPos = _pos = 0; - while (size > 0) - { - uint curSize = _windowSize - _pos; - if (size < curSize) - curSize = size; - int numReadBytes = stream.Read(_buffer, (int)_pos, (int)curSize); - if (numReadBytes == 0) - return false; - size -= (uint)numReadBytes; - _pos += (uint)numReadBytes; - _streamPos += (uint)numReadBytes; - if (_pos == _windowSize) - _streamPos = _pos = 0; - } - return true; - } + public bool Train(Stream stream) + { + long len = stream.Length; + uint size = len < _windowSize ? (uint)len : _windowSize; + TrainSize = size; + stream.Position = len - size; + _streamPos = _pos = 0; + while (size > 0) + { + uint curSize = _windowSize - _pos; + if (size < curSize) + curSize = size; + int numReadBytes = stream.Read(_buffer, (int)_pos, (int)curSize); + if (numReadBytes == 0) + return false; + size -= (uint)numReadBytes; + _pos += (uint)numReadBytes; + _streamPos += (uint)numReadBytes; + if (_pos == _windowSize) + _streamPos = _pos = 0; + } + return true; + } - public void ReleaseStream() - { - Flush(); - _stream = null; - } + public void ReleaseStream() + { + Flush(); + _stream = null; + } - public void Flush() - { - uint size = _pos - _streamPos; - if (size == 0) - return; - _stream.Write(_buffer, (int)_streamPos, (int)size); - if (_pos >= _windowSize) - _pos = 0; - _streamPos = _pos; - } + public void Flush() + { + uint size = _pos - _streamPos; + if (size == 0) + return; + _stream.Write(_buffer, (int)_streamPos, (int)size); + if (_pos >= _windowSize) + _pos = 0; + _streamPos = _pos; + } - public void CopyBlock(uint distance, uint len) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - for (; len > 0; len--) - { - if (pos >= _windowSize) - pos = 0; - _buffer[_pos++] = _buffer[pos++]; - if (_pos >= _windowSize) - Flush(); - } - } + public void CopyBlock(uint distance, uint len) + { + uint pos = _pos - distance - 1; + if (pos >= _windowSize) + pos += _windowSize; + for (; len > 0; len--) + { + if (pos >= _windowSize) + pos = 0; + _buffer[_pos++] = _buffer[pos++]; + if (_pos >= _windowSize) + Flush(); + } + } - public void PutByte(byte b) - { - _buffer[_pos++] = b; - if (_pos >= _windowSize) - Flush(); - } + public void PutByte(byte b) + { + _buffer[_pos++] = b; + if (_pos >= _windowSize) + Flush(); + } - public byte GetByte(uint distance) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - return _buffer[pos]; - } - } + public byte GetByte(uint distance) + { + uint pos = _pos - distance - 1; + if (pos >= _windowSize) + pos += _windowSize; + return _buffer[pos]; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZMA/LzmaBase.cs b/Rant/Core/IO/Compression/LZMA/LzmaBase.cs index ca2e6f0..dff4528 100644 --- a/Rant/Core/IO/Compression/LZMA/LzmaBase.cs +++ b/Rant/Core/IO/Compression/LZMA/LzmaBase.cs @@ -25,90 +25,90 @@ namespace Rant.Core.IO.Compression.LZMA { - internal abstract class Base - { - public const uint kNumRepDistances = 4; - public const uint kNumStates = 12; - public const int kNumPosSlotBits = 6; - public const int kDicLogSizeMin = 0; - // public const int kDicLogSizeMax = 30; - // public const uint kDistTableSizeMax = kDicLogSizeMax * 2; + internal abstract class Base + { + public const uint kNumRepDistances = 4; + public const uint kNumStates = 12; + public const int kNumPosSlotBits = 6; + public const int kDicLogSizeMin = 0; + // public const int kDicLogSizeMax = 30; + // public const uint kDistTableSizeMax = kDicLogSizeMax * 2; - public const int kNumLenToPosStatesBits = 2; // it's for speed optimization - public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits; - public const uint kMatchMinLen = 2; - public const int kNumAlignBits = 4; - public const uint kAlignTableSize = 1 << kNumAlignBits; - public const uint kAlignMask = kAlignTableSize - 1; - public const uint kStartPosModelIndex = 4; - public const uint kEndPosModelIndex = 14; - public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; - public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2); - public const uint kNumLitPosStatesBitsEncodingMax = 4; - public const uint kNumLitContextBitsMax = 8; - public const int kNumPosStatesBitsMax = 4; - public const uint kNumPosStatesMax = 1 << kNumPosStatesBitsMax; - public const int kNumPosStatesBitsEncodingMax = 4; - public const uint kNumPosStatesEncodingMax = 1 << kNumPosStatesBitsEncodingMax; - public const int kNumLowLenBits = 3; - public const int kNumMidLenBits = 3; - public const int kNumHighLenBits = 8; - public const uint kNumLowLenSymbols = 1 << kNumLowLenBits; - public const uint kNumMidLenSymbols = 1 << kNumMidLenBits; + public const int kNumLenToPosStatesBits = 2; // it's for speed optimization + public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits; + public const uint kMatchMinLen = 2; + public const int kNumAlignBits = 4; + public const uint kAlignTableSize = 1 << kNumAlignBits; + public const uint kAlignMask = kAlignTableSize - 1; + public const uint kStartPosModelIndex = 4; + public const uint kEndPosModelIndex = 14; + public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; + public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2); + public const uint kNumLitPosStatesBitsEncodingMax = 4; + public const uint kNumLitContextBitsMax = 8; + public const int kNumPosStatesBitsMax = 4; + public const uint kNumPosStatesMax = 1 << kNumPosStatesBitsMax; + public const int kNumPosStatesBitsEncodingMax = 4; + public const uint kNumPosStatesEncodingMax = 1 << kNumPosStatesBitsEncodingMax; + public const int kNumLowLenBits = 3; + public const int kNumMidLenBits = 3; + public const int kNumHighLenBits = 8; + public const uint kNumLowLenSymbols = 1 << kNumLowLenBits; + public const uint kNumMidLenSymbols = 1 << kNumMidLenBits; - public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + - (1 << kNumHighLenBits); + public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + + (1 << kNumHighLenBits); - public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; + public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; - public static uint GetLenToPosState(uint len) - { - len -= kMatchMinLen; - if (len < kNumLenToPosStates) - return len; - return kNumLenToPosStates - 1; - } + public static uint GetLenToPosState(uint len) + { + len -= kMatchMinLen; + if (len < kNumLenToPosStates) + return len; + return kNumLenToPosStates - 1; + } - // static byte []kLiteralNextStates = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; - // static byte []kMatchNextStates = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; - // static byte []kRepNextStates = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; - // static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + // static byte []kLiteralNextStates = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; + // static byte []kMatchNextStates = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; + // static byte []kRepNextStates = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; + // static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; - public struct State - { - public uint Index; + public struct State + { + public uint Index; - public void Init() - { - Index = 0; - } + public void Init() + { + Index = 0; + } - public void UpdateChar() - { - if (Index < 4) Index = 0; - else if (Index < 10) Index -= 3; - else Index -= 6; - } + public void UpdateChar() + { + if (Index < 4) Index = 0; + else if (Index < 10) Index -= 3; + else Index -= 6; + } - public void UpdateMatch() - { - Index = (uint)(Index < 7 ? 7 : 10); - } + public void UpdateMatch() + { + Index = (uint)(Index < 7 ? 7 : 10); + } - public void UpdateRep() - { - Index = (uint)(Index < 7 ? 8 : 11); - } + public void UpdateRep() + { + Index = (uint)(Index < 7 ? 8 : 11); + } - public void UpdateShortRep() - { - Index = (uint)(Index < 7 ? 9 : 11); - } + public void UpdateShortRep() + { + Index = (uint)(Index < 7 ? 9 : 11); + } - public bool IsCharState() - { - return Index < 7; - } - } - } + public bool IsCharState() + { + return Index < 7; + } + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs b/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs index 5645e55..1141380 100644 --- a/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs +++ b/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs @@ -31,376 +31,370 @@ namespace Rant.Core.IO.Compression.LZMA { - internal class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream - { - private readonly BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates]; - private readonly LenDecoder m_LenDecoder = new LenDecoder(); - private readonly LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); - private readonly OutWindow m_OutWindow = new OutWindow(); - private readonly BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; - private readonly BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates]; - private readonly RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder(); - private readonly LenDecoder m_RepLenDecoder = new LenDecoder(); - private bool _solid = false; - private uint m_DictionarySize; - private uint m_DictionarySizeCheck; - private BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits); - private uint m_PosStateMask; - - public Decoder() - { - m_DictionarySize = 0xFFFFFFFF; - for (int i = 0; i < Base.kNumLenToPosStates; i++) - m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits); - } - - public void Code(Stream inStream, Stream outStream, - long inSize, long outSize, ICodeProgress progress) - { - Init(inStream, outStream); - - var state = new Base.State(); - state.Init(); - uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; - - ulong nowPos64 = 0; - ulong outSize64 = (ulong)outSize; - if (nowPos64 < outSize64) - { - if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0) - throw new DataErrorException(); - state.UpdateChar(); - byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0); - m_OutWindow.PutByte(b); - nowPos64++; - } - while (nowPos64 < outSize64) - { - uint posState = (uint)nowPos64 & m_PosStateMask; - if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - byte b; - byte prevByte = m_OutWindow.GetByte(0); - if (!state.IsCharState()) - b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, - (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); - else - b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); - m_OutWindow.PutByte(b); - state.UpdateChar(); - nowPos64++; - } - else - { - uint len; - if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) - { - if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - state.UpdateShortRep(); - m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); - nowPos64++; - continue; - } - } - else - { - uint distance; - if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - distance = rep1; - } - else - { - if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - distance = rep2; - } - else - { - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; - } - rep1 = rep0; - rep0 = distance; - } - len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; - state.UpdateRep(); - } - else - { - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); - state.UpdateMatch(); - uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); - if (posSlot >= Base.kStartPosModelIndex) - { - int numDirectBits = (int)((posSlot >> 1) - 1); - rep0 = (2 | (posSlot & 1)) << numDirectBits; - if (posSlot < Base.kEndPosModelIndex) - { - rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, - rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); - } - else - { - rep0 += m_RangeDecoder.DecodeDirectBits( - numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits; - rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); - } - } - else - { - rep0 = posSlot; - } - } - if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) - { - if (rep0 == 0xFFFFFFFF) - break; - throw new DataErrorException(); - } - m_OutWindow.CopyBlock(rep0, len); - nowPos64 += len; - } - } - m_OutWindow.Flush(); - m_OutWindow.ReleaseStream(); - m_RangeDecoder.ReleaseStream(); - } - - public void SetDecoderProperties(byte[] properties) - { - if (properties.Length < 5) - throw new InvalidParamException(); - int lc = properties[0] % 9; - int remainder = properties[0] / 9; - int lp = remainder % 5; - int pb = remainder / 5; - if (pb > Base.kNumPosStatesBitsMax) - throw new InvalidParamException(); - uint dictionarySize = 0; - for (int i = 0; i < 4; i++) - dictionarySize += (uint)properties[1 + i] << (i * 8); - SetDictionarySize(dictionarySize); - SetLiteralProperties(lp, lc); - SetPosBitsProperties(pb); - } - - private void SetDictionarySize(uint dictionarySize) - { - if (m_DictionarySize != dictionarySize) - { - m_DictionarySize = dictionarySize; - m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); - uint blockSize = Math.Max(m_DictionarySizeCheck, 1 << 12); - m_OutWindow.Create(blockSize); - } - } - - private void SetLiteralProperties(int lp, int lc) - { - if (lp > 8) - throw new InvalidParamException(); - if (lc > 8) - throw new InvalidParamException(); - m_LiteralDecoder.Create(lp, lc); - } - - private void SetPosBitsProperties(int pb) - { - if (pb > Base.kNumPosStatesBitsMax) - throw new InvalidParamException(); - uint numPosStates = (uint)1 << pb; - m_LenDecoder.Create(numPosStates); - m_RepLenDecoder.Create(numPosStates); - m_PosStateMask = numPosStates - 1; - } - - private void Init(Stream inStream, Stream outStream) - { - m_RangeDecoder.Init(inStream); - m_OutWindow.Init(outStream, _solid); - - uint i; - for (i = 0; i < Base.kNumStates; i++) - { - for (uint j = 0; j <= m_PosStateMask; j++) - { - uint index = (i << Base.kNumPosStatesBitsMax) + j; - m_IsMatchDecoders[index].Init(); - m_IsRep0LongDecoders[index].Init(); - } - m_IsRepDecoders[i].Init(); - m_IsRepG0Decoders[i].Init(); - m_IsRepG1Decoders[i].Init(); - m_IsRepG2Decoders[i].Init(); - } - - m_LiteralDecoder.Init(); - for (i = 0; i < Base.kNumLenToPosStates; i++) - m_PosSlotDecoder[i].Init(); - // m_PosSpecDecoder.Init(); - for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) - m_PosDecoders[i].Init(); - - m_LenDecoder.Init(); - m_RepLenDecoder.Init(); - m_PosAlignDecoder.Init(); - } - - public bool Train(Stream stream) - { - _solid = true; - return m_OutWindow.Train(stream); - } - - private class LenDecoder - { - private readonly BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; - private readonly BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; - private BitDecoder m_Choice = new BitDecoder(); - private BitDecoder m_Choice2 = new BitDecoder(); - private BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits); - private uint m_NumPosStates = 0; - - public void Create(uint numPosStates) - { - for (uint posState = m_NumPosStates; posState < numPosStates; posState++) - { - m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits); - m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits); - } - m_NumPosStates = numPosStates; - } - - public void Init() - { - m_Choice.Init(); - for (uint posState = 0; posState < m_NumPosStates; posState++) - { - m_LowCoder[posState].Init(); - m_MidCoder[posState].Init(); - } - m_Choice2.Init(); - m_HighCoder.Init(); - } - - public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState) - { - if (m_Choice.Decode(rangeDecoder) == 0) - return m_LowCoder[posState].Decode(rangeDecoder); - uint symbol = Base.kNumLowLenSymbols; - if (m_Choice2.Decode(rangeDecoder) == 0) - { - symbol += m_MidCoder[posState].Decode(rangeDecoder); - } - else - { - symbol += Base.kNumMidLenSymbols; - symbol += m_HighCoder.Decode(rangeDecoder); - } - return symbol; - } - } - - private class LiteralDecoder - { - private Decoder2[] m_Coders; - private int m_NumPosBits; - private int m_NumPrevBits; - private uint m_PosMask; - - public void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && - m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint)1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Decoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - public void Init() - { - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - for (uint i = 0; i < numStates; i++) - m_Coders[i].Init(); - } - - private uint GetState(uint pos, byte prevByte) - { - return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); - } - - public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte) - { - return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); - } - - public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte) - { - return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); - } - - private struct Decoder2 - { - private BitDecoder[] m_Decoders; - - public void Create() - { - m_Decoders = new BitDecoder[0x300]; - } - - public void Init() - { - for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); - } - - public byte DecodeNormal(RangeCoder.Decoder rangeDecoder) - { - uint symbol = 1; - do - { - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); - } while (symbol < 0x100); - return (byte)symbol; - } - - public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) - { - uint symbol = 1; - do - { - uint matchBit = (uint)(matchByte >> 7) & 1; - matchByte <<= 1; - uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder); - symbol = (symbol << 1) | bit; - if (matchBit != bit) - { - while (symbol < 0x100) - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); - break; - } - } while (symbol < 0x100); - return (byte)symbol; - } - } - } - } + internal class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream + { + private readonly BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + private readonly BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + private readonly BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates]; + private readonly BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates]; + private readonly BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates]; + private readonly BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates]; + private readonly LenDecoder m_LenDecoder = new LenDecoder(); + private readonly LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); + private readonly OutWindow m_OutWindow = new OutWindow(); + private readonly BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; + private readonly BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates]; + private readonly RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder(); + private readonly LenDecoder m_RepLenDecoder = new LenDecoder(); + private bool _solid = false; + private uint m_DictionarySize; + private uint m_DictionarySizeCheck; + private BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits); + private uint m_PosStateMask; + + public Decoder() + { + m_DictionarySize = 0xFFFFFFFF; + for (int i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits); + } + + public void Code(Stream inStream, Stream outStream, + long inSize, long outSize, ICodeProgress progress) + { + Init(inStream, outStream); + + var state = new Base.State(); + state.Init(); + uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; + + ulong nowPos64 = 0; + ulong outSize64 = (ulong)outSize; + if (nowPos64 < outSize64) + { + if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0) + throw new DataErrorException(); + state.UpdateChar(); + byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0); + m_OutWindow.PutByte(b); + nowPos64++; + } + while (nowPos64 < outSize64) + { + uint posState = (uint)nowPos64 & m_PosStateMask; + if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) + { + byte b; + byte prevByte = m_OutWindow.GetByte(0); + if (!state.IsCharState()) + { + b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, + (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); + } + else + b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); + m_OutWindow.PutByte(b); + state.UpdateChar(); + nowPos64++; + } + else + { + uint len; + if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) + { + if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) + { + if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) + { + state.UpdateShortRep(); + m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); + nowPos64++; + continue; + } + } + else + { + uint distance; + if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) + distance = rep1; + else + { + if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) + distance = rep2; + else + { + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; + state.UpdateRep(); + } + else + { + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); + state.UpdateMatch(); + uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); + if (posSlot >= Base.kStartPosModelIndex) + { + int numDirectBits = (int)((posSlot >> 1) - 1); + rep0 = (2 | (posSlot & 1)) << numDirectBits; + if (posSlot < Base.kEndPosModelIndex) + { + rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, + rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); + } + else + { + rep0 += m_RangeDecoder.DecodeDirectBits( + numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits; + rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); + } + } + else + rep0 = posSlot; + } + if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) + { + if (rep0 == 0xFFFFFFFF) + break; + throw new DataErrorException(); + } + m_OutWindow.CopyBlock(rep0, len); + nowPos64 += len; + } + } + m_OutWindow.Flush(); + m_OutWindow.ReleaseStream(); + m_RangeDecoder.ReleaseStream(); + } + + public void SetDecoderProperties(byte[] properties) + { + if (properties.Length < 5) + throw new InvalidParamException(); + int lc = properties[0] % 9; + int remainder = properties[0] / 9; + int lp = remainder % 5; + int pb = remainder / 5; + if (pb > Base.kNumPosStatesBitsMax) + throw new InvalidParamException(); + uint dictionarySize = 0; + for (int i = 0; i < 4; i++) + dictionarySize += (uint)properties[1 + i] << (i * 8); + SetDictionarySize(dictionarySize); + SetLiteralProperties(lp, lc); + SetPosBitsProperties(pb); + } + + private void SetDictionarySize(uint dictionarySize) + { + if (m_DictionarySize != dictionarySize) + { + m_DictionarySize = dictionarySize; + m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); + uint blockSize = Math.Max(m_DictionarySizeCheck, 1 << 12); + m_OutWindow.Create(blockSize); + } + } + + private void SetLiteralProperties(int lp, int lc) + { + if (lp > 8) + throw new InvalidParamException(); + if (lc > 8) + throw new InvalidParamException(); + m_LiteralDecoder.Create(lp, lc); + } + + private void SetPosBitsProperties(int pb) + { + if (pb > Base.kNumPosStatesBitsMax) + throw new InvalidParamException(); + uint numPosStates = (uint)1 << pb; + m_LenDecoder.Create(numPosStates); + m_RepLenDecoder.Create(numPosStates); + m_PosStateMask = numPosStates - 1; + } + + private void Init(Stream inStream, Stream outStream) + { + m_RangeDecoder.Init(inStream); + m_OutWindow.Init(outStream, _solid); + + uint i; + for (i = 0; i < Base.kNumStates; i++) + { + for (uint j = 0; j <= m_PosStateMask; j++) + { + uint index = (i << Base.kNumPosStatesBitsMax) + j; + m_IsMatchDecoders[index].Init(); + m_IsRep0LongDecoders[index].Init(); + } + m_IsRepDecoders[i].Init(); + m_IsRepG0Decoders[i].Init(); + m_IsRepG1Decoders[i].Init(); + m_IsRepG2Decoders[i].Init(); + } + + m_LiteralDecoder.Init(); + for (i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i].Init(); + // m_PosSpecDecoder.Init(); + for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) + m_PosDecoders[i].Init(); + + m_LenDecoder.Init(); + m_RepLenDecoder.Init(); + m_PosAlignDecoder.Init(); + } + + public bool Train(Stream stream) + { + _solid = true; + return m_OutWindow.Train(stream); + } + + private class LenDecoder + { + private readonly BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + private readonly BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + private BitDecoder m_Choice = new BitDecoder(); + private BitDecoder m_Choice2 = new BitDecoder(); + private BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits); + private uint m_NumPosStates = 0; + + public void Create(uint numPosStates) + { + for (uint posState = m_NumPosStates; posState < numPosStates; posState++) + { + m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits); + m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits); + } + m_NumPosStates = numPosStates; + } + + public void Init() + { + m_Choice.Init(); + for (uint posState = 0; posState < m_NumPosStates; posState++) + { + m_LowCoder[posState].Init(); + m_MidCoder[posState].Init(); + } + m_Choice2.Init(); + m_HighCoder.Init(); + } + + public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState) + { + if (m_Choice.Decode(rangeDecoder) == 0) + return m_LowCoder[posState].Decode(rangeDecoder); + uint symbol = Base.kNumLowLenSymbols; + if (m_Choice2.Decode(rangeDecoder) == 0) + symbol += m_MidCoder[posState].Decode(rangeDecoder); + else + { + symbol += Base.kNumMidLenSymbols; + symbol += m_HighCoder.Decode(rangeDecoder); + } + return symbol; + } + } + + private class LiteralDecoder + { + private Decoder2[] m_Coders; + private int m_NumPosBits; + private int m_NumPrevBits; + private uint m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && + m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = ((uint)1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Decoder2[numStates]; + for (uint i = 0; i < numStates; i++) + m_Coders[i].Create(); + } + + public void Init() + { + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + for (uint i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + private uint GetState(uint pos, byte prevByte) + { + return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); + } + + public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte) + { + return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); + } + + public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte) + { + return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); + } + + private struct Decoder2 + { + private BitDecoder[] m_Decoders; + + public void Create() + { + m_Decoders = new BitDecoder[0x300]; + } + + public void Init() + { + for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); + } + + public byte DecodeNormal(RangeCoder.Decoder rangeDecoder) + { + uint symbol = 1; + do + { + symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); + } while (symbol < 0x100); + return (byte)symbol; + } + + public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) + { + uint symbol = 1; + do + { + uint matchBit = (uint)(matchByte >> 7) & 1; + matchByte <<= 1; + uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder); + symbol = (symbol << 1) | bit; + if (matchBit != bit) + { + while (symbol < 0x100) + symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); + break; + } + } while (symbol < 0x100); + return (byte)symbol; + } + } + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs b/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs index 87fca20..e3799a1 100644 --- a/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs +++ b/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs @@ -31,1488 +31,1484 @@ namespace Rant.Core.IO.Compression.LZMA { - internal class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties - { - private const uint kIfinityPrice = 0xFFFFFFF; - private const int kDefaultDictionaryLogSize = 22; - private const uint kNumFastBytesDefault = 0x20; - private const uint kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; - private const uint kNumOpts = 1 << 12; - private const int kPropSize = 5; - private static readonly byte[] g_FastPos = new byte[1 << 11]; - - private static readonly string[] kMatchFinderIDs = - { - "BT2", - "BT4" - }; - - private readonly uint[] _alignPrices = new uint[Base.kAlignTableSize]; - private readonly uint[] _distancesPrices = new uint[Base.kNumFullDistances << Base.kNumLenToPosStatesBits]; - private readonly BitEncoder[] _isMatch = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitEncoder[] _isRep = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRep0Long = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitEncoder[] _isRepG0 = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRepG1 = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRepG2 = new BitEncoder[Base.kNumStates]; - private readonly LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); - private readonly LiteralEncoder _literalEncoder = new LiteralEncoder(); - private readonly uint[] _matchDistances = new uint[Base.kMatchMaxLen * 2 + 2]; - private readonly Optimal[] _optimum = new Optimal[kNumOpts]; - private readonly BitEncoder[] _posEncoders = new BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; - private readonly BitTreeEncoder[] _posSlotEncoder = new BitTreeEncoder[Base.kNumLenToPosStates]; - private readonly uint[] _posSlotPrices = new uint[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)]; - private readonly RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder(); - private readonly uint[] _repDistances = new uint[Base.kNumRepDistances]; - private readonly LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); - private readonly byte[] properties = new byte[kPropSize]; - private readonly uint[] repLens = new uint[Base.kNumRepDistances]; - private readonly uint[] reps = new uint[Base.kNumRepDistances]; - private readonly uint[] tempPrices = new uint[Base.kNumFullDistances]; - private uint _additionalOffset; - private uint _alignPriceCount; - private uint _dictionarySize = 1 << kDefaultDictionaryLogSize; - private uint _dictionarySizePrev = 0xFFFFFFFF; - private uint _distTableSize = kDefaultDictionaryLogSize * 2; - private bool _finished; - private Stream _inStream; - private uint _longestMatchLength; - private bool _longestMatchWasFound; - private IMatchFinder _matchFinder = null; - private EMatchFinderType _matchFinderType = EMatchFinderType.BT4; - private uint _matchPriceCount; - private bool _needReleaseMFStream; - private uint _numDistancePairs; - private uint _numFastBytes = kNumFastBytesDefault; - private uint _numFastBytesPrev = 0xFFFFFFFF; - private int _numLiteralContextBits = 3; - private int _numLiteralPosStateBits = 0; - private uint _optimumCurrentIndex; - private uint _optimumEndIndex; - private BitTreeEncoder _posAlignEncoder = new BitTreeEncoder(Base.kNumAlignBits); - private int _posStateBits = 2; - private uint _posStateMask = 4 - 1; - private byte _previousByte; - private Base.State _state = new Base.State(); - private uint _trainSize = 0; - private bool _writeEndMark = false; - private long nowPos64; - - static Encoder() - { - const byte kFastSlots = 22; - int c = 2; - g_FastPos[0] = 0; - g_FastPos[1] = 1; - for (byte slotFast = 2; slotFast < kFastSlots; slotFast++) - { - uint k = (uint)1 << ((slotFast >> 1) - 1); - for (uint j = 0; j < k; j++, c++) - g_FastPos[c] = slotFast; - } - } - - public Encoder() - { - for (int i = 0; i < kNumOpts; i++) - _optimum[i] = new Optimal(); - for (int i = 0; i < Base.kNumLenToPosStates; i++) - _posSlotEncoder[i] = new BitTreeEncoder(Base.kNumPosSlotBits); - } - - public void Code(Stream inStream, Stream outStream, - long inSize, long outSize, ICodeProgress progress) - { - _needReleaseMFStream = false; - try - { - SetStreams(inStream, outStream, inSize, outSize); - while (true) - { - long processedInSize; - long processedOutSize; - bool finished; - CodeOneBlock(out processedInSize, out processedOutSize, out finished); - if (finished) - return; - if (progress != null) - progress.SetProgress(processedInSize, processedOutSize); - } - } - finally - { - ReleaseStreams(); - } - } - - public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) - { - for (uint i = 0; i < properties.Length; i++) - { - var prop = properties[i]; - switch (propIDs[i]) - { - case CoderPropID.NumFastBytes: - { - if (!(prop is int)) - throw new InvalidParamException(); - int numFastBytes = (int)prop; - if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen) - throw new InvalidParamException(); - _numFastBytes = (uint)numFastBytes; - break; - } - case CoderPropID.Algorithm: - { - /* - if (!(prop is Int32)) - throw new InvalidParamException(); - Int32 maximize = (Int32)prop; - _fastMode = (maximize == 0); - _maxMode = (maximize >= 2); - */ - break; - } - case CoderPropID.MatchFinder: - { - if (!(prop is string)) - throw new InvalidParamException(); - var matchFinderIndexPrev = _matchFinderType; - int m = FindMatchFinder(((string)prop).ToUpper()); - if (m < 0) - throw new InvalidParamException(); - _matchFinderType = (EMatchFinderType)m; - if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) - { - _dictionarySizePrev = 0xFFFFFFFF; - _matchFinder = null; - } - break; - } - case CoderPropID.DictionarySize: - { - const int kDicLogSizeMaxCompress = 30; - if (!(prop is int)) - throw new InvalidParamException(); - ; - int dictionarySize = (int)prop; - if (dictionarySize < (uint)(1 << Base.kDicLogSizeMin) || - dictionarySize > (uint)(1 << kDicLogSizeMaxCompress)) - throw new InvalidParamException(); - _dictionarySize = (uint)dictionarySize; - int dicLogSize; - for (dicLogSize = 0; dicLogSize < (uint)kDicLogSizeMaxCompress; dicLogSize++) - if (dictionarySize <= (uint)1 << dicLogSize) - break; - _distTableSize = (uint)dicLogSize * 2; - break; - } - case CoderPropID.PosStateBits: - { - if (!(prop is int)) - throw new InvalidParamException(); - int v = (int)prop; - if (v < 0 || v > (uint)Base.kNumPosStatesBitsEncodingMax) - throw new InvalidParamException(); - _posStateBits = v; - _posStateMask = ((uint)1 << _posStateBits) - 1; - break; - } - case CoderPropID.LitPosBits: - { - if (!(prop is int)) - throw new InvalidParamException(); - int v = (int)prop; - if (v < 0 || v > Base.kNumLitPosStatesBitsEncodingMax) - throw new InvalidParamException(); - _numLiteralPosStateBits = v; - break; - } - case CoderPropID.LitContextBits: - { - if (!(prop is int)) - throw new InvalidParamException(); - int v = (int)prop; - if (v < 0 || v > Base.kNumLitContextBitsMax) - throw new InvalidParamException(); - ; - _numLiteralContextBits = v; - break; - } - case CoderPropID.EndMarker: - { - if (!(prop is bool)) - throw new InvalidParamException(); - SetWriteEndMarkerMode((bool)prop); - break; - } - default: - throw new InvalidParamException(); - } - } - } - - public void WriteCoderProperties(Stream outStream) - { - properties[0] = (byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); - for (int i = 0; i < 4; i++) - properties[1 + i] = (byte)((_dictionarySize >> (8 * i)) & 0xFF); - outStream.Write(properties, 0, kPropSize); - } - - private static uint GetPosSlot(uint pos) - { - if (pos < 1 << 11) - return g_FastPos[pos]; - if (pos < 1 << 21) - return (uint)(g_FastPos[pos >> 10] + 20); - return (uint)(g_FastPos[pos >> 20] + 40); - } - - private static uint GetPosSlot2(uint pos) - { - if (pos < 1 << 17) - return (uint)(g_FastPos[pos >> 6] + 12); - if (pos < 1 << 27) - return (uint)(g_FastPos[pos >> 16] + 32); - return (uint)(g_FastPos[pos >> 26] + 52); - } - - private void BaseInit() - { - _state.Init(); - _previousByte = 0; - for (uint i = 0; i < Base.kNumRepDistances; i++) - _repDistances[i] = 0; - } - - private void Create() - { - if (_matchFinder == null) - { - var bt = new BinTree(); - int numHashBytes = 4; - if (_matchFinderType == EMatchFinderType.BT2) - numHashBytes = 2; - bt.SetType(numHashBytes); - _matchFinder = bt; - } - _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); - - if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) - return; - _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1); - _dictionarySizePrev = _dictionarySize; - _numFastBytesPrev = _numFastBytes; - } - - private void SetWriteEndMarkerMode(bool writeEndMarker) - { - _writeEndMark = writeEndMarker; - } - - private void Init() - { - BaseInit(); - _rangeEncoder.Init(); - - uint i; - for (i = 0; i < Base.kNumStates; i++) - { - for (uint j = 0; j <= _posStateMask; j++) - { - uint complexState = (i << Base.kNumPosStatesBitsMax) + j; - _isMatch[complexState].Init(); - _isRep0Long[complexState].Init(); - } - _isRep[i].Init(); - _isRepG0[i].Init(); - _isRepG1[i].Init(); - _isRepG2[i].Init(); - } - _literalEncoder.Init(); - for (i = 0; i < Base.kNumLenToPosStates; i++) - _posSlotEncoder[i].Init(); - for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) - _posEncoders[i].Init(); - - _lenEncoder.Init((uint)1 << _posStateBits); - _repMatchLenEncoder.Init((uint)1 << _posStateBits); - - _posAlignEncoder.Init(); - - _longestMatchWasFound = false; - _optimumEndIndex = 0; - _optimumCurrentIndex = 0; - _additionalOffset = 0; - } - - private void ReadMatchDistances(out uint lenRes, out uint numDistancePairs) - { - lenRes = 0; - numDistancePairs = _matchFinder.GetMatches(_matchDistances); - if (numDistancePairs > 0) - { - lenRes = _matchDistances[numDistancePairs - 2]; - if (lenRes == _numFastBytes) - lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1], - Base.kMatchMaxLen - lenRes); - } - _additionalOffset++; - } - - private void MovePos(uint num) - { - if (num > 0) - { - _matchFinder.Skip(num); - _additionalOffset += num; - } - } - - private uint GetRepLen1Price(Base.State state, uint posState) - { - return _isRepG0[state.Index].GetPrice0() + - _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0(); - } - - private uint GetPureRepPrice(uint repIndex, Base.State state, uint posState) - { - uint price; - if (repIndex == 0) - { - price = _isRepG0[state.Index].GetPrice0(); - price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - } - else - { - price = _isRepG0[state.Index].GetPrice1(); - if (repIndex == 1) - { - price += _isRepG1[state.Index].GetPrice0(); - } - else - { - price += _isRepG1[state.Index].GetPrice1(); - price += _isRepG2[state.Index].GetPrice(repIndex - 2); - } - } - return price; - } - - private uint GetRepPrice(uint repIndex, uint len, Base.State state, uint posState) - { - uint price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState); - return price + GetPureRepPrice(repIndex, state, posState); - } - - private uint GetPosLenPrice(uint pos, uint len, uint posState) - { - uint price; - uint lenToPosState = Base.GetLenToPosState(len); - if (pos < Base.kNumFullDistances) - price = _distancesPrices[lenToPosState * Base.kNumFullDistances + pos]; - else - price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + - _alignPrices[pos & Base.kAlignMask]; - return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState); - } - - private uint Backward(out uint backRes, uint cur) - { - _optimumEndIndex = cur; - uint posMem = _optimum[cur].PosPrev; - uint backMem = _optimum[cur].BackPrev; - do - { - if (_optimum[cur].Prev1IsChar) - { - _optimum[posMem].MakeAsChar(); - _optimum[posMem].PosPrev = posMem - 1; - if (_optimum[cur].Prev2) - { - _optimum[posMem - 1].Prev1IsChar = false; - _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; - _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; - } - } - uint posPrev = posMem; - uint backCur = backMem; - - backMem = _optimum[posPrev].BackPrev; - posMem = _optimum[posPrev].PosPrev; - - _optimum[posPrev].BackPrev = backCur; - _optimum[posPrev].PosPrev = cur; - cur = posPrev; - } while (cur > 0); - backRes = _optimum[0].BackPrev; - _optimumCurrentIndex = _optimum[0].PosPrev; - return _optimumCurrentIndex; - } - - private uint GetOptimum(uint position, out uint backRes) - { - if (_optimumEndIndex != _optimumCurrentIndex) - { - uint lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; - backRes = _optimum[_optimumCurrentIndex].BackPrev; - _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; - return lenRes; - } - _optimumCurrentIndex = _optimumEndIndex = 0; - - uint lenMain, numDistancePairs; - if (!_longestMatchWasFound) - { - ReadMatchDistances(out lenMain, out numDistancePairs); - } - else - { - lenMain = _longestMatchLength; - numDistancePairs = _numDistancePairs; - _longestMatchWasFound = false; - } - - uint numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; - if (numAvailableBytes < 2) - { - backRes = 0xFFFFFFFF; - return 1; - } - if (numAvailableBytes > Base.kMatchMaxLen) - numAvailableBytes = Base.kMatchMaxLen; - - uint repMaxIndex = 0; - uint i; - for (i = 0; i < Base.kNumRepDistances; i++) - { - reps[i] = _repDistances[i]; - repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen); - if (repLens[i] > repLens[repMaxIndex]) - repMaxIndex = i; - } - if (repLens[repMaxIndex] >= _numFastBytes) - { - backRes = repMaxIndex; - uint lenRes = repLens[repMaxIndex]; - MovePos(lenRes - 1); - return lenRes; - } - - if (lenMain >= _numFastBytes) - { - backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances; - MovePos(lenMain - 1); - return lenMain; - } - - byte currentByte = _matchFinder.GetIndexByte(0 - 1); - byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - 1)); - - if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) - { - backRes = 0xFFFFFFFF; - return 1; - } - - _optimum[0].State = _state; - - uint posState = position & _posStateMask; - - _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _previousByte) - .GetPrice(!_state.IsCharState(), matchByte, currentByte); - _optimum[1].MakeAsChar(); - - uint matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - uint repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); - - if (matchByte == currentByte) - { - uint shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); - if (shortRepPrice < _optimum[1].Price) - { - _optimum[1].Price = shortRepPrice; - _optimum[1].MakeAsShortRep(); - } - } - - uint lenEnd = lenMain >= repLens[repMaxIndex] ? lenMain : repLens[repMaxIndex]; - - if (lenEnd < 2) - { - backRes = _optimum[1].BackPrev; - return 1; - } - - _optimum[1].PosPrev = 0; - - _optimum[0].Backs0 = reps[0]; - _optimum[0].Backs1 = reps[1]; - _optimum[0].Backs2 = reps[2]; - _optimum[0].Backs3 = reps[3]; - - uint len = lenEnd; - do - { - _optimum[len--].Price = kIfinityPrice; - } while (len >= 2); - - for (i = 0; i < Base.kNumRepDistances; i++) - { - uint repLen = repLens[i]; - if (repLen < 2) - continue; - uint price = repMatchPrice + GetPureRepPrice(i, _state, posState); - do - { - uint curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); - var optimum = _optimum[repLen]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = i; - optimum.Prev1IsChar = false; - } - } while (--repLen >= 2); - } - - uint normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); - - len = repLens[0] >= 2 ? repLens[0] + 1 : 2; - if (len <= lenMain) - { - uint offs = 0; - while (len > _matchDistances[offs]) - offs += 2; - for (;; len++) - { - uint distance = _matchDistances[offs + 1]; - uint curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); - var optimum = _optimum[len]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = distance + Base.kNumRepDistances; - optimum.Prev1IsChar = false; - } - if (len == _matchDistances[offs]) - { - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - - uint cur = 0; - - while (true) - { - cur++; - if (cur == lenEnd) - return Backward(out backRes, cur); - uint newLen; - ReadMatchDistances(out newLen, out numDistancePairs); - if (newLen >= _numFastBytes) - { - _numDistancePairs = numDistancePairs; - _longestMatchLength = newLen; - _longestMatchWasFound = true; - return Backward(out backRes, cur); - } - position++; - uint posPrev = _optimum[cur].PosPrev; - Base.State state; - if (_optimum[cur].Prev1IsChar) - { - posPrev--; - if (_optimum[cur].Prev2) - { - state = _optimum[_optimum[cur].PosPrev2].State; - if (_optimum[cur].BackPrev2 < Base.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - else - { - state = _optimum[posPrev].State; - } - state.UpdateChar(); - } - else - { - state = _optimum[posPrev].State; - } - if (posPrev == cur - 1) - { - if (_optimum[cur].IsShortRep()) - state.UpdateShortRep(); - else - state.UpdateChar(); - } - else - { - uint pos; - if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) - { - posPrev = _optimum[cur].PosPrev2; - pos = _optimum[cur].BackPrev2; - state.UpdateRep(); - } - else - { - pos = _optimum[cur].BackPrev; - if (pos < Base.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - var opt = _optimum[posPrev]; - if (pos < Base.kNumRepDistances) - { - if (pos == 0) - { - reps[0] = opt.Backs0; - reps[1] = opt.Backs1; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 1) - { - reps[0] = opt.Backs1; - reps[1] = opt.Backs0; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 2) - { - reps[0] = opt.Backs2; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs3; - } - else - { - reps[0] = opt.Backs3; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - else - { - reps[0] = pos - Base.kNumRepDistances; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - _optimum[cur].State = state; - _optimum[cur].Backs0 = reps[0]; - _optimum[cur].Backs1 = reps[1]; - _optimum[cur].Backs2 = reps[2]; - _optimum[cur].Backs3 = reps[3]; - uint curPrice = _optimum[cur].Price; - - currentByte = _matchFinder.GetIndexByte(0 - 1); - matchByte = _matchFinder.GetIndexByte((int)(0 - reps[0] - 1 - 1)); - - posState = position & _posStateMask; - - uint curAnd1Price = curPrice + - _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). - GetPrice(!state.IsCharState(), matchByte, currentByte); - - var nextOptimum = _optimum[cur + 1]; - - bool nextIsChar = false; - if (curAnd1Price < nextOptimum.Price) - { - nextOptimum.Price = curAnd1Price; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsChar(); - nextIsChar = true; - } - - matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); - - if (matchByte == currentByte && - !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) - { - uint shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); - if (shortRepPrice <= nextOptimum.Price) - { - nextOptimum.Price = shortRepPrice; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsShortRep(); - nextIsChar = true; - } - } - - uint numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; - numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull); - numAvailableBytes = numAvailableBytesFull; - - if (numAvailableBytes < 2) - continue; - if (numAvailableBytes > _numFastBytes) - numAvailableBytes = _numFastBytes; - if (!nextIsChar && matchByte != currentByte) - { - // try Literal + rep0 - uint t = Math.Min(numAvailableBytesFull - 1, _numFastBytes); - uint lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); - if (lenTest2 >= 2) - { - var state2 = state; - state2.UpdateChar(); - uint posStateNext = (position + 1) & _posStateMask; - uint nextRepMatchPrice = curAnd1Price + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1() + - _isRep[state2.Index].GetPrice1(); - { - uint offset = cur + 1 + lenTest2; - while (lenEnd < offset) - _optimum[++lenEnd].Price = kIfinityPrice; - uint curAndLenPrice = nextRepMatchPrice + GetRepPrice( - 0, lenTest2, state2, posStateNext); - var optimum = _optimum[offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = false; - } - } - } - } - - uint startLen = 2; // speed optimization - - for (uint repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++) - { - uint lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); - if (lenTest < 2) - continue; - uint lenTestTemp = lenTest; - do - { - while (lenEnd < cur + lenTest) - _optimum[++lenEnd].Price = kIfinityPrice; - uint curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); - var optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = repIndex; - optimum.Prev1IsChar = false; - } - } while (--lenTest >= 2); - lenTest = lenTestTemp; - - if (repIndex == 0) - startLen = lenTest + 1; - - // if (_maxMode) - if (lenTest < numAvailableBytesFull) - { - uint t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - uint lenTest2 = _matchFinder.GetMatchLen((int)lenTest, reps[repIndex], t); - if (lenTest2 >= 2) - { - var state2 = state; - state2.UpdateRep(); - uint posStateNext = (position + lenTest) & _posStateMask; - uint curAndLenCharPrice = - repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((int)lenTest - 1 - 1)).GetPrice(true, - _matchFinder.GetIndexByte((int)lenTest - 1 - (int)(reps[repIndex] + 1)), - _matchFinder.GetIndexByte((int)lenTest - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - uint nextMatchPrice = curAndLenCharPrice + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); - uint nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - // for(; lenTest2 >= 2; lenTest2--) - { - uint offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - uint curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); - var optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = repIndex; - } - } - } - } - } - - if (newLen > numAvailableBytes) - { - newLen = numAvailableBytes; - for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; - _matchDistances[numDistancePairs] = newLen; - numDistancePairs += 2; - } - if (newLen >= startLen) - { - normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); - while (lenEnd < cur + newLen) - _optimum[++lenEnd].Price = kIfinityPrice; - - uint offs = 0; - while (startLen > _matchDistances[offs]) - offs += 2; - - for (uint lenTest = startLen;; lenTest++) - { - uint curBack = _matchDistances[offs + 1]; - uint curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); - var optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = curBack + Base.kNumRepDistances; - optimum.Prev1IsChar = false; - } - - if (lenTest == _matchDistances[offs]) - { - if (lenTest < numAvailableBytesFull) - { - uint t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - uint lenTest2 = _matchFinder.GetMatchLen((int)lenTest, curBack, t); - if (lenTest2 >= 2) - { - var state2 = state; - state2.UpdateMatch(); - uint posStateNext = (position + lenTest) & _posStateMask; - uint curAndLenCharPrice = curAndLenPrice + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((int)lenTest - 1 - 1)). - GetPrice(true, - _matchFinder.GetIndexByte((int)lenTest - (int)(curBack + 1) - 1), - _matchFinder.GetIndexByte((int)lenTest - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - uint nextMatchPrice = curAndLenCharPrice + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); - uint nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - uint offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); - optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = curBack + Base.kNumRepDistances; - } - } - } - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - } - } - - private bool ChangePair(uint smallDist, uint bigDist) - { - const int kDif = 7; - return smallDist < (uint)1 << (32 - kDif) && bigDist >= smallDist << kDif; - } - - private void WriteEndMarker(uint posState) - { - if (!_writeEndMark) - return; - - _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1); - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - uint len = Base.kMatchMinLen; - _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - uint posSlot = (1 << Base.kNumPosSlotBits) - 1; - uint lenToPosState = Base.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - int footerBits = 30; - uint posReduced = ((uint)1 << footerBits) - 1; - _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); - } - - private void Flush(uint nowPos) - { - ReleaseMFStream(); - WriteEndMarker(nowPos & _posStateMask); - _rangeEncoder.FlushData(); - _rangeEncoder.FlushStream(); - } - - public void CodeOneBlock(out long inSize, out long outSize, out bool finished) - { - inSize = 0; - outSize = 0; - finished = true; - - if (_inStream != null) - { - _matchFinder.SetStream(_inStream); - _matchFinder.Init(); - _needReleaseMFStream = true; - _inStream = null; - if (_trainSize > 0) - _matchFinder.Skip(_trainSize); - } - - if (_finished) - return; - _finished = true; - - - long progressPosValuePrev = nowPos64; - if (nowPos64 == 0) - { - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((uint)nowPos64); - return; - } - uint len, numDistancePairs; // it's not used - ReadMatchDistances(out len, out numDistancePairs); - uint posState = (uint)nowPos64 & _posStateMask; - _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); - _state.UpdateChar(); - byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); - _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte).Encode(_rangeEncoder, curByte); - _previousByte = curByte; - _additionalOffset--; - nowPos64++; - } - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((uint)nowPos64); - return; - } - while (true) - { - uint pos; - uint len = GetOptimum((uint)nowPos64, out pos); - - uint posState = (uint)nowPos64 & _posStateMask; - uint complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState; - if (len == 1 && pos == 0xFFFFFFFF) - { - _isMatch[complexState].Encode(_rangeEncoder, 0); - byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); - var subCoder = _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte); - if (!_state.IsCharState()) - { - byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - _additionalOffset)); - subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); - } - else - { - subCoder.Encode(_rangeEncoder, curByte); - } - _previousByte = curByte; - _state.UpdateChar(); - } - else - { - _isMatch[complexState].Encode(_rangeEncoder, 1); - if (pos < Base.kNumRepDistances) - { - _isRep[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 0) - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 0); - if (len == 1) - _isRep0Long[complexState].Encode(_rangeEncoder, 0); - else - _isRep0Long[complexState].Encode(_rangeEncoder, 1); - } - else - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 1) - { - _isRepG1[_state.Index].Encode(_rangeEncoder, 0); - } - else - { - _isRepG1[_state.Index].Encode(_rangeEncoder, 1); - _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2); - } - } - if (len == 1) - { - _state.UpdateShortRep(); - } - else - { - _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - _state.UpdateRep(); - } - uint distance = _repDistances[pos]; - if (pos != 0) - { - for (uint i = pos; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - } - } - else - { - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - pos -= Base.kNumRepDistances; - uint posSlot = GetPosSlot(pos); - uint lenToPosState = Base.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - - if (posSlot >= Base.kStartPosModelIndex) - { - int footerBits = (int)((posSlot >> 1) - 1); - uint baseVal = (2 | (posSlot & 1)) << footerBits; - uint posReduced = pos - baseVal; - - if (posSlot < Base.kEndPosModelIndex) - { - BitTreeEncoder.ReverseEncode(_posEncoders, - baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); - } - else - { - _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); - _alignPriceCount++; - } - } - uint distance = pos; - for (uint i = Base.kNumRepDistances - 1; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - _matchPriceCount++; - } - _previousByte = _matchFinder.GetIndexByte((int)(len - 1 - _additionalOffset)); - } - _additionalOffset -= len; - nowPos64 += len; - if (_additionalOffset == 0) - { - // if (!_fastMode) - if (_matchPriceCount >= 1 << 7) - FillDistancesPrices(); - if (_alignPriceCount >= Base.kAlignTableSize) - FillAlignPrices(); - inSize = nowPos64; - outSize = _rangeEncoder.GetProcessedSizeAdd(); - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((uint)nowPos64); - return; - } - - if (nowPos64 - progressPosValuePrev >= 1 << 12) - { - _finished = false; - finished = false; - return; - } - } - } - } - - private void ReleaseMFStream() - { - if (_matchFinder != null && _needReleaseMFStream) - { - _matchFinder.ReleaseStream(); - _needReleaseMFStream = false; - } - } - - private void SetOutStream(Stream outStream) - { - _rangeEncoder.SetStream(outStream); - } - - private void ReleaseOutStream() - { - _rangeEncoder.ReleaseStream(); - } - - private void ReleaseStreams() - { - ReleaseMFStream(); - ReleaseOutStream(); - } - - private void SetStreams(Stream inStream, Stream outStream, - long inSize, long outSize) - { - _inStream = inStream; - _finished = false; - Create(); - SetOutStream(outStream); - Init(); - - // if (!_fastMode) - { - FillDistancesPrices(); - FillAlignPrices(); - } - - _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); - _lenEncoder.UpdateTables((uint)1 << _posStateBits); - _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); - _repMatchLenEncoder.UpdateTables((uint)1 << _posStateBits); - - nowPos64 = 0; - } - - private void FillDistancesPrices() - { - for (uint i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++) - { - uint posSlot = GetPosSlot(i); - int footerBits = (int)((posSlot >> 1) - 1); - uint baseVal = (2 | (posSlot & 1)) << footerBits; - tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, - baseVal - posSlot - 1, footerBits, i - baseVal); - } - - for (uint lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++) - { - uint posSlot; - var encoder = _posSlotEncoder[lenToPosState]; - - uint st = lenToPosState << Base.kNumPosSlotBits; - for (posSlot = 0; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); - for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] += ((posSlot >> 1) - 1 - Base.kNumAlignBits) << BitEncoder.kNumBitPriceShiftBits; - - uint st2 = lenToPosState * Base.kNumFullDistances; - uint i; - for (i = 0; i < Base.kStartPosModelIndex; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + i]; - for (; i < Base.kNumFullDistances; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; - } - _matchPriceCount = 0; - } - - private void FillAlignPrices() - { - for (uint i = 0; i < Base.kAlignTableSize; i++) - _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); - _alignPriceCount = 0; - } - - private static int FindMatchFinder(string s) - { - for (int m = 0; m < kMatchFinderIDs.Length; m++) - if (s == kMatchFinderIDs[m]) - return m; - return -1; - } - - public void SetTrainSize(uint trainSize) - { - _trainSize = trainSize; - } - - private enum EMatchFinderType - { - BT2, - BT4 - } - - private class LiteralEncoder - { - private Encoder2[] m_Coders; - private int m_NumPosBits; - private int m_NumPrevBits; - private uint m_PosMask; - - public void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint)1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Encoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - public void Init() - { - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - for (uint i = 0; i < numStates; i++) - m_Coders[i].Init(); - } - - public Encoder2 GetSubCoder(uint pos, byte prevByte) - { - return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; - } - - public struct Encoder2 - { - private BitEncoder[] m_Encoders; - - public void Create() - { - m_Encoders = new BitEncoder[0x300]; - } - - public void Init() - { - for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); - } - - public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol) - { - uint context = 1; - for (int i = 7; i >= 0; i--) - { - uint bit = (uint)((symbol >> i) & 1); - m_Encoders[context].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) - { - uint context = 1; - bool same = true; - for (int i = 7; i >= 0; i--) - { - uint bit = (uint)((symbol >> i) & 1); - uint state = context; - if (same) - { - uint matchBit = (uint)((matchByte >> i) & 1); - state += (1 + matchBit) << 8; - same = matchBit == bit; - } - m_Encoders[state].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public uint GetPrice(bool matchMode, byte matchByte, byte symbol) - { - uint price = 0; - uint context = 1; - int i = 7; - if (matchMode) - for (; i >= 0; i--) - { - uint matchBit = (uint)(matchByte >> i) & 1; - uint bit = (uint)(symbol >> i) & 1; - price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit); - context = (context << 1) | bit; - if (matchBit != bit) - { - i--; - break; - } - } - for (; i >= 0; i--) - { - uint bit = (uint)(symbol >> i) & 1; - price += m_Encoders[context].GetPrice(bit); - context = (context << 1) | bit; - } - return price; - } - } - } - - private class LenEncoder - { - private readonly BitTreeEncoder[] _lowCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; - private readonly BitTreeEncoder[] _midCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; - private BitEncoder _choice = new BitEncoder(); - private BitEncoder _choice2 = new BitEncoder(); - private BitTreeEncoder _highCoder = new BitTreeEncoder(Base.kNumHighLenBits); - - public LenEncoder() - { - for (uint posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++) - { - _lowCoder[posState] = new BitTreeEncoder(Base.kNumLowLenBits); - _midCoder[posState] = new BitTreeEncoder(Base.kNumMidLenBits); - } - } - - public void Init(uint numPosStates) - { - _choice.Init(); - _choice2.Init(); - for (uint posState = 0; posState < numPosStates; posState++) - { - _lowCoder[posState].Init(); - _midCoder[posState].Init(); - } - _highCoder.Init(); - } - - public void Encode(RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) - { - if (symbol < Base.kNumLowLenSymbols) - { - _choice.Encode(rangeEncoder, 0); - _lowCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - symbol -= Base.kNumLowLenSymbols; - _choice.Encode(rangeEncoder, 1); - if (symbol < Base.kNumMidLenSymbols) - { - _choice2.Encode(rangeEncoder, 0); - _midCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - _choice2.Encode(rangeEncoder, 1); - _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols); - } - } - } - - public void SetPrices(uint posState, uint numSymbols, uint[] prices, uint st) - { - uint a0 = _choice.GetPrice0(); - uint a1 = _choice.GetPrice1(); - uint b0 = a1 + _choice2.GetPrice0(); - uint b1 = a1 + _choice2.GetPrice1(); - uint i = 0; - for (i = 0; i < Base.kNumLowLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); - } - for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols); - } - for (; i < numSymbols; i++) - prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); - } - } - - private class LenPriceTableEncoder : LenEncoder - { - private readonly uint[] _counters = new uint[Base.kNumPosStatesEncodingMax]; - private readonly uint[] _prices = new uint[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax]; - private uint _tableSize; - - public void SetTableSize(uint tableSize) - { - _tableSize = tableSize; - } - - public uint GetPrice(uint symbol, uint posState) - { - return _prices[posState * Base.kNumLenSymbols + symbol]; - } - - private void UpdateTable(uint posState) - { - SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols); - _counters[posState] = _tableSize; - } - - public void UpdateTables(uint numPosStates) - { - for (uint posState = 0; posState < numPosStates; posState++) - UpdateTable(posState); - } - - public new void Encode(RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) - { - base.Encode(rangeEncoder, symbol, posState); - if (--_counters[posState] == 0) - UpdateTable(posState); - } - } - - private class Optimal - { - public uint BackPrev; - public uint BackPrev2; - public uint Backs0; - public uint Backs1; - public uint Backs2; - public uint Backs3; - public uint PosPrev; - public uint PosPrev2; - public bool Prev1IsChar; - public bool Prev2; - public uint Price; - public Base.State State; - - public void MakeAsChar() - { - BackPrev = 0xFFFFFFFF; - Prev1IsChar = false; - } - - public void MakeAsShortRep() - { - BackPrev = 0; - ; - Prev1IsChar = false; - } - - public bool IsShortRep() - { - return BackPrev == 0; - } - } - } + internal class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties + { + private const uint kIfinityPrice = 0xFFFFFFF; + private const int kDefaultDictionaryLogSize = 22; + private const uint kNumFastBytesDefault = 0x20; + private const uint kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; + private const uint kNumOpts = 1 << 12; + private const int kPropSize = 5; + private static readonly byte[] g_FastPos = new byte[1 << 11]; + + private static readonly string[] kMatchFinderIDs = + { + "BT2", + "BT4" + }; + + private readonly uint[] _alignPrices = new uint[Base.kAlignTableSize]; + private readonly uint[] _distancesPrices = new uint[Base.kNumFullDistances << Base.kNumLenToPosStatesBits]; + private readonly BitEncoder[] _isMatch = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + private readonly BitEncoder[] _isRep = new BitEncoder[Base.kNumStates]; + private readonly BitEncoder[] _isRep0Long = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + private readonly BitEncoder[] _isRepG0 = new BitEncoder[Base.kNumStates]; + private readonly BitEncoder[] _isRepG1 = new BitEncoder[Base.kNumStates]; + private readonly BitEncoder[] _isRepG2 = new BitEncoder[Base.kNumStates]; + private readonly LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); + private readonly LiteralEncoder _literalEncoder = new LiteralEncoder(); + private readonly uint[] _matchDistances = new uint[Base.kMatchMaxLen * 2 + 2]; + private readonly Optimal[] _optimum = new Optimal[kNumOpts]; + private readonly BitEncoder[] _posEncoders = new BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; + private readonly BitTreeEncoder[] _posSlotEncoder = new BitTreeEncoder[Base.kNumLenToPosStates]; + private readonly uint[] _posSlotPrices = new uint[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)]; + private readonly RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder(); + private readonly uint[] _repDistances = new uint[Base.kNumRepDistances]; + private readonly LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); + private readonly byte[] properties = new byte[kPropSize]; + private readonly uint[] repLens = new uint[Base.kNumRepDistances]; + private readonly uint[] reps = new uint[Base.kNumRepDistances]; + private readonly uint[] tempPrices = new uint[Base.kNumFullDistances]; + private uint _additionalOffset; + private uint _alignPriceCount; + private uint _dictionarySize = 1 << kDefaultDictionaryLogSize; + private uint _dictionarySizePrev = 0xFFFFFFFF; + private uint _distTableSize = kDefaultDictionaryLogSize * 2; + private bool _finished; + private Stream _inStream; + private uint _longestMatchLength; + private bool _longestMatchWasFound; + private IMatchFinder _matchFinder = null; + private EMatchFinderType _matchFinderType = EMatchFinderType.BT4; + private uint _matchPriceCount; + private bool _needReleaseMFStream; + private uint _numDistancePairs; + private uint _numFastBytes = kNumFastBytesDefault; + private uint _numFastBytesPrev = 0xFFFFFFFF; + private int _numLiteralContextBits = 3; + private int _numLiteralPosStateBits = 0; + private uint _optimumCurrentIndex; + private uint _optimumEndIndex; + private BitTreeEncoder _posAlignEncoder = new BitTreeEncoder(Base.kNumAlignBits); + private int _posStateBits = 2; + private uint _posStateMask = 4 - 1; + private byte _previousByte; + private Base.State _state = new Base.State(); + private uint _trainSize = 0; + private bool _writeEndMark = false; + private long nowPos64; + + static Encoder() + { + const byte kFastSlots = 22; + int c = 2; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + for (byte slotFast = 2; slotFast < kFastSlots; slotFast++) + { + uint k = (uint)1 << ((slotFast >> 1) - 1); + for (uint j = 0; j < k; j++, c++) + g_FastPos[c] = slotFast; + } + } + + public Encoder() + { + for (int i = 0; i < kNumOpts; i++) + _optimum[i] = new Optimal(); + for (int i = 0; i < Base.kNumLenToPosStates; i++) + _posSlotEncoder[i] = new BitTreeEncoder(Base.kNumPosSlotBits); + } + + public void Code(Stream inStream, Stream outStream, + long inSize, long outSize, ICodeProgress progress) + { + _needReleaseMFStream = false; + try + { + SetStreams(inStream, outStream, inSize, outSize); + while (true) + { + long processedInSize; + long processedOutSize; + bool finished; + CodeOneBlock(out processedInSize, out processedOutSize, out finished); + if (finished) + return; + if (progress != null) + progress.SetProgress(processedInSize, processedOutSize); + } + } + finally + { + ReleaseStreams(); + } + } + + public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) + { + for (uint i = 0; i < properties.Length; i++) + { + var prop = properties[i]; + switch (propIDs[i]) + { + case CoderPropID.NumFastBytes: + { + if (!(prop is int)) + throw new InvalidParamException(); + int numFastBytes = (int)prop; + if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen) + throw new InvalidParamException(); + _numFastBytes = (uint)numFastBytes; + break; + } + case CoderPropID.Algorithm: + { + /* + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 maximize = (Int32)prop; + _fastMode = (maximize == 0); + _maxMode = (maximize >= 2); + */ + break; + } + case CoderPropID.MatchFinder: + { + if (!(prop is string)) + throw new InvalidParamException(); + var matchFinderIndexPrev = _matchFinderType; + int m = FindMatchFinder(((string)prop).ToUpper()); + if (m < 0) + throw new InvalidParamException(); + _matchFinderType = (EMatchFinderType)m; + if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) + { + _dictionarySizePrev = 0xFFFFFFFF; + _matchFinder = null; + } + break; + } + case CoderPropID.DictionarySize: + { + const int kDicLogSizeMaxCompress = 30; + if (!(prop is int)) + throw new InvalidParamException(); + ; + int dictionarySize = (int)prop; + if (dictionarySize < (uint)(1 << Base.kDicLogSizeMin) || + dictionarySize > (uint)(1 << kDicLogSizeMaxCompress)) + throw new InvalidParamException(); + _dictionarySize = (uint)dictionarySize; + int dicLogSize; + for (dicLogSize = 0; dicLogSize < (uint)kDicLogSizeMaxCompress; dicLogSize++) + { + if (dictionarySize <= (uint)1 << dicLogSize) + break; + } + _distTableSize = (uint)dicLogSize * 2; + break; + } + case CoderPropID.PosStateBits: + { + if (!(prop is int)) + throw new InvalidParamException(); + int v = (int)prop; + if (v < 0 || v > (uint)Base.kNumPosStatesBitsEncodingMax) + throw new InvalidParamException(); + _posStateBits = v; + _posStateMask = ((uint)1 << _posStateBits) - 1; + break; + } + case CoderPropID.LitPosBits: + { + if (!(prop is int)) + throw new InvalidParamException(); + int v = (int)prop; + if (v < 0 || v > Base.kNumLitPosStatesBitsEncodingMax) + throw new InvalidParamException(); + _numLiteralPosStateBits = v; + break; + } + case CoderPropID.LitContextBits: + { + if (!(prop is int)) + throw new InvalidParamException(); + int v = (int)prop; + if (v < 0 || v > Base.kNumLitContextBitsMax) + throw new InvalidParamException(); + ; + _numLiteralContextBits = v; + break; + } + case CoderPropID.EndMarker: + { + if (!(prop is bool)) + throw new InvalidParamException(); + SetWriteEndMarkerMode((bool)prop); + break; + } + default: + throw new InvalidParamException(); + } + } + } + + public void WriteCoderProperties(Stream outStream) + { + properties[0] = (byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); + for (int i = 0; i < 4; i++) + properties[1 + i] = (byte)((_dictionarySize >> (8 * i)) & 0xFF); + outStream.Write(properties, 0, kPropSize); + } + + private static uint GetPosSlot(uint pos) + { + if (pos < 1 << 11) + return g_FastPos[pos]; + if (pos < 1 << 21) + return (uint)(g_FastPos[pos >> 10] + 20); + return (uint)(g_FastPos[pos >> 20] + 40); + } + + private static uint GetPosSlot2(uint pos) + { + if (pos < 1 << 17) + return (uint)(g_FastPos[pos >> 6] + 12); + if (pos < 1 << 27) + return (uint)(g_FastPos[pos >> 16] + 32); + return (uint)(g_FastPos[pos >> 26] + 52); + } + + private void BaseInit() + { + _state.Init(); + _previousByte = 0; + for (uint i = 0; i < Base.kNumRepDistances; i++) + _repDistances[i] = 0; + } + + private void Create() + { + if (_matchFinder == null) + { + var bt = new BinTree(); + int numHashBytes = 4; + if (_matchFinderType == EMatchFinderType.BT2) + numHashBytes = 2; + bt.SetType(numHashBytes); + _matchFinder = bt; + } + _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); + + if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) + return; + _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1); + _dictionarySizePrev = _dictionarySize; + _numFastBytesPrev = _numFastBytes; + } + + private void SetWriteEndMarkerMode(bool writeEndMarker) + { + _writeEndMark = writeEndMarker; + } + + private void Init() + { + BaseInit(); + _rangeEncoder.Init(); + + uint i; + for (i = 0; i < Base.kNumStates; i++) + { + for (uint j = 0; j <= _posStateMask; j++) + { + uint complexState = (i << Base.kNumPosStatesBitsMax) + j; + _isMatch[complexState].Init(); + _isRep0Long[complexState].Init(); + } + _isRep[i].Init(); + _isRepG0[i].Init(); + _isRepG1[i].Init(); + _isRepG2[i].Init(); + } + _literalEncoder.Init(); + for (i = 0; i < Base.kNumLenToPosStates; i++) + _posSlotEncoder[i].Init(); + for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) + _posEncoders[i].Init(); + + _lenEncoder.Init((uint)1 << _posStateBits); + _repMatchLenEncoder.Init((uint)1 << _posStateBits); + + _posAlignEncoder.Init(); + + _longestMatchWasFound = false; + _optimumEndIndex = 0; + _optimumCurrentIndex = 0; + _additionalOffset = 0; + } + + private void ReadMatchDistances(out uint lenRes, out uint numDistancePairs) + { + lenRes = 0; + numDistancePairs = _matchFinder.GetMatches(_matchDistances); + if (numDistancePairs > 0) + { + lenRes = _matchDistances[numDistancePairs - 2]; + if (lenRes == _numFastBytes) + { + lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1], + Base.kMatchMaxLen - lenRes); + } + } + _additionalOffset++; + } + + private void MovePos(uint num) + { + if (num > 0) + { + _matchFinder.Skip(num); + _additionalOffset += num; + } + } + + private uint GetRepLen1Price(Base.State state, uint posState) + { + return _isRepG0[state.Index].GetPrice0() + + _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0(); + } + + private uint GetPureRepPrice(uint repIndex, Base.State state, uint posState) + { + uint price; + if (repIndex == 0) + { + price = _isRepG0[state.Index].GetPrice0(); + price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + } + else + { + price = _isRepG0[state.Index].GetPrice1(); + if (repIndex == 1) + price += _isRepG1[state.Index].GetPrice0(); + else + { + price += _isRepG1[state.Index].GetPrice1(); + price += _isRepG2[state.Index].GetPrice(repIndex - 2); + } + } + return price; + } + + private uint GetRepPrice(uint repIndex, uint len, Base.State state, uint posState) + { + uint price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + return price + GetPureRepPrice(repIndex, state, posState); + } + + private uint GetPosLenPrice(uint pos, uint len, uint posState) + { + uint price; + uint lenToPosState = Base.GetLenToPosState(len); + if (pos < Base.kNumFullDistances) + price = _distancesPrices[lenToPosState * Base.kNumFullDistances + pos]; + else + { + price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + + _alignPrices[pos & Base.kAlignMask]; + } + return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + } + + private uint Backward(out uint backRes, uint cur) + { + _optimumEndIndex = cur; + uint posMem = _optimum[cur].PosPrev; + uint backMem = _optimum[cur].BackPrev; + do + { + if (_optimum[cur].Prev1IsChar) + { + _optimum[posMem].MakeAsChar(); + _optimum[posMem].PosPrev = posMem - 1; + if (_optimum[cur].Prev2) + { + _optimum[posMem - 1].Prev1IsChar = false; + _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; + _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; + } + } + uint posPrev = posMem; + uint backCur = backMem; + + backMem = _optimum[posPrev].BackPrev; + posMem = _optimum[posPrev].PosPrev; + + _optimum[posPrev].BackPrev = backCur; + _optimum[posPrev].PosPrev = cur; + cur = posPrev; + } while (cur > 0); + backRes = _optimum[0].BackPrev; + _optimumCurrentIndex = _optimum[0].PosPrev; + return _optimumCurrentIndex; + } + + private uint GetOptimum(uint position, out uint backRes) + { + if (_optimumEndIndex != _optimumCurrentIndex) + { + uint lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; + backRes = _optimum[_optimumCurrentIndex].BackPrev; + _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; + return lenRes; + } + _optimumCurrentIndex = _optimumEndIndex = 0; + + uint lenMain, numDistancePairs; + if (!_longestMatchWasFound) + ReadMatchDistances(out lenMain, out numDistancePairs); + else + { + lenMain = _longestMatchLength; + numDistancePairs = _numDistancePairs; + _longestMatchWasFound = false; + } + + uint numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; + if (numAvailableBytes < 2) + { + backRes = 0xFFFFFFFF; + return 1; + } + if (numAvailableBytes > Base.kMatchMaxLen) + numAvailableBytes = Base.kMatchMaxLen; + + uint repMaxIndex = 0; + uint i; + for (i = 0; i < Base.kNumRepDistances; i++) + { + reps[i] = _repDistances[i]; + repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen); + if (repLens[i] > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= _numFastBytes) + { + backRes = repMaxIndex; + uint lenRes = repLens[repMaxIndex]; + MovePos(lenRes - 1); + return lenRes; + } + + if (lenMain >= _numFastBytes) + { + backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances; + MovePos(lenMain - 1); + return lenMain; + } + + byte currentByte = _matchFinder.GetIndexByte(0 - 1); + byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - 1)); + + if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) + { + backRes = 0xFFFFFFFF; + return 1; + } + + _optimum[0].State = _state; + + uint posState = position & _posStateMask; + + _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, _previousByte) + .GetPrice(!_state.IsCharState(), matchByte, currentByte); + _optimum[1].MakeAsChar(); + + uint matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + uint repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); + + if (matchByte == currentByte) + { + uint shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); + if (shortRepPrice < _optimum[1].Price) + { + _optimum[1].Price = shortRepPrice; + _optimum[1].MakeAsShortRep(); + } + } + + uint lenEnd = lenMain >= repLens[repMaxIndex] ? lenMain : repLens[repMaxIndex]; + + if (lenEnd < 2) + { + backRes = _optimum[1].BackPrev; + return 1; + } + + _optimum[1].PosPrev = 0; + + _optimum[0].Backs0 = reps[0]; + _optimum[0].Backs1 = reps[1]; + _optimum[0].Backs2 = reps[2]; + _optimum[0].Backs3 = reps[3]; + + uint len = lenEnd; + do + { + _optimum[len--].Price = kIfinityPrice; + } while (len >= 2); + + for (i = 0; i < Base.kNumRepDistances; i++) + { + uint repLen = repLens[i]; + if (repLen < 2) + continue; + uint price = repMatchPrice + GetPureRepPrice(i, _state, posState); + do + { + uint curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); + var optimum = _optimum[repLen]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = i; + optimum.Prev1IsChar = false; + } + } while (--repLen >= 2); + } + + uint normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); + + len = repLens[0] >= 2 ? repLens[0] + 1 : 2; + if (len <= lenMain) + { + uint offs = 0; + while (len > _matchDistances[offs]) + offs += 2; + for (;; len++) + { + uint distance = _matchDistances[offs + 1]; + uint curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); + var optimum = _optimum[len]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = distance + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + if (len == _matchDistances[offs]) + { + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + + uint cur = 0; + + while (true) + { + cur++; + if (cur == lenEnd) + return Backward(out backRes, cur); + uint newLen; + ReadMatchDistances(out newLen, out numDistancePairs); + if (newLen >= _numFastBytes) + { + _numDistancePairs = numDistancePairs; + _longestMatchLength = newLen; + _longestMatchWasFound = true; + return Backward(out backRes, cur); + } + position++; + uint posPrev = _optimum[cur].PosPrev; + Base.State state; + if (_optimum[cur].Prev1IsChar) + { + posPrev--; + if (_optimum[cur].Prev2) + { + state = _optimum[_optimum[cur].PosPrev2].State; + if (_optimum[cur].BackPrev2 < Base.kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + else + state = _optimum[posPrev].State; + state.UpdateChar(); + } + else + state = _optimum[posPrev].State; + if (posPrev == cur - 1) + { + if (_optimum[cur].IsShortRep()) + state.UpdateShortRep(); + else + state.UpdateChar(); + } + else + { + uint pos; + if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) + { + posPrev = _optimum[cur].PosPrev2; + pos = _optimum[cur].BackPrev2; + state.UpdateRep(); + } + else + { + pos = _optimum[cur].BackPrev; + if (pos < Base.kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + var opt = _optimum[posPrev]; + if (pos < Base.kNumRepDistances) + { + if (pos == 0) + { + reps[0] = opt.Backs0; + reps[1] = opt.Backs1; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 1) + { + reps[0] = opt.Backs1; + reps[1] = opt.Backs0; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 2) + { + reps[0] = opt.Backs2; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs3; + } + else + { + reps[0] = opt.Backs3; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + else + { + reps[0] = pos - Base.kNumRepDistances; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + _optimum[cur].State = state; + _optimum[cur].Backs0 = reps[0]; + _optimum[cur].Backs1 = reps[1]; + _optimum[cur].Backs2 = reps[2]; + _optimum[cur].Backs3 = reps[3]; + uint curPrice = _optimum[cur].Price; + + currentByte = _matchFinder.GetIndexByte(0 - 1); + matchByte = _matchFinder.GetIndexByte((int)(0 - reps[0] - 1 - 1)); + + posState = position & _posStateMask; + + uint curAnd1Price = curPrice + + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). + GetPrice(!state.IsCharState(), matchByte, currentByte); + + var nextOptimum = _optimum[cur + 1]; + + bool nextIsChar = false; + if (curAnd1Price < nextOptimum.Price) + { + nextOptimum.Price = curAnd1Price; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsChar(); + nextIsChar = true; + } + + matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); + + if (matchByte == currentByte && + !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) + { + uint shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); + if (shortRepPrice <= nextOptimum.Price) + { + nextOptimum.Price = shortRepPrice; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsShortRep(); + nextIsChar = true; + } + } + + uint numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; + numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull); + numAvailableBytes = numAvailableBytesFull; + + if (numAvailableBytes < 2) + continue; + if (numAvailableBytes > _numFastBytes) + numAvailableBytes = _numFastBytes; + if (!nextIsChar && matchByte != currentByte) + { + // try Literal + rep0 + uint t = Math.Min(numAvailableBytesFull - 1, _numFastBytes); + uint lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); + if (lenTest2 >= 2) + { + var state2 = state; + state2.UpdateChar(); + uint posStateNext = (position + 1) & _posStateMask; + uint nextRepMatchPrice = curAnd1Price + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1() + + _isRep[state2.Index].GetPrice1(); + { + uint offset = cur + 1 + lenTest2; + while (lenEnd < offset) + _optimum[++lenEnd].Price = kIfinityPrice; + uint curAndLenPrice = nextRepMatchPrice + GetRepPrice( + 0, lenTest2, state2, posStateNext); + var optimum = _optimum[offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = false; + } + } + } + } + + uint startLen = 2; // speed optimization + + for (uint repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++) + { + uint lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); + if (lenTest < 2) + continue; + uint lenTestTemp = lenTest; + do + { + while (lenEnd < cur + lenTest) + _optimum[++lenEnd].Price = kIfinityPrice; + uint curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); + var optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = repIndex; + optimum.Prev1IsChar = false; + } + } while (--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + // if (_maxMode) + if (lenTest < numAvailableBytesFull) + { + uint t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + uint lenTest2 = _matchFinder.GetMatchLen((int)lenTest, reps[repIndex], t); + if (lenTest2 >= 2) + { + var state2 = state; + state2.UpdateRep(); + uint posStateNext = (position + lenTest) & _posStateMask; + uint curAndLenCharPrice = + repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte((int)lenTest - 1 - 1)).GetPrice(true, + _matchFinder.GetIndexByte((int)lenTest - 1 - (int)(reps[repIndex] + 1)), + _matchFinder.GetIndexByte((int)lenTest - 1)); + state2.UpdateChar(); + posStateNext = (position + lenTest + 1) & _posStateMask; + uint nextMatchPrice = curAndLenCharPrice + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); + uint nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); + + // for(; lenTest2 >= 2; lenTest2--) + { + uint offset = lenTest + 1 + lenTest2; + while (lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + uint curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + var optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = repIndex; + } + } + } + } + } + + if (newLen > numAvailableBytes) + { + newLen = numAvailableBytes; + for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; + _matchDistances[numDistancePairs] = newLen; + numDistancePairs += 2; + } + if (newLen >= startLen) + { + normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); + while (lenEnd < cur + newLen) + _optimum[++lenEnd].Price = kIfinityPrice; + + uint offs = 0; + while (startLen > _matchDistances[offs]) + offs += 2; + + for (uint lenTest = startLen;; lenTest++) + { + uint curBack = _matchDistances[offs + 1]; + uint curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); + var optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = curBack + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + + if (lenTest == _matchDistances[offs]) + { + if (lenTest < numAvailableBytesFull) + { + uint t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + uint lenTest2 = _matchFinder.GetMatchLen((int)lenTest, curBack, t); + if (lenTest2 >= 2) + { + var state2 = state; + state2.UpdateMatch(); + uint posStateNext = (position + lenTest) & _posStateMask; + uint curAndLenCharPrice = curAndLenPrice + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte((int)lenTest - 1 - 1)). + GetPrice(true, + _matchFinder.GetIndexByte((int)lenTest - (int)(curBack + 1) - 1), + _matchFinder.GetIndexByte((int)lenTest - 1)); + state2.UpdateChar(); + posStateNext = (position + lenTest + 1) & _posStateMask; + uint nextMatchPrice = curAndLenCharPrice + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); + uint nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); + + uint offset = lenTest + 1 + lenTest2; + while (lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = curBack + Base.kNumRepDistances; + } + } + } + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + } + } + + private bool ChangePair(uint smallDist, uint bigDist) + { + const int kDif = 7; + return smallDist < (uint)1 << (32 - kDif) && bigDist >= smallDist << kDif; + } + + private void WriteEndMarker(uint posState) + { + if (!_writeEndMark) + return; + + _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1); + _isRep[_state.Index].Encode(_rangeEncoder, 0); + _state.UpdateMatch(); + uint len = Base.kMatchMinLen; + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + uint posSlot = (1 << Base.kNumPosSlotBits) - 1; + uint lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + int footerBits = 30; + uint posReduced = ((uint)1 << footerBits) - 1; + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + } + + private void Flush(uint nowPos) + { + ReleaseMFStream(); + WriteEndMarker(nowPos & _posStateMask); + _rangeEncoder.FlushData(); + _rangeEncoder.FlushStream(); + } + + public void CodeOneBlock(out long inSize, out long outSize, out bool finished) + { + inSize = 0; + outSize = 0; + finished = true; + + if (_inStream != null) + { + _matchFinder.SetStream(_inStream); + _matchFinder.Init(); + _needReleaseMFStream = true; + _inStream = null; + if (_trainSize > 0) + _matchFinder.Skip(_trainSize); + } + + if (_finished) + return; + _finished = true; + + + long progressPosValuePrev = nowPos64; + if (nowPos64 == 0) + { + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((uint)nowPos64); + return; + } + uint len, numDistancePairs; // it's not used + ReadMatchDistances(out len, out numDistancePairs); + uint posState = (uint)nowPos64 & _posStateMask; + _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); + _state.UpdateChar(); + byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); + _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte).Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _additionalOffset--; + nowPos64++; + } + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((uint)nowPos64); + return; + } + while (true) + { + uint pos; + uint len = GetOptimum((uint)nowPos64, out pos); + + uint posState = (uint)nowPos64 & _posStateMask; + uint complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState; + if (len == 1 && pos == 0xFFFFFFFF) + { + _isMatch[complexState].Encode(_rangeEncoder, 0); + byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); + var subCoder = _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte); + if (!_state.IsCharState()) + { + byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - _additionalOffset)); + subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); + } + else + subCoder.Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _state.UpdateChar(); + } + else + { + _isMatch[complexState].Encode(_rangeEncoder, 1); + if (pos < Base.kNumRepDistances) + { + _isRep[_state.Index].Encode(_rangeEncoder, 1); + if (pos == 0) + { + _isRepG0[_state.Index].Encode(_rangeEncoder, 0); + if (len == 1) + _isRep0Long[complexState].Encode(_rangeEncoder, 0); + else + _isRep0Long[complexState].Encode(_rangeEncoder, 1); + } + else + { + _isRepG0[_state.Index].Encode(_rangeEncoder, 1); + if (pos == 1) + _isRepG1[_state.Index].Encode(_rangeEncoder, 0); + else + { + _isRepG1[_state.Index].Encode(_rangeEncoder, 1); + _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2); + } + } + if (len == 1) + _state.UpdateShortRep(); + else + { + _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + _state.UpdateRep(); + } + uint distance = _repDistances[pos]; + if (pos != 0) + { + for (uint i = pos; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + } + } + else + { + _isRep[_state.Index].Encode(_rangeEncoder, 0); + _state.UpdateMatch(); + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + pos -= Base.kNumRepDistances; + uint posSlot = GetPosSlot(pos); + uint lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + + if (posSlot >= Base.kStartPosModelIndex) + { + int footerBits = (int)((posSlot >> 1) - 1); + uint baseVal = (2 | (posSlot & 1)) << footerBits; + uint posReduced = pos - baseVal; + + if (posSlot < Base.kEndPosModelIndex) + { + BitTreeEncoder.ReverseEncode(_posEncoders, + baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); + } + else + { + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + _alignPriceCount++; + } + } + uint distance = pos; + for (uint i = Base.kNumRepDistances - 1; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + _matchPriceCount++; + } + _previousByte = _matchFinder.GetIndexByte((int)(len - 1 - _additionalOffset)); + } + _additionalOffset -= len; + nowPos64 += len; + if (_additionalOffset == 0) + { + // if (!_fastMode) + if (_matchPriceCount >= 1 << 7) + FillDistancesPrices(); + if (_alignPriceCount >= Base.kAlignTableSize) + FillAlignPrices(); + inSize = nowPos64; + outSize = _rangeEncoder.GetProcessedSizeAdd(); + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((uint)nowPos64); + return; + } + + if (nowPos64 - progressPosValuePrev >= 1 << 12) + { + _finished = false; + finished = false; + return; + } + } + } + } + + private void ReleaseMFStream() + { + if (_matchFinder != null && _needReleaseMFStream) + { + _matchFinder.ReleaseStream(); + _needReleaseMFStream = false; + } + } + + private void SetOutStream(Stream outStream) + { + _rangeEncoder.SetStream(outStream); + } + + private void ReleaseOutStream() + { + _rangeEncoder.ReleaseStream(); + } + + private void ReleaseStreams() + { + ReleaseMFStream(); + ReleaseOutStream(); + } + + private void SetStreams(Stream inStream, Stream outStream, + long inSize, long outSize) + { + _inStream = inStream; + _finished = false; + Create(); + SetOutStream(outStream); + Init(); + + // if (!_fastMode) + { + FillDistancesPrices(); + FillAlignPrices(); + } + + _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _lenEncoder.UpdateTables((uint)1 << _posStateBits); + _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _repMatchLenEncoder.UpdateTables((uint)1 << _posStateBits); + + nowPos64 = 0; + } + + private void FillDistancesPrices() + { + for (uint i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++) + { + uint posSlot = GetPosSlot(i); + int footerBits = (int)((posSlot >> 1) - 1); + uint baseVal = (2 | (posSlot & 1)) << footerBits; + tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, + baseVal - posSlot - 1, footerBits, i - baseVal); + } + + for (uint lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++) + { + uint posSlot; + var encoder = _posSlotEncoder[lenToPosState]; + + uint st = lenToPosState << Base.kNumPosSlotBits; + for (posSlot = 0; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); + for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] += ((posSlot >> 1) - 1 - Base.kNumAlignBits) << BitEncoder.kNumBitPriceShiftBits; + + uint st2 = lenToPosState * Base.kNumFullDistances; + uint i; + for (i = 0; i < Base.kStartPosModelIndex; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + i]; + for (; i < Base.kNumFullDistances; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; + } + _matchPriceCount = 0; + } + + private void FillAlignPrices() + { + for (uint i = 0; i < Base.kAlignTableSize; i++) + _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); + _alignPriceCount = 0; + } + + private static int FindMatchFinder(string s) + { + for (int m = 0; m < kMatchFinderIDs.Length; m++) + { + if (s == kMatchFinderIDs[m]) + return m; + } + return -1; + } + + public void SetTrainSize(uint trainSize) + { + _trainSize = trainSize; + } + + private enum EMatchFinderType + { + BT2, + BT4 + } + + private class LiteralEncoder + { + private Encoder2[] m_Coders; + private int m_NumPosBits; + private int m_NumPrevBits; + private uint m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = ((uint)1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Encoder2[numStates]; + for (uint i = 0; i < numStates; i++) + m_Coders[i].Create(); + } + + public void Init() + { + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + for (uint i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + public Encoder2 GetSubCoder(uint pos, byte prevByte) + { + return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; + } + + public struct Encoder2 + { + private BitEncoder[] m_Encoders; + + public void Create() + { + m_Encoders = new BitEncoder[0x300]; + } + + public void Init() + { + for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); + } + + public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol) + { + uint context = 1; + for (int i = 7; i >= 0; i--) + { + uint bit = (uint)((symbol >> i) & 1); + m_Encoders[context].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + } + + public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) + { + uint context = 1; + bool same = true; + for (int i = 7; i >= 0; i--) + { + uint bit = (uint)((symbol >> i) & 1); + uint state = context; + if (same) + { + uint matchBit = (uint)((matchByte >> i) & 1); + state += (1 + matchBit) << 8; + same = matchBit == bit; + } + m_Encoders[state].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + } + + public uint GetPrice(bool matchMode, byte matchByte, byte symbol) + { + uint price = 0; + uint context = 1; + int i = 7; + if (matchMode) + { + for (; i >= 0; i--) + { + uint matchBit = (uint)(matchByte >> i) & 1; + uint bit = (uint)(symbol >> i) & 1; + price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit); + context = (context << 1) | bit; + if (matchBit != bit) + { + i--; + break; + } + } + } + for (; i >= 0; i--) + { + uint bit = (uint)(symbol >> i) & 1; + price += m_Encoders[context].GetPrice(bit); + context = (context << 1) | bit; + } + return price; + } + } + } + + private class LenEncoder + { + private readonly BitTreeEncoder[] _lowCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + private readonly BitTreeEncoder[] _midCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + private BitEncoder _choice = new BitEncoder(); + private BitEncoder _choice2 = new BitEncoder(); + private BitTreeEncoder _highCoder = new BitTreeEncoder(Base.kNumHighLenBits); + + public LenEncoder() + { + for (uint posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++) + { + _lowCoder[posState] = new BitTreeEncoder(Base.kNumLowLenBits); + _midCoder[posState] = new BitTreeEncoder(Base.kNumMidLenBits); + } + } + + public void Init(uint numPosStates) + { + _choice.Init(); + _choice2.Init(); + for (uint posState = 0; posState < numPosStates; posState++) + { + _lowCoder[posState].Init(); + _midCoder[posState].Init(); + } + _highCoder.Init(); + } + + public void Encode(RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) + { + if (symbol < Base.kNumLowLenSymbols) + { + _choice.Encode(rangeEncoder, 0); + _lowCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + symbol -= Base.kNumLowLenSymbols; + _choice.Encode(rangeEncoder, 1); + if (symbol < Base.kNumMidLenSymbols) + { + _choice2.Encode(rangeEncoder, 0); + _midCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + _choice2.Encode(rangeEncoder, 1); + _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols); + } + } + } + + public void SetPrices(uint posState, uint numSymbols, uint[] prices, uint st) + { + uint a0 = _choice.GetPrice0(); + uint a1 = _choice.GetPrice1(); + uint b0 = a1 + _choice2.GetPrice0(); + uint b1 = a1 + _choice2.GetPrice1(); + uint i = 0; + for (i = 0; i < Base.kNumLowLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); + } + for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols); + } + for (; i < numSymbols; i++) + prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); + } + } + + private class LenPriceTableEncoder : LenEncoder + { + private readonly uint[] _counters = new uint[Base.kNumPosStatesEncodingMax]; + private readonly uint[] _prices = new uint[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax]; + private uint _tableSize; + + public void SetTableSize(uint tableSize) + { + _tableSize = tableSize; + } + + public uint GetPrice(uint symbol, uint posState) + { + return _prices[posState * Base.kNumLenSymbols + symbol]; + } + + private void UpdateTable(uint posState) + { + SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols); + _counters[posState] = _tableSize; + } + + public void UpdateTables(uint numPosStates) + { + for (uint posState = 0; posState < numPosStates; posState++) + UpdateTable(posState); + } + + public new void Encode(RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) + { + base.Encode(rangeEncoder, symbol, posState); + if (--_counters[posState] == 0) + UpdateTable(posState); + } + } + + private class Optimal + { + public uint BackPrev; + public uint BackPrev2; + public uint Backs0; + public uint Backs1; + public uint Backs2; + public uint Backs3; + public uint PosPrev; + public uint PosPrev2; + public bool Prev1IsChar; + public bool Prev2; + public uint Price; + public Base.State State; + + public void MakeAsChar() + { + BackPrev = 0xFFFFFFFF; + Prev1IsChar = false; + } + + public void MakeAsShortRep() + { + BackPrev = 0; + ; + Prev1IsChar = false; + } + + public bool IsShortRep() + { + return BackPrev == 0; + } + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs index f586876..0d8d782 100644 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs +++ b/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs @@ -27,229 +27,227 @@ namespace Rant.Core.IO.Compression.RangeCoder { - internal class Encoder - { - public const uint kTopValue = 1 << 24; - private byte _cache; - private uint _cacheSize; - public ulong Low; - public uint Range; - private long StartPosition; - private Stream Stream; - - public void SetStream(Stream stream) - { - Stream = stream; - } - - public void ReleaseStream() - { - Stream = null; - } - - public void Init() - { - StartPosition = Stream.Position; - - Low = 0; - Range = 0xFFFFFFFF; - _cacheSize = 1; - _cache = 0; - } - - public void FlushData() - { - for (int i = 0; i < 5; i++) - ShiftLow(); - } - - public void FlushStream() - { - Stream.Flush(); - } - - public void CloseStream() - { - Stream.Close(); - } - - public void Encode(uint start, uint size, uint total) - { - Low += start * (Range /= total); - Range *= size; - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - public void ShiftLow() - { - if ((uint)Low < 0xFF000000 || (uint)(Low >> 32) == 1) - { - byte temp = _cache; - do - { - Stream.WriteByte((byte)(temp + (Low >> 32))); - temp = 0xFF; - } while (--_cacheSize != 0); - _cache = (byte)((uint)Low >> 24); - } - _cacheSize++; - Low = (uint)Low << 8; - } - - public void EncodeDirectBits(uint v, int numTotalBits) - { - for (int i = numTotalBits - 1; i >= 0; i--) - { - Range >>= 1; - if (((v >> i) & 1) == 1) - Low += Range; - if (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - } - - public void EncodeBit(uint size0, int numTotalBits, uint symbol) - { - uint newBound = (Range >> numTotalBits) * size0; - if (symbol == 0) - { - Range = newBound; - } - else - { - Low += newBound; - Range -= newBound; - } - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - public long GetProcessedSizeAdd() - { - return _cacheSize + - Stream.Position - StartPosition + 4; - // (long)Stream.GetProcessedSize(); - } - } - - internal class Decoder - { - public const uint kTopValue = 1 << 24; - public uint Code; - public uint Range; - // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16); - public Stream Stream; - - public void Init(Stream stream) - { - // Stream.Init(stream); - Stream = stream; - - Code = 0; - Range = 0xFFFFFFFF; - for (int i = 0; i < 5; i++) - Code = (Code << 8) | (byte)Stream.ReadByte(); - } - - public void ReleaseStream() - { - // Stream.ReleaseStream(); - Stream = null; - } - - public void CloseStream() - { - Stream.Close(); - } - - public void Normalize() - { - while (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - } - - public void Normalize2() - { - if (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - } - - public uint GetThreshold(uint total) - { - return Code / (Range /= total); - } - - public void Decode(uint start, uint size, uint total) - { - Code -= start * Range; - Range *= size; - Normalize(); - } - - public uint DecodeDirectBits(int numTotalBits) - { - uint range = Range; - uint code = Code; - uint result = 0; - for (int i = numTotalBits; i > 0; i--) - { - range >>= 1; - /* - result <<= 1; - if (code >= range) - { - code -= range; - result |= 1; - } - */ - uint t = (code - range) >> 31; - code -= range & (t - 1); - result = (result << 1) | (1 - t); - - if (range < kTopValue) - { - code = (code << 8) | (byte)Stream.ReadByte(); - range <<= 8; - } - } - Range = range; - Code = code; - return result; - } - - public uint DecodeBit(uint size0, int numTotalBits) - { - uint newBound = (Range >> numTotalBits) * size0; - uint symbol; - if (Code < newBound) - { - symbol = 0; - Range = newBound; - } - else - { - symbol = 1; - Code -= newBound; - Range -= newBound; - } - Normalize(); - return symbol; - } - } + internal class Encoder + { + public const uint kTopValue = 1 << 24; + private byte _cache; + private uint _cacheSize; + public ulong Low; + public uint Range; + private long StartPosition; + private Stream Stream; + + public void SetStream(Stream stream) + { + Stream = stream; + } + + public void ReleaseStream() + { + Stream = null; + } + + public void Init() + { + StartPosition = Stream.Position; + + Low = 0; + Range = 0xFFFFFFFF; + _cacheSize = 1; + _cache = 0; + } + + public void FlushData() + { + for (int i = 0; i < 5; i++) + ShiftLow(); + } + + public void FlushStream() + { + Stream.Flush(); + } + + public void CloseStream() + { + Stream.Close(); + } + + public void Encode(uint start, uint size, uint total) + { + Low += start * (Range /= total); + Range *= size; + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + public void ShiftLow() + { + if ((uint)Low < 0xFF000000 || (uint)(Low >> 32) == 1) + { + byte temp = _cache; + do + { + Stream.WriteByte((byte)(temp + (Low >> 32))); + temp = 0xFF; + } while (--_cacheSize != 0); + _cache = (byte)((uint)Low >> 24); + } + _cacheSize++; + Low = (uint)Low << 8; + } + + public void EncodeDirectBits(uint v, int numTotalBits) + { + for (int i = numTotalBits - 1; i >= 0; i--) + { + Range >>= 1; + if (((v >> i) & 1) == 1) + Low += Range; + if (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + } + + public void EncodeBit(uint size0, int numTotalBits, uint symbol) + { + uint newBound = (Range >> numTotalBits) * size0; + if (symbol == 0) + Range = newBound; + else + { + Low += newBound; + Range -= newBound; + } + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + public long GetProcessedSizeAdd() + { + return _cacheSize + + Stream.Position - StartPosition + 4; + // (long)Stream.GetProcessedSize(); + } + } + + internal class Decoder + { + public const uint kTopValue = 1 << 24; + public uint Code; + public uint Range; + // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16); + public Stream Stream; + + public void Init(Stream stream) + { + // Stream.Init(stream); + Stream = stream; + + Code = 0; + Range = 0xFFFFFFFF; + for (int i = 0; i < 5; i++) + Code = (Code << 8) | (byte)Stream.ReadByte(); + } + + public void ReleaseStream() + { + // Stream.ReleaseStream(); + Stream = null; + } + + public void CloseStream() + { + Stream.Close(); + } + + public void Normalize() + { + while (Range < kTopValue) + { + Code = (Code << 8) | (byte)Stream.ReadByte(); + Range <<= 8; + } + } + + public void Normalize2() + { + if (Range < kTopValue) + { + Code = (Code << 8) | (byte)Stream.ReadByte(); + Range <<= 8; + } + } + + public uint GetThreshold(uint total) + { + return Code / (Range /= total); + } + + public void Decode(uint start, uint size, uint total) + { + Code -= start * Range; + Range *= size; + Normalize(); + } + + public uint DecodeDirectBits(int numTotalBits) + { + uint range = Range; + uint code = Code; + uint result = 0; + for (int i = numTotalBits; i > 0; i--) + { + range >>= 1; + /* + result <<= 1; + if (code >= range) + { + code -= range; + result |= 1; + } + */ + uint t = (code - range) >> 31; + code -= range & (t - 1); + result = (result << 1) | (1 - t); + + if (range < kTopValue) + { + code = (code << 8) | (byte)Stream.ReadByte(); + range <<= 8; + } + } + Range = range; + Code = code; + return result; + } + + public uint DecodeBit(uint size0, int numTotalBits) + { + uint newBound = (Range >> numTotalBits) * size0; + uint symbol; + if (Code < newBound) + { + symbol = 0; + Range = newBound; + } + else + { + symbol = 1; + Code -= newBound; + Range -= newBound; + } + Normalize(); + return symbol; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs index ee2a926..14618da 100644 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs +++ b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs @@ -25,124 +25,126 @@ namespace Rant.Core.IO.Compression.RangeCoder { - internal struct BitEncoder - { - public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; - private const int kNumMoveBits = 5; - private const int kNumMoveReducingBits = 2; - public const int kNumBitPriceShiftBits = 6; - private static readonly uint[] ProbPrices = new uint[kBitModelTotal >> kNumMoveReducingBits]; - private uint Prob; + internal struct BitEncoder + { + public const int kNumBitModelTotalBits = 11; + public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; + private const int kNumMoveBits = 5; + private const int kNumMoveReducingBits = 2; + public const int kNumBitPriceShiftBits = 6; + private static readonly uint[] ProbPrices = new uint[kBitModelTotal >> kNumMoveReducingBits]; + private uint Prob; - static BitEncoder() - { - const int kNumBits = kNumBitModelTotalBits - kNumMoveReducingBits; - for (int i = kNumBits - 1; i >= 0; i--) - { - uint start = (uint)1 << (kNumBits - i - 1); - uint end = (uint)1 << (kNumBits - i); - for (uint j = start; j < end; j++) - ProbPrices[j] = ((uint)i << kNumBitPriceShiftBits) + - (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); - } - } + static BitEncoder() + { + const int kNumBits = kNumBitModelTotalBits - kNumMoveReducingBits; + for (int i = kNumBits - 1; i >= 0; i--) + { + uint start = (uint)1 << (kNumBits - i - 1); + uint end = (uint)1 << (kNumBits - i); + for (uint j = start; j < end; j++) + { + ProbPrices[j] = ((uint)i << kNumBitPriceShiftBits) + + (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); + } + } + } - public void Init() - { - Prob = kBitModelTotal >> 1; - } + public void Init() + { + Prob = kBitModelTotal >> 1; + } - public void UpdateModel(uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - else - Prob -= Prob >> kNumMoveBits; - } + public void UpdateModel(uint symbol) + { + if (symbol == 0) + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + else + Prob -= Prob >> kNumMoveBits; + } - public void Encode(Encoder encoder, uint symbol) - { - // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol); - // UpdateModel(symbol); - uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob; - if (symbol == 0) - { - encoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - } - else - { - encoder.Low += newBound; - encoder.Range -= newBound; - Prob -= Prob >> kNumMoveBits; - } - if (encoder.Range < Encoder.kTopValue) - { - encoder.Range <<= 8; - encoder.ShiftLow(); - } - } + public void Encode(Encoder encoder, uint symbol) + { + // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol); + // UpdateModel(symbol); + uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob; + if (symbol == 0) + { + encoder.Range = newBound; + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + } + else + { + encoder.Low += newBound; + encoder.Range -= newBound; + Prob -= Prob >> kNumMoveBits; + } + if (encoder.Range < Encoder.kTopValue) + { + encoder.Range <<= 8; + encoder.ShiftLow(); + } + } - public uint GetPrice(uint symbol) - { - return ProbPrices[(((Prob - symbol) ^ -(int)symbol) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; - } + public uint GetPrice(uint symbol) + { + return ProbPrices[(((Prob - symbol) ^ -(int)symbol) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; + } - public uint GetPrice0() - { - return ProbPrices[Prob >> kNumMoveReducingBits]; - } + public uint GetPrice0() + { + return ProbPrices[Prob >> kNumMoveReducingBits]; + } - public uint GetPrice1() - { - return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; - } - } + public uint GetPrice1() + { + return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; + } + } - internal struct BitDecoder - { - public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; - private const int kNumMoveBits = 5; - private uint Prob; + internal struct BitDecoder + { + public const int kNumBitModelTotalBits = 11; + public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; + private const int kNumMoveBits = 5; + private uint Prob; - public void UpdateModel(int numMoveBits, uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> numMoveBits; - else - Prob -= Prob >> numMoveBits; - } + public void UpdateModel(int numMoveBits, uint symbol) + { + if (symbol == 0) + Prob += (kBitModelTotal - Prob) >> numMoveBits; + else + Prob -= Prob >> numMoveBits; + } - public void Init() - { - Prob = kBitModelTotal >> 1; - } + public void Init() + { + Prob = kBitModelTotal >> 1; + } - public uint Decode(Decoder rangeDecoder) - { - uint newBound = (rangeDecoder.Range >> kNumBitModelTotalBits) * Prob; - if (rangeDecoder.Code < newBound) - { - rangeDecoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - if (rangeDecoder.Range < Decoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 0; - } - rangeDecoder.Range -= newBound; - rangeDecoder.Code -= newBound; - Prob -= Prob >> kNumMoveBits; - if (rangeDecoder.Range < Decoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 1; - } - } + public uint Decode(Decoder rangeDecoder) + { + uint newBound = (rangeDecoder.Range >> kNumBitModelTotalBits) * Prob; + if (rangeDecoder.Code < newBound) + { + rangeDecoder.Range = newBound; + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + if (rangeDecoder.Range < Decoder.kTopValue) + { + rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); + rangeDecoder.Range <<= 8; + } + return 0; + } + rangeDecoder.Range -= newBound; + rangeDecoder.Code -= newBound; + Prob -= Prob >> kNumMoveBits; + if (rangeDecoder.Range < Decoder.kTopValue) + { + rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); + rangeDecoder.Range <<= 8; + } + return 1; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs index 392dfb5..e27ce71 100644 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs +++ b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs @@ -25,156 +25,156 @@ namespace Rant.Core.IO.Compression.RangeCoder { - internal struct BitTreeEncoder - { - private readonly BitEncoder[] Models; - private readonly int NumBitLevels; - - public BitTreeEncoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new BitEncoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < 1 << NumBitLevels; i++) - Models[i].Init(); - } - - public void Encode(Encoder rangeEncoder, uint symbol) - { - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0;) - { - bitIndex--; - uint bit = (symbol >> bitIndex) & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - } - } - - public void ReverseEncode(Encoder rangeEncoder, uint symbol) - { - uint m = 1; - for (uint i = 0; i < NumBitLevels; i++) - { - uint bit = symbol & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - - public uint GetPrice(uint symbol) - { - uint price = 0; - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0;) - { - bitIndex--; - uint bit = (symbol >> bitIndex) & 1; - price += Models[m].GetPrice(bit); - m = (m << 1) + bit; - } - return price; - } - - public uint ReverseGetPrice(uint symbol) - { - uint price = 0; - uint m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - uint bit = symbol & 1; - symbol >>= 1; - price += Models[m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static uint ReverseGetPrice(BitEncoder[] Models, uint startIndex, - int NumBitLevels, uint symbol) - { - uint price = 0; - uint m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - uint bit = symbol & 1; - symbol >>= 1; - price += Models[startIndex + m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static void ReverseEncode(BitEncoder[] Models, uint startIndex, - Encoder rangeEncoder, int NumBitLevels, uint symbol) - { - uint m = 1; - for (int i = 0; i < NumBitLevels; i++) - { - uint bit = symbol & 1; - Models[startIndex + m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - } - - internal struct BitTreeDecoder - { - private readonly BitDecoder[] Models; - private readonly int NumBitLevels; - - public BitTreeDecoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new BitDecoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < 1 << NumBitLevels; i++) - Models[i].Init(); - } - - public uint Decode(Decoder rangeDecoder) - { - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--) - m = (m << 1) + Models[m].Decode(rangeDecoder); - return m - ((uint)1 << NumBitLevels); - } - - public uint ReverseDecode(Decoder rangeDecoder) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= bit << bitIndex; - } - return symbol; - } - - public static uint ReverseDecode(BitDecoder[] Models, uint startIndex, - Decoder rangeDecoder, int NumBitLevels) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[startIndex + m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= bit << bitIndex; - } - return symbol; - } - } + internal struct BitTreeEncoder + { + private readonly BitEncoder[] Models; + private readonly int NumBitLevels; + + public BitTreeEncoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new BitEncoder[1 << numBitLevels]; + } + + public void Init() + { + for (uint i = 1; i < 1 << NumBitLevels; i++) + Models[i].Init(); + } + + public void Encode(Encoder rangeEncoder, uint symbol) + { + uint m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0;) + { + bitIndex--; + uint bit = (symbol >> bitIndex) & 1; + Models[m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + } + } + + public void ReverseEncode(Encoder rangeEncoder, uint symbol) + { + uint m = 1; + for (uint i = 0; i < NumBitLevels; i++) + { + uint bit = symbol & 1; + Models[m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } + + public uint GetPrice(uint symbol) + { + uint price = 0; + uint m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0;) + { + bitIndex--; + uint bit = (symbol >> bitIndex) & 1; + price += Models[m].GetPrice(bit); + m = (m << 1) + bit; + } + return price; + } + + public uint ReverseGetPrice(uint symbol) + { + uint price = 0; + uint m = 1; + for (int i = NumBitLevels; i > 0; i--) + { + uint bit = symbol & 1; + symbol >>= 1; + price += Models[m].GetPrice(bit); + m = (m << 1) | bit; + } + return price; + } + + public static uint ReverseGetPrice(BitEncoder[] Models, uint startIndex, + int NumBitLevels, uint symbol) + { + uint price = 0; + uint m = 1; + for (int i = NumBitLevels; i > 0; i--) + { + uint bit = symbol & 1; + symbol >>= 1; + price += Models[startIndex + m].GetPrice(bit); + m = (m << 1) | bit; + } + return price; + } + + public static void ReverseEncode(BitEncoder[] Models, uint startIndex, + Encoder rangeEncoder, int NumBitLevels, uint symbol) + { + uint m = 1; + for (int i = 0; i < NumBitLevels; i++) + { + uint bit = symbol & 1; + Models[startIndex + m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } + } + + internal struct BitTreeDecoder + { + private readonly BitDecoder[] Models; + private readonly int NumBitLevels; + + public BitTreeDecoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new BitDecoder[1 << numBitLevels]; + } + + public void Init() + { + for (uint i = 1; i < 1 << NumBitLevels; i++) + Models[i].Init(); + } + + public uint Decode(Decoder rangeDecoder) + { + uint m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--) + m = (m << 1) + Models[m].Decode(rangeDecoder); + return m - ((uint)1 << NumBitLevels); + } + + public uint ReverseDecode(Decoder rangeDecoder) + { + uint m = 1; + uint symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + uint bit = Models[m].Decode(rangeDecoder); + m <<= 1; + m += bit; + symbol |= bit << bitIndex; + } + return symbol; + } + + public static uint ReverseDecode(BitDecoder[] Models, uint startIndex, + Decoder rangeDecoder, int NumBitLevels) + { + uint m = 1; + uint symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + uint bit = Models[startIndex + m].Decode(rangeDecoder); + m <<= 1; + m += bit; + symbol |= bit << bitIndex; + } + return symbol; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/EasyReader.cs b/Rant/Core/IO/EasyReader.cs index b305ae6..5d4f4c5 100644 --- a/Rant/Core/IO/EasyReader.cs +++ b/Rant/Core/IO/EasyReader.cs @@ -31,814 +31,816 @@ namespace Rant.Core.IO { - /// - /// Provides comprehensive binary data reading functionality including support for reading arrays and enumeration members. - /// - internal class EasyReader : IDisposable - { - private readonly byte[] _buffer = new byte[128]; - private readonly bool _leaveOpen; - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. - /// - /// The stream from which to read. - /// The endianness of the data to be read. - public EasyReader(Stream stream, Endian defaultEndianness = Endian.Little) - { - BaseStream = stream; - Endianness = defaultEndianness; - _leaveOpen = false; - } - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. - /// - /// The stream from which to read. - /// Specifies whether or not to leave the stream open after the reader is disposed. - /// The endianness of the data to be read. - public EasyReader(Stream stream, bool leaveOpen, Endian defaultEndianness = Endian.Little) - { - BaseStream = stream; - Endianness = defaultEndianness; - _leaveOpen = leaveOpen; - } - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from the specified file path. - /// - /// The path to the file to read. - /// Speficies how the operating system should open the file. - /// The index at which to start reading. - /// The endianness of the data to be read. - public EasyReader(string path, FileMode mode = FileMode.Open, int startIndex = 0, - Endian defaultEndianness = Endian.Little) - { - BaseStream = File.Open(path, mode); - BaseStream.Position = startIndex; - Endianness = defaultEndianness; - _leaveOpen = false; - } - - /// - /// Creates a new instance of the Rant.IO.EasyReader class from a byte array. - /// - /// The byte array to read from. - /// The index at which to start reading. - /// The endianness of the data to be read. - public EasyReader(byte[] data, int startIndex = 0, Endian defaultEndianness = Endian.Little) - { - BaseStream = new MemoryStream(data); - BaseStream.Position = startIndex; - Endianness = defaultEndianness; - } - - /// - /// Gets or sets the endianness in which data is read by the stream. - /// - public Endian Endianness { get; set; } - - /// - /// Returns true if the stream has reached its end. - /// - public bool EndOfStream => BaseStream.Position == BaseStream.Length; - - /// - /// The amount of bytes that are remaining to be read. - /// - public long Remaining => BaseStream.Length - BaseStream.Position; - - /// - /// The length of the stream in bytes. - /// - public long Length => BaseStream.Length; - - /// - /// The underlying stream for this instance. - /// - public Stream BaseStream { get; } - - /// - /// Releases all resources used by the current instance of the Rant.IO.EasyReader class. - /// - void IDisposable.Dispose() - { - if (!_leaveOpen) - BaseStream.Dispose(); - } - - /// - /// Returns the next available byte but does not consume it. - /// - /// - public int Peek() - { - int c = BaseStream.ReadByte(); - BaseStream.Position--; - return c; - } - - /// - /// Reads a single byte. - /// - /// - public byte ReadByte() - { - return (byte)BaseStream.ReadByte(); - } - - /// - /// Reads a single byte. - /// - /// The byte that was read. - /// - public EasyReader ReadByte(out byte value) - { - value = (byte)BaseStream.ReadByte(); - return this; - } - - /// - /// Reads an array of bytes. - /// - /// The number of bytes to read. - /// - public byte[] ReadBytes(int count) - { - var buffer = new byte[count]; - BaseStream.Read(buffer, 0, count); - return buffer; - } - - /// - /// Reads an array of bytes. - /// - /// The number of bytes to read. - /// The bytes that were read. - /// - public EasyReader ReadBytes(int count, out byte[] value) - { - value = new byte[count]; - BaseStream.Read(value, 0, count); - return this; - } - - /// - /// Reads all bytes from the stream. - /// - /// - public byte[] ReadAllBytes() - { - var buffer = new byte[BaseStream.Length]; - BaseStream.Read(buffer, 0, buffer.Length); - return buffer; - } - - /// - /// Reads all bytes from the stream. - /// - /// The bytes from the stream. - public void ReadAllBytes(out byte[] value) - { - value = new byte[BaseStream.Length]; - BaseStream.Read(value, 0, value.Length); - } - - /// - /// Reads a signed byte. - /// - /// - public sbyte ReadSByte() - { - var ib = new IntermediateByte(); - ib.U = (byte)BaseStream.ReadByte(); - return ib.S; - } - - /// - /// Reads a signed byte. - /// - /// The value that was read. - /// - public EasyReader ReadSByte(out sbyte value) - { - var ib = new IntermediateByte(); - ib.U = (byte)BaseStream.ReadByte(); - value = ib.S; - return this; - } - - /// - /// Reads a Unicode character. - /// - /// - public char ReadChar() - { - return BitConverter.ToChar(ReadAndFormat(2), 0); - } - - /// - /// Reads a Unicode character. - /// - /// The character that was read. - /// - public EasyReader ReadChar(out char value) - { - value = BitConverter.ToChar(ReadAndFormat(2), 0); - return this; - } - - /// - /// Reads a 1-byte boolean value. - /// - /// - public bool ReadBoolean() - { - return ReadByte() != 0; - } - - /// - /// Reads a 1-byte boolean value. - /// - /// The boolean value that was read. - /// - public EasyReader ReadBoolean(out bool value) - { - value = ReadByte() != 0; - return this; - } - - /// - /// Reads a 16-bit unsigned integer. - /// - /// - public ushort ReadUInt16() - { - return BitConverter.ToUInt16(ReadAndFormat(2), 0); - } - - /// - /// Reads a 16-bit unsigned integer. - /// - /// The value that was read. - /// - public EasyReader ReadUInt16(out ushort value) - { - value = BitConverter.ToUInt16(ReadAndFormat(2), 0); - return this; - } - - /// - /// Reads a 16-bit signed integer. - /// - /// - public short ReadInt16() - { - return BitConverter.ToInt16(ReadAndFormat(2), 0); - } - - /// - /// Reads a 32-bit unsigned integer. - /// - /// - public uint ReadUInt32() - { - return BitConverter.ToUInt32(ReadAndFormat(4), 0); - } - - /// - /// Reads a 32-bit unsigned integer. - /// - /// The value that was read. - /// - public EasyReader ReadUInt32(out uint value) - { - value = BitConverter.ToUInt32(ReadAndFormat(4), 0); - return this; - } - - /// - /// Reads a 32-bit signed integer. - /// - /// - public int ReadInt32() - { - return BitConverter.ToInt32(ReadAndFormat(4), 0); - } - - /// - /// Reads a 32-bit signed integer. - /// - /// The value that was read. - /// - public EasyReader ReadInt32(out int value) - { - value = BitConverter.ToInt32(ReadAndFormat(4), 0); - return this; - } - - /// - /// Reads a 64-bit unsigned integer. - /// - /// - public ulong ReadUInt64() - { - return BitConverter.ToUInt64(ReadAndFormat(8), 0); - } - - /// - /// Reads a 64-bit unsigned integer. - /// - /// The value that was read. - /// - public EasyReader ReadUInt64(out ulong value) - { - value = BitConverter.ToUInt64(ReadAndFormat(8), 0); - return this; - } - - /// - /// Reads a 64-bit signed integer. - /// - /// - public long ReadInt64() - { - return BitConverter.ToInt64(ReadAndFormat(8), 0); - } - - /// - /// Reads a 64-bit signed integer. - /// - /// The value that was read. - /// - public EasyReader ReadInt64(out long value) - { - value = BitConverter.ToInt64(ReadAndFormat(8), 0); - return this; - } - - /// - /// Reads a single-precision floating point number. - /// - /// - public float ReadSingle() - { - return BitConverter.ToSingle(ReadAndFormat(4), 0); - } - - /// - /// Reads a single-precision floating point number. - /// - /// The value that was read. - /// - public EasyReader ReadSingle(out float value) - { - value = BitConverter.ToSingle(ReadAndFormat(4), 0); - return this; - } - - /// - /// Reads a double-precision floating-point number. - /// - /// - public double ReadDouble() - { - return BitConverter.ToDouble(ReadAndFormat(8), 0); - } - - /// - /// Reads a double-precision floating-point number. - /// - /// The value that was read. - /// - public EasyReader ReadDouble(out double value) - { - value = BitConverter.ToDouble(ReadAndFormat(8), 0); - return this; - } - - /// - /// Reads a 128-bit decimal number. - /// - /// - public decimal ReadDecimal() - { - return ReadStruct(); - } - - /// - /// Reads a 128-bit decimal number. - /// - /// The value that was read. - /// - public EasyReader ReadDecimal(out decimal value) - { - value = ReadStruct(); - return this; - } - - /// - /// Reads a Unicode string. - /// - /// - public string ReadString() - { - int bytes = ReadInt32(); - if (bytes < 0) return null; - return Encoding.Unicode.GetString(ReadBytes(bytes)); - } - - /// - /// Reads a Unicode string. - /// - /// The string that was read. - /// - public EasyReader ReadString(out string value) - { - int bytes = ReadInt32(); - if (bytes < 0) - { - value = null; - return this; - } - value = Encoding.Unicode.GetString(ReadBytes(bytes)); - return this; - } - - /// - /// Reads a string encoded in the specified encoding. - /// - /// The encoding of the string to be read. - /// - public string ReadString(Encoding encoding) - { - int bytes = ReadInt32(); - if (bytes < 0) return null; - return encoding.GetString(ReadBytes(bytes)); - } - - /// - /// Reads a string encoded in the specified encoding. - /// - /// The encoding of the string to be read. - /// The string that was read. - /// - public EasyReader ReadString(Encoding encoding, out string value) - { - int bytes = ReadInt32(); - if (bytes < 0) - { - value = null; - return this; - } - value = encoding.GetString(ReadBytes(bytes)); - return this; - } - - /// - /// Reads a null-terminated string (C-string). - /// - /// The string that was read. - public string ReadCString() - { - var bytes = new List(); - byte c; - while ((c = ReadByte()) != 0x00) - bytes.Add(c); - return Encoding.UTF8.GetString(bytes.ToArray()); - } - - /// - /// Reads an array of Unicode strings. - /// - /// - public string[] ReadStringArray() - { - int length = ReadInt32(); - var array = new string[length]; - for (int i = 0; i < length; i++) - array[i] = ReadString(); - return array; - } - - /// - /// Reads an array of Unicode strings. - /// - /// The array of strings that was read. - /// - public EasyReader ReadStringArray(out string[] value) - { - int length = ReadInt32(); - var array = new string[length]; - for (int i = 0; i < length; i++) - array[i] = ReadString(); - value = array; - return this; - } - - /// - /// Reads a string array encoded in the specified encoding. - /// - /// The encoding of the strings to be read. - /// - public string[] ReadStringArray(Encoding encoding) - { - int length = ReadInt32(); - var array = new string[length]; - for (int i = 0; i < length; i++) - array[i] = ReadString(encoding); - return array; - } - - /// - /// Reads a string array encoded in the specified encoding. - /// - /// The encoding of the strings to be read. - /// The array of strings that was read. - /// - public EasyReader ReadStringArray(Encoding encoding, out string[] value) - { - int length = ReadInt32(); - var array = new string[length]; - for (int i = 0; i < length; i++) - array[i] = ReadString(encoding); - value = array; - return this; - } - - /// - /// Reads an array of the specified value type. - /// - /// The type stored in the array. - /// Indicates to the reader that the array length is 64-bit rather than 32-bit. - /// - public T[] ReadArray(bool use64bit = false) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - long count = use64bit ? ReadInt64() : ReadInt32(); - var array = new T[count]; - for (int i = 0; i < count; i++) - array[i] = ReadStruct(isNumeric); - return array; - } - - /// - /// Reads an array of the specified value type. - /// - /// The type stored in the array. - /// The array that was read. - /// Indicates to the reader that the array length is 64-bit rather than 32-bit. - /// - public EasyReader ReadArray(out T[] value, bool use64bit = false) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - long count = use64bit ? ReadInt64() : ReadInt32(); - var array = new T[count]; - for (int i = 0; i < count; i++) - array[i] = ReadStruct(isNumeric); - value = array; - return this; - } - - /// - /// Reads an array of the specified type and item count. - /// - /// The type stored in the array. - /// The length of the array. - /// - public T[] ReadArray(int length) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - var array = new T[length]; - for (int i = 0; i < length; i++) - array[i] = ReadStruct(isNumeric); - return array; - } - - /// - /// Reads an array of the specified type and item count. - /// - /// The type stored in the array. - /// The length of the array. - /// The array that was read. - /// - public EasyReader ReadArray(int length, out T[] value) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - var array = new T[length]; - for (int i = 0; i < length; i++) - array[i] = ReadStruct(isNumeric); - value = array; - return this; - } - - /// - /// Reads a dictionary of the specified key and value types. - /// - /// The key type of the dictionary. - /// The value type of the dictionary. - /// - public Dictionary ReadDictionary() - where TKey : IConvertible - where TValue : IConvertible - { - var ktype = typeof(TKey); - bool kIsString = ktype == typeof(string); - var vtype = typeof(TValue); - bool vIsString = vtype == typeof(string); - - if (!ktype.IsValueType && !kIsString) - throw new ArgumentException("TKey must be either a value type or System.String."); - if (!vtype.IsValueType && !vIsString) - throw new ArgumentException("TValue must be either a value type or System.String."); - - bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); - bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); - int count = ReadInt32(); - var dict = new Dictionary(count); - TKey key; - TValue value; - for (int i = 0; i < count; i++) - { - if (kIsString) - key = (TKey)(object)ReadString(); - else - key = ReadStruct(isKNumeric); - - if (vIsString) - value = (TValue)(object)ReadString(); - else - value = ReadStruct(isVNumeric); - - dict.Add(key, value); - } - return dict; - } - - /// - /// Reads a dictionary of the specified key and value types. - /// - /// The key type of the dictionary. - /// The value type of the dictionary. - /// The dictionary that was read. - /// - public EasyReader ReadDictionary(out Dictionary value) - where TKey : IConvertible - where TValue : IConvertible - { - value = ReadDictionary(); - return this; - } - - /// - /// Reads an enumeration member. - /// - /// The enumeration type to read. - /// - public TEnum ReadEnum() where TEnum : struct, IConvertible - { - if (!typeof(TEnum).IsEnum) - throw new ArgumentException("T must be an enumerated type."); - byte size = (byte)Marshal.SizeOf(Enum.GetUnderlyingType(typeof(TEnum))); - var data = ReadAndFormat(size); - Array.Resize(ref data, 8); - return (TEnum)Enum.ToObject(typeof(TEnum), BitConverter.ToInt64(data, 0)); - } - - /// - /// Reads an enumeration member. - /// - /// The enumeration type to read. - /// The enumeration member that was read. - /// - public EasyReader ReadEnum(out TEnum value) where TEnum : struct, IConvertible - { - value = ReadEnum(); - return this; - } - - /// - /// Reads a struct of the specified type. - /// - /// The struct to read. - /// - /// - public TStruct ReadStruct(bool convertEndian = true) - { - if (!typeof(TStruct).IsValueType) - throw new ArgumentException("TStruct must be a value type."); - int size = Marshal.SizeOf(typeof(TStruct)); - bool numeric = IOUtil.IsNumericType(typeof(TStruct)); - var data = numeric ? ReadAndFormat(size) : ReadBytes(size); - var ptr = Marshal.AllocHGlobal(size); - Marshal.Copy(data, 0, ptr, size); - var i = (TStruct)Marshal.PtrToStructure(ptr, typeof(TStruct)); - - if (convertEndian) - IOUtil.ConvertStructEndians(ref i); - - Marshal.FreeHGlobal(ptr); - return i; - } - - /// - /// Reads a struct of the specified type. - /// - /// The struct to read. - /// - /// Specifies if struct members marked with the [Endianness(Endian)] attribute should have - /// their endianness converted as necessary. - /// - /// The struct that was read. - /// - public EasyReader ReadStruct(out TStruct value, bool convertEndian = true) - { - value = ReadStruct(convertEndian); - return this; - } - - /// - /// Reads a nullable value. - /// - /// The type of the value to read. - /// - public T? ReadNullable() - where T : struct - { - T? value = null; - bool hasValue = ReadBoolean(); - if (hasValue) - value = ReadStruct(); - return value; - } - - /// - /// Reads a nullable value. - /// - /// The type of the value to read. - /// The nullable value that was read. - /// - public EasyReader ReadNullable(out T? value) where T : struct - { - value = null; - bool hasValue = ReadBoolean(); - if (hasValue) - value = ReadStruct(); - return this; - } - - /// - /// Reads a bit field from the stream. - /// - /// The size of the bit field in bytes. - /// - public BitField ReadBitField(int sizeInBytes) - { - var bf = new BitField(new byte[sizeInBytes]); - BaseStream.Read(bf._field, 0, sizeInBytes); - return bf; - } - - /// - /// Reads a bit field from the stream. - /// - /// The size of the bit field in bytes. - /// The bit field that was read. - /// - public EasyReader ReadBitField(int sizeInBytes, out BitField value) - { - value = new BitField(new byte[sizeInBytes]); - BaseStream.Read(value._field, 0, sizeInBytes); - return this; - } - - private byte[] ReadAndFormat(int count) - { - if (BitConverter.IsLittleEndian != (Endianness == Endian.Little)) - for (int i = 0; i < count; i++) - BaseStream.Read(_buffer, count - i - 1, 1); - else - BaseStream.Read(_buffer, 0, count); - - return _buffer; - } - - /// - /// Closes the reader and the underlying stream. - /// - public void Close() - { - BaseStream.Close(); - } - - [StructLayout(LayoutKind.Explicit)] - private struct IntermediateByte - { - [FieldOffset(0)] - public byte U; - - [FieldOffset(0)] - public readonly sbyte S; - } - } + /// + /// Provides comprehensive binary data reading functionality including support for reading arrays and enumeration members. + /// + internal class EasyReader : IDisposable + { + private readonly byte[] _buffer = new byte[128]; + private readonly bool _leaveOpen; + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. + /// + /// The stream from which to read. + /// The endianness of the data to be read. + public EasyReader(Stream stream, Endian defaultEndianness = Endian.Little) + { + BaseStream = stream; + Endianness = defaultEndianness; + _leaveOpen = false; + } + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from the specified stream. + /// + /// The stream from which to read. + /// Specifies whether or not to leave the stream open after the reader is disposed. + /// The endianness of the data to be read. + public EasyReader(Stream stream, bool leaveOpen, Endian defaultEndianness = Endian.Little) + { + BaseStream = stream; + Endianness = defaultEndianness; + _leaveOpen = leaveOpen; + } + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from the specified file path. + /// + /// The path to the file to read. + /// Speficies how the operating system should open the file. + /// The index at which to start reading. + /// The endianness of the data to be read. + public EasyReader(string path, FileMode mode = FileMode.Open, int startIndex = 0, + Endian defaultEndianness = Endian.Little) + { + BaseStream = File.Open(path, mode); + BaseStream.Position = startIndex; + Endianness = defaultEndianness; + _leaveOpen = false; + } + + /// + /// Creates a new instance of the Rant.IO.EasyReader class from a byte array. + /// + /// The byte array to read from. + /// The index at which to start reading. + /// The endianness of the data to be read. + public EasyReader(byte[] data, int startIndex = 0, Endian defaultEndianness = Endian.Little) + { + BaseStream = new MemoryStream(data); + BaseStream.Position = startIndex; + Endianness = defaultEndianness; + } + + /// + /// Gets or sets the endianness in which data is read by the stream. + /// + public Endian Endianness { get; set; } + + /// + /// Returns true if the stream has reached its end. + /// + public bool EndOfStream => BaseStream.Position == BaseStream.Length; + + /// + /// The amount of bytes that are remaining to be read. + /// + public long Remaining => BaseStream.Length - BaseStream.Position; + + /// + /// The length of the stream in bytes. + /// + public long Length => BaseStream.Length; + + /// + /// The underlying stream for this instance. + /// + public Stream BaseStream { get; } + + /// + /// Releases all resources used by the current instance of the Rant.IO.EasyReader class. + /// + void IDisposable.Dispose() + { + if (!_leaveOpen) + BaseStream.Dispose(); + } + + /// + /// Returns the next available byte but does not consume it. + /// + /// + public int Peek() + { + int c = BaseStream.ReadByte(); + BaseStream.Position--; + return c; + } + + /// + /// Reads a single byte. + /// + /// + public byte ReadByte() + { + return (byte)BaseStream.ReadByte(); + } + + /// + /// Reads a single byte. + /// + /// The byte that was read. + /// + public EasyReader ReadByte(out byte value) + { + value = (byte)BaseStream.ReadByte(); + return this; + } + + /// + /// Reads an array of bytes. + /// + /// The number of bytes to read. + /// + public byte[] ReadBytes(int count) + { + var buffer = new byte[count]; + BaseStream.Read(buffer, 0, count); + return buffer; + } + + /// + /// Reads an array of bytes. + /// + /// The number of bytes to read. + /// The bytes that were read. + /// + public EasyReader ReadBytes(int count, out byte[] value) + { + value = new byte[count]; + BaseStream.Read(value, 0, count); + return this; + } + + /// + /// Reads all bytes from the stream. + /// + /// + public byte[] ReadAllBytes() + { + var buffer = new byte[BaseStream.Length]; + BaseStream.Read(buffer, 0, buffer.Length); + return buffer; + } + + /// + /// Reads all bytes from the stream. + /// + /// The bytes from the stream. + public void ReadAllBytes(out byte[] value) + { + value = new byte[BaseStream.Length]; + BaseStream.Read(value, 0, value.Length); + } + + /// + /// Reads a signed byte. + /// + /// + public sbyte ReadSByte() + { + var ib = new IntermediateByte(); + ib.U = (byte)BaseStream.ReadByte(); + return ib.S; + } + + /// + /// Reads a signed byte. + /// + /// The value that was read. + /// + public EasyReader ReadSByte(out sbyte value) + { + var ib = new IntermediateByte(); + ib.U = (byte)BaseStream.ReadByte(); + value = ib.S; + return this; + } + + /// + /// Reads a Unicode character. + /// + /// + public char ReadChar() + { + return BitConverter.ToChar(ReadAndFormat(2), 0); + } + + /// + /// Reads a Unicode character. + /// + /// The character that was read. + /// + public EasyReader ReadChar(out char value) + { + value = BitConverter.ToChar(ReadAndFormat(2), 0); + return this; + } + + /// + /// Reads a 1-byte boolean value. + /// + /// + public bool ReadBoolean() + { + return ReadByte() != 0; + } + + /// + /// Reads a 1-byte boolean value. + /// + /// The boolean value that was read. + /// + public EasyReader ReadBoolean(out bool value) + { + value = ReadByte() != 0; + return this; + } + + /// + /// Reads a 16-bit unsigned integer. + /// + /// + public ushort ReadUInt16() + { + return BitConverter.ToUInt16(ReadAndFormat(2), 0); + } + + /// + /// Reads a 16-bit unsigned integer. + /// + /// The value that was read. + /// + public EasyReader ReadUInt16(out ushort value) + { + value = BitConverter.ToUInt16(ReadAndFormat(2), 0); + return this; + } + + /// + /// Reads a 16-bit signed integer. + /// + /// + public short ReadInt16() + { + return BitConverter.ToInt16(ReadAndFormat(2), 0); + } + + /// + /// Reads a 32-bit unsigned integer. + /// + /// + public uint ReadUInt32() + { + return BitConverter.ToUInt32(ReadAndFormat(4), 0); + } + + /// + /// Reads a 32-bit unsigned integer. + /// + /// The value that was read. + /// + public EasyReader ReadUInt32(out uint value) + { + value = BitConverter.ToUInt32(ReadAndFormat(4), 0); + return this; + } + + /// + /// Reads a 32-bit signed integer. + /// + /// + public int ReadInt32() + { + return BitConverter.ToInt32(ReadAndFormat(4), 0); + } + + /// + /// Reads a 32-bit signed integer. + /// + /// The value that was read. + /// + public EasyReader ReadInt32(out int value) + { + value = BitConverter.ToInt32(ReadAndFormat(4), 0); + return this; + } + + /// + /// Reads a 64-bit unsigned integer. + /// + /// + public ulong ReadUInt64() + { + return BitConverter.ToUInt64(ReadAndFormat(8), 0); + } + + /// + /// Reads a 64-bit unsigned integer. + /// + /// The value that was read. + /// + public EasyReader ReadUInt64(out ulong value) + { + value = BitConverter.ToUInt64(ReadAndFormat(8), 0); + return this; + } + + /// + /// Reads a 64-bit signed integer. + /// + /// + public long ReadInt64() + { + return BitConverter.ToInt64(ReadAndFormat(8), 0); + } + + /// + /// Reads a 64-bit signed integer. + /// + /// The value that was read. + /// + public EasyReader ReadInt64(out long value) + { + value = BitConverter.ToInt64(ReadAndFormat(8), 0); + return this; + } + + /// + /// Reads a single-precision floating point number. + /// + /// + public float ReadSingle() + { + return BitConverter.ToSingle(ReadAndFormat(4), 0); + } + + /// + /// Reads a single-precision floating point number. + /// + /// The value that was read. + /// + public EasyReader ReadSingle(out float value) + { + value = BitConverter.ToSingle(ReadAndFormat(4), 0); + return this; + } + + /// + /// Reads a double-precision floating-point number. + /// + /// + public double ReadDouble() + { + return BitConverter.ToDouble(ReadAndFormat(8), 0); + } + + /// + /// Reads a double-precision floating-point number. + /// + /// The value that was read. + /// + public EasyReader ReadDouble(out double value) + { + value = BitConverter.ToDouble(ReadAndFormat(8), 0); + return this; + } + + /// + /// Reads a 128-bit decimal number. + /// + /// + public decimal ReadDecimal() + { + return ReadStruct(); + } + + /// + /// Reads a 128-bit decimal number. + /// + /// The value that was read. + /// + public EasyReader ReadDecimal(out decimal value) + { + value = ReadStruct(); + return this; + } + + /// + /// Reads a Unicode string. + /// + /// + public string ReadString() + { + int bytes = ReadInt32(); + if (bytes < 0) return null; + return Encoding.Unicode.GetString(ReadBytes(bytes)); + } + + /// + /// Reads a Unicode string. + /// + /// The string that was read. + /// + public EasyReader ReadString(out string value) + { + int bytes = ReadInt32(); + if (bytes < 0) + { + value = null; + return this; + } + value = Encoding.Unicode.GetString(ReadBytes(bytes)); + return this; + } + + /// + /// Reads a string encoded in the specified encoding. + /// + /// The encoding of the string to be read. + /// + public string ReadString(Encoding encoding) + { + int bytes = ReadInt32(); + if (bytes < 0) return null; + return encoding.GetString(ReadBytes(bytes)); + } + + /// + /// Reads a string encoded in the specified encoding. + /// + /// The encoding of the string to be read. + /// The string that was read. + /// + public EasyReader ReadString(Encoding encoding, out string value) + { + int bytes = ReadInt32(); + if (bytes < 0) + { + value = null; + return this; + } + value = encoding.GetString(ReadBytes(bytes)); + return this; + } + + /// + /// Reads a null-terminated string (C-string). + /// + /// The string that was read. + public string ReadCString() + { + var bytes = new List(); + byte c; + while ((c = ReadByte()) != 0x00) + bytes.Add(c); + return Encoding.UTF8.GetString(bytes.ToArray()); + } + + /// + /// Reads an array of Unicode strings. + /// + /// + public string[] ReadStringArray() + { + int length = ReadInt32(); + var array = new string[length]; + for (int i = 0; i < length; i++) + array[i] = ReadString(); + return array; + } + + /// + /// Reads an array of Unicode strings. + /// + /// The array of strings that was read. + /// + public EasyReader ReadStringArray(out string[] value) + { + int length = ReadInt32(); + var array = new string[length]; + for (int i = 0; i < length; i++) + array[i] = ReadString(); + value = array; + return this; + } + + /// + /// Reads a string array encoded in the specified encoding. + /// + /// The encoding of the strings to be read. + /// + public string[] ReadStringArray(Encoding encoding) + { + int length = ReadInt32(); + var array = new string[length]; + for (int i = 0; i < length; i++) + array[i] = ReadString(encoding); + return array; + } + + /// + /// Reads a string array encoded in the specified encoding. + /// + /// The encoding of the strings to be read. + /// The array of strings that was read. + /// + public EasyReader ReadStringArray(Encoding encoding, out string[] value) + { + int length = ReadInt32(); + var array = new string[length]; + for (int i = 0; i < length; i++) + array[i] = ReadString(encoding); + value = array; + return this; + } + + /// + /// Reads an array of the specified value type. + /// + /// The type stored in the array. + /// Indicates to the reader that the array length is 64-bit rather than 32-bit. + /// + public T[] ReadArray(bool use64bit = false) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + long count = use64bit ? ReadInt64() : ReadInt32(); + var array = new T[count]; + for (int i = 0; i < count; i++) + array[i] = ReadStruct(isNumeric); + return array; + } + + /// + /// Reads an array of the specified value type. + /// + /// The type stored in the array. + /// The array that was read. + /// Indicates to the reader that the array length is 64-bit rather than 32-bit. + /// + public EasyReader ReadArray(out T[] value, bool use64bit = false) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + long count = use64bit ? ReadInt64() : ReadInt32(); + var array = new T[count]; + for (int i = 0; i < count; i++) + array[i] = ReadStruct(isNumeric); + value = array; + return this; + } + + /// + /// Reads an array of the specified type and item count. + /// + /// The type stored in the array. + /// The length of the array. + /// + public T[] ReadArray(int length) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + var array = new T[length]; + for (int i = 0; i < length; i++) + array[i] = ReadStruct(isNumeric); + return array; + } + + /// + /// Reads an array of the specified type and item count. + /// + /// The type stored in the array. + /// The length of the array. + /// The array that was read. + /// + public EasyReader ReadArray(int length, out T[] value) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + var array = new T[length]; + for (int i = 0; i < length; i++) + array[i] = ReadStruct(isNumeric); + value = array; + return this; + } + + /// + /// Reads a dictionary of the specified key and value types. + /// + /// The key type of the dictionary. + /// The value type of the dictionary. + /// + public Dictionary ReadDictionary() + where TKey : IConvertible + where TValue : IConvertible + { + var ktype = typeof(TKey); + bool kIsString = ktype == typeof(string); + var vtype = typeof(TValue); + bool vIsString = vtype == typeof(string); + + if (!ktype.IsValueType && !kIsString) + throw new ArgumentException("TKey must be either a value type or System.String."); + if (!vtype.IsValueType && !vIsString) + throw new ArgumentException("TValue must be either a value type or System.String."); + + bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); + bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); + int count = ReadInt32(); + var dict = new Dictionary(count); + TKey key; + TValue value; + for (int i = 0; i < count; i++) + { + if (kIsString) + key = (TKey)(object)ReadString(); + else + key = ReadStruct(isKNumeric); + + if (vIsString) + value = (TValue)(object)ReadString(); + else + value = ReadStruct(isVNumeric); + + dict.Add(key, value); + } + return dict; + } + + /// + /// Reads a dictionary of the specified key and value types. + /// + /// The key type of the dictionary. + /// The value type of the dictionary. + /// The dictionary that was read. + /// + public EasyReader ReadDictionary(out Dictionary value) + where TKey : IConvertible + where TValue : IConvertible + { + value = ReadDictionary(); + return this; + } + + /// + /// Reads an enumeration member. + /// + /// The enumeration type to read. + /// + public TEnum ReadEnum() where TEnum : struct, IConvertible + { + if (!typeof(TEnum).IsEnum) + throw new ArgumentException("T must be an enumerated type."); + byte size = (byte)Marshal.SizeOf(Enum.GetUnderlyingType(typeof(TEnum))); + var data = ReadAndFormat(size); + Array.Resize(ref data, 8); + return (TEnum)Enum.ToObject(typeof(TEnum), BitConverter.ToInt64(data, 0)); + } + + /// + /// Reads an enumeration member. + /// + /// The enumeration type to read. + /// The enumeration member that was read. + /// + public EasyReader ReadEnum(out TEnum value) where TEnum : struct, IConvertible + { + value = ReadEnum(); + return this; + } + + /// + /// Reads a struct of the specified type. + /// + /// The struct to read. + /// + /// + public TStruct ReadStruct(bool convertEndian = true) + { + if (!typeof(TStruct).IsValueType) + throw new ArgumentException("TStruct must be a value type."); + int size = Marshal.SizeOf(typeof(TStruct)); + bool numeric = IOUtil.IsNumericType(typeof(TStruct)); + var data = numeric ? ReadAndFormat(size) : ReadBytes(size); + var ptr = Marshal.AllocHGlobal(size); + Marshal.Copy(data, 0, ptr, size); + var i = (TStruct)Marshal.PtrToStructure(ptr, typeof(TStruct)); + + if (convertEndian) + IOUtil.ConvertStructEndians(ref i); + + Marshal.FreeHGlobal(ptr); + return i; + } + + /// + /// Reads a struct of the specified type. + /// + /// The struct to read. + /// + /// Specifies if struct members marked with the [Endianness(Endian)] attribute should have + /// their endianness converted as necessary. + /// + /// The struct that was read. + /// + public EasyReader ReadStruct(out TStruct value, bool convertEndian = true) + { + value = ReadStruct(convertEndian); + return this; + } + + /// + /// Reads a nullable value. + /// + /// The type of the value to read. + /// + public T? ReadNullable() + where T : struct + { + T? value = null; + bool hasValue = ReadBoolean(); + if (hasValue) + value = ReadStruct(); + return value; + } + + /// + /// Reads a nullable value. + /// + /// The type of the value to read. + /// The nullable value that was read. + /// + public EasyReader ReadNullable(out T? value) where T : struct + { + value = null; + bool hasValue = ReadBoolean(); + if (hasValue) + value = ReadStruct(); + return this; + } + + /// + /// Reads a bit field from the stream. + /// + /// The size of the bit field in bytes. + /// + public BitField ReadBitField(int sizeInBytes) + { + var bf = new BitField(new byte[sizeInBytes]); + BaseStream.Read(bf._field, 0, sizeInBytes); + return bf; + } + + /// + /// Reads a bit field from the stream. + /// + /// The size of the bit field in bytes. + /// The bit field that was read. + /// + public EasyReader ReadBitField(int sizeInBytes, out BitField value) + { + value = new BitField(new byte[sizeInBytes]); + BaseStream.Read(value._field, 0, sizeInBytes); + return this; + } + + private byte[] ReadAndFormat(int count) + { + if (BitConverter.IsLittleEndian != (Endianness == Endian.Little)) + { + for (int i = 0; i < count; i++) + BaseStream.Read(_buffer, count - i - 1, 1); + } + else + BaseStream.Read(_buffer, 0, count); + + return _buffer; + } + + /// + /// Closes the reader and the underlying stream. + /// + public void Close() + { + BaseStream.Close(); + } + + [StructLayout(LayoutKind.Explicit)] + private struct IntermediateByte + { + [FieldOffset(0)] + public byte U; + + [FieldOffset(0)] + public readonly sbyte S; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/EasyWriter.cs b/Rant/Core/IO/EasyWriter.cs index fb88281..993281f 100644 --- a/Rant/Core/IO/EasyWriter.cs +++ b/Rant/Core/IO/EasyWriter.cs @@ -31,453 +31,455 @@ namespace Rant.Core.IO { - /// - /// Provides comprehensive binary writing functionality including support for writing arrays and enumeration members. - /// - internal class EasyWriter : IDisposable - { - private const byte TrueByte = 1; - private const byte FalseByte = 0; - private readonly bool _leaveOpen; - - /// - /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. - /// - /// The stream to write to. - public EasyWriter(Stream stream) - { - BaseStream = stream; - Endianness = Endian.Little; - _leaveOpen = false; - } - - /// - /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. - /// - /// The stream to write to. - /// The endianness in which to write data. - /// Specifies whether or not to leave the stream open after the writer is disposed. - public EasyWriter(Stream stream, Endian endianness = Endian.Little, bool leaveOpen = false) - { - BaseStream = stream; - Endianness = endianness; - _leaveOpen = leaveOpen; - } - - /// - /// Creates a new instance of the Rant.IO.EasyWriter class from the specified file path and mode. - /// - /// The path to the file to write. - /// The endianness in which to write data. - /// Specifies how the operating system should open the file. - public EasyWriter(string path, FileMode mode = FileMode.Create, Endian endianness = Endian.Little) - { - BaseStream = File.Open(path, mode); - Endianness = endianness; - _leaveOpen = false; - } - - /// - /// The underlying stream for this instance. - /// - public Stream BaseStream { get; } - - /// - /// Gets or sets the endianness in which data is written. - /// - public Endian Endianness { get; set; } - - /// - /// The current writing position of the stream. - /// - public long Position - { - get { return BaseStream.Position; } - set { BaseStream.Position = value; } - } - - /// - /// The current length of the stream. - /// - public long Length - { - get { return BaseStream.Length; } - set { BaseStream.SetLength(value); } - } - - /// - /// Releases all resources used by the current instance of the Rant.IO.EasyWriter class. - /// - public void Dispose() - { - if (!_leaveOpen) - BaseStream.Dispose(); - } - - /// - /// Writes a byte to the stream. - /// - /// The byte to write. - public EasyWriter Write(byte value) - { - BaseStream.WriteByte(value); - return this; - } - - /// - /// Writes a series of bytes to the stream. - /// - /// The byte array to write. - /// - public EasyWriter WriteBytes(byte[] value) - { - BaseStream.Write(value, 0, value.Length); - return this; - } - - public EasyWriter Write(bool value) - { - BaseStream.Write(new[] { value ? TrueByte : FalseByte }, 0, 1); - return this; - } - - /// - /// Writes a signed byte to the stream. - /// - /// The signed byte to write. - public EasyWriter Write(sbyte value) - { - BaseStream.Write(BitConverter.GetBytes(value), 0, 1); - return this; - } - - /// - /// Writes a 16-bit unsigned integer to the stream. - /// - /// The 16-bit unsigned integer to write. - public EasyWriter Write(ushort value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 2); - return this; - } - - /// - /// Writes a 16-bit signed integer to the stream. - /// - /// The 16-bit signed integer to write. - public EasyWriter Write(short value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 2); - return this; - } - - /// - /// Writes a 32-bit unsigned integer to the stream. - /// - /// The 32-bit unsigned integer to write. - public EasyWriter Write(uint value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 4); - return this; - } - - /// - /// Writes a 32-bit signed integer to the stream. - /// - /// The 32-bit signed integer to write. - public EasyWriter Write(int value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 4); - return this; - } - - /// - /// Writes a 64-bit unsigned integer to the stream. - /// - /// The 64-bit unsigned integer to write. - public EasyWriter Write(ulong value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 8); - return this; - } - - /// - /// Writes a 64-bit signed integer to the stream. - /// - /// The 64-bit signed integer to write. - public EasyWriter Write(long value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 8); - return this; - } - - /// - /// Writes a single-precision floating-point number to the stream. - /// - /// The single-precision floating-point number to write. - public EasyWriter Write(float value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 4); - return this; - } - - /// - /// Writes a double-precision floating-point number to the stream. - /// - /// The double-precision floating-point number to write. - public EasyWriter Write(double value) - { - var data = BitConverter.GetBytes(value); - IOUtil.ConvertEndian(data, Endianness); - BaseStream.Write(data, 0, 8); - return this; - } - - /// - /// Writes a character to the stream. - /// - /// The character to write. - /// - public EasyWriter Write(char value) - { - var data = BitConverter.GetBytes(value); - BaseStream.Write(data, 0, 2); - return this; - } - - /// - /// Writes a 128-bit decimal number to the stream. - /// - /// The 128-bit decimal number to write. - public EasyWriter Write(decimal value) - { - Write(value); - return this; - } - - /// - /// Writes a Unicode string to the stream. - /// - /// The Unicode string to write. - /// Whether or not the string should be written as a C-string. - public EasyWriter Write(string value, bool nullTerminated = false) - { - if (value == null) - { - Write(-1); - return this; - } - var bytes = Encoding.Unicode.GetBytes(value); - if (!nullTerminated) - Write(bytes.Length); - BaseStream.Write(bytes, 0, bytes.Length); - if (nullTerminated) - BaseStream.WriteByte(0); - return this; - } - - /// - /// Writes a string of the specified encoding to the stream. - /// - /// The string to write to the stream. - /// The encoding to write the string in. - /// Specifies whether the string should be null-terminated. - public EasyWriter Write(string value, Encoding encoding, bool nullTerminated = false) - { - if (value == null) - { - Write(-1); - return this; - } - var bytes = encoding.GetBytes(value); - if (!nullTerminated) - Write(bytes.Length); - BaseStream.Write(bytes, 0, bytes.Length); - if (nullTerminated) - BaseStream.WriteByte(0); - return this; - } - - /// - /// Writes a Unicode string array to the stream. - /// - /// The Unicode string array to write. - public EasyWriter Write(string[] value) - { - int count = value.Length; - Write(count); - foreach (string str in value) - Write(str); - return this; - } - - /// - /// Writes a string array of the specified encoding to the stream. - /// - /// The string array to write. - /// The encoding to write the strings in. - public EasyWriter Write(string[] value, Encoding encoding) - { - int count = value.Length; - Write(count); - foreach (string str in value) - Write(str, encoding); - return this; - } - - /// - /// Writes an array of values to the stream. - /// - /// The type of value stored in the array. - /// The array to write. - /// Indices to the writer if the array length should be prefixed to the data. - /// Indicates to the writer that the array length is 64-bit rather than 32-bit. - public EasyWriter WriteArray(T[] array, bool prefixLength = false, bool use64bit = false) where T : struct - { - bool isNumeric = IOUtil.IsNumericType(typeof(T)); - if (prefixLength) - if (use64bit) - Write(array.LongLength); - else - Write(array.Length); - - foreach (var item in array) - Write(item, isNumeric); - return this; - } - - /// - /// Writes the specified byte array to the stream. - /// - /// The byte array to write. - public EasyWriter Write(byte[] value) - { - BaseStream.Write(value, 0, value.Length); - return this; - } - - /// - /// Writes a dictionary of the specified key and value types to the stream. - /// - /// The key type of the dictionary. - /// The value type of the dictionary. - /// The dictionary to write. - public EasyWriter Write(Dictionary value) - { - var ktype = typeof(TKey); - bool kIsString = ktype == typeof(string); - var vtype = typeof(TValue); - bool vIsString = vtype == typeof(string); - - if (!ktype.IsValueType && !kIsString) - throw new ArgumentException("TKey must be either a value type or System.String."); - if (!vtype.IsValueType && !vIsString) - throw new ArgumentException("TValue must be either a value type or System.String."); - - Write(value.Count); - - bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); - bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); - - foreach (var pair in value) - { - if (kIsString) - Write(pair.Key.ToString()); - else - Write(pair.Key, isKNumeric); - - if (vIsString) - Write(pair.Value.ToString()); - else - Write(pair.Value, isVNumeric); - } - return this; - } - - /// - /// Writes a struct or enumeration member to the stream. - /// - /// The type of the struct or enum. - /// The object to write. - /// Indicates to the writer if endianness attributes should be regarded. - public EasyWriter Write(TStruct value, bool convertEndian = true) - { - if (!typeof(TStruct).IsValueType) - throw new ArgumentException("TStruct must be a value type."); - - var type = typeof(TStruct); - int size = type.IsEnum ? Marshal.SizeOf(Enum.GetUnderlyingType(type)) : Marshal.SizeOf(value); - var data = new byte[size]; - var ptr = Marshal.AllocHGlobal(size); - - if (type.IsEnum) - { - var i = Convert.ChangeType(value, Enum.GetUnderlyingType(type)); - Marshal.StructureToPtr(i, ptr, false); - } - else if (convertEndian) - { - var i = value; - IOUtil.ConvertStructEndians(ref i); - Marshal.StructureToPtr(i, ptr, false); - } - - Marshal.Copy(ptr, data, 0, size); - - if (convertEndian && (IOUtil.IsNumericType(type) || type.IsEnum)) - IOUtil.ConvertEndian(data, Endianness); - - Marshal.FreeHGlobal(ptr); - BaseStream.Write(data, 0, size); - return this; - } - - /// - /// Write a bit field to the stream. - /// - /// The bit field to write. - /// - public EasyWriter Write(BitField value) - { - BaseStream.Write(value._field, 0, value._field.Length); - return this; - } - - /// - /// Writes a nullable value to the stream. - /// - /// The type of the value to write. - /// The nullable value to write. - public EasyWriter Write(T? value) - where T : struct - { - bool hasValue = value.HasValue; - Write(hasValue); - if (hasValue) - Write(value.Value); - return this; - } - - /// - /// Closes the writer and the underlying stream. - /// - public void Close() - { - BaseStream.Close(); - } - } + /// + /// Provides comprehensive binary writing functionality including support for writing arrays and enumeration members. + /// + internal class EasyWriter : IDisposable + { + private const byte TrueByte = 1; + private const byte FalseByte = 0; + private readonly bool _leaveOpen; + + /// + /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. + /// + /// The stream to write to. + public EasyWriter(Stream stream) + { + BaseStream = stream; + Endianness = Endian.Little; + _leaveOpen = false; + } + + /// + /// Creates a new instance of the Rant.IO.EasyWriter class from the specified stream. + /// + /// The stream to write to. + /// The endianness in which to write data. + /// Specifies whether or not to leave the stream open after the writer is disposed. + public EasyWriter(Stream stream, Endian endianness = Endian.Little, bool leaveOpen = false) + { + BaseStream = stream; + Endianness = endianness; + _leaveOpen = leaveOpen; + } + + /// + /// Creates a new instance of the Rant.IO.EasyWriter class from the specified file path and mode. + /// + /// The path to the file to write. + /// The endianness in which to write data. + /// Specifies how the operating system should open the file. + public EasyWriter(string path, FileMode mode = FileMode.Create, Endian endianness = Endian.Little) + { + BaseStream = File.Open(path, mode); + Endianness = endianness; + _leaveOpen = false; + } + + /// + /// The underlying stream for this instance. + /// + public Stream BaseStream { get; } + + /// + /// Gets or sets the endianness in which data is written. + /// + public Endian Endianness { get; set; } + + /// + /// The current writing position of the stream. + /// + public long Position + { + get { return BaseStream.Position; } + set { BaseStream.Position = value; } + } + + /// + /// The current length of the stream. + /// + public long Length + { + get { return BaseStream.Length; } + set { BaseStream.SetLength(value); } + } + + /// + /// Releases all resources used by the current instance of the Rant.IO.EasyWriter class. + /// + public void Dispose() + { + if (!_leaveOpen) + BaseStream.Dispose(); + } + + /// + /// Writes a byte to the stream. + /// + /// The byte to write. + public EasyWriter Write(byte value) + { + BaseStream.WriteByte(value); + return this; + } + + /// + /// Writes a series of bytes to the stream. + /// + /// The byte array to write. + /// + public EasyWriter WriteBytes(byte[] value) + { + BaseStream.Write(value, 0, value.Length); + return this; + } + + public EasyWriter Write(bool value) + { + BaseStream.Write(new[] { value ? TrueByte : FalseByte }, 0, 1); + return this; + } + + /// + /// Writes a signed byte to the stream. + /// + /// The signed byte to write. + public EasyWriter Write(sbyte value) + { + BaseStream.Write(BitConverter.GetBytes(value), 0, 1); + return this; + } + + /// + /// Writes a 16-bit unsigned integer to the stream. + /// + /// The 16-bit unsigned integer to write. + public EasyWriter Write(ushort value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 2); + return this; + } + + /// + /// Writes a 16-bit signed integer to the stream. + /// + /// The 16-bit signed integer to write. + public EasyWriter Write(short value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 2); + return this; + } + + /// + /// Writes a 32-bit unsigned integer to the stream. + /// + /// The 32-bit unsigned integer to write. + public EasyWriter Write(uint value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 4); + return this; + } + + /// + /// Writes a 32-bit signed integer to the stream. + /// + /// The 32-bit signed integer to write. + public EasyWriter Write(int value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 4); + return this; + } + + /// + /// Writes a 64-bit unsigned integer to the stream. + /// + /// The 64-bit unsigned integer to write. + public EasyWriter Write(ulong value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 8); + return this; + } + + /// + /// Writes a 64-bit signed integer to the stream. + /// + /// The 64-bit signed integer to write. + public EasyWriter Write(long value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 8); + return this; + } + + /// + /// Writes a single-precision floating-point number to the stream. + /// + /// The single-precision floating-point number to write. + public EasyWriter Write(float value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 4); + return this; + } + + /// + /// Writes a double-precision floating-point number to the stream. + /// + /// The double-precision floating-point number to write. + public EasyWriter Write(double value) + { + var data = BitConverter.GetBytes(value); + IOUtil.ConvertEndian(data, Endianness); + BaseStream.Write(data, 0, 8); + return this; + } + + /// + /// Writes a character to the stream. + /// + /// The character to write. + /// + public EasyWriter Write(char value) + { + var data = BitConverter.GetBytes(value); + BaseStream.Write(data, 0, 2); + return this; + } + + /// + /// Writes a 128-bit decimal number to the stream. + /// + /// The 128-bit decimal number to write. + public EasyWriter Write(decimal value) + { + Write(value); + return this; + } + + /// + /// Writes a Unicode string to the stream. + /// + /// The Unicode string to write. + /// Whether or not the string should be written as a C-string. + public EasyWriter Write(string value, bool nullTerminated = false) + { + if (value == null) + { + Write(-1); + return this; + } + var bytes = Encoding.Unicode.GetBytes(value); + if (!nullTerminated) + Write(bytes.Length); + BaseStream.Write(bytes, 0, bytes.Length); + if (nullTerminated) + BaseStream.WriteByte(0); + return this; + } + + /// + /// Writes a string of the specified encoding to the stream. + /// + /// The string to write to the stream. + /// The encoding to write the string in. + /// Specifies whether the string should be null-terminated. + public EasyWriter Write(string value, Encoding encoding, bool nullTerminated = false) + { + if (value == null) + { + Write(-1); + return this; + } + var bytes = encoding.GetBytes(value); + if (!nullTerminated) + Write(bytes.Length); + BaseStream.Write(bytes, 0, bytes.Length); + if (nullTerminated) + BaseStream.WriteByte(0); + return this; + } + + /// + /// Writes a Unicode string array to the stream. + /// + /// The Unicode string array to write. + public EasyWriter Write(string[] value) + { + int count = value.Length; + Write(count); + foreach (string str in value) + Write(str); + return this; + } + + /// + /// Writes a string array of the specified encoding to the stream. + /// + /// The string array to write. + /// The encoding to write the strings in. + public EasyWriter Write(string[] value, Encoding encoding) + { + int count = value.Length; + Write(count); + foreach (string str in value) + Write(str, encoding); + return this; + } + + /// + /// Writes an array of values to the stream. + /// + /// The type of value stored in the array. + /// The array to write. + /// Indices to the writer if the array length should be prefixed to the data. + /// Indicates to the writer that the array length is 64-bit rather than 32-bit. + public EasyWriter WriteArray(T[] array, bool prefixLength = false, bool use64bit = false) where T : struct + { + bool isNumeric = IOUtil.IsNumericType(typeof(T)); + if (prefixLength) + { + if (use64bit) + Write(array.LongLength); + else + Write(array.Length); + } + + foreach (var item in array) + Write(item, isNumeric); + return this; + } + + /// + /// Writes the specified byte array to the stream. + /// + /// The byte array to write. + public EasyWriter Write(byte[] value) + { + BaseStream.Write(value, 0, value.Length); + return this; + } + + /// + /// Writes a dictionary of the specified key and value types to the stream. + /// + /// The key type of the dictionary. + /// The value type of the dictionary. + /// The dictionary to write. + public EasyWriter Write(Dictionary value) + { + var ktype = typeof(TKey); + bool kIsString = ktype == typeof(string); + var vtype = typeof(TValue); + bool vIsString = vtype == typeof(string); + + if (!ktype.IsValueType && !kIsString) + throw new ArgumentException("TKey must be either a value type or System.String."); + if (!vtype.IsValueType && !vIsString) + throw new ArgumentException("TValue must be either a value type or System.String."); + + Write(value.Count); + + bool isKNumeric = IOUtil.IsNumericType(typeof(TKey)); + bool isVNumeric = IOUtil.IsNumericType(typeof(TValue)); + + foreach (var pair in value) + { + if (kIsString) + Write(pair.Key.ToString()); + else + Write(pair.Key, isKNumeric); + + if (vIsString) + Write(pair.Value.ToString()); + else + Write(pair.Value, isVNumeric); + } + return this; + } + + /// + /// Writes a struct or enumeration member to the stream. + /// + /// The type of the struct or enum. + /// The object to write. + /// Indicates to the writer if endianness attributes should be regarded. + public EasyWriter Write(TStruct value, bool convertEndian = true) + { + if (!typeof(TStruct).IsValueType) + throw new ArgumentException("TStruct must be a value type."); + + var type = typeof(TStruct); + int size = type.IsEnum ? Marshal.SizeOf(Enum.GetUnderlyingType(type)) : Marshal.SizeOf(value); + var data = new byte[size]; + var ptr = Marshal.AllocHGlobal(size); + + if (type.IsEnum) + { + var i = Convert.ChangeType(value, Enum.GetUnderlyingType(type)); + Marshal.StructureToPtr(i, ptr, false); + } + else if (convertEndian) + { + var i = value; + IOUtil.ConvertStructEndians(ref i); + Marshal.StructureToPtr(i, ptr, false); + } + + Marshal.Copy(ptr, data, 0, size); + + if (convertEndian && (IOUtil.IsNumericType(type) || type.IsEnum)) + IOUtil.ConvertEndian(data, Endianness); + + Marshal.FreeHGlobal(ptr); + BaseStream.Write(data, 0, size); + return this; + } + + /// + /// Write a bit field to the stream. + /// + /// The bit field to write. + /// + public EasyWriter Write(BitField value) + { + BaseStream.Write(value._field, 0, value._field.Length); + return this; + } + + /// + /// Writes a nullable value to the stream. + /// + /// The type of the value to write. + /// The nullable value to write. + public EasyWriter Write(T? value) + where T : struct + { + bool hasValue = value.HasValue; + Write(hasValue); + if (hasValue) + Write(value.Value); + return this; + } + + /// + /// Closes the writer and the underlying stream. + /// + public void Close() + { + BaseStream.Close(); + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/Endian.cs b/Rant/Core/IO/Endian.cs index 0fe06a0..36a1ceb 100644 --- a/Rant/Core/IO/Endian.cs +++ b/Rant/Core/IO/Endian.cs @@ -25,19 +25,19 @@ namespace Rant.Core.IO { - /// - /// Indicates byte ordering of binary fields. - /// - internal enum Endian - { - /// - /// Big endian. - /// - Big, + /// + /// Indicates byte ordering of binary fields. + /// + internal enum Endian + { + /// + /// Big endian. + /// + Big, - /// - /// Little endian. - /// - Little - } + /// + /// Little endian. + /// + Little + } } \ No newline at end of file diff --git a/Rant/Core/IO/EndiannessAttribute.cs b/Rant/Core/IO/EndiannessAttribute.cs index ca7f2b7..c30cb1a 100644 --- a/Rant/Core/IO/EndiannessAttribute.cs +++ b/Rant/Core/IO/EndiannessAttribute.cs @@ -27,24 +27,24 @@ namespace Rant.Core.IO { - /// - /// Specifies the byte order in which a field should be written and read by EasyWriter/EasyReader. - /// - [AttributeUsage(AttributeTargets.Field)] - internal class EndiannessAttribute : Attribute - { - /// - /// The endianness to represent the data in. - /// - public readonly Endian Endian; + /// + /// Specifies the byte order in which a field should be written and read by EasyWriter/EasyReader. + /// + [AttributeUsage(AttributeTargets.Field)] + internal class EndiannessAttribute : Attribute + { + /// + /// The endianness to represent the data in. + /// + public readonly Endian Endian; - /// - /// Initializes a new instance of the EasyIO.EndiannessAttribute class with the specified endianness. - /// - /// The endianness to represent the field data in. - public EndiannessAttribute(Endian endianness) - { - Endian = endianness; - } - } + /// + /// Initializes a new instance of the EasyIO.EndiannessAttribute class with the specified endianness. + /// + /// The endianness to represent the field data in. + public EndiannessAttribute(Endian endianness) + { + Endian = endianness; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/IOExtensions.cs b/Rant/Core/IO/IOExtensions.cs index 0d0e7d9..e9d2424 100644 --- a/Rant/Core/IO/IOExtensions.cs +++ b/Rant/Core/IO/IOExtensions.cs @@ -25,26 +25,26 @@ namespace Rant.Core.IO { - internal static class IOExtensions - { - public static bool GetFlag(this byte field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } + internal static class IOExtensions + { + public static bool GetFlag(this byte field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } - public static bool GetFlag(this short field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } + public static bool GetFlag(this short field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } - public static bool GetFlag(this int field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } + public static bool GetFlag(this int field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } - public static bool GetFlag(this long field, int pos) - { - return ((field >> pos) & 0x1) == 1; - } - } + public static bool GetFlag(this long field, int pos) + { + return ((field >> pos) & 0x1) == 1; + } + } } \ No newline at end of file diff --git a/Rant/Core/IO/IOUtil.cs b/Rant/Core/IO/IOUtil.cs index 7a797a7..acd7761 100644 --- a/Rant/Core/IO/IOUtil.cs +++ b/Rant/Core/IO/IOUtil.cs @@ -29,100 +29,102 @@ namespace Rant.Core.IO { - internal static class IOUtil - { - public static int NumberOfSetBits(uint i) - { - i = i - ((i >> 1) & 0x55555555); - i = (i & 0x33333333) + ((i >> 2) & 0x33333333); - return (int)(((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; - } + internal static class IOUtil + { + public static int NumberOfSetBits(uint i) + { + i = i - ((i >> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >> 2) & 0x33333333); + return (int)(((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; + } - public static bool EndianConvertNeeded(Endian endianness) - { - return BitConverter.IsLittleEndian && endianness == Endian.Big || - !BitConverter.IsLittleEndian && endianness == Endian.Little; - } + public static bool EndianConvertNeeded(Endian endianness) + { + return BitConverter.IsLittleEndian && endianness == Endian.Big || + !BitConverter.IsLittleEndian && endianness == Endian.Little; + } - public static bool IsNumericType(Type t) - { - switch (Type.GetTypeCode(t)) - { - case TypeCode.Byte: - case TypeCode.SByte: - case TypeCode.UInt16: - case TypeCode.UInt32: - case TypeCode.UInt64: - case TypeCode.Int16: - case TypeCode.Int32: - case TypeCode.Int64: - case TypeCode.Decimal: - case TypeCode.Double: - case TypeCode.Single: - return true; - default: - return false; - } - } + public static bool IsNumericType(Type t) + { + switch (Type.GetTypeCode(t)) + { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Decimal: + case TypeCode.Double: + case TypeCode.Single: + return true; + default: + return false; + } + } - /// - /// Converts the endianness of a series of bytes according to the endianness of the data. This process works both for - /// system-side and data-side conversions. - /// - /// The data to convert. - /// The endianness to convert to or from. - public static void ConvertEndian(byte[] data, Endian dataEndianness) - { - if (BitConverter.IsLittleEndian != (dataEndianness == Endian.Little)) - Array.Reverse(data); - } + /// + /// Converts the endianness of a series of bytes according to the endianness of the data. This process works both for + /// system-side and data-side conversions. + /// + /// The data to convert. + /// The endianness to convert to or from. + public static void ConvertEndian(byte[] data, Endian dataEndianness) + { + if (BitConverter.IsLittleEndian != (dataEndianness == Endian.Little)) + Array.Reverse(data); + } - public static void ConvertStructEndians(ref TStruct o) - { - if (!typeof(TStruct).IsValueType) - throw new ArgumentException("TStruct must be a value type."); - object boxed = o; - foreach (var field in typeof(TStruct).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) - ) - { - var ftype = field.FieldType; - if (!IsNumericType(ftype)) - continue; + public static void ConvertStructEndians(ref TStruct o) + { + if (!typeof(TStruct).IsValueType) + throw new ArgumentException("TStruct must be a value type."); + object boxed = o; + foreach (var field in typeof(TStruct).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) + ) + { + var ftype = field.FieldType; + if (!IsNumericType(ftype)) + continue; - var attrs = field.GetCustomAttributes(true); - foreach (var attr in attrs) - if (attr.GetType() == typeof(EndiannessAttribute)) - { - var endian = ((EndiannessAttribute)attr).Endian; - if (EndianConvertNeeded(endian)) - { - // Get the field size, allocate a pointer and a buffer for flipping bytes. - int length = Marshal.SizeOf(ftype); - var vptr = Marshal.AllocHGlobal(length); - var vData = new byte[length]; + var attrs = field.GetCustomAttributes(true); + foreach (var attr in attrs) + { + if (attr.GetType() == typeof(EndiannessAttribute)) + { + var endian = ((EndiannessAttribute)attr).Endian; + if (EndianConvertNeeded(endian)) + { + // Get the field size, allocate a pointer and a buffer for flipping bytes. + int length = Marshal.SizeOf(ftype); + var vptr = Marshal.AllocHGlobal(length); + var vData = new byte[length]; - // Fetch the field value and store it. - var value = field.GetValue(boxed); + // Fetch the field value and store it. + var value = field.GetValue(boxed); - // Transfer the field value to the pointer and copy it to the array. - Marshal.StructureToPtr(value, vptr, false); - Marshal.Copy(vptr, vData, 0, length); + // Transfer the field value to the pointer and copy it to the array. + Marshal.StructureToPtr(value, vptr, false); + Marshal.Copy(vptr, vData, 0, length); - // Reverse. - Array.Reverse(vData); + // Reverse. + Array.Reverse(vData); - // Copy it back to the pointer. - Marshal.Copy(vData, 0, vptr, length); - value = Marshal.PtrToStructure(vptr, ftype); - // Plug it back into the field. - field.SetValue(boxed, value); - // Deallocate the pointer. - Marshal.FreeHGlobal(vptr); - o = (TStruct)boxed; - } - break; // Go to the next field. - } - } - } - } + // Copy it back to the pointer. + Marshal.Copy(vData, 0, vptr, length); + value = Marshal.PtrToStructure(vptr, ftype); + // Plug it back into the field. + field.SetValue(boxed, value); + // Deallocate the pointer. + Marshal.FreeHGlobal(vptr); + o = (TStruct)boxed; + } + break; // Go to the next field. + } + } + } + } + } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/ObjectStack.cs b/Rant/Core/ObjectModel/ObjectStack.cs index 753e75b..eaeed6d 100644 --- a/Rant/Core/ObjectModel/ObjectStack.cs +++ b/Rant/Core/ObjectModel/ObjectStack.cs @@ -29,82 +29,80 @@ namespace Rant.Core.ObjectModel { - /// - /// Stores local variables for a VM instance. - /// - internal class ObjectStack - { - private readonly List> _scopes = new List>(); - private readonly ObjectTable _table; - private int _level; + /// + /// Stores local variables for a VM instance. + /// + internal class ObjectStack + { + private readonly List> _scopes = new List>(); + private readonly ObjectTable _table; + private int _level; - public ObjectStack(ObjectTable table) - { - _table = table; - } + public ObjectStack(ObjectTable table) + { + _table = table; + } - public RantObject this[string name] - { - get - { - if (!Util.ValidateName(name)) return null; + public RantObject this[string name] + { + get + { + if (!Util.ValidateName(name)) return null; - RantObject obj; + RantObject obj; - if (_table.Globals.TryGetValue(name, out obj)) return obj; - return CurrentLocals.TryGetValue(name, out obj) ? obj : null; - } - set - { - if (!Util.ValidateName(name)) return; + if (_table.Globals.TryGetValue(name, out obj)) return obj; + return CurrentLocals.TryGetValue(name, out obj) ? obj : null; + } + set + { + if (!Util.ValidateName(name)) return; - if (value == null) - { - if (_level == 0) - _table.Globals.Remove(name); - else - CurrentLocals.Remove(name); - return; - } + if (value == null) + { + if (_level == 0) + _table.Globals.Remove(name); + else + CurrentLocals.Remove(name); + return; + } - if (_level == 0) - { - _table.Globals[name] = value; - } - else - { - if (_table.Globals.ContainsKey(name)) - _table.Globals[name] = value; - if (!CurrentLocals.ContainsKey(name)) - _scopes[_level - 1].Add(name); - CurrentLocals[name] = value; - } - } - } + if (_level == 0) + _table.Globals[name] = value; + else + { + if (_table.Globals.ContainsKey(name)) + _table.Globals[name] = value; + if (!CurrentLocals.ContainsKey(name)) + _scopes[_level - 1].Add(name); + CurrentLocals[name] = value; + } + } + } - public Dictionary CurrentLocals { get; } = new Dictionary(); + public Dictionary CurrentLocals { get; } = new Dictionary(); - public void EnterScope() - { - if (++_level >= _scopes.Count) - _scopes.Add(new HashSet()); - } + public void EnterScope() + { + if (++_level >= _scopes.Count) + _scopes.Add(new HashSet()); + } - public void ExitScope() - { - if (_level == 0) return; - var garbage = _scopes[--_level]; - foreach (string name in garbage) - CurrentLocals.Remove(name); - garbage.Clear(); - } + public void ExitScope() + { + if (_level == 0) return; + var garbage = _scopes[--_level]; + foreach (string name in garbage) + CurrentLocals.Remove(name); + garbage.Clear(); + } - public void Clear() - { - CurrentLocals.Clear(); - _scopes.Clear(); - _level = 0; - _table.Globals.Clear(); - } - } + public void Clear() + { + CurrentLocals.Clear(); + _scopes.Clear(); + _level = 0; + _table.Globals.Clear(); + } + } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/ObjectTable.cs b/Rant/Core/ObjectModel/ObjectTable.cs index f6327cb..4a1440e 100644 --- a/Rant/Core/ObjectModel/ObjectTable.cs +++ b/Rant/Core/ObjectModel/ObjectTable.cs @@ -29,29 +29,29 @@ namespace Rant.Core.ObjectModel { - /// - /// Stores global and local variables for a single engine instance. - /// - internal class ObjectTable - { - internal readonly Dictionary Globals = new Dictionary(); + /// + /// Stores global and local variables for a single engine instance. + /// + internal class ObjectTable + { + internal readonly Dictionary Globals = new Dictionary(); - public RantObject this[string name] - { - get - { - if (!Util.ValidateName(name)) return null; - RantObject obj; - return Globals.TryGetValue(name, out obj) ? obj : null; - } - set - { - if (!Util.ValidateName(name)) return; - if (value == null) Globals.Remove(name); - Globals[name] = value; - } - } + public RantObject this[string name] + { + get + { + if (!Util.ValidateName(name)) return null; + RantObject obj; + return Globals.TryGetValue(name, out obj) ? obj : null; + } + set + { + if (!Util.ValidateName(name)) return; + if (value == null) Globals.Remove(name); + Globals[name] = value; + } + } - public ObjectStack CreateLocalStack() => new ObjectStack(this); - } + public ObjectStack CreateLocalStack() => new ObjectStack(this); + } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index d4a8fff..fa4a517 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -32,441 +32,439 @@ namespace Rant.Core.ObjectModel { - /// - /// Represents a Rant variable. - /// - public class RantObject - { - /// - /// Null - /// - public static readonly RantObject Null = new RantObject(); - - private bool _boolean = false; - private List _list = null; - private double _number = 0; - private RantProgram _pattern = null; - private RST _rst = null; - private string _string = null; - - /// - /// Creates a No object. - /// - public RantObject() - { - } - - /// - /// Creates a new RantObject instance with a list value. - /// - /// The list to assign to the object. - public RantObject(List list) - { - if (list == null) return; - Type = RantObjectType.List; - _list = list; - } - - /// - /// Creates a new RantObject instance with a boolean value. - /// - /// The boolean value to assign to the object. - public RantObject(bool boolean) - { - Type = RantObjectType.Boolean; - _boolean = boolean; - } - - /// - /// Creates a new RantObject instance with a string value. - /// - /// The string to assign to the object. - public RantObject(string str) - { - if (str == null) return; - Type = RantObjectType.String; - _string = str; - } - - /// - /// Creates a new RantObject instance with a decimal number value. - /// - /// The number to assign to the object. - public RantObject(double num) - { - Type = RantObjectType.Number; - _number = num; - } - - internal RantObject(RST rst) - { - Type = RantObjectType.Action; - _rst = rst; - } - - /// - /// Creates a new RantObject instance from the specified object. - /// - /// The value to assign to the object. - public RantObject(object obj) - { - if (obj == null) return; - - if (obj is string) - { - _string = obj.ToString(); - Type = RantObjectType.String; - } - else if (obj is bool) - { - _boolean = (bool)obj; - Type = RantObjectType.Boolean; - } - else if (IsNumber(obj)) - { - _number = (double)obj; - Type = RantObjectType.Number; - } - else if (obj is List) - { - _list = (List)obj; - Type = RantObjectType.List; - } - else if (obj.GetType().IsArray) - { - _list = ((object[])obj).Select(o => new RantObject(o)).ToList(); - Type = RantObjectType.List; - } - else if (obj is RantProgram) - { - _pattern = (RantProgram)obj; - } - else if (obj is RST) - { - _rst = (RST)obj; - Type = RantObjectType.Action; - } - } - - /// - /// Creates a new RantObject with the specified object type and a default value. - /// - /// The type of object to create. - public RantObject(RantObjectType type) - { - Type = type; - } - - /// - /// The type of the object. - /// - public RantObjectType Type { get; internal set; } = RantObjectType.Null; - - /// - /// The value of the object. - /// - public object Value - { - get - { - switch (Type) - { - case RantObjectType.Null: - return null; - case RantObjectType.Boolean: - return _boolean; - case RantObjectType.Number: - return _number; - case RantObjectType.Pattern: - return _pattern; - case RantObjectType.String: - return _string; - case RantObjectType.List: - return _list; - case RantObjectType.Action: - return _rst; - } - return null; - } - } - - /// - /// Converts the current object to a RantObject of the specified type and returns it. - /// - /// The object type to convert to. - /// - public RantObject ConvertTo(RantObjectType type) - { - if (Type == type) return Clone(); - - switch (type) - { - case RantObjectType.String: - { - switch (Type) - { - case RantObjectType.Boolean: - return new RantObject(_boolean.ToString()); - case RantObjectType.Number: - return new RantObject(_number.ToString(CultureInfo.InvariantCulture)); - case RantObjectType.Pattern: - return new RantObject(_pattern.Code); - case RantObjectType.List: - { - var sb = new StringBuilder(); - bool first = true; - sb.Append("("); - foreach (var rantObject in _list) - { - if (first) - { - first = false; - sb.Append(", "); - } - - sb.Append(rantObject); - } - sb.Append(")"); - return new RantObject(sb.ToString()); - } - } - break; - } - case RantObjectType.Number: - { - switch (Type) - { - case RantObjectType.Boolean: - return new RantObject(_boolean ? 1 : 0); - case RantObjectType.String: - { - double num; - return double.TryParse(_string, out num) ? new RantObject(num) : Null; - } - } - break; - } - case RantObjectType.Boolean: - { - switch (Type) - { - case RantObjectType.Number: - return new RantObject(_number != 0); - case RantObjectType.String: - { - string bstr = _string.ToLower().Trim(); - switch (bstr) - { - case "true": - return new RantObject(true); - case "false": - return new RantObject(false); - } - break; - } - } - break; - } - case RantObjectType.List: - { - return new RantObject(new List { this }); - } - } - - return Null; - } - - /// - /// Returns another RantObject instance with the exact same value as the current instance. - /// - /// - public RantObject Clone() - { - return new RantObject - { - _boolean = _boolean, - _list = _list?.ToList(), // Create a copy of the list - _number = _number, - _pattern = _pattern, - _string = _string, - _rst = _rst, - Type = Type - }; - } - - /// - /// Returns the sum of two RantObjects. - /// - /// The first object. - /// The second object. - /// - public static RantObject operator +(RantObject a, RantObject b) - { - switch (a.Type) // TODO: Cover all cases - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number + b._number); - } - break; - } - case RantObjectType.String: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._string + b._number); - case RantObjectType.String: - return new RantObject(a._string + b._string); - } - break; - } - } - - return Null; - } - - /// - /// Subtracts a RantObject from another. - /// - /// The object to subtract from. - /// The object to subtract. - /// - public static RantObject operator -(RantObject a, RantObject b) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number - b._number); - } - break; - } - } - - return Null; - } - - /// - /// Returns the product of two RantObjects. - /// - /// The first object. - /// The second object. - /// - public static RantObject operator *(RantObject a, RantObject b) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number * b._number); - } - break; - } - case RantObjectType.String: - { - switch (b.Type) - { - case RantObjectType.Number: - { - var sb = new StringBuilder(); - int c = (int)b._number; - for (int i = 0; i < c; i++) - sb.Append(a._string); - return new RantObject(sb.ToString()); - } - } - break; - } - } - - return Null; - } - - /// - /// Divides one RantObject by another. - /// - /// The object to divide. - /// The object to divide by. - /// - public static RantObject operator /(RantObject a, RantObject b) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number / b._number); - } - break; - } - } - - return Null; - } - - /// - /// Returns a string representation of the current RantObject. - /// - /// - public override string ToString() - { - switch (Type) - { - case RantObjectType.Boolean: - return _boolean ? "true" : "false"; - case RantObjectType.String: - return _string; - case RantObjectType.Null: - return "no"; - case RantObjectType.Undefined: - return "???"; - case RantObjectType.Number: - return _number.ToString(CultureInfo.InvariantCulture); - case RantObjectType.Pattern: - return $"$\"{_pattern.Code}\""; - case RantObjectType.List: - { - var sb = new StringBuilder(); - bool first = true; - sb.Append("("); - foreach (var rantObject in _list) - { - if (!first) sb.Append(", "); - first = false; - sb.Append(rantObject); - } - sb.Append(")"); - return sb.ToString(); - } - } - return Value.ToString(); - } - - private static bool IsNumber(object value) - { - return value is sbyte - || value is byte - || value is short - || value is ushort - || value is int - || value is uint - || value is long - || value is ulong - || value is float - || value is double - || value is decimal; - } - } + /// + /// Represents a Rant variable. + /// + public class RantObject + { + /// + /// Null + /// + public static readonly RantObject Null = new RantObject(); + + private bool _boolean = false; + private List _list = null; + private double _number = 0; + private RantProgram _pattern = null; + private RST _rst = null; + private string _string = null; + + /// + /// Creates a No object. + /// + public RantObject() + { + } + + /// + /// Creates a new RantObject instance with a list value. + /// + /// The list to assign to the object. + public RantObject(List list) + { + if (list == null) return; + Type = RantObjectType.List; + _list = list; + } + + /// + /// Creates a new RantObject instance with a boolean value. + /// + /// The boolean value to assign to the object. + public RantObject(bool boolean) + { + Type = RantObjectType.Boolean; + _boolean = boolean; + } + + /// + /// Creates a new RantObject instance with a string value. + /// + /// The string to assign to the object. + public RantObject(string str) + { + if (str == null) return; + Type = RantObjectType.String; + _string = str; + } + + /// + /// Creates a new RantObject instance with a decimal number value. + /// + /// The number to assign to the object. + public RantObject(double num) + { + Type = RantObjectType.Number; + _number = num; + } + + internal RantObject(RST rst) + { + Type = RantObjectType.Action; + _rst = rst; + } + + /// + /// Creates a new RantObject instance from the specified object. + /// + /// The value to assign to the object. + public RantObject(object obj) + { + if (obj == null) return; + + if (obj is string) + { + _string = obj.ToString(); + Type = RantObjectType.String; + } + else if (obj is bool) + { + _boolean = (bool)obj; + Type = RantObjectType.Boolean; + } + else if (IsNumber(obj)) + { + _number = (double)obj; + Type = RantObjectType.Number; + } + else if (obj is List) + { + _list = (List)obj; + Type = RantObjectType.List; + } + else if (obj.GetType().IsArray) + { + _list = ((object[])obj).Select(o => new RantObject(o)).ToList(); + Type = RantObjectType.List; + } + else if (obj is RantProgram) + _pattern = (RantProgram)obj; + else if (obj is RST) + { + _rst = (RST)obj; + Type = RantObjectType.Action; + } + } + + /// + /// Creates a new RantObject with the specified object type and a default value. + /// + /// The type of object to create. + public RantObject(RantObjectType type) + { + Type = type; + } + + /// + /// The type of the object. + /// + public RantObjectType Type { get; internal set; } = RantObjectType.Null; + + /// + /// The value of the object. + /// + public object Value + { + get + { + switch (Type) + { + case RantObjectType.Null: + return null; + case RantObjectType.Boolean: + return _boolean; + case RantObjectType.Number: + return _number; + case RantObjectType.Pattern: + return _pattern; + case RantObjectType.String: + return _string; + case RantObjectType.List: + return _list; + case RantObjectType.Action: + return _rst; + } + return null; + } + } + + /// + /// Converts the current object to a RantObject of the specified type and returns it. + /// + /// The object type to convert to. + /// + public RantObject ConvertTo(RantObjectType type) + { + if (Type == type) return Clone(); + + switch (type) + { + case RantObjectType.String: + { + switch (Type) + { + case RantObjectType.Boolean: + return new RantObject(_boolean.ToString()); + case RantObjectType.Number: + return new RantObject(_number.ToString(CultureInfo.InvariantCulture)); + case RantObjectType.Pattern: + return new RantObject(_pattern.Code); + case RantObjectType.List: + { + var sb = new StringBuilder(); + bool first = true; + sb.Append("("); + foreach (var rantObject in _list) + { + if (first) + { + first = false; + sb.Append(", "); + } + + sb.Append(rantObject); + } + sb.Append(")"); + return new RantObject(sb.ToString()); + } + } + break; + } + case RantObjectType.Number: + { + switch (Type) + { + case RantObjectType.Boolean: + return new RantObject(_boolean ? 1 : 0); + case RantObjectType.String: + { + double num; + return double.TryParse(_string, out num) ? new RantObject(num) : Null; + } + } + break; + } + case RantObjectType.Boolean: + { + switch (Type) + { + case RantObjectType.Number: + return new RantObject(_number != 0); + case RantObjectType.String: + { + string bstr = _string.ToLower().Trim(); + switch (bstr) + { + case "true": + return new RantObject(true); + case "false": + return new RantObject(false); + } + break; + } + } + break; + } + case RantObjectType.List: + { + return new RantObject(new List { this }); + } + } + + return Null; + } + + /// + /// Returns another RantObject instance with the exact same value as the current instance. + /// + /// + public RantObject Clone() + { + return new RantObject + { + _boolean = _boolean, + _list = _list?.ToList(), // Create a copy of the list + _number = _number, + _pattern = _pattern, + _string = _string, + _rst = _rst, + Type = Type + }; + } + + /// + /// Returns the sum of two RantObjects. + /// + /// The first object. + /// The second object. + /// + public static RantObject operator +(RantObject a, RantObject b) + { + switch (a.Type) // TODO: Cover all cases + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number + b._number); + } + break; + } + case RantObjectType.String: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._string + b._number); + case RantObjectType.String: + return new RantObject(a._string + b._string); + } + break; + } + } + + return Null; + } + + /// + /// Subtracts a RantObject from another. + /// + /// The object to subtract from. + /// The object to subtract. + /// + public static RantObject operator -(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number - b._number); + } + break; + } + } + + return Null; + } + + /// + /// Returns the product of two RantObjects. + /// + /// The first object. + /// The second object. + /// + public static RantObject operator *(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number * b._number); + } + break; + } + case RantObjectType.String: + { + switch (b.Type) + { + case RantObjectType.Number: + { + var sb = new StringBuilder(); + int c = (int)b._number; + for (int i = 0; i < c; i++) + sb.Append(a._string); + return new RantObject(sb.ToString()); + } + } + break; + } + } + + return Null; + } + + /// + /// Divides one RantObject by another. + /// + /// The object to divide. + /// The object to divide by. + /// + public static RantObject operator /(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number / b._number); + } + break; + } + } + + return Null; + } + + /// + /// Returns a string representation of the current RantObject. + /// + /// + public override string ToString() + { + switch (Type) + { + case RantObjectType.Boolean: + return _boolean ? "true" : "false"; + case RantObjectType.String: + return _string; + case RantObjectType.Null: + return "no"; + case RantObjectType.Undefined: + return "???"; + case RantObjectType.Number: + return _number.ToString(CultureInfo.InvariantCulture); + case RantObjectType.Pattern: + return $"$\"{_pattern.Code}\""; + case RantObjectType.List: + { + var sb = new StringBuilder(); + bool first = true; + sb.Append("("); + foreach (var rantObject in _list) + { + if (!first) sb.Append(", "); + first = false; + sb.Append(rantObject); + } + sb.Append(")"); + return sb.ToString(); + } + } + return Value.ToString(); + } + + private static bool IsNumber(object value) + { + return value is sbyte + || value is byte + || value is short + || value is ushort + || value is int + || value is uint + || value is long + || value is ulong + || value is float + || value is double + || value is decimal; + } + } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/RantObjectType.cs b/Rant/Core/ObjectModel/RantObjectType.cs index 99b718f..b44111d 100644 --- a/Rant/Core/ObjectModel/RantObjectType.cs +++ b/Rant/Core/ObjectModel/RantObjectType.cs @@ -25,49 +25,49 @@ namespace Rant.Core.ObjectModel { - /// - /// Defines object types used by Rant. - /// - public enum RantObjectType - { - /// - /// Represents a decimal number. - /// - Number, + /// + /// Defines object types used by Rant. + /// + public enum RantObjectType + { + /// + /// Represents a decimal number. + /// + Number, - /// - /// Represents a series of Unicode characters. - /// - String, + /// + /// Represents a series of Unicode characters. + /// + String, - /// - /// Represents a compiled Rant pattern. - /// - Pattern, + /// + /// Represents a compiled Rant pattern. + /// + Pattern, - /// - /// Represents a boolean value. - /// - Boolean, + /// + /// Represents a boolean value. + /// + Boolean, - /// - /// Represents a resizable set of values. - /// - List, + /// + /// Represents a resizable set of values. + /// + List, - /// - /// Represents a VM action. - /// - Action, + /// + /// Represents a VM action. + /// + Action, - /// - /// Represents a lack of a value. - /// - Null, + /// + /// Represents a lack of a value. + /// + Null, - /// - /// Represents a lack of any variable at all. - /// - Undefined - } + /// + /// Represents a lack of any variable at all. + /// + Undefined + } } \ No newline at end of file diff --git a/Rant/Core/Output/ChannelVisibility.cs b/Rant/Core/Output/ChannelVisibility.cs index d2b43db..288af01 100644 --- a/Rant/Core/Output/ChannelVisibility.cs +++ b/Rant/Core/Output/ChannelVisibility.cs @@ -27,27 +27,27 @@ namespace Rant.Core.Output { - /// - /// Provides visibility settings for output channels. - /// - public enum ChannelVisibility - { - /// - /// Channel outputs to itself and 'main'. - /// - [RantDescription("Channel outputs to itself and 'main'.")] - Public, + /// + /// Provides visibility settings for output channels. + /// + public enum ChannelVisibility + { + /// + /// Channel outputs to itself and 'main'. + /// + [RantDescription("Channel outputs to itself and 'main'.")] + Public, - /// - /// Channel outputs only to itself. - /// - [RantDescription("Channel outputs only to itself.")] - Private, + /// + /// Channel outputs only to itself. + /// + [RantDescription("Channel outputs only to itself.")] + Private, - /// - /// Channel outputs only to itself and any parent channels also set to Internal. - /// - [RantDescription("Channel outputs only to itself and all immediate parent channels also set to Internal.")] - Internal - } + /// + /// Channel outputs only to itself and any parent channels also set to Internal. + /// + [RantDescription("Channel outputs only to itself and all immediate parent channels also set to Internal.")] + Internal + } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputChain.cs b/Rant/Core/Output/OutputChain.cs index 994db77..3d5cc5f 100644 --- a/Rant/Core/Output/OutputChain.cs +++ b/Rant/Core/Output/OutputChain.cs @@ -28,102 +28,102 @@ namespace Rant.Core.Output { - /// - /// Specially designed linked list for storing targets and output buffers, with support for change events for - /// auto-formatting functionality. - /// - internal class OutputChain - { - // Engine - private readonly Sandbox sandbox; - // Targets - private readonly Dictionary targets = new Dictionary(); - - public OutputChain(Sandbox sb, string name) - { - sandbox = sb; - First = new OutputChainBuffer(sb, null); - Last = First; - Name = name; - } - - // Buffer endpoint references - - // Public - public OutputChainBuffer First { get; } - public OutputChainBuffer Last { get; private set; } - public ChannelVisibility Visibility { get; set; } = ChannelVisibility.Public; - public string Name { get; } - - public OutputChainBuffer AddBuffer() - { - return Last = new OutputChainBuffer(sandbox, Last); - } - - public void InsertTarget(string targetName) - { - // Check if the buffer was already created - OutputChainBuffer buffer; - if (!targets.TryGetValue(targetName, out buffer)) - buffer = targets[targetName] = AddBuffer(); - else - Last = new OutputChainBuffer(sandbox, Last, buffer); - - // Then add an empty buffer after it so we don't start printing onto the target. - AddBuffer(); - } - - public void PrintToTarget(string targetName, string value) - { - OutputChainBuffer buffer; - if (!targets.TryGetValue(targetName, out buffer)) - buffer = targets[targetName] = new OutputChainBuffer(sandbox, null); - - buffer.Print(value); - } - - public void ClearTarget(string targetName) - { - OutputChainBuffer buffer; - if (targets.TryGetValue(targetName, out buffer)) - buffer.Clear(); - } - - public string GetTargetValue(string targetName) - { - OutputChainBuffer buffer; - return targets.TryGetValue(targetName, out buffer) ? buffer.ToString() : string.Empty; - } - - public void Print(string value) - { - if (Last.GetType() != typeof(OutputChainBuffer)) AddBuffer(); - Last.Print(value); - } - - public void Print(object obj) - { - if (Last.GetType() != typeof(OutputChainBuffer)) AddBuffer(); - Last.Print(obj); - } - - public OutputChainBuffer AddArticleBuffer() - { - // If the last buffer is empty, just replace it. - var b = Last = new OutputChainArticleBuffer(sandbox, Last); - return b; - } - - public override string ToString() - { - var sb = new StringBuilder(256); - var buffer = First; - while (buffer != null) - { - sb.Append(buffer); - buffer = buffer.Next; - } - return sb.ToString(); - } - } + /// + /// Specially designed linked list for storing targets and output buffers, with support for change events for + /// auto-formatting functionality. + /// + internal class OutputChain + { + // Engine + private readonly Sandbox sandbox; + // Targets + private readonly Dictionary targets = new Dictionary(); + + public OutputChain(Sandbox sb, string name) + { + sandbox = sb; + First = new OutputChainBuffer(sb, null); + Last = First; + Name = name; + } + + // Buffer endpoint references + + // Public + public OutputChainBuffer First { get; } + public OutputChainBuffer Last { get; private set; } + public ChannelVisibility Visibility { get; set; } = ChannelVisibility.Public; + public string Name { get; } + + public OutputChainBuffer AddBuffer() + { + return Last = new OutputChainBuffer(sandbox, Last); + } + + public void InsertTarget(string targetName) + { + // Check if the buffer was already created + OutputChainBuffer buffer; + if (!targets.TryGetValue(targetName, out buffer)) + buffer = targets[targetName] = AddBuffer(); + else + Last = new OutputChainBuffer(sandbox, Last, buffer); + + // Then add an empty buffer after it so we don't start printing onto the target. + AddBuffer(); + } + + public void PrintToTarget(string targetName, string value) + { + OutputChainBuffer buffer; + if (!targets.TryGetValue(targetName, out buffer)) + buffer = targets[targetName] = new OutputChainBuffer(sandbox, null); + + buffer.Print(value); + } + + public void ClearTarget(string targetName) + { + OutputChainBuffer buffer; + if (targets.TryGetValue(targetName, out buffer)) + buffer.Clear(); + } + + public string GetTargetValue(string targetName) + { + OutputChainBuffer buffer; + return targets.TryGetValue(targetName, out buffer) ? buffer.ToString() : string.Empty; + } + + public void Print(string value) + { + if (Last.GetType() != typeof(OutputChainBuffer)) AddBuffer(); + Last.Print(value); + } + + public void Print(object obj) + { + if (Last.GetType() != typeof(OutputChainBuffer)) AddBuffer(); + Last.Print(obj); + } + + public OutputChainBuffer AddArticleBuffer() + { + // If the last buffer is empty, just replace it. + var b = Last = new OutputChainArticleBuffer(sandbox, Last); + return b; + } + + public override string ToString() + { + var sb = new StringBuilder(256); + var buffer = First; + while (buffer != null) + { + sb.Append(buffer); + buffer = buffer.Next; + } + return sb.ToString(); + } + } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputChainArticleBuffer.cs b/Rant/Core/Output/OutputChainArticleBuffer.cs index bd14a3d..c8847d3 100644 --- a/Rant/Core/Output/OutputChainArticleBuffer.cs +++ b/Rant/Core/Output/OutputChainArticleBuffer.cs @@ -29,80 +29,80 @@ namespace Rant.Core.Output { - internal class OutputChainArticleBuffer : OutputChainBuffer - { - private static readonly HashSet vowels = - new HashSet(new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', 'é', 'É' }); + internal class OutputChainArticleBuffer : OutputChainBuffer + { + private static readonly HashSet vowels = + new HashSet(new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', 'é', 'É' }); - private static readonly string[] ignorePrefixes = - { "uni", "use", "uri", "urol", "U.", "one", "uvu", "eul", "euk", "eur" }; + private static readonly string[] ignorePrefixes = + { "uni", "use", "uri", "urol", "U.", "one", "uvu", "eul", "euk", "eur" }; - private static readonly string[] allowPrefixes = - { "honest", "honor", "hour", "8" }; + private static readonly string[] allowPrefixes = + { "honest", "honor", "hour", "8" }; - private static readonly string[] ignoreWords = { "u" }; + private static readonly string[] ignoreWords = { "u" }; - private static readonly string[] allowWords = - { "f", "fbi", "fcc", "fda", "x", "l", "m", "n", "s", "h" }; + private static readonly string[] allowWords = + { "f", "fbi", "fcc", "fda", "x", "l", "m", "n", "s", "h" }; - public OutputChainArticleBuffer(Sandbox sb, OutputChainBuffer prev) : base(sb, prev) - { - Initialize(); - } + public OutputChainArticleBuffer(Sandbox sb, OutputChainBuffer prev) : base(sb, prev) + { + Initialize(); + } - public OutputChainArticleBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) - : base(sb, prev, targetOrigin) - { - Initialize(); - } + public OutputChainArticleBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) + : base(sb, prev, targetOrigin) + { + Initialize(); + } - private void Initialize() - { - Print("a"); - } + private void Initialize() + { + Print("a"); + } - protected override void OnNextBufferChange() - { - if (Next.Length == 0) return; - var sb = Next.Buffer; - char c; - int start = -1; - int end = 0; - for (int i = 0; i < sb.Length; i++) - { - c = sb[i]; - if (start == -1) - { - if (char.IsWhiteSpace(c) || char.IsSeparator(c)) continue; // Must be padding, skip it - if (!char.IsLetterOrDigit(c)) continue; - start = i; - if (i == sb.Length - 1) end = start + 1; // Word is one character long - } - else - { - end = i; - if (!char.IsLetterOrDigit(c)) break; - if (i == sb.Length - 1) end++; // Consume character if it's the last one in the buffer - } - } + protected override void OnNextBufferChange() + { + if (Next.Length == 0) return; + var sb = Next.Buffer; + char c; + int start = -1; + int end = 0; + for (int i = 0; i < sb.Length; i++) + { + c = sb[i]; + if (start == -1) + { + if (char.IsWhiteSpace(c) || char.IsSeparator(c)) continue; // Must be padding, skip it + if (!char.IsLetterOrDigit(c)) continue; + start = i; + if (i == sb.Length - 1) end = start + 1; // Word is one character long + } + else + { + end = i; + if (!char.IsLetterOrDigit(c)) break; + if (i == sb.Length - 1) end++; // Consume character if it's the last one in the buffer + } + } - if (start == -1) return; + if (start == -1) return; - var buffer = new char[end - start]; - sb.CopyTo(start, buffer, 0, end - start); - Clear(); - Print(CheckRules(new string(buffer)) ? "an" : "a"); - } + var buffer = new char[end - start]; + sb.CopyTo(start, buffer, 0, end - start); + Clear(); + Print(CheckRules(new string(buffer)) ? "an" : "a"); + } - private static bool CheckRules(string value) - { - if (string.IsNullOrEmpty(value)) return false; - return - allowWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase)) - || allowPrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase)) - || vowels.Contains(value[0]) - && !ignorePrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase)) - && !ignoreWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase)); - } - } + private static bool CheckRules(string value) + { + if (string.IsNullOrEmpty(value)) return false; + return + allowWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase)) + || allowPrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase)) + || vowels.Contains(value[0]) + && !ignorePrefixes.Any(pfx => value.StartsWith(pfx, StringComparison.InvariantCultureIgnoreCase)) + && !ignoreWords.Any(word => string.Equals(word, value, StringComparison.InvariantCultureIgnoreCase)); + } + } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputChainBuffer.cs b/Rant/Core/Output/OutputChainBuffer.cs index cd61955..8be2583 100644 --- a/Rant/Core/Output/OutputChainBuffer.cs +++ b/Rant/Core/Output/OutputChainBuffer.cs @@ -34,275 +34,275 @@ namespace Rant.Core.Output { - internal class OutputChainBuffer - { - private const int InitialCapacity = 256; - - private static readonly HashSet _wordSepChars - = new HashSet(new[] { ' ', '\r', '\n', '\t', '\f', '\v', '\'', '\"', '/', '-' }); - - private static readonly HashSet _sentenceTerminators - = new HashSet(new[] { '.', '?', '!' }); - - protected readonly StringBuilder _buffer; - private readonly Sandbox _sandbox; - private Capitalization _caps = Capitalization.None; - // Determines if a print took place after capitalization was changed - // Size of the buffer before the last print - private int oldSize; - - public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev) - { - Prev = prev; - - if (prev != null) - { - prev.Next = this; - _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; - NumberFormatter.BinaryFormat = prev.NumberFormatter.BinaryFormat; - NumberFormatter.BinaryFormatDigits = prev.NumberFormatter.BinaryFormatDigits; - NumberFormatter.Endianness = prev.NumberFormatter.Endianness; - NumberFormatter.NumberFormat = prev.NumberFormatter.NumberFormat; - } - - IsTarget = true; - _buffer = new StringBuilder(InitialCapacity); - _sandbox = sb; - } - - public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) - { - Prev = prev; - - if (prev != null) - { - prev.Next = this; - _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; - } - - _buffer = targetOrigin._buffer; - _sandbox = sb; - } - - public StringBuilder Buffer => _buffer; - - public Capitalization Caps - { - get { return _caps; } - set - { - PrintedSinceCapsChange = false; - _caps = value; - } - } - - public bool IsTarget { get; } = false; - protected bool PrintedSinceCapsChange { get; private set; } = false; - public NumberFormatter NumberFormatter { get; } = new NumberFormatter(); - public OutputChainBuffer Next { get; private set; } - public OutputChainBuffer Prev { get; } - public char LastChar => _buffer.Length > 0 ? _buffer[_buffer.Length - 1] : '\0'; - public char FirstChar => _buffer.Length > 0 ? _buffer[0] : '\0'; - public int Length => _buffer.Length; - - protected virtual void OnPrevBufferChange() - { - } - - protected virtual void OnNextBufferChange() - { - } - - public void Print(string value) - { - if (string.IsNullOrEmpty(value)) return; - Format(ref value); - _buffer.Append(value); - PrintedSinceCapsChange = true; - Prev?.OnNextBufferChange(); - Next?.OnPrevBufferChange(); - UpdateSize(); - } - - public void Print(object value) - { - string str; - if (IOUtil.IsNumericType(value.GetType())) - { - double num = Convert.ToDouble(value); - str = NumberFormatter.FormatNumber(num); - // ReSharper disable once CompareOfFloatsByEqualityOperator - _sandbox.SetPlural(num != 1.0); - } - else - { - str = value.ToString(); - } - - Format(ref str); - _buffer.Append(str); - PrintedSinceCapsChange = true; - Prev?.OnNextBufferChange(); - Next?.OnPrevBufferChange(); - UpdateSize(); - } - - private void UpdateSize() - { - if (_sandbox.SizeLimit.Accumulate(_buffer.Length - oldSize)) - throw new InvalidOperationException($"Exceeded character limit ({_sandbox.SizeLimit.Maximum})"); - oldSize = _buffer.Length; - } - - public void Clear() - { + internal class OutputChainBuffer + { + private const int InitialCapacity = 256; + + private static readonly HashSet _wordSepChars + = new HashSet(new[] { ' ', '\r', '\n', '\t', '\f', '\v', '\'', '\"', '/', '-' }); + + private static readonly HashSet _sentenceTerminators + = new HashSet(new[] { '.', '?', '!' }); + + protected readonly StringBuilder _buffer; + private readonly Sandbox _sandbox; + private Capitalization _caps = Capitalization.None; + // Determines if a print took place after capitalization was changed + // Size of the buffer before the last print + private int oldSize; + + public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev) + { + Prev = prev; + + if (prev != null) + { + prev.Next = this; + _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; + NumberFormatter.BinaryFormat = prev.NumberFormatter.BinaryFormat; + NumberFormatter.BinaryFormatDigits = prev.NumberFormatter.BinaryFormatDigits; + NumberFormatter.Endianness = prev.NumberFormatter.Endianness; + NumberFormatter.NumberFormat = prev.NumberFormatter.NumberFormat; + } + + IsTarget = true; + _buffer = new StringBuilder(InitialCapacity); + _sandbox = sb; + } + + public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) + { + Prev = prev; + + if (prev != null) + { + prev.Next = this; + _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; + } + + _buffer = targetOrigin._buffer; + _sandbox = sb; + } + + public StringBuilder Buffer => _buffer; + + public Capitalization Caps + { + get { return _caps; } + set + { + PrintedSinceCapsChange = false; + _caps = value; + } + } + + public bool IsTarget { get; } = false; + protected bool PrintedSinceCapsChange { get; private set; } = false; + public NumberFormatter NumberFormatter { get; } = new NumberFormatter(); + public OutputChainBuffer Next { get; private set; } + public OutputChainBuffer Prev { get; } + public char LastChar => _buffer.Length > 0 ? _buffer[_buffer.Length - 1] : '\0'; + public char FirstChar => _buffer.Length > 0 ? _buffer[0] : '\0'; + public int Length => _buffer.Length; + + protected virtual void OnPrevBufferChange() + { + } + + protected virtual void OnNextBufferChange() + { + } + + public void Print(string value) + { + if (string.IsNullOrEmpty(value)) return; + Format(ref value); + _buffer.Append(value); + PrintedSinceCapsChange = true; + Prev?.OnNextBufferChange(); + Next?.OnPrevBufferChange(); + UpdateSize(); + } + + public void Print(object value) + { + string str; + if (IOUtil.IsNumericType(value.GetType())) + { + double num = Convert.ToDouble(value); + str = NumberFormatter.FormatNumber(num); + // ReSharper disable once CompareOfFloatsByEqualityOperator + _sandbox.SetPlural(num != 1.0); + } + else + str = value.ToString(); + + Format(ref str); + _buffer.Append(str); + PrintedSinceCapsChange = true; + Prev?.OnNextBufferChange(); + Next?.OnPrevBufferChange(); + UpdateSize(); + } + + private void UpdateSize() + { + if (_sandbox.SizeLimit.Accumulate(_buffer.Length - oldSize)) + throw new InvalidOperationException($"Exceeded character limit ({_sandbox.SizeLimit.Maximum})"); + oldSize = _buffer.Length; + } + + public void Clear() + { #if UNITY _buffer.Length = 0; #else - _buffer.Clear(); + _buffer.Clear(); #endif - _sandbox.SizeLimit.Accumulate(-oldSize); - oldSize = 0; - } - - public override string ToString() => _buffer.ToString(); - - protected void Format(ref string value) - { - if (Util.IsNullOrWhiteSpace(value)) return; - - switch (_caps) - { - case Capitalization.Upper: - value = value.ToUpperInvariant(); - break; - case Capitalization.Lower: - value = value.ToLowerInvariant(); - break; - case Capitalization.Word: - { - char lastChar = _buffer.Length > 0 - ? _buffer[_buffer.Length - 1] - : Prev?.LastChar ?? '\0'; - if (char.IsWhiteSpace(lastChar) || _wordSepChars.Contains(lastChar) || lastChar == '\0') - CapitalizeFirstLetter(ref value); - } - break; - case Capitalization.Sentence: - { - var b = _buffer; - - // Capitalize sentences in input value - CapitalizeSentences(ref value); - - // If the buffer's empty, check previous buffer - if (_buffer.Length == 0) - { - // Check if we're at the start - if (Prev == null || Prev.Prev == null && Prev.Length == 0) - { - CapitalizeFirstLetter(ref value); - break; - } - // If there is a previous buffer, scan the end. - b = Prev._buffer; - } - else if (Prev == null || Prev.Length == 0) - { - for (int i = b.Length - 1; i >= 0; i--) - { - if (char.IsLetterOrDigit(b[i])) break; - if (_sentenceTerminators.Contains(b[i])) break; - if (i == 0) - CapitalizeFirstLetter(ref value); - } - } - - // Scan buffer end to determine if capitalization is needed - for (int i = b.Length - 1; i >= 0; i--) - { - if (char.IsLetterOrDigit(b[i])) break; - if (!_sentenceTerminators.Contains(b[i])) continue; - CapitalizeFirstLetter(ref value); - break; - } - } - break; - case Capitalization.Title: - { - CapitalizeTitleString(ref value, _sandbox.Format, !PrintedSinceCapsChange); - } - break; - case Capitalization.First: - if (CapitalizeFirstLetter(ref value) && !(this is OutputChainArticleBuffer)) _caps = Capitalization.None; - break; - } - } - - protected static void CapitalizeSentences(ref string value) - { - var sb = new StringBuilder(); - bool capitalize = false; - foreach (char c in value) - if (capitalize && char.IsLetter(c)) - { - sb.Append(char.ToUpperInvariant(c)); - capitalize = false; - } - else - { - if (_sentenceTerminators.Contains(c)) capitalize = true; - sb.Append(c); - } - value = sb.ToString(); - } - - protected static bool CapitalizeFirstLetter(ref string value) - { - for (int i = 0; i < value.Length; i++) - { - if (!char.IsLetter(value[i])) continue; - var sb = new StringBuilder(); - sb.Append(value.Substring(0, i)); - sb.Append(char.ToUpperInvariant(value[i])); - sb.Append(value.Substring(i + 1)); - value = sb.ToString(); - return true; - } - return false; - } - - protected static bool CapitalizeTitleString(ref string value, RantFormat format, bool capitalizeFirstLetter) - { - if (Util.IsNullOrWhiteSpace(value)) return false; - var wordBuffer = new StringBuilder(32); - var titleBuffer = new StringBuilder(value.Length); - bool first = true; - foreach (char c in value) - if (char.IsWhiteSpace(c)) - { - if (wordBuffer.Length > 0) - { - if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) - wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); - first = false; - titleBuffer.Append(wordBuffer); - wordBuffer.Length = 0; - } - titleBuffer.Append(c); - } - else - { - wordBuffer.Append(c); - } - if (wordBuffer.Length > 0) - { - if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) - wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); - titleBuffer.Append(wordBuffer); - } - value = titleBuffer.ToString(); - return true; - } - } + _sandbox.SizeLimit.Accumulate(-oldSize); + oldSize = 0; + } + + public override string ToString() => _buffer.ToString(); + + protected void Format(ref string value) + { + if (Util.IsNullOrWhiteSpace(value)) return; + + switch (_caps) + { + case Capitalization.Upper: + value = value.ToUpperInvariant(); + break; + case Capitalization.Lower: + value = value.ToLowerInvariant(); + break; + case Capitalization.Word: + { + char lastChar = _buffer.Length > 0 + ? _buffer[_buffer.Length - 1] + : Prev?.LastChar ?? '\0'; + if (char.IsWhiteSpace(lastChar) || _wordSepChars.Contains(lastChar) || lastChar == '\0') + CapitalizeFirstLetter(ref value); + } + break; + case Capitalization.Sentence: + { + var b = _buffer; + + // Capitalize sentences in input value + CapitalizeSentences(ref value); + + // If the buffer's empty, check previous buffer + if (_buffer.Length == 0) + { + // Check if we're at the start + if (Prev == null || Prev.Prev == null && Prev.Length == 0) + { + CapitalizeFirstLetter(ref value); + break; + } + // If there is a previous buffer, scan the end. + b = Prev._buffer; + } + else if (Prev == null || Prev.Length == 0) + { + for (int i = b.Length - 1; i >= 0; i--) + { + if (char.IsLetterOrDigit(b[i])) break; + if (_sentenceTerminators.Contains(b[i])) break; + if (i == 0) + CapitalizeFirstLetter(ref value); + } + } + + // Scan buffer end to determine if capitalization is needed + for (int i = b.Length - 1; i >= 0; i--) + { + if (char.IsLetterOrDigit(b[i])) break; + if (!_sentenceTerminators.Contains(b[i])) continue; + CapitalizeFirstLetter(ref value); + break; + } + } + break; + case Capitalization.Title: + { + CapitalizeTitleString(ref value, _sandbox.Format, !PrintedSinceCapsChange); + } + break; + case Capitalization.First: + if (CapitalizeFirstLetter(ref value) && !(this is OutputChainArticleBuffer)) _caps = Capitalization.None; + break; + } + } + + protected static void CapitalizeSentences(ref string value) + { + var sb = new StringBuilder(); + bool capitalize = false; + foreach (char c in value) + { + if (capitalize && char.IsLetter(c)) + { + sb.Append(char.ToUpperInvariant(c)); + capitalize = false; + } + else + { + if (_sentenceTerminators.Contains(c)) capitalize = true; + sb.Append(c); + } + } + value = sb.ToString(); + } + + protected static bool CapitalizeFirstLetter(ref string value) + { + for (int i = 0; i < value.Length; i++) + { + if (!char.IsLetter(value[i])) continue; + var sb = new StringBuilder(); + sb.Append(value.Substring(0, i)); + sb.Append(char.ToUpperInvariant(value[i])); + sb.Append(value.Substring(i + 1)); + value = sb.ToString(); + return true; + } + return false; + } + + protected static bool CapitalizeTitleString(ref string value, RantFormat format, bool capitalizeFirstLetter) + { + if (Util.IsNullOrWhiteSpace(value)) return false; + var wordBuffer = new StringBuilder(32); + var titleBuffer = new StringBuilder(value.Length); + bool first = true; + foreach (char c in value) + { + if (char.IsWhiteSpace(c)) + { + if (wordBuffer.Length > 0) + { + if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) + wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); + first = false; + titleBuffer.Append(wordBuffer); + wordBuffer.Length = 0; + } + titleBuffer.Append(c); + } + else + wordBuffer.Append(c); + } + if (wordBuffer.Length > 0) + { + if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) + wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); + titleBuffer.Append(wordBuffer); + } + value = titleBuffer.ToString(); + return true; + } + } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputWriter.cs b/Rant/Core/Output/OutputWriter.cs index f57326f..f36a3df 100644 --- a/Rant/Core/Output/OutputWriter.cs +++ b/Rant/Core/Output/OutputWriter.cs @@ -30,83 +30,83 @@ namespace Rant.Core.Output { - internal class OutputWriter - { - private const string MainChannelName = "main"; - private readonly HashSet activeChains = new HashSet(); - private readonly Dictionary chains = new Dictionary(); - private readonly Stack chainStack = new Stack(); - private readonly OutputChain mainChain; - private readonly Sandbox sandbox; + internal class OutputWriter + { + private const string MainChannelName = "main"; + private readonly HashSet activeChains = new HashSet(); + private readonly Dictionary chains = new Dictionary(); + private readonly Stack chainStack = new Stack(); + private readonly OutputChain mainChain; + private readonly Sandbox sandbox; - public OutputWriter(Sandbox sb) - { - sandbox = sb; - mainChain = chains[MainChannelName] = new OutputChain(sb, MainChannelName); - chainStack.Push(mainChain); - activeChains.Add(mainChain); - } + public OutputWriter(Sandbox sb) + { + sandbox = sb; + mainChain = chains[MainChannelName] = new OutputChain(sb, MainChannelName); + chainStack.Push(mainChain); + activeChains.Add(mainChain); + } - public bool CloseChannel() - { - if (chainStack.Peek() == mainChain) return false; - activeChains.Remove(chainStack.Pop()); - return true; - } + public bool CloseChannel() + { + if (chainStack.Peek() == mainChain) return false; + activeChains.Remove(chainStack.Pop()); + return true; + } - public void OpenChannel(string name, ChannelVisibility visibility) - { - OutputChain chain; - if (!chains.TryGetValue(name, out chain)) - chain = chains[name] = new OutputChain(sandbox, name); - else if (activeChains.Contains(chain)) - return; - chain.Visibility = visibility; - chainStack.Push(chain); - activeChains.Add(chain); - } + public void OpenChannel(string name, ChannelVisibility visibility) + { + OutputChain chain; + if (!chains.TryGetValue(name, out chain)) + chain = chains[name] = new OutputChain(sandbox, name); + else if (activeChains.Contains(chain)) + return; + chain.Visibility = visibility; + chainStack.Push(chain); + activeChains.Add(chain); + } - public void Do(Action chainAction) - { - bool fInternal = false; - foreach (var chain in chainStack) - { - if (fInternal && chain == mainChain) return; - chainAction(chain); - switch (chain.Visibility) - { - case ChannelVisibility.Public: - if (fInternal) return; - if (chain != mainChain) - chainAction(mainChain); - return; - case ChannelVisibility.Private: - return; - case ChannelVisibility.Internal: - fInternal = true; - break; - } - } - } + public void Do(Action chainAction) + { + bool fInternal = false; + foreach (var chain in chainStack) + { + if (fInternal && chain == mainChain) return; + chainAction(chain); + switch (chain.Visibility) + { + case ChannelVisibility.Public: + if (fInternal) return; + if (chain != mainChain) + chainAction(mainChain); + return; + case ChannelVisibility.Private: + return; + case ChannelVisibility.Internal: + fInternal = true; + break; + } + } + } - public int GetChannelLength(string channelName) - { - OutputChain c; - if (!chains.TryGetValue(channelName, out c)) return 0; - var buffer = c.First; - int length = 0; - do - { - length += buffer.Length; - } while ((buffer = buffer.Next) != null); - return length; - } + public int GetChannelLength(string channelName) + { + OutputChain c; + if (!chains.TryGetValue(channelName, out c)) return 0; + var buffer = c.First; + int length = 0; + do + { + length += buffer.Length; + } while ((buffer = buffer.Next) != null); + return length; + } - public void Capitalize(Capitalization caps) => Do(chain => chain.Last.Caps = caps); - public void Print(string value) => Do(chain => chain.Print(value)); - public void Print(object obj) => Do(chain => chain.Print(obj)); - public void InsertTarget(string targetName) => Do(chain => chain.InsertTarget(targetName)); - public void PrintToTarget(string targetName, string value) => Do(chain => chain.PrintToTarget(targetName, value)); - public RantOutput ToRantOutput() => new RantOutput(sandbox.RNG.Seed, sandbox.StartingGen, chains.Values); - } + public void Capitalize(Capitalization caps) => Do(chain => chain.Last.Caps = caps); + public void Print(string value) => Do(chain => chain.Print(value)); + public void Print(object obj) => Do(chain => chain.Print(obj)); + public void InsertTarget(string targetName) => Do(chain => chain.InsertTarget(targetName)); + public void PrintToTarget(string targetName, string value) => Do(chain => chain.PrintToTarget(targetName, value)); + public RantOutput ToRantOutput() => new RantOutput(sandbox.RNG.Seed, sandbox.StartingGen, chains.Values); + } } \ No newline at end of file diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 057523c..ee2d855 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -43,361 +43,369 @@ namespace Rant.Core { - /// - /// Represents a Rant interpreter instance that produces a single output. - /// - internal class Sandbox - { - private static readonly object fallbackArgsLockObj = new object(); - private readonly BlockManager _blockManager; - private readonly Stack _outputs; - private readonly Stopwatch _stopwatch; - private bool _plural = false; - private int _quoteLevel = 0; - - /// - /// Gets the currently loaded modules. - /// - public Dictionary Modules = new Dictionary(); - - /// - /// Modules that were loaded from packages. - /// - public Dictionary PackageModules = new Dictionary(); - - private bool shouldYield = false; - - /// - /// Modules that were not loaded from code, but were provided to RantEngine by the user. - /// - public Dictionary UserModules = new Dictionary(); - - public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = 0, CarrierState carrierState = null, - RantProgramArgs args = null) - { - Engine = engine; - Format = engine.Format; - SizeLimit = new Limit(sizeLimit); - BaseOutput = new OutputWriter(this); - _outputs = new Stack(); - _outputs.Push(BaseOutput); - RNG = rng; - StartingGen = rng.Generation; - Pattern = pattern; - Objects = new ObjectStack(engine.Objects); - Blocks = new Stack(); - RegexMatches = new Stack(); - CarrierState = carrierState ?? new CarrierState(); - SubroutineArgs = new Stack>(); - SyncManager = new SyncManager(this); - _blockManager = new BlockManager(); - ScriptObjectStack = new Stack(); - PatternArgs = args; - _stopwatch = new Stopwatch(); - } - - /// - /// Gets the engine instance to which the sandbox is bound. - /// - public RantEngine Engine { get; } - - /// - /// Gets the main output channel stack. - /// - public OutputWriter BaseOutput { get; } - - /// - /// Gets the current output channel stack. - /// - public OutputWriter Output => _outputs.Peek(); - - /// - /// Gets the random number generator in use by the interpreter. - /// - public RNG RNG { get; } - - /// - /// The starting generation of the RNG. - /// - public long StartingGen { get; } - - /// - /// Gets the currently set block attributes. - /// - public BlockAttribs CurrentBlockAttribs { get; private set; } = new BlockAttribs(); - - /// - /// Gets the format used by the interpreter. - /// - public RantFormat Format { get; } - - /// - /// Gest the object stack used by the interpreter. - /// - public ObjectStack Objects { get; } - - /// - /// Gets the block state stack. - /// - public Stack Blocks { get; } - - /// - /// Gets the replacer match stack. The topmost item is the current match for the current replacer. - /// - public Stack RegexMatches { get; } - - /// - /// Gets the current query state. - /// - public CarrierState CarrierState { get; } - - /// - /// Gets the current RantPattern. - /// - public RantProgram Pattern { get; } - - public Stack> SubroutineArgs { get; } - - /// - /// Gets the synchronizer manager instance for the current Sandbox. - /// - public SyncManager SyncManager { get; } - - /// - /// Gets the size limit for the pattern. - /// - public Limit SizeLimit { get; } - - /// - /// Gets the current RantAction being executed. - /// - public RST CurrentAction { get; private set; } - - /// - /// Gets the last used timeout. - /// - public double LastTimeout { get; internal set; } - - /// - /// Gets the current object stack of the Richard engine. - /// - public Stack ScriptObjectStack { get; } - - /// - /// Gets or sets the expected result for the current flag condition. - /// - public bool FlagConditionExpectedResult { get; set; } - - /// - /// Gets a collection of the flags currently being used for the flag condition. - /// - public HashSet ConditionFlags { get; } = new HashSet(); - - /// - /// Gets the arguments passed to the pattern. - /// - public RantProgramArgs PatternArgs { get; } - - /// - /// Prints the specified value to the output channel stack. - /// - /// The value to print. - public void Print(object obj) => Output.Do(chain => chain.Print(obj)); - - public void SetPlural(bool plural) => _plural = plural; - - public bool TakePlural() - { - bool p = _plural; - _plural = false; - return p; - } - - public void PrintMany(Func generator, int times) - { - if (times == 1) - { - Output.Do(chain => chain.Print(generator())); - return; - } - var buffer = new StringBuilder(); - for (int i = 0; i < times; i++) buffer.Append(generator()); - Output.Do(chain => chain.Print(buffer)); - } - - public void PrintMany(Func generator, int times) - { - if (times == 1) - { - Output.Do(chain => chain.Print(generator())); - return; - } - var buffer = new StringBuilder(); - for (int i = 0; i < times; i++) buffer.Append(generator()); - Output.Do(chain => chain.Print(buffer)); - } - - public void AddOutputWriter() => _outputs.Push(new OutputWriter(this)); - public RantOutput Return() => _outputs.Pop().ToRantOutput(); - public void IncreaseQuote() => _quoteLevel++; - public void DecreaseQuote() => _quoteLevel--; - - public void PrintOpeningQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.OpeningPrimaryQuote : Format.OpeningSecondaryQuote)); - - public void PrintClosingQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.ClosingPrimaryQuote : Format.ClosingSecondaryQuote)); - - /// - /// Dequeues the current block attribute set and returns it, queuing a new attribute set. - /// - /// - public BlockAttribs NextAttribs(RstBlock block) - { - var attribs = CurrentBlockAttribs; - - _blockManager.Add(attribs, block); - _blockManager.SetPrevAttribs(attribs); - - switch (attribs.Persistence) - { - case AttribPersistence.Off: - CurrentBlockAttribs = new BlockAttribs(); - break; - - case AttribPersistence.On: - CurrentBlockAttribs = new BlockAttribs(); - break; - - case AttribPersistence.Once: - CurrentBlockAttribs = _blockManager.GetPrevious(1); - break; - } - - return attribs; - } - - public void SetYield() => shouldYield = true; - - public RantOutput Run(double timeout, RantProgram pattern = null) - { - lock (PatternArgs ?? fallbackArgsLockObj) - { - if (pattern == null) pattern = Pattern; - LastTimeout = timeout; - long timeoutMS = (long)(timeout * 1000); - bool timed = timeoutMS > 0; - bool stopwatchAlreadyRunning = _stopwatch.IsRunning; - if (!_stopwatch.IsRunning) - { - _stopwatch.Reset(); - _stopwatch.Start(); - } - - ScriptObjectStack.Clear(); - var callStack = new Stack>(); - IEnumerator action; - - // Push the AST root - CurrentAction = pattern.SyntaxTree; - callStack.Push(pattern.SyntaxTree.Run(this)); - - top: - while (callStack.Any()) - { - // Get the topmost call stack item - action = callStack.Peek(); - - // Execute the node until it runs out of children - while (action.MoveNext()) - { - if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-pattern-timeout", timeout)); - - if (callStack.Count >= RantEngine.MaxStackSize) - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-stack-overflow", RantEngine.MaxStackSize)); - - if (action.Current == null) break; - - // Push child node onto stack and start over - CurrentAction = action.Current; - callStack.Push(CurrentAction.Run(this)); - goto top; - } - - // Remove node once finished - callStack.Pop(); - } - - if (!stopwatchAlreadyRunning) _stopwatch.Stop(); - - return Return(); - } - } - - public IEnumerable RunSerial(double timeout, RantProgram pattern = null) - { - lock (PatternArgs ?? fallbackArgsLockObj) - { - if (pattern == null) pattern = Pattern; - LastTimeout = timeout; - long timeoutMS = (long)(timeout * 1000); - bool timed = timeoutMS > 0; - bool stopwatchAlreadyRunning = _stopwatch.IsRunning; - if (!_stopwatch.IsRunning) - { - _stopwatch.Reset(); - _stopwatch.Start(); - } - - ScriptObjectStack.Clear(); - var callStack = new Stack>(); - IEnumerator action; - - // Push the AST root - CurrentAction = pattern.SyntaxTree; - callStack.Push(pattern.SyntaxTree.Run(this)); - - top: - while (callStack.Any()) - { - // Get the topmost call stack item - action = callStack.Peek(); - - // Execute the node until it runs out of children - while (action.MoveNext()) - { - if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-pattern-timeout", timeout)); - - if (callStack.Count >= RantEngine.MaxStackSize) - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-stack-overflow", RantEngine.MaxStackSize)); - - if (action.Current == null) break; - - // Push child node onto stack and start over - CurrentAction = action.Current; - callStack.Push(CurrentAction.Run(this)); - goto top; - } - - if (shouldYield) - { - shouldYield = false; - yield return Return(); - AddOutputWriter(); - } - - // Remove node once finished - callStack.Pop(); - } - - if (!stopwatchAlreadyRunning) _stopwatch.Stop(); - } - } - } + /// + /// Represents a Rant interpreter instance that produces a single output. + /// + internal class Sandbox + { + private static readonly object fallbackArgsLockObj = new object(); + private readonly BlockManager _blockManager; + private readonly Stack _outputs; + private readonly Stopwatch _stopwatch; + private bool _plural = false; + private int _quoteLevel = 0; + + /// + /// Gets the currently loaded modules. + /// + public Dictionary Modules = new Dictionary(); + + /// + /// Modules that were loaded from packages. + /// + public Dictionary PackageModules = new Dictionary(); + + private bool shouldYield = false; + + /// + /// Modules that were not loaded from code, but were provided to RantEngine by the user. + /// + public Dictionary UserModules = new Dictionary(); + + public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = 0, CarrierState carrierState = null, + RantProgramArgs args = null) + { + Engine = engine; + Format = engine.Format; + SizeLimit = new Limit(sizeLimit); + BaseOutput = new OutputWriter(this); + _outputs = new Stack(); + _outputs.Push(BaseOutput); + RNG = rng; + StartingGen = rng.Generation; + Pattern = pattern; + Objects = new ObjectStack(engine.Objects); + Blocks = new Stack(); + RegexMatches = new Stack(); + CarrierState = carrierState ?? new CarrierState(); + SubroutineArgs = new Stack>(); + SyncManager = new SyncManager(this); + _blockManager = new BlockManager(); + ScriptObjectStack = new Stack(); + PatternArgs = args; + _stopwatch = new Stopwatch(); + } + + /// + /// Gets the engine instance to which the sandbox is bound. + /// + public RantEngine Engine { get; } + + /// + /// Gets the main output channel stack. + /// + public OutputWriter BaseOutput { get; } + + /// + /// Gets the current output channel stack. + /// + public OutputWriter Output => _outputs.Peek(); + + /// + /// Gets the random number generator in use by the interpreter. + /// + public RNG RNG { get; } + + /// + /// The starting generation of the RNG. + /// + public long StartingGen { get; } + + /// + /// Gets the currently set block attributes. + /// + public BlockAttribs CurrentBlockAttribs { get; private set; } = new BlockAttribs(); + + /// + /// Gets the format used by the interpreter. + /// + public RantFormat Format { get; } + + /// + /// Gest the object stack used by the interpreter. + /// + public ObjectStack Objects { get; } + + /// + /// Gets the block state stack. + /// + public Stack Blocks { get; } + + /// + /// Gets the replacer match stack. The topmost item is the current match for the current replacer. + /// + public Stack RegexMatches { get; } + + /// + /// Gets the current query state. + /// + public CarrierState CarrierState { get; } + + /// + /// Gets the current RantPattern. + /// + public RantProgram Pattern { get; } + + public Stack> SubroutineArgs { get; } + + /// + /// Gets the synchronizer manager instance for the current Sandbox. + /// + public SyncManager SyncManager { get; } + + /// + /// Gets the size limit for the pattern. + /// + public Limit SizeLimit { get; } + + /// + /// Gets the current RantAction being executed. + /// + public RST CurrentAction { get; private set; } + + /// + /// Gets the last used timeout. + /// + public double LastTimeout { get; internal set; } + + /// + /// Gets the current object stack of the Richard engine. + /// + public Stack ScriptObjectStack { get; } + + /// + /// Gets or sets the expected result for the current flag condition. + /// + public bool FlagConditionExpectedResult { get; set; } + + /// + /// Gets a collection of the flags currently being used for the flag condition. + /// + public HashSet ConditionFlags { get; } = new HashSet(); + + /// + /// Gets the arguments passed to the pattern. + /// + public RantProgramArgs PatternArgs { get; } + + /// + /// Prints the specified value to the output channel stack. + /// + /// The value to print. + public void Print(object obj) => Output.Do(chain => chain.Print(obj)); + + public void SetPlural(bool plural) => _plural = plural; + + public bool TakePlural() + { + bool p = _plural; + _plural = false; + return p; + } + + public void PrintMany(Func generator, int times) + { + if (times == 1) + { + Output.Do(chain => chain.Print(generator())); + return; + } + var buffer = new StringBuilder(); + for (int i = 0; i < times; i++) buffer.Append(generator()); + Output.Do(chain => chain.Print(buffer)); + } + + public void PrintMany(Func generator, int times) + { + if (times == 1) + { + Output.Do(chain => chain.Print(generator())); + return; + } + var buffer = new StringBuilder(); + for (int i = 0; i < times; i++) buffer.Append(generator()); + Output.Do(chain => chain.Print(buffer)); + } + + public void AddOutputWriter() => _outputs.Push(new OutputWriter(this)); + public RantOutput Return() => _outputs.Pop().ToRantOutput(); + public void IncreaseQuote() => _quoteLevel++; + public void DecreaseQuote() => _quoteLevel--; + + public void PrintOpeningQuote() + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.OpeningPrimaryQuote : Format.OpeningSecondaryQuote)); + + public void PrintClosingQuote() + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.ClosingPrimaryQuote : Format.ClosingSecondaryQuote)); + + /// + /// Dequeues the current block attribute set and returns it, queuing a new attribute set. + /// + /// + public BlockAttribs NextAttribs(RstBlock block) + { + var attribs = CurrentBlockAttribs; + + _blockManager.Add(attribs, block); + _blockManager.SetPrevAttribs(attribs); + + switch (attribs.Persistence) + { + case AttribPersistence.Off: + CurrentBlockAttribs = new BlockAttribs(); + break; + + case AttribPersistence.On: + CurrentBlockAttribs = new BlockAttribs(); + break; + + case AttribPersistence.Once: + CurrentBlockAttribs = _blockManager.GetPrevious(1); + break; + } + + return attribs; + } + + public void SetYield() => shouldYield = true; + + public RantOutput Run(double timeout, RantProgram pattern = null) + { + lock (PatternArgs ?? fallbackArgsLockObj) + { + if (pattern == null) pattern = Pattern; + LastTimeout = timeout; + long timeoutMS = (long)(timeout * 1000); + bool timed = timeoutMS > 0; + bool stopwatchAlreadyRunning = _stopwatch.IsRunning; + if (!_stopwatch.IsRunning) + { + _stopwatch.Reset(); + _stopwatch.Start(); + } + + ScriptObjectStack.Clear(); + var callStack = new Stack>(); + IEnumerator action; + + // Push the AST root + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); + + top: + while (callStack.Any()) + { + // Get the topmost call stack item + action = callStack.Peek(); + + // Execute the node until it runs out of children + while (action.MoveNext()) + { + if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-pattern-timeout", timeout)); + } + + if (callStack.Count >= RantEngine.MaxStackSize) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-stack-overflow", RantEngine.MaxStackSize)); + } + + if (action.Current == null) break; + + // Push child node onto stack and start over + CurrentAction = action.Current; + callStack.Push(CurrentAction.Run(this)); + goto top; + } + + // Remove node once finished + callStack.Pop(); + } + + if (!stopwatchAlreadyRunning) _stopwatch.Stop(); + + return Return(); + } + } + + public IEnumerable RunSerial(double timeout, RantProgram pattern = null) + { + lock (PatternArgs ?? fallbackArgsLockObj) + { + if (pattern == null) pattern = Pattern; + LastTimeout = timeout; + long timeoutMS = (long)(timeout * 1000); + bool timed = timeoutMS > 0; + bool stopwatchAlreadyRunning = _stopwatch.IsRunning; + if (!_stopwatch.IsRunning) + { + _stopwatch.Reset(); + _stopwatch.Start(); + } + + ScriptObjectStack.Clear(); + var callStack = new Stack>(); + IEnumerator action; + + // Push the AST root + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); + + top: + while (callStack.Any()) + { + // Get the topmost call stack item + action = callStack.Peek(); + + // Execute the node until it runs out of children + while (action.MoveNext()) + { + if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-pattern-timeout", timeout)); + } + + if (callStack.Count >= RantEngine.MaxStackSize) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-stack-overflow", RantEngine.MaxStackSize)); + } + + if (action.Current == null) break; + + // Push child node onto stack and start over + CurrentAction = action.Current; + callStack.Push(CurrentAction.Run(this)); + goto top; + } + + if (shouldYield) + { + shouldYield = false; + yield return Return(); + AddOutputWriter(); + } + + // Remove node once finished + callStack.Pop(); + } + + if (!stopwatchAlreadyRunning) _stopwatch.Stop(); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Extensions.cs b/Rant/Core/Utilities/Extensions.cs index c178965..4984412 100644 --- a/Rant/Core/Utilities/Extensions.cs +++ b/Rant/Core/Utilities/Extensions.cs @@ -27,40 +27,40 @@ namespace Rant.Core.Utilities { - internal static class Extensions - { - public static ulong RotL(this ulong data, int times) - { - return (data << (times % 64)) | (data >> (64 - times % 64)); - } + internal static class Extensions + { + public static ulong RotL(this ulong data, int times) + { + return (data << (times % 64)) | (data >> (64 - times % 64)); + } - public static ulong RotR(this ulong data, int times) - { - return (data >> (times % 64)) | (data << (64 - times % 64)); - } + public static ulong RotR(this ulong data, int times) + { + return (data >> (times % 64)) | (data << (64 - times % 64)); + } - public static long Hash(this string input) - { - unchecked - { - long seed = 13; - foreach (char c in input) - { - seed += c * 19; - seed *= 6364136223846793005; - } - return seed; - } - } + public static long Hash(this string input) + { + unchecked + { + long seed = 13; + foreach (char c in input) + { + seed += c * 19; + seed *= 6364136223846793005; + } + return seed; + } + } - public static void AddRange(this HashSet hashset, params T[] items) - { - foreach (var item in items) hashset.Add(item); - } + public static void AddRange(this HashSet hashset, params T[] items) + { + foreach (var item in items) hashset.Add(item); + } - public static void AddRange(this HashSet hashset, IEnumerable items) - { - foreach (var item in items) hashset.Add(item); - } - } + public static void AddRange(this HashSet hashset, IEnumerable items) + { + foreach (var item in items) hashset.Add(item); + } + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Limit.cs b/Rant/Core/Utilities/Limit.cs index 1a265bb..38eee61 100644 --- a/Rant/Core/Utilities/Limit.cs +++ b/Rant/Core/Utilities/Limit.cs @@ -25,21 +25,21 @@ namespace Rant.Core.Utilities { - internal sealed class Limit - { - private int _value; + internal sealed class Limit + { + private int _value; - public Limit(int max) - { - Maximum = max; - _value = 0; - } + public Limit(int max) + { + Maximum = max; + _value = 0; + } - public int Maximum { get; } + public int Maximum { get; } - public bool Accumulate(int value) - { - return Maximum > 0 && (_value += value) > Maximum; - } - } + public bool Accumulate(int value) + { + return Maximum > 0 && (_value += value) > Maximum; + } + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index 8a3bf6e..cefc7d3 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -35,281 +35,283 @@ namespace Rant.Core.Utilities { - internal static class Util - { - private static readonly Dictionary> _enumTable = new Dictionary>(); + internal static class Util + { + private static readonly Dictionary> _enumTable = new Dictionary>(); - public static bool IsUppercase(string sample) - { - // All-caps? - if (!sample.Where(char.IsLetter).All(char.IsUpper)) return false; + public static bool IsUppercase(string sample) + { + // All-caps? + if (!sample.Where(char.IsLetter).All(char.IsUpper)) return false; - int longest = 0; - int curLength = 0; - for (int i = 0; i < sample.Length; i++) - if (char.IsUpper(sample[i])) - { - if (++curLength > longest) longest++; - } - else - { - curLength = 0; - } + int longest = 0; + int curLength = 0; + for (int i = 0; i < sample.Length; i++) + { + if (char.IsUpper(sample[i])) + { + if (++curLength > longest) longest++; + } + else + curLength = 0; + } - return longest > 1; - } + return longest > 1; + } - private static void CacheEnum(Type type) - { - if (!type.IsEnum || _enumTable.ContainsKey(type)) return; - _enumTable[type] = new HashSet(Enum.GetNames(type)); - } + private static void CacheEnum(Type type) + { + if (!type.IsEnum || _enumTable.ContainsKey(type)) return; + _enumTable[type] = new HashSet(Enum.GetNames(type)); + } - public static bool TryParseEnum(Type enumType, string modeString, out object value) - { - value = null; - if (!enumType.IsEnum) throw new ArgumentException("TEnum must be an enumerated type."); - CacheEnum(enumType); - string name = SnakeToCamel(modeString.Trim()); - var cache = _enumTable[enumType]; - if (!cache.Contains(name)) return false; - value = Enum.Parse(enumType, name, true); - return true; - } + public static bool TryParseEnum(Type enumType, string modeString, out object value) + { + value = null; + if (!enumType.IsEnum) throw new ArgumentException("TEnum must be an enumerated type."); + CacheEnum(enumType); + string name = SnakeToCamel(modeString.Trim()); + var cache = _enumTable[enumType]; + if (!cache.Contains(name)) return false; + value = Enum.Parse(enumType, name, true); + return true; + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool IsNullOrWhiteSpace(string value) - { - return value == null || value.Length == 0 || value.All(char.IsWhiteSpace); - } + public static bool IsNullOrWhiteSpace(string value) + { + return value == null || value.Length == 0 || value.All(char.IsWhiteSpace); + } - public static int HashOf(params object[] objects) - { - return unchecked(objects.Select(o => o.GetHashCode()).Aggregate(17, (hash, next) => hash * 31 + next)); - } + public static int HashOf(params object[] objects) + { + return unchecked(objects.Select(o => o.GetHashCode()).Aggregate(17, (hash, next) => hash * 31 + next)); + } - public static bool ParseInt(string value, out int number) - { - if (int.TryParse(value, out number)) return true; - if (IsNullOrWhiteSpace(value)) return false; - value = value.Trim(); - if (!char.IsLetter(value[value.Length - 1])) return false; - char power = value[value.Length - 1]; - value = value.Substring(0, value.Length - 1); - if (IsNullOrWhiteSpace(value)) return false; - double n; - if (!double.TryParse(value, out n)) return false; - switch (power) - { - case 'k': // Thousand - number = (int)(n * 1000); - return true; - case 'M': // Million - number = (int)(n * 1000000); - return true; - case 'B': // Billion - number = (int)(n * 1000000000); - return true; - default: - return false; - } - } + public static bool ParseInt(string value, out int number) + { + if (int.TryParse(value, out number)) return true; + if (IsNullOrWhiteSpace(value)) return false; + value = value.Trim(); + if (!char.IsLetter(value[value.Length - 1])) return false; + char power = value[value.Length - 1]; + value = value.Substring(0, value.Length - 1); + if (IsNullOrWhiteSpace(value)) return false; + double n; + if (!double.TryParse(value, out n)) return false; + switch (power) + { + case 'k': // Thousand + number = (int)(n * 1000); + return true; + case 'M': // Million + number = (int)(n * 1000000); + return true; + case 'B': // Billion + number = (int)(n * 1000000000); + return true; + default: + return false; + } + } - public static bool ParseDouble(string value, out double number) - { - number = 0; - if (IsNullOrWhiteSpace(value)) return false; - value = value.Trim(); - if (!char.IsLetter(value[value.Length - 1])) - return double.TryParse(value, out number); - char power = value[value.Length - 1]; - value = value.Substring(0, value.Length - 1); - if (IsNullOrWhiteSpace(value)) return false; - double n; - if (!double.TryParse(value, out n)) return false; - switch (power) - { - case 'k': // Thousand - number = (int)(n * 1000); - return true; - case 'M': // Million - number = (int)(n * 1000000); - return true; - case 'B': // Billion - number = (int)(n * 1000000000); - return true; - default: - return false; - } - } + public static bool ParseDouble(string value, out double number) + { + number = 0; + if (IsNullOrWhiteSpace(value)) return false; + value = value.Trim(); + if (!char.IsLetter(value[value.Length - 1])) + return double.TryParse(value, out number); + char power = value[value.Length - 1]; + value = value.Substring(0, value.Length - 1); + if (IsNullOrWhiteSpace(value)) return false; + double n; + if (!double.TryParse(value, out n)) return false; + switch (power) + { + case 'k': // Thousand + number = (int)(n * 1000); + return true; + case 'M': // Million + number = (int)(n * 1000000); + return true; + case 'B': // Billion + number = (int)(n * 1000000000); + return true; + default: + return false; + } + } - public static bool BooleanRep(string input) - { - if (IsNullOrWhiteSpace(input)) return false; - string v = input.ToLower().Trim(); - if (v == "false" || v == "0") return false; - if (v == "true") return true; - double d; - return double.TryParse(v, out d); - } + public static bool BooleanRep(string input) + { + if (IsNullOrWhiteSpace(input)) return false; + string v = input.ToLower().Trim(); + if (v == "false" || v == "0") return false; + if (v == "true") return true; + double d; + return double.TryParse(v, out d); + } - public static string SnakeToCamel(string name) - { - if (string.IsNullOrEmpty(name)) return name; - var sb = new StringBuilder(); - for (int i = 0; i < name.Length; i++) - if (i == 0) - sb.Append(char.ToUpper(name[i])); - else if ((name[i] == '_' || name[i] == '-') && i + 1 < name.Length) - sb.Append(char.ToUpper(name[++i])); - else - sb.Append(char.ToLower(name[i])); - return sb.ToString(); - } + public static string SnakeToCamel(string name) + { + if (string.IsNullOrEmpty(name)) return name; + var sb = new StringBuilder(); + for (int i = 0; i < name.Length; i++) + { + if (i == 0) + sb.Append(char.ToUpper(name[i])); + else if ((name[i] == '_' || name[i] == '-') && i + 1 < name.Length) + sb.Append(char.ToUpper(name[++i])); + else + sb.Append(char.ToLower(name[i])); + } + return sb.ToString(); + } - public static string CamelToSnake(string camelName) - { - string name = camelName.Trim(); - if (IsNullOrWhiteSpace(name)) return name; - if (name.Length == 1) return name.ToLower(); - var sb = new StringBuilder(); - bool a, b; - bool last = false; - for (int i = 0; i < name.Length - 1; i++) - { - a = char.IsUpper(name[i]); - b = char.IsUpper(name[i + 1]); - if (last && a && !b) sb.Append('-'); - sb.Append(char.ToLower(name[i])); - if (!a && b) sb.Append('-'); - last = a; - } - sb.Append(char.ToLower(name[name.Length - 1])); - return sb.ToString(); - } + public static string CamelToSnake(string camelName) + { + string name = camelName.Trim(); + if (IsNullOrWhiteSpace(name)) return name; + if (name.Length == 1) return name.ToLower(); + var sb = new StringBuilder(); + bool a, b; + bool last = false; + for (int i = 0; i < name.Length - 1; i++) + { + a = char.IsUpper(name[i]); + b = char.IsUpper(name[i + 1]); + if (last && a && !b) sb.Append('-'); + sb.Append(char.ToLower(name[i])); + if (!a && b) sb.Append('-'); + last = a; + } + sb.Append(char.ToLower(name[name.Length - 1])); + return sb.ToString(); + } - public static Regex ParseRegex(string regexLiteral) - { - if (string.IsNullOrEmpty(regexLiteral)) - throw new ArgumentException($"Argument '{nameof(regexLiteral)}' cannot be null nor empty."); - bool noCase = regexLiteral.EndsWith("i"); - string literal = regexLiteral.TrimEnd('i'); - if (!literal.StartsWith("`") || !literal.EndsWith("`")) - throw new FormatException("Regex literal was not in the correct format."); + public static Regex ParseRegex(string regexLiteral) + { + if (string.IsNullOrEmpty(regexLiteral)) + throw new ArgumentException($"Argument '{nameof(regexLiteral)}' cannot be null nor empty."); + bool noCase = regexLiteral.EndsWith("i"); + string literal = regexLiteral.TrimEnd('i'); + if (!literal.StartsWith("`") || !literal.EndsWith("`")) + throw new FormatException("Regex literal was not in the correct format."); - return new Regex(literal.Substring(1, literal.Length - 2), - (noCase ? RegexOptions.IgnoreCase : RegexOptions.None) | RegexOptions.ExplicitCapture | RegexOptions.Compiled); - } + return new Regex(literal.Substring(1, literal.Length - 2), + (noCase ? RegexOptions.IgnoreCase : RegexOptions.None) | RegexOptions.ExplicitCapture | RegexOptions.Compiled); + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool ValidateName(string input) - { - return input != null && input.Length > 0 && input.All(c => char.IsLetterOrDigit(c) || c == '_'); - } + public static bool ValidateName(string input) + { + return input != null && input.Length > 0 && input.All(c => char.IsLetterOrDigit(c) || c == '_'); + } - public static string Alt(string input, string alternate) - { - return string.IsNullOrEmpty(input) ? alternate : input; - } + public static string Alt(string input, string alternate) + { + return string.IsNullOrEmpty(input) ? alternate : input; + } - public static int Mod(int a, int b) => (a % b + b) % b; + public static int Mod(int a, int b) => (a % b + b) % b; #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static char ReverseChar(char c) - { - switch (c) - { - case '(': - return ')'; - case ')': - return '('; - case '[': - return ']'; - case ']': - return '['; - case '{': - return '}'; - case '}': - return '{'; - case '<': - return '>'; + public static char ReverseChar(char c) + { + switch (c) + { + case '(': + return ')'; + case ')': + return '('; + case '[': + return ']'; + case ']': + return '['; + case '{': + return '}'; + case '}': + return '{'; + case '<': + return '>'; case '>': return '<'; case '«': - return '»'; - case '»': - return '«'; - case '‹': - return '›'; - case '›': - return '‹'; - case '\u201c': - return '\u201d'; - case '\u201d': - return '\u201c'; - case '\u2018': - return '\u2019'; - case '\u2019': - return '\u2018'; - default: - return c; - } - } + return '»'; + case '»': + return '«'; + case '‹': + return '›'; + case '›': + return '‹'; + case '\u201c': + return '\u201d'; + case '\u201d': + return '\u201c'; + case '\u2018': + return '\u2019'; + case '\u2019': + return '\u2018'; + default: + return c; + } + } - public static char GetAccentChar(this Accent accent) - { - switch (accent) - { - case Accent.Acute: - return '\u0301'; - case Accent.Circumflex: - return '\u0302'; - case Accent.Grave: - return '\u0300'; - case Accent.Ring: - return '\u030A'; - case Accent.Tilde: - return '\u0303'; - case Accent.Diaeresis: - return '\u0308'; - case Accent.Caron: - return '\u030C'; - case Accent.Macron: - return '\u0304'; - default: - return '?'; - } - } + public static char GetAccentChar(this Accent accent) + { + switch (accent) + { + case Accent.Acute: + return '\u0301'; + case Accent.Circumflex: + return '\u0302'; + case Accent.Grave: + return '\u0300'; + case Accent.Ring: + return '\u030A'; + case Accent.Tilde: + return '\u0303'; + case Accent.Diaeresis: + return '\u0308'; + case Accent.Caron: + return '\u030C'; + case Accent.Macron: + return '\u0304'; + default: + return '?'; + } + } #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool TryParseSurrogatePair(string value, out char highSurrogate, out char lowSurrogate) - { - highSurrogate = lowSurrogate = '\0'; - if (value?.Length != 8) return false; + public static bool TryParseSurrogatePair(string value, out char highSurrogate, out char lowSurrogate) + { + highSurrogate = lowSurrogate = '\0'; + if (value?.Length != 8) return false; - const uint lowSurrogateMask = 0x3ff; - const uint highSurrogateMask = lowSurrogateMask << 10; - const uint lowSurrogateOffset = 0xDC00; - const uint highSurrogateOffset = 0xD800; - const uint minCodePoint = 0x10000; - uint codePoint; + const uint lowSurrogateMask = 0x3ff; + const uint highSurrogateMask = lowSurrogateMask << 10; + const uint lowSurrogateOffset = 0xDC00; + const uint highSurrogateOffset = 0xD800; + const uint minCodePoint = 0x10000; + uint codePoint; - if (!uint.TryParse(value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - return false; - if (codePoint < minCodePoint) return false; + if (!uint.TryParse(value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + return false; + if (codePoint < minCodePoint) return false; - codePoint -= minCodePoint; - highSurrogate = (char)(((codePoint & highSurrogateMask) >> 10) + highSurrogateOffset); - lowSurrogate = (char)((codePoint & lowSurrogateMask) + lowSurrogateOffset); + codePoint -= minCodePoint; + highSurrogate = (char)(((codePoint & highSurrogateMask) >> 10) + highSurrogateOffset); + lowSurrogate = (char)((codePoint & lowSurrogateMask) + lowSurrogateOffset); - return true; - } - } + return true; + } + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Witchcraft.cs b/Rant/Core/Utilities/Witchcraft.cs index ecf4474..cd2d2d6 100644 --- a/Rant/Core/Utilities/Witchcraft.cs +++ b/Rant/Core/Utilities/Witchcraft.cs @@ -30,388 +30,390 @@ namespace Rant.Core.Utilities { - internal delegate TResult XFunc(); + internal delegate TResult XFunc(); - internal delegate TResult XFunc(A a); + internal delegate TResult XFunc(A a); - internal delegate TResult XFunc(A a, B b); + internal delegate TResult XFunc(A a, B b); - internal delegate TResult XFunc(A a, B b, C c); + internal delegate TResult XFunc(A a, B b, C c); - internal delegate TResult XFunc(A a, B b, C c, D d); + internal delegate TResult XFunc(A a, B b, C c, D d); - internal delegate TResult XFunc(A a, B b, C c, D d, E e); + internal delegate TResult XFunc(A a, B b, C c, D d, E e); - internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f); + internal delegate TResult XFunc(A a, B b, C c, D d, E e, F f); - internal delegate TResult XFunc( - A a, B b, C c, D d, E e, F f, G g); + internal delegate TResult XFunc( + A a, B b, C c, D d, E e, F f, G g); - internal delegate TResult XFunc( - A a, B b, C c, D d, E e, F f, G g, H h); + internal delegate TResult XFunc( + A a, B b, C c, D d, E e, F f, G g, H h); - internal delegate TResult XFunc( - A a, B b, C c, D d, E e, F f, G g, H h, I i); + internal delegate TResult XFunc( + A a, B b, C c, D d, E e, F f, G g, H h, I i); - internal delegate void XAction(); + internal delegate void XAction(); - internal delegate void XAction(A a); + internal delegate void XAction(A a); - internal delegate void XAction(A a, B b); + internal delegate void XAction(A a, B b); - internal delegate void XAction(A a, B b, C c); + internal delegate void XAction(A a, B b, C c); - internal delegate void XAction(A a, B b, C c, D d); + internal delegate void XAction(A a, B b, C c, D d); - internal delegate void XAction(A a, B b, C c, D d, E e); + internal delegate void XAction(A a, B b, C c, D d, E e); - internal delegate void XAction(A a, B b, C c, D d, E e, F f); + internal delegate void XAction(A a, B b, C c, D d, E e, F f); - internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g); + internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g); - internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g, H h); + internal delegate void XAction(A a, B b, C c, D d, E e, F f, G g, H h); - internal delegate void XAction( - A a, B b, C c, D d, E e, F f, G g, H h, I i); + internal delegate void XAction( + A a, B b, C c, D d, E e, F f, G g, H h, I i); - /// - /// Allows creation of Rant function delegates from reflected methods that can be invoked using a series of boxed - /// arguments. - /// - internal abstract class Witchcraft - { - private static readonly Type[] _funcTypes; - private static readonly Type[] _voidTypes; + /// + /// Allows creation of Rant function delegates from reflected methods that can be invoked using a series of boxed + /// arguments. + /// + internal abstract class Witchcraft + { + private static readonly Type[] _funcTypes; + private static readonly Type[] _voidTypes; - static Witchcraft() - { - var ass = Assembly.GetAssembly(typeof(Witchcraft)); - var lstFuncTypes = new List(); - var lstVoidTypes = new List(); - foreach (var type in ass.GetTypes().Where(t => t.IsSubclassOf(typeof(Witchcraft)) && t.IsGenericTypeDefinition)) - if (type.IsSubclassOf(typeof(WitchcraftVoid))) - lstVoidTypes.Add(type); - else - lstFuncTypes.Add(type); + static Witchcraft() + { + var ass = Assembly.GetAssembly(typeof(Witchcraft)); + var lstFuncTypes = new List(); + var lstVoidTypes = new List(); + foreach (var type in ass.GetTypes().Where(t => t.IsSubclassOf(typeof(Witchcraft)) && t.IsGenericTypeDefinition)) + { + if (type.IsSubclassOf(typeof(WitchcraftVoid))) + lstVoidTypes.Add(type); + else + lstFuncTypes.Add(type); + } - _funcTypes = lstFuncTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); - _voidTypes = lstVoidTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); - } + _funcTypes = lstFuncTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); + _voidTypes = lstVoidTypes.OrderBy(t => t.GetGenericArguments().Length).ToArray(); + } - public static Witchcraft Create(MethodInfo methodInfo) - { - bool isVoid = methodInfo.ReturnType == typeof(void); - var types = methodInfo.GetParameters().Select(p => p.ParameterType).ToArray(); - if (types.Length == 0 || types[0] != typeof(Sandbox)) - throw new ArgumentException("Method must have a Sandbox parameter come first.", nameof(methodInfo)); + public static Witchcraft Create(MethodInfo methodInfo) + { + bool isVoid = methodInfo.ReturnType == typeof(void); + var types = methodInfo.GetParameters().Select(p => p.ParameterType).ToArray(); + if (types.Length == 0 || types[0] != typeof(Sandbox)) + throw new ArgumentException("Method must have a Sandbox parameter come first.", nameof(methodInfo)); - var argTypes = types.Skip(1).ToArray(); - if (argTypes.Length >= _funcTypes.Length) - throw new ArgumentException($"Methods with {types.Length} argument(s) are not currently supported."); + var argTypes = types.Skip(1).ToArray(); + if (argTypes.Length >= _funcTypes.Length) + throw new ArgumentException($"Methods with {types.Length} argument(s) are not currently supported."); - if (argTypes.Length == 0) - { - if (isVoid) - return new WitchcraftNoParamsVoid(methodInfo); - return new WitchcraftNoParams(methodInfo); - } + if (argTypes.Length == 0) + { + if (isVoid) + return new WitchcraftNoParamsVoid(methodInfo); + return new WitchcraftNoParams(methodInfo); + } - var type = isVoid - ? _voidTypes[argTypes.Length - 1].MakeGenericType(argTypes) - : _funcTypes[argTypes.Length - 1].MakeGenericType(argTypes); + var type = isVoid + ? _voidTypes[argTypes.Length - 1].MakeGenericType(argTypes) + : _funcTypes[argTypes.Length - 1].MakeGenericType(argTypes); + + return (Witchcraft)Activator.CreateInstance(type, methodInfo); + } - return (Witchcraft)Activator.CreateInstance(type, methodInfo); - } + public abstract object Invoke(Sandbox sb, object[] args); + } - public abstract object Invoke(Sandbox sb, object[] args); - } - - internal abstract class WitchcraftVoid : Witchcraft - { - } - - internal class WitchcraftNoParams : Witchcraft - { - private readonly XFunc _func; - - public WitchcraftNoParams(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => _func(sb); - } - - internal class WitchcraftNoParamsVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftNoParamsVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => _func(sb, (A)args[0]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6]); - return null; - } - } - - internal class Witchcraft : Witchcraft - { - private readonly XFunc _func; - - public Witchcraft(MethodInfo methodInfo) - { - _func = (XFunc)Delegate.CreateDelegate( - typeof(XFunc), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) => - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6], (H)args[7]); - } - - internal class WitchcraftVoid : WitchcraftVoid - { - private readonly XAction _func; - - public WitchcraftVoid(MethodInfo methodInfo) - { - _func = (XAction)Delegate.CreateDelegate( - typeof(XAction), methodInfo); - } - - public override object Invoke(Sandbox sb, object[] args) - { - _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], - (E)args[4], (F)args[5], (G)args[6], (H)args[7]); - return null; - } - } + internal abstract class WitchcraftVoid : Witchcraft + { + } + + internal class WitchcraftNoParams : Witchcraft + { + private readonly XFunc _func; + + public WitchcraftNoParams(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => _func(sb); + } + + internal class WitchcraftNoParamsVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftNoParamsVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => _func(sb, (A)args[0]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6]); + return null; + } + } + + internal class Witchcraft : Witchcraft + { + private readonly XFunc _func; + + public Witchcraft(MethodInfo methodInfo) + { + _func = (XFunc)Delegate.CreateDelegate( + typeof(XFunc), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) => + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6], (H)args[7]); + } + + internal class WitchcraftVoid : WitchcraftVoid + { + private readonly XAction _func; + + public WitchcraftVoid(MethodInfo methodInfo) + { + _func = (XAction)Delegate.CreateDelegate( + typeof(XAction), methodInfo); + } + + public override object Invoke(Sandbox sb, object[] args) + { + _func(sb, (A)args[0], (B)args[1], (C)args[2], (D)args[3], + (E)args[4], (F)args[5], (G)args[6], (H)args[7]); + return null; + } + } } \ No newline at end of file diff --git a/Rant/Formats/EnglishPluralizer.cs b/Rant/Formats/EnglishPluralizer.cs index 8fb3bf5..2749491 100644 --- a/Rant/Formats/EnglishPluralizer.cs +++ b/Rant/Formats/EnglishPluralizer.cs @@ -31,114 +31,114 @@ namespace Rant.Formats { - /// - /// Pluralizer for English nouns. - /// - public sealed class EnglishPluralizer : Pluralizer - { - private static readonly HashSet consonants = - new HashSet(new[] - { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z' }); + /// + /// Pluralizer for English nouns. + /// + public sealed class EnglishPluralizer : Pluralizer + { + private static readonly HashSet consonants = + new HashSet(new[] + { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z' }); - private static readonly HashSet hardConsonants = - new HashSet(new[] { 'b', 'c', 'd', 'f', 'g', 'j', 'm', 'q', 's', 'v', 'x', 'z' }); + private static readonly HashSet hardConsonants = + new HashSet(new[] { 'b', 'c', 'd', 'f', 'g', 'j', 'm', 'q', 's', 'v', 'x', 'z' }); - private static readonly Dictionary irregulars = - new Dictionary(StringComparer.InvariantCultureIgnoreCase) - { - { "man", "men" }, - { "foot", "feet" }, - { "tooth", "teeth" }, - { "antenna", "antennae" }, - { "thesis", "theses" }, - { "axis", "axes" }, - { "basis", "bases" }, - { "leaf", "leaves" }, - { "calf", "calves" }, - { "knife", "knives" }, - { "life", "lives" }, - { "dwarf", "dwarves" }, - { "wolf", "wolves" }, - { "hoof", "hooves" }, - { "elf", "elves" }, - { "goose", "geese" }, - { "louse", "lice" }, - { "mouse", "mice" }, - { "dormouse", "dormice" }, - { "person", "people" }, - { "die", "dice" }, - { "index", "indices" }, - { "matrix", "matrices" }, - { "vertex", "vertices" }, - { "criterion", "criteria" }, - { "passerby", "passersby" }, - { "ox", "oxen" }, - { "alumnus", "alumni" }, - { "cactus", "cacti" }, - { "fungus", "fungi" }, - { "focus", "foci" }, - { "nucleus", "nuclei" }, - { "radius", "radii" }, - { "stimulus", "stimuli" }, - { "child", "children" } - }; + private static readonly Dictionary irregulars = + new Dictionary(StringComparer.InvariantCultureIgnoreCase) + { + { "man", "men" }, + { "foot", "feet" }, + { "tooth", "teeth" }, + { "antenna", "antennae" }, + { "thesis", "theses" }, + { "axis", "axes" }, + { "basis", "bases" }, + { "leaf", "leaves" }, + { "calf", "calves" }, + { "knife", "knives" }, + { "life", "lives" }, + { "dwarf", "dwarves" }, + { "wolf", "wolves" }, + { "hoof", "hooves" }, + { "elf", "elves" }, + { "goose", "geese" }, + { "louse", "lice" }, + { "mouse", "mice" }, + { "dormouse", "dormice" }, + { "person", "people" }, + { "die", "dice" }, + { "index", "indices" }, + { "matrix", "matrices" }, + { "vertex", "vertices" }, + { "criterion", "criteria" }, + { "passerby", "passersby" }, + { "ox", "oxen" }, + { "alumnus", "alumni" }, + { "cactus", "cacti" }, + { "fungus", "fungi" }, + { "focus", "foci" }, + { "nucleus", "nuclei" }, + { "radius", "radii" }, + { "stimulus", "stimuli" }, + { "child", "children" } + }; - private static readonly HashSet ignore = new HashSet(StringComparer.InvariantCultureIgnoreCase) - { - "deer", - "fish", - "means", - "offspring", - "series", - "sheep", - "species", - "trout", - "bison", - "buffalo", - "moose", - "pike", - "plankton", - "salmon", - "squid", - "swine", - "swiss", - "chinese" - }; + private static readonly HashSet ignore = new HashSet(StringComparer.InvariantCultureIgnoreCase) + { + "deer", + "fish", + "means", + "offspring", + "series", + "sheep", + "species", + "trout", + "bison", + "buffalo", + "moose", + "pike", + "plankton", + "salmon", + "squid", + "swine", + "swiss", + "chinese" + }; - /// - /// Determines the plural form of the specified English noun. - /// - /// The singular form of the noun to pluralize. - /// - public override string Pluralize(string input) - { - if (Util.IsNullOrWhiteSpace(input)) return input; - input = input.Trim().ToLowerInvariant(); - int l = input.Length; - if (l == 1) return input.ToUpperInvariant() + "'s"; - if (ignore.Contains(input)) return input; - string result; - if (irregulars.TryGetValue(input, out result)) return result; - if ((result = irregulars.Keys.FirstOrDefault(w => input.EndsWith(w))) != null) - return input.Substring(0, l - result.Length) + irregulars[result]; + /// + /// Determines the plural form of the specified English noun. + /// + /// The singular form of the noun to pluralize. + /// + public override string Pluralize(string input) + { + if (Util.IsNullOrWhiteSpace(input)) return input; + input = input.Trim().ToLowerInvariant(); + int l = input.Length; + if (l == 1) return input.ToUpperInvariant() + "'s"; + if (ignore.Contains(input)) return input; + string result; + if (irregulars.TryGetValue(input, out result)) return result; + if ((result = irregulars.Keys.FirstOrDefault(w => input.EndsWith(w))) != null) + return input.Substring(0, l - result.Length) + irregulars[result]; - if (consonants.Contains(input[l - 2])) - { - // With nouns ending in o preceded by a consonant, the plural in many cases is spelled by adding -es... - if (input.EndsWith("o")) return input + "es"; + if (consonants.Contains(input[l - 2])) + { + // With nouns ending in o preceded by a consonant, the plural in many cases is spelled by adding -es... + if (input.EndsWith("o")) return input + "es"; - // Nouns ending in a y preceded by a consonant usually drop the y and add -ies... - if (input.EndsWith("y") || input.EndsWith("quy")) return input.Substring(0, l - 1) + "ies"; - } + // Nouns ending in a y preceded by a consonant usually drop the y and add -ies... + if (input.EndsWith("y") || input.EndsWith("quy")) return input.Substring(0, l - 1) + "ies"; + } - // Plurals of words ending in "man" end in "men" - if (input.EndsWith("man")) return input.Substring(0, l - 2) + "en"; + // Plurals of words ending in "man" end in "men" + if (input.EndsWith("man")) return input.Substring(0, l - 2) + "en"; - // Add -es to words ending in a hard consonant - if (input.EndsWith("ch") || input.EndsWith("sh") || hardConsonants.Contains(input[l - 1])) return input + "es"; + // Add -es to words ending in a hard consonant + if (input.EndsWith("ch") || input.EndsWith("sh") || hardConsonants.Contains(input[l - 1])) return input + "es"; - // Default - return input + "s"; - } - } + // Default + return input + "s"; + } + } } \ No newline at end of file diff --git a/Rant/Formats/Pluralizer.cs b/Rant/Formats/Pluralizer.cs index 509aaff..35f76c7 100644 --- a/Rant/Formats/Pluralizer.cs +++ b/Rant/Formats/Pluralizer.cs @@ -25,16 +25,16 @@ namespace Rant.Formats { - /// - /// The base class for pluralizers, which infer the plural form of a given noun. - /// - public abstract class Pluralizer - { - /// - /// Converts the specified input noun to a plural version. - /// - /// The noun to convert. - /// - public abstract string Pluralize(string input); - } + /// + /// The base class for pluralizers, which infer the plural form of a given noun. + /// + public abstract class Pluralizer + { + /// + /// Converts the specified input noun to a plural version. + /// + /// The noun to convert. + /// + public abstract string Pluralize(string input); + } } \ No newline at end of file diff --git a/Rant/Formats/RantFormat.cs b/Rant/Formats/RantFormat.cs index 5b108a5..bc888d1 100644 --- a/Rant/Formats/RantFormat.cs +++ b/Rant/Formats/RantFormat.cs @@ -32,208 +32,208 @@ namespace Rant.Formats { - /// - /// Describes language-specific formatting instructions for localizing interpreter output. - /// - public sealed class RantFormat - { - /// - /// English formatting. - /// - public static RantFormat English; - - static RantFormat() - { - English = new RantFormat(); - English.TitleCaseExclusions.AddRange( - "a", "an", "the", "that", "where", "when", "for", "any", "or", "and", "of", "in", "at", "as", "into", "if", - "are", "you", "why", "from"); - } - - /// - /// Creates a new RantFormat instance with default values. - /// - public RantFormat() - { - } - - /// - /// Creates a new RantFormat instance with the specified culture. - /// - /// The culture to associate with the format. - public RantFormat(CultureInfo culture) - { - Culture = culture; - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, and alphabet. - /// - /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters) - { - Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, and quotation marks. - /// - /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - /// The opening primary quotation mark to use. - /// The closing primary quotation mark to use. - /// The opening secondary quotation mark to use. - /// The closing secondary quotation mark to use. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, - char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote) - { - Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - OpeningPrimaryQuote = openingPrimaryQuote; - ClosingPrimaryQuote = closingPrimaryQuote; - OpeningSecondaryQuote = openingSecondaryQuote; - ClosingSecondaryQuote = closingSecondaryQuote; - } - - /// - /// Creates a new RantFormat instance with the specified culture and title case exclusion list. - /// - /// The culture to associate with the format. - /// A collection of words to exclude from title case capitalization. - public RantFormat(CultureInfo culture, IEnumerable titleCaseExclusions) - { - Culture = culture; - foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); - } - - /// - /// Creates a new RantFormat instance with the specified culture, title case exclusion list, and pluralizer. - /// - /// The culture to associate with the format. - /// A collection of words to exclude from title case capitalization. - /// The pluralizer to use. - public RantFormat(CultureInfo culture, IEnumerable titleCaseExclusions, Pluralizer pluralizer) - { - Culture = culture; - foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); - Pluralizer = pluralizer; - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, quotation marks, and title case - /// exclusion list. - /// - /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - /// The opening primary quotation mark to use. - /// The closing primary quotation mark to use. - /// The opening secondary quotation mark to use. - /// The closing secondary quotation mark to use. - /// A collection of words to exclude from title case capitalization. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, - char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote, - IEnumerable titleCaseExclusions) - { - Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - OpeningPrimaryQuote = openingPrimaryQuote; - ClosingPrimaryQuote = closingPrimaryQuote; - OpeningSecondaryQuote = openingSecondaryQuote; - ClosingSecondaryQuote = closingSecondaryQuote; - foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, quotation marks, title case - /// exclusion list, and pluralizer. - /// - /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - /// The opening primary quotation mark to use. - /// The closing primary quotation mark to use. - /// The opening secondary quotation mark to use. - /// The closing secondary quotation mark to use. - /// A collection of words to exclude from title case capitalization. - /// The pluralizer to use. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, - char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote, - IEnumerable titleCaseExclusions, Pluralizer pluralizer) - { - Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - OpeningPrimaryQuote = openingPrimaryQuote; - ClosingPrimaryQuote = closingPrimaryQuote; - OpeningSecondaryQuote = openingSecondaryQuote; - ClosingSecondaryQuote = closingSecondaryQuote; - foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); - Pluralizer = pluralizer; - } - - /// - /// Gets the collection of words excluded from Title Case capitalization. - /// - private HashSet TitleCaseExclusions { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); - - /// - /// The letter set used by escape sequences like \c and \w. - /// - public IEnumerable Letters => LettersInternal.AsEnumerable(); - - internal char[] LettersInternal { get; } = - { - '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' - }; - - /// - /// The standard space character used in automated formatting, such as series. - /// - public char StandardSpace { get; } = ' '; - - /// - /// The culture to format output strings with. - /// - public CultureInfo Culture { get; } = CultureInfo.InvariantCulture; - - /// - /// The pluralizer used by the [plural] function to infer plural nouns. - /// - public Pluralizer Pluralizer { get; } = new EnglishPluralizer(); - - internal bool Excludes(string word) => TitleCaseExclusions.Contains(word); - - #region Quotation marks - - /// - /// The opening primary quotation mark. - /// - public char OpeningPrimaryQuote { get; } = '\u201c'; - - /// - /// The closing primary quotation mark. - /// - public char ClosingPrimaryQuote { get; } = '\u201d'; - - /// - /// The opening secondary quotation mark. - /// - public char OpeningSecondaryQuote { get; } = '\u2018'; - - /// - /// The closing secondary quotation mark. - /// - public char ClosingSecondaryQuote { get; } = '\u2019'; - - #endregion - } + /// + /// Describes language-specific formatting instructions for localizing interpreter output. + /// + public sealed class RantFormat + { + /// + /// English formatting. + /// + public static RantFormat English; + + static RantFormat() + { + English = new RantFormat(); + English.TitleCaseExclusions.AddRange( + "a", "an", "the", "that", "where", "when", "for", "any", "or", "and", "of", "in", "at", "as", "into", "if", + "are", "you", "why", "from"); + } + + /// + /// Creates a new RantFormat instance with default values. + /// + public RantFormat() + { + } + + /// + /// Creates a new RantFormat instance with the specified culture. + /// + /// The culture to associate with the format. + public RantFormat(CultureInfo culture) + { + Culture = culture; + } + + /// + /// Creates a new RantFormat instance with the specified culture, standard space, and alphabet. + /// + /// The culture to associate with the format. + /// The standard space character to use. + /// The alphabet to use with the format. + public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters) + { + Culture = culture; + StandardSpace = stdSpace; + LettersInternal = letters.ToArray(); + } + + /// + /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, and quotation marks. + /// + /// The culture to associate with the format. + /// The standard space character to use. + /// The alphabet to use with the format. + /// The opening primary quotation mark to use. + /// The closing primary quotation mark to use. + /// The opening secondary quotation mark to use. + /// The closing secondary quotation mark to use. + public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, + char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote) + { + Culture = culture; + StandardSpace = stdSpace; + LettersInternal = letters.ToArray(); + OpeningPrimaryQuote = openingPrimaryQuote; + ClosingPrimaryQuote = closingPrimaryQuote; + OpeningSecondaryQuote = openingSecondaryQuote; + ClosingSecondaryQuote = closingSecondaryQuote; + } + + /// + /// Creates a new RantFormat instance with the specified culture and title case exclusion list. + /// + /// The culture to associate with the format. + /// A collection of words to exclude from title case capitalization. + public RantFormat(CultureInfo culture, IEnumerable titleCaseExclusions) + { + Culture = culture; + foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); + } + + /// + /// Creates a new RantFormat instance with the specified culture, title case exclusion list, and pluralizer. + /// + /// The culture to associate with the format. + /// A collection of words to exclude from title case capitalization. + /// The pluralizer to use. + public RantFormat(CultureInfo culture, IEnumerable titleCaseExclusions, Pluralizer pluralizer) + { + Culture = culture; + foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); + Pluralizer = pluralizer; + } + + /// + /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, quotation marks, and title case + /// exclusion list. + /// + /// The culture to associate with the format. + /// The standard space character to use. + /// The alphabet to use with the format. + /// The opening primary quotation mark to use. + /// The closing primary quotation mark to use. + /// The opening secondary quotation mark to use. + /// The closing secondary quotation mark to use. + /// A collection of words to exclude from title case capitalization. + public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, + char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote, + IEnumerable titleCaseExclusions) + { + Culture = culture; + StandardSpace = stdSpace; + LettersInternal = letters.ToArray(); + OpeningPrimaryQuote = openingPrimaryQuote; + ClosingPrimaryQuote = closingPrimaryQuote; + OpeningSecondaryQuote = openingSecondaryQuote; + ClosingSecondaryQuote = closingSecondaryQuote; + foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); + } + + /// + /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, quotation marks, title case + /// exclusion list, and pluralizer. + /// + /// The culture to associate with the format. + /// The standard space character to use. + /// The alphabet to use with the format. + /// The opening primary quotation mark to use. + /// The closing primary quotation mark to use. + /// The opening secondary quotation mark to use. + /// The closing secondary quotation mark to use. + /// A collection of words to exclude from title case capitalization. + /// The pluralizer to use. + public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, + char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote, + IEnumerable titleCaseExclusions, Pluralizer pluralizer) + { + Culture = culture; + StandardSpace = stdSpace; + LettersInternal = letters.ToArray(); + OpeningPrimaryQuote = openingPrimaryQuote; + ClosingPrimaryQuote = closingPrimaryQuote; + OpeningSecondaryQuote = openingSecondaryQuote; + ClosingSecondaryQuote = closingSecondaryQuote; + foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); + Pluralizer = pluralizer; + } + + /// + /// Gets the collection of words excluded from Title Case capitalization. + /// + private HashSet TitleCaseExclusions { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); + + /// + /// The letter set used by escape sequences like \c and \w. + /// + public IEnumerable Letters => LettersInternal.AsEnumerable(); + + internal char[] LettersInternal { get; } = + { + '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' + }; + + /// + /// The standard space character used in automated formatting, such as series. + /// + public char StandardSpace { get; } = ' '; + + /// + /// The culture to format output strings with. + /// + public CultureInfo Culture { get; } = CultureInfo.InvariantCulture; + + /// + /// The pluralizer used by the [plural] function to infer plural nouns. + /// + public Pluralizer Pluralizer { get; } = new EnglishPluralizer(); + + internal bool Excludes(string word) => TitleCaseExclusions.Contains(word); + + #region Quotation marks + + /// + /// The opening primary quotation mark. + /// + public char OpeningPrimaryQuote { get; } = '\u201c'; + + /// + /// The closing primary quotation mark. + /// + public char ClosingPrimaryQuote { get; } = '\u201d'; + + /// + /// The opening secondary quotation mark. + /// + public char OpeningSecondaryQuote { get; } = '\u2018'; + + /// + /// The closing secondary quotation mark. + /// + public char ClosingSecondaryQuote { get; } = '\u2019'; + + #endregion + } } \ No newline at end of file diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index b4cba01..fab1650 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -36,190 +36,192 @@ namespace Rant.Localization { - internal static class Txtres - { - public const string LanguageResourceNamespace = "Rant.Localization"; - public const string FallbackLanguageCode = "en-US"; + internal static class Txtres + { + public const string LanguageResourceNamespace = "Rant.Localization"; + public const string FallbackLanguageCode = "en-US"; - private static readonly Dictionary> _languages = - new Dictionary>(); + private static readonly Dictionary> _languages = + new Dictionary>(); - private static Dictionary _currentTable = new Dictionary(); - private static string _langName = CultureInfo.CurrentCulture.Name; + private static Dictionary _currentTable = new Dictionary(); + private static string _langName = CultureInfo.CurrentCulture.Name; - static Txtres() - { - try - { - var ass = Assembly.GetExecutingAssembly(); - string lang = CultureInfo.CurrentCulture.Name; - using (var stream = - ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{CultureInfo.CurrentCulture.Name}.lang") - ?? ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{lang = FallbackLanguageCode}.lang")) - { - if (stream == null) - { + static Txtres() + { + try + { + var ass = Assembly.GetExecutingAssembly(); + string lang = CultureInfo.CurrentCulture.Name; + using (var stream = + ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{CultureInfo.CurrentCulture.Name}.lang") + ?? ass.GetManifestResourceStream($"{LanguageResourceNamespace}.{lang = FallbackLanguageCode}.lang")) + { + if (stream == null) + { #if DEBUG Console.WriteLine($"Txtres error: Missing language definition Localization/{CultureInfo.CurrentCulture.Name}.lang"); #endif - return; - } + return; + } - LoadStringTableData(lang, stream, _currentTable); - } + LoadStringTableData(lang, stream, _currentTable); + } #if DEBUG Console.WriteLine($"Loaded string resources for {CultureInfo.CurrentCulture.Name}"); #endif - } + } - catch (Exception ex) - { + catch (Exception ex) + { #if DEBUG Console.WriteLine($"Txtres error: {ex.Message}"); #endif - } - } + } + } - private static void LoadStringTableData(string lang, Stream stream, Dictionary table) - { - using (var reader = new StreamReader(stream)) - { - loop: - while (!reader.EndOfStream) - { - string line = reader.ReadLine(); - if (line == null || line.Length == 0) continue; - var kv = line.Split(new[] { '=' }, 2); - if (kv.Length != 2) continue; - string key = kv[0].Trim(); - if (!key.All(c => char.IsLetterOrDigit(c) || c == '-' || c == '_')) continue; - string valueLiteral = kv[1].Trim(); - var sb = new StringBuilder(); - int i = 0; - int len = valueLiteral.Length; - while (i < len) - { - if (i == 0 || i == valueLiteral.Length - 1) - { - if (valueLiteral[i] != '"') goto loop; - i++; - continue; - } - switch (valueLiteral[i]) - { - case '\\': - { - if (i == valueLiteral.Length - 1) goto loop; - switch (valueLiteral[i + 1]) - { - case 'a': - sb.Append('\a'); - break; - case 'b': - sb.Append('\b'); - break; - case 'f': - sb.Append('\f'); - break; - case 'n': - sb.Append('\n'); - break; - case 'r': - sb.Append('\r'); - break; - case 't': - sb.Append('\t'); - break; - case 'v': - sb.Append('\v'); - break; - case 'u': - { - if (i + 5 >= valueLiteral.Length) goto loop; - short code; - if (!short.TryParse(valueLiteral.Substring(i + 1, 4), - NumberStyles.AllowHexSpecifier, - CultureInfo.InvariantCulture, out code)) goto loop; - sb.Append((char)code); - i += 6; - continue; - } - default: - sb.Append(valueLiteral[i + 1]); - break; - } - i += 2; - continue; - } - default: - sb.Append(valueLiteral[i]); - break; - } - i++; - } - table[key] = sb.ToString(); - } - _languages[lang] = table; - } - } + private static void LoadStringTableData(string lang, Stream stream, Dictionary table) + { + using (var reader = new StreamReader(stream)) + { + loop: + while (!reader.EndOfStream) + { + string line = reader.ReadLine(); + if (line == null || line.Length == 0) continue; + var kv = line.Split(new[] { '=' }, 2); + if (kv.Length != 2) continue; + string key = kv[0].Trim(); + if (!key.All(c => char.IsLetterOrDigit(c) || c == '-' || c == '_')) continue; + string valueLiteral = kv[1].Trim(); + var sb = new StringBuilder(); + int i = 0; + int len = valueLiteral.Length; + while (i < len) + { + if (i == 0 || i == valueLiteral.Length - 1) + { + if (valueLiteral[i] != '"') goto loop; + i++; + continue; + } + switch (valueLiteral[i]) + { + case '\\': + { + if (i == valueLiteral.Length - 1) goto loop; + switch (valueLiteral[i + 1]) + { + case 'a': + sb.Append('\a'); + break; + case 'b': + sb.Append('\b'); + break; + case 'f': + sb.Append('\f'); + break; + case 'n': + sb.Append('\n'); + break; + case 'r': + sb.Append('\r'); + break; + case 't': + sb.Append('\t'); + break; + case 'v': + sb.Append('\v'); + break; + case 'u': + { + if (i + 5 >= valueLiteral.Length) goto loop; + short code; + if (!short.TryParse(valueLiteral.Substring(i + 1, 4), + NumberStyles.AllowHexSpecifier, + CultureInfo.InvariantCulture, out code)) goto loop; + sb.Append((char)code); + i += 6; + continue; + } + default: + sb.Append(valueLiteral[i + 1]); + break; + } + i += 2; + continue; + } + default: + sb.Append(valueLiteral[i]); + break; + } + i++; + } + table[key] = sb.ToString(); + } + _languages[lang] = table; + } + } - private static void CheckLanguage() - { - if (CultureInfo.CurrentCulture.Name == _langName) return; - try - { - _langName = CultureInfo.CurrentCulture.Name; - Dictionary table; - if (!_languages.TryGetValue(_langName, out table)) - using ( - var stream = - Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{_langName}.lang")) - { - if (stream == null) return; - table = new Dictionary(); - LoadStringTableData(_langName, stream, table); - } - _currentTable = table; - } - catch (Exception ex) - { + private static void CheckLanguage() + { + if (CultureInfo.CurrentCulture.Name == _langName) return; + try + { + _langName = CultureInfo.CurrentCulture.Name; + Dictionary table; + if (!_languages.TryGetValue(_langName, out table)) + { + using ( + var stream = + Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{_langName}.lang")) + { + if (stream == null) return; + table = new Dictionary(); + LoadStringTableData(_langName, stream, table); + } + } + _currentTable = table; + } + catch (Exception ex) + { #if DEBUG Console.WriteLine($"Txtres error: {ex.Message}"); #endif - } - } + } + } - [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] - public static void ForceLoad() - { - } + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + public static void ForceLoad() + { + } - public static string GetString(string name) - { - if (name == null) return ""; - CheckLanguage(); - string str; + public static string GetString(string name) + { + if (name == null) return ""; + CheckLanguage(); + string str; #if !DEBUG - return _currentTable.TryGetValue(name, out str) ? str : name; + return _currentTable.TryGetValue(name, out str) ? str : name; #else if (_currentTable.TryGetValue(name, out str)) return str; Console.WriteLine($"MISSING STRING: {name}"); return name; #endif - } + } - public static string GetString(string name, params object[] args) - { - CheckLanguage(); - string str; - try - { - return _currentTable.TryGetValue(name, out str) ? string.Format(str, args) : name; - } - catch - { - return $""; - } - } - } + public static string GetString(string name, params object[] args) + { + CheckLanguage(); + string str; + try + { + return _currentTable.TryGetValue(name, out str) ? string.Format(str, args) : name; + } + catch + { + return $""; + } + } + } } \ No newline at end of file diff --git a/Rant/Metadata/IRantFunction.cs b/Rant/Metadata/IRantFunction.cs index 77e31c5..c6ae559 100644 --- a/Rant/Metadata/IRantFunction.cs +++ b/Rant/Metadata/IRantFunction.cs @@ -27,35 +27,35 @@ namespace Rant.Metadata { - /// - /// Provides access to metadata for a Rant function overload. - /// - public interface IRantFunction - { - /// - /// Gets the name of the function. - /// - string Name { get; } - - /// - /// Gets the description for the function overload. - /// - string Description { get; } - - /// - /// Indicates whether the last parameter accepts multiple values. - /// - bool HasParamArray { get; } - - /// - /// Gets the number of parameters accepted by the function overload. - /// - int ParamCount { get; } - - /// - /// Enumerates the parameters for the function overload. - /// - /// - IEnumerable GetParameters(); - } + /// + /// Provides access to metadata for a Rant function overload. + /// + public interface IRantFunction + { + /// + /// Gets the name of the function. + /// + string Name { get; } + + /// + /// Gets the description for the function overload. + /// + string Description { get; } + + /// + /// Indicates whether the last parameter accepts multiple values. + /// + bool HasParamArray { get; } + + /// + /// Gets the number of parameters accepted by the function overload. + /// + int ParamCount { get; } + + /// + /// Enumerates the parameters for the function overload. + /// + /// + IEnumerable GetParameters(); + } } \ No newline at end of file diff --git a/Rant/Metadata/IRantFunctionGroup.cs b/Rant/Metadata/IRantFunctionGroup.cs index f948cb7..f4f5d20 100644 --- a/Rant/Metadata/IRantFunctionGroup.cs +++ b/Rant/Metadata/IRantFunctionGroup.cs @@ -27,19 +27,19 @@ namespace Rant.Metadata { - /// - /// Provides access to metadata for a group of overloads for a specific Rant function. - /// - public interface IRantFunctionGroup - { - /// - /// Gets the name of the function. - /// - string Name { get; } + /// + /// Provides access to metadata for a group of overloads for a specific Rant function. + /// + public interface IRantFunctionGroup + { + /// + /// Gets the name of the function. + /// + string Name { get; } - /// - /// Gets the available overloads for the function. - /// - IEnumerable Overloads { get; } - } + /// + /// Gets the available overloads for the function. + /// + IEnumerable Overloads { get; } + } } \ No newline at end of file diff --git a/Rant/Metadata/IRantModeValue.cs b/Rant/Metadata/IRantModeValue.cs index 16b49eb..142e352 100644 --- a/Rant/Metadata/IRantModeValue.cs +++ b/Rant/Metadata/IRantModeValue.cs @@ -25,19 +25,19 @@ namespace Rant.Metadata { - /// - /// Provides information on Rant's mode values, like number formats and synchronizer types. - /// - public interface IRantModeValue - { - /// - /// Gets the name of the value. - /// - string Name { get; } + /// + /// Provides information on Rant's mode values, like number formats and synchronizer types. + /// + public interface IRantModeValue + { + /// + /// Gets the name of the value. + /// + string Name { get; } - /// - /// Gets the description for the value. - /// - string Description { get; } - } + /// + /// Gets the description for the value. + /// + string Description { get; } + } } \ No newline at end of file diff --git a/Rant/Metadata/IRantParameter.cs b/Rant/Metadata/IRantParameter.cs index 44ee56f..ba2dd1c 100644 --- a/Rant/Metadata/IRantParameter.cs +++ b/Rant/Metadata/IRantParameter.cs @@ -29,35 +29,35 @@ namespace Rant.Metadata { - /// - /// Provides access to metadata for a Rant function parameter. - /// - public interface IRantParameter - { - /// - /// Gets the data type accepted by the parameter. - /// - RantFunctionParameterType RantType { get; } - - /// - /// Gets the name of the parameter. - /// - string Name { get; } - - /// - /// Indicates whether the parameter accepts multiple values. - /// - bool IsParams { get; } - - /// - /// Gets the description for the parameter. - /// - string Description { get; } - - /// - /// Enumerates all possible values for flag and mode parameters. - /// - /// - IEnumerable GetEnumValues(); - } + /// + /// Provides access to metadata for a Rant function parameter. + /// + public interface IRantParameter + { + /// + /// Gets the data type accepted by the parameter. + /// + RantFunctionParameterType RantType { get; } + + /// + /// Gets the name of the parameter. + /// + string Name { get; } + + /// + /// Indicates whether the parameter accepts multiple values. + /// + bool IsParams { get; } + + /// + /// Gets the description for the parameter. + /// + string Description { get; } + + /// + /// Enumerates all possible values for flag and mode parameters. + /// + /// + IEnumerable GetEnumValues(); + } } \ No newline at end of file diff --git a/Rant/Metadata/RantDescriptionAttribute.cs b/Rant/Metadata/RantDescriptionAttribute.cs index 7946eee..714926b 100644 --- a/Rant/Metadata/RantDescriptionAttribute.cs +++ b/Rant/Metadata/RantDescriptionAttribute.cs @@ -27,16 +27,16 @@ namespace Rant.Metadata { - /// - /// Used for annotating Rant functions and their parameters with descriptions that can be used to generate documentation. - /// - internal class RantDescriptionAttribute : Attribute - { - public RantDescriptionAttribute(string desc) - { - Description = desc; - } + /// + /// Used for annotating Rant functions and their parameters with descriptions that can be used to generate documentation. + /// + internal class RantDescriptionAttribute : Attribute + { + public RantDescriptionAttribute(string desc) + { + Description = desc; + } - public string Description { get; set; } - } + public string Description { get; set; } + } } \ No newline at end of file diff --git a/Rant/Metadata/RantFunctionAttribute.cs b/Rant/Metadata/RantFunctionAttribute.cs index 17de76f..0745326 100644 --- a/Rant/Metadata/RantFunctionAttribute.cs +++ b/Rant/Metadata/RantFunctionAttribute.cs @@ -27,28 +27,28 @@ namespace Rant.Metadata { - /// - /// Indicates to the Rant engine that a method should be registered as a Rant function. - /// - [AttributeUsage(AttributeTargets.Method)] - internal sealed class RantFunctionAttribute : Attribute - { - public RantFunctionAttribute(params string[] aliases) - { - Aliases = aliases; - } + /// + /// Indicates to the Rant engine that a method should be registered as a Rant function. + /// + [AttributeUsage(AttributeTargets.Method)] + internal sealed class RantFunctionAttribute : Attribute + { + public RantFunctionAttribute(params string[] aliases) + { + Aliases = aliases; + } - public RantFunctionAttribute(string name) - { - Aliases = new[] { name }; - } + public RantFunctionAttribute(string name) + { + Aliases = new[] { name }; + } - public RantFunctionAttribute() - { - Aliases = new[] { string.Empty }; - } + public RantFunctionAttribute() + { + Aliases = new[] { string.Empty }; + } - public string Name => Aliases[0]; - public string[] Aliases { get; } - } + public string Name => Aliases[0]; + public string[] Aliases { get; } + } } \ No newline at end of file diff --git a/Rant/Metadata/RantModeValue.cs b/Rant/Metadata/RantModeValue.cs index 4d23e06..c9978e3 100644 --- a/Rant/Metadata/RantModeValue.cs +++ b/Rant/Metadata/RantModeValue.cs @@ -25,15 +25,15 @@ namespace Rant.Metadata { - internal class RantModeValue : IRantModeValue - { - public RantModeValue(string name, string desc) - { - Name = name; - Description = desc; - } + internal class RantModeValue : IRantModeValue + { + public RantModeValue(string name, string desc) + { + Name = name; + Description = desc; + } - public string Name { get; } - public string Description { get; } - } + public string Name { get; } + public string Description { get; } + } } \ No newline at end of file diff --git a/Rant/RNG.cs b/Rant/RNG.cs index 11b725d..9a44f12 100644 --- a/Rant/RNG.cs +++ b/Rant/RNG.cs @@ -31,407 +31,409 @@ namespace Rant { - /// - /// Represents a non-linear random number generator. - /// - public class RNG - { - private const int Mask32 = 0x7FFFFFFF; - private const long Mask64 = 0x7FFFFFFFFFFFFFFF; - private const double MaxDouble = long.MaxValue; - - [ThreadStatic] - private static RNGHashState _hashState = new RNGHashState(); - - #region Table - - private static readonly ulong[] Table = - { - 0x78601daa5225473d, 0x21d0a62df46ee118, 0xdcf4f088ea63c826, 0x8b509ad5d20d2223, 0x36d7e1354010ad6a, - 0xceb515261afffce4, 0x1546c29edf0dc626, 0xc8b67f24d6cf5a39, - 0x46d520ebd22344c9, 0x36d0ff0b68507522, 0xa8567c0883f5e5d2, 0xb9c5b11b91b965b8, 0x7927e34e27fcd89e, - 0x74fa1d2dfa24372b, 0x9e4324a0ee16b0e7, 0x0e677c9baf70e016, - 0xe5d59b272bb7b445, 0x743d63fc26d7e3aa, 0x750880c5f5a4707e, 0xb36e62dd2caa7fde, 0x606c8dc97617cc2e, - 0xf09a2e086d148387, 0x84c2bc508e19c20a, 0x83a592c8477ff525, - 0xe2f50642dee01a7b, 0x77de323275f73aff, 0x5b8f5e6e73a28b1f, 0x9452249863063810, 0xc96e461a3eace646, - 0x389d30b5c53e0d73, 0x80b2f00c43973999, 0x30a299aa889508cf, - 0xf4b1c46101061b27, 0x34ef2c34f55d8b54, 0xb46bb2089bff2880, 0x1a31ed66094b564c, 0xb877b575c296313e, - 0x9da055cb05da778c, 0x1693fd96d5430359, 0xc1415ca2a1f488d3, - 0x9bc8b205553867b9, 0xed2cb34d9b612804, 0xd13b13dd35323c4b, 0x91a9828309316040, 0x5876f27c34037317, - 0xf106bf028861af01, 0x1348b5b17c5cb59b, 0x156e2b52366a3666, - 0xddfad475ca1a9353, 0xf0993c4253bd8285, 0x0bb378c881a002c7, 0x62b72d156abddc09, 0x4142216203284aa1, - 0x0850e8b16b9a63cf, 0xfc6576222e997db5, 0xd56f15f499e5dae1, - 0x8452b64ce6a918e1, 0x3cc1be80a621ecc0, 0x0f92f6b30c6fd230, 0x36bc3ec68b534fff, 0x3a50dead9054f02b, - 0x4f99ff059bbe644b, 0x18b2d0bef3306b9d, 0xe48e412b9f554268, - 0x8ae03d6eb9609c86, 0x9704f36b23ea3b62, 0x3d7e3f21d412232c, 0x701daff720a409c7, 0x19ad2ca2612fa587, - 0xb0a207da9dc6cd24, 0xcb4d86ea80e7fe70, 0x9902dafb46f5a9db, - 0x8cc881a8eb59de7a, 0x44892c768f48b167, 0x34df3c57543efd39, 0x1a26c1b71eaa7fb6, 0x2aad0a990e79db79, - 0xe2efa307b565b94f, 0x58ccc96016ded1b5, 0x839c4900f4cbfba0, - 0x45b21b9b7ea54cae, 0xafb0dbd0f0a55d61, 0x7d281d2a022fd41c, 0x23585629fd7df3f5, 0x6e2c1436afd6b116, - 0x0749d1b3258f9856, 0x074378368bdc7c27, 0xe065dcbc77e08f2e, - 0x514277b28ea7c87f, 0x74b31f36f1b73565, 0xb8b57f2e0e212ff1, 0x13578fe63c488f42, 0x7f50bc7dbab4cb41, - 0x0a97125b82d934cc, 0x46771fc315312337, 0x69b509d564b844a2, - 0x0836782a09edb4d2, 0x8dcab74319d80b49, 0x34cb16e408a2993b, 0x5bfafc2dabb9852d, 0xa24cde29bdd6e4e8, - 0x69833a7df572f780, 0xf8b36883d1fb1d8c, 0x7a4d7d643d7f1abf, - 0x9ed1f0ffdf49a585, 0x0b5ad27766ec8502, 0x9965f5cf2fff529e, 0x73d5af944d11db1b, 0xba1ea69f7590d436, - 0x0c6ae447213ca18a, 0x6ce3d7467318c79c, 0x64b1cd76d557ecb2, - 0x8e88a61072604d0f, 0xf349be99621c1b69, 0x236e332a77d4aa81, 0x011a4f03b3c616b8, 0xf9562a6b215dd87a, - 0x3cea52e04eba6ef8, 0x49474f553d69fae0, 0xb71f9d19ed4993ea, - 0xc23bdce4e51dbc40, 0xb6cdd9c794efd633, 0xddb5cac61cf93894, 0xaa8a6ccee770fb73, 0xaf8cb2b348fa81fd, - 0x1fcfbe5872af9d97, 0x85c721ac5dd9c080, 0xbf6c4fc914803b17, - 0x33dcf4426c22a9a1, 0x0687a35124f41b0e, 0xd4ee8834c1aa4e08, 0xa7fb5625ece435a2, 0xdfc9bcd0b097e0e8, - 0x04181d1b57fe568f, 0x91ce1e9a241ffe36, 0x1c30d69b99a13ad4, - 0x7d98147c13c5dd0e, 0x282f203b0a9b3111, 0xbfbcc21afc60ce88, 0x398bd5979a68759d, 0xb6a1b2ed0b287e6d, - 0x41fe4db0d67c088b, 0x13f6a4401f8f1c65, 0xa41ec7114e6295ba, - 0x23ec10f10aeda257, 0x7b455c1eeb2a5eeb, 0xcc809d51181b2e96, 0x2cadfa5e387ecd22, 0x9acb036bc3bc7bba, - 0x3a1cfa0ac756399c, 0x3c9b19fc74c6a7fe, 0xb59724435358131b, - 0x01f980fe7cc83839, 0x52db8729cd3921af, 0x46eb44c99bfdb13a, 0xcf824dd90fb3982a, 0xf13480f49f389e3e, - 0xdc982580ee1e272e, 0x00f2e72f1778bda7, 0x62965fd82afb40e2, - 0x35597261e9342735, 0x65bc09e16e60d711, 0x9c97d0b44a4cc670, 0x042ab711ef2f7796, 0x8dcc14cc29b59484, - 0xc2a11d9754e2bc3c, 0x3969c637fe95b6df, 0xd6bdbcdee7892dfd, - 0x7dafba8aba322ca7, 0xc676765bf7e8a6df, 0xe19d7dbd0859baba, 0xb9fee5375b45ccb0, 0x44daefa72a1cb73e, - 0x0fd9401b72111b7d, 0x2b8095c5918a5df1, 0x3e8c8706a1e5727e, - 0x99d29f0bf11f5872, 0x39263e430e76eb40, 0x586c8ce409be94e1, 0xf68847b1b5a6818f, 0xfcd10c7e50ebfd26, - 0x803e27d0e2e9390c, 0xccbf8491a232c2a7, 0x54cfec9b6b95a533, - 0xadc28600eafae490, 0xbdd8b8470504a937, 0x97518fc35ede2ad3, 0x52bc4f0bf49ba700, 0xcd26ccd93ccd5526, - 0xbc640f39124ad994, 0xf0570e686665e54f, 0xd627e01291c48df6, - 0x7564fefb49faa4f7, 0x6cc49c23638459f6, 0x4a5802147e845ae6, 0x03d1da199d9cd3bc, 0x2d555f3bbab3b5a4, - 0x8e1bea8f796bc483, 0x7dc745220149c9f2, 0x6b145188141428e8, - 0xfd8f3a9c8efc6f34, 0xde36d5e4b5378688, 0x933f830bae631bc5, 0x4be99bcc01c681d0, 0xdc7c74d7df45bef0, - 0x7061864ecfe65f40, 0x57ad43490628e5aa, 0xf795124bd01bd0e7, - 0x5879d6ac0656089f, 0x93334a1ccce500e7, 0x13638bc5f3cf7ee2, 0xc5ab6e40212cf75e, 0x147ddc06cd43a201, - 0xc57626c7d1ca88b1, 0x754e73627da577a1, 0x72c56ce24b945beb, - 0x834af1f29cee88c1, 0x376aa97203059110, 0x9cabcb2a0bcea230, 0xa3f0534453164db4, 0x1d41d30ce85d2ebe, - 0x224a96b4ba4d7680, 0x7fe58ef36422aa72, 0x3df83e5413f34302, - 0x8743ce0bbc3fe899, 0x915f5f76ea124da4, 0x037763b9f2a31554, 0x97c23afcb9dacf29, 0x9b9ecd5577516232, - 0xffa591aa4165d31c, 0xeffaef5da747e0e7, 0x3a46d11384dfd2c4, - 0x976255b07dcba443, 0x434b30b3c8ffea7a, 0x079f1c11defd8b2d, 0xd6a9b889ae1c0a70, 0xca3e98abb2c0409a, - 0xfd7900bc5922fced, 0xf124639ccfd1d26b, 0x7e5ce17bd2019b90, - 0x04029e4b58d2d1b5, 0xe2295d61a85fd012, 0x081eafea16c37513, 0x363ada331ed8fcbc, 0x962465ec560b08d3, - 0x80c848a65d14ad68, 0xe8da599afcd5006d, 0x61a6d1b75517d513, - 0x22d45ccb8be9e32a, 0x2289686b10b01f78, 0xb851936366ec178c, 0xf03f146455ca74c3, 0x2be7cadd1f62f2a7, - 0x01d211fe2b138898, 0xe3ec3a6c9f7f8792, 0xfb68fcf8b8e2f20b - }; - - #endregion - - private readonly SG _root; - private readonly List _tree; - - /// - /// Creates a new RNG instance with the specified seed. - /// - /// The seed for the generator. - public RNG(long seed) - { - _root = new SG(seed, 0); - _tree = new List { _root }; - } - - /// - /// Creates a new RNG instance with the specified seed and generation. - /// - /// The seed for the generator. - /// The generation to start at. - public RNG(long seed, long generation) - { - _root = new SG(seed, generation); - _tree = new List { _root }; - } - - /// - /// Creates a new RNG instance seeded with the system tick count. - /// - public RNG() - { - _root = new SG(Environment.TickCount, 0); - _tree = new List { _root }; - } - - /// - /// The root seed. - /// - public long BaseSeed - { - get { return _root.Seed; } - set - { - if (_tree.Count > 1) throw new InvalidOperationException("Cannot change the seed of a branched RNG."); - _root.Seed = value; - } - } - - /// - /// The seed of the top branch. - /// - public long Seed - { - get { return _tree[_tree.Count - 1].Seed; } - set { _tree[_tree.Count - 1].Seed = value; } - } - - /// - /// The current generation. - /// - public long Generation - { - get { return _tree[_tree.Count - 1].Generation; } - set { _tree[_tree.Count - 1].Generation = value; } - } - - /// - /// Calculates the raw 64-bit value for a given generation. - /// - /// The generation. - /// - public long this[int g] => GetRaw(Seed, g); - - /// - /// The current branching depth of the generator. - /// - public int Depth => _tree.Count; - - /// - /// Calculates the raw 64-bit value for a given seed/generation pair. - /// - /// The seed. - /// The generation. - /// - public static long GetRaw(long s, long g) - { - unchecked - { - _hashState.Init(s, g); - for (int i = 0; i < 8; i++) - _hashState.HashUnsigned = - (_hashState.HashUnsigned + 31 - * Table[((_hashState.Seed ^ _hashState.HashUnsigned) >> (i * 8)) & 0xff].RotR(i) + 47 - * Table[((_hashState.Generation ^ _hashState.HashUnsigned) >> (i * 8)) & 0xff].RotL(i) + 11) - * 6364136223846793005; - return _hashState.HashSigned; - } - } - - /// - /// Calculates the raw 64-bit value for the next generation, and increases the current generation by 1. - /// - /// - public long NextRaw() => GetRaw(Seed, Generation++); - - /// - /// Calculates the raw 64-bit value for the previous generation, and decreases the current generation by 1. - /// - /// - public long PrevRaw() => GetRaw(Seed, --Generation); - - /// - /// Sets the current generation to zero. - /// - public void Reset() => Generation = 0; - - /// - /// Sets the seed to the specified value and the current generation to zero. - /// - /// The new seed to apply to the generator. - public void Reset(long newSeed) - { - Generation = 0; - Seed = newSeed; - } - - /// - /// Creates a new branch based off the current seed and the specified seed. - /// - /// The seed to create the branch with. - /// - public RNG Branch(long seed) - { - _tree.Add(new SG(GetRaw(seed, Seed), 0)); - return this; - } - - /// - /// Removes the topmost branch and resumes generation on the next one down. - /// - public RNG Merge() - { - if (_tree.Count > 1) _tree.RemoveAt(_tree.Count - 1); - return this; - } - - /// - /// Calculates a 32-bit, non-negative integer for the current generation. - /// - /// - public int Peek() => (int)GetRaw(Seed, Generation) & Mask32; - - /// - /// Calculates the 32-bitnon-negative integer for the specified generation. - /// - /// The generation to peek at. - /// - public int PeekAt(long generation) => (int)GetRaw(Seed, generation) & Mask32; - - /// - /// Returns a double-precision floating point number between 0 and 1, and advances the generation by 1. - /// - /// - public double NextDouble() => (NextRaw() & Mask64) / MaxDouble; - - /// - /// Returns a double-precision floating point number between 0 and the specified maximum value, and advances the generation - /// by 1. - /// - /// - public double NextDouble(double max) => (((int)GetRaw(~Seed, Generation) & Mask32) + NextDouble()) % max; - - /// - /// Returns a double-precision floating point number between the specified minimum and maximum values, and advances the - /// generation by 1. - /// - /// - public double NextDouble(double min, double max) - => max - min != 0 ? (((int)GetRaw(~Seed, Generation) & Mask32) + NextDouble()) % (max - min) + min : 0; - - /// - /// Returns a random boolean value and advances the generation by 1. - /// - /// - public bool NextBoolean() => NextRaw() >= 0; - - /// - /// Calculates a 32-bit, non-negative integer from the next generation and increases the current generation by 1. - /// - /// - public int Next() => (int)NextRaw() & Mask32; - - /// - /// Calculates a 32-bit, non-negative integer from the previous generation and decreases the current generation by 1. - /// - /// - public int Prev() => (int)PrevRaw() & Mask32; - - /// - /// Calculates a 32-bit integer between 0 and a specified upper bound for the current generation and increases the current - /// generation by 1. - /// - /// The exclusive maximum value. - /// - public int Next(int max) => max != 0 ? (int)(NextRaw() & Mask32) % max : 0; - - /// - /// Calculates a 32-bit integer between 0 and a specified upper bound from the previous generation and decreases the - /// current generation by 1. - /// - /// The exclusive maximum value. - /// - public int Prev(int max) => max != 0 ? (int)(PrevRaw() & Mask32) % max : 0; - - /// - /// Calculates a 32-bit integer between 0 and a specified upper bound for the current generation. - /// - /// The exclusive maximum value. - /// - public int Peek(int max) => max != 0 ? ((int)GetRaw(Seed, Generation) & Mask32) % max : 0; - - /// - /// Calculates a 32-bit integer between 0 and a specified upper bound for the specified generation. - /// - /// The generation whose value to calculate. - /// The exclusive maximum value. - /// - public int PeekAt(long generation, int max) => max != 0 ? ((int)GetRaw(Seed, generation) & Mask32) % max : 0; - - /// - /// Calculates a 32-bit integer between the specified minimum and maximum values for the current generation, and increases - /// the current generation by 1. - /// - /// The inclusive minimum value. - /// The exclusive maximum value. - /// - public int Next(int min, int max) => max - min > 0 ? (((int)NextRaw() & Mask32) - min) % (max - min) + min : 0; - - /// - /// Calculates a 32-bit integer between the specified minimum and maximum values for the previous generation, and decreases - /// the current generation by 1. - /// - /// The inclusive minimum value. - /// The exclusive maximum value. - /// - public int Prev(int min, int max) => max - min > 0 ? (((int)PrevRaw() & Mask32) - min) % (max - min) + min : 0; - - /// - /// Calculates a 32-bit integer between the specified minimum and maximum values for the current generation. - /// - /// The inclusive minimum value. - /// The exclusive maximum value. - /// - public int Peek(int min, int max) - => max - min > 0 ? (((int)GetRaw(Seed, Generation) & Mask32) - min) % (max - min) + min : 0; - - /// - /// Calculates a 32-bit integer between the specified minimum and maximum values for the specified generation. - /// - /// The inclusive minimum value. - /// The exclusive maximum value. - /// The generation whose value to calculate. - /// - public int PeekAt(int generation, int min, int max) - => max - min > 0 ? (((int)GetRaw(Seed, generation) & Mask32) - min) % (max - min) + min : 0; - - #region RNG structures - - // ReSharper disable once InconsistentNaming - private class SG - { - public long Seed, Generation; - - public SG(long s, long g) - { - Seed = s; - Generation = g; - } - } - - [StructLayout(LayoutKind.Explicit)] - private struct RNGHashState - { - [FieldOffset(0)] - public long HashSigned; - - [FieldOffset(0)] - public ulong HashUnsigned; - - [FieldOffset(8)] - public readonly ulong Seed; - - [FieldOffset(8)] - private long _Seed; - - [FieldOffset(16)] - public readonly ulong Generation; - - [FieldOffset(16)] - private long _Generation; - - public RNGHashState(long s, long g) - { - Seed = 0; - _Seed = s; - Generation = 0; - _Generation = g; - HashSigned = 0; - HashUnsigned = 0; - } - - public void Init(long s, long g) - { - _Seed = s; - _Generation = g; - HashSigned = 0; - } - } - - #endregion - } + /// + /// Represents a non-linear random number generator. + /// + public class RNG + { + private const int Mask32 = 0x7FFFFFFF; + private const long Mask64 = 0x7FFFFFFFFFFFFFFF; + private const double MaxDouble = long.MaxValue; + + [ThreadStatic] + private static RNGHashState _hashState = new RNGHashState(); + + #region Table + + private static readonly ulong[] Table = + { + 0x78601daa5225473d, 0x21d0a62df46ee118, 0xdcf4f088ea63c826, 0x8b509ad5d20d2223, 0x36d7e1354010ad6a, + 0xceb515261afffce4, 0x1546c29edf0dc626, 0xc8b67f24d6cf5a39, + 0x46d520ebd22344c9, 0x36d0ff0b68507522, 0xa8567c0883f5e5d2, 0xb9c5b11b91b965b8, 0x7927e34e27fcd89e, + 0x74fa1d2dfa24372b, 0x9e4324a0ee16b0e7, 0x0e677c9baf70e016, + 0xe5d59b272bb7b445, 0x743d63fc26d7e3aa, 0x750880c5f5a4707e, 0xb36e62dd2caa7fde, 0x606c8dc97617cc2e, + 0xf09a2e086d148387, 0x84c2bc508e19c20a, 0x83a592c8477ff525, + 0xe2f50642dee01a7b, 0x77de323275f73aff, 0x5b8f5e6e73a28b1f, 0x9452249863063810, 0xc96e461a3eace646, + 0x389d30b5c53e0d73, 0x80b2f00c43973999, 0x30a299aa889508cf, + 0xf4b1c46101061b27, 0x34ef2c34f55d8b54, 0xb46bb2089bff2880, 0x1a31ed66094b564c, 0xb877b575c296313e, + 0x9da055cb05da778c, 0x1693fd96d5430359, 0xc1415ca2a1f488d3, + 0x9bc8b205553867b9, 0xed2cb34d9b612804, 0xd13b13dd35323c4b, 0x91a9828309316040, 0x5876f27c34037317, + 0xf106bf028861af01, 0x1348b5b17c5cb59b, 0x156e2b52366a3666, + 0xddfad475ca1a9353, 0xf0993c4253bd8285, 0x0bb378c881a002c7, 0x62b72d156abddc09, 0x4142216203284aa1, + 0x0850e8b16b9a63cf, 0xfc6576222e997db5, 0xd56f15f499e5dae1, + 0x8452b64ce6a918e1, 0x3cc1be80a621ecc0, 0x0f92f6b30c6fd230, 0x36bc3ec68b534fff, 0x3a50dead9054f02b, + 0x4f99ff059bbe644b, 0x18b2d0bef3306b9d, 0xe48e412b9f554268, + 0x8ae03d6eb9609c86, 0x9704f36b23ea3b62, 0x3d7e3f21d412232c, 0x701daff720a409c7, 0x19ad2ca2612fa587, + 0xb0a207da9dc6cd24, 0xcb4d86ea80e7fe70, 0x9902dafb46f5a9db, + 0x8cc881a8eb59de7a, 0x44892c768f48b167, 0x34df3c57543efd39, 0x1a26c1b71eaa7fb6, 0x2aad0a990e79db79, + 0xe2efa307b565b94f, 0x58ccc96016ded1b5, 0x839c4900f4cbfba0, + 0x45b21b9b7ea54cae, 0xafb0dbd0f0a55d61, 0x7d281d2a022fd41c, 0x23585629fd7df3f5, 0x6e2c1436afd6b116, + 0x0749d1b3258f9856, 0x074378368bdc7c27, 0xe065dcbc77e08f2e, + 0x514277b28ea7c87f, 0x74b31f36f1b73565, 0xb8b57f2e0e212ff1, 0x13578fe63c488f42, 0x7f50bc7dbab4cb41, + 0x0a97125b82d934cc, 0x46771fc315312337, 0x69b509d564b844a2, + 0x0836782a09edb4d2, 0x8dcab74319d80b49, 0x34cb16e408a2993b, 0x5bfafc2dabb9852d, 0xa24cde29bdd6e4e8, + 0x69833a7df572f780, 0xf8b36883d1fb1d8c, 0x7a4d7d643d7f1abf, + 0x9ed1f0ffdf49a585, 0x0b5ad27766ec8502, 0x9965f5cf2fff529e, 0x73d5af944d11db1b, 0xba1ea69f7590d436, + 0x0c6ae447213ca18a, 0x6ce3d7467318c79c, 0x64b1cd76d557ecb2, + 0x8e88a61072604d0f, 0xf349be99621c1b69, 0x236e332a77d4aa81, 0x011a4f03b3c616b8, 0xf9562a6b215dd87a, + 0x3cea52e04eba6ef8, 0x49474f553d69fae0, 0xb71f9d19ed4993ea, + 0xc23bdce4e51dbc40, 0xb6cdd9c794efd633, 0xddb5cac61cf93894, 0xaa8a6ccee770fb73, 0xaf8cb2b348fa81fd, + 0x1fcfbe5872af9d97, 0x85c721ac5dd9c080, 0xbf6c4fc914803b17, + 0x33dcf4426c22a9a1, 0x0687a35124f41b0e, 0xd4ee8834c1aa4e08, 0xa7fb5625ece435a2, 0xdfc9bcd0b097e0e8, + 0x04181d1b57fe568f, 0x91ce1e9a241ffe36, 0x1c30d69b99a13ad4, + 0x7d98147c13c5dd0e, 0x282f203b0a9b3111, 0xbfbcc21afc60ce88, 0x398bd5979a68759d, 0xb6a1b2ed0b287e6d, + 0x41fe4db0d67c088b, 0x13f6a4401f8f1c65, 0xa41ec7114e6295ba, + 0x23ec10f10aeda257, 0x7b455c1eeb2a5eeb, 0xcc809d51181b2e96, 0x2cadfa5e387ecd22, 0x9acb036bc3bc7bba, + 0x3a1cfa0ac756399c, 0x3c9b19fc74c6a7fe, 0xb59724435358131b, + 0x01f980fe7cc83839, 0x52db8729cd3921af, 0x46eb44c99bfdb13a, 0xcf824dd90fb3982a, 0xf13480f49f389e3e, + 0xdc982580ee1e272e, 0x00f2e72f1778bda7, 0x62965fd82afb40e2, + 0x35597261e9342735, 0x65bc09e16e60d711, 0x9c97d0b44a4cc670, 0x042ab711ef2f7796, 0x8dcc14cc29b59484, + 0xc2a11d9754e2bc3c, 0x3969c637fe95b6df, 0xd6bdbcdee7892dfd, + 0x7dafba8aba322ca7, 0xc676765bf7e8a6df, 0xe19d7dbd0859baba, 0xb9fee5375b45ccb0, 0x44daefa72a1cb73e, + 0x0fd9401b72111b7d, 0x2b8095c5918a5df1, 0x3e8c8706a1e5727e, + 0x99d29f0bf11f5872, 0x39263e430e76eb40, 0x586c8ce409be94e1, 0xf68847b1b5a6818f, 0xfcd10c7e50ebfd26, + 0x803e27d0e2e9390c, 0xccbf8491a232c2a7, 0x54cfec9b6b95a533, + 0xadc28600eafae490, 0xbdd8b8470504a937, 0x97518fc35ede2ad3, 0x52bc4f0bf49ba700, 0xcd26ccd93ccd5526, + 0xbc640f39124ad994, 0xf0570e686665e54f, 0xd627e01291c48df6, + 0x7564fefb49faa4f7, 0x6cc49c23638459f6, 0x4a5802147e845ae6, 0x03d1da199d9cd3bc, 0x2d555f3bbab3b5a4, + 0x8e1bea8f796bc483, 0x7dc745220149c9f2, 0x6b145188141428e8, + 0xfd8f3a9c8efc6f34, 0xde36d5e4b5378688, 0x933f830bae631bc5, 0x4be99bcc01c681d0, 0xdc7c74d7df45bef0, + 0x7061864ecfe65f40, 0x57ad43490628e5aa, 0xf795124bd01bd0e7, + 0x5879d6ac0656089f, 0x93334a1ccce500e7, 0x13638bc5f3cf7ee2, 0xc5ab6e40212cf75e, 0x147ddc06cd43a201, + 0xc57626c7d1ca88b1, 0x754e73627da577a1, 0x72c56ce24b945beb, + 0x834af1f29cee88c1, 0x376aa97203059110, 0x9cabcb2a0bcea230, 0xa3f0534453164db4, 0x1d41d30ce85d2ebe, + 0x224a96b4ba4d7680, 0x7fe58ef36422aa72, 0x3df83e5413f34302, + 0x8743ce0bbc3fe899, 0x915f5f76ea124da4, 0x037763b9f2a31554, 0x97c23afcb9dacf29, 0x9b9ecd5577516232, + 0xffa591aa4165d31c, 0xeffaef5da747e0e7, 0x3a46d11384dfd2c4, + 0x976255b07dcba443, 0x434b30b3c8ffea7a, 0x079f1c11defd8b2d, 0xd6a9b889ae1c0a70, 0xca3e98abb2c0409a, + 0xfd7900bc5922fced, 0xf124639ccfd1d26b, 0x7e5ce17bd2019b90, + 0x04029e4b58d2d1b5, 0xe2295d61a85fd012, 0x081eafea16c37513, 0x363ada331ed8fcbc, 0x962465ec560b08d3, + 0x80c848a65d14ad68, 0xe8da599afcd5006d, 0x61a6d1b75517d513, + 0x22d45ccb8be9e32a, 0x2289686b10b01f78, 0xb851936366ec178c, 0xf03f146455ca74c3, 0x2be7cadd1f62f2a7, + 0x01d211fe2b138898, 0xe3ec3a6c9f7f8792, 0xfb68fcf8b8e2f20b + }; + + #endregion + + private readonly SG _root; + private readonly List _tree; + + /// + /// Creates a new RNG instance with the specified seed. + /// + /// The seed for the generator. + public RNG(long seed) + { + _root = new SG(seed, 0); + _tree = new List { _root }; + } + + /// + /// Creates a new RNG instance with the specified seed and generation. + /// + /// The seed for the generator. + /// The generation to start at. + public RNG(long seed, long generation) + { + _root = new SG(seed, generation); + _tree = new List { _root }; + } + + /// + /// Creates a new RNG instance seeded with the system tick count. + /// + public RNG() + { + _root = new SG(Environment.TickCount, 0); + _tree = new List { _root }; + } + + /// + /// The root seed. + /// + public long BaseSeed + { + get { return _root.Seed; } + set + { + if (_tree.Count > 1) throw new InvalidOperationException("Cannot change the seed of a branched RNG."); + _root.Seed = value; + } + } + + /// + /// The seed of the top branch. + /// + public long Seed + { + get { return _tree[_tree.Count - 1].Seed; } + set { _tree[_tree.Count - 1].Seed = value; } + } + + /// + /// The current generation. + /// + public long Generation + { + get { return _tree[_tree.Count - 1].Generation; } + set { _tree[_tree.Count - 1].Generation = value; } + } + + /// + /// Calculates the raw 64-bit value for a given generation. + /// + /// The generation. + /// + public long this[int g] => GetRaw(Seed, g); + + /// + /// The current branching depth of the generator. + /// + public int Depth => _tree.Count; + + /// + /// Calculates the raw 64-bit value for a given seed/generation pair. + /// + /// The seed. + /// The generation. + /// + public static long GetRaw(long s, long g) + { + unchecked + { + _hashState.Init(s, g); + for (int i = 0; i < 8; i++) + { + _hashState.HashUnsigned = + (_hashState.HashUnsigned + 31 + * Table[((_hashState.Seed ^ _hashState.HashUnsigned) >> (i * 8)) & 0xff].RotR(i) + 47 + * Table[((_hashState.Generation ^ _hashState.HashUnsigned) >> (i * 8)) & 0xff].RotL(i) + 11) + * 6364136223846793005; + } + return _hashState.HashSigned; + } + } + + /// + /// Calculates the raw 64-bit value for the next generation, and increases the current generation by 1. + /// + /// + public long NextRaw() => GetRaw(Seed, Generation++); + + /// + /// Calculates the raw 64-bit value for the previous generation, and decreases the current generation by 1. + /// + /// + public long PrevRaw() => GetRaw(Seed, --Generation); + + /// + /// Sets the current generation to zero. + /// + public void Reset() => Generation = 0; + + /// + /// Sets the seed to the specified value and the current generation to zero. + /// + /// The new seed to apply to the generator. + public void Reset(long newSeed) + { + Generation = 0; + Seed = newSeed; + } + + /// + /// Creates a new branch based off the current seed and the specified seed. + /// + /// The seed to create the branch with. + /// + public RNG Branch(long seed) + { + _tree.Add(new SG(GetRaw(seed, Seed), 0)); + return this; + } + + /// + /// Removes the topmost branch and resumes generation on the next one down. + /// + public RNG Merge() + { + if (_tree.Count > 1) _tree.RemoveAt(_tree.Count - 1); + return this; + } + + /// + /// Calculates a 32-bit, non-negative integer for the current generation. + /// + /// + public int Peek() => (int)GetRaw(Seed, Generation) & Mask32; + + /// + /// Calculates the 32-bitnon-negative integer for the specified generation. + /// + /// The generation to peek at. + /// + public int PeekAt(long generation) => (int)GetRaw(Seed, generation) & Mask32; + + /// + /// Returns a double-precision floating point number between 0 and 1, and advances the generation by 1. + /// + /// + public double NextDouble() => (NextRaw() & Mask64) / MaxDouble; + + /// + /// Returns a double-precision floating point number between 0 and the specified maximum value, and advances the generation + /// by 1. + /// + /// + public double NextDouble(double max) => (((int)GetRaw(~Seed, Generation) & Mask32) + NextDouble()) % max; + + /// + /// Returns a double-precision floating point number between the specified minimum and maximum values, and advances the + /// generation by 1. + /// + /// + public double NextDouble(double min, double max) + => max - min != 0 ? (((int)GetRaw(~Seed, Generation) & Mask32) + NextDouble()) % (max - min) + min : 0; + + /// + /// Returns a random boolean value and advances the generation by 1. + /// + /// + public bool NextBoolean() => NextRaw() >= 0; + + /// + /// Calculates a 32-bit, non-negative integer from the next generation and increases the current generation by 1. + /// + /// + public int Next() => (int)NextRaw() & Mask32; + + /// + /// Calculates a 32-bit, non-negative integer from the previous generation and decreases the current generation by 1. + /// + /// + public int Prev() => (int)PrevRaw() & Mask32; + + /// + /// Calculates a 32-bit integer between 0 and a specified upper bound for the current generation and increases the current + /// generation by 1. + /// + /// The exclusive maximum value. + /// + public int Next(int max) => max != 0 ? (int)(NextRaw() & Mask32) % max : 0; + + /// + /// Calculates a 32-bit integer between 0 and a specified upper bound from the previous generation and decreases the + /// current generation by 1. + /// + /// The exclusive maximum value. + /// + public int Prev(int max) => max != 0 ? (int)(PrevRaw() & Mask32) % max : 0; + + /// + /// Calculates a 32-bit integer between 0 and a specified upper bound for the current generation. + /// + /// The exclusive maximum value. + /// + public int Peek(int max) => max != 0 ? ((int)GetRaw(Seed, Generation) & Mask32) % max : 0; + + /// + /// Calculates a 32-bit integer between 0 and a specified upper bound for the specified generation. + /// + /// The generation whose value to calculate. + /// The exclusive maximum value. + /// + public int PeekAt(long generation, int max) => max != 0 ? ((int)GetRaw(Seed, generation) & Mask32) % max : 0; + + /// + /// Calculates a 32-bit integer between the specified minimum and maximum values for the current generation, and increases + /// the current generation by 1. + /// + /// The inclusive minimum value. + /// The exclusive maximum value. + /// + public int Next(int min, int max) => max - min > 0 ? (((int)NextRaw() & Mask32) - min) % (max - min) + min : 0; + + /// + /// Calculates a 32-bit integer between the specified minimum and maximum values for the previous generation, and decreases + /// the current generation by 1. + /// + /// The inclusive minimum value. + /// The exclusive maximum value. + /// + public int Prev(int min, int max) => max - min > 0 ? (((int)PrevRaw() & Mask32) - min) % (max - min) + min : 0; + + /// + /// Calculates a 32-bit integer between the specified minimum and maximum values for the current generation. + /// + /// The inclusive minimum value. + /// The exclusive maximum value. + /// + public int Peek(int min, int max) + => max - min > 0 ? (((int)GetRaw(Seed, Generation) & Mask32) - min) % (max - min) + min : 0; + + /// + /// Calculates a 32-bit integer between the specified minimum and maximum values for the specified generation. + /// + /// The inclusive minimum value. + /// The exclusive maximum value. + /// The generation whose value to calculate. + /// + public int PeekAt(int generation, int min, int max) + => max - min > 0 ? (((int)GetRaw(Seed, generation) & Mask32) - min) % (max - min) + min : 0; + + #region RNG structures + + // ReSharper disable once InconsistentNaming + private class SG + { + public long Seed, Generation; + + public SG(long s, long g) + { + Seed = s; + Generation = g; + } + } + + [StructLayout(LayoutKind.Explicit)] + private struct RNGHashState + { + [FieldOffset(0)] + public long HashSigned; + + [FieldOffset(0)] + public ulong HashUnsigned; + + [FieldOffset(8)] + public readonly ulong Seed; + + [FieldOffset(8)] + private long _Seed; + + [FieldOffset(16)] + public readonly ulong Generation; + + [FieldOffset(16)] + private long _Generation; + + public RNGHashState(long s, long g) + { + Seed = 0; + _Seed = s; + Generation = 0; + _Generation = g; + HashSigned = 0; + HashUnsigned = 0; + } + + public void Init(long s, long g) + { + _Seed = s; + _Generation = g; + HashSigned = 0; + } + } + + #endregion + } } \ No newline at end of file diff --git a/Rant/RantArgAttribute.cs b/Rant/RantArgAttribute.cs index a35677e..0f6ce08 100644 --- a/Rant/RantArgAttribute.cs +++ b/Rant/RantArgAttribute.cs @@ -27,25 +27,25 @@ namespace Rant { - /// - /// Attribute used to change the name of an argument pulled from a field or property. - /// - [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] - public sealed class RantArgAttribute : Attribute - { - /// - /// Creates a new RantArgAttribute with the specified name. - /// - /// The new name to assign to the argument. - public RantArgAttribute(string name) - { - if (name == null) throw new ArgumentNullException(nameof(name)); - Name = name; - } + /// + /// Attribute used to change the name of an argument pulled from a field or property. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public sealed class RantArgAttribute : Attribute + { + /// + /// Creates a new RantArgAttribute with the specified name. + /// + /// The new name to assign to the argument. + public RantArgAttribute(string name) + { + if (name == null) throw new ArgumentNullException(nameof(name)); + Name = name; + } - /// - /// The new name to assign to the argument. - /// - public string Name { get; } - } + /// + /// The new name to assign to the argument. + /// + public string Name { get; } + } } \ No newline at end of file diff --git a/Rant/RantCompilerException.cs b/Rant/RantCompilerException.cs index baf7c72..f9adac4 100644 --- a/Rant/RantCompilerException.cs +++ b/Rant/RantCompilerException.cs @@ -32,102 +32,100 @@ namespace Rant { - /// - /// Represents an error raised by Rant during pattern compilation. - /// - public sealed class RantCompilerException : Exception - { - private readonly List _errorList; + /// + /// Represents an error raised by Rant during pattern compilation. + /// + public sealed class RantCompilerException : Exception + { + private readonly List _errorList; - internal RantCompilerException(string sourceName, List errorList) - : base(GenerateErrorString(errorList)) - { - _errorList = errorList; - ErrorCount = _errorList.Count; - SourceName = sourceName; - InternalError = false; - } + internal RantCompilerException(string sourceName, List errorList) + : base(GenerateErrorString(errorList)) + { + _errorList = errorList; + ErrorCount = _errorList.Count; + SourceName = sourceName; + InternalError = false; + } - internal RantCompilerException(string sourceName, List errorList, Exception innerException) - : base(GenerateErrorStringWithInnerEx(errorList, innerException), innerException) - { - _errorList = errorList; - ErrorCount = _errorList.Count; - SourceName = sourceName; - InternalError = true; - } + internal RantCompilerException(string sourceName, List errorList, Exception innerException) + : base(GenerateErrorStringWithInnerEx(errorList, innerException), innerException) + { + _errorList = errorList; + ErrorCount = _errorList.Count; + SourceName = sourceName; + InternalError = true; + } - /// - /// The name of the source pattern on which the error occurred. - /// - public string SourceName { get; } + /// + /// The name of the source pattern on which the error occurred. + /// + public string SourceName { get; } - /// - /// Indicates whether the exception is the result of an internal engine error. - /// - public bool InternalError { get; } + /// + /// Indicates whether the exception is the result of an internal engine error. + /// + public bool InternalError { get; } - /// - /// Gets the number of errors returned by the compiler. - /// - public int ErrorCount { get; } + /// + /// Gets the number of errors returned by the compiler. + /// + public int ErrorCount { get; } - private static string GenerateErrorString(List list) - { - var writer = new StringBuilder(); - if (list.Count > 1) - { - writer.AppendLine(GetString("compiler-errors-found", list.Count)); - for (int i = 0; i < list.Count; i++) - { - var error = list[i]; - writer.Append($" {i + 1}. "); - writer.AppendLine(error.ToString()); - } - } - else - { - writer.Append(list.First()); - } - return writer.ToString(); - } + private static string GenerateErrorString(List list) + { + var writer = new StringBuilder(); + if (list.Count > 1) + { + writer.AppendLine(GetString("compiler-errors-found", list.Count)); + for (int i = 0; i < list.Count; i++) + { + var error = list[i]; + writer.Append($" {i + 1}. "); + writer.AppendLine(error.ToString()); + } + } + else + writer.Append(list.First()); + return writer.ToString(); + } - private static string GenerateErrorStringWithInnerEx(List list, Exception inner) - { - var writer = new StringBuilder(); - writer.AppendLine(GetString("err-compiler-internal", inner.GetType().Name, inner.Message)); + private static string GenerateErrorStringWithInnerEx(List list, Exception inner) + { + var writer = new StringBuilder(); + writer.AppendLine(GetString("err-compiler-internal", inner.GetType().Name, inner.Message)); - if (list != null && list.Any()) - { - writer.AppendLine(); - if (list.Count > 1) - { - writer.AppendLine(GetString("compiler-errors-also-found", list.Count)); - for (int i = 0; i < list.Count; i++) - { - var error = list[i]; - writer.Append($" {i + 1}. "); - writer.AppendLine(error.ToString()); - } - } - else - { - writer.AppendLine(GetString("compiler-error-also-found")); - writer.Append(" "); - writer.AppendLine(list.First().ToString()); - } - } - return writer.ToString(); - } + if (list != null && list.Any()) + { + writer.AppendLine(); + if (list.Count > 1) + { + writer.AppendLine(GetString("compiler-errors-also-found", list.Count)); + for (int i = 0; i < list.Count; i++) + { + var error = list[i]; + writer.Append($" {i + 1}. "); + writer.AppendLine(error.ToString()); + } + } + else + { + writer.AppendLine(GetString("compiler-error-also-found")); + writer.Append(" "); + writer.AppendLine(list.First().ToString()); + } + } + return writer.ToString(); + } - /// - /// Enumerates the errors collected from the compiler. - /// - /// - public IEnumerable GetErrors() - { - if (_errorList == null) yield break; - foreach (var error in _errorList) yield return error; - } - } + /// + /// Enumerates the errors collected from the compiler. + /// + /// + public IEnumerable GetErrors() + { + if (_errorList == null) yield break; + foreach (var error in _errorList) yield return error; + } + } } \ No newline at end of file diff --git a/Rant/RantCompilerMessage.cs b/Rant/RantCompilerMessage.cs index 9cbe121..3da6ec4 100644 --- a/Rant/RantCompilerMessage.cs +++ b/Rant/RantCompilerMessage.cs @@ -27,67 +27,67 @@ namespace Rant { - /// - /// Represents a message emitted by the Rant compiler while performing a job. - /// - public sealed class RantCompilerMessage - { - internal RantCompilerMessage(RantCompilerMessageType type, string source, string message, int line, int column, - int index, int length) - { - Type = type; - Source = source; - Message = message; - Line = line; - Column = column; - Index = index; - Length = length; - } + /// + /// Represents a message emitted by the Rant compiler while performing a job. + /// + public sealed class RantCompilerMessage + { + internal RantCompilerMessage(RantCompilerMessageType type, string source, string message, int line, int column, + int index, int length) + { + Type = type; + Source = source; + Message = message; + Line = line; + Column = column; + Index = index; + Length = length; + } - /// - /// The type of message. - /// - public RantCompilerMessageType Type { get; } + /// + /// The type of message. + /// + public RantCompilerMessageType Type { get; } - /// - /// The source path of the pattern being compiled when the message was generated. - /// - public string Source { get; } + /// + /// The source path of the pattern being compiled when the message was generated. + /// + public string Source { get; } - /// - /// The message text. - /// - public string Message { get; } + /// + /// The message text. + /// + public string Message { get; } - /// - /// The line on which the message was generated. - /// - public int Line { get; } + /// + /// The line on which the message was generated. + /// + public int Line { get; } - /// - /// The column on which the message was generated. - /// - public int Column { get; } + /// + /// The column on which the message was generated. + /// + public int Column { get; } - /// - /// The character index on which the message was generated. - /// - public int Index { get; } + /// + /// The character index on which the message was generated. + /// + public int Index { get; } - /// - /// The length, in characters, of the code snippet to which the message pertains. - /// - public int Length { get; } + /// + /// The length, in characters, of the code snippet to which the message pertains. + /// + public int Length { get; } - /// - /// Generates a string representation of the message. - /// - /// - public override string ToString() - { - return Line > 0 - ? $"{GetString("src-line-col", Source, Line, Column)} {Message}" - : $"({Source}) {Message}"; - } - } + /// + /// Generates a string representation of the message. + /// + /// + public override string ToString() + { + return Line > 0 + ? $"{GetString("src-line-col", Source, Line, Column)} {Message}" + : $"({Source}) {Message}"; + } + } } \ No newline at end of file diff --git a/Rant/RantCompilerMessageType.cs b/Rant/RantCompilerMessageType.cs index ea78466..ccb018c 100644 --- a/Rant/RantCompilerMessageType.cs +++ b/Rant/RantCompilerMessageType.cs @@ -25,19 +25,19 @@ namespace Rant { - /// - /// Defines message types used by the Rant compiler. - /// - public enum RantCompilerMessageType - { - /// - /// Indicates a problem that did not interfere with compilation. - /// - Warning, + /// + /// Defines message types used by the Rant compiler. + /// + public enum RantCompilerMessageType + { + /// + /// Indicates a problem that did not interfere with compilation. + /// + Warning, - /// - /// Indicates a problem that made compilation impossible, usually a syntax error. - /// - Error - } + /// + /// Indicates a problem that made compilation impossible, usually a syntax error. + /// + Error + } } \ No newline at end of file diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index d9d9e43..321d911 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -41,538 +41,538 @@ namespace Rant { - /// - /// The central class of the Rant engine that allows the execution of patterns. - /// - public sealed class RantEngine - { - private readonly HashSet _loadedPackages = new HashSet(); - private readonly Dictionary _patternCache = new Dictionary(); - - /// - /// The currently set flags. - /// - public readonly HashSet Flags = new HashSet(); - - internal readonly ObjectTable Objects = new ObjectTable(); - private CarrierState _carrierState = null; - private RantDictionary _dictionary = new RantDictionary(); - private RantFormat _format = RantFormat.English; - private bool _preserveCarrierState = false; - private RantDependencyResolver _resolver = new RantDependencyResolver(); - internal Dictionary PackageModules = new Dictionary(); - - /// - /// Creates a new RantEngine object without a dictionary. - /// - public RantEngine() - { - } - - /// - /// Creates a new RantEngine object with the specified vocabulary. - /// - /// The vocabulary to load in this instance. - public RantEngine(RantDictionary dictionary) - { - if (dictionary == null) throw new ArgumentNullException(nameof(dictionary)); - _dictionary = dictionary; - } - - /// - /// User-defined Rant modules. - /// - public Dictionary Modules { get; } = new Dictionary(); - - /// - /// The current formatting settings for the engine. - /// - public RantFormat Format - { - get { return _format; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _format = value; - } - } - - /// - /// The vocabulary associated with this instance. - /// - public RantDictionary Dictionary - { - get { return _dictionary; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _dictionary = value; - } - } - - /// - /// Gets or sets the depdendency resolver used for packages. - /// - public RantDependencyResolver DependencyResolver - { - get { return _resolver; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _resolver = value; - } - } - - /// - /// Specifies whether to preserve carrier states between patterns. - /// - public bool PreserveCarrierState - { - get { return _preserveCarrierState; } - set - { - if (!value) _carrierState = null; - _preserveCarrierState = value; - } - } - - /// - /// Accesses global variables. - /// - /// The name of the variable to access. - /// - public RantObject this[string name] - { - get { return Objects[name]; } - set { Objects[name] = value; } - } - - /// - /// Deletes all state data in the engine's persisted carrier state, if available. - /// - public void ResetCarrierState() - { - _carrierState?.Reset(); - } - - /// - /// Returns a boolean value indicating whether a program by the specified name has been loaded from a package. - /// - /// The name of the program to check. - /// - public bool ProgramNameLoaded(string patternName) - { - return _patternCache != null && _patternCache.ContainsKey(patternName); - } - - /// - /// Used by package loader - /// - /// Program to load - /// - internal bool CacheProgramInternal(RantProgram program) - { - if (Util.IsNullOrWhiteSpace(program.Name) || _patternCache.ContainsKey(program.Name)) return false; - _patternCache[program.Name] = program; - return true; - } - - /// - /// Loads the specified package into the engine. - /// - /// The package to load. - public void LoadPackage(RantPackage package) - { - if (package == null) throw new ArgumentNullException(nameof(package)); - if (_loadedPackages.Contains(RantPackageDependency.Create(package))) return; - - foreach (var dependency in package.GetDependencies()) - { - RantPackage pkg; - if (!_resolver.TryResolvePackage(dependency, out pkg)) - throw new FileNotFoundException(GetString("err-unresolvable-package", package, dependency)); - LoadPackage(pkg); - } - - foreach (var res in package.GetResources()) res.Load(this); - - _loadedPackages.Add(RantPackageDependency.Create(package)); - } - - /// - /// Loads the package at the specified file path into the engine. - /// - /// The path to the package to load. - public void LoadPackage(string path) - { - if (Util.IsNullOrWhiteSpace(path)) - throw new ArgumentException(GetString("err-empty-path")); - - if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) - path += RantPackage.EXTENSION; - - LoadPackage(RantPackage.Load(path)); - } - - /// - /// Returns a pattern with the specified name from the engine's cache. If the pattern doesn't exist, it is loaded from - /// file. - /// - /// The name or path of the pattern to retrieve. - /// - internal RantProgram GetProgramInternal(string name) - { - RantProgram pattern; - if (_patternCache.TryGetValue(name, out pattern)) return pattern; - return _patternCache[name] = RantProgram.CompileFile(name); - } - - #region Static members - - private static int _maxStackSize = 64; - private static readonly RNG Seeds = new RNG(); - - static RantEngine() - { - ForceLoad(); - RantFunctionRegistry.Load(); - } - - /// - /// Gets or sets the maximum stack size allowed for a pattern. - /// - public static int MaxStackSize - { - get { return _maxStackSize; } - set - { - if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), GetString("err-zero-or-negative")); - _maxStackSize = value; - } - } - - #endregion - - #region Do, DoFile + /// + /// The central class of the Rant engine that allows the execution of patterns. + /// + public sealed class RantEngine + { + private readonly HashSet _loadedPackages = new HashSet(); + private readonly Dictionary _patternCache = new Dictionary(); + + /// + /// The currently set flags. + /// + public readonly HashSet Flags = new HashSet(); + + internal readonly ObjectTable Objects = new ObjectTable(); + private CarrierState _carrierState = null; + private RantDictionary _dictionary = new RantDictionary(); + private RantFormat _format = RantFormat.English; + private bool _preserveCarrierState = false; + private RantDependencyResolver _resolver = new RantDependencyResolver(); + internal Dictionary PackageModules = new Dictionary(); + + /// + /// Creates a new RantEngine object without a dictionary. + /// + public RantEngine() + { + } + + /// + /// Creates a new RantEngine object with the specified vocabulary. + /// + /// The vocabulary to load in this instance. + public RantEngine(RantDictionary dictionary) + { + if (dictionary == null) throw new ArgumentNullException(nameof(dictionary)); + _dictionary = dictionary; + } + + /// + /// User-defined Rant modules. + /// + public Dictionary Modules { get; } = new Dictionary(); + + /// + /// The current formatting settings for the engine. + /// + public RantFormat Format + { + get { return _format; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _format = value; + } + } + + /// + /// The vocabulary associated with this instance. + /// + public RantDictionary Dictionary + { + get { return _dictionary; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _dictionary = value; + } + } + + /// + /// Gets or sets the depdendency resolver used for packages. + /// + public RantDependencyResolver DependencyResolver + { + get { return _resolver; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _resolver = value; + } + } + + /// + /// Specifies whether to preserve carrier states between patterns. + /// + public bool PreserveCarrierState + { + get { return _preserveCarrierState; } + set + { + if (!value) _carrierState = null; + _preserveCarrierState = value; + } + } + + /// + /// Accesses global variables. + /// + /// The name of the variable to access. + /// + public RantObject this[string name] + { + get { return Objects[name]; } + set { Objects[name] = value; } + } + + /// + /// Deletes all state data in the engine's persisted carrier state, if available. + /// + public void ResetCarrierState() + { + _carrierState?.Reset(); + } + + /// + /// Returns a boolean value indicating whether a program by the specified name has been loaded from a package. + /// + /// The name of the program to check. + /// + public bool ProgramNameLoaded(string patternName) + { + return _patternCache != null && _patternCache.ContainsKey(patternName); + } + + /// + /// Used by package loader + /// + /// Program to load + /// + internal bool CacheProgramInternal(RantProgram program) + { + if (Util.IsNullOrWhiteSpace(program.Name) || _patternCache.ContainsKey(program.Name)) return false; + _patternCache[program.Name] = program; + return true; + } + + /// + /// Loads the specified package into the engine. + /// + /// The package to load. + public void LoadPackage(RantPackage package) + { + if (package == null) throw new ArgumentNullException(nameof(package)); + if (_loadedPackages.Contains(RantPackageDependency.Create(package))) return; + + foreach (var dependency in package.GetDependencies()) + { + RantPackage pkg; + if (!_resolver.TryResolvePackage(dependency, out pkg)) + throw new FileNotFoundException(GetString("err-unresolvable-package", package, dependency)); + LoadPackage(pkg); + } + + foreach (var res in package.GetResources()) res.Load(this); + + _loadedPackages.Add(RantPackageDependency.Create(package)); + } + + /// + /// Loads the package at the specified file path into the engine. + /// + /// The path to the package to load. + public void LoadPackage(string path) + { + if (Util.IsNullOrWhiteSpace(path)) + throw new ArgumentException(GetString("err-empty-path")); + + if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) + path += RantPackage.EXTENSION; + + LoadPackage(RantPackage.Load(path)); + } + + /// + /// Returns a pattern with the specified name from the engine's cache. If the pattern doesn't exist, it is loaded from + /// file. + /// + /// The name or path of the pattern to retrieve. + /// + internal RantProgram GetProgramInternal(string name) + { + RantProgram pattern; + if (_patternCache.TryGetValue(name, out pattern)) return pattern; + return _patternCache[name] = RantProgram.CompileFile(name); + } + + #region Static members + + private static int _maxStackSize = 64; + private static readonly RNG Seeds = new RNG(); + + static RantEngine() + { + ForceLoad(); + RantFunctionRegistry.Load(); + } + + /// + /// Gets or sets the maximum stack size allowed for a pattern. + /// + public static int MaxStackSize + { + get { return _maxStackSize; } + set + { + if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), GetString("err-zero-or-negative")); + _maxStackSize = value; + } + } + + #endregion + + #region Do, DoFile #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - private RantOutput RunVM(Sandbox vm, double timeout) - { - vm.UserModules = Modules; - vm.PackageModules = PackageModules; - if (_preserveCarrierState && _carrierState == null) - _carrierState = vm.CarrierState; - return vm.Run(timeout); - } - - private CarrierState GetPreservedCarrierState() => _preserveCarrierState ? _carrierState : null; - - /// - /// Compiles the specified string into a pattern, executes it, and returns the resulting output. - /// - /// The input string to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM( - new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), - args), timeout); - - /// - /// Loads the file located at the specified path and executes it, returning the resulting output. - /// - /// The path to the file to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM( - new Sandbox(this, RantProgram.CompileFile(path), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), - timeout); - - /// - /// Compiles the specified string into a pattern, executes it using a custom seed, and returns the resulting output. - /// - /// The input string to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args), - timeout); - - /// - /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. - /// - /// The path to the file to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - => - RunVM(new Sandbox(this, RantProgram.CompileFile(path), new RNG(seed), charLimit, GetPreservedCarrierState(), args), - timeout); - - /// - /// Compiles the specified string into a pattern, executes it using a custom RNG, and returns the resulting output. - /// - /// The input string to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. - /// - /// The path to the file to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, RantProgram.CompileFile(path), rng, charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern and returns the resulting output. - /// - /// The pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(RantProgram input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern using a custom seed and returns the resulting output. - /// - /// The pattern to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(RantProgram input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - => - RunVM(new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern using a custom random number generator and returns the resulting output. - /// - /// The pattern to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - => - RunVM(new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(RantProgram input, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The patten to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(RantProgram input, long seed, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattero to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(string input, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), - args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args) - .RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes a pattern that has been loaded from a package and returns the resulting output. - /// - /// The name of the pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - { - if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); - - return - RunVM( - new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), - timeout); - } - - /// - /// Executes a pattern that has been loaded from a package and returns the resulting output. - /// - /// The name of the pattern to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) - { - if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); - - return - RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, GetPreservedCarrierState(), args), - timeout); - } - - /// - /// Executes a pattern that has been loaded from a package using a custom random number generator and returns the resulting - /// output. - /// - /// The name of the pattern to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoPackaged(string patternName, RNG rng, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) - { - if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); - - return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, GetPreservedCarrierState(), args), timeout); - } - - #endregion - } + private RantOutput RunVM(Sandbox vm, double timeout) + { + vm.UserModules = Modules; + vm.PackageModules = PackageModules; + if (_preserveCarrierState && _carrierState == null) + _carrierState = vm.CarrierState; + return vm.Run(timeout); + } + + private CarrierState GetPreservedCarrierState() => _preserveCarrierState ? _carrierState : null; + + /// + /// Compiles the specified string into a pattern, executes it, and returns the resulting output. + /// + /// The input string to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM( + new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), + args), timeout); + + /// + /// Loads the file located at the specified path and executes it, returning the resulting output. + /// + /// The path to the file to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM( + new Sandbox(this, RantProgram.CompileFile(path), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), + timeout); + + /// + /// Compiles the specified string into a pattern, executes it using a custom seed, and returns the resulting output. + /// + /// The input string to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args), + timeout); + + /// + /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. + /// + /// The path to the file to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + => + RunVM(new Sandbox(this, RantProgram.CompileFile(path), new RNG(seed), charLimit, GetPreservedCarrierState(), args), + timeout); + + /// + /// Compiles the specified string into a pattern, executes it using a custom RNG, and returns the resulting output. + /// + /// The input string to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. + /// + /// The path to the file to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, RantProgram.CompileFile(path), rng, charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern and returns the resulting output. + /// + /// The pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(RantProgram input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern using a custom seed and returns the resulting output. + /// + /// The pattern to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(RantProgram input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + => + RunVM(new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern using a custom random number generator and returns the resulting output. + /// + /// The pattern to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + => + RunVM(new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(RantProgram input, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The patten to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(RantProgram input, long seed, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattero to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(string input, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), + args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args) + .RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes a pattern that has been loaded from a package and returns the resulting output. + /// + /// The name of the pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + { + if (!ProgramNameLoaded(patternName)) + throw new ArgumentException("Pattern doesn't exist."); + + return + RunVM( + new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), + timeout); + } + + /// + /// Executes a pattern that has been loaded from a package and returns the resulting output. + /// + /// The name of the pattern to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) + { + if (!ProgramNameLoaded(patternName)) + throw new ArgumentException("Pattern doesn't exist."); + + return + RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, GetPreservedCarrierState(), args), + timeout); + } + + /// + /// Executes a pattern that has been loaded from a package using a custom random number generator and returns the resulting + /// output. + /// + /// The name of the pattern to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoPackaged(string patternName, RNG rng, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) + { + if (!ProgramNameLoaded(patternName)) + throw new ArgumentException("Pattern doesn't exist."); + + return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, GetPreservedCarrierState(), args), timeout); + } + + #endregion + } } \ No newline at end of file diff --git a/Rant/RantInternalException.cs b/Rant/RantInternalException.cs index 4d7c3d1..3938006 100644 --- a/Rant/RantInternalException.cs +++ b/Rant/RantInternalException.cs @@ -27,25 +27,25 @@ namespace Rant { - /// - /// Represents an error that has been caused by a problem inside the Rant engine. This typically indicates the presence of - /// a bug. - /// - public sealed class RantInternalException : Exception - { - internal RantInternalException() - : base("An internal error has occurred. This is often caused by a bug in Rant.") - { - } + /// + /// Represents an error that has been caused by a problem inside the Rant engine. This typically indicates the presence of + /// a bug. + /// + public sealed class RantInternalException : Exception + { + internal RantInternalException() + : base("An internal error has occurred. This is often caused by a bug in Rant.") + { + } - internal RantInternalException(string message) - : base($"An internal error has occurred. This is often caused by a bug in Rant. Message: {message}.") - { - } + internal RantInternalException(string message) + : base($"An internal error has occurred. This is often caused by a bug in Rant. Message: {message}.") + { + } - internal RantInternalException(string message, Exception inner) - : base($"An internal error has occurred. This is often caused by a bug in Rant. Message: {message}.", inner) - { - } - } + internal RantInternalException(string message, Exception inner) + : base($"An internal error has occurred. This is often caused by a bug in Rant. Message: {message}.", inner) + { + } + } } \ No newline at end of file diff --git a/Rant/RantOutput.cs b/Rant/RantOutput.cs index c26d0f2..444927b 100644 --- a/Rant/RantOutput.cs +++ b/Rant/RantOutput.cs @@ -31,96 +31,96 @@ namespace Rant { - /// - /// Represents a collection of strings generated by a pattern. - /// - public sealed class RantOutput : IEnumerable - { - private readonly Dictionary _outputs; + /// + /// Represents a collection of strings generated by a pattern. + /// + public sealed class RantOutput : IEnumerable + { + private readonly Dictionary _outputs; - internal RantOutput(long seed, long startingGen, IEnumerable chains) - { - _outputs = chains.ToDictionary(chain => chain.Name, - chain => new RantOutputEntry(chain.Name, chain.ToString(), chain.Visibility)); - Seed = seed; - BaseGeneration = startingGen; - } + internal RantOutput(long seed, long startingGen, IEnumerable chains) + { + _outputs = chains.ToDictionary(chain => chain.Name, + chain => new RantOutputEntry(chain.Name, chain.ToString(), chain.Visibility)); + Seed = seed; + BaseGeneration = startingGen; + } - /// - /// Gets the output of the channel with the specified name. - /// - /// The name of the channel. - /// - public string this[string channel] - { - get - { - RantOutputEntry value; - return _outputs.TryGetValue(channel, out value) ? value.Value : string.Empty; - } - } + /// + /// Gets the output of the channel with the specified name. + /// + /// The name of the channel. + /// + public string this[string channel] + { + get + { + RantOutputEntry value; + return _outputs.TryGetValue(channel, out value) ? value.Value : string.Empty; + } + } - /// - /// Gets an array containing the values of the specified channels, in the order they appear. - /// - /// The names of the channels whose values are to be retrieved. - /// - public string[] this[params string[] channels] - { - get - { - if (channels == null || channels.Length == 0) return new string[0]; - var output = new string[channels.Length]; - for (int i = 0; i < channels.Length; i++) - { - if (channels[i] == null) - { - output[i] = string.Empty; - continue; - } - RantOutputEntry value; - if (_outputs.TryGetValue(channels[i], out value)) - channels[i] = value.Value; - else - channels[i] = string.Empty; - } - return channels; - } - } + /// + /// Gets an array containing the values of the specified channels, in the order they appear. + /// + /// The names of the channels whose values are to be retrieved. + /// + public string[] this[params string[] channels] + { + get + { + if (channels == null || channels.Length == 0) return new string[0]; + var output = new string[channels.Length]; + for (int i = 0; i < channels.Length; i++) + { + if (channels[i] == null) + { + output[i] = string.Empty; + continue; + } + RantOutputEntry value; + if (_outputs.TryGetValue(channels[i], out value)) + channels[i] = value.Value; + else + channels[i] = string.Empty; + } + return channels; + } + } - /// - /// The seed used to generate the output. - /// - public long Seed { get; } + /// + /// The seed used to generate the output. + /// + public long Seed { get; } - /// - /// The generation at which the RNG was initially set before the pattern was run. - /// - public long BaseGeneration { get; } + /// + /// The generation at which the RNG was initially set before the pattern was run. + /// + public long BaseGeneration { get; } - /// - /// The main output string. - /// - public string Main => _outputs["main"].Value; + /// + /// The main output string. + /// + public string Main => _outputs["main"].Value; - /// - /// Returns an enumerator that iterates through the outputs in the collection. - /// - /// - public IEnumerator GetEnumerator() => _outputs.Values.GetEnumerator(); + /// + /// Returns an enumerator that iterates through the outputs in the collection. + /// + /// + public IEnumerator GetEnumerator() => _outputs.Values.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() => _outputs.Values.GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => _outputs.Values.GetEnumerator(); - /// - /// Returns the output from the "main" channel. - /// - /// - public override string ToString() => Main; + /// + /// Returns the output from the "main" channel. + /// + /// + public override string ToString() => Main; - /// - /// Returns the output from the "main" channel. - /// - /// - public static implicit operator string(RantOutput output) => output.Main; - } + /// + /// Returns the output from the "main" channel. + /// + /// + public static implicit operator string(RantOutput output) => output.Main; + } } \ No newline at end of file diff --git a/Rant/RantOutputEntry.cs b/Rant/RantOutputEntry.cs index 5ddccba..7b86343 100644 --- a/Rant/RantOutputEntry.cs +++ b/Rant/RantOutputEntry.cs @@ -27,31 +27,31 @@ namespace Rant { - /// - /// Represents the output of a single channel. - /// - public sealed class RantOutputEntry - { - internal RantOutputEntry(string name, string value, ChannelVisibility visiblity) - { - Name = name; - Value = value; - Visiblity = visiblity; - } + /// + /// Represents the output of a single channel. + /// + public sealed class RantOutputEntry + { + internal RantOutputEntry(string name, string value, ChannelVisibility visiblity) + { + Name = name; + Value = value; + Visiblity = visiblity; + } - /// - /// Gets the name of the channel. - /// - public string Name { get; } + /// + /// Gets the name of the channel. + /// + public string Name { get; } - /// - /// Gets the value of the channel. - /// - public string Value { get; } + /// + /// Gets the value of the channel. + /// + public string Value { get; } - /// - /// The visibility of the channel that created the output entry. - /// - public ChannelVisibility Visiblity { get; } - } + /// + /// The visibility of the channel that created the output entry. + /// + public ChannelVisibility Visiblity { get; } + } } \ No newline at end of file diff --git a/Rant/RantProgram.cs b/Rant/RantProgram.cs index 7f8cccb..c536658 100644 --- a/Rant/RantProgram.cs +++ b/Rant/RantProgram.cs @@ -40,196 +40,196 @@ namespace Rant { - /// - /// Represents a compiled pattern that can be executed by the engine. It is recommended to use this class when running the - /// same pattern multiple times. - /// - public sealed class RantProgram : RantResource - { - private const string Magic = "RANT"; - private const string Extension = ".rantpgm"; - - private static readonly HashSet _invalidNameChars = - new HashSet(new[] { '$', '@', ':', '~', '%', '?', '>', '<', '[', ']', '|', '{', '}', '?' }); - - private string _name; - - internal RantProgram(string name, RantProgramOrigin type, string code) - { - Name = name; - Type = type; - Code = code; - var compiler = new RantCompiler(name, code); - SyntaxTree = compiler.Compile(); - Module = compiler.HasModule ? compiler.Module : null; - } - - internal RantProgram(string name, RantProgramOrigin type, RST rst) - { - Name = name; - Type = type; - Code = null; - SyntaxTree = rst; - Module = null; - } - - internal RantProgram() - { - // Used by serializer - } - - /// - /// Gets or sets the name of the source code. - /// - public string Name - { - get { return _name; } - set - { - if (!IsValidPatternName(value)) - throw new ArgumentException($"Invalid pattern name: '{value ?? ""}'"); - _name = string.Join("/", - value.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()); - } - } - - /// - /// Describes the origin of the program. - /// - public RantProgramOrigin Type { get; } - - /// - /// The pattern from which the program was compiled. - /// - public string Code { get; } - - internal RST SyntaxTree { get; private set; } - internal RantModule Module { get; } - - /// - /// Compiles a program from the specified pattern. - /// - /// The pattern to compile. - /// Thrown if a syntax error is encountered. - /// - public static RantProgram CompileString(string code) => new RantProgram(GetString("pattern"), RantProgramOrigin.String, code); - - /// - /// Compiles a program from a pattern with the specified name. - /// - /// The name to give the source. - /// The pattern to compile. - /// Thrown if a syntax error is encountered. - /// - public static RantProgram CompileString(string name, string code) - => new RantProgram(name, RantProgramOrigin.String, code); - - /// - /// Loads the file located at the specified path and compiles a program from its contents. - /// - /// The path to the file to load. - /// Thrown if a syntax error is encountered. - /// Thrown if the file cannot be found. - /// - public static RantProgram CompileFile(string path) - => new RantProgram(Path.GetFileName(path), RantProgramOrigin.File, File.ReadAllText(path)); - - /// - /// Saves the compiled program to the file at the specified path. - /// - /// The path to save the program to. - public void SaveToFile(string path) - { - if (path == null) throw new ArgumentNullException(nameof(path)); - if (!Path.HasExtension(path)) path += Extension; - SaveToStream(File.Create(path)); - } - - /// - /// Saves the compiled program to the specified stream. - /// - /// The stream to save the program to. - public void SaveToStream(Stream stream) - { - if (stream == null) throw new ArgumentNullException(nameof(stream)); - using (var output = new EasyWriter(stream, Endian.Little, true)) - { - output.WriteBytes(Encoding.ASCII.GetBytes(Magic)); - RST.SerializeRST(SyntaxTree, output); - } - stream.Flush(); - } - - /// - /// Loads a compiled Rant program from the file at the specified path. - /// - /// The path to load the program from. - /// - public static RantProgram LoadFile(string path) - { - if (path == null) throw new ArgumentNullException(nameof(path)); - return LoadStream(Path.GetFileNameWithoutExtension(path), File.Open(path, FileMode.Open)); - } - - /// - /// Loads a compiled Rant program from the specified stream. - /// - /// The name to give to the program. - /// The stream to load the program from. - /// - public static RantProgram LoadStream(string programName, Stream stream) - { - if (programName == null) throw new ArgumentNullException(nameof(programName)); - if (stream == null) throw new ArgumentNullException(nameof(stream)); - using (var input = new EasyReader(stream)) - { - if (Encoding.ASCII.GetString(input.ReadBytes(4)) != Magic) - throw new InvalidDataException(GetString("err-pgmload-bad-magic")); - - var rst = RST.DeserializeRST(input); - - // TODO: Use string table - - return new RantProgram(programName, RantProgramOrigin.File, rst); - } - } - - /// - /// Returns a string describing the pattern. - /// - /// - public override string ToString() => $"{Name} [{Type}]"; - - private static bool IsValidPatternName(string name) => !Util.IsNullOrWhiteSpace(name) && name.All(c => !_invalidNameChars.Contains(c)); - - internal override void DeserializeData(BsonItem data) - { - Name = data["name"]; - using (var ms = new MemoryStream((byte[])data["code"].Value)) - using (var reader = new EasyReader(ms)) - { - SyntaxTree = RST.DeserializeRST(reader); - } - } - - internal override BsonItem SerializeData() - { - var data = new BsonItem { ["name"] = Name }; - - using (var ms = new MemoryStream()) - using (var writer = new EasyWriter(ms)) - { - RST.SerializeRST(SyntaxTree, writer); - ms.Flush(); - data["code"] = new BsonItem(ms.ToArray()); - } - return data; - } - - internal override void Load(RantEngine engine) - { - engine.CacheProgramInternal(this); - if (Module != null) engine.PackageModules[Name] = Module; - } - } + /// + /// Represents a compiled pattern that can be executed by the engine. It is recommended to use this class when running the + /// same pattern multiple times. + /// + public sealed class RantProgram : RantResource + { + private const string Magic = "RANT"; + private const string Extension = ".rantpgm"; + + private static readonly HashSet _invalidNameChars = + new HashSet(new[] { '$', '@', ':', '~', '%', '?', '>', '<', '[', ']', '|', '{', '}', '?' }); + + private string _name; + + internal RantProgram(string name, RantProgramOrigin type, string code) + { + Name = name; + Type = type; + Code = code; + var compiler = new RantCompiler(name, code); + SyntaxTree = compiler.Compile(); + Module = compiler.HasModule ? compiler.Module : null; + } + + internal RantProgram(string name, RantProgramOrigin type, RST rst) + { + Name = name; + Type = type; + Code = null; + SyntaxTree = rst; + Module = null; + } + + internal RantProgram() + { + // Used by serializer + } + + /// + /// Gets or sets the name of the source code. + /// + public string Name + { + get { return _name; } + set + { + if (!IsValidPatternName(value)) + throw new ArgumentException($"Invalid pattern name: '{value ?? ""}'"); + _name = string.Join("/", + value.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()); + } + } + + /// + /// Describes the origin of the program. + /// + public RantProgramOrigin Type { get; } + + /// + /// The pattern from which the program was compiled. + /// + public string Code { get; } + + internal RST SyntaxTree { get; private set; } + internal RantModule Module { get; } + + /// + /// Compiles a program from the specified pattern. + /// + /// The pattern to compile. + /// Thrown if a syntax error is encountered. + /// + public static RantProgram CompileString(string code) => new RantProgram(GetString("pattern"), RantProgramOrigin.String, code); + + /// + /// Compiles a program from a pattern with the specified name. + /// + /// The name to give the source. + /// The pattern to compile. + /// Thrown if a syntax error is encountered. + /// + public static RantProgram CompileString(string name, string code) + => new RantProgram(name, RantProgramOrigin.String, code); + + /// + /// Loads the file located at the specified path and compiles a program from its contents. + /// + /// The path to the file to load. + /// Thrown if a syntax error is encountered. + /// Thrown if the file cannot be found. + /// + public static RantProgram CompileFile(string path) + => new RantProgram(Path.GetFileName(path), RantProgramOrigin.File, File.ReadAllText(path)); + + /// + /// Saves the compiled program to the file at the specified path. + /// + /// The path to save the program to. + public void SaveToFile(string path) + { + if (path == null) throw new ArgumentNullException(nameof(path)); + if (!Path.HasExtension(path)) path += Extension; + SaveToStream(File.Create(path)); + } + + /// + /// Saves the compiled program to the specified stream. + /// + /// The stream to save the program to. + public void SaveToStream(Stream stream) + { + if (stream == null) throw new ArgumentNullException(nameof(stream)); + using (var output = new EasyWriter(stream, Endian.Little, true)) + { + output.WriteBytes(Encoding.ASCII.GetBytes(Magic)); + RST.SerializeRST(SyntaxTree, output); + } + stream.Flush(); + } + + /// + /// Loads a compiled Rant program from the file at the specified path. + /// + /// The path to load the program from. + /// + public static RantProgram LoadFile(string path) + { + if (path == null) throw new ArgumentNullException(nameof(path)); + return LoadStream(Path.GetFileNameWithoutExtension(path), File.Open(path, FileMode.Open)); + } + + /// + /// Loads a compiled Rant program from the specified stream. + /// + /// The name to give to the program. + /// The stream to load the program from. + /// + public static RantProgram LoadStream(string programName, Stream stream) + { + if (programName == null) throw new ArgumentNullException(nameof(programName)); + if (stream == null) throw new ArgumentNullException(nameof(stream)); + using (var input = new EasyReader(stream)) + { + if (Encoding.ASCII.GetString(input.ReadBytes(4)) != Magic) + throw new InvalidDataException(GetString("err-pgmload-bad-magic")); + + var rst = RST.DeserializeRST(input); + + // TODO: Use string table + + return new RantProgram(programName, RantProgramOrigin.File, rst); + } + } + + /// + /// Returns a string describing the pattern. + /// + /// + public override string ToString() => $"{Name} [{Type}]"; + + private static bool IsValidPatternName(string name) => !Util.IsNullOrWhiteSpace(name) && name.All(c => !_invalidNameChars.Contains(c)); + + internal override void DeserializeData(BsonItem data) + { + Name = data["name"]; + using (var ms = new MemoryStream((byte[])data["code"].Value)) + using (var reader = new EasyReader(ms)) + { + SyntaxTree = RST.DeserializeRST(reader); + } + } + + internal override BsonItem SerializeData() + { + var data = new BsonItem { ["name"] = Name }; + + using (var ms = new MemoryStream()) + using (var writer = new EasyWriter(ms)) + { + RST.SerializeRST(SyntaxTree, writer); + ms.Flush(); + data["code"] = new BsonItem(ms.ToArray()); + } + return data; + } + + internal override void Load(RantEngine engine) + { + engine.CacheProgramInternal(this); + if (Module != null) engine.PackageModules[Name] = Module; + } + } } \ No newline at end of file diff --git a/Rant/RantProgramArgs.cs b/Rant/RantProgramArgs.cs index 8702c17..0c36f7a 100644 --- a/Rant/RantProgramArgs.cs +++ b/Rant/RantProgramArgs.cs @@ -33,107 +33,107 @@ namespace Rant { - /// - /// Represents a set of arguments that can be passed to a pattern. - /// - public sealed class RantProgramArgs - { - private static readonly Dictionary> objPropMap = - new Dictionary>(); - - private readonly Dictionary _args = new Dictionary(); - - /// - /// Create a new, empty RantPatternArgs instance. - /// - public RantProgramArgs() - { - } - - internal RantProgramArgs(object value) - { - if (value == null) return; - var type = value.GetType(); - Dictionary map; - RantArgAttribute attrName; - if (!objPropMap.TryGetValue(type, out map)) - { - objPropMap[type] = map = new Dictionary(); - foreach (var prop in type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.CanRead)) - { + /// + /// Represents a set of arguments that can be passed to a pattern. + /// + public sealed class RantProgramArgs + { + private static readonly Dictionary> objPropMap = + new Dictionary>(); + + private readonly Dictionary _args = new Dictionary(); + + /// + /// Create a new, empty RantPatternArgs instance. + /// + public RantProgramArgs() + { + } + + internal RantProgramArgs(object value) + { + if (value == null) return; + var type = value.GetType(); + Dictionary map; + RantArgAttribute attrName; + if (!objPropMap.TryGetValue(type, out map)) + { + objPropMap[type] = map = new Dictionary(); + foreach (var prop in type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.CanRead)) + { #if UNITY if ((attrName = prop.GetCustomAttributes(typeof(RantArgAttribute), true).Cast().FirstOrDefault()) != null) #else - if ((attrName = prop.GetCustomAttributes().FirstOrDefault()) != null) + if ((attrName = prop.GetCustomAttributes().FirstOrDefault()) != null) #endif - map[attrName.Name] = prop; - else - map[prop.Name] = prop; - } - } + map[attrName.Name] = prop; + else + map[prop.Name] = prop; + } + } - foreach (var pair in map) - { + foreach (var pair in map) + { #if UNITY var obj = pair.Value.GetValue(value, null); #else - var obj = pair.Value.GetValue(value); + var obj = pair.Value.GetValue(value); #endif - if (obj != null) _args[pair.Key] = Convert.ToString(obj, CultureInfo.InvariantCulture); - } - } - - /// - /// Gets or sets an argument of the specified name. - /// - /// The name of the argument. - /// - public string this[string key] - { - get - { - if (Util.IsNullOrWhiteSpace(key)) return string.Empty; - string val; - return _args.TryGetValue(key, out val) ? val ?? string.Empty : string.Empty; - } - set - { - if (key == null || string.IsNullOrEmpty(value)) return; - _args[key] = value; - } - } - - /// - /// Creates a RantPatternArgs instance from the specified object. - /// Works with anonymous types! - /// - /// The object to create an argument set from. - /// - public static RantProgramArgs CreateFrom(object value) - { - if (value is RantProgramArgs) return value as RantProgramArgs; - return new RantProgramArgs(value); - } - - /// - /// Determines whether an argument by the specified name exists in the current list. - /// - /// The name of the argument to search for. - /// - public bool Contains(string key) => _args.ContainsKey(key ?? string.Empty); - - /// - /// Removes the specified argument. - /// - /// The name of the argument to remove. - /// - public bool Remove(string key) => _args.Remove(key ?? string.Empty); - - /// - /// Clears all values. - /// - public void Clear() => _args.Clear(); - } + if (obj != null) _args[pair.Key] = Convert.ToString(obj, CultureInfo.InvariantCulture); + } + } + + /// + /// Gets or sets an argument of the specified name. + /// + /// The name of the argument. + /// + public string this[string key] + { + get + { + if (Util.IsNullOrWhiteSpace(key)) return string.Empty; + string val; + return _args.TryGetValue(key, out val) ? val ?? string.Empty : string.Empty; + } + set + { + if (key == null || string.IsNullOrEmpty(value)) return; + _args[key] = value; + } + } + + /// + /// Creates a RantPatternArgs instance from the specified object. + /// Works with anonymous types! + /// + /// The object to create an argument set from. + /// + public static RantProgramArgs CreateFrom(object value) + { + if (value is RantProgramArgs) return value as RantProgramArgs; + return new RantProgramArgs(value); + } + + /// + /// Determines whether an argument by the specified name exists in the current list. + /// + /// The name of the argument to search for. + /// + public bool Contains(string key) => _args.ContainsKey(key ?? string.Empty); + + /// + /// Removes the specified argument. + /// + /// The name of the argument to remove. + /// + public bool Remove(string key) => _args.Remove(key ?? string.Empty); + + /// + /// Clears all values. + /// + public void Clear() => _args.Clear(); + } } \ No newline at end of file diff --git a/Rant/RantProgramOrigin.cs b/Rant/RantProgramOrigin.cs index 56ff8bd..5d62130 100644 --- a/Rant/RantProgramOrigin.cs +++ b/Rant/RantProgramOrigin.cs @@ -25,19 +25,19 @@ namespace Rant { - /// - /// Indicates the manner in which a referenced code source was created. - /// - public enum RantProgramOrigin - { - /// - /// Source was loaded from a file. - /// - File, + /// + /// Indicates the manner in which a referenced code source was created. + /// + public enum RantProgramOrigin + { + /// + /// Source was loaded from a file. + /// + File, - /// - /// Source was loaded from a string. - /// - String - } + /// + /// Source was loaded from a string. + /// + String + } } \ No newline at end of file diff --git a/Rant/RantRuntimeException.cs b/Rant/RantRuntimeException.cs index 087f94a..12ac320 100644 --- a/Rant/RantRuntimeException.cs +++ b/Rant/RantRuntimeException.cs @@ -32,59 +32,59 @@ namespace Rant { - /// - /// Represents a runtime error raised by the Rant engine. - /// - public sealed class RantRuntimeException : Exception - { - internal RantRuntimeException(RantProgram source, LineCol token, string errorMessageType = "err-generic-runtime", - params object[] errorArgs) - : base((token.Index != -1 - ? $"{GetString("src-line-col", source.Name, token.Line, token.Column)} " - : $"({source.Name}) ") + GetString(errorMessageType, errorArgs)) - { - Code = source.Code; - Line = token.Line; - Column = token.Column; - Index = token.Index; - } + /// + /// Represents a runtime error raised by the Rant engine. + /// + public sealed class RantRuntimeException : Exception + { + internal RantRuntimeException(RantProgram source, LineCol token, string errorMessageType = "err-generic-runtime", + params object[] errorArgs) + : base((token.Index != -1 + ? $"{GetString("src-line-col", source.Name, token.Line, token.Column)} " + : $"({source.Name}) ") + GetString(errorMessageType, errorArgs)) + { + Code = source.Code; + Line = token.Line; + Column = token.Column; + Index = token.Index; + } - internal RantRuntimeException(RantProgram source, RST rst, string errorMessageType = "err-generic-runtime", - params object[] errorArgs) - : base(rst == null - ? $"({source.Name}) {GetString(errorMessageType, errorArgs)}" - : $"{GetString("src-line-col", source.Name, rst.Location.Line, rst.Location.Column)} {GetString(errorMessageType, errorArgs)}" - ) - { - Code = source.Code; - Line = rst?.Location.Line ?? 0; - Column = rst?.Location.Column ?? 0; - Index = rst?.Location.Index ?? -1; - } + internal RantRuntimeException(RantProgram source, RST rst, string errorMessageType = "err-generic-runtime", + params object[] errorArgs) + : base(rst == null + ? $"({source.Name}) {GetString(errorMessageType, errorArgs)}" + : $"{GetString("src-line-col", source.Name, rst.Location.Line, rst.Location.Column)} {GetString(errorMessageType, errorArgs)}" + ) + { + Code = source.Code; + Line = rst?.Location.Line ?? 0; + Column = rst?.Location.Column ?? 0; + Index = rst?.Location.Index ?? -1; + } - /// - /// The line on which the error occurred. - /// - public int Line { get; private set; } + /// + /// The line on which the error occurred. + /// + public int Line { get; private set; } - /// - /// The column on which the error occurred. - /// - public int Column { get; private set; } + /// + /// The column on which the error occurred. + /// + public int Column { get; private set; } - /// - /// The character index on which the error occurred. - /// - public int Index { get; private set; } + /// + /// The character index on which the error occurred. + /// + public int Index { get; private set; } - /// - /// The length of the substring in which the error occurred. - /// - public int Length { get; private set; } + /// + /// The length of the substring in which the error occurred. + /// + public int Length { get; private set; } - /// - /// The source of the error. - /// - public string Code { get; } - } + /// + /// The source of the error. + /// + public string Code { get; } + } } \ No newline at end of file diff --git a/Rant/RantUtils.cs b/Rant/RantUtils.cs index 75f46b2..2ad547c 100644 --- a/Rant/RantUtils.cs +++ b/Rant/RantUtils.cs @@ -30,62 +30,62 @@ namespace Rant { - /// - /// Contains miscellaneous utility methods that provide information about the Rant engine. - /// - public static class RantUtils - { - /// - /// Determines whether a function with the specified name is defined in the current engine version. - /// - /// The name of the function to search for. Argument is not case-sensitive. - /// - public static bool FunctionExists(string functionName) - { - return RantFunctionRegistry.FunctionExists(functionName); - } + /// + /// Contains miscellaneous utility methods that provide information about the Rant engine. + /// + public static class RantUtils + { + /// + /// Determines whether a function with the specified name is defined in the current engine version. + /// + /// The name of the function to search for. Argument is not case-sensitive. + /// + public static bool FunctionExists(string functionName) + { + return RantFunctionRegistry.FunctionExists(functionName); + } - /// - /// Returns the function with the specified name. The return value will be null if the function is not found. - /// - /// The name of the function to retrieve. - /// - public static IRantFunctionGroup GetFunction(string functionName) - => RantFunctionRegistry.GetFunctionGroup(functionName); + /// + /// Returns the function with the specified name. The return value will be null if the function is not found. + /// + /// The name of the function to retrieve. + /// + public static IRantFunctionGroup GetFunction(string functionName) + => RantFunctionRegistry.GetFunctionGroup(functionName); - /// - /// Enumerates the names of all available Rant functions. - /// - /// - public static IEnumerable GetFunctionNames() => RantFunctionRegistry.GetFunctionNames(); + /// + /// Enumerates the names of all available Rant functions. + /// + /// + public static IEnumerable GetFunctionNames() => RantFunctionRegistry.GetFunctionNames(); - /// - /// Enumerates all function names and their aliases. - /// - /// - public static IEnumerable GetFunctionNamesAndAliases() => RantFunctionRegistry.GetFunctionNamesAndAliases(); + /// + /// Enumerates all function names and their aliases. + /// + /// + public static IEnumerable GetFunctionNamesAndAliases() => RantFunctionRegistry.GetFunctionNamesAndAliases(); - /// - /// Enumerates the available functions. - /// - /// - public static IEnumerable GetFunctions() => RantFunctionRegistry.GetFunctions(); + /// + /// Enumerates the available functions. + /// + /// + public static IEnumerable GetFunctions() => RantFunctionRegistry.GetFunctions(); - /// - /// Returns the description for the function with the specified name. - /// - /// The name of the function to get the description for. - /// The number of arguments in the overload to get the description for. - /// - public static string GetFunctionDescription(string functionName, int argc) - => RantFunctionRegistry.GetFunctionDescription(functionName, argc); + /// + /// Returns the description for the function with the specified name. + /// + /// The name of the function to get the description for. + /// The number of arguments in the overload to get the description for. + /// + public static string GetFunctionDescription(string functionName, int argc) + => RantFunctionRegistry.GetFunctionDescription(functionName, argc); - /// - /// Enumerates the aliases assigned to the specified function name. - /// - /// The function name to retrieve aliases for. - /// - public static IEnumerable GetFunctionAliases(string functionName) - => RantFunctionRegistry.GetAliases(functionName); - } + /// + /// Enumerates the aliases assigned to the specified function name. + /// + /// The function name to retrieve aliases for. + /// + public static IEnumerable GetFunctionAliases(string functionName) + => RantFunctionRegistry.GetAliases(functionName); + } } \ No newline at end of file diff --git a/Rant/Resources/RantDependencyResolver.cs b/Rant/Resources/RantDependencyResolver.cs index 1ae6b93..356c991 100644 --- a/Rant/Resources/RantDependencyResolver.cs +++ b/Rant/Resources/RantDependencyResolver.cs @@ -30,59 +30,59 @@ namespace Rant.Resources { - /// - /// Default class for package depdendency resolving. - /// - public class RantDependencyResolver - { - private static readonly Regex FallbackRegex = new Regex(@"[\s\-_.]*[vV]?(?\d+(\.\d+){0,2})$", - RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Compiled); + /// + /// Default class for package depdendency resolving. + /// + public class RantDependencyResolver + { + private static readonly Regex FallbackRegex = new Regex(@"[\s\-_.]*[vV]?(?\d+(\.\d+){0,2})$", + RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Compiled); - /// - /// Attempts to resolve a depdendency to the appropriate package. - /// - /// The depdendency to resolve. - /// The package loaded from the depdendency. - /// - public virtual bool TryResolvePackage(RantPackageDependency depdendency, out RantPackage package) - { - package = null; - string path = Path.Combine(Environment.CurrentDirectory, $"{depdendency.ID}.rantpkg"); - if (!File.Exists(path)) - { - RantPackageVersion version; - // Fallback to name with version appended + /// + /// Attempts to resolve a depdendency to the appropriate package. + /// + /// The depdendency to resolve. + /// The package loaded from the depdendency. + /// + public virtual bool TryResolvePackage(RantPackageDependency depdendency, out RantPackage package) + { + package = null; + string path = Path.Combine(Environment.CurrentDirectory, $"{depdendency.ID}.rantpkg"); + if (!File.Exists(path)) + { + RantPackageVersion version; + // Fallback to name with version appended #if UNITY path = Directory.GetFiles(Environment.CurrentDirectory, $"{depdendency.ID}*.rantpkg", SearchOption.AllDirectories).FirstOrDefault(p => #else - path = - Directory.EnumerateFiles(Environment.CurrentDirectory, "*.rantpkg", SearchOption.AllDirectories) - .FirstOrDefault(p => + path = + Directory.EnumerateFiles(Environment.CurrentDirectory, "*.rantpkg", SearchOption.AllDirectories) + .FirstOrDefault(p => #endif - { - var match = FallbackRegex.Match(Path.GetFileNameWithoutExtension(p)); - if (!match.Success) return false; - version = RantPackageVersion.Parse(match.Groups["version"].Value); - return depdendency.AllowNewer && version >= depdendency.Version || depdendency.Version == version; - }); - if (path == null) return false; - } - try - { - var pkg = RantPackage.Load(path); - if (pkg.ID != depdendency.ID) return false; - if (depdendency.AllowNewer && pkg.Version >= depdendency.Version || pkg.Version == depdendency.Version) - { - package = pkg; - return true; - } - return false; - } - catch - { - return false; - } - } - } + { + var match = FallbackRegex.Match(Path.GetFileNameWithoutExtension(p)); + if (!match.Success) return false; + version = RantPackageVersion.Parse(match.Groups["version"].Value); + return depdendency.AllowNewer && version >= depdendency.Version || depdendency.Version == version; + }); + if (path == null) return false; + } + try + { + var pkg = RantPackage.Load(path); + if (pkg.ID != depdendency.ID) return false; + if (depdendency.AllowNewer && pkg.Version >= depdendency.Version || pkg.Version == depdendency.Version) + { + package = pkg; + return true; + } + return false; + } + catch + { + return false; + } + } + } } \ No newline at end of file diff --git a/Rant/Resources/RantModule.cs b/Rant/Resources/RantModule.cs index b6382fc..e0f546d 100644 --- a/Rant/Resources/RantModule.cs +++ b/Rant/Resources/RantModule.cs @@ -29,48 +29,50 @@ namespace Rant.Resources { - /// - /// Represents a collection of subroutines that can be loaded and used by other patterns. - /// - public sealed class RantModule - { - private readonly ObjectStack _objects = new ObjectStack(new ObjectTable()); + /// + /// Represents a collection of subroutines that can be loaded and used by other patterns. + /// + public sealed class RantModule + { + private readonly ObjectStack _objects = new ObjectStack(new ObjectTable()); - /// - /// Creates a new RantModule with the specified name. - /// - /// The name to assign to the module. - public RantModule(string name) - { - Name = name; - } + /// + /// Creates a new RantModule with the specified name. + /// + /// The name to assign to the module. + public RantModule(string name) + { + Name = name; + } - /// - /// The name of the module. - /// - public string Name { get; } + /// + /// The name of the module. + /// + public string Name { get; } - internal RST this[string name] => (RST)_objects[name].Value; + internal RST this[string name] => (RST)_objects[name].Value; - /// - /// Adds a RantPattern containing a subroutine to this module. - /// - /// The name of the function to add. - /// The pattern that will make up the body of the function. - public void AddSubroutineFunction(string name, RantProgram pattern) - { - var action = pattern.SyntaxTree.GetType() == typeof(RstSequence) - ? ((RstSequence)pattern.SyntaxTree).Actions[0] - : pattern.SyntaxTree; - if (action.GetType() != typeof(RstDefineSubroutine)) - throw new RantRuntimeException(pattern, LineCol.Unknown, - "Attempted to add non-subroutine pattern to a module."); - _objects[name] = new RantObject(action); - } + /// + /// Adds a RantPattern containing a subroutine to this module. + /// + /// The name of the function to add. + /// The pattern that will make up the body of the function. + public void AddSubroutineFunction(string name, RantProgram pattern) + { + var action = pattern.SyntaxTree.GetType() == typeof(RstSequence) + ? ((RstSequence)pattern.SyntaxTree).Actions[0] + : pattern.SyntaxTree; + if (action.GetType() != typeof(RstDefineSubroutine)) + { + throw new RantRuntimeException(pattern, LineCol.Unknown, + "Attempted to add non-subroutine pattern to a module."); + } + _objects[name] = new RantObject(action); + } - internal void AddActionFunction(string name, RST body) - { - _objects[name] = new RantObject(body); - } - } + internal void AddActionFunction(string name, RST body) + { + _objects[name] = new RantObject(body); + } + } } \ No newline at end of file diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index cdfd66e..72b4525 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -38,324 +38,326 @@ namespace Rant.Resources { - /// - /// Represents a collection of patterns and tables that can be exported to an archive file. - /// - public sealed class RantPackage - { - private const string MAGIC = "RPKG"; - internal const string EXTENSION = ".rantpkg"; - private const ushort PACKAGE_VERSION = 3; - private readonly HashSet _dependencies = new HashSet(); - private readonly HashSet _resources = new HashSet(); - private string _id = GetString("default-package-id"); - private string _title = GetString("untitled-package"); - private RantPackageVersion _version = new RantPackageVersion(1, 0, 0); - - /// - /// The display name of the package. - /// - public string Title - { - get { return _title; } - set - { - if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("Title cannot be empty."); - _title = value; - } - } - - /// - /// The ID of the package. - /// - public string ID - { - get { return _id; } - set - { - if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("ID cannot be empty."); - _id = value; - } - } - - /// - /// The description for the package. - /// - public string Description { get; set; } = ""; - - /// - /// The tags associated with the package. - /// - public string[] Tags { get; set; } = { }; - - /// - /// The package version. - /// - public RantPackageVersion Version - { - get { return _version; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _version = value; - } - } - - /// - /// The authors of the package. - /// - public string[] Authors { get; set; } = { }; - - /// - /// Adds the specified dependency to the package. - /// - /// The dependency to add. - public void AddDependency(RantPackageDependency dependency) - { - if (dependency == null) throw new ArgumentNullException(nameof(dependency)); - _dependencies.Add(dependency); - } - - /// - /// Adds the specified dependency to the package. - /// - /// The ID of the package. - /// The package version to target. - public void AddDependency(string id, string version) - { - if (id == null) throw new ArgumentNullException(nameof(id)); - if (version == null) throw new ArgumentNullException(nameof(version)); - _dependencies.Add(new RantPackageDependency(id, version)); - } - - /// - /// Determines whether the package depends on the specified package. - /// - /// The ID of the package to check for. - /// The version of the package to check for. - /// - public bool DependsOn(string id, string version) - { - if (id == null) throw new ArgumentNullException(nameof(id)); - if (version == null) throw new ArgumentNullException(nameof(version)); - return _dependencies.Contains(new RantPackageDependency(id, version)); - } - - /// - /// Determines whether the package has the specified dependency. - /// - /// The dependency to check for. - /// - public bool DependsOn(RantPackageDependency dependency) - { - if (dependency == null) throw new ArgumentNullException(nameof(dependency)); - return _dependencies.Contains(dependency); - } - - /// - /// Enumerates the package's dependencies. - /// - /// - public IEnumerable GetDependencies() => _dependencies.AsEnumerable(); - - /// - /// Removes the specified dependency from the package. - /// - /// The ID of the dependency to remove. - /// The version of the dependency to remove. - /// - public bool RemoveDependency(string id, string version) - { - if (id == null) throw new ArgumentNullException(nameof(id)); - if (version == null) throw new ArgumentNullException(nameof(version)); - return _dependencies.Remove(new RantPackageDependency(id, version)); - } - - /// - /// Removes the specified dependency from the package. - /// - /// The dependency to remove. - /// - public bool RemoveDependency(RantPackageDependency dependency) - { - if (dependency == null) throw new ArgumentNullException(nameof(dependency)); - return _dependencies.Remove(dependency); - } - - /// - /// Removes all dependencies from the package. - /// - public void ClearDependencies() => _dependencies.Clear(); - - /// - /// Enumerates all resources in the package. - /// - /// - public IEnumerable GetResources() => _resources.AsEnumerable(); - - /// - /// Enumerates all resources matching the specified resource type. - /// - /// The resource type to search for. - /// - public IEnumerable GetResources() where TResource : RantResource => _resources.OfType(); - - /// - /// Adds the specified resource to the package. - /// - /// The resource to add. - /// - public bool AddResource(RantResource resource) - { - if (resource == null) throw new ArgumentNullException(nameof(resource)); - return _resources.Add(resource); - } - - /// - /// Removes the specified resource from the package. - /// - /// The resource to remove. - /// - public bool RemoveResource(RantResource resource) - { - if (resource == null) throw new ArgumentNullException(nameof(resource)); - return _resources.Remove(resource); - } - - /// - /// Determines whether the package contains the specified resource. - /// - /// The resource to search for. - /// - public bool ContainsResource(RantResource resource) - { - if (resource == null) throw new ArgumentNullException(nameof(resource)); - return _resources.Contains(resource); - } - - /// - /// Saves the package to the specified file path. - /// - /// The path to the file to create. - /// Specifies whether to compress the package contents. - /// Specifies string table behavior for the package. - public void Save( - string path, - bool compress = true, - BsonStringTableMode stringTableMode = BsonStringTableMode.None) - { - if (string.IsNullOrEmpty(Path.GetExtension(path))) - path += EXTENSION; - - using (var writer = new EasyWriter(File.Create(path))) - { - var doc = new BsonDocument(stringTableMode) - { - Top = - { - ["info"] = new BsonItem - { - ["title"] = new BsonItem(_title), - ["id"] = new BsonItem(_id), - ["description"] = new BsonItem(Description), - ["tags"] = new BsonItem(Tags), - ["version"] = new BsonItem(Version.ToString()), - ["authors"] = new BsonItem(Authors), - ["dependencies"] = new BsonItem(_dependencies.Select(dep => - { - var depObj = new BsonItem - { - ["id"] = dep.ID, - ["version"] = dep.Version.ToString(), - ["allow-newer"] = dep.AllowNewer - }; - return depObj; - }).ToArray()) - }, - ["resources"] = new BsonItem(_resources.Select(RantResource.SerializeResource).ToList()) - } - }; - - var data = doc.ToByteArray(stringTableMode != BsonStringTableMode.None); - if (compress) - data = EasyCompressor.Compress(data); - writer.Write(Encoding.ASCII.GetBytes(MAGIC)); - writer.Write(PACKAGE_VERSION); - writer.Write(compress); - writer.Write(data.Length); - writer.Write(data); - } - } - - /// - /// Loads a package from the specified path and returns it as a RantPackage object. - /// - /// The path to the package file to load. - /// - public static RantPackage Load(string path) - { - if (string.IsNullOrEmpty(Path.GetExtension(path))) path += EXTENSION; - return Load(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)); - } - - /// - /// Loads a package from the specified stream and returns it as a RantPackage object. - /// - /// The stream to load the package data from. - /// - public static RantPackage Load(Stream source) - { - using (var reader = new EasyReader(source)) - { - string magic = Encoding.ASCII.GetString(reader.ReadBytes(4)); - if (magic != MAGIC) - throw new InvalidDataException(GetString("err-file-corrupt")); - var package = new RantPackage(); - ushort version = reader.ReadUInt16(); - if (version != PACKAGE_VERSION) - throw new InvalidDataException(GetString("err-invalid-package-version", version)); - bool compress = reader.ReadBoolean(); - int size = reader.ReadInt32(); - var data = reader.ReadBytes(size); - if (compress) data = EasyCompressor.Decompress(data); - var doc = BsonDocument.Read(data); - - var info = doc["info"]; - if (info == null) - throw new InvalidDataException(GetString("err-missing-package-meta")); - - package.Title = info["title"]; - package.ID = info["id"]; - package.Version = RantPackageVersion.Parse(info["version"]); - package.Description = info["description"]; - package.Authors = (string[])info["authors"]; - package.Tags = (string[])info["tags"]; - - var deps = info["dependencies"]; - if (deps != null && deps.IsArray) - for (int i = 0; i < deps.Count; i++) - { - var dep = deps[i]; - var depId = dep["id"].Value; - var depVersion = dep["version"].Value; - bool depAllowNewer = (bool)dep["allow-newer"].Value; - package.AddDependency(new RantPackageDependency(depId.ToString(), depVersion.ToString()) - { - AllowNewer = depAllowNewer - }); - } - - - package._resources.AddRange(doc["resources"].Values.Select(RantResource.DeserializeResource).Where(res => res != null)); - - return package; - } - } - - /// - /// Returns a string containing the title and version of the package. - /// - /// - public override string ToString() => $"{Title}, v{Version}"; - } + /// + /// Represents a collection of patterns and tables that can be exported to an archive file. + /// + public sealed class RantPackage + { + private const string MAGIC = "RPKG"; + internal const string EXTENSION = ".rantpkg"; + private const ushort PACKAGE_VERSION = 3; + private readonly HashSet _dependencies = new HashSet(); + private readonly HashSet _resources = new HashSet(); + private string _id = GetString("default-package-id"); + private string _title = GetString("untitled-package"); + private RantPackageVersion _version = new RantPackageVersion(1, 0, 0); + + /// + /// The display name of the package. + /// + public string Title + { + get { return _title; } + set + { + if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("Title cannot be empty."); + _title = value; + } + } + + /// + /// The ID of the package. + /// + public string ID + { + get { return _id; } + set + { + if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("ID cannot be empty."); + _id = value; + } + } + + /// + /// The description for the package. + /// + public string Description { get; set; } = ""; + + /// + /// The tags associated with the package. + /// + public string[] Tags { get; set; } = { }; + + /// + /// The package version. + /// + public RantPackageVersion Version + { + get { return _version; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _version = value; + } + } + + /// + /// The authors of the package. + /// + public string[] Authors { get; set; } = { }; + + /// + /// Adds the specified dependency to the package. + /// + /// The dependency to add. + public void AddDependency(RantPackageDependency dependency) + { + if (dependency == null) throw new ArgumentNullException(nameof(dependency)); + _dependencies.Add(dependency); + } + + /// + /// Adds the specified dependency to the package. + /// + /// The ID of the package. + /// The package version to target. + public void AddDependency(string id, string version) + { + if (id == null) throw new ArgumentNullException(nameof(id)); + if (version == null) throw new ArgumentNullException(nameof(version)); + _dependencies.Add(new RantPackageDependency(id, version)); + } + + /// + /// Determines whether the package depends on the specified package. + /// + /// The ID of the package to check for. + /// The version of the package to check for. + /// + public bool DependsOn(string id, string version) + { + if (id == null) throw new ArgumentNullException(nameof(id)); + if (version == null) throw new ArgumentNullException(nameof(version)); + return _dependencies.Contains(new RantPackageDependency(id, version)); + } + + /// + /// Determines whether the package has the specified dependency. + /// + /// The dependency to check for. + /// + public bool DependsOn(RantPackageDependency dependency) + { + if (dependency == null) throw new ArgumentNullException(nameof(dependency)); + return _dependencies.Contains(dependency); + } + + /// + /// Enumerates the package's dependencies. + /// + /// + public IEnumerable GetDependencies() => _dependencies.AsEnumerable(); + + /// + /// Removes the specified dependency from the package. + /// + /// The ID of the dependency to remove. + /// The version of the dependency to remove. + /// + public bool RemoveDependency(string id, string version) + { + if (id == null) throw new ArgumentNullException(nameof(id)); + if (version == null) throw new ArgumentNullException(nameof(version)); + return _dependencies.Remove(new RantPackageDependency(id, version)); + } + + /// + /// Removes the specified dependency from the package. + /// + /// The dependency to remove. + /// + public bool RemoveDependency(RantPackageDependency dependency) + { + if (dependency == null) throw new ArgumentNullException(nameof(dependency)); + return _dependencies.Remove(dependency); + } + + /// + /// Removes all dependencies from the package. + /// + public void ClearDependencies() => _dependencies.Clear(); + + /// + /// Enumerates all resources in the package. + /// + /// + public IEnumerable GetResources() => _resources.AsEnumerable(); + + /// + /// Enumerates all resources matching the specified resource type. + /// + /// The resource type to search for. + /// + public IEnumerable GetResources() where TResource : RantResource => _resources.OfType(); + + /// + /// Adds the specified resource to the package. + /// + /// The resource to add. + /// + public bool AddResource(RantResource resource) + { + if (resource == null) throw new ArgumentNullException(nameof(resource)); + return _resources.Add(resource); + } + + /// + /// Removes the specified resource from the package. + /// + /// The resource to remove. + /// + public bool RemoveResource(RantResource resource) + { + if (resource == null) throw new ArgumentNullException(nameof(resource)); + return _resources.Remove(resource); + } + + /// + /// Determines whether the package contains the specified resource. + /// + /// The resource to search for. + /// + public bool ContainsResource(RantResource resource) + { + if (resource == null) throw new ArgumentNullException(nameof(resource)); + return _resources.Contains(resource); + } + + /// + /// Saves the package to the specified file path. + /// + /// The path to the file to create. + /// Specifies whether to compress the package contents. + /// Specifies string table behavior for the package. + public void Save( + string path, + bool compress = true, + BsonStringTableMode stringTableMode = BsonStringTableMode.None) + { + if (string.IsNullOrEmpty(Path.GetExtension(path))) + path += EXTENSION; + + using (var writer = new EasyWriter(File.Create(path))) + { + var doc = new BsonDocument(stringTableMode) + { + Top = + { + ["info"] = new BsonItem + { + ["title"] = new BsonItem(_title), + ["id"] = new BsonItem(_id), + ["description"] = new BsonItem(Description), + ["tags"] = new BsonItem(Tags), + ["version"] = new BsonItem(Version.ToString()), + ["authors"] = new BsonItem(Authors), + ["dependencies"] = new BsonItem(_dependencies.Select(dep => + { + var depObj = new BsonItem + { + ["id"] = dep.ID, + ["version"] = dep.Version.ToString(), + ["allow-newer"] = dep.AllowNewer + }; + return depObj; + }).ToArray()) + }, + ["resources"] = new BsonItem(_resources.Select(RantResource.SerializeResource).ToList()) + } + }; + + var data = doc.ToByteArray(stringTableMode != BsonStringTableMode.None); + if (compress) + data = EasyCompressor.Compress(data); + writer.Write(Encoding.ASCII.GetBytes(MAGIC)); + writer.Write(PACKAGE_VERSION); + writer.Write(compress); + writer.Write(data.Length); + writer.Write(data); + } + } + + /// + /// Loads a package from the specified path and returns it as a RantPackage object. + /// + /// The path to the package file to load. + /// + public static RantPackage Load(string path) + { + if (string.IsNullOrEmpty(Path.GetExtension(path))) path += EXTENSION; + return Load(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)); + } + + /// + /// Loads a package from the specified stream and returns it as a RantPackage object. + /// + /// The stream to load the package data from. + /// + public static RantPackage Load(Stream source) + { + using (var reader = new EasyReader(source)) + { + string magic = Encoding.ASCII.GetString(reader.ReadBytes(4)); + if (magic != MAGIC) + throw new InvalidDataException(GetString("err-file-corrupt")); + var package = new RantPackage(); + ushort version = reader.ReadUInt16(); + if (version != PACKAGE_VERSION) + throw new InvalidDataException(GetString("err-invalid-package-version", version)); + bool compress = reader.ReadBoolean(); + int size = reader.ReadInt32(); + var data = reader.ReadBytes(size); + if (compress) data = EasyCompressor.Decompress(data); + var doc = BsonDocument.Read(data); + + var info = doc["info"]; + if (info == null) + throw new InvalidDataException(GetString("err-missing-package-meta")); + + package.Title = info["title"]; + package.ID = info["id"]; + package.Version = RantPackageVersion.Parse(info["version"]); + package.Description = info["description"]; + package.Authors = (string[])info["authors"]; + package.Tags = (string[])info["tags"]; + + var deps = info["dependencies"]; + if (deps != null && deps.IsArray) + { + for (int i = 0; i < deps.Count; i++) + { + var dep = deps[i]; + var depId = dep["id"].Value; + var depVersion = dep["version"].Value; + bool depAllowNewer = (bool)dep["allow-newer"].Value; + package.AddDependency(new RantPackageDependency(depId.ToString(), depVersion.ToString()) + { + AllowNewer = depAllowNewer + }); + } + } + + + package._resources.AddRange(doc["resources"].Values.Select(RantResource.DeserializeResource).Where(res => res != null)); + + return package; + } + } + + /// + /// Returns a string containing the title and version of the package. + /// + /// + public override string ToString() => $"{Title}, v{Version}"; + } } \ No newline at end of file diff --git a/Rant/Resources/RantPackageDependency.cs b/Rant/Resources/RantPackageDependency.cs index ed50630..1d269b2 100644 --- a/Rant/Resources/RantPackageDependency.cs +++ b/Rant/Resources/RantPackageDependency.cs @@ -29,115 +29,115 @@ namespace Rant.Resources { - /// - /// Represents a dependency for a Rant package. - /// - public sealed class RantPackageDependency - { - private string _id; - private RantPackageVersion _version; + /// + /// Represents a dependency for a Rant package. + /// + public sealed class RantPackageDependency + { + private string _id; + private RantPackageVersion _version; - /// - /// Initializes a new RantPackageDependency object. - /// - /// The ID of the package. - /// The targeted version of the package. - public RantPackageDependency(string id, string version) - { - if (id == null) throw new ArgumentNullException(nameof(id)); - if (version == null) throw new ArgumentNullException(nameof(version)); - ID = id; - Version = RantPackageVersion.Parse(version); - } + /// + /// Initializes a new RantPackageDependency object. + /// + /// The ID of the package. + /// The targeted version of the package. + public RantPackageDependency(string id, string version) + { + if (id == null) throw new ArgumentNullException(nameof(id)); + if (version == null) throw new ArgumentNullException(nameof(version)); + ID = id; + Version = RantPackageVersion.Parse(version); + } - /// - /// Initializes a new RantPackageDependency object. - /// - /// The ID of the package. - /// The targeted version of the package. - public RantPackageDependency(string id, RantPackageVersion version) - { - if (id == null) throw new ArgumentNullException(nameof(id)); - if (version == null) throw new ArgumentNullException(nameof(version)); - ID = id; - Version = version; - } + /// + /// Initializes a new RantPackageDependency object. + /// + /// The ID of the package. + /// The targeted version of the package. + public RantPackageDependency(string id, RantPackageVersion version) + { + if (id == null) throw new ArgumentNullException(nameof(id)); + if (version == null) throw new ArgumentNullException(nameof(version)); + ID = id; + Version = version; + } - /// - /// The ID of the package. - /// - public string ID - { - get { return _id; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _id = value.Trim(); - } - } + /// + /// The ID of the package. + /// + public string ID + { + get { return _id; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _id = value.Trim(); + } + } - /// - /// The targeted version of the package. - /// - public RantPackageVersion Version - { - get { return _version; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _version = value; - } - } + /// + /// The targeted version of the package. + /// + public RantPackageVersion Version + { + get { return _version; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _version = value; + } + } - /// - /// Specifies whether the dependency will accept a package newer than the one given. - /// - public bool AllowNewer { get; set; } + /// + /// Specifies whether the dependency will accept a package newer than the one given. + /// + public bool AllowNewer { get; set; } - /// - /// Checks if the specified version is compatible with the current dependency. - /// - /// The version to check. - /// - public bool CheckVersion(RantPackageVersion version) - { - if (version == null) throw new ArgumentNullException(nameof(version)); - return AllowNewer ? version >= Version : version == Version; - } + /// + /// Checks if the specified version is compatible with the current dependency. + /// + /// The version to check. + /// + public bool CheckVersion(RantPackageVersion version) + { + if (version == null) throw new ArgumentNullException(nameof(version)); + return AllowNewer ? version >= Version : version == Version; + } - /// - /// Creates a dependency for the specified package. - /// - /// The package to create the dependency for. - /// - public static RantPackageDependency Create(RantPackage package) - { - if (Util.IsNullOrWhiteSpace(package.ID)) - throw new ArgumentException("Package ID cannot be empty."); - return new RantPackageDependency(package.ID, package.Version); - } + /// + /// Creates a dependency for the specified package. + /// + /// The package to create the dependency for. + /// + public static RantPackageDependency Create(RantPackage package) + { + if (Util.IsNullOrWhiteSpace(package.ID)) + throw new ArgumentException("Package ID cannot be empty."); + return new RantPackageDependency(package.ID, package.Version); + } - /// - /// Returns a string representation of the current dependency. - /// - /// - public override string ToString() => $"{ID} {Version}"; + /// + /// Returns a string representation of the current dependency. + /// + /// + public override string ToString() => $"{ID} {Version}"; - /// - /// Gets the hash code for the instance. - /// - /// - public override int GetHashCode() => ID.GetHashCode(); + /// + /// Gets the hash code for the instance. + /// + /// + public override int GetHashCode() => ID.GetHashCode(); - /// - /// Determines whether the current RantPackageDependency is shares an ID with the specified object. - /// - /// The object to compare to. - /// - public override bool Equals(object obj) - { - var d = obj as RantPackageDependency; - return d != null && string.Equals(ID, d.ID, StringComparison.InvariantCulture); - } - } + /// + /// Determines whether the current RantPackageDependency is shares an ID with the specified object. + /// + /// The object to compare to. + /// + public override bool Equals(object obj) + { + var d = obj as RantPackageDependency; + return d != null && string.Equals(ID, d.ID, StringComparison.InvariantCulture); + } + } } \ No newline at end of file diff --git a/Rant/Resources/RantPackageVersion.cs b/Rant/Resources/RantPackageVersion.cs index 290430c..9f0e1e0 100644 --- a/Rant/Resources/RantPackageVersion.cs +++ b/Rant/Resources/RantPackageVersion.cs @@ -32,179 +32,179 @@ namespace Rant.Resources { - /// - /// Represents a version number for a Rant package. - /// - public sealed class RantPackageVersion - { - private int _major; - private int _minor; - private int _revision; - - /// - /// Initializes a new RantPackageVersion instance with the specified values. - /// - /// The major version. - /// The minor version. - /// The revision number. - public RantPackageVersion(int major, int minor, int revision) - { - if (major < 0) throw new ArgumentException("Major version must be non-negative.", nameof(major)); - if (minor < 0) throw new ArgumentException("Minor version must be non-negative.", nameof(minor)); - if (revision < 0) throw new ArgumentException("Revision number must be non-negative.", nameof(revision)); - _major = major; - _minor = minor; - _revision = revision; - } - - /// - /// Initializes a new RantPackageVersion instance with all values set to zero. - /// - public RantPackageVersion() - { - } - - /// - /// The major version. - /// - public int Major - { - get { return _major; } - set { _major = value < 0 ? 0 : value; } - } - - /// - /// The minor version. - /// - public int Minor - { - get { return _minor; } - set { _minor = value < 0 ? 0 : value; } - } - - /// - /// The revision number. - /// - public int Revision - { - get { return _revision; } - set { _revision = value < 0 ? 0 : value; } - } - - public static bool operator <(RantPackageVersion a, RantPackageVersion b) - { - if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); - if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - return a._major != b._major - ? a._major < b._major - : (a._minor == b._minor ? a._revision < b._revision : a._minor < b._minor); - } - - public static bool operator >(RantPackageVersion a, RantPackageVersion b) - { - if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); - if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - return a._major != b._major - ? a._major > b._major - : (a._minor == b._minor ? a._revision > b._revision : a._minor > b._minor); - } - - public static bool operator <=(RantPackageVersion a, RantPackageVersion b) - { - if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); - if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - return a._major != b._major - ? a._major <= b._major - : (a._minor == b._minor ? a._revision <= b._revision : a._minor <= b._minor); - } - - public static bool operator >=(RantPackageVersion a, RantPackageVersion b) - { - if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); - if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); - return a._major != b._major - ? a._major >= b._major - : (a._minor == b._minor ? a._revision >= b._revision : a._minor >= b._minor); - } - - public static bool operator ==(RantPackageVersion a, RantPackageVersion b) - { - if (ReferenceEquals(a, null)) return ReferenceEquals(b, null); - if (ReferenceEquals(b, null)) return false; - return a._major == b._major && a._minor == b._minor && a._revision == b._revision; - } - - public static bool operator !=(RantPackageVersion a, RantPackageVersion b) - { - if (ReferenceEquals(a, null)) return !ReferenceEquals(b, null); - if (ReferenceEquals(b, null)) return true; - return a._major != b._major || a._minor != b._minor || a._revision != b._revision; - } - - /// - /// Attempts to parse a version string and returns the equivalent RantPackageVersion. - /// - /// The version string to parse. - /// - public static RantPackageVersion Parse(string version) - { - const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; - if (Util.IsNullOrWhiteSpace(version)) throw new ArgumentException("Version cannot be empty.", nameof(version)); - var parts = version.Split('.'); - if (parts.Length > 3) throw new FormatException("Version cannot be composed of more than 3 parts."); - var v = new RantPackageVersion(); - if (!int.TryParse(parts[0], styles, CultureInfo.InvariantCulture, out v._major) || v._major < 0) - throw new FormatException("Major version must be a valid, non-negative integer."); - if (parts.Length < 2) return v; - if (!int.TryParse(parts[1], styles, CultureInfo.InvariantCulture, out v._minor) || v._minor < 0) - throw new FormatException("Minor version must be a valid, non-negative integer."); - if (parts.Length < 3) return v; - if (!int.TryParse(parts[2], styles, CultureInfo.InvariantCulture, out v._revision) || v._revision < 0) - throw new FormatException("Revision number must be a valid, non-negative integer."); - return v; - } - - /// - /// Attempts to parse a version string and outputs the equivalent RantPackageVersion. - /// - /// The version string to parse. - /// The parsing result, if successful. - /// - public static bool TryParse(string version, out RantPackageVersion result) - { - const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; - result = null; - if (Util.IsNullOrWhiteSpace(version)) return false; - var parts = version.Split('.'); - if (parts.Length > 3) return false; - var v = new RantPackageVersion(); - if (!int.TryParse(parts[0], styles, CultureInfo.InvariantCulture, out v._major) || v._major < 0) - return false; - if (parts.Length < 2) return true; - if (!int.TryParse(parts[1], styles, CultureInfo.InvariantCulture, out v._minor) || v._minor < 0) - return false; - if (parts.Length < 3) return true; - return int.TryParse(parts[2], styles, CultureInfo.InvariantCulture, out v._revision) && v._revision >= 0; - } - - /// - /// Returns a string representation of the current version. - /// - /// - public override string ToString() => $"{_major}.{_minor}.{_revision}"; - - /// - /// Determines whether the current version is equal to the specified object. - /// - /// The object to compare to. - /// - public override bool Equals(object obj) - { - var b = obj as RantPackageVersion; - if (ReferenceEquals(b, null)) return false; - return this == b; - } - - public override int GetHashCode() => unchecked((_major + 12345) * (_minor + 47) * _revision * 31); - } + /// + /// Represents a version number for a Rant package. + /// + public sealed class RantPackageVersion + { + private int _major; + private int _minor; + private int _revision; + + /// + /// Initializes a new RantPackageVersion instance with the specified values. + /// + /// The major version. + /// The minor version. + /// The revision number. + public RantPackageVersion(int major, int minor, int revision) + { + if (major < 0) throw new ArgumentException("Major version must be non-negative.", nameof(major)); + if (minor < 0) throw new ArgumentException("Minor version must be non-negative.", nameof(minor)); + if (revision < 0) throw new ArgumentException("Revision number must be non-negative.", nameof(revision)); + _major = major; + _minor = minor; + _revision = revision; + } + + /// + /// Initializes a new RantPackageVersion instance with all values set to zero. + /// + public RantPackageVersion() + { + } + + /// + /// The major version. + /// + public int Major + { + get { return _major; } + set { _major = value < 0 ? 0 : value; } + } + + /// + /// The minor version. + /// + public int Minor + { + get { return _minor; } + set { _minor = value < 0 ? 0 : value; } + } + + /// + /// The revision number. + /// + public int Revision + { + get { return _revision; } + set { _revision = value < 0 ? 0 : value; } + } + + public static bool operator <(RantPackageVersion a, RantPackageVersion b) + { + if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); + if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); + return a._major != b._major + ? a._major < b._major + : (a._minor == b._minor ? a._revision < b._revision : a._minor < b._minor); + } + + public static bool operator >(RantPackageVersion a, RantPackageVersion b) + { + if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); + if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); + return a._major != b._major + ? a._major > b._major + : (a._minor == b._minor ? a._revision > b._revision : a._minor > b._minor); + } + + public static bool operator <=(RantPackageVersion a, RantPackageVersion b) + { + if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); + if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); + return a._major != b._major + ? a._major <= b._major + : (a._minor == b._minor ? a._revision <= b._revision : a._minor <= b._minor); + } + + public static bool operator >=(RantPackageVersion a, RantPackageVersion b) + { + if (ReferenceEquals(a, null)) throw new ArgumentNullException(nameof(a)); + if (ReferenceEquals(b, null)) throw new ArgumentNullException(nameof(b)); + return a._major != b._major + ? a._major >= b._major + : (a._minor == b._minor ? a._revision >= b._revision : a._minor >= b._minor); + } + + public static bool operator ==(RantPackageVersion a, RantPackageVersion b) + { + if (ReferenceEquals(a, null)) return ReferenceEquals(b, null); + if (ReferenceEquals(b, null)) return false; + return a._major == b._major && a._minor == b._minor && a._revision == b._revision; + } + + public static bool operator !=(RantPackageVersion a, RantPackageVersion b) + { + if (ReferenceEquals(a, null)) return !ReferenceEquals(b, null); + if (ReferenceEquals(b, null)) return true; + return a._major != b._major || a._minor != b._minor || a._revision != b._revision; + } + + /// + /// Attempts to parse a version string and returns the equivalent RantPackageVersion. + /// + /// The version string to parse. + /// + public static RantPackageVersion Parse(string version) + { + const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; + if (Util.IsNullOrWhiteSpace(version)) throw new ArgumentException("Version cannot be empty.", nameof(version)); + var parts = version.Split('.'); + if (parts.Length > 3) throw new FormatException("Version cannot be composed of more than 3 parts."); + var v = new RantPackageVersion(); + if (!int.TryParse(parts[0], styles, CultureInfo.InvariantCulture, out v._major) || v._major < 0) + throw new FormatException("Major version must be a valid, non-negative integer."); + if (parts.Length < 2) return v; + if (!int.TryParse(parts[1], styles, CultureInfo.InvariantCulture, out v._minor) || v._minor < 0) + throw new FormatException("Minor version must be a valid, non-negative integer."); + if (parts.Length < 3) return v; + if (!int.TryParse(parts[2], styles, CultureInfo.InvariantCulture, out v._revision) || v._revision < 0) + throw new FormatException("Revision number must be a valid, non-negative integer."); + return v; + } + + /// + /// Attempts to parse a version string and outputs the equivalent RantPackageVersion. + /// + /// The version string to parse. + /// The parsing result, if successful. + /// + public static bool TryParse(string version, out RantPackageVersion result) + { + const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; + result = null; + if (Util.IsNullOrWhiteSpace(version)) return false; + var parts = version.Split('.'); + if (parts.Length > 3) return false; + var v = new RantPackageVersion(); + if (!int.TryParse(parts[0], styles, CultureInfo.InvariantCulture, out v._major) || v._major < 0) + return false; + if (parts.Length < 2) return true; + if (!int.TryParse(parts[1], styles, CultureInfo.InvariantCulture, out v._minor) || v._minor < 0) + return false; + if (parts.Length < 3) return true; + return int.TryParse(parts[2], styles, CultureInfo.InvariantCulture, out v._revision) && v._revision >= 0; + } + + /// + /// Returns a string representation of the current version. + /// + /// + public override string ToString() => $"{_major}.{_minor}.{_revision}"; + + /// + /// Determines whether the current version is equal to the specified object. + /// + /// The object to compare to. + /// + public override bool Equals(object obj) + { + var b = obj as RantPackageVersion; + if (ReferenceEquals(b, null)) return false; + return this == b; + } + + public override int GetHashCode() => unchecked((_major + 12345) * (_minor + 47) * _revision * 31); + } } \ No newline at end of file diff --git a/Rant/Resources/RantResource.cs b/Rant/Resources/RantResource.cs index 71971b7..fff320c 100644 --- a/Rant/Resources/RantResource.cs +++ b/Rant/Resources/RantResource.cs @@ -32,55 +32,55 @@ namespace Rant.Resources { - /// - /// The base class for Rant resources that can be included in a package. - /// - public abstract class RantResource - { - private static readonly Dictionary _resourceTypeRegistry = new Dictionary(); - private static readonly Dictionary _resourceIdRegistry = new Dictionary(); + /// + /// The base class for Rant resources that can be included in a package. + /// + public abstract class RantResource + { + private static readonly Dictionary _resourceTypeRegistry = new Dictionary(); + private static readonly Dictionary _resourceIdRegistry = new Dictionary(); - static RantResource() - { - RegisterType("dic2"); - RegisterType("prog"); - } + static RantResource() + { + RegisterType("dic2"); + RegisterType("prog"); + } - internal static void RegisterType(string id) where T : RantResource - { - if (id == null) throw new ArgumentNullException(nameof(id)); - _resourceTypeRegistry[id] = typeof(T); - _resourceIdRegistry[typeof(T)] = id; - } + internal static void RegisterType(string id) where T : RantResource + { + if (id == null) throw new ArgumentNullException(nameof(id)); + _resourceTypeRegistry[id] = typeof(T); + _resourceIdRegistry[typeof(T)] = id; + } - internal static RantResource DeserializeResource(BsonItem dataHeader) - { - Type type; - BsonItem dataItem; - if (!_resourceTypeRegistry.TryGetValue(dataHeader["type"], out type) || (dataItem = dataHeader["data"]) == null) - return null; + internal static RantResource DeserializeResource(BsonItem dataHeader) + { + Type type; + BsonItem dataItem; + if (!_resourceTypeRegistry.TryGetValue(dataHeader["type"], out type) || (dataItem = dataHeader["data"]) == null) + return null; - var resource = Activator.CreateInstance(type, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new object[0], null) as RantResource; + var resource = Activator.CreateInstance(type, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new object[0], null) as RantResource; - resource?.DeserializeData(dataItem); + resource?.DeserializeData(dataItem); - return resource; - } + return resource; + } - internal static BsonItem SerializeResource(RantResource resource) - { - string rstr; - if (!_resourceIdRegistry.TryGetValue(resource.GetType(), out rstr)) return null; - var res = new BsonItem - { - ["type"] = rstr, - ["data"] = resource.SerializeData() - }; - return res; - } + internal static BsonItem SerializeResource(RantResource resource) + { + string rstr; + if (!_resourceIdRegistry.TryGetValue(resource.GetType(), out rstr)) return null; + var res = new BsonItem + { + ["type"] = rstr, + ["data"] = resource.SerializeData() + }; + return res; + } - internal abstract void DeserializeData(BsonItem data); - internal abstract BsonItem SerializeData(); - internal abstract void Load(RantEngine engine); - } + internal abstract void DeserializeData(BsonItem data); + internal abstract BsonItem SerializeData(); + internal abstract void Load(RantEngine engine); + } } \ No newline at end of file diff --git a/Rant/Tuple.cs b/Rant/Tuple.cs index 716b37e..42fe6e3 100644 --- a/Rant/Tuple.cs +++ b/Rant/Tuple.cs @@ -27,668 +27,668 @@ namespace Rant { - /// - /// Makes tuples for your pleasure. - /// - public static class _ - { - /// - /// Makes Item1 1-tuple. - /// - /// First type. - /// First value. - /// - public static _ Create(A Item1) => new _(Item1); - - /// - /// Makes Item1 2-tuple. - /// - /// First type. - /// Second type. - /// First value. - /// Second value. - /// - public static _ Create(A Item1, B Item2) => new _(Item1, Item2); - - /// - /// Makes Item1 3-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// First value. - /// Second value. - /// Third value. - /// - public static _ Create(A Item1, B Item2, C Item3) => new _(Item1, Item2, Item3); - - /// - /// Makes Item1 4-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// First value. - /// Second value. - /// Third value. - /// Fourth value. - /// - public static _ Create(A Item1, B Item2, C Item3, D Item4) - => new _(Item1, Item2, Item3, Item4); - - /// - /// Makes Item1 5-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - /// First value. - /// Second value. - /// Third value. - /// Fourth value. - /// Fifth value. - /// - public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5) - => new _(Item1, Item2, Item3, Item4, Item5); - - /// - /// Makes Item1 6-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - /// Sixth type. - /// First value. - /// Second value. - /// Third value. - /// Fourth value. - /// Fifth value. - /// Sixth value. - /// - public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6) - => new _(Item1, Item2, Item3, Item4, Item5, Item6); - - /// - /// Makes Item1 7-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - /// Sixth type. - /// Seventh type. - /// First value. - /// Second value. - /// Third value. - /// Fourth value. - /// Fifth value. - /// Sixth value. - /// Seventh value. - /// - public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6, - G Item7) => new _(Item1, Item2, Item3, Item4, Item5, Item6, Item7); - - /// - /// Makes an 8-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - /// Sixth type. - /// Seventh type. - /// Eighth type. - /// First value. - /// Second value. - /// Third value. - /// Fourth value. - /// Fifth value. - /// Sixth value. - /// Seventh value. - /// Eighth value. - /// - public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5, - F Item6, G Item7, H Item8) => new _(Item1, Item2, Item3, Item4, Item5, Item6, Item7, Item8); - } - - /// - /// 1-tuple. - /// - /// First type. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - internal _(A Item1) - { - this.Item1 = Item1; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() => $"{{Item1: {Item1}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => Item1.GetHashCode(); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1); - } - } - - /// - /// 2-tuple. - /// - /// First type. - /// Second type. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - /// - /// The second item. - /// - public readonly B Item2; - - internal _(A Item1, B Item2) - { - this.Item1 = Item1; - this.Item2 = Item2; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() => $"{{Item1: {Item1}, Item2: {Item2}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => HashOf(Item1, Item2); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1) && Equals(t.Item2, Item2); - } - } - - /// - /// 3-tuple. - /// - /// First type. - /// Second type. - /// Third type. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - /// - /// The second item. - /// - public readonly B Item2; - - /// - /// The third item. - /// - public readonly C Item3; - - internal _(A Item1, B Item2, C Item3) - { - this.Item1 = Item1; - this.Item2 = Item2; - this.Item3 = Item3; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => HashOf(Item1, Item2, Item3); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3); - } - } - - /// - /// 4-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - /// - /// The second item. - /// - public readonly B Item2; - - /// - /// The third item. - /// - public readonly C Item3; - - /// - /// The fourth item. - /// - public readonly D Item4; - - internal _(A Item1, B Item2, C Item3, D Item4) - { - this.Item1 = Item1; - this.Item2 = Item2; - this.Item3 = Item3; - this.Item4 = Item4; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4); - } - } - - /// - /// 5-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - /// - /// The second item. - /// - public readonly B Item2; - - /// - /// The third item. - /// - public readonly C Item3; - - /// - /// The fourth item. - /// - public readonly D Item4; - - /// - /// The fifth item. - /// - public readonly E Item5; - - internal _(A Item1, B Item2, C Item3, D Item4, E Item5) - { - this.Item1 = Item1; - this.Item2 = Item2; - this.Item3 = Item3; - this.Item4 = Item4; - this.Item5 = Item5; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() - => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && - Equals(t.Item5, Item5); - } - } - - /// - /// 6-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - /// Sixth type. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - /// - /// The second item. - /// - public readonly B Item2; - - /// - /// The third item. - /// - public readonly C Item3; - - /// - /// The fourth item. - /// - public readonly D Item4; - - /// - /// The fifth item. - /// - public readonly E Item5; - - /// - /// The sixth item. - /// - public readonly F Item6; - - internal _(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6) - { - this.Item1 = Item1; - this.Item2 = Item2; - this.Item3 = Item3; - this.Item4 = Item4; - this.Item5 = Item5; - this.Item6 = Item6; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() - => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}, Item6: {Item6}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5, Item6); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && - Equals(t.Item5, Item5) && Equals(t.Item6, Item6); - } - } - - /// - /// 7-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - /// Sixth type. - /// Seventh type. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - /// - /// The second item. - /// - public readonly B Item2; - - /// - /// The third item. - /// - public readonly C Item3; - - /// - /// The fourth item. - /// - public readonly D Item4; - - /// - /// The fifth item. - /// - public readonly E Item5; - - /// - /// The sixth item. - /// - public readonly F Item6; - - /// - /// The seventh item. - /// - public readonly G Item7; - - internal _(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6, G Item7) - { - this.Item1 = Item1; - this.Item2 = Item2; - this.Item3 = Item3; - this.Item4 = Item4; - this.Item5 = Item5; - this.Item6 = Item6; - this.Item7 = Item7; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() - => - $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}, Item6: {Item6}, Item7: {Item7}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5, Item6, Item7); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && - Equals(t.Item5, Item5) && Equals(t.Item6, Item6) && Equals(t.Item7, Item7); - } - } - - /// - /// 8-tuple. - /// - /// First type. - /// Second type. - /// Third type. - /// Fourth type. - /// Fifth type. - /// Sixth type. - /// Seventh type. - /// Eighth tuple. - public sealed class _ - { - /// - /// The first item. - /// - public readonly A Item1; - - /// - /// The second item. - /// - public readonly B Item2; - - /// - /// The third item. - /// - public readonly C Item3; - - /// - /// The fourth item. - /// - public readonly D Item4; - - /// - /// The fifth item. - /// - public readonly E Item5; - - /// - /// The sixth item. - /// - public readonly F Item6; - - /// - /// The seventh item. - /// - public readonly G Item7; - - /// - /// The eighth item. - /// - public readonly H Item8; - - internal _(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6, G Item7, H Item8) - { - this.Item1 = Item1; - this.Item2 = Item2; - this.Item3 = Item3; - this.Item4 = Item4; - this.Item5 = Item5; - this.Item6 = Item6; - this.Item7 = Item7; - this.Item8 = Item8; - } - - /// - /// Returns a string representation of the tuple's contents. - /// - /// - public override string ToString() - => - $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}, Item6: {Item6}, Item7: {Item7}, Item8: {Item8}}}"; - - /// - /// Returns a hash of the tuple's contents. - /// - /// - public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5, Item6, Item7, Item8); - - /// - /// Determines whether the current instance is equal to the specified object. - /// - /// The object to test. - /// - public override bool Equals(object obj) - { - var t = obj as _; - if (t == null) return false; - return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && - Equals(t.Item5, Item5) && Equals(t.Item6, Item6) && Equals(t.Item7, Item7) && Equals(t.Item8, Item8); - } - } + /// + /// Makes tuples for your pleasure. + /// + public static class _ + { + /// + /// Makes Item1 1-tuple. + /// + /// First type. + /// First value. + /// + public static _ Create(A Item1) => new _(Item1); + + /// + /// Makes Item1 2-tuple. + /// + /// First type. + /// Second type. + /// First value. + /// Second value. + /// + public static _ Create(A Item1, B Item2) => new _(Item1, Item2); + + /// + /// Makes Item1 3-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// First value. + /// Second value. + /// Third value. + /// + public static _ Create(A Item1, B Item2, C Item3) => new _(Item1, Item2, Item3); + + /// + /// Makes Item1 4-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// First value. + /// Second value. + /// Third value. + /// Fourth value. + /// + public static _ Create(A Item1, B Item2, C Item3, D Item4) + => new _(Item1, Item2, Item3, Item4); + + /// + /// Makes Item1 5-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + /// First value. + /// Second value. + /// Third value. + /// Fourth value. + /// Fifth value. + /// + public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5) + => new _(Item1, Item2, Item3, Item4, Item5); + + /// + /// Makes Item1 6-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + /// Sixth type. + /// First value. + /// Second value. + /// Third value. + /// Fourth value. + /// Fifth value. + /// Sixth value. + /// + public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6) + => new _(Item1, Item2, Item3, Item4, Item5, Item6); + + /// + /// Makes Item1 7-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + /// Sixth type. + /// Seventh type. + /// First value. + /// Second value. + /// Third value. + /// Fourth value. + /// Fifth value. + /// Sixth value. + /// Seventh value. + /// + public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6, + G Item7) => new _(Item1, Item2, Item3, Item4, Item5, Item6, Item7); + + /// + /// Makes an 8-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + /// Sixth type. + /// Seventh type. + /// Eighth type. + /// First value. + /// Second value. + /// Third value. + /// Fourth value. + /// Fifth value. + /// Sixth value. + /// Seventh value. + /// Eighth value. + /// + public static _ Create(A Item1, B Item2, C Item3, D Item4, E Item5, + F Item6, G Item7, H Item8) => new _(Item1, Item2, Item3, Item4, Item5, Item6, Item7, Item8); + } + + /// + /// 1-tuple. + /// + /// First type. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + internal _(A Item1) + { + this.Item1 = Item1; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() => $"{{Item1: {Item1}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => Item1.GetHashCode(); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1); + } + } + + /// + /// 2-tuple. + /// + /// First type. + /// Second type. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + /// + /// The second item. + /// + public readonly B Item2; + + internal _(A Item1, B Item2) + { + this.Item1 = Item1; + this.Item2 = Item2; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() => $"{{Item1: {Item1}, Item2: {Item2}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => HashOf(Item1, Item2); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1) && Equals(t.Item2, Item2); + } + } + + /// + /// 3-tuple. + /// + /// First type. + /// Second type. + /// Third type. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + /// + /// The second item. + /// + public readonly B Item2; + + /// + /// The third item. + /// + public readonly C Item3; + + internal _(A Item1, B Item2, C Item3) + { + this.Item1 = Item1; + this.Item2 = Item2; + this.Item3 = Item3; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => HashOf(Item1, Item2, Item3); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3); + } + } + + /// + /// 4-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + /// + /// The second item. + /// + public readonly B Item2; + + /// + /// The third item. + /// + public readonly C Item3; + + /// + /// The fourth item. + /// + public readonly D Item4; + + internal _(A Item1, B Item2, C Item3, D Item4) + { + this.Item1 = Item1; + this.Item2 = Item2; + this.Item3 = Item3; + this.Item4 = Item4; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4); + } + } + + /// + /// 5-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + /// + /// The second item. + /// + public readonly B Item2; + + /// + /// The third item. + /// + public readonly C Item3; + + /// + /// The fourth item. + /// + public readonly D Item4; + + /// + /// The fifth item. + /// + public readonly E Item5; + + internal _(A Item1, B Item2, C Item3, D Item4, E Item5) + { + this.Item1 = Item1; + this.Item2 = Item2; + this.Item3 = Item3; + this.Item4 = Item4; + this.Item5 = Item5; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() + => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && + Equals(t.Item5, Item5); + } + } + + /// + /// 6-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + /// Sixth type. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + /// + /// The second item. + /// + public readonly B Item2; + + /// + /// The third item. + /// + public readonly C Item3; + + /// + /// The fourth item. + /// + public readonly D Item4; + + /// + /// The fifth item. + /// + public readonly E Item5; + + /// + /// The sixth item. + /// + public readonly F Item6; + + internal _(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6) + { + this.Item1 = Item1; + this.Item2 = Item2; + this.Item3 = Item3; + this.Item4 = Item4; + this.Item5 = Item5; + this.Item6 = Item6; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() + => $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}, Item6: {Item6}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5, Item6); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && + Equals(t.Item5, Item5) && Equals(t.Item6, Item6); + } + } + + /// + /// 7-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + /// Sixth type. + /// Seventh type. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + /// + /// The second item. + /// + public readonly B Item2; + + /// + /// The third item. + /// + public readonly C Item3; + + /// + /// The fourth item. + /// + public readonly D Item4; + + /// + /// The fifth item. + /// + public readonly E Item5; + + /// + /// The sixth item. + /// + public readonly F Item6; + + /// + /// The seventh item. + /// + public readonly G Item7; + + internal _(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6, G Item7) + { + this.Item1 = Item1; + this.Item2 = Item2; + this.Item3 = Item3; + this.Item4 = Item4; + this.Item5 = Item5; + this.Item6 = Item6; + this.Item7 = Item7; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() + => + $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}, Item6: {Item6}, Item7: {Item7}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5, Item6, Item7); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && + Equals(t.Item5, Item5) && Equals(t.Item6, Item6) && Equals(t.Item7, Item7); + } + } + + /// + /// 8-tuple. + /// + /// First type. + /// Second type. + /// Third type. + /// Fourth type. + /// Fifth type. + /// Sixth type. + /// Seventh type. + /// Eighth tuple. + public sealed class _ + { + /// + /// The first item. + /// + public readonly A Item1; + + /// + /// The second item. + /// + public readonly B Item2; + + /// + /// The third item. + /// + public readonly C Item3; + + /// + /// The fourth item. + /// + public readonly D Item4; + + /// + /// The fifth item. + /// + public readonly E Item5; + + /// + /// The sixth item. + /// + public readonly F Item6; + + /// + /// The seventh item. + /// + public readonly G Item7; + + /// + /// The eighth item. + /// + public readonly H Item8; + + internal _(A Item1, B Item2, C Item3, D Item4, E Item5, F Item6, G Item7, H Item8) + { + this.Item1 = Item1; + this.Item2 = Item2; + this.Item3 = Item3; + this.Item4 = Item4; + this.Item5 = Item5; + this.Item6 = Item6; + this.Item7 = Item7; + this.Item8 = Item8; + } + + /// + /// Returns a string representation of the tuple's contents. + /// + /// + public override string ToString() + => + $"{{Item1: {Item1}, Item2: {Item2}, Item3: {Item3}, Item4: {Item4}, Item5: {Item5}, Item6: {Item6}, Item7: {Item7}, Item8: {Item8}}}"; + + /// + /// Returns a hash of the tuple's contents. + /// + /// + public override int GetHashCode() => HashOf(Item1, Item2, Item3, Item4, Item5, Item6, Item7, Item8); + + /// + /// Determines whether the current instance is equal to the specified object. + /// + /// The object to test. + /// + public override bool Equals(object obj) + { + var t = obj as _; + if (t == null) return false; + return Equals(t.Item1, Item1) && Equals(t.Item2, Item2) && Equals(t.Item3, Item3) && Equals(t.Item4, Item4) && + Equals(t.Item5, Item5) && Equals(t.Item6, Item6) && Equals(t.Item7, Item7) && Equals(t.Item8, Item8); + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs index e52bd5f..9cde7d0 100644 --- a/Rant/Vocabulary/ClassTree.cs +++ b/Rant/Vocabulary/ClassTree.cs @@ -1,130 +1,148 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Rant.Vocabulary { - public class ClassTree - { - private const int MAX_DEPTH = 4; - - public ClassTreeNode RootNode; - - public ClassTree(IEnumerable entries) - { - RootNode = new ClassTreeNode() - { - Name = "root", - Classes = new string[] { }, - Entries = entries.Where(e => !e.HasClasses).ToList() - }; - - var rootClasses = OrderClasses(new string[] { }, entries); - foreach (var className in rootClasses) - { - var node = new ClassTreeNode() { Name = className, Classes = new string[] { className } }; - - PopulateNode(node, entries.Where(e => e.ContainsClass(className))); - CountNode(node); - - RootNode.ChildNodes[className] = node; - } - } - - public IEnumerable Query(IEnumerable classes) - { - return QueryNode(RootNode, new HashSet(classes)); - } - - private IEnumerable QueryNode(ClassTreeNode node, HashSet classes) - { - if (node.DepthLimit) - { - return node.Entries.Where(e => classes.All(c => e.ContainsClass(c))); - } - - // find the largest class - var largestClass = node.ChildNodes - .Where(kv => classes.Contains(kv.Key)) - .OrderByDescending(kv => kv.Value.Count) - .Select(kv => kv.Value) - .FirstOrDefault(); - - if (largestClass == default(ClassTreeNode)) - { - if (classes.Any()) - return new List(); - return node.Entries; - } - - return QueryNode(largestClass, new HashSet(classes.Where(c => c != largestClass.Name))); - } - - private void PopulateNode(ClassTreeNode node, IEnumerable entries) - { - node.Entries = entries.Where(e => e.ClassCount >= node.Classes.Length).ToList(); - var otherEntries = entries.Where(e => e.ClassCount > node.Classes.Length); - - if (node.Depth == MAX_DEPTH) - { - node.DepthLimit = true; - return; - } - - var classes = OrderClasses(node.Classes, otherEntries); - foreach (var className in classes) - { - var childNode = new ClassTreeNode() { Name = className, Classes = node.Classes.Concat(new string[] { className }).ToArray() }; - childNode.Depth = node.Depth + 1; - - PopulateNode(childNode, otherEntries.Where(e => e.ContainsClass(className))); - CountNode(node); - - node.ChildNodes[className] = childNode; - } - } - - private int CountNode(ClassTreeNode node) - { - var count = node.Entries.Count; - - foreach (var child in node.ChildNodes.Values) - { - count += CountNode(child); - } - - node.Count = count; - return count; - } - - private IEnumerable OrderClasses(string[] ignoreClasses, IEnumerable entries) - { - var classCounts = new Dictionary(); - - foreach (var entry in entries) - { - foreach (var c in entry.GetClasses()) - { - if (ignoreClasses.Contains(c)) continue; - - classCounts[c] = (classCounts.ContainsKey(c) ? classCounts[c] + 1 : 1); - } - } - - return classCounts.OrderByDescending(kv => kv.Value).Select(kv => kv.Key); - } - } - - public class ClassTreeNode - { - public string Name; - public string[] Classes; - public int Count = 0; - public Dictionary ChildNodes = new Dictionary(); - public List Entries = new List(); - public int Depth = 1; - public bool DepthLimit = false; - } -} + public class ClassTree + { + private const int MAX_DEPTH = 4; + + public ClassTreeNode RootNode; + + public ClassTree(IEnumerable entries) + { + RootNode = new ClassTreeNode + { + Name = "root", + Classes = new string[] { }, + Entries = entries.Where(e => !e.HasClasses).ToList() + }; + + var rootClasses = OrderClasses(new string[] { }, entries); + foreach (string className in rootClasses) + { + var node = new ClassTreeNode { Name = className, Classes = new[] { className } }; + + PopulateNode(node, entries.Where(e => e.ContainsClass(className))); + CountNode(node); + + RootNode.ChildNodes[className] = node; + } + } + + public IEnumerable Query(IEnumerable classes) + { + return QueryNode(RootNode, new HashSet(classes)); + } + + private IEnumerable QueryNode(ClassTreeNode node, HashSet classes) + { + if (node.DepthLimit) + return node.Entries.Where(e => classes.All(c => e.ContainsClass(c))); + + // find the largest class + var largestClass = node.ChildNodes + .Where(kv => classes.Contains(kv.Key)) + .OrderByDescending(kv => kv.Value.Count) + .Select(kv => kv.Value) + .FirstOrDefault(); + + if (largestClass == default(ClassTreeNode)) + { + if (classes.Any()) + return new List(); + return node.Entries; + } + + return QueryNode(largestClass, new HashSet(classes.Where(c => c != largestClass.Name))); + } + + private void PopulateNode(ClassTreeNode node, IEnumerable entries) + { + node.Entries = entries.Where(e => e.ClassCount >= node.Classes.Length).ToList(); + var otherEntries = entries.Where(e => e.ClassCount > node.Classes.Length); + + if (node.Depth == MAX_DEPTH) + { + node.DepthLimit = true; + return; + } + + var classes = OrderClasses(node.Classes, otherEntries); + foreach (string className in classes) + { + var childNode = new ClassTreeNode { Name = className, Classes = node.Classes.Concat(new[] { className }).ToArray() }; + childNode.Depth = node.Depth + 1; + + PopulateNode(childNode, otherEntries.Where(e => e.ContainsClass(className))); + CountNode(node); + + node.ChildNodes[className] = childNode; + } + } + + private int CountNode(ClassTreeNode node) + { + int count = node.Entries.Count; + + foreach (var child in node.ChildNodes.Values) + count += CountNode(child); + + node.Count = count; + return count; + } + + private IEnumerable OrderClasses(string[] ignoreClasses, IEnumerable entries) + { + var classCounts = new Dictionary(); + + foreach (var entry in entries) + { + foreach (string c in entry.GetClasses()) + { + if (ignoreClasses.Contains(c)) continue; + + classCounts[c] = classCounts.ContainsKey(c) ? classCounts[c] + 1 : 1; + } + } + + return classCounts.OrderByDescending(kv => kv.Value).Select(kv => kv.Key); + } + } + + public class ClassTreeNode + { + public Dictionary ChildNodes = new Dictionary(); + public string[] Classes; + public int Count = 0; + public int Depth = 1; + public bool DepthLimit = false; + public List Entries = new List(); + public string Name; + } +} \ No newline at end of file diff --git a/Rant/Vocabulary/Legacy/DicLexer.cs b/Rant/Vocabulary/Legacy/DicLexer.cs index 4d49f51..6939729 100644 --- a/Rant/Vocabulary/Legacy/DicLexer.cs +++ b/Rant/Vocabulary/Legacy/DicLexer.cs @@ -1,105 +1,125 @@ -using System.Collections.Generic; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Text; - -using Rant.Core.Compiler; namespace Rant.Vocabulary { - internal static class DicLexer - { - public static IEnumerable Tokenize(string source, string data) - { - var reader = new StringReader(data); - string currentLine; - char firstChar; - int lineNumber = 1; - - while(reader.Peek() >= 0) - { - lineNumber++; - - currentLine = reader.ReadLine().Trim(); - if(string.IsNullOrWhiteSpace(currentLine)) continue; - firstChar = currentLine[0]; - - switch(firstChar) - { - case '#': - yield return new DicToken(DicTokenType.Directive, lineNumber, currentLine.Substring(1).Trim()); - break; - case '@': - break; - case '>': - { - currentLine = currentLine.Substring(1); - - bool diffmark = false; - if(currentLine[0] == '>') - { - diffmark = true; - currentLine = currentLine.Substring(1); - } - - yield return new DicToken(diffmark ? DicTokenType.DiffEntry : DicTokenType.Entry, lineNumber, currentLine.Trim()); - break; - } - case '|': - yield return new DicToken(DicTokenType.Property, lineNumber, currentLine.Substring(1).Trim()); - break; - default: - throw new InvalidDataException($"{source}: (Line {lineNumber}, Col 1) Unexpected token: '{firstChar}'."); - } - } - - yield return new DicToken(DicTokenType.EOF, lineNumber, null); - } - } - - internal enum DicTokenType - { - Directive, - Entry, - DiffEntry, - Property, - Ignore, - EOF - } - - internal struct DicToken - { - public static readonly DicToken None = new DicToken(DicTokenType.Ignore, 1, null); - public DicTokenType Type; - public string Value; - public int Line; - - public DicToken(DicTokenType type, int line, string value) - { - Type = type; - Value = value; - Line = line; - } - - public DicToken(DicTokenType type, int line, char value) - { - Type = type; - Value = value.ToString(CultureInfo.InvariantCulture); - Line = line; - } - - public static implicit operator string(DicToken token) - { - return token.Value; - } - - public static implicit operator DicToken(string data) - { - return new DicToken(DicTokenType.Ignore, 1, data); - } - - public int Length => Value?.Length ?? 0; - } + internal static class DicLexer + { + public static IEnumerable Tokenize(string source, string data) + { + var reader = new StringReader(data); + string currentLine; + char firstChar; + int lineNumber = 1; + + while (reader.Peek() >= 0) + { + lineNumber++; + + currentLine = reader.ReadLine().Trim(); + if (string.IsNullOrWhiteSpace(currentLine)) continue; + firstChar = currentLine[0]; + + switch (firstChar) + { + case '#': + yield return new DicToken(DicTokenType.Directive, lineNumber, currentLine.Substring(1).Trim()); + break; + case '@': + break; + case '>': + { + currentLine = currentLine.Substring(1); + + bool diffmark = false; + if (currentLine[0] == '>') + { + diffmark = true; + currentLine = currentLine.Substring(1); + } + + yield return new DicToken(diffmark ? DicTokenType.DiffEntry : DicTokenType.Entry, lineNumber, currentLine.Trim()); + break; + } + case '|': + yield return new DicToken(DicTokenType.Property, lineNumber, currentLine.Substring(1).Trim()); + break; + default: + throw new InvalidDataException($"{source}: (Line {lineNumber}, Col 1) Unexpected token: '{firstChar}'."); + } + } + + yield return new DicToken(DicTokenType.EOF, lineNumber, null); + } + } + + internal enum DicTokenType + { + Directive, + Entry, + DiffEntry, + Property, + Ignore, + EOF + } + + internal struct DicToken + { + public static readonly DicToken None = new DicToken(DicTokenType.Ignore, 1, null); + public DicTokenType Type; + public string Value; + public int Line; + + public DicToken(DicTokenType type, int line, string value) + { + Type = type; + Value = value; + Line = line; + } + + public DicToken(DicTokenType type, int line, char value) + { + Type = type; + Value = value.ToString(CultureInfo.InvariantCulture); + Line = line; + } + + public static implicit operator string(DicToken token) + { + return token.Value; + } + + public static implicit operator DicToken(string data) + { + return new DicToken(DicTokenType.Ignore, 1, data); + } + + public int Length => Value?.Length ?? 0; + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs b/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs index d4a787b..666b8fa 100644 --- a/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs +++ b/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs @@ -1,289 +1,307 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; using Rant.Core.Utilities; using Rant.Vocabulary.Utilities; namespace Rant.Vocabulary { - public sealed partial class RantDictionaryTable - { - /// - /// Loads a RantDictionary from the file at the specified path. - /// - /// The path to the file to load. - /// - public static RantDictionaryTable FromLegacyFile(string path) - { - var name = ""; - string[] subtypes = { "default" }; - bool header = true; - - var scopedClassSet = new HashSet(); - RantDictionaryEntry entry = null; - var entries = new List(); - var entryStringes = new List(); - var types = new Dictionary(); - var hiddenClasses = new HashSet { "nsfw" }; + public sealed partial class RantDictionaryTable + { + /// + /// Loads a RantDictionary from the file at the specified path. + /// + /// The path to the file to load. + /// + public static RantDictionaryTable FromLegacyFile(string path) + { + string name = ""; + string[] subtypes = { "default" }; + bool header = true; - foreach(var token in DicLexer.Tokenize(path, File.ReadAllText(path))) - { - switch(token.Type) - { - case DicTokenType.Directive: - { - var parts = VocabUtils.GetArgs(token.Value).ToArray(); - if(!parts.Any()) continue; - var dirName = parts.First().ToLower(); - var args = parts.Skip(1).ToArray(); + var scopedClassSet = new HashSet(); + RantDictionaryEntry entry = null; + var entries = new List(); + var entryStringes = new List(); + var types = new Dictionary(); + var hiddenClasses = new HashSet { "nsfw" }; - switch(dirName) - { - case "name": - if(!header) LoadError(path, token, "The #name directive may only be used in the file header."); - if(args.Length != 1) LoadError(path, token, "#name directive expected one word:\r\n\r\n" + token.Value); - if(!Util.ValidateName(args[0])) LoadError(path, token, $"Invalid #name value: '{args[1]}'"); - name = args[0].ToLower(); - break; - case "subs": - if(!header) LoadError(path, token, "The #subs directive may only be used in the file header."); - subtypes = args.Select(s => s.Trim().ToLower()).ToArray(); - break; - case "version": // Kept here for backwards-compatability - if(!header) LoadError(path, token, "The #version directive may only be used in the file header."); - break; - case "hidden": - if(!header) LoadError(path, token, "The #hidden directive may only be used in the file header."); - if(Util.ValidateName(args[0])) hiddenClasses.Add(args[0]); - break; - // Deprecated, remove in Rant 3 - case "nsfw": - scopedClassSet.Add("nsfw"); - break; - // Deprecated, remove in Rant 3 - case "sfw": - scopedClassSet.Remove("nsfw"); - break; - case "class": - { - if(args.Length < 2) LoadError(path, token, "The #class directive expects an operation and at least one value."); - switch(args[0].ToLower()) - { - case "add": - foreach(var cl in args.Skip(1)) - scopedClassSet.Add(cl.ToLower()); - break; - case "remove": - foreach(var cl in args.Skip(1)) - scopedClassSet.Remove(cl.ToLower()); - break; - } - } - break; - case "type": - { - if(!header) LoadError(path, token, "The #type directive may only be used in the file header."); - if(args.Length != 3) LoadError(path, token, "#type directive requires 3 arguments."); - types.Add(args[0], new EntryTypeDef(args[0], args[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), - Util.IsNullOrWhiteSpace(args[2]) ? null : new EntryTypeDefFilter(args[2]))); - } - break; - } - } - break; - case DicTokenType.Entry: - { - if(Util.IsNullOrWhiteSpace(name)) - LoadError(path, token, "Missing table name before entry list."); - if(Util.IsNullOrWhiteSpace(token.Value)) - LoadError(path, token, "Encountered empty entry."); - header = false; - entry = new RantDictionaryEntry(token.Value.Split('/').Select(s => s.Trim()).ToArray(), scopedClassSet); - entries.Add(entry); - entryStringes.Add(token); - } - break; - case DicTokenType.DiffEntry: - { - if(Util.IsNullOrWhiteSpace(name)) - LoadError(path, token, "Missing table name before entry list."); - if(Util.IsNullOrWhiteSpace(token.Value)) - LoadError(path, token, "Encountered empty entry."); - header = false; - string first = null; - entry = new RantDictionaryEntry(token.Value.Split('/') - .Select((s, i) => - { - if(i > 0) return Diff.Mark(first, s); - return first = s.Trim(); - }).ToArray(), scopedClassSet); - entries.Add(entry); - entryStringes.Add(token); - } - break; - case DicTokenType.Property: - { - var parts = token.Value.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); - if(!parts.Any()) LoadError(path, token, "Empty property field."); - switch(parts[0].ToLower()) - { - case "class": - { - if(parts.Length < 2) continue; - foreach(var cl in parts[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) - { - bool opt = cl.EndsWith("?"); - entry.AddClass(VocabUtils.GetString(opt ? cl.Substring(0, cl.Length - 1) : cl), opt); - } - } - break; - case "weight": - { - if(parts.Length != 2) LoadError(path, token, "'weight' property expected a value."); - int weight; - if(!Int32.TryParse(parts[1], out weight)) - LoadError(path, token, "Invalid weight value: '" + parts[1] + "'"); - entry.Weight = weight; - } - break; - case "pron": - { - if(parts.Length != 2) LoadError(path, token, "'" + parts[0] + "' property expected a value."); - var pron = - parts[1].Split('/') - .Select(s => s.Trim()) - .ToArray(); - if(subtypes.Length == pron.Length) - { - for(int i = 0; i < entry.TermCount; i++) - entry[i].Pronunciation = pron[i]; - } - } - break; - default: - { - EntryTypeDef typeDef; - if(!types.TryGetValue(parts[0], out typeDef)) - LoadError(path, token, $"Unknown property name '{parts[0]}'."); - // Okay, it's a type. - if(parts.Length != 2) LoadError(path, token, "Missing type value."); - entry.AddClass(VocabUtils.GetString(parts[1])); - if(!typeDef.IsValidValue(parts[1])) - LoadError(path, token, $"'{parts[1]}' is not a valid value for type '{typeDef.Name}'."); - break; - } - } - } - break; - } - } + foreach (var token in DicLexer.Tokenize(path, File.ReadAllText(path))) + { + switch (token.Type) + { + case DicTokenType.Directive: + { + var parts = VocabUtils.GetArgs(token.Value).ToArray(); + if (!parts.Any()) continue; + string dirName = parts.First().ToLower(); + var args = parts.Skip(1).ToArray(); - if(types.Any()) - { - var eEntries = entries.GetEnumerator(); - var eEntryStringes = entryStringes.GetEnumerator(); - while(eEntries.MoveNext() && eEntryStringes.MoveNext()) - { - foreach(var type in types.Values) - { - if(!type.Test(eEntries.Current)) - { - // TODO: Find a way to output multiple non-fatal table load errors without making a gigantic exception message. - LoadError(path, eEntryStringes.Current, $"Entry '{eEntries.Current}' does not satisfy type '{type.Name}'."); - } - } - } - } + switch (dirName) + { + case "name": + if (!header) LoadError(path, token, "The #name directive may only be used in the file header."); + if (args.Length != 1) LoadError(path, token, "#name directive expected one word:\r\n\r\n" + token.Value); + if (!Util.ValidateName(args[0])) LoadError(path, token, $"Invalid #name value: '{args[1]}'"); + name = args[0].ToLower(); + break; + case "subs": + if (!header) LoadError(path, token, "The #subs directive may only be used in the file header."); + subtypes = args.Select(s => s.Trim().ToLower()).ToArray(); + break; + case "version": // Kept here for backwards-compatability + if (!header) LoadError(path, token, "The #version directive may only be used in the file header."); + break; + case "hidden": + if (!header) LoadError(path, token, "The #hidden directive may only be used in the file header."); + if (Util.ValidateName(args[0])) hiddenClasses.Add(args[0]); + break; + // Deprecated, remove in Rant 3 + case "nsfw": + scopedClassSet.Add("nsfw"); + break; + // Deprecated, remove in Rant 3 + case "sfw": + scopedClassSet.Remove("nsfw"); + break; + case "class": + { + if (args.Length < 2) LoadError(path, token, "The #class directive expects an operation and at least one value."); + switch (args[0].ToLower()) + { + case "add": + foreach (string cl in args.Skip(1)) + scopedClassSet.Add(cl.ToLower()); + break; + case "remove": + foreach (string cl in args.Skip(1)) + scopedClassSet.Remove(cl.ToLower()); + break; + } + } + break; + case "type": + { + if (!header) LoadError(path, token, "The #type directive may only be used in the file header."); + if (args.Length != 3) LoadError(path, token, "#type directive requires 3 arguments."); + types.Add(args[0], new EntryTypeDef(args[0], args[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), + Util.IsNullOrWhiteSpace(args[2]) ? null : new EntryTypeDefFilter(args[2]))); + } + break; + } + } + break; + case DicTokenType.Entry: + { + if (Util.IsNullOrWhiteSpace(name)) + LoadError(path, token, "Missing table name before entry list."); + if (Util.IsNullOrWhiteSpace(token.Value)) + LoadError(path, token, "Encountered empty entry."); + header = false; + entry = new RantDictionaryEntry(token.Value.Split('/').Select(s => s.Trim()).ToArray(), scopedClassSet); + entries.Add(entry); + entryStringes.Add(token); + } + break; + case DicTokenType.DiffEntry: + { + if (Util.IsNullOrWhiteSpace(name)) + LoadError(path, token, "Missing table name before entry list."); + if (Util.IsNullOrWhiteSpace(token.Value)) + LoadError(path, token, "Encountered empty entry."); + header = false; + string first = null; + entry = new RantDictionaryEntry(token.Value.Split('/') + .Select((s, i) => + { + if (i > 0) return Diff.Mark(first, s); + return first = s.Trim(); + }).ToArray(), scopedClassSet); + entries.Add(entry); + entryStringes.Add(token); + } + break; + case DicTokenType.Property: + { + var parts = token.Value.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); + if (!parts.Any()) LoadError(path, token, "Empty property field."); + switch (parts[0].ToLower()) + { + case "class": + { + if (parts.Length < 2) continue; + foreach (string cl in parts[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) + { + bool opt = cl.EndsWith("?"); + entry.AddClass(VocabUtils.GetString(opt ? cl.Substring(0, cl.Length - 1) : cl), opt); + } + } + break; + case "weight": + { + if (parts.Length != 2) LoadError(path, token, "'weight' property expected a value."); + int weight; + if (!Int32.TryParse(parts[1], out weight)) + LoadError(path, token, "Invalid weight value: '" + parts[1] + "'"); + entry.Weight = weight; + } + break; + case "pron": + { + if (parts.Length != 2) LoadError(path, token, "'" + parts[0] + "' property expected a value."); + var pron = + parts[1].Split('/') + .Select(s => s.Trim()) + .ToArray(); + if (subtypes.Length == pron.Length) + { + for (int i = 0; i < entry.TermCount; i++) + entry[i].Pronunciation = pron[i]; + } + } + break; + default: + { + EntryTypeDef typeDef; + if (!types.TryGetValue(parts[0], out typeDef)) + LoadError(path, token, $"Unknown property name '{parts[0]}'."); + // Okay, it's a type. + if (parts.Length != 2) LoadError(path, token, "Missing type value."); + entry.AddClass(VocabUtils.GetString(parts[1])); + if (!typeDef.IsValidValue(parts[1])) + LoadError(path, token, $"'{parts[1]}' is not a valid value for type '{typeDef.Name}'."); + break; + } + } + } + break; + } + } - var table = new RantDictionaryTable(name, subtypes.Length, hiddenClasses); - for(var i = 0; i < subtypes.Length; i++) - { - table.AddSubtype(subtypes[i], i); - } + if (types.Any()) + { + var eEntries = entries.GetEnumerator(); + var eEntryStringes = entryStringes.GetEnumerator(); + while (eEntries.MoveNext() && eEntryStringes.MoveNext()) + { + foreach (var type in types.Values) + { + if (!type.Test(eEntries.Current)) + { + // TODO: Find a way to output multiple non-fatal table load errors without making a gigantic exception message. + LoadError(path, eEntryStringes.Current, $"Entry '{eEntries.Current}' does not satisfy type '{type.Name}'."); + } + } + } + } - for(var i = 0; i < entries.Count; i++) - { - table.AddEntry(entries[i]); - } + var table = new RantDictionaryTable(name, subtypes.Length, hiddenClasses); + for (int i = 0; i < subtypes.Length; i++) + table.AddSubtype(subtypes[i], i); - table.Commit(); + for (int i = 0; i < entries.Count; i++) + table.AddEntry(entries[i]); - return table; - } + table.Commit(); - private static void LoadError(string file, DicToken data, string message) - { - throw new RantLegacyTableLoadException(file, data, message); - } - } + return table; + } - internal class RantLegacyTableLoadException : Exception - { - public RantLegacyTableLoadException(string file, DicToken data, string message) - : base($"{file}: (Line {data.Line}) {message}") - { + private static void LoadError(string file, DicToken data, string message) + { + throw new RantLegacyTableLoadException(file, data, message); + } + } - } - } + internal class RantLegacyTableLoadException : Exception + { + public RantLegacyTableLoadException(string file, DicToken data, string message) + : base($"{file}: (Line {data.Line}) {message}") + { + } + } - internal class EntryTypeDefFilter - { - private readonly Regex _filterRegex = new Regex(@"!?\w+"); - private readonly _[] _filterParts; + internal class EntryTypeDefFilter + { + private readonly _[] _filterParts; + private readonly Regex _filterRegex = new Regex(@"!?\w+"); - public EntryTypeDefFilter(string filter) - { - if(filter.Trim() == "*") return; - _filterParts = filter - .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) - .Where(s => _filterRegex.IsMatch(s)) - .Select(s => _.Create(s.TrimStart('!'), s.StartsWith("!"))) - .ToArray(); - } + public EntryTypeDefFilter(string filter) + { + if (filter.Trim() == "*") return; + _filterParts = filter + .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) + .Where(s => _filterRegex.IsMatch(s)) + .Select(s => _.Create(s.TrimStart('!'), s.StartsWith("!"))) + .ToArray(); + } - private bool DoTest(RantDictionaryEntry entry) - { - return _filterParts == null || _filterParts.All(f => entry.ContainsClass(f.Item1) == f.Item2); - } + private bool DoTest(RantDictionaryEntry entry) + { + return _filterParts == null || _filterParts.All(f => entry.ContainsClass(f.Item1) == f.Item2); + } - /// - /// Determines whether a type should apply to the specifed entry according to the specified filter. - /// - /// The filter to test with. - /// The entry to test. - /// - public static bool Test(EntryTypeDefFilter filter, RantDictionaryEntry entry) => filter?.DoTest(entry) ?? false; - } + /// + /// Determines whether a type should apply to the specifed entry according to the specified filter. + /// + /// The filter to test with. + /// The entry to test. + /// + public static bool Test(EntryTypeDefFilter filter, RantDictionaryEntry entry) => filter?.DoTest(entry) ?? false; + } - internal class EntryTypeDef - { - private readonly HashSet _classes; + internal class EntryTypeDef + { + private readonly HashSet _classes; - public string Name { get; } + public EntryTypeDef(string name, IEnumerable classes, EntryTypeDefFilter filter) + { + Name = name; + _classes = new HashSet(); + foreach (string c in classes) _classes.Add(c); + Filter = filter; + } - public EntryTypeDefFilter Filter { get; } + public string Name { get; } - public IEnumerator GetTypeClasses() => _classes.AsEnumerable().GetEnumerator(); + public EntryTypeDefFilter Filter { get; } - public EntryTypeDef(string name, IEnumerable classes, EntryTypeDefFilter filter) - { - Name = name; - _classes = new HashSet(); - foreach(var c in classes) _classes.Add(c); - Filter = filter; - } + public IEnumerator GetTypeClasses() => _classes.AsEnumerable().GetEnumerator(); - public bool IsValidValue(string value) => _classes.Contains(value); + public bool IsValidValue(string value) => _classes.Contains(value); - public bool Test(RantDictionaryEntry entry) - { - if(!EntryTypeDefFilter.Test(Filter, entry)) return true; - return entry.GetClasses().Where(IsValidValue).Count() == 1; - } - } -} + public bool Test(RantDictionaryEntry entry) + { + if (!EntryTypeDefFilter.Test(Filter, entry)) return true; + return entry.GetClasses().Where(IsValidValue).Count() == 1; + } + } +} \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/Carrier.cs b/Rant/Vocabulary/Querying/Carrier.cs index 0121772..32eecbb 100644 --- a/Rant/Vocabulary/Querying/Carrier.cs +++ b/Rant/Vocabulary/Querying/Carrier.cs @@ -30,96 +30,96 @@ namespace Rant.Vocabulary.Querying { - /// - /// Represents information that can be used to synchronize query selections based on certain criteria. - /// - public sealed class Carrier - { - private readonly Dictionary> _components; + /// + /// Represents information that can be used to synchronize query selections based on certain criteria. + /// + public sealed class Carrier + { + private readonly Dictionary> _components; - /// - /// Creates an empty carrier. - /// - public Carrier() - { - _components = new Dictionary>(); - } + /// + /// Creates an empty carrier. + /// + public Carrier() + { + _components = new Dictionary>(); + } - /// - /// Returns how many of a certain carrier component type are assigned to the current instance. - /// - /// - /// - public int GetTypeCount(CarrierComponentType type) - { - HashSet set; - if (!_components.TryGetValue(type, out set)) return 0; - return set.Count; - } + /// + /// Returns how many of a certain carrier component type are assigned to the current instance. + /// + /// + /// + public int GetTypeCount(CarrierComponentType type) + { + HashSet set; + if (!_components.TryGetValue(type, out set)) return 0; + return set.Count; + } - /// - /// Adds a component of the specified type and name to the current instance. - /// - /// The type of carrier to add. - /// The names to assign to the component type. - public void AddComponent(CarrierComponentType type, params string[] values) - { - HashSet set; - if (!_components.TryGetValue(type, out set)) - { - _components[type] = new HashSet(values); - return; - } - foreach (string value in values) set.Add(value); - } + /// + /// Adds a component of the specified type and name to the current instance. + /// + /// The type of carrier to add. + /// The names to assign to the component type. + public void AddComponent(CarrierComponentType type, params string[] values) + { + HashSet set; + if (!_components.TryGetValue(type, out set)) + { + _components[type] = new HashSet(values); + return; + } + foreach (string value in values) set.Add(value); + } - /// - /// Iterates through the current instances's components of the specified type. - /// - /// The type of component to iterate through. - /// - public IEnumerable GetComponentsOfType(CarrierComponentType type) - { - HashSet set; - if (!_components.TryGetValue(type, out set)) yield break; - foreach (string value in set) - yield return value; - } + /// + /// Iterates through the current instances's components of the specified type. + /// + /// The type of component to iterate through. + /// + public IEnumerable GetComponentsOfType(CarrierComponentType type) + { + HashSet set; + if (!_components.TryGetValue(type, out set)) yield break; + foreach (string value in set) + yield return value; + } - /// - /// Retreives the total amount of all components. - /// - /// The total amount of all components. - public int GetTotalCount() - { - int count = 0; - foreach (CarrierComponentType component in Enum.GetValues(typeof(CarrierComponentType))) - count += GetTypeCount(component); - return count; - } + /// + /// Retreives the total amount of all components. + /// + /// The total amount of all components. + public int GetTotalCount() + { + int count = 0; + foreach (CarrierComponentType component in Enum.GetValues(typeof(CarrierComponentType))) + count += GetTypeCount(component); + return count; + } - internal void Serialize(EasyWriter output) - { - output.Write(_components.Count); - foreach (var kv in _components) - { - output.Write((byte)kv.Key); - output.Write(kv.Value.Count); - foreach (string compName in kv.Value) - output.Write(compName); - } - } + internal void Serialize(EasyWriter output) + { + output.Write(_components.Count); + foreach (var kv in _components) + { + output.Write((byte)kv.Key); + output.Write(kv.Value.Count); + foreach (string compName in kv.Value) + output.Write(compName); + } + } - internal void Deserialize(EasyReader input) - { - int typeCount = input.ReadInt32(); - for (int i = 0; i < typeCount; i++) - { - var type = input.ReadEnum(); - int num = input.ReadInt32(); - for (int j = 0; j < num; j++) - AddComponent(type, input.ReadString()); - } - } - } + internal void Deserialize(EasyReader input) + { + int typeCount = input.ReadInt32(); + for (int i = 0; i < typeCount; i++) + { + var type = input.ReadEnum(); + int num = input.ReadInt32(); + for (int j = 0; j < num; j++) + AddComponent(type, input.ReadString()); + } + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/CarrierComponent.cs b/Rant/Vocabulary/Querying/CarrierComponent.cs index 61626ca..9a23848 100644 --- a/Rant/Vocabulary/Querying/CarrierComponent.cs +++ b/Rant/Vocabulary/Querying/CarrierComponent.cs @@ -25,69 +25,69 @@ namespace Rant.Vocabulary.Querying { - /// - /// Defines carrier types for queries. - /// - public enum CarrierComponentType : byte - { - /// - /// Select the same entry every time. - /// - Match, + /// + /// Defines carrier types for queries. + /// + public enum CarrierComponentType : byte + { + /// + /// Select the same entry every time. + /// + Match, - /// - /// Share no classes. - /// - Dissociative, + /// + /// Share no classes. + /// + Dissociative, - /// - /// Share no classes with a match carrier entry. - /// - MatchDissociative, + /// + /// Share no classes with a match carrier entry. + /// + MatchDissociative, - /// - /// Classes must exactly match. - /// - Associative, + /// + /// Classes must exactly match. + /// + Associative, - /// - /// Classes must exactly match those of a match carrier entry. - /// - MatchAssociative, + /// + /// Classes must exactly match those of a match carrier entry. + /// + MatchAssociative, - /// - /// Have at least one different class. - /// - Divergent, + /// + /// Have at least one different class. + /// + Divergent, - /// - /// Have at least one different class than a match carrier entry. - /// - MatchDivergent, + /// + /// Have at least one different class than a match carrier entry. + /// + MatchDivergent, - /// - /// Share at least one class. - /// - Relational, + /// + /// Share at least one class. + /// + Relational, - /// - /// Share at least one class with a match carrier entry. - /// - MatchRelational, + /// + /// Share at least one class with a match carrier entry. + /// + MatchRelational, - /// - /// Never choose the same entry twice. - /// - Unique, + /// + /// Never choose the same entry twice. + /// + Unique, - /// - /// Choose an entry that is different from a match carrier entry. - /// - MatchUnique, + /// + /// Choose an entry that is different from a match carrier entry. + /// + MatchUnique, - /// - /// Choose terms that rhyme. - /// - Rhyme - } + /// + /// Choose terms that rhyme. + /// + Rhyme + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/CarrierState.cs b/Rant/Vocabulary/Querying/CarrierState.cs index 6b38bca..51d0fb5 100644 --- a/Rant/Vocabulary/Querying/CarrierState.cs +++ b/Rant/Vocabulary/Querying/CarrierState.cs @@ -31,187 +31,201 @@ namespace Rant.Vocabulary.Querying { - /// - /// Maintains state information used by queries. - /// - internal sealed class CarrierState - { - /// - /// Associative/Disassociative/Relational/Divergent carrier table. - /// - private readonly Dictionary _assocTable = new Dictionary(); - - /// - /// Match table. - /// - private readonly Dictionary _matchTable = new Dictionary(); - - /// - /// Rhyme carrier table. - /// Wherein the KEY is the RHYME ID and SUBTYPE, and the VALUE is the ROOT TERM and USED TERMS. - /// - private readonly Dictionary>> _rhymeTable = - new Dictionary>>(); - - /// - /// Distinct carrier table. - /// Wherein the KEY is the UNIQUE ID, and the VALUE is the collection of used entries. - /// - private readonly Dictionary> _uniqueTable = - new Dictionary>(); - - internal Rhymer Rhymer { get; } = new Rhymer(); - internal void DeleteUnique(string name) => _uniqueTable.Remove(name); - internal void DeleteRhyme(string name) => _rhymeTable.Remove(name); - internal void DeleteMatch(string name) => _matchTable.Remove(name); - internal void DeleteAssociation(string name) => _assocTable.Remove(name); - - public void Reset() - { - _rhymeTable.Clear(); - _matchTable.Clear(); - _assocTable.Clear(); - _uniqueTable.Clear(); - } - - internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumerable pool, - RNG rng) - { - if (carrier == null) return pool.PickEntry(rng); - - RantDictionaryEntry result = null; - - // Handle match carriers - foreach (string match in carrier.GetComponentsOfType(CarrierComponentType.Match)) - if (_matchTable.TryGetValue(match, out result)) return result; - - // Handle associative carriers - foreach (string assoc in carrier.GetComponentsOfType(CarrierComponentType.Associative)) - { - if (_assocTable.TryGetValue(assoc, out result)) - pool = pool.Where(e => e.AssociatesWith(result)); - break; - } - - // Handle match-associative carriers - foreach (string massoc in carrier.GetComponentsOfType(CarrierComponentType.MatchAssociative)) - { - if (_matchTable.TryGetValue(massoc, out result)) - pool = pool.Where(e => e.AssociatesWith(result)); - break; - } - - // Handle unique carriers - foreach (string unique in carrier.GetComponentsOfType(CarrierComponentType.Unique)) - { - HashSet usedSet; - if (!_uniqueTable.TryGetValue(unique, out usedSet)) - usedSet = _uniqueTable[unique] = new HashSet(); - - pool = pool.Except(usedSet); - } - - // Handle match-unique carriers - foreach (string munique in carrier.GetComponentsOfType(CarrierComponentType.Unique)) - if (_matchTable.TryGetValue(munique, out result)) - pool = pool.Where(e => e != result); - - // Handle relational carriers - foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.Relational)) - if (_assocTable.TryGetValue(relate, out result)) - pool = pool.Where(e => e.RelatesWith(result)); - - // Handle match-relational carriers - foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.MatchRelational)) - if (_matchTable.TryGetValue(relate, out result)) - pool = pool.Where(e => e.RelatesWith(result)); - - // Handle dissociative carriers - foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.Dissociative)) - if (_assocTable.TryGetValue(relate, out result)) - pool = pool.Where(e => !e.RelatesWith(result)); - - // Handle match-dissociative carriers - foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.MatchDissociative)) - if (_matchTable.TryGetValue(relate, out result)) - pool = pool.Where(e => !e.RelatesWith(result)); - - // Handle divergent carriers - foreach (string diverge in carrier.GetComponentsOfType(CarrierComponentType.Divergent)) - if (_assocTable.TryGetValue(diverge, out result)) - pool = pool.Where(e => e.DivergesFrom(result)); - - // Handle match-divergent carriers - foreach (string diverge in carrier.GetComponentsOfType(CarrierComponentType.MatchDivergent)) - if (_matchTable.TryGetValue(diverge, out result)) - pool = pool.Where(e => e.DivergesFrom(result)); - - result = pool.PickEntry(rng); - - // Handle rhyme carrier - foreach (string rhyme in carrier.GetComponentsOfType(CarrierComponentType.Rhyme)) - { - _> rhymeState; - if (!_rhymeTable.TryGetValue(rhyme, out rhymeState)) - { - result = pool - .Where(e => !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation)) - .PickEntry(rng); - if (result == null) return null; - _rhymeTable[rhyme] = _.Create(result[subtypeIndex], new HashSet(new[] { result })); - break; - } - result = - pool.Except(rhymeState.Item2) - .Where(e => - !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation) && - Rhymer.Rhyme(rhymeState.Item1, e[subtypeIndex])) - .PickEntry(rng); - - if (result != null) rhymeState.Item2.Add(result); - break; // Ignore any extra rhyme carriers - } - - if (result == null) return null; - - foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Associative)) - if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; - - foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Dissociative)) - if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; - - foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Divergent)) - if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; - - foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Relational)) - if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; - - foreach (string unique in carrier.GetComponentsOfType(CarrierComponentType.Unique)) - _uniqueTable[unique].Add(result); - - foreach (string match in carrier.GetComponentsOfType(CarrierComponentType.Match)) - { - _matchTable[match] = result; - break; - } - - return result; - } - - public void RemoveType(CarrierComponentType type, string name) - { - if (type == CarrierComponentType.Rhyme) - DeleteRhyme(name); - else if (type == CarrierComponentType.Unique) - DeleteUnique(name); - else if ( - type == CarrierComponentType.Associative || - type == CarrierComponentType.Relational || - type == CarrierComponentType.Dissociative || - type == CarrierComponentType.Divergent) - DeleteAssociation(name); - else - DeleteMatch(name); - } - } + /// + /// Maintains state information used by queries. + /// + internal sealed class CarrierState + { + /// + /// Associative/Disassociative/Relational/Divergent carrier table. + /// + private readonly Dictionary _assocTable = new Dictionary(); + + /// + /// Match table. + /// + private readonly Dictionary _matchTable = new Dictionary(); + + /// + /// Rhyme carrier table. + /// Wherein the KEY is the RHYME ID and SUBTYPE, and the VALUE is the ROOT TERM and USED TERMS. + /// + private readonly Dictionary>> _rhymeTable = + new Dictionary>>(); + + /// + /// Distinct carrier table. + /// Wherein the KEY is the UNIQUE ID, and the VALUE is the collection of used entries. + /// + private readonly Dictionary> _uniqueTable = + new Dictionary>(); + + internal Rhymer Rhymer { get; } = new Rhymer(); + internal void DeleteUnique(string name) => _uniqueTable.Remove(name); + internal void DeleteRhyme(string name) => _rhymeTable.Remove(name); + internal void DeleteMatch(string name) => _matchTable.Remove(name); + internal void DeleteAssociation(string name) => _assocTable.Remove(name); + + public void Reset() + { + _rhymeTable.Clear(); + _matchTable.Clear(); + _assocTable.Clear(); + _uniqueTable.Clear(); + } + + internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumerable pool, + RNG rng) + { + if (carrier == null) return pool.PickEntry(rng); + + RantDictionaryEntry result = null; + + // Handle match carriers + foreach (string match in carrier.GetComponentsOfType(CarrierComponentType.Match)) + if (_matchTable.TryGetValue(match, out result)) return result; + + // Handle associative carriers + foreach (string assoc in carrier.GetComponentsOfType(CarrierComponentType.Associative)) + { + if (_assocTable.TryGetValue(assoc, out result)) + pool = pool.Where(e => e.AssociatesWith(result)); + break; + } + + // Handle match-associative carriers + foreach (string massoc in carrier.GetComponentsOfType(CarrierComponentType.MatchAssociative)) + { + if (_matchTable.TryGetValue(massoc, out result)) + pool = pool.Where(e => e.AssociatesWith(result)); + break; + } + + // Handle unique carriers + foreach (string unique in carrier.GetComponentsOfType(CarrierComponentType.Unique)) + { + HashSet usedSet; + if (!_uniqueTable.TryGetValue(unique, out usedSet)) + usedSet = _uniqueTable[unique] = new HashSet(); + + pool = pool.Except(usedSet); + } + + // Handle match-unique carriers + foreach (string munique in carrier.GetComponentsOfType(CarrierComponentType.Unique)) + { + if (_matchTable.TryGetValue(munique, out result)) + pool = pool.Where(e => e != result); + } + + // Handle relational carriers + foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.Relational)) + { + if (_assocTable.TryGetValue(relate, out result)) + pool = pool.Where(e => e.RelatesWith(result)); + } + + // Handle match-relational carriers + foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.MatchRelational)) + { + if (_matchTable.TryGetValue(relate, out result)) + pool = pool.Where(e => e.RelatesWith(result)); + } + + // Handle dissociative carriers + foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.Dissociative)) + { + if (_assocTable.TryGetValue(relate, out result)) + pool = pool.Where(e => !e.RelatesWith(result)); + } + + // Handle match-dissociative carriers + foreach (string relate in carrier.GetComponentsOfType(CarrierComponentType.MatchDissociative)) + { + if (_matchTable.TryGetValue(relate, out result)) + pool = pool.Where(e => !e.RelatesWith(result)); + } + + // Handle divergent carriers + foreach (string diverge in carrier.GetComponentsOfType(CarrierComponentType.Divergent)) + { + if (_assocTable.TryGetValue(diverge, out result)) + pool = pool.Where(e => e.DivergesFrom(result)); + } + + // Handle match-divergent carriers + foreach (string diverge in carrier.GetComponentsOfType(CarrierComponentType.MatchDivergent)) + { + if (_matchTable.TryGetValue(diverge, out result)) + pool = pool.Where(e => e.DivergesFrom(result)); + } + + result = pool.PickEntry(rng); + + // Handle rhyme carrier + foreach (string rhyme in carrier.GetComponentsOfType(CarrierComponentType.Rhyme)) + { + _> rhymeState; + if (!_rhymeTable.TryGetValue(rhyme, out rhymeState)) + { + result = pool + .Where(e => !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation)) + .PickEntry(rng); + if (result == null) return null; + _rhymeTable[rhyme] = _.Create(result[subtypeIndex], new HashSet(new[] { result })); + break; + } + result = + pool.Except(rhymeState.Item2) + .Where(e => + !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation) && + Rhymer.Rhyme(rhymeState.Item1, e[subtypeIndex])) + .PickEntry(rng); + + if (result != null) rhymeState.Item2.Add(result); + break; // Ignore any extra rhyme carriers + } + + if (result == null) return null; + + foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Associative)) + if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; + + foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Dissociative)) + if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; + + foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Divergent)) + if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; + + foreach (string a in carrier.GetComponentsOfType(CarrierComponentType.Relational)) + if (!_assocTable.ContainsKey(a)) _assocTable[a] = result; + + foreach (string unique in carrier.GetComponentsOfType(CarrierComponentType.Unique)) + _uniqueTable[unique].Add(result); + + foreach (string match in carrier.GetComponentsOfType(CarrierComponentType.Match)) + { + _matchTable[match] = result; + break; + } + + return result; + } + + public void RemoveType(CarrierComponentType type, string name) + { + if (type == CarrierComponentType.Rhyme) + DeleteRhyme(name); + else if (type == CarrierComponentType.Unique) + DeleteUnique(name); + else if ( + type == CarrierComponentType.Associative || + type == CarrierComponentType.Relational || + type == CarrierComponentType.Dissociative || + type == CarrierComponentType.Divergent) + DeleteAssociation(name); + else + DeleteMatch(name); + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/ClassFilter.cs b/Rant/Vocabulary/Querying/ClassFilter.cs index 9b04a63..ba9bd4a 100644 --- a/Rant/Vocabulary/Querying/ClassFilter.cs +++ b/Rant/Vocabulary/Querying/ClassFilter.cs @@ -30,95 +30,95 @@ namespace Rant.Vocabulary.Querying { - /// - /// Defines a set of class filtering rules for a query. - /// - internal sealed class ClassFilter : Filter - { - private readonly List _items = new List(); - - /// - /// Gets a boolean value indicating whether there are any rules added to the current ClassFilter instance. - /// - public bool IsEmpty => _items.Count == 0; - - public string[] RequiredClasses => _items.Where(i => i.Length == 1 && i[0].ShouldMatch).Select(i => i[0].Class).ToArray(); - - /// - /// Whether the class filter is simple, i.e. there are no switch rules and every rule should match. - /// - public bool SimpleFilter => _items.All(i => i.Length == 1 && i[0].ShouldMatch); - - public override int Priority => 0; - - /// - /// Adds a single-class rule to the filter. - /// - /// - public void AddRule(ClassFilterRule item) - { - _items.Add(new[] { item }); - } - - /// - /// Adds a rule set that must satisfy one of the specified rules. - /// - /// The items to include in the rule switch. - public void AddRuleSwitch(params ClassFilterRule[] items) - { - _items.Add(items); - } - - public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) - { - bool match = query.Exclusive - ? _items.Any() == entry.GetClasses().Any() - && entry.GetClasses().All(c => _items.Any(item => item.Any(rule => rule.ShouldMatch && rule.Class == c))) - : !_items.Any() || _items.All(set => set.Any(rule => entry.ContainsClass(rule.Class) == rule.ShouldMatch)); - - // Enumerate hidden classes that aren't manually exposed or explicitly allowed by the filter - var hidden = table.HiddenClasses.Where(c => !AllowsClass(c)).Except(dictionary.IncludedHiddenClasses); - return match && !hidden.Any(entry.ContainsClass); - } - - /// - /// Returns a boolean value indicating whether the specified class is explicitly allowed by the current ClassFilter. - /// - /// The class to test. - /// - public bool AllowsClass(string className) => - _items.Any(item => item.Any(rule => rule.Class == className && rule.ShouldMatch)); - - public override void Serialize(EasyWriter output) - { - output.Write(FILTER_CLASS); - output.Write(_items.Count); - foreach (var filter in _items) - { - output.Write(filter.Length); - foreach (var rule in filter) - { - output.Write(rule.ShouldMatch); - output.Write(rule.Class); - } - } - } - - public override void Deserialize(EasyReader input) - { - int count = input.ReadInt32(); - for (int i = 0; i < count; i++) - { - int swLength = input.ReadInt32(); - var sw = new ClassFilterRule[swLength]; - for (int j = 0; j < swLength; j++) - { - bool shouldMatch = input.ReadBoolean(); - string clName = input.ReadString(); - sw[j] = new ClassFilterRule(clName, shouldMatch); - } - _items.Add(sw); - } - } - } + /// + /// Defines a set of class filtering rules for a query. + /// + internal sealed class ClassFilter : Filter + { + private readonly List _items = new List(); + + /// + /// Gets a boolean value indicating whether there are any rules added to the current ClassFilter instance. + /// + public bool IsEmpty => _items.Count == 0; + + public string[] RequiredClasses => _items.Where(i => i.Length == 1 && i[0].ShouldMatch).Select(i => i[0].Class).ToArray(); + + /// + /// Whether the class filter is simple, i.e. there are no switch rules and every rule should match. + /// + public bool SimpleFilter => _items.All(i => i.Length == 1 && i[0].ShouldMatch); + + public override int Priority => 0; + + /// + /// Adds a single-class rule to the filter. + /// + /// + public void AddRule(ClassFilterRule item) + { + _items.Add(new[] { item }); + } + + /// + /// Adds a rule set that must satisfy one of the specified rules. + /// + /// The items to include in the rule switch. + public void AddRuleSwitch(params ClassFilterRule[] items) + { + _items.Add(items); + } + + public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) + { + bool match = query.Exclusive + ? _items.Any() == entry.GetClasses().Any() + && entry.GetClasses().All(c => _items.Any(item => item.Any(rule => rule.ShouldMatch && rule.Class == c))) + : !_items.Any() || _items.All(set => set.Any(rule => entry.ContainsClass(rule.Class) == rule.ShouldMatch)); + + // Enumerate hidden classes that aren't manually exposed or explicitly allowed by the filter + var hidden = table.HiddenClasses.Where(c => !AllowsClass(c)).Except(dictionary.IncludedHiddenClasses); + return match && !hidden.Any(entry.ContainsClass); + } + + /// + /// Returns a boolean value indicating whether the specified class is explicitly allowed by the current ClassFilter. + /// + /// The class to test. + /// + public bool AllowsClass(string className) => + _items.Any(item => item.Any(rule => rule.Class == className && rule.ShouldMatch)); + + public override void Serialize(EasyWriter output) + { + output.Write(FILTER_CLASS); + output.Write(_items.Count); + foreach (var filter in _items) + { + output.Write(filter.Length); + foreach (var rule in filter) + { + output.Write(rule.ShouldMatch); + output.Write(rule.Class); + } + } + } + + public override void Deserialize(EasyReader input) + { + int count = input.ReadInt32(); + for (int i = 0; i < count; i++) + { + int swLength = input.ReadInt32(); + var sw = new ClassFilterRule[swLength]; + for (int j = 0; j < swLength; j++) + { + bool shouldMatch = input.ReadBoolean(); + string clName = input.ReadString(); + sw[j] = new ClassFilterRule(clName, shouldMatch); + } + _items.Add(sw); + } + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/ClassFilterRule.cs b/Rant/Vocabulary/Querying/ClassFilterRule.cs index 096c7bb..deda991 100644 --- a/Rant/Vocabulary/Querying/ClassFilterRule.cs +++ b/Rant/Vocabulary/Querying/ClassFilterRule.cs @@ -25,39 +25,39 @@ namespace Rant.Vocabulary.Querying { - /// - /// Defines a query filter for a single dictionary entry class. - /// - public sealed class ClassFilterRule - { - /// - /// Initializes a new ClassFilterRule that checks for a positive match to the specified class. - /// - /// The name of the class to search for. - public ClassFilterRule(string className) - { - Class = className; - } + /// + /// Defines a query filter for a single dictionary entry class. + /// + public sealed class ClassFilterRule + { + /// + /// Initializes a new ClassFilterRule that checks for a positive match to the specified class. + /// + /// The name of the class to search for. + public ClassFilterRule(string className) + { + Class = className; + } - /// - /// Initializes a new ClassFilterRule that checks for a positive or negative match to the specified class. - /// - /// The name of the class to search for. - /// Determines whether the filter item expects a positive or negative match for the class. - public ClassFilterRule(string className, bool shouldMatch) - { - Class = className; - ShouldMatch = shouldMatch; - } + /// + /// Initializes a new ClassFilterRule that checks for a positive or negative match to the specified class. + /// + /// The name of the class to search for. + /// Determines whether the filter item expects a positive or negative match for the class. + public ClassFilterRule(string className, bool shouldMatch) + { + Class = className; + ShouldMatch = shouldMatch; + } - /// - /// Determines whether the filter item expects a positive or negative match for the class. - /// - public bool ShouldMatch { get; set; } = true; + /// + /// Determines whether the filter item expects a positive or negative match for the class. + /// + public bool ShouldMatch { get; set; } = true; - /// - /// The name of the class to search for. - /// - public string Class { get; set; } - } + /// + /// The name of the class to search for. + /// + public string Class { get; set; } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/Filter.cs b/Rant/Vocabulary/Querying/Filter.cs index e7a0b2d..3318bfb 100644 --- a/Rant/Vocabulary/Querying/Filter.cs +++ b/Rant/Vocabulary/Querying/Filter.cs @@ -29,44 +29,44 @@ namespace Rant.Vocabulary.Querying { - internal abstract class Filter - { - internal const ushort FILTER_NONE = 0x0000; - internal const ushort FILTER_CLASS = 0x0001; - internal const ushort FILTER_REGEX = 0x0002; - internal const ushort FILTER_SYLRANGE = 0x0003; - internal const ushort FILTER_BIT_OTHER = 0x8000; - public abstract int Priority { get; } + internal abstract class Filter + { + internal const ushort FILTER_NONE = 0x0000; + internal const ushort FILTER_CLASS = 0x0001; + internal const ushort FILTER_REGEX = 0x0002; + internal const ushort FILTER_SYLRANGE = 0x0003; + internal const ushort FILTER_BIT_OTHER = 0x8000; + public abstract int Priority { get; } - public static Filter GetFilterInstance(ushort filterTypeCode) - { - switch (filterTypeCode) - { - case FILTER_NONE: - return null; - case FILTER_CLASS: - return Activator.CreateInstance(); - case FILTER_SYLRANGE: - return Activator.CreateInstance(); - case FILTER_REGEX: - return Activator.CreateInstance(); - default: - return null; - } - } + public static Filter GetFilterInstance(ushort filterTypeCode) + { + switch (filterTypeCode) + { + case FILTER_NONE: + return null; + case FILTER_CLASS: + return Activator.CreateInstance(); + case FILTER_SYLRANGE: + return Activator.CreateInstance(); + case FILTER_REGEX: + return Activator.CreateInstance(); + default: + return null; + } + } - /// - /// Determines if the specified dictionary entry passes the filter. - /// - /// The dictionary being queried. - /// The table being queried. - /// The entry to test. - /// The index of the term requested by the query. - /// The originating query. - /// - public abstract bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query); + /// + /// Determines if the specified dictionary entry passes the filter. + /// + /// The dictionary being queried. + /// The table being queried. + /// The entry to test. + /// The index of the term requested by the query. + /// The originating query. + /// + public abstract bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query); - public abstract void Deserialize(EasyReader input); - public abstract void Serialize(EasyWriter output); - } + public abstract void Deserialize(EasyReader input); + public abstract void Serialize(EasyWriter output); + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index 4b85db8..a86a4ee 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -29,60 +29,60 @@ namespace Rant.Vocabulary.Querying { - /// - /// Represents a set of search criteria for a Rant dictionary. - /// - internal sealed class Query - { - private readonly HashSet _filters = new HashSet(); - - /// - /// The carrier for the query. - /// - public Carrier Carrier { get; set; } - - /// - /// The name of the table to search. - /// - public string Name { get; set; } - - /// - /// The subtype of the dictionary term to use. - /// - public string Subtype { get; set; } - - /// - /// The plural subtype to use. - /// - public string PluralSubtype { get; set; } - - /// - /// Specifies exclusivity of the class filter. - /// - public bool Exclusive { get; set; } - - /// - /// Complement for phrasal verbs. Not yet available in public API. - /// - internal RST Complement { get; set; } - - public int FilterCount => _filters.Count; - - /// - /// Returns whether the query is a "bare query" - should only return the table itself. - /// - public bool BareQuery => _filters.Count == 0 && !Exclusive && !HasCarrier; - - /// - /// Returns whether the query has a carrier. - /// - public bool HasCarrier => Carrier != null && Carrier.GetTotalCount() != 0; - - public void AddFilter(Filter filter) => _filters.Add(filter); - - public IEnumerable GetFilters() - { - foreach (var filter in _filters) yield return filter; - } - } + /// + /// Represents a set of search criteria for a Rant dictionary. + /// + internal sealed class Query + { + private readonly HashSet _filters = new HashSet(); + + /// + /// The carrier for the query. + /// + public Carrier Carrier { get; set; } + + /// + /// The name of the table to search. + /// + public string Name { get; set; } + + /// + /// The subtype of the dictionary term to use. + /// + public string Subtype { get; set; } + + /// + /// The plural subtype to use. + /// + public string PluralSubtype { get; set; } + + /// + /// Specifies exclusivity of the class filter. + /// + public bool Exclusive { get; set; } + + /// + /// Complement for phrasal verbs. Not yet available in public API. + /// + internal RST Complement { get; set; } + + public int FilterCount => _filters.Count; + + /// + /// Returns whether the query is a "bare query" - should only return the table itself. + /// + public bool BareQuery => _filters.Count == 0 && !Exclusive && !HasCarrier; + + /// + /// Returns whether the query has a carrier. + /// + public bool HasCarrier => Carrier != null && Carrier.GetTotalCount() != 0; + + public void AddFilter(Filter filter) => _filters.Add(filter); + + public IEnumerable GetFilters() + { + foreach (var filter in _filters) yield return filter; + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/RangeFilter.cs b/Rant/Vocabulary/Querying/RangeFilter.cs index 8dd0318..9162658 100644 --- a/Rant/Vocabulary/Querying/RangeFilter.cs +++ b/Rant/Vocabulary/Querying/RangeFilter.cs @@ -29,138 +29,134 @@ namespace Rant.Vocabulary.Querying { - /// - /// Defines a set of boundaries that can be used to enforce range requirements on numeric values. - /// - internal sealed class RangeFilter : Filter - { - private int? _min, _max; - - /// - /// Creates a new Range object with the specified minimum and maximum bounds. - /// - /// The minimum bound. - /// The maximum bound. - public RangeFilter(int? min, int? max) - { - if (min > max) - throw new ArgumentException("Maximum value must be greater than or equal to minimum value."); - Minimum = min; - Maximum = max; - } - - public RangeFilter() - { - // Used by serializer - } - - /// - /// Gets or sets the minimum bound of the range. Set this to null for no minimum. - /// - public int? Minimum - { - get { return _min; } - set - { - if (value > _max) - throw new ArgumentException("Minimum value must be less than or equal to maximum value."); - _min = value; - } - } - - /// - /// Gets or sets the maximum bound of the range. Set this to null for no maximum. - /// - public int? Maximum - { - get { return _max; } - set - { - if (value < _min) - throw new ArgumentException("Maximum value must be greater than or equal to minimum value."); - _max = value; - } - } - - /// - /// Creates a new Range object that accepts all values. - /// - public static RangeFilter Anything => new RangeFilter(null, null); - - public override int Priority => 1; - - /// - /// Determines if the specified number is within the current range. - /// - /// The value to test. - /// - public bool TestAgainst(int value) - { - if (_min == null && _max == null) return true; - if (_min == null) return value <= _max; - if (_max == null) return value >= _min; - return value >= _min && value <= _max; - } - - /// - /// Creates a new Range object with a minimum bound. - /// - /// The minimum bound. - /// - public static RangeFilter AtLeast(int min) => new RangeFilter(min, null); - - /// - /// Creates a new Range object with a maximum bound. - /// - /// The maximum bound. - /// - public static RangeFilter AtMost(int max) => new RangeFilter(null, max); - - /// - /// Creates a new Range object that accepts a single value. - /// - /// The value that the returned Range will accept. - /// - public static RangeFilter Exactly(int number) => new RangeFilter(number, number); - - /// - /// Creates a new Range object with a minimum and maximum bound. - /// - /// The minimum bound. - /// The maximum bound. - /// - public static RangeFilter Between(int min, int max) => new RangeFilter(min, max); - - public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) => TestAgainst(entry[termIndex].SyllableCount); - - public override void Deserialize(EasyReader input) - { - if (input.ReadBoolean()) _min = input.ReadInt32(); - if (input.ReadBoolean()) _max = input.ReadInt32(); - } - - public override void Serialize(EasyWriter output) - { - output.Write(FILTER_SYLRANGE); - if (_min == null) - { - output.Write(false); - } - else - { - output.Write(true); - output.Write(_min.Value); - } - - if (_max == null) - { - output.Write(false); - } - else - { - output.Write(true); - output.Write(_max.Value); - } - } - } + /// + /// Defines a set of boundaries that can be used to enforce range requirements on numeric values. + /// + internal sealed class RangeFilter : Filter + { + private int? _min, _max; + + /// + /// Creates a new Range object with the specified minimum and maximum bounds. + /// + /// The minimum bound. + /// The maximum bound. + public RangeFilter(int? min, int? max) + { + if (min > max) + throw new ArgumentException("Maximum value must be greater than or equal to minimum value."); + Minimum = min; + Maximum = max; + } + + public RangeFilter() + { + // Used by serializer + } + + /// + /// Gets or sets the minimum bound of the range. Set this to null for no minimum. + /// + public int? Minimum + { + get { return _min; } + set + { + if (value > _max) + throw new ArgumentException("Minimum value must be less than or equal to maximum value."); + _min = value; + } + } + + /// + /// Gets or sets the maximum bound of the range. Set this to null for no maximum. + /// + public int? Maximum + { + get { return _max; } + set + { + if (value < _min) + throw new ArgumentException("Maximum value must be greater than or equal to minimum value."); + _max = value; + } + } + + /// + /// Creates a new Range object that accepts all values. + /// + public static RangeFilter Anything => new RangeFilter(null, null); + + public override int Priority => 1; + + /// + /// Determines if the specified number is within the current range. + /// + /// The value to test. + /// + public bool TestAgainst(int value) + { + if (_min == null && _max == null) return true; + if (_min == null) return value <= _max; + if (_max == null) return value >= _min; + return value >= _min && value <= _max; + } + + /// + /// Creates a new Range object with a minimum bound. + /// + /// The minimum bound. + /// + public static RangeFilter AtLeast(int min) => new RangeFilter(min, null); + + /// + /// Creates a new Range object with a maximum bound. + /// + /// The maximum bound. + /// + public static RangeFilter AtMost(int max) => new RangeFilter(null, max); + + /// + /// Creates a new Range object that accepts a single value. + /// + /// The value that the returned Range will accept. + /// + public static RangeFilter Exactly(int number) => new RangeFilter(number, number); + + /// + /// Creates a new Range object with a minimum and maximum bound. + /// + /// The minimum bound. + /// The maximum bound. + /// + public static RangeFilter Between(int min, int max) => new RangeFilter(min, max); + + public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) => TestAgainst(entry[termIndex].SyllableCount); + + public override void Deserialize(EasyReader input) + { + if (input.ReadBoolean()) _min = input.ReadInt32(); + if (input.ReadBoolean()) _max = input.ReadInt32(); + } + + public override void Serialize(EasyWriter output) + { + output.Write(FILTER_SYLRANGE); + if (_min == null) + output.Write(false); + else + { + output.Write(true); + output.Write(_min.Value); + } + + if (_max == null) + output.Write(false); + else + { + output.Write(true); + output.Write(_max.Value); + } + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/RegexFilter.cs b/Rant/Vocabulary/Querying/RegexFilter.cs index dffcc09..1b10bc9 100644 --- a/Rant/Vocabulary/Querying/RegexFilter.cs +++ b/Rant/Vocabulary/Querying/RegexFilter.cs @@ -29,38 +29,38 @@ namespace Rant.Vocabulary.Querying { - internal sealed class RegexFilter : Filter - { - public RegexFilter(Regex regex, bool outcome) - { - Regex = regex; - Outcome = outcome; - } + internal sealed class RegexFilter : Filter + { + public RegexFilter(Regex regex, bool outcome) + { + Regex = regex; + Outcome = outcome; + } - public RegexFilter() - { - // Used by serializer - } + public RegexFilter() + { + // Used by serializer + } - public Regex Regex { get; set; } - public bool Outcome { get; set; } - public override int Priority => 100; - public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) => Regex.IsMatch(entry[termIndex].Value) == Outcome; + public Regex Regex { get; set; } + public bool Outcome { get; set; } + public override int Priority => 100; + public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) => Regex.IsMatch(entry[termIndex].Value) == Outcome; - public override void Deserialize(EasyReader input) - { - var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; - Outcome = input.ReadBoolean(); - options |= (RegexOptions)input.ReadInt32(); - Regex = new Regex(input.ReadString(), options); - } + public override void Deserialize(EasyReader input) + { + var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; + Outcome = input.ReadBoolean(); + options |= (RegexOptions)input.ReadInt32(); + Regex = new Regex(input.ReadString(), options); + } - public override void Serialize(EasyWriter output) - { - output.Write(FILTER_REGEX); - output.Write(Outcome); - output.Write((int)Regex.Options); - output.Write(Regex.ToString()); - } - } + public override void Serialize(EasyWriter output) + { + output.Write(FILTER_REGEX); + output.Write(Outcome); + output.Write((int)Regex.Options); + output.Write(Regex.ToString()); + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index 0af6efb..aff469d 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -33,114 +33,114 @@ namespace Rant.Vocabulary { - /// - /// Represents a dictionary that can be loaded and queried by Rant. - /// - public sealed class RantDictionary - { - private readonly HashSet _exposedClasses = new HashSet(); - private readonly Dictionary _tables = new Dictionary(); - - /// - /// Initializes a new instance of the class with no tables. - /// - public RantDictionary() - { - } - - /// - /// Initializes a new instance of the class with the specified set of tables. - /// - /// The tables to store in the dictionary. - public RantDictionary(IEnumerable tables) - { - _tables = new Dictionary(); - - if (tables == null) return; + /// + /// Represents a dictionary that can be loaded and queried by Rant. + /// + public sealed class RantDictionary + { + private readonly HashSet _exposedClasses = new HashSet(); + private readonly Dictionary _tables = new Dictionary(); + + /// + /// Initializes a new instance of the class with no tables. + /// + public RantDictionary() + { + } + + /// + /// Initializes a new instance of the class with the specified set of tables. + /// + /// The tables to store in the dictionary. + public RantDictionary(IEnumerable tables) + { + _tables = new Dictionary(); + + if (tables == null) return; foreach (var list in tables) + { if (_tables.TryGetValue(list.Name, out RantDictionaryTable table)) table.Merge(list); else _tables[list.Name] = list; + } + } + + /// + /// Gets all currently exposed hidden classes. + /// + public IEnumerable IncludedHiddenClasses => _exposedClasses.AsEnumerable(); + + /// + /// Exposes a hidden class to query results. + /// + /// The name of the hidden class to expose. + /// + public void IncludeHiddenClass(string hiddenClassName) + { + if (hiddenClassName == null) throw new ArgumentNullException(nameof(hiddenClassName)); + if (Util.ValidateName(hiddenClassName)) _exposedClasses.Add(hiddenClassName); } - /// - /// Gets all currently exposed hidden classes. - /// - public IEnumerable IncludedHiddenClasses => _exposedClasses.AsEnumerable(); - - /// - /// Exposes a hidden class to query results. - /// - /// The name of the hidden class to expose. - /// - public void IncludeHiddenClass(string hiddenClassName) - { - if (hiddenClassName == null) throw new ArgumentNullException(nameof(hiddenClassName)); - if (Util.ValidateName(hiddenClassName)) _exposedClasses.Add(hiddenClassName); - } - - /// - /// Unexposes a hidden class from query results. - /// - /// The name of the hidden class to unexpose. - /// - public void ExcludeHiddenClass(string hiddenClassName) - { - if (hiddenClassName == null) throw new ArgumentNullException(nameof(hiddenClassName)); - _exposedClasses.Remove(hiddenClassName); - } - - /// - /// Determines whether the specified class has been manually exposed (overriding hidden status). - /// - /// The name of the class to check. - /// - public bool ClassExposed(string className) - { - if (className == null) throw new ArgumentNullException(nameof(className)); - return _exposedClasses.Contains(className); - } - - /// - /// Adds a new object to the dictionary. - /// - /// The table to add. - public void AddTable(RantDictionaryTable table) - { + /// + /// Unexposes a hidden class from query results. + /// + /// The name of the hidden class to unexpose. + /// + public void ExcludeHiddenClass(string hiddenClassName) + { + if (hiddenClassName == null) throw new ArgumentNullException(nameof(hiddenClassName)); + _exposedClasses.Remove(hiddenClassName); + } + + /// + /// Determines whether the specified class has been manually exposed (overriding hidden status). + /// + /// The name of the class to check. + /// + public bool ClassExposed(string className) + { + if (className == null) throw new ArgumentNullException(nameof(className)); + return _exposedClasses.Contains(className); + } + + /// + /// Adds a new object to the dictionary. + /// + /// The table to add. + public void AddTable(RantDictionaryTable table) + { if (_tables.TryGetValue(table.Name, out RantDictionaryTable oldTable)) { if (ReferenceEquals(table, oldTable)) return; oldTable.Merge(table); } else - { _tables[table.Name] = table; - } } - /// - /// Enumerates the tables contained in the current RantDictionary instance. - /// - /// - public IEnumerable GetTables() - { - foreach (var pair in _tables) yield return pair.Value; - } - - /// - /// Queries the RantDictionary according to the specified criteria and returns a random match. - /// - /// The random number generator to randomize the match with. - /// The search criteria to use. - /// The state object to use for carrier synchronization. - /// - internal RantDictionaryTerm Query(Sandbox sb, Query query, CarrierState syncState) - { + /// + /// Enumerates the tables contained in the current RantDictionary instance. + /// + /// + public IEnumerable GetTables() + { + foreach (var pair in _tables) yield return pair.Value; + } + + /// + /// Queries the RantDictionary according to the specified criteria and returns a random match. + /// + /// The random number generator to randomize the match with. + /// The search criteria to use. + /// The state object to use for carrier synchronization. + /// + internal RantDictionaryTerm Query(Sandbox sb, Query query, CarrierState syncState) + { return !_tables.TryGetValue(query.Name, out RantDictionaryTable table) ? null : table.Query(this, sb, query, syncState); } - } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryEntry.cs b/Rant/Vocabulary/RantDictionaryEntry.cs index 7589451..b279713 100644 --- a/Rant/Vocabulary/RantDictionaryEntry.cs +++ b/Rant/Vocabulary/RantDictionaryEntry.cs @@ -29,229 +29,229 @@ namespace Rant.Vocabulary { - /// - /// Stores information about a dictionary entry. - /// - public sealed class RantDictionaryEntry - { - private const int INITIAL_METADATA_CAPACITY = 4; - private readonly HashSet _classes; - private readonly HashSet _optionalClasses; - private readonly RantDictionaryTerm[] _terms; - private Dictionary _metadata; + /// + /// Stores information about a dictionary entry. + /// + public sealed class RantDictionaryEntry + { + private const int INITIAL_METADATA_CAPACITY = 4; + private readonly HashSet _classes; + private readonly HashSet _optionalClasses; + private readonly RantDictionaryTerm[] _terms; + private Dictionary _metadata; - /// - /// Creates a new instance of the object from the specified term array. - /// - /// The terms in the entry. - public RantDictionaryEntry(RantDictionaryTerm[] terms) - { - if (terms == null) throw new ArgumentNullException(nameof(terms)); - _terms = terms.ToArray(); - if (_terms.Length == 0) throw new ArgumentException("Term list is empty."); - TermCount = _terms.Length; - _classes = new HashSet(); - _optionalClasses = new HashSet(); - Weight = 1; - } + /// + /// Creates a new instance of the object from the specified term array. + /// + /// The terms in the entry. + public RantDictionaryEntry(RantDictionaryTerm[] terms) + { + if (terms == null) throw new ArgumentNullException(nameof(terms)); + _terms = terms.ToArray(); + if (_terms.Length == 0) throw new ArgumentException("Term list is empty."); + TermCount = _terms.Length; + _classes = new HashSet(); + _optionalClasses = new HashSet(); + Weight = 1; + } - /// - /// Creates a new object from the specified term array, classes, and weight. - /// - /// The terms in the entry. - /// The classes associated with the entry. - /// The weight of the entry. - public RantDictionaryEntry(string[] terms, IEnumerable classes, int weight = 1) - : this(terms.Select(s => new RantDictionaryTerm(s)), classes, weight) - { - } + /// + /// Creates a new object from the specified term array, classes, and weight. + /// + /// The terms in the entry. + /// The classes associated with the entry. + /// The weight of the entry. + public RantDictionaryEntry(string[] terms, IEnumerable classes, int weight = 1) + : this(terms.Select(s => new RantDictionaryTerm(s)), classes, weight) + { + } - /// - /// Creates a new object from the specified term collection, classes, and weight. - /// - /// The terms in the entry. - /// The classes associated with the entry. - /// The weight of the entry. - public RantDictionaryEntry(IEnumerable terms, IEnumerable classes, int weight = 1) - { - if (terms == null) throw new ArgumentNullException(nameof(terms)); - _terms = terms.ToArray(); - if (_terms.Length == 0) throw new ArgumentException("Term list is empty."); - TermCount = _terms.Length; - _classes = new HashSet(); - _optionalClasses = new HashSet(); - foreach (string c in classes) - if (c.EndsWith("?")) - { - string trimmed = string.Intern(c.Substring(0, c.Length - 1)); - _optionalClasses.Add(trimmed); - _classes.Add(trimmed); - } - else - { - _classes.Add(string.Intern(c)); - } - Weight = weight; - } + /// + /// Creates a new object from the specified term collection, classes, and weight. + /// + /// The terms in the entry. + /// The classes associated with the entry. + /// The weight of the entry. + public RantDictionaryEntry(IEnumerable terms, IEnumerable classes, int weight = 1) + { + if (terms == null) throw new ArgumentNullException(nameof(terms)); + _terms = terms.ToArray(); + if (_terms.Length == 0) throw new ArgumentException("Term list is empty."); + TermCount = _terms.Length; + _classes = new HashSet(); + _optionalClasses = new HashSet(); + foreach (string c in classes) + { + if (c.EndsWith("?")) + { + string trimmed = string.Intern(c.Substring(0, c.Length - 1)); + _optionalClasses.Add(trimmed); + _classes.Add(trimmed); + } + else + _classes.Add(string.Intern(c)); + } + Weight = weight; + } - /// - /// Gets the number of terms stored in the current entry. - /// - public int TermCount { get; } + /// + /// Gets the number of terms stored in the current entry. + /// + public int TermCount { get; } - /// - /// Gets the number of classes in the current entry. - /// - public int ClassCount => _classes.Count; + /// + /// Gets the number of classes in the current entry. + /// + public int ClassCount => _classes.Count; - /// - /// Returns whether or not the entry has classes. - /// - public bool HasClasses => _classes.Any(); + /// + /// Returns whether or not the entry has classes. + /// + public bool HasClasses => _classes.Any(); - /// - /// Gets or sets the term at the specified index. - /// - /// The index of the term to access. - /// - public RantDictionaryTerm this[int index] - { - get { return index < 0 || index >= _terms.Length ? null : _terms[index]; } - set - { - if (index < 0 || index <= _terms.Length) - throw new IndexOutOfRangeException("Index was outside of the bounds of the entry's term list."); + /// + /// Gets or sets the term at the specified index. + /// + /// The index of the term to access. + /// + public RantDictionaryTerm this[int index] + { + get { return index < 0 || index >= _terms.Length ? null : _terms[index]; } + set + { + if (index < 0 || index <= _terms.Length) + throw new IndexOutOfRangeException("Index was outside of the bounds of the entry's term list."); - _terms[index] = value; - } - } + _terms[index] = value; + } + } - /// - /// Gets the weight value of the entry. - /// - public int Weight { get; set; } + /// + /// Gets the weight value of the entry. + /// + public int Weight { get; set; } - /// - /// Enumerates the terms stored in the current entry. - /// - /// - public IEnumerable GetTerms() => _terms.AsEnumerable(); + /// + /// Enumerates the terms stored in the current entry. + /// + /// + public IEnumerable GetTerms() => _terms.AsEnumerable(); - /// - /// Returns a collection of classes assigned to the current entry. - /// - /// - public IEnumerable GetClasses() - { - foreach (string className in _classes) yield return className; - } + /// + /// Returns a collection of classes assigned to the current entry. + /// + /// + public IEnumerable GetClasses() + { + foreach (string className in _classes) yield return className; + } - /// - /// Returns a collection of the optional classes assigned to the current entry. - /// - /// - public IEnumerable GetOptionalClasses() - { - foreach (string className in _optionalClasses) yield return className; - } + /// + /// Returns a collection of the optional classes assigned to the current entry. + /// + /// + public IEnumerable GetOptionalClasses() + { + foreach (string className in _optionalClasses) yield return className; + } - /// - /// Adds the specified class to the current entry. - /// - /// The name of the class. - /// Specifies whether the class is optional in carrier associations. - public void AddClass(string className, bool optional = false) - { - if (className.Trim().EndsWith("?")) - { - optional = true; - className = string.Intern(className.Trim().TrimEnd('?')); - } - _classes.Add(className); - if (optional) _optionalClasses.Add(className); - } + /// + /// Adds the specified class to the current entry. + /// + /// The name of the class. + /// Specifies whether the class is optional in carrier associations. + public void AddClass(string className, bool optional = false) + { + if (className.Trim().EndsWith("?")) + { + optional = true; + className = string.Intern(className.Trim().TrimEnd('?')); + } + _classes.Add(className); + if (optional) _optionalClasses.Add(className); + } - /// - /// Removes the class with the specified name from the current entry. - /// - /// The name of the class to remove. - public void RemoveClass(string className) - { - _classes.Remove(className); - _optionalClasses.Remove(className); - } + /// + /// Removes the class with the specified name from the current entry. + /// + /// The name of the class to remove. + public void RemoveClass(string className) + { + _classes.Remove(className); + _optionalClasses.Remove(className); + } - /// - /// Sets a metadata value under the specified key in the entry. - /// - /// The key to store the data under. - /// The value to store. - public void SetMetadata(string key, object value) - { - if (string.IsNullOrEmpty(key)) throw new ArgumentNullException(nameof(key)); - if (_metadata == null) _metadata = new Dictionary(INITIAL_METADATA_CAPACITY); - _metadata[key] = value; - } + /// + /// Sets a metadata value under the specified key in the entry. + /// + /// The key to store the data under. + /// The value to store. + public void SetMetadata(string key, object value) + { + if (string.IsNullOrEmpty(key)) throw new ArgumentNullException(nameof(key)); + if (_metadata == null) _metadata = new Dictionary(INITIAL_METADATA_CAPACITY); + _metadata[key] = value; + } - /// - /// Removes the metadata with the specified key from the entry. - /// - /// The key of the metadata entry to remove. - /// - public bool RemoveMetadata(string key) - { - return key != null && _metadata != null && _metadata.Remove(key); - } + /// + /// Removes the metadata with the specified key from the entry. + /// + /// The key of the metadata entry to remove. + /// + public bool RemoveMetadata(string key) + { + return key != null && _metadata != null && _metadata.Remove(key); + } - /// - /// Enumerates all the metadata keys contained in the entry. - /// - /// - public IEnumerable GetMetadataKeys() - { - if (_metadata == null) yield break; - foreach (string key in _metadata.Keys) yield return key; - } + /// + /// Enumerates all the metadata keys contained in the entry. + /// + /// + public IEnumerable GetMetadataKeys() + { + if (_metadata == null) yield break; + foreach (string key in _metadata.Keys) yield return key; + } - /// - /// Locates and returns the metadata value associated with the specified key. Returns Null if not found. - /// - /// The key of the metadata to retrieve. - /// - public object GetMetadata(string key) - { - if (_metadata == null) return null; + /// + /// Locates and returns the metadata value associated with the specified key. Returns Null if not found. + /// + /// The key of the metadata to retrieve. + /// + public object GetMetadata(string key) + { + if (_metadata == null) return null; return !_metadata.TryGetValue(key, out object result) ? null : result; } - /// - /// Determines if the entry contains metadata attached to the specified key. - /// - /// The key to search for. - /// - public bool ContainsMetadataKey(string key) - { - if (key == null || _metadata == null) return false; - return _metadata.ContainsKey(key); - } + /// + /// Determines if the entry contains metadata attached to the specified key. + /// + /// The key to search for. + /// + public bool ContainsMetadataKey(string key) + { + if (key == null || _metadata == null) return false; + return _metadata.ContainsKey(key); + } - /// - /// Returns a boolean valie indicating whether the current entry contains the specified class. - /// - /// The class to search for. - /// - public bool ContainsClass(string className) => _classes.Contains(className); + /// + /// Returns a boolean valie indicating whether the current entry contains the specified class. + /// + /// The class to search for. + /// + public bool ContainsClass(string className) => _classes.Contains(className); - /// - /// Returns a collection of required (non-optional) classes assigned to the current entry. - /// - /// - public IEnumerable GetRequiredClasses() => _classes.Except(_optionalClasses); + /// + /// Returns a collection of required (non-optional) classes assigned to the current entry. + /// + /// + public IEnumerable GetRequiredClasses() => _classes.Except(_optionalClasses); - /// - /// Returns a string representation of the current instance. - /// - /// - public override string ToString() => _terms.Any() ? _terms[0].Value : "???"; - } + /// + /// Returns a string representation of the current instance. + /// + /// + public override string ToString() => _terms.Any() ? _terms[0].Value : "???"; + } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index 09c3cfe..48ff29b 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -42,7 +42,7 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) string name = null; // Stores the table name before final table construction int termsPerEntry = 0; // Stores the term count var subtypes = new Dictionary(); // Stores subtypes before final table construction - var hidden = new HashSet(StringComparer.InvariantCultureIgnoreCase); + var hidden = new HashSet(StringComparer.InvariantCultureIgnoreCase); RantDictionaryTable table = null; // The table object, constructed when first entry is found string l; // Current line string int line = 0; // Current line number @@ -79,140 +79,142 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) // Directive case '@': - { - // Read directive name - int dPos = i; - if (!Tools.ReadDirectiveName(l, len, ref i, out string directiveName)) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-directive-name"); + { + // Read directive name + int dPos = i; + if (!Tools.ReadDirectiveName(l, len, ref i, out string directiveName)) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-directive-name"); - // Read arguments - var args = new List(); - while (Tools.ReadArg(origin, l, len, line, ref i, out Argument arg)) args.Add(arg); + // Read arguments + var args = new List(); + while (Tools.ReadArg(origin, l, len, line, ref i, out Argument arg)) args.Add(arg); - switch (directiveName.ToLowerInvariant()) + switch (directiveName.ToLowerInvariant()) + { + // Table name definition + case "name": { - // Table name definition - case "name": - { - // Do not allow this to appear anywhere except at the top of the file - if (table != null) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); - // Do not allow multiple @name directives - if (name != null) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-multiple-names"); - // One argument required - if (args.Count != 1) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-name-args"); - // Must meet standard identifier requirements - if (!Util.ValidateName(args[0].Value)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-name", args[0].Value); - name = args[0].Value; - break; - } + // Do not allow this to appear anywhere except at the top of the file + if (table != null) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); + // Do not allow multiple @name directives + if (name != null) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-multiple-names"); + // One argument required + if (args.Count != 1) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-name-args"); + // Must meet standard identifier requirements + if (!Util.ValidateName(args[0].Value)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-name", args[0].Value); + name = args[0].Value; + break; + } - // Subtype definition - case "sub": + // Subtype definition + case "sub": + { + // Do not allow this to appear anywhere except at the top of the file + if (table != null) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); + // @sub requires at least one argument + if (args.Count == 0) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-subtype-args"); + + // If the first argument is a number, use it as the subtype index. + if (int.TryParse(args[0].Value, out int termIndex)) + { + // Disallow negative term indices + if (termIndex < 0) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-index-negative", termIndex); + // Requires at least one name + if (args.Count < 2) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-missing-name"); + // If the index is outside the current term index range, increase the number. + if (termIndex >= termsPerEntry) + termsPerEntry = termIndex + 1; + // Assign all following names to the index + for (int j = 1; j < args.Count; j++) { - // Do not allow this to appear anywhere except at the top of the file - if (table != null) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-misplaced-header-directive"); - // @sub requires at least one argument - if (args.Count == 0) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-subtype-args"); - - // If the first argument is a number, use it as the subtype index. - if (int.TryParse(args[0].Value, out int termIndex)) - { - // Disallow negative term indices - if (termIndex < 0) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-index-negative", termIndex); - // Requires at least one name - if (args.Count < 2) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-sub-missing-name"); - // If the index is outside the current term index range, increase the number. - if (termIndex >= termsPerEntry) - termsPerEntry = termIndex + 1; - // Assign all following names to the index - for (int j = 1; j < args.Count; j++) - { - // Validate subtype name - if (!Util.ValidateName(args[j].Value)) - throw new RantTableLoadException(origin, line, args[j].CharIndex + 1, "err-table-bad-subtype", args[j].Value); - subtypes[args[j].Value] = termIndex; - } - } - else - { - // Add to last index - termIndex = termsPerEntry++; - // Assign all following names to the index - foreach (var a in args) - { - // Validate subtype name - if (!Util.ValidateName(a.Value)) - throw new RantTableLoadException(origin, line, a.CharIndex + 1, "err-table-bad-subtype", a.Value); - subtypes[a.Value] = termIndex; - } - } - break; + // Validate subtype name + if (!Util.ValidateName(args[j].Value)) + throw new RantTableLoadException(origin, line, args[j].CharIndex + 1, "err-table-bad-subtype", args[j].Value); + subtypes[args[j].Value] = termIndex; } - case "hide": - if (args.Count == 0) break; - foreach(var a in args) - { - if (!Util.ValidateName(a.Value)) - throw new RantTableLoadException(origin, line, i, "err-table-invalid-class", a.Value); - hidden.Add(String.Intern(a.Value)); - } - break; - case "dummy": - if (args.Count != 0) - throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 0, args.Count); - dummy = true; - break; - case "id": - if (args.Count != 1) - throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); - if (!Util.ValidateName(args[0].Value)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); - tId = args[0].Value; - break; - case "using": - if (args.Count != 1) - throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); - if (!Util.ValidateName(args[0].Value)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); - if (!templates.TryGetValue(args[0].Value, out activeTemplate)) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-template-not-found", args[0].Value); - break; - case "class": + } + else + { + // Add to last index + termIndex = termsPerEntry++; + // Assign all following names to the index + foreach (var a in args) { - var cList = new List(); - if (args.Count == 0) - throw new RantTableLoadException(origin, line, i, "err-table-args-expected", directiveName); - foreach (var cArg in args) - { - if (!Tools.ValidateClassName(cArg.Value)) - throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); - cList.Add(cArg.Value); - autoClasses.Add(cArg.Value); - } - autoClassStack.Push(cList); - break; + // Validate subtype name + if (!Util.ValidateName(a.Value)) + throw new RantTableLoadException(origin, line, a.CharIndex + 1, "err-table-bad-subtype", a.Value); + subtypes[a.Value] = termIndex; } - case "endclass": + } + break; + } + case "hide": + if (args.Count == 0) break; + foreach (var a in args) + { + if (!Util.ValidateName(a.Value)) + throw new RantTableLoadException(origin, line, i, "err-table-invalid-class", a.Value); + hidden.Add(String.Intern(a.Value)); + } + break; + case "dummy": + if (args.Count != 0) + throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 0, args.Count); + dummy = true; + break; + case "id": + if (args.Count != 1) + throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); + if (!Util.ValidateName(args[0].Value)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); + tId = args[0].Value; + break; + case "using": + if (args.Count != 1) + throw new RantTableLoadException(origin, line, i, "err-table-argc-mismatch", directiveName, 1, args.Count); + if (!Util.ValidateName(args[0].Value)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-bad-template-id", args[0].Value); + if (!templates.TryGetValue(args[0].Value, out activeTemplate)) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-template-not-found", args[0].Value); + break; + case "class": + { + var cList = new List(); + if (args.Count == 0) + throw new RantTableLoadException(origin, line, i, "err-table-args-expected", directiveName); + foreach (var cArg in args) + { + if (!Tools.ValidateClassName(cArg.Value)) + throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); + cList.Add(cArg.Value); + autoClasses.Add(cArg.Value); + } + autoClassStack.Push(cList); + break; + } + case "endclass": + { + if (args.Count == 0) + { + if (autoClassStack.Count > 0) { - if (args.Count == 0) - { - if (autoClassStack.Count > 0) - foreach (string cName in autoClassStack.Pop()) - autoClasses.Remove(cName); - } - break; + foreach (string cName in autoClassStack.Pop()) + autoClasses.Remove(cName); } + } + break; } - break; } + break; + } // Entry case '>': @@ -231,64 +233,62 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) // Property case '-': - { - Tools.ConstructTable(origin, name, subtypes, ref termsPerEntry, ref table); - Tools.SkipSpace(l, len, ref i); + { + Tools.ConstructTable(origin, name, subtypes, ref termsPerEntry, ref table); + Tools.SkipSpace(l, len, ref i); - // Read property name - int dPos = i; - if (!Tools.ReadDirectiveName(l, len, ref i, out string propName)) - throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-property-name"); + // Read property name + int dPos = i; + if (!Tools.ReadDirectiveName(l, len, ref i, out string propName)) + throw new RantTableLoadException(origin, line, dPos + 1, "err-table-missing-property-name"); - // Read arguments - var args = new List(); - while (Tools.ReadArg(origin, l, len, line, ref i, out Argument arg)) args.Add(arg); + // Read arguments + var args = new List(); + while (Tools.ReadArg(origin, l, len, line, ref i, out Argument arg)) args.Add(arg); - // No args? Skip it. - if (args.Count == 0) - continue; + // No args? Skip it. + if (args.Count == 0) + continue; - switch (propName.ToLowerInvariant()) + switch (propName.ToLowerInvariant()) + { + case "class": + foreach (var cArg in args) + { + if (!Tools.ValidateClassName(cArg.Value)) + throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); + currentEntry.AddClass(cArg.Value); + } + break; + case "weight": { - case "class": - foreach (var cArg in args) - { - if (!Tools.ValidateClassName(cArg.Value)) - throw new RantTableLoadException(origin, line, cArg.CharIndex + 1, "err-table-invalid-class", cArg.Value); - currentEntry.AddClass(cArg.Value); - } - break; - case "weight": - { - if (!int.TryParse(args[0].Value, out int weight) || weight <= 0) - throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-weight", args[0].Value); - currentEntry.Weight = weight; - break; - } - case "pron": - if (args.Count != table.TermsPerEntry) - continue; - for (int j = 0; j < currentEntry.TermCount; j++) - currentEntry[j].Pronunciation = args[j].Value; - break; - default: - if (args.Count == 1) - currentEntry.SetMetadata(propName, args[0].Value); - else - currentEntry.SetMetadata(propName, args.Select(a => a.Value).ToArray()); - break; + if (!int.TryParse(args[0].Value, out int weight) || weight <= 0) + throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-weight", args[0].Value); + currentEntry.Weight = weight; + break; } - break; + case "pron": + if (args.Count != table.TermsPerEntry) + continue; + for (int j = 0; j < currentEntry.TermCount; j++) + currentEntry[j].Pronunciation = args[j].Value; + break; + default: + if (args.Count == 1) + currentEntry.SetMetadata(propName, args[0].Value); + else + currentEntry.SetMetadata(propName, args.Select(a => a.Value).ToArray()); + break; } + break; + } } } } - // Add hidden classes - foreach(var hc in hidden) - { - table.HideClass(hc); - } + // Add hidden classes + foreach (string hc in hidden) + table.HideClass(hc); table.Commit(); @@ -347,7 +347,7 @@ public static bool ValidateClassName(string input) { if (input == null || input.Length == 0) return false; for (int i = 0; i < input.Length; i++) - if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' && (i < input.Length - 1 && input[i] == '?')) return false; + if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' && i < input.Length - 1 && input[i] == '?') return false; return true; } @@ -365,6 +365,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i var buffer = new StringBuilder(); var white = new StringBuilder(); while (i < len) + { switch (c = str[i++]) { // Inline comment @@ -380,138 +381,138 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i break; // Term reference case '[': + { + SkipSpace(str, len, ref i); + if (i >= len) + throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); + int start = i; + if (white.Length > 0) { - SkipSpace(str, len, ref i); - if (i >= len) - throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); - int start = i; - if (white.Length > 0) + buffer.Append(white); + white.Length = 0; + } + switch (str[i++]) + { + // Current term from active template + case ']': + if (t == -1) + throw new RantTableLoadException(origin, line, start + 1, "err-table-no-template"); + buffer.Append(activeTemplate[t].Value); + break; + // Custom term from active template + case '.': { - buffer.Append(white); - white.Length = 0; + if (activeTemplate == null) + throw new RantTableLoadException(origin, line, start + 1, "err-table-no-template"); + while (i < len && IsValidSubtypeChar(str[i])) i++; // Read subtype name + if (str[i] != ']') + throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); + string subName = str.Substring(start + 1, i - start - 1); + if (subName.Length == 0) + throw new RantTableLoadException(origin, line, start + 1, "err-table-empty-subtype-reference"); + int templateSubIndex = table.GetSubtypeIndex(subName); + if (templateSubIndex == -1) + throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", subName); + + // Add term value to buffer + buffer.Append(activeTemplate[templateSubIndex].Value); + i++; // Skip past closing bracket + break; } - switch (str[i++]) + // It is probably a reference to another entry, let's see. + default: { - // Current term from active template - case ']': - if (t == -1) - throw new RantTableLoadException(origin, line, start + 1, "err-table-no-template"); - buffer.Append(activeTemplate[t].Value); - break; - // Custom term from active template - case '.': + while (i < len && IsValidSubtypeChar(str[i]) || str[i] == '.') i++; + if (str[i] != ']') + throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); + var id = str.Substring(start, i - start).Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); + switch (id.Length) + { + // It's just a template ID. + case 1: { - if (activeTemplate == null) - throw new RantTableLoadException(origin, line, start + 1, "err-table-no-template"); - while (i < len && IsValidSubtypeChar(str[i])) i++; // Read subtype name - if (str[i] != ']') - throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); - string subName = str.Substring(start + 1, i - start - 1); - if (subName.Length == 0) - throw new RantTableLoadException(origin, line, start + 1, "err-table-empty-subtype-reference"); - int templateSubIndex = table.GetSubtypeIndex(subName); - if (templateSubIndex == -1) - throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", subName); - - // Add term value to buffer - buffer.Append(activeTemplate[templateSubIndex].Value); - i++; // Skip past closing bracket + if (!templates.TryGetValue(id[0], out RantDictionaryEntry entry)) + throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); + // Append term value to buffer + buffer.Append(entry[t].Value); break; } - // It is probably a reference to another entry, let's see. - default: + // Template ID and custom subtype + case 2: { - while (i < len && IsValidSubtypeChar(str[i]) || str[i] == '.') i++; - if (str[i] != ']') - throw new RantTableLoadException(origin, line, i, "err-table-incomplete-term-reference"); - var id = str.Substring(start, i - start).Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); - switch (id.Length) - { - // It's just a template ID. - case 1: - { - if (!templates.TryGetValue(id[0], out RantDictionaryEntry entry)) - throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); - // Append term value to buffer - buffer.Append(entry[t].Value); - break; - } - // Template ID and custom subtype - case 2: - { - if (!templates.TryGetValue(id[0], out RantDictionaryEntry entry)) - throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); - int templateSubIndex = table.GetSubtypeIndex(id[1]); - if (templateSubIndex == -1 || templateSubIndex >= table.TermsPerEntry) - throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", id[1]); - buffer.Append(entry[templateSubIndex].Value); - break; - } - // ??? - default: - throw new RantTableLoadException(origin, line, start + 1, "err-table-invalid-term-reference"); - } - - i++; // Skip past closing bracket + if (!templates.TryGetValue(id[0], out RantDictionaryEntry entry)) + throw new RantTableLoadException(origin, line, start + 1, "err-table-entry-not-found"); + int templateSubIndex = table.GetSubtypeIndex(id[1]); + if (templateSubIndex == -1 || templateSubIndex >= table.TermsPerEntry) + throw new RantTableLoadException(origin, line, start + 1, "err-table-nonexistent-subtype", id[1]); + buffer.Append(entry[templateSubIndex].Value); break; } + // ??? + default: + throw new RantTableLoadException(origin, line, start + 1, "err-table-invalid-term-reference"); + } + + i++; // Skip past closing bracket + break; } - break; } + break; + } case '\\': + { + if (white.Length > 0) { - if (white.Length > 0) + buffer.Append(white); + white.Length = 0; + } + switch (c = str[i++]) + { + case 'n': + buffer.Append('\n'); + continue; + case 'r': + buffer.Append('\r'); + continue; + case 't': + buffer.Append('\t'); + continue; + case 'v': + buffer.Append('\v'); + continue; + case 'f': + buffer.Append('\f'); + continue; + case 'b': + buffer.Append('\b'); + continue; + case 's': + buffer.Append(' '); + continue; + case 'u': { - buffer.Append(white); - white.Length = 0; + if (i + 4 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append((char)codePoint); + i += 4; + continue; } - switch (c = str[i++]) + case 'U': { - case 'n': - buffer.Append('\n'); - continue; - case 'r': - buffer.Append('\r'); - continue; - case 't': - buffer.Append('\t'); - continue; - case 'v': - buffer.Append('\v'); - continue; - case 'f': - buffer.Append('\f'); - continue; - case 'b': - buffer.Append('\b'); - continue; - case 's': - buffer.Append(' '); - continue; - case 'u': - { - if (i + 4 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append((char)codePoint); - i += 4; - continue; - } - case 'U': - { - if (i + 8 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append(high).Append(low); - i += 8; - continue; - } - default: - buffer.Append(c); - continue; + if (i + 8 > len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append(high).Append(low); + i += 8; + continue; } - continue; + default: + buffer.Append(c); + continue; } + continue; + } case ',': if (t >= terms.Length) throw new RantTableLoadException(origin, line, i, "err-table-too-many-terms", terms.Length, t); @@ -523,9 +524,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i break; default: if (char.IsWhiteSpace(c)) - { white.Append(c); - } else { if (white.Length > 0) @@ -537,6 +536,7 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i } continue; } + } done: @@ -550,14 +550,10 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i // Add classes from template if (activeTemplate != null) { - foreach(var cl in activeTemplate.GetRequiredClasses()) - { + foreach (string cl in activeTemplate.GetRequiredClasses()) result.AddClass(cl, false); - } - foreach (var cl in activeTemplate.GetOptionalClasses()) - { + foreach (string cl in activeTemplate.GetOptionalClasses()) result.AddClass(cl, true); - } } } @@ -583,6 +579,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int { if (++i >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); while (i < len) + { switch (c = str[i++]) { case '\"': @@ -616,23 +613,23 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int buffer.Append(' '); continue; case 'u': - { - if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append((char)codePoint); - i += 4; - continue; - } + { + if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append((char)codePoint); + i += 4; + continue; + } case 'U': - { - if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append(high).Append(low); - i += 8; - continue; - } + { + if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append(high).Append(low); + i += 8; + continue; + } default: buffer.Append(c); continue; @@ -642,6 +639,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int buffer.Append(c); break; } + } throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); } @@ -649,6 +647,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int // If it isn't a string literal, simply read until a comma is reached. while (i < len) + { switch (c = str[i++]) { case ',': @@ -659,66 +658,64 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int i = len; return true; case '\\': + { + if (white.Length > 0) { - if (white.Length > 0) + buffer.Append(white); + white.Length = 0; + } + switch (c = str[i++]) + { + case 'n': + buffer.Append('\n'); + continue; + case 'r': + buffer.Append('\r'); + continue; + case 't': + buffer.Append('\t'); + continue; + case 'v': + buffer.Append('\v'); + continue; + case 'f': + buffer.Append('\f'); + continue; + case 'b': + buffer.Append('\b'); + continue; + case 's': + buffer.Append(' '); + continue; + case 'u': { - buffer.Append(white); - white.Length = 0; + if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append((char)codePoint); + i += 4; + continue; } - switch (c = str[i++]) + case 'U': { - case 'n': - buffer.Append('\n'); - continue; - case 'r': - buffer.Append('\r'); - continue; - case 't': - buffer.Append('\t'); - continue; - case 'v': - buffer.Append('\v'); - continue; - case 'f': - buffer.Append('\f'); - continue; - case 'b': - buffer.Append('\b'); - continue; - case 's': - buffer.Append(' '); - continue; - case 'u': - { - if (i + 4 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - if (!ushort.TryParse(str.Substring(i, 4), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out ushort codePoint)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append((char)codePoint); - i += 4; - continue; - } - case 'U': - { - if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); - if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) - throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); - buffer.Append(high).Append(low); - i += 8; - continue; - } - default: - buffer.Append(c); - continue; + if (i + 8 >= len) throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-escape"); + if (!Util.TryParseSurrogatePair(str.Substring(i, 8), out char high, out char low)) + throw new RantTableLoadException(origin, line, i + 1, "err-table-unrecognized-codepoint"); + buffer.Append(high).Append(low); + i += 8; + continue; } - continue; + default: + buffer.Append(c); + continue; } + continue; + } case '\"': throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); default: if (char.IsWhiteSpace(c)) - { white.Append(c); - } else { if (white.Length > 0) @@ -730,6 +727,7 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int } continue; } + } result = new Argument(start, buffer.ToString()); return true; @@ -749,4 +747,4 @@ public Argument(int charIndex, string value) public override string ToString() => Value; } } -} +} \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 352dc1f..b31ae03 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -31,433 +31,421 @@ using Rant.Core.IO.Bson; using Rant.Core.Utilities; using Rant.Resources; -using Rant.Vocabulary.Utilities; using Rant.Vocabulary.Querying; +using Rant.Vocabulary.Utilities; namespace Rant.Vocabulary { - /// - /// Represents a named collection of dictionary entries. - /// - public sealed partial class RantDictionaryTable : RantResource - { - internal const string NSFW = "nsfw"; - internal const string MissingTerm = "[?]"; - private readonly HashSet _entriesHash = new HashSet(); - private readonly List _entriesList = new List(); // TODO: Use for indexing / weighted selection - private readonly HashSet _hidden = new HashSet(new[] { NSFW }); - private readonly Dictionary> _subtypeIndexMap = new Dictionary>(); - private readonly Dictionary _subtypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - private ClassTree _classTree = new ClassTree(new RantDictionaryEntry[] { }); - private SyllableBuckets[] _syllableBuckets; - - /// - /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. - /// - /// The name of the table. - /// The number of terms to store in each entry. - public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) - { - if (name == null) throw new ArgumentNullException(nameof(name)); - if (termsPerEntry <= 0) throw new ArgumentException("Terms per entry must be greater than zero."); - if (!Util.ValidateName(name)) throw new ArgumentException($"Invalid table name: '{name}'"); - if (hidden != null) _hidden = hidden; - TermsPerEntry = termsPerEntry; - Name = name; - - CreateSyllableBuckets(); - } - - internal RantDictionaryTable() - { - // Used by serializer - } - - /// - /// Gets the name of the table. - /// - public string Name { get; private set; } - - /// - /// Gets the language code associated with the table (not yet used). - /// - public string Language { get; private set; } = "en-US"; - - /// - /// Gets the hidden classes of the table. - /// - public IEnumerable HiddenClasses => _hidden.AsEnumerable(); - - /// - /// Gets the number of entries stored in the table. - /// - public int EntryCount => _entriesHash.Count; - - /// - /// Gets the number of terms required for entries contained in the current table. - /// - public int TermsPerEntry { get; private set; } - - /// - /// Enumerates the entries stored in the table. - /// - /// - public IEnumerable GetEntries() - { - foreach (var entry in _entriesHash) yield return entry; - } - - /// - /// Enumerates the subtypes contained in the current table. - /// - /// - public IEnumerable GetSubtypes() => _subtypes.Keys; - - /// - /// Determines whether the specified class is hidden by the table. - /// - /// The name of the class to check. - /// - public bool IsClassHidden(string className) - { - if (className == null) throw new ArgumentNullException(nameof(className)); - return _hidden.Contains(className); - } - - /// - /// Hides the specified class. - /// - /// The name of the class to hide. - /// - public bool HideClass(string className) => Util.ValidateName(className) && _hidden.Add(className); - - /// - /// Unhides the specified class. - /// - /// The name of the class to unhide. - /// - public bool UnhideClass(string className) => className != null && _hidden.Remove(className); - - /// - /// Adds the specified entry to the table. - /// - /// The entry to add to the table. - /// True if successfully added; otherwise, False. - public bool AddEntry(RantDictionaryEntry entry) - { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - if (entry.TermCount != TermsPerEntry) return false; - if (!_entriesHash.Add(entry)) return false; - _entriesList.Add(entry); - return true; - } - - /// - /// Removes the specified entry from the table. - /// - /// The entry to remove from the table. - /// True if successfully removed; otherwise, False. - public bool RemoveEntry(RantDictionaryEntry entry) - { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - if (!_entriesHash.Remove(entry)) return false; - _entriesList.Remove(entry); - return true; - } - - /// - /// Checks if the table contains the specified entry. - /// - /// The entry to search for. - /// True if found, False if not. - public bool ContainsEntry(RantDictionaryEntry entry) - { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - return _entriesHash.Contains(entry); - } - - /// - /// Searches entries in the current table and enumerates every single distinct class found. - /// - /// - public IEnumerable GetClasses() - { - var lstClasses = new HashSet(); - - foreach (string c in _entriesHash.SelectMany(e => e.GetClasses())) - if (lstClasses.Add(c)) yield return c; - } - - /// - /// Adds a subtype of the specified name to the table. - /// If a subtype with the name already exists, it will be overwritten. - /// Subtypes are case insensitive. - /// If the name is not a valid identifier string, it will not be accepted. - /// - /// The name of the subtype to add. - /// The term index to associate with the name. - /// - /// FALSE if the name was not a valid identifier or the index was out of range. TRUE if the operation was - /// successful. - /// - public bool AddSubtype(string subtypeName, int index) - { - if (index < 0 || index >= TermsPerEntry) return false; - if (subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); - if (!Util.ValidateName(subtypeName)) return false; - _subtypes[subtypeName] = index; + /// + /// Represents a named collection of dictionary entries. + /// + public sealed partial class RantDictionaryTable : RantResource + { + internal const string NSFW = "nsfw"; + internal const string MissingTerm = "[?]"; + private readonly HashSet _entriesHash = new HashSet(); + private readonly List _entriesList = new List(); // TODO: Use for indexing / weighted selection + private readonly HashSet _hidden = new HashSet(new[] { NSFW }); + private readonly Dictionary> _subtypeIndexMap = new Dictionary>(); + private readonly Dictionary _subtypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + private ClassTree _classTree = new ClassTree(new RantDictionaryEntry[] { }); + private SyllableBuckets[] _syllableBuckets; + + /// + /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. + /// + /// The name of the table. + /// The number of terms to store in each entry. + public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) + { + if (name == null) throw new ArgumentNullException(nameof(name)); + if (termsPerEntry <= 0) throw new ArgumentException("Terms per entry must be greater than zero."); + if (!Util.ValidateName(name)) throw new ArgumentException($"Invalid table name: '{name}'"); + if (hidden != null) _hidden = hidden; + TermsPerEntry = termsPerEntry; + Name = name; + + CreateSyllableBuckets(); + } + + internal RantDictionaryTable() + { + // Used by serializer + } + + /// + /// Gets the name of the table. + /// + public string Name { get; private set; } + + /// + /// Gets the language code associated with the table (not yet used). + /// + public string Language { get; private set; } = "en-US"; + + /// + /// Gets the hidden classes of the table. + /// + public IEnumerable HiddenClasses => _hidden.AsEnumerable(); + + /// + /// Gets the number of entries stored in the table. + /// + public int EntryCount => _entriesHash.Count; + + /// + /// Gets the number of terms required for entries contained in the current table. + /// + public int TermsPerEntry { get; private set; } + + /// + /// Enumerates the entries stored in the table. + /// + /// + public IEnumerable GetEntries() + { + foreach (var entry in _entriesHash) yield return entry; + } + + /// + /// Enumerates the subtypes contained in the current table. + /// + /// + public IEnumerable GetSubtypes() => _subtypes.Keys; + + /// + /// Determines whether the specified class is hidden by the table. + /// + /// The name of the class to check. + /// + public bool IsClassHidden(string className) + { + if (className == null) throw new ArgumentNullException(nameof(className)); + return _hidden.Contains(className); + } + + /// + /// Hides the specified class. + /// + /// The name of the class to hide. + /// + public bool HideClass(string className) => Util.ValidateName(className) && _hidden.Add(className); + + /// + /// Unhides the specified class. + /// + /// The name of the class to unhide. + /// + public bool UnhideClass(string className) => className != null && _hidden.Remove(className); + + /// + /// Adds the specified entry to the table. + /// + /// The entry to add to the table. + /// True if successfully added; otherwise, False. + public bool AddEntry(RantDictionaryEntry entry) + { + if (entry == null) throw new ArgumentNullException(nameof(entry)); + if (entry.TermCount != TermsPerEntry) return false; + if (!_entriesHash.Add(entry)) return false; + _entriesList.Add(entry); + return true; + } + + /// + /// Removes the specified entry from the table. + /// + /// The entry to remove from the table. + /// True if successfully removed; otherwise, False. + public bool RemoveEntry(RantDictionaryEntry entry) + { + if (entry == null) throw new ArgumentNullException(nameof(entry)); + if (!_entriesHash.Remove(entry)) return false; + _entriesList.Remove(entry); + return true; + } + + /// + /// Checks if the table contains the specified entry. + /// + /// The entry to search for. + /// True if found, False if not. + public bool ContainsEntry(RantDictionaryEntry entry) + { + if (entry == null) throw new ArgumentNullException(nameof(entry)); + return _entriesHash.Contains(entry); + } + + /// + /// Searches entries in the current table and enumerates every single distinct class found. + /// + /// + public IEnumerable GetClasses() + { + var lstClasses = new HashSet(); + + foreach (string c in _entriesHash.SelectMany(e => e.GetClasses())) + if (lstClasses.Add(c)) yield return c; + } + + /// + /// Adds a subtype of the specified name to the table. + /// If a subtype with the name already exists, it will be overwritten. + /// Subtypes are case insensitive. + /// If the name is not a valid identifier string, it will not be accepted. + /// + /// The name of the subtype to add. + /// The term index to associate with the name. + /// + /// FALSE if the name was not a valid identifier or the index was out of range. TRUE if the operation was + /// successful. + /// + public bool AddSubtype(string subtypeName, int index) + { + if (index < 0 || index >= TermsPerEntry) return false; + if (subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); + if (!Util.ValidateName(subtypeName)) return false; + _subtypes[subtypeName] = index; if (!_subtypeIndexMap.TryGetValue(index, out HashSet subs)) _subtypeIndexMap[index] = subs = new HashSet(); subs.Add(subtypeName); - return true; - } - - /// - /// Removes the specified subtype from the table, if it exists. - /// Subtypes are case insensitive. - /// - /// The name of the subtype to remove. - /// TRUE if the subtype was found and removed. FALSE if the subtype was not found. - public bool RemoveSubtype(string subtypeName) - { - if (Util.IsNullOrWhiteSpace(subtypeName)) return false; - if (!_subtypes.ContainsKey(subtypeName)) return false; + return true; + } + + /// + /// Removes the specified subtype from the table, if it exists. + /// Subtypes are case insensitive. + /// + /// The name of the subtype to remove. + /// TRUE if the subtype was found and removed. FALSE if the subtype was not found. + public bool RemoveSubtype(string subtypeName) + { + if (Util.IsNullOrWhiteSpace(subtypeName)) return false; + if (!_subtypes.ContainsKey(subtypeName)) return false; if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out HashSet subs)) return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); return false; - } - - /// - /// Retrieves the term index assigned to the specified subtype. - /// If the subtype is not found, the method will return -1. - /// If the subtype is a null, whitespace, or an empty string, the method will return 0. - /// - /// The subtype to look up. - /// - public int GetSubtypeIndex(string subtype) - { - if (Util.IsNullOrWhiteSpace(subtype)) return 0; - if (!Util.ValidateName(subtype)) return -1; + } + + /// + /// Retrieves the term index assigned to the specified subtype. + /// If the subtype is not found, the method will return -1. + /// If the subtype is a null, whitespace, or an empty string, the method will return 0. + /// + /// The subtype to look up. + /// + public int GetSubtypeIndex(string subtype) + { + if (Util.IsNullOrWhiteSpace(subtype)) return 0; + if (!Util.ValidateName(subtype)) return -1; if (int.TryParse(subtype, out int index) && index >= 0) return index; return _subtypes.TryGetValue(subtype, out index) ? index : -1; - } - - /// - /// Enumerates the subtypes associated with the specified term index. - /// - /// The index to get subtypes for. - /// - public IEnumerable GetSubtypesForIndex(int index) - { - if (index < 0 || index >= TermsPerEntry) yield break; + } + + /// + /// Enumerates the subtypes associated with the specified term index. + /// + /// The index to get subtypes for. + /// + public IEnumerable GetSubtypesForIndex(int index) + { + if (index < 0 || index >= TermsPerEntry) yield break; if (!_subtypeIndexMap.TryGetValue(index, out HashSet subs)) yield break; foreach (string sub in subs) yield return sub; - } - - /// - /// Adds another table's entries to the current table, given that they share the same name and term count. - /// - /// The table whose entries will be added to the current instance. - /// True if merge succeeded; otherwise, False. - public bool Merge(RantDictionaryTable other) - { - if (other.Name != Name || other == this) return false; - if (other.TermsPerEntry != TermsPerEntry) return false; - _entriesHash.AddRange(other._entriesHash); - _entriesList.AddRange(other._entriesHash); - Commit(); - return true; - } - - /// - /// Optimizes the table. Call this after writing items to the table or removing items from a table. - /// If you're writing or removing multiple items, call this after all the actions have been performed. - /// - public void Commit() - { - _classTree = new ClassTree(_entriesHash); - CreateSyllableBuckets(); - for (var i = 0; i < TermsPerEntry; i++) - { - _syllableBuckets[i] = new SyllableBuckets(i, _entriesList); - } - } - - internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) - { - int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() - ? GetSubtypeIndex(query.PluralSubtype) - : GetSubtypeIndex(query.Subtype); - - if (index == -1) return null; - - if (query.BareQuery) return _entriesList.PickEntry(sb.RNG)?[index]; - - // process simple class filters using class tree - var filters = query.GetFilters(); - var classes = filters - .Where(f => f is ClassFilter) - .SelectMany(f => (f as ClassFilter).RequiredClasses); - - filters = filters.Where(f => !(f is ClassFilter) || !(f as ClassFilter).SimpleFilter); - - IEnumerable pool = _entriesList; - if (classes.Any()) - { - pool = _classTree.Query(classes); - } - - // if it's just the class filters, let's leave now - if (!filters.Any() && !query.HasCarrier) - { - return pool.ToList().PickEntry(sb.RNG)?[index]; - } - - // process syllable count filters using syllable buckets - var rangeFilters = filters.Where(f => f is RangeFilter).Select(f => f as RangeFilter); - if (rangeFilters.Any()) - { - CreateSyllableBuckets(); - - foreach (var filter in rangeFilters) - { - pool = pool.Intersect(_syllableBuckets[index].Query(filter)); - } - - filters = filters.Where(f => !(f is RangeFilter)); - } - - if (filters.Any()) - { - pool = pool.Where((e, i) => filters.OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, index, query))); - } - - if (!pool.Any()) return null; - - if (query.HasCarrier) - { - return syncState.GetEntry(query.Carrier, index, pool, sb.RNG)?[index]; - } - - return pool.PickEntry(sb.RNG)?[index]; - } - - internal override void DeserializeData(BsonItem data) - { - // General data - Name = data["name"]; - TermsPerEntry = data["termc"]; - Language = data["lang"]; - - // Subtypes - var subs = data["subs"].Values; - int si = 0; - foreach (var subList in subs) - { - foreach (var sub in subList.Values) AddSubtype(sub, si); - si++; - } - - // Hidden classes - foreach (var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); - - var entries = data["entries"]; - int count = entries.Count; - - // Entries - for (int i = 0; i < count; i++) - { - var entryData = entries[i]; - - // Terms - var terms = - from BsonItem termData in entryData["terms"].Values - let value = (string)termData["value"] - let pron = (string)termData["pron"] - let valueSplit = (int)(termData["value-split"] ?? -1) - let pronSplit = (int)(termData["pron-split"] ?? -1) - select new RantDictionaryTerm(value, pron, valueSplit, pronSplit); - - var entryClasses = (string[])entryData["classes"]; - var termArray = terms.ToArray(); - var entry = new RantDictionaryEntry(termArray, entryClasses, entryData["weight"] ?? 1); - - // Optional classes - foreach (var optionalClass in entryData["optional-classes"].Values) - entry.AddClass(optionalClass, true); - - // Metadata - var meta = entryData["metadata"]; - foreach (string metaKey in meta.Keys) - entry.SetMetadata(metaKey, meta[metaKey].Value); - - AddEntry(entry); - } - - Commit(); - } - - internal override BsonItem SerializeData() - { - var data = new BsonItem - { - ["name"] = Name, - ["lang"] = Language, - ["termc"] = TermsPerEntry - }; - - var subs = new BsonItem[TermsPerEntry]; - for (int i = 0; i < TermsPerEntry; i++) - subs[i] = new BsonItem(GetSubtypesForIndex(i).ToArray()); - data["subs"] = new BsonItem(subs); - - data["hidden-classes"] = new BsonItem(_hidden.ToArray()); - - var entries = new BsonItem[_entriesList.Count]; - for (int i = 0; i < _entriesList.Count; i++) - { - var entry = _entriesList[i]; - var entryData = new BsonItem(); - var termData = new BsonItem[TermsPerEntry]; - - for (int j = 0; j < TermsPerEntry; j++) - termData[j] = new BsonItem - { - ["value"] = entry[j].Value, - ["pron"] = entry[j].Pronunciation, - ["value-split"] = entry[j].ValueSplitIndex, - ["pron-split"] = entry[j].PronunciationSplitIndex - }; - entryData["terms"] = new BsonItem(termData); - - entryData["classes"] = new BsonItem(entry.GetRequiredClasses().ToArray()); - entryData["optional-classes"] = new BsonItem(entry.GetOptionalClasses().ToArray()); - - var metaData = new BsonItem(); - foreach (string metaKey in entry.GetMetadataKeys()) - metaData[metaKey] = new BsonItem(entry.GetMetadata(metaKey)); - entryData["metadata"] = metaData; - entries[i] = entryData; - } - - data["entries"] = new BsonItem(entries); - - return data; - } - - internal override void Load(RantEngine engine) - { - engine.Dictionary.AddTable(this); - } - - internal void CreateSyllableBuckets() - { - if (_syllableBuckets != null) return; - _syllableBuckets = new SyllableBuckets[TermsPerEntry]; - for (var i = 0; i < TermsPerEntry; i++) - { - _syllableBuckets[i] = new SyllableBuckets(i, new RantDictionaryEntry[] { }); - } - } - } + } + + /// + /// Adds another table's entries to the current table, given that they share the same name and term count. + /// + /// The table whose entries will be added to the current instance. + /// True if merge succeeded; otherwise, False. + public bool Merge(RantDictionaryTable other) + { + if (other.Name != Name || other == this) return false; + if (other.TermsPerEntry != TermsPerEntry) return false; + _entriesHash.AddRange(other._entriesHash); + _entriesList.AddRange(other._entriesHash); + Commit(); + return true; + } + + /// + /// Optimizes the table. Call this after writing items to the table or removing items from a table. + /// If you're writing or removing multiple items, call this after all the actions have been performed. + /// + public void Commit() + { + _classTree = new ClassTree(_entriesHash); + CreateSyllableBuckets(); + for (int i = 0; i < TermsPerEntry; i++) + _syllableBuckets[i] = new SyllableBuckets(i, _entriesList); + } + + internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) + { + int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() + ? GetSubtypeIndex(query.PluralSubtype) + : GetSubtypeIndex(query.Subtype); + + if (index == -1) return null; + + if (query.BareQuery) return _entriesList.PickEntry(sb.RNG)?[index]; + + // process simple class filters using class tree + var filters = query.GetFilters(); + var classes = filters + .Where(f => f is ClassFilter) + .SelectMany(f => (f as ClassFilter).RequiredClasses); + + filters = filters.Where(f => !(f is ClassFilter) || !(f as ClassFilter).SimpleFilter); + + IEnumerable pool = _entriesList; + if (classes.Any()) + pool = _classTree.Query(classes); + + // if it's just the class filters, let's leave now + if (!filters.Any() && !query.HasCarrier) + return pool.ToList().PickEntry(sb.RNG)?[index]; + + // process syllable count filters using syllable buckets + var rangeFilters = filters.Where(f => f is RangeFilter).Select(f => f as RangeFilter); + if (rangeFilters.Any()) + { + CreateSyllableBuckets(); + + foreach (var filter in rangeFilters) + pool = pool.Intersect(_syllableBuckets[index].Query(filter)); + + filters = filters.Where(f => !(f is RangeFilter)); + } + + if (filters.Any()) + pool = pool.Where((e, i) => filters.OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, index, query))); + + if (!pool.Any()) return null; + + if (query.HasCarrier) + return syncState.GetEntry(query.Carrier, index, pool, sb.RNG)?[index]; + + return pool.PickEntry(sb.RNG)?[index]; + } + + internal override void DeserializeData(BsonItem data) + { + // General data + Name = data["name"]; + TermsPerEntry = data["termc"]; + Language = data["lang"]; + + // Subtypes + var subs = data["subs"].Values; + int si = 0; + foreach (var subList in subs) + { + foreach (var sub in subList.Values) AddSubtype(sub, si); + si++; + } + + // Hidden classes + foreach (var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); + + var entries = data["entries"]; + int count = entries.Count; + + // Entries + for (int i = 0; i < count; i++) + { + var entryData = entries[i]; + + // Terms + var terms = + from BsonItem termData in entryData["terms"].Values + let value = (string)termData["value"] + let pron = (string)termData["pron"] + let valueSplit = (int)(termData["value-split"] ?? -1) + let pronSplit = (int)(termData["pron-split"] ?? -1) + select new RantDictionaryTerm(value, pron, valueSplit, pronSplit); + + var entryClasses = (string[])entryData["classes"]; + var termArray = terms.ToArray(); + var entry = new RantDictionaryEntry(termArray, entryClasses, entryData["weight"] ?? 1); + + // Optional classes + foreach (var optionalClass in entryData["optional-classes"].Values) + entry.AddClass(optionalClass, true); + + // Metadata + var meta = entryData["metadata"]; + foreach (string metaKey in meta.Keys) + entry.SetMetadata(metaKey, meta[metaKey].Value); + + AddEntry(entry); + } + + Commit(); + } + + internal override BsonItem SerializeData() + { + var data = new BsonItem + { + ["name"] = Name, + ["lang"] = Language, + ["termc"] = TermsPerEntry + }; + + var subs = new BsonItem[TermsPerEntry]; + for (int i = 0; i < TermsPerEntry; i++) + subs[i] = new BsonItem(GetSubtypesForIndex(i).ToArray()); + data["subs"] = new BsonItem(subs); + + data["hidden-classes"] = new BsonItem(_hidden.ToArray()); + + var entries = new BsonItem[_entriesList.Count]; + for (int i = 0; i < _entriesList.Count; i++) + { + var entry = _entriesList[i]; + var entryData = new BsonItem(); + var termData = new BsonItem[TermsPerEntry]; + + for (int j = 0; j < TermsPerEntry; j++) + { + termData[j] = new BsonItem + { + ["value"] = entry[j].Value, + ["pron"] = entry[j].Pronunciation, + ["value-split"] = entry[j].ValueSplitIndex, + ["pron-split"] = entry[j].PronunciationSplitIndex + }; + } + entryData["terms"] = new BsonItem(termData); + + entryData["classes"] = new BsonItem(entry.GetRequiredClasses().ToArray()); + entryData["optional-classes"] = new BsonItem(entry.GetOptionalClasses().ToArray()); + + var metaData = new BsonItem(); + foreach (string metaKey in entry.GetMetadataKeys()) + metaData[metaKey] = new BsonItem(entry.GetMetadata(metaKey)); + entryData["metadata"] = metaData; + entries[i] = entryData; + } + + data["entries"] = new BsonItem(entries); + + return data; + } + + internal override void Load(RantEngine engine) + { + engine.Dictionary.AddTable(this); + } + + internal void CreateSyllableBuckets() + { + if (_syllableBuckets != null) return; + _syllableBuckets = new SyllableBuckets[TermsPerEntry]; + for (int i = 0; i < TermsPerEntry; i++) + _syllableBuckets[i] = new SyllableBuckets(i, new RantDictionaryEntry[] { }); + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryTerm.cs b/Rant/Vocabulary/RantDictionaryTerm.cs index 1b3c217..822eaa7 100644 --- a/Rant/Vocabulary/RantDictionaryTerm.cs +++ b/Rant/Vocabulary/RantDictionaryTerm.cs @@ -31,130 +31,130 @@ namespace Rant.Vocabulary { - /// - /// Represents a single term of a dictionary entry. - /// - public sealed class RantDictionaryTerm - { - private string _pronunciation = string.Empty; - private int _syllableCount; - private string[] _syllables; - private string _value; - - /// - /// Intializes a new instance of the class with the specified value string. - /// - /// The value of the term. - /// The split index of the term value. Specify -1 for no split. - public RantDictionaryTerm(string value, int splitIndex = -1) - { - if (value == null) throw new ArgumentNullException(nameof(value)); - ValueSplitIndex = splitIndex; - _value = string.Intern(value); - } - - /// - /// Intializes a new instance of the class with the specified value and pronunciation - /// strings. - /// - /// The value of the term. - /// The pronunciation of the term value. - public RantDictionaryTerm(string value, string pronunciation) - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _value = string.Intern(value); - _pronunciation = string.Intern(pronunciation ?? string.Empty); - } - - /// - /// Intializes a new instance of the class with the specified value, pronunciation, and - /// split indices. - /// - /// The value of the term. - /// The pronunciation of the term value. - /// The split index of the term value. Specify -1 for no split. - /// - /// The split index of the term pronunciation string. Specify -1 for no split. Must be - /// positive if the value is split and pronunciation data is present. - /// - public RantDictionaryTerm(string value, string pronunciation, int valueSplitIndex, int pronSplitIndex) - { - if (value == null) throw new ArgumentNullException(nameof(value)); - if (valueSplitIndex < 0 != pronSplitIndex < 0 && !Util.IsNullOrWhiteSpace(pronunciation)) throw new ArgumentException(GetString("err-incomplete-term-split")); - if (valueSplitIndex > value.Length) - throw new ArgumentException(GetString("err-invalid-term-split"), nameof(valueSplitIndex)); - if (pronSplitIndex > pronunciation?.Length) - throw new ArgumentException(GetString("err-invalid-term-split"), nameof(pronSplitIndex)); - - _value = string.Intern(value); - _pronunciation = string.Intern(pronunciation ?? string.Empty); - ValueSplitIndex = valueSplitIndex; - PronunciationSplitIndex = pronSplitIndex; - } - - /// - /// The value string of the term. - /// - public string Value - { - get { return _value; } - set - { - if (value == null) throw new ArgumentNullException(nameof(value)); - _value = string.Intern(value); - } - } - - /// - /// Determines whether the term is a split word. - /// - public bool IsSplit => ValueSplitIndex > -1; - - /// - /// Gets the split index of the term value. - /// - public int ValueSplitIndex { get; set; } = -1; - - /// - /// Gets the split index of the term pronunciation string. - /// - public int PronunciationSplitIndex { get; set; } = -1; - - /// - /// The pronunciation of the term. - /// - public string Pronunciation - { - get { return _pronunciation; } - set - { - _pronunciation = string.Intern(value ?? string.Empty); - if (_syllables != null) CreateSyllables(); - } - } - - /// - /// An array containing the individual syllables of the pronunciation string. - /// - public string[] Syllables => _syllables ?? CreateSyllables(); - - /// - /// The number of syllables in the pronunciation string. - /// - public int SyllableCount - { - get - { - if (_syllables == null) CreateSyllables(); - return _syllableCount; - } - } - - private string[] CreateSyllables() - { - _syllables = _pronunciation.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries); - _syllableCount = _syllables.Length; - return _syllables; - } - } + /// + /// Represents a single term of a dictionary entry. + /// + public sealed class RantDictionaryTerm + { + private string _pronunciation = string.Empty; + private int _syllableCount; + private string[] _syllables; + private string _value; + + /// + /// Intializes a new instance of the class with the specified value string. + /// + /// The value of the term. + /// The split index of the term value. Specify -1 for no split. + public RantDictionaryTerm(string value, int splitIndex = -1) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + ValueSplitIndex = splitIndex; + _value = string.Intern(value); + } + + /// + /// Intializes a new instance of the class with the specified value and pronunciation + /// strings. + /// + /// The value of the term. + /// The pronunciation of the term value. + public RantDictionaryTerm(string value, string pronunciation) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _value = string.Intern(value); + _pronunciation = string.Intern(pronunciation ?? string.Empty); + } + + /// + /// Intializes a new instance of the class with the specified value, pronunciation, and + /// split indices. + /// + /// The value of the term. + /// The pronunciation of the term value. + /// The split index of the term value. Specify -1 for no split. + /// + /// The split index of the term pronunciation string. Specify -1 for no split. Must be + /// positive if the value is split and pronunciation data is present. + /// + public RantDictionaryTerm(string value, string pronunciation, int valueSplitIndex, int pronSplitIndex) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + if (valueSplitIndex < 0 != pronSplitIndex < 0 && !Util.IsNullOrWhiteSpace(pronunciation)) throw new ArgumentException(GetString("err-incomplete-term-split")); + if (valueSplitIndex > value.Length) + throw new ArgumentException(GetString("err-invalid-term-split"), nameof(valueSplitIndex)); + if (pronSplitIndex > pronunciation?.Length) + throw new ArgumentException(GetString("err-invalid-term-split"), nameof(pronSplitIndex)); + + _value = string.Intern(value); + _pronunciation = string.Intern(pronunciation ?? string.Empty); + ValueSplitIndex = valueSplitIndex; + PronunciationSplitIndex = pronSplitIndex; + } + + /// + /// The value string of the term. + /// + public string Value + { + get { return _value; } + set + { + if (value == null) throw new ArgumentNullException(nameof(value)); + _value = string.Intern(value); + } + } + + /// + /// Determines whether the term is a split word. + /// + public bool IsSplit => ValueSplitIndex > -1; + + /// + /// Gets the split index of the term value. + /// + public int ValueSplitIndex { get; set; } = -1; + + /// + /// Gets the split index of the term pronunciation string. + /// + public int PronunciationSplitIndex { get; set; } = -1; + + /// + /// The pronunciation of the term. + /// + public string Pronunciation + { + get { return _pronunciation; } + set + { + _pronunciation = string.Intern(value ?? string.Empty); + if (_syllables != null) CreateSyllables(); + } + } + + /// + /// An array containing the individual syllables of the pronunciation string. + /// + public string[] Syllables => _syllables ?? CreateSyllables(); + + /// + /// The number of syllables in the pronunciation string. + /// + public int SyllableCount + { + get + { + if (_syllables == null) CreateSyllables(); + return _syllableCount; + } + } + + private string[] CreateSyllables() + { + _syllables = _pronunciation.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries); + _syllableCount = _syllables.Length; + return _syllables; + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantTableLoadException.cs b/Rant/Vocabulary/RantTableLoadException.cs index c6422cc..f4cf6be 100644 --- a/Rant/Vocabulary/RantTableLoadException.cs +++ b/Rant/Vocabulary/RantTableLoadException.cs @@ -29,32 +29,32 @@ namespace Rant.Vocabulary { - /// - /// Thrown when Rant encounters an error while loading a dictionary table. - /// - public sealed class RantTableLoadException : Exception - { - internal RantTableLoadException(string origin, int line, int col, string messageType, params object[] messageArgs) - : base($"{Txtres.GetString("src-line-col", origin, line, col)} {Txtres.GetString(messageType, messageArgs)}") - { - Line = line; - Column = col; - Origin = origin; - } - - /// - /// Gets the line number on which the error occurred. - /// - public int Line { get; } - - /// - /// Gets the column on which the error occurred. - /// - public int Column { get; } - - /// - /// Gets a string describing where the table was loaded from. For tables loaded from disk, this will be the file path. - /// - public string Origin { get; } - } + /// + /// Thrown when Rant encounters an error while loading a dictionary table. + /// + public sealed class RantTableLoadException : Exception + { + internal RantTableLoadException(string origin, int line, int col, string messageType, params object[] messageArgs) + : base($"{Txtres.GetString("src-line-col", origin, line, col)} {Txtres.GetString(messageType, messageArgs)}") + { + Line = line; + Column = col; + Origin = origin; + } + + /// + /// Gets the line number on which the error occurred. + /// + public int Line { get; } + + /// + /// Gets the column on which the error occurred. + /// + public int Column { get; } + + /// + /// Gets a string describing where the table was loaded from. For tables loaded from disk, this will be the file path. + /// + public string Origin { get; } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/SyllableBuckets.cs b/Rant/Vocabulary/SyllableBuckets.cs index 5ff9a81..569ab31 100644 --- a/Rant/Vocabulary/SyllableBuckets.cs +++ b/Rant/Vocabulary/SyllableBuckets.cs @@ -1,53 +1,69 @@ -using System; +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; + using Rant.Vocabulary.Querying; namespace Rant.Vocabulary { - internal class SyllableBuckets - { - private readonly Dictionary> _buckets = new Dictionary>(); - - public SyllableBuckets(int termIndex, IEnumerable entries) - { - foreach (var entry in entries) - { - var syllableCount = entry[termIndex].SyllableCount; - if (syllableCount == 0) continue; - - if (!_buckets.ContainsKey(syllableCount)) - { - _buckets[syllableCount] = new List(); - } - - _buckets[syllableCount].Add(entry); - } - } - - public List Query(RangeFilter filter) - { - if (_buckets.Count == 0) return new List(); - - var min = (filter.Minimum == null ? 1 : (int)filter.Minimum); - var max = (filter.Maximum == null ? min : (int)filter.Maximum); - - // go through twice, first to find out the size to allocate - var size = 0; - for (var i = min; i <= max; i++) - { - size += _buckets[i].Count; - } - - var list = new List(size); - for (var i = min; i <= max; i++) - { - list.AddRange(_buckets[i]); - } - - return list; - } - } -} + internal class SyllableBuckets + { + private readonly Dictionary> _buckets = new Dictionary>(); + + public SyllableBuckets(int termIndex, IEnumerable entries) + { + foreach (var entry in entries) + { + int syllableCount = entry[termIndex].SyllableCount; + if (syllableCount == 0) continue; + + if (!_buckets.ContainsKey(syllableCount)) + _buckets[syllableCount] = new List(); + + _buckets[syllableCount].Add(entry); + } + } + + public List Query(RangeFilter filter) + { + if (_buckets.Count == 0) return new List(); + + int min = filter.Minimum == null ? 1 : (int)filter.Minimum; + int max = filter.Maximum == null ? min : (int)filter.Maximum; + + // go through twice, first to find out the size to allocate + int size = 0; + for (int i = min; i <= max; i++) + size += _buckets[i].Count; + + var list = new List(size); + for (int i = min; i <= max; i++) + list.AddRange(_buckets[i]); + + return list; + } + } +} \ No newline at end of file diff --git a/Rant/Vocabulary/Utilities/Diff.cs b/Rant/Vocabulary/Utilities/Diff.cs index d30d563..4dead6d 100644 --- a/Rant/Vocabulary/Utilities/Diff.cs +++ b/Rant/Vocabulary/Utilities/Diff.cs @@ -30,473 +30,475 @@ namespace Rant.Vocabulary.Utilities { - /// - /// Diffs your marks. - /// - internal sealed class Diff - { - private readonly Rule[] _rules; - - /// - /// Creates a new Diffmark pattern for you to enjoy. - /// - /// The pattern string. - public Diff(string patternString) - { - if (patternString == null) - throw new ArgumentException("Pattern string cannot be null."); - - Pattern = patternString; - _rules = Lexer.Lex(patternString).Select(tokens => Rule.Parse(tokens.ToArray())).ToArray(); - } - - /// - /// The pattern string for the diff. - /// - public string Pattern { get; } - - /// - /// Applies the pattern to a string. - /// - /// The string to apply the pattern to. - /// - public string Mark(string baseString) - { - foreach (var rule in _rules) - switch (rule.Type) - { - case DiffRuleType.Add: - baseString = rule.Prepend - ? rule.ConcatString + baseString - : baseString + rule.ConcatString; - continue; - case DiffRuleType.Subtract: - baseString = Cut(baseString, rule.Factor, rule.Prepend); - baseString = rule.Prepend - ? rule.ConcatString + baseString - : baseString + rule.ConcatString; - continue; - case DiffRuleType.ReplaceWord: - baseString = ReplaceWord(baseString, rule.ConcatString, rule.Factor, rule.Prepend); - continue; - } - return baseString; - } - - /// - /// Transforms one string to another. - /// - /// The base string to transform. - /// The Diffmark pattern to apply to the string. - /// - public static string Mark(string baseString, string pattern) - { - return new Diff(pattern).Mark(baseString); - } - - internal static string Cut(string baseString, int factor, bool prepend) - { - if (factor > baseString.Length) return string.Empty; - return prepend ? baseString.Substring(factor) : baseString.Substring(0, baseString.Length - factor); - } - - internal static string ReplaceWord(string baseString, string replacement, int factor, bool prepend) - { - int a = 0; - int b = 0; - int currentWordIndex = 0; - if (prepend) - { - while (currentWordIndex < factor) - { - a = b; - while (a < baseString.Length && !char.IsLetterOrDigit(baseString[a])) - a++; - - if (a >= baseString.Length) return baseString; - - b = a; - while (b < baseString.Length && char.IsLetterOrDigit(baseString[b])) - b++; - - currentWordIndex++; - } - } - else - { - a = b = baseString.Length; - while (currentWordIndex < factor) - { - b = a; - while (b > 0 && !char.IsLetterOrDigit(baseString[b - 1])) - b--; - - if (b <= 0) return baseString; - - a = b; - while (a > 0 && char.IsLetterOrDigit(baseString[a - 1])) - a--; - - currentWordIndex++; - } - } - return string.Concat(baseString.Substring(0, a), replacement, baseString.Substring(b)); - } - - /// - /// Derives a Diffmark pattern that can transform the specified 'before' string to the specified 'after' string. - /// - /// The string before it is transformed. - /// The string after it is transformed. - /// - public static string Derive(string before, string after) - { - if (before == null || after == null) - throw new ArgumentException("Input strings can't be null."); - if (before == after) return ""; - if (after.Length == 0) return new string('-', before.Length); - if (before.Length == 0) return after; - - var sb = new StringBuilder(); - bool isCut = after.Length < before.Length; - - int lm = LongestLeftMatch(before, after); - int rm = LongestRightMatch(before, after); - - int lcsStartBefore = 0; - int lcsStartAfter = 0; - int lcsLength = 0; - - if (isCut) - { - if (lm > 0) // Something was appended - { - sb.Append(new string('-', before.Length - lm)) - .Append(after.Substring(lm, after.Length - lm)); - } - else if (rm > 0) // Something was prepended - { - sb.Append(after.Substring(0, after.Length - rm)) - .Append(after.Length - rm == 0 && before.Length - rm > 0 ? "|" : "") - .Append(new string('-', before.Length - rm)); - } - else - { - if (LongestCommonSubstring(before, after, out lcsStartBefore, out lcsStartAfter, out lcsLength)) - { - string beforeLeft = before.Substring(0, lcsStartBefore); - string afterLeft = after.Substring(0, lcsStartAfter); - lm = LongestLeftMatch(beforeLeft, afterLeft); - - sb.Append(afterLeft.Substring(0, afterLeft.Length - lm)) - .Append(lm < beforeLeft.Length - ? (afterLeft.Length - lm == 0 && beforeLeft.Length - lm > 0 ? "|" : "") + - new string('-', beforeLeft.Length - lm) - : "+") - .Append(';'); - - string beforeRight = before.Substring(lcsStartBefore + lcsLength); - string afterRight = after.Substring(lcsStartAfter + lcsLength); - rm = LongestRightMatch(beforeRight, afterRight); - - sb.Append(new string('-', beforeRight.Length - rm)) - .Append(afterRight.Substring(0, afterRight.Length - rm)); - } - else if (before.Contains(" ")) - { - sb.Append(new string('-', before.Length)) - .Append(after); - } - else - { - sb.Append('*').Append(after); - } - } - } - else - { - if (lm > 0) // Something was appended - { - sb.Append(new string('-', before.Length - lm)) - .Append(after.Substring(lm, after.Length - lm)); - } - else if (rm > 0) // Something was prepended - { - sb.Append(after.Substring(0, after.Length - rm)) - .Append(rm < before.Length - ? (after.Length - rm == 0 && before.Length - rm > 0 ? "|" : "") + new string('-', before.Length - rm) - : "+"); - } - else - { - if (LongestCommonSubstring(before, after, out lcsStartBefore, out lcsStartAfter, out lcsLength)) - { - string beforeLeft = before.Substring(0, lcsStartBefore); - string afterLeft = after.Substring(0, lcsStartAfter); - lm = LongestLeftMatch(beforeLeft, afterLeft); - sb.Append(afterLeft.Substring(0, afterLeft.Length - lm)) - .Append(lm < beforeLeft.Length - ? (afterLeft.Length - lm == 0 && beforeLeft.Length - lm > 0 ? "|" : "") + - new string('-', beforeLeft.Length - lm) - : "+") - .Append(';'); - - string beforeRight = lcsStartBefore + lcsLength >= before.Length - ? "" - : before.Substring(lcsStartBefore + lcsLength); - string afterRight = lcsStartAfter + lcsLength >= after.Length ? "" : after.Substring(lcsStartAfter + lcsLength); - rm = LongestRightMatch(beforeRight, afterRight); - - sb.Append(new string('-', beforeRight.Length - rm)) - .Append(afterRight.Substring(0, afterRight.Length - rm)); - } - else if (before.Contains(" ")) - { - sb.Append(new string('-', before.Length)) - .Append(after); - } - else - { - sb.Append('*').Append(after); - } - } - } - - return sb.ToString(); - } - - internal static bool LongestCommonSubstring(string a, string b, - out int start_a, out int start_b, out int length) - { - start_a = start_b = length = 0; - - if (a == null || b == null) return false; - if (a.Length * b.Length == 0) return false; - - string minor, major; - int minorStart = 0; - int majorStart = 0; - if (a.Length >= b.Length) - { - minor = a; - major = b; - } - else - { - major = a; - minor = b; - } - - int matchIndex = 0; - for (int i = 0; i < minor.Length; i++) - for (int j = i + 1; j <= minor.Length; j++) - if (j - i > length - && (matchIndex = major.IndexOf(minor.Substring(i, j - i), StringComparison.InvariantCulture)) > -1) - { - majorStart = matchIndex; - minorStart = i; - length = j - i; - } - - if (a.Length >= b.Length) - { - start_a = minorStart; - start_b = majorStart; - } - else - { - start_a = majorStart; - start_b = minorStart; - } - - return length > 0; - } - - private static int LongestLeftMatch(string a, string b) - { - if (a.Length * b.Length == 0) return 0; - int l = Math.Min(a.Length, b.Length); - - for (int i = 0; i < l; i++) - if (a[i] != b[i]) return i; - return l; - } - - private static int LongestRightMatch(string a, string b) - { - if (a.Length * b.Length == 0) return 0; - int l = Math.Min(a.Length, b.Length); - for (int i = 0; i < l; i++) - if (a[a.Length - 1 - i] != b[b.Length - 1 - i]) return i; - return l; - } - - private class Rule - { - private static readonly Dictionary RuleMap = new Dictionary - { - { DM.ReplaceWord, DiffRuleType.ReplaceWord }, - { DM.Subtract, DiffRuleType.Subtract }, - { DM.Add, DiffRuleType.Add } - }; - - public readonly string ConcatString; - public readonly int Factor; - public readonly bool Prepend; - public readonly DiffRuleType Type; - - private Rule(string concatString, bool prepend, DiffRuleType type, int factor) - { - ConcatString = concatString; - Prepend = prepend; - Type = type; - Factor = factor; - } - - public static Rule Parse(Token[] tokens) - { - DiffRuleType ruleType; - DM op; - bool prepend = !RuleMap.TryGetValue(op = tokens[0].Type, out ruleType); - if (prepend && !RuleMap.TryGetValue(op = tokens[tokens.Length - 1].Type, out ruleType)) - { - prepend = false; - ruleType = DiffRuleType.Add; - } - - int factor = 0; - - if (ruleType != DiffRuleType.Add) - if (prepend) - factor += tokens.Reverse().TakeWhile(t => t.Type == op).Count(); - else - factor += tokens.TakeWhile(t => t.Type == op).Count(); - else - factor++; - - var sb = new StringBuilder(); - - foreach (var token in - tokens.SkipWhile(t => RuleMap.ContainsKey(t.Type)) - .Reverse() - .SkipWhile(t => RuleMap.ContainsKey(t.Type)) - .Reverse()) - sb.Append(token.Value); - - return new Rule(sb.ToString(), prepend, ruleType, factor); - } - } - - private enum DiffRuleType - { - Add, - Subtract, - ReplaceWord - } - - private static class Lexer - { - private static IEnumerable GetTokens(string patternString) - { - patternString = patternString.Trim(); - var text = new StringBuilder(); - Token nextToken = null; - for (int i = 0; i < patternString.Length; i++) - { - switch (patternString[i]) - { - case '\\': - nextToken = new Token(DM.Special, Escape(patternString[++i])); - break; - case '|': - nextToken = new Token(DM.Special, ""); - break; - case '+': - nextToken = new Token(DM.Add, "+"); - break; - case '-': - nextToken = new Token(DM.Subtract, "-"); - break; - case '*': - nextToken = new Token(DM.ReplaceWord, "*"); - break; - case ';': - nextToken = new Token(DM.Delimiter, ";"); - break; - case ' ': - if (text.Length > 0) goto default; - continue; - default: - text.Append(patternString[i]); - continue; - } - if (text.Length > 0) - { - yield return new Token(DM.Text, text.ToString().Trim()); - text.Length = 0; - } - yield return nextToken; - nextToken = null; - } - if (text.Length > 0) - yield return new Token(DM.Text, text.ToString().Trim()); - } - - public static IEnumerable> Lex(string patternString) - { - var tokens = GetTokens(patternString); - var list = new List(); - foreach (var token in tokens) - if (token.Type == DM.Delimiter && list.Any()) - { - yield return list.ToArray(); - list.Clear(); - } - else - { - list.Add(token); - } - if (list.Any()) yield return list.ToArray(); - } - - internal static string Escape(char escapeChar) - { - switch (escapeChar) - { - case 'n': - return "\n"; - case 's': - return " "; - case 'r': - return "\r"; - case 't': - return "\t"; - default: - return escapeChar.ToString(); - } - } - } - - private class Token - { - public readonly DM Type; - public readonly string Value; - - public Token(DM type, string value) - { - Type = type; - Value = value; - } - } - - private enum DM - { - Add, - Subtract, - ReplaceWord, - Special, - Text, - Delimiter - } - } + /// + /// Diffs your marks. + /// + internal sealed class Diff + { + private readonly Rule[] _rules; + + /// + /// Creates a new Diffmark pattern for you to enjoy. + /// + /// The pattern string. + public Diff(string patternString) + { + if (patternString == null) + throw new ArgumentException("Pattern string cannot be null."); + + Pattern = patternString; + _rules = Lexer.Lex(patternString).Select(tokens => Rule.Parse(tokens.ToArray())).ToArray(); + } + + /// + /// The pattern string for the diff. + /// + public string Pattern { get; } + + /// + /// Applies the pattern to a string. + /// + /// The string to apply the pattern to. + /// + public string Mark(string baseString) + { + foreach (var rule in _rules) + { + switch (rule.Type) + { + case DiffRuleType.Add: + baseString = rule.Prepend + ? rule.ConcatString + baseString + : baseString + rule.ConcatString; + continue; + case DiffRuleType.Subtract: + baseString = Cut(baseString, rule.Factor, rule.Prepend); + baseString = rule.Prepend + ? rule.ConcatString + baseString + : baseString + rule.ConcatString; + continue; + case DiffRuleType.ReplaceWord: + baseString = ReplaceWord(baseString, rule.ConcatString, rule.Factor, rule.Prepend); + continue; + } + } + return baseString; + } + + /// + /// Transforms one string to another. + /// + /// The base string to transform. + /// The Diffmark pattern to apply to the string. + /// + public static string Mark(string baseString, string pattern) + { + return new Diff(pattern).Mark(baseString); + } + + internal static string Cut(string baseString, int factor, bool prepend) + { + if (factor > baseString.Length) return string.Empty; + return prepend ? baseString.Substring(factor) : baseString.Substring(0, baseString.Length - factor); + } + + internal static string ReplaceWord(string baseString, string replacement, int factor, bool prepend) + { + int a = 0; + int b = 0; + int currentWordIndex = 0; + if (prepend) + { + while (currentWordIndex < factor) + { + a = b; + while (a < baseString.Length && !char.IsLetterOrDigit(baseString[a])) + a++; + + if (a >= baseString.Length) return baseString; + + b = a; + while (b < baseString.Length && char.IsLetterOrDigit(baseString[b])) + b++; + + currentWordIndex++; + } + } + else + { + a = b = baseString.Length; + while (currentWordIndex < factor) + { + b = a; + while (b > 0 && !char.IsLetterOrDigit(baseString[b - 1])) + b--; + + if (b <= 0) return baseString; + + a = b; + while (a > 0 && char.IsLetterOrDigit(baseString[a - 1])) + a--; + + currentWordIndex++; + } + } + return string.Concat(baseString.Substring(0, a), replacement, baseString.Substring(b)); + } + + /// + /// Derives a Diffmark pattern that can transform the specified 'before' string to the specified 'after' string. + /// + /// The string before it is transformed. + /// The string after it is transformed. + /// + public static string Derive(string before, string after) + { + if (before == null || after == null) + throw new ArgumentException("Input strings can't be null."); + if (before == after) return ""; + if (after.Length == 0) return new string('-', before.Length); + if (before.Length == 0) return after; + + var sb = new StringBuilder(); + bool isCut = after.Length < before.Length; + + int lm = LongestLeftMatch(before, after); + int rm = LongestRightMatch(before, after); + + int lcsStartBefore = 0; + int lcsStartAfter = 0; + int lcsLength = 0; + + if (isCut) + { + if (lm > 0) // Something was appended + { + sb.Append(new string('-', before.Length - lm)) + .Append(after.Substring(lm, after.Length - lm)); + } + else if (rm > 0) // Something was prepended + { + sb.Append(after.Substring(0, after.Length - rm)) + .Append(after.Length - rm == 0 && before.Length - rm > 0 ? "|" : "") + .Append(new string('-', before.Length - rm)); + } + else + { + if (LongestCommonSubstring(before, after, out lcsStartBefore, out lcsStartAfter, out lcsLength)) + { + string beforeLeft = before.Substring(0, lcsStartBefore); + string afterLeft = after.Substring(0, lcsStartAfter); + lm = LongestLeftMatch(beforeLeft, afterLeft); + + sb.Append(afterLeft.Substring(0, afterLeft.Length - lm)) + .Append(lm < beforeLeft.Length + ? (afterLeft.Length - lm == 0 && beforeLeft.Length - lm > 0 ? "|" : "") + + new string('-', beforeLeft.Length - lm) + : "+") + .Append(';'); + + string beforeRight = before.Substring(lcsStartBefore + lcsLength); + string afterRight = after.Substring(lcsStartAfter + lcsLength); + rm = LongestRightMatch(beforeRight, afterRight); + + sb.Append(new string('-', beforeRight.Length - rm)) + .Append(afterRight.Substring(0, afterRight.Length - rm)); + } + else if (before.Contains(" ")) + { + sb.Append(new string('-', before.Length)) + .Append(after); + } + else + sb.Append('*').Append(after); + } + } + else + { + if (lm > 0) // Something was appended + { + sb.Append(new string('-', before.Length - lm)) + .Append(after.Substring(lm, after.Length - lm)); + } + else if (rm > 0) // Something was prepended + { + sb.Append(after.Substring(0, after.Length - rm)) + .Append(rm < before.Length + ? (after.Length - rm == 0 && before.Length - rm > 0 ? "|" : "") + new string('-', before.Length - rm) + : "+"); + } + else + { + if (LongestCommonSubstring(before, after, out lcsStartBefore, out lcsStartAfter, out lcsLength)) + { + string beforeLeft = before.Substring(0, lcsStartBefore); + string afterLeft = after.Substring(0, lcsStartAfter); + lm = LongestLeftMatch(beforeLeft, afterLeft); + sb.Append(afterLeft.Substring(0, afterLeft.Length - lm)) + .Append(lm < beforeLeft.Length + ? (afterLeft.Length - lm == 0 && beforeLeft.Length - lm > 0 ? "|" : "") + + new string('-', beforeLeft.Length - lm) + : "+") + .Append(';'); + + string beforeRight = lcsStartBefore + lcsLength >= before.Length + ? "" + : before.Substring(lcsStartBefore + lcsLength); + string afterRight = lcsStartAfter + lcsLength >= after.Length ? "" : after.Substring(lcsStartAfter + lcsLength); + rm = LongestRightMatch(beforeRight, afterRight); + + sb.Append(new string('-', beforeRight.Length - rm)) + .Append(afterRight.Substring(0, afterRight.Length - rm)); + } + else if (before.Contains(" ")) + { + sb.Append(new string('-', before.Length)) + .Append(after); + } + else + sb.Append('*').Append(after); + } + } + + return sb.ToString(); + } + + internal static bool LongestCommonSubstring(string a, string b, + out int start_a, out int start_b, out int length) + { + start_a = start_b = length = 0; + + if (a == null || b == null) return false; + if (a.Length * b.Length == 0) return false; + + string minor, major; + int minorStart = 0; + int majorStart = 0; + if (a.Length >= b.Length) + { + minor = a; + major = b; + } + else + { + major = a; + minor = b; + } + + int matchIndex = 0; + for (int i = 0; i < minor.Length; i++) + for (int j = i + 1; j <= minor.Length; j++) + { + if (j - i > length + && (matchIndex = major.IndexOf(minor.Substring(i, j - i), StringComparison.InvariantCulture)) > -1) + { + majorStart = matchIndex; + minorStart = i; + length = j - i; + } + } + + if (a.Length >= b.Length) + { + start_a = minorStart; + start_b = majorStart; + } + else + { + start_a = majorStart; + start_b = minorStart; + } + + return length > 0; + } + + private static int LongestLeftMatch(string a, string b) + { + if (a.Length * b.Length == 0) return 0; + int l = Math.Min(a.Length, b.Length); + + for (int i = 0; i < l; i++) + if (a[i] != b[i]) return i; + return l; + } + + private static int LongestRightMatch(string a, string b) + { + if (a.Length * b.Length == 0) return 0; + int l = Math.Min(a.Length, b.Length); + for (int i = 0; i < l; i++) + if (a[a.Length - 1 - i] != b[b.Length - 1 - i]) return i; + return l; + } + + private class Rule + { + private static readonly Dictionary RuleMap = new Dictionary + { + { DM.ReplaceWord, DiffRuleType.ReplaceWord }, + { DM.Subtract, DiffRuleType.Subtract }, + { DM.Add, DiffRuleType.Add } + }; + + public readonly string ConcatString; + public readonly int Factor; + public readonly bool Prepend; + public readonly DiffRuleType Type; + + private Rule(string concatString, bool prepend, DiffRuleType type, int factor) + { + ConcatString = concatString; + Prepend = prepend; + Type = type; + Factor = factor; + } + + public static Rule Parse(Token[] tokens) + { + DiffRuleType ruleType; + DM op; + bool prepend = !RuleMap.TryGetValue(op = tokens[0].Type, out ruleType); + if (prepend && !RuleMap.TryGetValue(op = tokens[tokens.Length - 1].Type, out ruleType)) + { + prepend = false; + ruleType = DiffRuleType.Add; + } + + int factor = 0; + + if (ruleType != DiffRuleType.Add) + { + if (prepend) + factor += tokens.Reverse().TakeWhile(t => t.Type == op).Count(); + else + factor += tokens.TakeWhile(t => t.Type == op).Count(); + } + else + factor++; + + var sb = new StringBuilder(); + + foreach (var token in + tokens.SkipWhile(t => RuleMap.ContainsKey(t.Type)) + .Reverse() + .SkipWhile(t => RuleMap.ContainsKey(t.Type)) + .Reverse()) + sb.Append(token.Value); + + return new Rule(sb.ToString(), prepend, ruleType, factor); + } + } + + private enum DiffRuleType + { + Add, + Subtract, + ReplaceWord + } + + private static class Lexer + { + private static IEnumerable GetTokens(string patternString) + { + patternString = patternString.Trim(); + var text = new StringBuilder(); + Token nextToken = null; + for (int i = 0; i < patternString.Length; i++) + { + switch (patternString[i]) + { + case '\\': + nextToken = new Token(DM.Special, Escape(patternString[++i])); + break; + case '|': + nextToken = new Token(DM.Special, ""); + break; + case '+': + nextToken = new Token(DM.Add, "+"); + break; + case '-': + nextToken = new Token(DM.Subtract, "-"); + break; + case '*': + nextToken = new Token(DM.ReplaceWord, "*"); + break; + case ';': + nextToken = new Token(DM.Delimiter, ";"); + break; + case ' ': + if (text.Length > 0) goto default; + continue; + default: + text.Append(patternString[i]); + continue; + } + if (text.Length > 0) + { + yield return new Token(DM.Text, text.ToString().Trim()); + text.Length = 0; + } + yield return nextToken; + nextToken = null; + } + if (text.Length > 0) + yield return new Token(DM.Text, text.ToString().Trim()); + } + + public static IEnumerable> Lex(string patternString) + { + var tokens = GetTokens(patternString); + var list = new List(); + foreach (var token in tokens) + { + if (token.Type == DM.Delimiter && list.Any()) + { + yield return list.ToArray(); + list.Clear(); + } + else + list.Add(token); + } + if (list.Any()) yield return list.ToArray(); + } + + internal static string Escape(char escapeChar) + { + switch (escapeChar) + { + case 'n': + return "\n"; + case 's': + return " "; + case 'r': + return "\r"; + case 't': + return "\t"; + default: + return escapeChar.ToString(); + } + } + } + + private class Token + { + public readonly DM Type; + public readonly string Value; + + public Token(DM type, string value) + { + Type = type; + Value = value; + } + } + + private enum DM + { + Add, + Subtract, + ReplaceWord, + Special, + Text, + Delimiter + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Utilities/DoubleMetaphone.cs b/Rant/Vocabulary/Utilities/DoubleMetaphone.cs index b2eb07a..7cc0164 100644 --- a/Rant/Vocabulary/Utilities/DoubleMetaphone.cs +++ b/Rant/Vocabulary/Utilities/DoubleMetaphone.cs @@ -29,798 +29,802 @@ namespace Rant.Vocabulary.Utilities { - /// - /// DoubleMetaphone string extension - /// - /// - /// Original C++ implementation: - /// "Double Metaphone (c) 1998, 1999 by Lawrence Philips" - /// http://www.ddj.com/cpp/184401251?pgno=1 - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Metaphone")] - internal static class DoubleMetaphoneStringExtension - { - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Metaphone")] - [SuppressMessage("Microsoft.Maintainability", "CA1505:AvoidUnmaintainableCode")] - [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] - public static string GenerateDoubleMetaphone(this string self) - { - var metaphoneData = new MetaphoneData(); - int current = 0; - - if (self.Length < 1) - return self; - int last = self.Length - 1; //zero based index - - string workingString = self.ToUpperInvariant() + " "; - - bool isSlavoGermanic = self.IndexOf('W') > -1 || self.IndexOf('K') > -1 || - self.IndexOf("CZ", StringComparison.OrdinalIgnoreCase) > -1 - || self.IndexOf("WITZ", StringComparison.OrdinalIgnoreCase) > -1; - - //skip these when at start of word - if (workingString.StartsWith(StringComparison.OrdinalIgnoreCase, "GN", "KN", "PN", "WR", "PS")) - current += 1; - - //Initial 'X' is pronounced 'Z' e.g. 'Xavier' - if (workingString[0] == 'X') - { - metaphoneData.Add("S"); //'Z' maps to 'S' - current += 1; - } - - while (metaphoneData.PrimaryLength < 4 || metaphoneData.SecondaryLength < 4) - { - if (current >= self.Length) - break; - - switch (workingString[current]) - { - case 'A': - case 'E': - case 'I': - case 'O': - case 'U': - case 'Y': - if (current == 0) - metaphoneData.Add("A"); - current += 1; - break; - - case 'B': - //"-mb", e.g", "dumb", already skipped over... - metaphoneData.Add("P"); - - if (workingString[current + 1] == 'B') - current += 2; - else - current += 1; - break; - - case 'Ã': - metaphoneData.Add("S"); - current += 1; - break; - - case 'C': - //various germanic - if (current > 1 && !IsVowel(workingString[current - 2]) && StringAt(workingString, current - 1, "ACH") && workingString[current + 2] != 'I' && - (workingString[current + 2] != 'E' || StringAt(workingString, current - 2, "BACHER", "MACHER"))) - { - metaphoneData.Add("K"); - current += 2; - break; - } - - //special case 'caesar' - if (current == 0 && StringAt(workingString, current, "CAESAR")) - { - metaphoneData.Add("S"); - current += 2; - break; - } - - //italian 'chianti' - if (StringAt(workingString, current, "CHIA")) - { - metaphoneData.Add("K"); - current += 2; - break; - } - - if (StringAt(workingString, current, "CH")) - { - //find 'michael' - if (current > 0 && StringAt(workingString, current, "CHAE")) - { - metaphoneData.Add("K", "X"); - current += 2; - break; - } - - //greek roots e.g. 'chemistry', 'chorus' - if (current == 0 && - (StringAt(workingString, current + 1, "HARAC", "HARIS") || - StringAt(workingString, current + 1, "HOR", "HYM", "HIA", "HEM")) - && !StringAt(workingString, 0, "CHORE")) - { - metaphoneData.Add("K"); - current += 2; - break; - } - - //germanic, greek, or otherwise 'ch' for 'kh' sound - if (StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH") - // 'architect but not 'arch', 'orchestra', 'orchid' - || StringAt(workingString, current - 2, "ORCHES", "ARCHIT", "ORCHID") || - StringAt(workingString, current + 2, "T", "S") - || - (StringAt(workingString, current - 1, "A", "O", "U", "E") || current == 0) - //e.g., 'wachtler', 'wechsler', but not 'tichner' - && StringAt(workingString, current + 2, "L", "R", "N", "M", "B", "H", "F", "V", "W", " ")) - { - metaphoneData.Add("K"); - } - else - { - if (current > 0) - if (StringAt(workingString, 0, "MC")) - metaphoneData.Add("K"); - else - metaphoneData.Add("X", "K"); - else - metaphoneData.Add("X"); - } - current += 2; - break; - } - //e.g, 'czerny' - if (StringAt(workingString, current, "CZ") && !StringAt(workingString, current - 2, "WICZ")) - { - metaphoneData.Add("S", "X"); - current += 2; - break; - } - - //e.g., 'focaccia' - if (StringAt(workingString, current + 1, "CIA")) - { - metaphoneData.Add("X"); - current += 3; - break; - } - - //double 'C', but not if e.g. 'McClellan' - if (StringAt(workingString, current, "CC") && !(current == 1 && workingString[0] == 'M')) - { - //'bellocchio' but not 'bacchus' - if (StringAt(workingString, current + 2, "I", "E", "H") && !StringAt(workingString, current + 2, "HU")) - { - //'accident', 'accede' 'succeed' - if (current == 1 && workingString[current - 1] == 'A' || - StringAt(workingString, current - 1, "UCCEE", "UCCES")) - metaphoneData.Add("KS"); - //'bacci', 'bertucci', other italian - else - metaphoneData.Add("X"); - current += 3; - break; - } - //Pierce's rule - metaphoneData.Add("K"); - current += 2; - break; - } - - if (StringAt(workingString, current, "CK", "CG", "CQ")) - { - metaphoneData.Add("K"); - current += 2; - break; - } - - if (StringAt(workingString, current, "CI", "CE", "CY")) - { - //italian vs. english - if (StringAt(workingString, current, "CIO", "CIE", "CIA")) - metaphoneData.Add("S", "X"); - else - metaphoneData.Add("S"); - current += 2; - break; - } - - //else - metaphoneData.Add("K"); - - //name sent in 'mac caffrey', 'mac gregor - if (StringAt(workingString, current + 1, " C", " Q", " G")) - current += 3; - else if (StringAt(workingString, current + 1, "C", "K", "Q") && !StringAt(workingString, current + 1, "CE", "CI")) - current += 2; - else - current += 1; - break; - - case 'D': - if (StringAt(workingString, current, "DG")) - { - if (StringAt(workingString, current + 2, "I", "E", "Y")) - { - //e.g. 'edge' - metaphoneData.Add("J"); - current += 3; - break; - } - //e.g. 'edgar' - metaphoneData.Add("TK"); - current += 2; - break; - } - - if (StringAt(workingString, current, "DT", "DD")) - { - metaphoneData.Add("T"); - current += 2; - break; - } - - //else - metaphoneData.Add("T"); - current += 1; - break; - - case 'F': - if (workingString[current + 1] == 'F') - current += 2; - else - current += 1; - metaphoneData.Add("F"); - break; - - case 'G': - if (workingString[current + 1] == 'H') - { - if (current > 0 && !IsVowel(workingString[current - 1])) - { - metaphoneData.Add("K"); - current += 2; - break; - } - - if (current < 3) - if (current == 0) - { - if (workingString[current + 2] == 'I') - metaphoneData.Add("J"); - else - metaphoneData.Add("K"); - current += 2; - break; - } - //Parker's rule (with some further refinements) - e.g., 'hugh' - if (current > 1 && StringAt(workingString, current - 2, "B", "H", "D") //e.g., 'bough' - || current > 2 && StringAt(workingString, current - 3, "B", "H", "D") //e.g., 'broughton' - || current > 3 && StringAt(workingString, current - 4, "B", "H")) - { - current += 2; - break; - } - //e.g., 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough' - if (current > 2 && workingString[current - 1] == 'U' && - StringAt(workingString, current - 3, "C", "G", "L", "R", "T")) - metaphoneData.Add("F"); - else if (current > 0 && workingString[current - 1] != 'I') - metaphoneData.Add("K"); - - current += 2; - break; - } - - if (workingString[current + 1] == 'N') - { - if (current == 1 && IsVowel(workingString[0]) && !isSlavoGermanic) - metaphoneData.Add("KN", "N"); - else - //not e.g. 'cagney' - if (!StringAt(workingString, current + 2, "EY") && workingString[current + 1] != 'Y' && !isSlavoGermanic) - metaphoneData.Add("N", "KN"); - else - metaphoneData.Add("KN"); - current += 2; - break; - } - - //'tagliaro' - if (StringAt(workingString, current + 1, "LI") && !isSlavoGermanic) - { - metaphoneData.Add("KL", "L"); - current += 2; - break; - } - - //-ges-,-gep-,-gel-, -gie- at beginning - if (current == 0 - && - (workingString[current + 1] == 'Y' || - StringAt(workingString, current + 1, "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER"))) - { - metaphoneData.Add("K", "J"); - current += 2; - break; - } - - // -ger-, -gy- - if ((StringAt(workingString, current + 1, "ER") || workingString[current + 1] == 'Y') && - !StringAt(workingString, 0, "DANGER", "RANGER", "MANGER") - && !StringAt(workingString, current - 1, "E", "I") && !StringAt(workingString, current - 1, "RGY", "OGY")) - { - metaphoneData.Add("K", "J"); - current += 2; - break; - } - - // italian e.g, 'biaggi' - if (StringAt(workingString, current + 1, "E", "I", "Y") || - StringAt(workingString, current - 1, "AGGI", "OGGI")) - { - //obvious germanic - if (StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH") || - StringAt(workingString, current + 1, "ET")) - metaphoneData.Add("K"); - else - //always soft if french ending - if (StringAt(workingString, current + 1, "IER ")) - metaphoneData.Add("J"); - else - metaphoneData.Add("J", "K"); - current += 2; - break; - } - - if (workingString[current + 1] == 'G') - current += 2; - else - current += 1; - metaphoneData.Add("K"); - break; - - case 'H': - //only keep if first & before vowel or btw. 2 vowels - if ((current == 0 || IsVowel(workingString[current - 1])) && IsVowel(workingString[current + 1])) - { - metaphoneData.Add("H"); - current += 2; - } - else //also takes care of 'HH' - { - current += 1; - } - break; - - case 'J': - //obvious spanish, 'jose', 'san jacinto' - if (StringAt(workingString, current, "JOSE") || StringAt(workingString, 0, "SAN ")) - { - if (current == 0 && workingString[current + 4] == ' ' || StringAt(workingString, 0, "SAN ")) - metaphoneData.Add("H"); - else - metaphoneData.Add("J", "H"); - current += 1; - break; - } - - if (current == 0 && !StringAt(workingString, current, "JOSE")) - metaphoneData.Add("J", "A"); //Yankelovich/Jankelowicz - else - //spanish pron. of e.g. 'bajador' - if (IsVowel(workingString[current - 1]) && !isSlavoGermanic && - (workingString[current + 1] == 'A' || workingString[current + 1] == 'O')) - metaphoneData.Add("J", "H"); - else if (current == last) - metaphoneData.Add("J", " "); - else if (!StringAt(workingString, current + 1, "L", "T", "K", "S", "N", "M", "B", "Z") && - !StringAt(workingString, current - 1, "S", "K", "L")) - metaphoneData.Add("J"); - - if (workingString[current + 1] == 'J') //it could happen! - current += 2; - else - current += 1; - break; - - case 'K': - if (workingString[current + 1] == 'K') - current += 2; - else - current += 1; - metaphoneData.Add("K"); - break; - - case 'L': - if (workingString[current + 1] == 'L') - { - //spanish e.g. 'cabrillo', 'gallegos' - if (current == self.Length - 3 && StringAt(workingString, current - 1, "ILLO", "ILLA", "ALLE") - || - (StringAt(workingString, last - 1, "AS", "OS") || StringAt(workingString, last, "A", "O")) && - StringAt(workingString, current - 1, "ALLE")) - { - metaphoneData.Add("L", " "); - current += 2; - break; - } - current += 2; - } - else - { - current += 1; - } - metaphoneData.Add("L"); - break; - - case 'M': - if (StringAt(workingString, current - 1, "UMB") && - (current + 1 == last || StringAt(workingString, current + 2, "ER")) //'dumb','thumb' - || workingString[current + 1] == 'M') - current += 2; - else - current += 1; - metaphoneData.Add("M"); - break; - - case 'N': - if (workingString[current + 1] == 'N') - current += 2; - else - current += 1; - metaphoneData.Add("N"); - break; - - case 'Ð': - current += 1; - metaphoneData.Add("N"); - break; - - case 'P': - if (workingString[current + 1] == 'H') - { - metaphoneData.Add("F"); - current += 2; - break; - } - - //also account for "campbell", "raspberry" - if (StringAt(workingString, current + 1, "P", "B")) - current += 2; - else - current += 1; - metaphoneData.Add("P"); - break; - - case 'Q': - if (workingString[current + 1] == 'Q') - current += 2; - else - current += 1; - metaphoneData.Add("K"); - break; - - case 'R': - //french e.g. 'rogier', but exclude 'hochmeier' - if (current == last && !isSlavoGermanic && StringAt(workingString, current - 2, "IE") && - !StringAt(workingString, current - 4, "ME", "MA")) - metaphoneData.Add("", "R"); - else - metaphoneData.Add("R"); - - if (workingString[current + 1] == 'R') - current += 2; - else - current += 1; - break; - - case 'S': - //special cases 'island', 'isle', 'carlisle', 'carlysle' - if (StringAt(workingString, current - 1, "ISL", "YSL")) - { - current += 1; - break; - } - - //special case 'sugar-' - if (current == 0 && StringAt(workingString, current, "SUGAR")) - { - metaphoneData.Add("X", "S"); - current += 1; - break; - } - - if (StringAt(workingString, current, "SH")) - { - //germanic - if (StringAt(workingString, current + 1, "HEIM", "HOEK", "HOLM", "HOLZ")) - metaphoneData.Add("S"); - else - metaphoneData.Add("X"); - current += 2; - break; - } - - //italian & armenian - if (StringAt(workingString, current, "SIO", "SIA") || StringAt(workingString, current, "SIAN")) - { - if (!isSlavoGermanic) - metaphoneData.Add("S", "X"); - else - metaphoneData.Add("S"); - current += 3; - break; - } - - //german & anglicisations, e.g. 'smith' match 'schmidt', 'snider' match 'schneider' - //also, -sz- in slavic language altho in hungarian it is pronounced 's' - if (current == 0 && StringAt(workingString, current + 1, "M", "N", "L", "W") || - StringAt(workingString, current + 1, "Z")) - { - metaphoneData.Add("S", "X"); - if (StringAt(workingString, current + 1, "Z")) - current += 2; - else - current += 1; - break; - } - - if (StringAt(workingString, current, "SC")) - { - //Schlesinger's rule - if (workingString[current + 2] == 'H') - { - //dutch origin, e.g. 'school', 'schooner' - if (StringAt(workingString, current + 3, "OO", "ER", "EN", "UY", "ED", "EM")) - { - //'schermerhorn', 'schenker' - if (StringAt(workingString, current + 3, "ER", "EN")) - metaphoneData.Add("X", "SK"); - else - metaphoneData.Add("SK"); - current += 3; - break; - } - if (current == 0 && !IsVowel(workingString[3]) && workingString[3] != 'W') - metaphoneData.Add("X", "S"); - else - metaphoneData.Add("X"); - current += 3; - break; - } - - if (StringAt(workingString, current + 2, "I", "E", "Y")) - { - metaphoneData.Add("S"); - current += 3; - break; - } - //else - metaphoneData.Add("SK"); - current += 3; - break; - } - - //french e.g. 'resnais', 'artois' - if (current == last && StringAt(workingString, current - 2, "AI", "OI")) - metaphoneData.Add("", "S"); - else - metaphoneData.Add("S"); - - if (StringAt(workingString, current + 1, "S", "Z")) - current += 2; - else - current += 1; - break; - - case 'T': - if (StringAt(workingString, current, "TION")) - { - metaphoneData.Add("X"); - current += 3; - break; - } - - if (StringAt(workingString, current, "TIA", "TCH")) - { - metaphoneData.Add("X"); - current += 3; - break; - } - - if (StringAt(workingString, current, "TH") || StringAt(workingString, current, "TTH")) - { - //special case 'thomas', 'thames' or germanic - if (StringAt(workingString, current + 2, "OM", "AM") || StringAt(workingString, 0, "VAN ", "VON ") || - StringAt(workingString, 0, "SCH")) - metaphoneData.Add("T"); - else - metaphoneData.Add("O", "T"); - current += 2; - break; - } - - if (StringAt(workingString, current + 1, "T", "D")) - current += 2; - else - current += 1; - metaphoneData.Add("T"); - break; - - case 'V': - if (workingString[current + 1] == 'V') - current += 2; - else - current += 1; - metaphoneData.Add("F"); - break; - - case 'W': - //can also be in middle of word - if (StringAt(workingString, current, "WR")) - { - metaphoneData.Add("R"); - current += 2; - break; - } - - if (current == 0 && (IsVowel(workingString[current + 1]) || StringAt(workingString, current, "WH"))) - if (IsVowel(workingString[current + 1])) - metaphoneData.Add("A", "F"); - else - metaphoneData.Add("A"); - - //Arnow should match Arnoff - if (current == last && IsVowel(workingString[current - 1]) || - StringAt(workingString, current - 1, "EWSKI", "EWSKY", "OWSKI", "OWSKY") - || StringAt(workingString, 0, "SCH")) - { - metaphoneData.Add("", "F"); - current += 1; - break; - } - - //polish e.g. 'filipowicz' - if (StringAt(workingString, current, "WICZ", "WITZ")) - { - metaphoneData.Add("TS", "FX"); - current += 4; - break; - } - - //else skip it - current += 1; - break; - - case 'X': - //french e.g. breaux - if ( - !(current == last && - (StringAt(workingString, current - 3, "IAU", "EAU") || StringAt(workingString, current - 2, "AU", "OU")))) - metaphoneData.Add("KS"); - - if (StringAt(workingString, current + 1, "C", "X")) - current += 2; - else - current += 1; - break; - - case 'Z': - //chinese pinyin e.g. 'zhao' - if (workingString[current + 1] == 'H') - { - metaphoneData.Add("J"); - current += 2; - break; - } - if (StringAt(workingString, current + 1, "ZO", "ZI", "ZA") || - isSlavoGermanic && current > 0 && workingString[current - 1] != 'T') - metaphoneData.Add("S", "TS"); - else - metaphoneData.Add("S"); - - if (workingString[current + 1] == 'Z') - current += 2; - else - current += 1; - break; - - default: - current += 1; - break; - } - } - - return metaphoneData.ToString(); - } - - private static bool IsVowel(this char self) - { - return self == 'A' || self == 'E' || self == 'I' || self == 'O' || self == 'U' || self == 'Y'; - } - - private static bool StartsWith(this string self, StringComparison comparison, params string[] strings) - { - foreach (string str in strings) - if (self.StartsWith(str, comparison)) - return true; - return false; - } - - private static bool StringAt(this string self, int startIndex, params string[] strings) - { - if (startIndex < 0) - startIndex = 0; - - foreach (string str in strings) - if (self.IndexOf(str, startIndex, StringComparison.OrdinalIgnoreCase) >= startIndex) - return true; - return false; - } - - internal class MetaphoneData - { - private readonly StringBuilder _primary = new StringBuilder(5); - private readonly StringBuilder _secondary = new StringBuilder(5); - - internal void Add(string main) - { - if (main != null) - { - _primary.Append(main); - _secondary.Append(main); - } - } - - internal void Add(string main, string alternative) - { - if (main != null) - _primary.Append(main); - - if (alternative != null) - { - Alternative = true; - if (alternative.Trim().Length > 0) - _secondary.Append(alternative); - } - else - { - if (main != null && main.Trim().Length > 0) - _secondary.Append(main); - } - } - - public override string ToString() - { - string ret = (Alternative ? _secondary : _primary).ToString(); - //only give back 4 char metaph - if (ret.Length > 4) - ret = ret.Substring(0, 4); - - return ret; - } - - #region Properties - - internal bool Alternative { get; set; } - - internal int PrimaryLength - { - get { return _primary.Length; } - } - - internal int SecondaryLength - { - get { return _secondary.Length; } - } - - #endregion - } - } + /// + /// DoubleMetaphone string extension + /// + /// + /// Original C++ implementation: + /// "Double Metaphone (c) 1998, 1999 by Lawrence Philips" + /// http://www.ddj.com/cpp/184401251?pgno=1 + /// + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Metaphone")] + internal static class DoubleMetaphoneStringExtension + { + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Metaphone")] + [SuppressMessage("Microsoft.Maintainability", "CA1505:AvoidUnmaintainableCode")] + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + public static string GenerateDoubleMetaphone(this string self) + { + var metaphoneData = new MetaphoneData(); + int current = 0; + + if (self.Length < 1) + return self; + int last = self.Length - 1; //zero based index + + string workingString = self.ToUpperInvariant() + " "; + + bool isSlavoGermanic = self.IndexOf('W') > -1 || self.IndexOf('K') > -1 || + self.IndexOf("CZ", StringComparison.OrdinalIgnoreCase) > -1 + || self.IndexOf("WITZ", StringComparison.OrdinalIgnoreCase) > -1; + + //skip these when at start of word + if (workingString.StartsWith(StringComparison.OrdinalIgnoreCase, "GN", "KN", "PN", "WR", "PS")) + current += 1; + + //Initial 'X' is pronounced 'Z' e.g. 'Xavier' + if (workingString[0] == 'X') + { + metaphoneData.Add("S"); //'Z' maps to 'S' + current += 1; + } + + while (metaphoneData.PrimaryLength < 4 || metaphoneData.SecondaryLength < 4) + { + if (current >= self.Length) + break; + + switch (workingString[current]) + { + case 'A': + case 'E': + case 'I': + case 'O': + case 'U': + case 'Y': + if (current == 0) + metaphoneData.Add("A"); + current += 1; + break; + + case 'B': + //"-mb", e.g", "dumb", already skipped over... + metaphoneData.Add("P"); + + if (workingString[current + 1] == 'B') + current += 2; + else + current += 1; + break; + + case 'Ã': + metaphoneData.Add("S"); + current += 1; + break; + + case 'C': + //various germanic + if (current > 1 && !IsVowel(workingString[current - 2]) && StringAt(workingString, current - 1, "ACH") && workingString[current + 2] != 'I' && + (workingString[current + 2] != 'E' || StringAt(workingString, current - 2, "BACHER", "MACHER"))) + { + metaphoneData.Add("K"); + current += 2; + break; + } + + //special case 'caesar' + if (current == 0 && StringAt(workingString, current, "CAESAR")) + { + metaphoneData.Add("S"); + current += 2; + break; + } + + //italian 'chianti' + if (StringAt(workingString, current, "CHIA")) + { + metaphoneData.Add("K"); + current += 2; + break; + } + + if (StringAt(workingString, current, "CH")) + { + //find 'michael' + if (current > 0 && StringAt(workingString, current, "CHAE")) + { + metaphoneData.Add("K", "X"); + current += 2; + break; + } + + //greek roots e.g. 'chemistry', 'chorus' + if (current == 0 && + (StringAt(workingString, current + 1, "HARAC", "HARIS") || + StringAt(workingString, current + 1, "HOR", "HYM", "HIA", "HEM")) + && !StringAt(workingString, 0, "CHORE")) + { + metaphoneData.Add("K"); + current += 2; + break; + } + + //germanic, greek, or otherwise 'ch' for 'kh' sound + if (StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH") + // 'architect but not 'arch', 'orchestra', 'orchid' + || StringAt(workingString, current - 2, "ORCHES", "ARCHIT", "ORCHID") || + StringAt(workingString, current + 2, "T", "S") + || + (StringAt(workingString, current - 1, "A", "O", "U", "E") || current == 0) + //e.g., 'wachtler', 'wechsler', but not 'tichner' + && StringAt(workingString, current + 2, "L", "R", "N", "M", "B", "H", "F", "V", "W", " ")) + metaphoneData.Add("K"); + else + { + if (current > 0) + { + if (StringAt(workingString, 0, "MC")) + metaphoneData.Add("K"); + else + metaphoneData.Add("X", "K"); + } + else + metaphoneData.Add("X"); + } + current += 2; + break; + } + //e.g, 'czerny' + if (StringAt(workingString, current, "CZ") && !StringAt(workingString, current - 2, "WICZ")) + { + metaphoneData.Add("S", "X"); + current += 2; + break; + } + + //e.g., 'focaccia' + if (StringAt(workingString, current + 1, "CIA")) + { + metaphoneData.Add("X"); + current += 3; + break; + } + + //double 'C', but not if e.g. 'McClellan' + if (StringAt(workingString, current, "CC") && !(current == 1 && workingString[0] == 'M')) + { + //'bellocchio' but not 'bacchus' + if (StringAt(workingString, current + 2, "I", "E", "H") && !StringAt(workingString, current + 2, "HU")) + { + //'accident', 'accede' 'succeed' + if (current == 1 && workingString[current - 1] == 'A' || + StringAt(workingString, current - 1, "UCCEE", "UCCES")) + metaphoneData.Add("KS"); + //'bacci', 'bertucci', other italian + else + metaphoneData.Add("X"); + current += 3; + break; + } + //Pierce's rule + metaphoneData.Add("K"); + current += 2; + break; + } + + if (StringAt(workingString, current, "CK", "CG", "CQ")) + { + metaphoneData.Add("K"); + current += 2; + break; + } + + if (StringAt(workingString, current, "CI", "CE", "CY")) + { + //italian vs. english + if (StringAt(workingString, current, "CIO", "CIE", "CIA")) + metaphoneData.Add("S", "X"); + else + metaphoneData.Add("S"); + current += 2; + break; + } + + //else + metaphoneData.Add("K"); + + //name sent in 'mac caffrey', 'mac gregor + if (StringAt(workingString, current + 1, " C", " Q", " G")) + current += 3; + else if (StringAt(workingString, current + 1, "C", "K", "Q") && !StringAt(workingString, current + 1, "CE", "CI")) + current += 2; + else + current += 1; + break; + + case 'D': + if (StringAt(workingString, current, "DG")) + { + if (StringAt(workingString, current + 2, "I", "E", "Y")) + { + //e.g. 'edge' + metaphoneData.Add("J"); + current += 3; + break; + } + //e.g. 'edgar' + metaphoneData.Add("TK"); + current += 2; + break; + } + + if (StringAt(workingString, current, "DT", "DD")) + { + metaphoneData.Add("T"); + current += 2; + break; + } + + //else + metaphoneData.Add("T"); + current += 1; + break; + + case 'F': + if (workingString[current + 1] == 'F') + current += 2; + else + current += 1; + metaphoneData.Add("F"); + break; + + case 'G': + if (workingString[current + 1] == 'H') + { + if (current > 0 && !IsVowel(workingString[current - 1])) + { + metaphoneData.Add("K"); + current += 2; + break; + } + + if (current < 3) + { + if (current == 0) + { + if (workingString[current + 2] == 'I') + metaphoneData.Add("J"); + else + metaphoneData.Add("K"); + current += 2; + break; + } + } + //Parker's rule (with some further refinements) - e.g., 'hugh' + if (current > 1 && StringAt(workingString, current - 2, "B", "H", "D") //e.g., 'bough' + || current > 2 && StringAt(workingString, current - 3, "B", "H", "D") //e.g., 'broughton' + || current > 3 && StringAt(workingString, current - 4, "B", "H")) + { + current += 2; + break; + } + //e.g., 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough' + if (current > 2 && workingString[current - 1] == 'U' && + StringAt(workingString, current - 3, "C", "G", "L", "R", "T")) + metaphoneData.Add("F"); + else if (current > 0 && workingString[current - 1] != 'I') + metaphoneData.Add("K"); + + current += 2; + break; + } + + if (workingString[current + 1] == 'N') + { + if (current == 1 && IsVowel(workingString[0]) && !isSlavoGermanic) + metaphoneData.Add("KN", "N"); + else + //not e.g. 'cagney' + if (!StringAt(workingString, current + 2, "EY") && workingString[current + 1] != 'Y' && !isSlavoGermanic) + metaphoneData.Add("N", "KN"); + else + metaphoneData.Add("KN"); + current += 2; + break; + } + + //'tagliaro' + if (StringAt(workingString, current + 1, "LI") && !isSlavoGermanic) + { + metaphoneData.Add("KL", "L"); + current += 2; + break; + } + + //-ges-,-gep-,-gel-, -gie- at beginning + if (current == 0 + && + (workingString[current + 1] == 'Y' || + StringAt(workingString, current + 1, "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER"))) + { + metaphoneData.Add("K", "J"); + current += 2; + break; + } + + // -ger-, -gy- + if ((StringAt(workingString, current + 1, "ER") || workingString[current + 1] == 'Y') && + !StringAt(workingString, 0, "DANGER", "RANGER", "MANGER") + && !StringAt(workingString, current - 1, "E", "I") && !StringAt(workingString, current - 1, "RGY", "OGY")) + { + metaphoneData.Add("K", "J"); + current += 2; + break; + } + + // italian e.g, 'biaggi' + if (StringAt(workingString, current + 1, "E", "I", "Y") || + StringAt(workingString, current - 1, "AGGI", "OGGI")) + { + //obvious germanic + if (StringAt(workingString, 0, "VAN ", "VON ") || StringAt(workingString, 0, "SCH") || + StringAt(workingString, current + 1, "ET")) + metaphoneData.Add("K"); + else + //always soft if french ending + if (StringAt(workingString, current + 1, "IER ")) + metaphoneData.Add("J"); + else + metaphoneData.Add("J", "K"); + current += 2; + break; + } + + if (workingString[current + 1] == 'G') + current += 2; + else + current += 1; + metaphoneData.Add("K"); + break; + + case 'H': + //only keep if first & before vowel or btw. 2 vowels + if ((current == 0 || IsVowel(workingString[current - 1])) && IsVowel(workingString[current + 1])) + { + metaphoneData.Add("H"); + current += 2; + } + else //also takes care of 'HH' + current += 1; + break; + + case 'J': + //obvious spanish, 'jose', 'san jacinto' + if (StringAt(workingString, current, "JOSE") || StringAt(workingString, 0, "SAN ")) + { + if (current == 0 && workingString[current + 4] == ' ' || StringAt(workingString, 0, "SAN ")) + metaphoneData.Add("H"); + else + metaphoneData.Add("J", "H"); + current += 1; + break; + } + + if (current == 0 && !StringAt(workingString, current, "JOSE")) + metaphoneData.Add("J", "A"); //Yankelovich/Jankelowicz + else + //spanish pron. of e.g. 'bajador' + if (IsVowel(workingString[current - 1]) && !isSlavoGermanic && + (workingString[current + 1] == 'A' || workingString[current + 1] == 'O')) + metaphoneData.Add("J", "H"); + else if (current == last) + metaphoneData.Add("J", " "); + else if (!StringAt(workingString, current + 1, "L", "T", "K", "S", "N", "M", "B", "Z") && + !StringAt(workingString, current - 1, "S", "K", "L")) + metaphoneData.Add("J"); + + if (workingString[current + 1] == 'J') //it could happen! + current += 2; + else + current += 1; + break; + + case 'K': + if (workingString[current + 1] == 'K') + current += 2; + else + current += 1; + metaphoneData.Add("K"); + break; + + case 'L': + if (workingString[current + 1] == 'L') + { + //spanish e.g. 'cabrillo', 'gallegos' + if (current == self.Length - 3 && StringAt(workingString, current - 1, "ILLO", "ILLA", "ALLE") + || + (StringAt(workingString, last - 1, "AS", "OS") || StringAt(workingString, last, "A", "O")) && + StringAt(workingString, current - 1, "ALLE")) + { + metaphoneData.Add("L", " "); + current += 2; + break; + } + current += 2; + } + else + current += 1; + metaphoneData.Add("L"); + break; + + case 'M': + if (StringAt(workingString, current - 1, "UMB") && + (current + 1 == last || StringAt(workingString, current + 2, "ER")) //'dumb','thumb' + || workingString[current + 1] == 'M') + current += 2; + else + current += 1; + metaphoneData.Add("M"); + break; + + case 'N': + if (workingString[current + 1] == 'N') + current += 2; + else + current += 1; + metaphoneData.Add("N"); + break; + + case 'Ð': + current += 1; + metaphoneData.Add("N"); + break; + + case 'P': + if (workingString[current + 1] == 'H') + { + metaphoneData.Add("F"); + current += 2; + break; + } + + //also account for "campbell", "raspberry" + if (StringAt(workingString, current + 1, "P", "B")) + current += 2; + else + current += 1; + metaphoneData.Add("P"); + break; + + case 'Q': + if (workingString[current + 1] == 'Q') + current += 2; + else + current += 1; + metaphoneData.Add("K"); + break; + + case 'R': + //french e.g. 'rogier', but exclude 'hochmeier' + if (current == last && !isSlavoGermanic && StringAt(workingString, current - 2, "IE") && + !StringAt(workingString, current - 4, "ME", "MA")) + metaphoneData.Add("", "R"); + else + metaphoneData.Add("R"); + + if (workingString[current + 1] == 'R') + current += 2; + else + current += 1; + break; + + case 'S': + //special cases 'island', 'isle', 'carlisle', 'carlysle' + if (StringAt(workingString, current - 1, "ISL", "YSL")) + { + current += 1; + break; + } + + //special case 'sugar-' + if (current == 0 && StringAt(workingString, current, "SUGAR")) + { + metaphoneData.Add("X", "S"); + current += 1; + break; + } + + if (StringAt(workingString, current, "SH")) + { + //germanic + if (StringAt(workingString, current + 1, "HEIM", "HOEK", "HOLM", "HOLZ")) + metaphoneData.Add("S"); + else + metaphoneData.Add("X"); + current += 2; + break; + } + + //italian & armenian + if (StringAt(workingString, current, "SIO", "SIA") || StringAt(workingString, current, "SIAN")) + { + if (!isSlavoGermanic) + metaphoneData.Add("S", "X"); + else + metaphoneData.Add("S"); + current += 3; + break; + } + + //german & anglicisations, e.g. 'smith' match 'schmidt', 'snider' match 'schneider' + //also, -sz- in slavic language altho in hungarian it is pronounced 's' + if (current == 0 && StringAt(workingString, current + 1, "M", "N", "L", "W") || + StringAt(workingString, current + 1, "Z")) + { + metaphoneData.Add("S", "X"); + if (StringAt(workingString, current + 1, "Z")) + current += 2; + else + current += 1; + break; + } + + if (StringAt(workingString, current, "SC")) + { + //Schlesinger's rule + if (workingString[current + 2] == 'H') + { + //dutch origin, e.g. 'school', 'schooner' + if (StringAt(workingString, current + 3, "OO", "ER", "EN", "UY", "ED", "EM")) + { + //'schermerhorn', 'schenker' + if (StringAt(workingString, current + 3, "ER", "EN")) + metaphoneData.Add("X", "SK"); + else + metaphoneData.Add("SK"); + current += 3; + break; + } + if (current == 0 && !IsVowel(workingString[3]) && workingString[3] != 'W') + metaphoneData.Add("X", "S"); + else + metaphoneData.Add("X"); + current += 3; + break; + } + + if (StringAt(workingString, current + 2, "I", "E", "Y")) + { + metaphoneData.Add("S"); + current += 3; + break; + } + //else + metaphoneData.Add("SK"); + current += 3; + break; + } + + //french e.g. 'resnais', 'artois' + if (current == last && StringAt(workingString, current - 2, "AI", "OI")) + metaphoneData.Add("", "S"); + else + metaphoneData.Add("S"); + + if (StringAt(workingString, current + 1, "S", "Z")) + current += 2; + else + current += 1; + break; + + case 'T': + if (StringAt(workingString, current, "TION")) + { + metaphoneData.Add("X"); + current += 3; + break; + } + + if (StringAt(workingString, current, "TIA", "TCH")) + { + metaphoneData.Add("X"); + current += 3; + break; + } + + if (StringAt(workingString, current, "TH") || StringAt(workingString, current, "TTH")) + { + //special case 'thomas', 'thames' or germanic + if (StringAt(workingString, current + 2, "OM", "AM") || StringAt(workingString, 0, "VAN ", "VON ") || + StringAt(workingString, 0, "SCH")) + metaphoneData.Add("T"); + else + metaphoneData.Add("O", "T"); + current += 2; + break; + } + + if (StringAt(workingString, current + 1, "T", "D")) + current += 2; + else + current += 1; + metaphoneData.Add("T"); + break; + + case 'V': + if (workingString[current + 1] == 'V') + current += 2; + else + current += 1; + metaphoneData.Add("F"); + break; + + case 'W': + //can also be in middle of word + if (StringAt(workingString, current, "WR")) + { + metaphoneData.Add("R"); + current += 2; + break; + } + + if (current == 0 && (IsVowel(workingString[current + 1]) || StringAt(workingString, current, "WH"))) + { + if (IsVowel(workingString[current + 1])) + metaphoneData.Add("A", "F"); + else + metaphoneData.Add("A"); + } + + //Arnow should match Arnoff + if (current == last && IsVowel(workingString[current - 1]) || + StringAt(workingString, current - 1, "EWSKI", "EWSKY", "OWSKI", "OWSKY") + || StringAt(workingString, 0, "SCH")) + { + metaphoneData.Add("", "F"); + current += 1; + break; + } + + //polish e.g. 'filipowicz' + if (StringAt(workingString, current, "WICZ", "WITZ")) + { + metaphoneData.Add("TS", "FX"); + current += 4; + break; + } + + //else skip it + current += 1; + break; + + case 'X': + //french e.g. breaux + if ( + !(current == last && + (StringAt(workingString, current - 3, "IAU", "EAU") || StringAt(workingString, current - 2, "AU", "OU")))) + metaphoneData.Add("KS"); + + if (StringAt(workingString, current + 1, "C", "X")) + current += 2; + else + current += 1; + break; + + case 'Z': + //chinese pinyin e.g. 'zhao' + if (workingString[current + 1] == 'H') + { + metaphoneData.Add("J"); + current += 2; + break; + } + if (StringAt(workingString, current + 1, "ZO", "ZI", "ZA") || + isSlavoGermanic && current > 0 && workingString[current - 1] != 'T') + metaphoneData.Add("S", "TS"); + else + metaphoneData.Add("S"); + + if (workingString[current + 1] == 'Z') + current += 2; + else + current += 1; + break; + + default: + current += 1; + break; + } + } + + return metaphoneData.ToString(); + } + + private static bool IsVowel(this char self) + { + return self == 'A' || self == 'E' || self == 'I' || self == 'O' || self == 'U' || self == 'Y'; + } + + private static bool StartsWith(this string self, StringComparison comparison, params string[] strings) + { + foreach (string str in strings) + { + if (self.StartsWith(str, comparison)) + return true; + } + return false; + } + + private static bool StringAt(this string self, int startIndex, params string[] strings) + { + if (startIndex < 0) + startIndex = 0; + + foreach (string str in strings) + { + if (self.IndexOf(str, startIndex, StringComparison.OrdinalIgnoreCase) >= startIndex) + return true; + } + return false; + } + + internal class MetaphoneData + { + private readonly StringBuilder _primary = new StringBuilder(5); + private readonly StringBuilder _secondary = new StringBuilder(5); + + internal void Add(string main) + { + if (main != null) + { + _primary.Append(main); + _secondary.Append(main); + } + } + + internal void Add(string main, string alternative) + { + if (main != null) + _primary.Append(main); + + if (alternative != null) + { + Alternative = true; + if (alternative.Trim().Length > 0) + _secondary.Append(alternative); + } + else + { + if (main != null && main.Trim().Length > 0) + _secondary.Append(main); + } + } + + public override string ToString() + { + string ret = (Alternative ? _secondary : _primary).ToString(); + //only give back 4 char metaph + if (ret.Length > 4) + ret = ret.Substring(0, 4); + + return ret; + } + + #region Properties + + internal bool Alternative { get; set; } + + internal int PrimaryLength + { + get { return _primary.Length; } + } + + internal int SecondaryLength + { + get { return _secondary.Length; } + } + + #endregion + } + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Utilities/Rhymer.cs b/Rant/Vocabulary/Utilities/Rhymer.cs index 2f2760a..2eb612b 100644 --- a/Rant/Vocabulary/Utilities/Rhymer.cs +++ b/Rant/Vocabulary/Utilities/Rhymer.cs @@ -30,178 +30,190 @@ namespace Rant.Vocabulary.Utilities { - internal class Rhymer - { - private static readonly char[] _vowels = { 'a', 'e', 'i', 'o', 'u', 'y' }; - private static readonly char[] _vowelSounds = { 'A', 'i', 'I', 'E', 'e', '3', '{', 'V', 'O', 'U', 'u', '^' }; - - public Rhymer() - { - AllowedRhymes = RhymeFlags.Perfect; - } - - public RhymeFlags AllowedRhymes { get; set; } - private bool IsEnabled(RhymeFlags flags) => (AllowedRhymes & flags) == flags; - - public bool Rhyme(RantDictionaryTerm term1, RantDictionaryTerm term2) - { - bool hasStress = term1.Pronunciation.IndexOf('"') > -1 && term2.Pronunciation.IndexOf('"') > -1; - // syllables after the stress are the same - if (IsEnabled(RhymeFlags.Perfect) && hasStress) - { - string pron1 = term1.Pronunciation.Substring(term1.Pronunciation.IndexOf('"')).Replace("-", string.Empty); - string pron2 = term2.Pronunciation.Substring(term2.Pronunciation.IndexOf('"')).Replace("-", string.Empty); - pron1 = GetFirstVowelSound(pron1); - pron2 = GetFirstVowelSound(pron2); - if (pron1 == pron2) return true; - } - // last syllables are the same - if (IsEnabled(RhymeFlags.Syllabic)) - if (term1.Syllables.Last() == term2.Syllables.Last()) return true; - // penultimate syllable is stressed but does not rhyme, last syllable rhymes - if (IsEnabled(RhymeFlags.Weak) && hasStress) - if ( - term1.SyllableCount >= 2 && - term2.SyllableCount >= 2 && - term1.Syllables[term1.SyllableCount - 2].IndexOf('"') > -1 && - term2.Syllables[term2.SyllableCount - 2].IndexOf('"') > -1 && - GetFirstVowelSound(term1.Syllables.Last()) == GetFirstVowelSound(term2.Syllables.Last()) - ) - return true; - if (IsEnabled(RhymeFlags.Semirhyme)) - if (Math.Abs(term1.SyllableCount - term2.SyllableCount) == 1) - { - var longestWord = term1.SyllableCount > term2.SyllableCount ? term1 : term2; - var shortestWord = term1.SyllableCount > term2.SyllableCount ? term2 : term1; - if ( - GetFirstVowelSound(longestWord.Syllables[longestWord.SyllableCount - 2]) == - GetFirstVowelSound(shortestWord.Syllables.Last())) - return true; - } - // psuedo-sound similar - if (IsEnabled(RhymeFlags.Forced)) - { - int distance = LevenshteinDistance( - term1.Value.GenerateDoubleMetaphone(), - term2.Value.GenerateDoubleMetaphone() - ); - if (distance <= 1) - return true; - } - // matching final consonants - if (IsEnabled(RhymeFlags.SlantRhyme)) - { - // WE ARE REVERSING THESE STRINGS OK - string word1 = new string(term1.Value.Reverse().ToArray()); - string word2 = new string(term2.Value.Reverse().ToArray()); - if (GetFirstConsonants(word1) == GetFirstConsonants(word2)) - return true; - } - // matching first consonants - if (IsEnabled(RhymeFlags.Alliteration)) - if (GetFirstConsonants(term1.Value) == GetFirstConsonants(term2.Value)) - return true; - // matching all consonants - if (IsEnabled(RhymeFlags.Pararhyme)) - if (term1.Value - .Where(x => !_vowels.Contains(x)) - .SequenceEqual( - term2.Value - .Where(x => !_vowels.Contains(x)) - )) - return true; - - return false; - } - - public string GetFirstConsonants(string word) - { - int i; - for (i = 0; i < word.Length; i++) - if (_vowels.Contains(word[i])) - break; - if (i > 0) - return word.Substring(0, i); - return word; - } - - // basically, strip consonants from the pronunciation - public string GetFirstVowelSound(string pron) - { - int i; - for (i = 0; i < pron.Length; i++) - if (_vowelSounds.Contains(pron[i])) - break; - return pron.Substring(i); - } - - // https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C.23 - public int LevenshteinDistance(string source, string target) - { - if (string.IsNullOrEmpty(source)) - { - if (string.IsNullOrEmpty(target)) return 0; - return target.Length; - } - if (string.IsNullOrEmpty(target)) return source.Length; - - if (source.Length > target.Length) - { - string temp = target; - target = source; - source = temp; - } - - int m = target.Length; - int n = source.Length; - var distance = new int[2, m + 1]; - // Initialize the distance 'matrix' - for (int j = 1; j <= m; j++) distance[0, j] = j; - - int currentRow = 0; - for (int i = 1; i <= n; ++i) - { - currentRow = i & 1; - distance[currentRow, 0] = i; - int previousRow = currentRow ^ 1; - for (int j = 1; j <= m; j++) - { - int cost = target[j - 1] == source[i - 1] ? 0 : 1; - distance[currentRow, j] = Math.Min(Math.Min( - distance[previousRow, j] + 1, - distance[currentRow, j - 1] + 1), - distance[previousRow, j - 1] + cost); - } - } - return distance[currentRow, m]; - } - } - - [Flags] - internal enum RhymeFlags : byte - { - [RantDescription("Everything after the first stressed vowel matches in pronunciation (picky / icky).")] - Perfect = 0x01, - - [RantDescription("The penultimate syllable is stressed and the final syllable rhymes (coffin / raisin).")] - Weak = 0x02, - - [RantDescription("The final syllable rhymes (senator / otter).")] - Syllabic = 0x04, - - [RantDescription("The words would rhyme if not for the final syllable (broom / broomstick).")] - Semirhyme = 0x08, - - [RantDescription("The words might rhyme if you really pushed it.")] - Forced = 0x10, - - [RantDescription("The ending consonants are the same (rant / ant).")] - SlantRhyme = 0x20, - - [RantDescription("All the consonants match (tuna / teen).")] - Pararhyme = 0x40, - - [RantDescription("All consonants up to the first vowel rhyme (dog / dude).")] - Alliteration = 0x80 - } + internal class Rhymer + { + private static readonly char[] _vowels = { 'a', 'e', 'i', 'o', 'u', 'y' }; + private static readonly char[] _vowelSounds = { 'A', 'i', 'I', 'E', 'e', '3', '{', 'V', 'O', 'U', 'u', '^' }; + + public Rhymer() + { + AllowedRhymes = RhymeFlags.Perfect; + } + + public RhymeFlags AllowedRhymes { get; set; } + private bool IsEnabled(RhymeFlags flags) => (AllowedRhymes & flags) == flags; + + public bool Rhyme(RantDictionaryTerm term1, RantDictionaryTerm term2) + { + bool hasStress = term1.Pronunciation.IndexOf('"') > -1 && term2.Pronunciation.IndexOf('"') > -1; + // syllables after the stress are the same + if (IsEnabled(RhymeFlags.Perfect) && hasStress) + { + string pron1 = term1.Pronunciation.Substring(term1.Pronunciation.IndexOf('"')).Replace("-", string.Empty); + string pron2 = term2.Pronunciation.Substring(term2.Pronunciation.IndexOf('"')).Replace("-", string.Empty); + pron1 = GetFirstVowelSound(pron1); + pron2 = GetFirstVowelSound(pron2); + if (pron1 == pron2) return true; + } + // last syllables are the same + if (IsEnabled(RhymeFlags.Syllabic)) + if (term1.Syllables.Last() == term2.Syllables.Last()) return true; + // penultimate syllable is stressed but does not rhyme, last syllable rhymes + if (IsEnabled(RhymeFlags.Weak) && hasStress) + { + if ( + term1.SyllableCount >= 2 && + term2.SyllableCount >= 2 && + term1.Syllables[term1.SyllableCount - 2].IndexOf('"') > -1 && + term2.Syllables[term2.SyllableCount - 2].IndexOf('"') > -1 && + GetFirstVowelSound(term1.Syllables.Last()) == GetFirstVowelSound(term2.Syllables.Last()) + ) + return true; + } + if (IsEnabled(RhymeFlags.Semirhyme)) + { + if (Math.Abs(term1.SyllableCount - term2.SyllableCount) == 1) + { + var longestWord = term1.SyllableCount > term2.SyllableCount ? term1 : term2; + var shortestWord = term1.SyllableCount > term2.SyllableCount ? term2 : term1; + if ( + GetFirstVowelSound(longestWord.Syllables[longestWord.SyllableCount - 2]) == + GetFirstVowelSound(shortestWord.Syllables.Last())) + return true; + } + } + // psuedo-sound similar + if (IsEnabled(RhymeFlags.Forced)) + { + int distance = LevenshteinDistance( + term1.Value.GenerateDoubleMetaphone(), + term2.Value.GenerateDoubleMetaphone() + ); + if (distance <= 1) + return true; + } + // matching final consonants + if (IsEnabled(RhymeFlags.SlantRhyme)) + { + // WE ARE REVERSING THESE STRINGS OK + string word1 = new string(term1.Value.Reverse().ToArray()); + string word2 = new string(term2.Value.Reverse().ToArray()); + if (GetFirstConsonants(word1) == GetFirstConsonants(word2)) + return true; + } + // matching first consonants + if (IsEnabled(RhymeFlags.Alliteration)) + { + if (GetFirstConsonants(term1.Value) == GetFirstConsonants(term2.Value)) + return true; + } + // matching all consonants + if (IsEnabled(RhymeFlags.Pararhyme)) + { + if (term1.Value + .Where(x => !_vowels.Contains(x)) + .SequenceEqual( + term2.Value + .Where(x => !_vowels.Contains(x)) + )) + return true; + } + + return false; + } + + public string GetFirstConsonants(string word) + { + int i; + for (i = 0; i < word.Length; i++) + { + if (_vowels.Contains(word[i])) + break; + } + if (i > 0) + return word.Substring(0, i); + return word; + } + + // basically, strip consonants from the pronunciation + public string GetFirstVowelSound(string pron) + { + int i; + for (i = 0; i < pron.Length; i++) + { + if (_vowelSounds.Contains(pron[i])) + break; + } + return pron.Substring(i); + } + + // https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C.23 + public int LevenshteinDistance(string source, string target) + { + if (string.IsNullOrEmpty(source)) + { + if (string.IsNullOrEmpty(target)) return 0; + return target.Length; + } + if (string.IsNullOrEmpty(target)) return source.Length; + + if (source.Length > target.Length) + { + string temp = target; + target = source; + source = temp; + } + + int m = target.Length; + int n = source.Length; + var distance = new int[2, m + 1]; + // Initialize the distance 'matrix' + for (int j = 1; j <= m; j++) distance[0, j] = j; + + int currentRow = 0; + for (int i = 1; i <= n; ++i) + { + currentRow = i & 1; + distance[currentRow, 0] = i; + int previousRow = currentRow ^ 1; + for (int j = 1; j <= m; j++) + { + int cost = target[j - 1] == source[i - 1] ? 0 : 1; + distance[currentRow, j] = Math.Min(Math.Min( + distance[previousRow, j] + 1, + distance[currentRow, j - 1] + 1), + distance[previousRow, j - 1] + cost); + } + } + return distance[currentRow, m]; + } + } + + [Flags] + internal enum RhymeFlags : byte + { + [RantDescription("Everything after the first stressed vowel matches in pronunciation (picky / icky).")] + Perfect = 0x01, + + [RantDescription("The penultimate syllable is stressed and the final syllable rhymes (coffin / raisin).")] + Weak = 0x02, + + [RantDescription("The final syllable rhymes (senator / otter).")] + Syllabic = 0x04, + + [RantDescription("The words would rhyme if not for the final syllable (broom / broomstick).")] + Semirhyme = 0x08, + + [RantDescription("The words might rhyme if you really pushed it.")] + Forced = 0x10, + + [RantDescription("The ending consonants are the same (rant / ant).")] + SlantRhyme = 0x20, + + [RantDescription("All the consonants match (tuna / teen).")] + Pararhyme = 0x40, + + [RantDescription("All consonants up to the first vowel rhyme (dog / dude).")] + Alliteration = 0x80 + } } \ No newline at end of file diff --git a/Rant/Vocabulary/Utilities/VocabUtils.cs b/Rant/Vocabulary/Utilities/VocabUtils.cs index 997c7ea..d6dc6fc 100644 --- a/Rant/Vocabulary/Utilities/VocabUtils.cs +++ b/Rant/Vocabulary/Utilities/VocabUtils.cs @@ -29,123 +29,120 @@ namespace Rant.Vocabulary.Utilities { - internal static class VocabUtils - { - private static readonly Dictionary StringCache = new Dictionary(); - - public static RantDictionaryEntry PickEntry(this List hash, RNG rng) - { - return hash.Any() ? hash[rng.Next(hash.Count)] : null; - } - public static RantDictionaryEntry PickEntry(this IEnumerable enumerable, RNG rng) - { - var array = enumerable as RantDictionaryEntry[] ?? enumerable.ToArray(); - return array.Length > 0 ? array[rng.Next(array.Length)] : null; - } - - public static IEnumerable GetArgs(string argString) - { - if (argString.Length == 0) yield break; - bool escape = false; - bool scope = false; - bool scopeUsed = false; - int length = argString.Length; - int i = 0; - var sb = new StringBuilder(); - do - { - if (i >= length || char.IsWhiteSpace(argString[i]) && !scope) - { - if (sb.Length == 0 && !scopeUsed) continue; - yield return sb.ToString(); - sb.Length = 0; - scopeUsed = false; - } - else if (!escape && argString[i] == '\\') - { - escape = true; - } - else if (escape) - { - sb.Append(argString[i]); - escape = false; - } - else if (argString[i] == '"') - { - scope = !scope; - scopeUsed = true; - } - else - { - sb.Append(argString[i]); - } - } while (i++ <= length); - } - - public static string GetString(string str) - { + internal static class VocabUtils + { + private static readonly Dictionary StringCache = new Dictionary(); + + public static RantDictionaryEntry PickEntry(this List hash, RNG rng) + { + return hash.Any() ? hash[rng.Next(hash.Count)] : null; + } + + public static RantDictionaryEntry PickEntry(this IEnumerable enumerable, RNG rng) + { + var array = enumerable as RantDictionaryEntry[] ?? enumerable.ToArray(); + return array.Length > 0 ? array[rng.Next(array.Length)] : null; + } + + public static IEnumerable GetArgs(string argString) + { + if (argString.Length == 0) yield break; + bool escape = false; + bool scope = false; + bool scopeUsed = false; + int length = argString.Length; + int i = 0; + var sb = new StringBuilder(); + do + { + if (i >= length || char.IsWhiteSpace(argString[i]) && !scope) + { + if (sb.Length == 0 && !scopeUsed) continue; + yield return sb.ToString(); + sb.Length = 0; + scopeUsed = false; + } + else if (!escape && argString[i] == '\\') + escape = true; + else if (escape) + { + sb.Append(argString[i]); + escape = false; + } + else if (argString[i] == '"') + { + scope = !scope; + scopeUsed = true; + } + else + sb.Append(argString[i]); + } while (i++ <= length); + } + + public static string GetString(string str) + { if (!StringCache.TryGetValue(str, out string cstr)) cstr = StringCache[str] = str; return cstr; - } + } - public static bool AssociatesWith(this RantDictionaryEntry a, RantDictionaryEntry b) - { - if (a == null || b == null) return false; + public static bool AssociatesWith(this RantDictionaryEntry a, RantDictionaryEntry b) + { + if (a == null || b == null) return false; - bool aNoneRequired = !a.GetRequiredClasses().Any(); - bool bNoneRequired = !b.GetRequiredClasses().Any(); + bool aNoneRequired = !a.GetRequiredClasses().Any(); + bool bNoneRequired = !b.GetRequiredClasses().Any(); - if (aNoneRequired && bNoneRequired) return true; // If both have no required classes, pass. + if (aNoneRequired && bNoneRequired) return true; // If both have no required classes, pass. - // One or both have required classes. + // One or both have required classes. - // Remove B optionals from A required. - var aRequired = a.GetRequiredClasses().Except(b.GetOptionalClasses()); - // Remove A optionals from B required. - var bRequired = b.GetRequiredClasses().Except(a.GetOptionalClasses()); + // Remove B optionals from A required. + var aRequired = a.GetRequiredClasses().Except(b.GetOptionalClasses()); + // Remove A optionals from B required. + var bRequired = b.GetRequiredClasses().Except(a.GetOptionalClasses()); - // Both should be either empty, or have exactly the same classes. - return !aRequired.Except(bRequired).Any() && aRequired.Any() == bRequired.Any(); - } + // Both should be either empty, or have exactly the same classes. + return !aRequired.Except(bRequired).Any() && aRequired.Any() == bRequired.Any(); + } - public static bool RelatesWith(this RantDictionaryEntry a, RantDictionaryEntry b) - { - if (a == null || b == null) return false; + public static bool RelatesWith(this RantDictionaryEntry a, RantDictionaryEntry b) + { + if (a == null || b == null) return false; - bool aNoneRequired = !a.GetRequiredClasses().Any(); - bool bNoneRequired = !b.GetRequiredClasses().Any(); + bool aNoneRequired = !a.GetRequiredClasses().Any(); + bool bNoneRequired = !b.GetRequiredClasses().Any(); - if (aNoneRequired && bNoneRequired) return true; // If both have no required classes, pass. + if (aNoneRequired && bNoneRequired) return true; // If both have no required classes, pass. - // One or both have required classes. + // One or both have required classes. - // Remove B optionals from A required. - var aRequired = a.GetRequiredClasses().Except(b.GetOptionalClasses()); - // Remove A optionals from B required. - var bRequired = b.GetRequiredClasses().Except(a.GetOptionalClasses()); + // Remove B optionals from A required. + var aRequired = a.GetRequiredClasses().Except(b.GetOptionalClasses()); + // Remove A optionals from B required. + var bRequired = b.GetRequiredClasses().Except(a.GetOptionalClasses()); - // Both should share at least one class. - return aRequired.Intersect(bRequired).Any(); - } + // Both should share at least one class. + return aRequired.Intersect(bRequired).Any(); + } - public static bool DivergesFrom(this RantDictionaryEntry a, RantDictionaryEntry b) - { - if (a == null || b == null) return false; + public static bool DivergesFrom(this RantDictionaryEntry a, RantDictionaryEntry b) + { + if (a == null || b == null) return false; - bool aNoneRequired = !a.GetRequiredClasses().Any(); - bool bNoneRequired = !b.GetRequiredClasses().Any(); + bool aNoneRequired = !a.GetRequiredClasses().Any(); + bool bNoneRequired = !b.GetRequiredClasses().Any(); - if (aNoneRequired && bNoneRequired) return true; // If both have no required classes, pass. + if (aNoneRequired && bNoneRequired) return true; // If both have no required classes, pass. - // One or both have required classes. + // One or both have required classes. - // Remove B optionals from A required. - var aRequired = a.GetRequiredClasses().Except(b.GetOptionalClasses()); - // Remove A optionals from B required. - var bRequired = b.GetRequiredClasses().Except(a.GetOptionalClasses()); + // Remove B optionals from A required. + var aRequired = a.GetRequiredClasses().Except(b.GetOptionalClasses()); + // Remove A optionals from B required. + var bRequired = b.GetRequiredClasses().Except(a.GetOptionalClasses()); - // Both should be either empty, or differ by at least one class. - return aRequired.Except(bRequired).Any() || bRequired.Except(aRequired).Any(); - } - } + // Both should be either empty, or differ by at least one class. + return aRequired.Except(bRequired).Any() || bRequired.Except(aRequired).Any(); + } + } } \ No newline at end of file From 28973f8c7819faf93bd84434efe7ba3ea5b31073 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 10 Mar 2017 00:07:58 -0600 Subject: [PATCH 122/213] Update appveyor.yml --- appveyor.yml | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 5018d02..d1b37bc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,7 +3,7 @@ branches: only: - master - dev-3.0 -image: Visual Studio 2015 +image: Visual Studio 2017 configuration: Release shallow_clone: true assembly_info: @@ -15,26 +15,17 @@ assembly_info: build_script: - ps: >- nuget restore - - $env:Path = "C:\Program Files (x86)\MSBuild\14.0\Bin;" + $env:Path - - + $env:Path = "C:\Program Files (x86)\MSBuild\15.0\Bin;" + $env:Path $pkgVersion = $env:APPVEYOR_BUILD_VERSION - if ($env:APPVEYOR_REPO_BRANCH -like "dev*") - { $pkgVersion += "-dev" } - msbuild "Rant.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /p:Configuration="Release" /p:Platform="Any CPU" - - msbuild "Rant.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /p:Configuration="Unity" /p:Platform="Any CPU" - nuget pack Rant/Rant.csproj -Version $pkgVersion -OutputDirectory Rant artifacts: - path: bin\MainBuild From 741150c3830b7128488eaf9fa2d8c4bc12822c72 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 10 Mar 2017 00:09:10 -0600 Subject: [PATCH 123/213] Update appveyor.yml --- appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index d1b37bc..ff1dd06 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -50,4 +50,5 @@ only_commits: - Rant.Tests/ - Rant.Tools/ - '*.cs' - - '*.sln' \ No newline at end of file + - '*.sln' + - 'appveyor.yml' \ No newline at end of file From 80817d56b35d4bdca5fad266adb79ee43cd5b2b6 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 10 Mar 2017 00:13:22 -0600 Subject: [PATCH 124/213] Update appveyor.yml --- appveyor.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index ff1dd06..6d824a4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,15 +15,19 @@ assembly_info: build_script: - ps: >- nuget restore + $env:Path = "C:\Program Files (x86)\MSBuild\15.0\Bin;" + $env:Path + $pkgVersion = $env:APPVEYOR_BUILD_VERSION if ($env:APPVEYOR_REPO_BRANCH -like "dev*") + { $pkgVersion += "-dev" } msbuild "Rant.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /p:Configuration="Release" /p:Platform="Any CPU" + msbuild "Rant.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /p:Configuration="Unity" /p:Platform="Any CPU" nuget pack Rant/Rant.csproj -Version $pkgVersion -OutputDirectory Rant From cfab3f79e0d13a41e06bd190cecf9c9e5625c9a1 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 10 Mar 2017 00:22:19 -0600 Subject: [PATCH 125/213] Update appveyor.yml --- appveyor.yml | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 6d824a4..7ae7ef9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,25 +12,11 @@ assembly_info: assembly_version: '{version}' assembly_file_version: '{version}' assembly_informational_version: '{version}' -build_script: -- ps: >- - nuget restore - - $env:Path = "C:\Program Files (x86)\MSBuild\15.0\Bin;" + $env:Path - - $pkgVersion = $env:APPVEYOR_BUILD_VERSION - - if ($env:APPVEYOR_REPO_BRANCH -like "dev*") - - { - $pkgVersion += "-dev" - } - - msbuild "Rant.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /p:Configuration="Release" /p:Platform="Any CPU" - - msbuild "Rant.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /p:Configuration="Unity" /p:Platform="Any CPU" - - nuget pack Rant/Rant.csproj -Version $pkgVersion -OutputDirectory Rant +build: + parallel: true + verbosity: minimal +after_build: +- ps: "$pkgVersion = $env:APPVEYOR_BUILD_VERSION\n\nif ($env:APPVEYOR_REPO_BRANCH -like \"dev*\")\n \n{\n $pkgVersion += \"-dev\"\n}\n\nnuget pack Rant/Rant.csproj -Version $pkgVersion -OutputDirectory Rant" artifacts: - path: bin\MainBuild name: Rant From e82be213a0e6737ee1d4f9bcffec2234643451ce Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 10 Mar 2017 00:28:05 -0600 Subject: [PATCH 126/213] Update appveyor.yml --- appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 7ae7ef9..3bf9042 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,6 +15,8 @@ assembly_info: build: parallel: true verbosity: minimal +before_build: +- ps: "nuget restore" after_build: - ps: "$pkgVersion = $env:APPVEYOR_BUILD_VERSION\n\nif ($env:APPVEYOR_REPO_BRANCH -like \"dev*\")\n \n{\n $pkgVersion += \"-dev\"\n}\n\nnuget pack Rant/Rant.csproj -Version $pkgVersion -OutputDirectory Rant" artifacts: From c509919779aba28a46f09aea752d9525747473dd Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Sun, 12 Mar 2017 17:45:04 -0400 Subject: [PATCH 127/213] Hidden class filtering. --- Rant/Vocabulary/ClassTree.cs | 10 +++++----- Rant/Vocabulary/RantDictionaryTable.cs | 23 +++++++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs index 9cde7d0..c281d85 100644 --- a/Rant/Vocabulary/ClassTree.cs +++ b/Rant/Vocabulary/ClassTree.cs @@ -55,12 +55,12 @@ public ClassTree(IEnumerable entries) } } - public IEnumerable Query(IEnumerable classes) + public IEnumerable Query(IEnumerable classes, HashSet hiddenClasses) { - return QueryNode(RootNode, new HashSet(classes)); + return QueryNode(RootNode, new HashSet(classes), hiddenClasses); } - private IEnumerable QueryNode(ClassTreeNode node, HashSet classes) + private IEnumerable QueryNode(ClassTreeNode node, HashSet classes, HashSet hiddenClasses) { if (node.DepthLimit) return node.Entries.Where(e => classes.All(c => e.ContainsClass(c))); @@ -76,10 +76,10 @@ private IEnumerable QueryNode(ClassTreeNode node, HashSet(); - return node.Entries; + return node.Entries.Where(e => !e.GetClasses().Any(c => hiddenClasses.Contains(c))); } - return QueryNode(largestClass, new HashSet(classes.Where(c => c != largestClass.Name))); + return QueryNode(largestClass, new HashSet(classes.Where(c => c != largestClass.Name)), hiddenClasses); } private void PopulateNode(ClassTreeNode node, IEnumerable entries) diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index b31ae03..b902e42 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -45,6 +45,8 @@ public sealed partial class RantDictionaryTable : RantResource internal const string MissingTerm = "[?]"; private readonly HashSet _entriesHash = new HashSet(); private readonly List _entriesList = new List(); // TODO: Use for indexing / weighted selection + // entries that don't have any hidden classes + private readonly List _visibleEntriesList = new List(); private readonly HashSet _hidden = new HashSet(new[] { NSFW }); private readonly Dictionary> _subtypeIndexMap = new Dictionary>(); private readonly Dictionary _subtypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); @@ -148,7 +150,9 @@ public bool AddEntry(RantDictionaryEntry entry) if (entry == null) throw new ArgumentNullException(nameof(entry)); if (entry.TermCount != TermsPerEntry) return false; if (!_entriesHash.Add(entry)) return false; - _entriesList.Add(entry); + if (entry.GetClasses().All(c => !_hidden.Contains(c))) + _visibleEntriesList.Add(entry); + _entriesList.Add(entry); return true; } @@ -161,7 +165,9 @@ public bool RemoveEntry(RantDictionaryEntry entry) { if (entry == null) throw new ArgumentNullException(nameof(entry)); if (!_entriesHash.Remove(entry)) return false; - _entriesList.Remove(entry); + if(entry.GetClasses().All(c => !_hidden.Contains(c))) + _visibleEntriesList.Add(entry); + _entriesList.Remove(entry); return true; } @@ -264,7 +270,8 @@ public bool Merge(RantDictionaryTable other) if (other.Name != Name || other == this) return false; if (other.TermsPerEntry != TermsPerEntry) return false; _entriesHash.AddRange(other._entriesHash); - _entriesList.AddRange(other._entriesHash); + _visibleEntriesList.AddRange(other._visibleEntriesList); + _entriesList.AddRange(other._entriesHash); Commit(); return true; } @@ -289,7 +296,7 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q if (index == -1) return null; - if (query.BareQuery) return _entriesList.PickEntry(sb.RNG)?[index]; + if (query.BareQuery) return _visibleEntriesList.PickEntry(sb.RNG)?[index]; // process simple class filters using class tree var filters = query.GetFilters(); @@ -299,16 +306,16 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q filters = filters.Where(f => !(f is ClassFilter) || !(f as ClassFilter).SimpleFilter); - IEnumerable pool = _entriesList; + IEnumerable pool = _visibleEntriesList; if (classes.Any()) - pool = _classTree.Query(classes); + pool = _classTree.Query(classes, new HashSet(_hidden.Where(c => !classes.Contains(c)))); // if it's just the class filters, let's leave now if (!filters.Any() && !query.HasCarrier) return pool.ToList().PickEntry(sb.RNG)?[index]; - // process syllable count filters using syllable buckets - var rangeFilters = filters.Where(f => f is RangeFilter).Select(f => f as RangeFilter); + // process syllable count filters using syllable buckets + var rangeFilters = filters.OfType(); if (rangeFilters.Any()) { CreateSyllableBuckets(); From e92670d713dc6876a508833c7933cf87fca6aeed Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 13 Mar 2017 11:01:09 -0500 Subject: [PATCH 128/213] Improve pluralizer --- Rant/Formats/EnglishPluralizer.cs | 42 ++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/Rant/Formats/EnglishPluralizer.cs b/Rant/Formats/EnglishPluralizer.cs index 8fb3bf5..f2d68ac 100644 --- a/Rant/Formats/EnglishPluralizer.cs +++ b/Rant/Formats/EnglishPluralizer.cs @@ -41,26 +41,25 @@ public sealed class EnglishPluralizer : Pluralizer { 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z' }); private static readonly HashSet hardConsonants = - new HashSet(new[] { 'b', 'c', 'd', 'f', 'g', 'j', 'm', 'q', 's', 'v', 'x', 'z' }); + new HashSet(new[] { 'j', 's', 'x', 'z' }); + + private static readonly HashSet compounds = + new HashSet(new[] { + " of staff", + "-in-law" + }); private static readonly Dictionary irregulars = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { { "man", "men" }, + { "safe", "safes" }, { "foot", "feet" }, { "tooth", "teeth" }, { "antenna", "antennae" }, { "thesis", "theses" }, { "axis", "axes" }, { "basis", "bases" }, - { "leaf", "leaves" }, - { "calf", "calves" }, - { "knife", "knives" }, - { "life", "lives" }, - { "dwarf", "dwarves" }, - { "wolf", "wolves" }, - { "hoof", "hooves" }, - { "elf", "elves" }, { "goose", "geese" }, { "louse", "lice" }, { "mouse", "mice" }, @@ -73,6 +72,8 @@ public sealed class EnglishPluralizer : Pluralizer { "criterion", "criteria" }, { "passerby", "passersby" }, { "ox", "oxen" }, + { "fox", "foxes" }, + { "piano", "pianos" }, { "alumnus", "alumni" }, { "cactus", "cacti" }, { "fungus", "fungi" }, @@ -80,7 +81,18 @@ public sealed class EnglishPluralizer : Pluralizer { "nucleus", "nuclei" }, { "radius", "radii" }, { "stimulus", "stimuli" }, - { "child", "children" } + { "child", "children" }, + { "pro", "pros" }, + { "zero", "zeros" }, + { "photo", "photos" }, + { "kimono", "kimonos" }, + { "canto", "cantos" }, + { "hetero", "heteros" }, + { "crisis", "crises" }, + { "testis", "testes" }, + { "nemesis", "nemeses" }, + { "genesis", "geneses" }, + { "matrix", "matrices" } }; private static readonly HashSet ignore = new HashSet(StringComparer.InvariantCultureIgnoreCase) @@ -122,19 +134,25 @@ public override string Pluralize(string input) if ((result = irregulars.Keys.FirstOrDefault(w => input.EndsWith(w))) != null) return input.Substring(0, l - result.Length) + irregulars[result]; + if (input.EndsWith("ff")) return input + "s"; + + if (input[l - 1] == 'f') return input.Substring(0, l - 1) + "ves"; + + if (input.EndsWith("fe")) return input.Substring(0, l - 2) + "ves"; + if (consonants.Contains(input[l - 2])) { // With nouns ending in o preceded by a consonant, the plural in many cases is spelled by adding -es... if (input.EndsWith("o")) return input + "es"; // Nouns ending in a y preceded by a consonant usually drop the y and add -ies... - if (input.EndsWith("y") || input.EndsWith("quy")) return input.Substring(0, l - 1) + "ies"; + if (input.EndsWith("y")) return input.Substring(0, l - 1) + "ies"; } // Plurals of words ending in "man" end in "men" if (input.EndsWith("man")) return input.Substring(0, l - 2) + "en"; - // Add -es to words ending in a hard consonant + // Add -es to words ending in a hard consonant or fricative if (input.EndsWith("ch") || input.EndsWith("sh") || hardConsonants.Contains(input[l - 1])) return input + "es"; // Default From 6b733e0f4dbfbe1b576b1ecb36df541d041605de Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 14 Mar 2017 19:21:02 -0500 Subject: [PATCH 129/213] Bugfixes, added some query building functions - FIXED: Empty phrasal complement leave double space - FIXED: Invalid characters allowed in entry class names, e.g. '&' - FIXED: Crash in EnglishPluralizer - CHANGED: Refactored Sandbox - NEW: Added a few query-building functions - CHANGED: Moved query running logic from RstQuery to Query - FIXED: Packer ignoring -out argument --- Rant.Tools/Packer/PackGenerator.cs | 12 +- Rant/Core/Compiler/Syntax/RstQuery.cs | 60 +- Rant/Core/Constructs/QueryBuilder.cs | 27 + Rant/Core/Framework/RantFunctionRegistry.cs | 63 +- Rant/Core/Output/OutputChain.cs | 46 +- Rant/Core/Output/OutputChainBuffer.cs | 5 +- Rant/Core/Output/OutputWriter.cs | 19 +- Rant/Core/Sandbox.State.cs | 146 +++++ Rant/Core/Sandbox.cs | 616 +++++++----------- Rant/Core/Utilities/Limit.cs | 10 +- Rant/Formats/EnglishPluralizer.cs | 3 +- Rant/Rant.csproj | 2 + Rant/Vocabulary/EntryClass.cs | 33 + Rant/Vocabulary/Querying/Query.cs | 69 ++ .../RantDictionaryTable.Importer.cs | 8 +- Rant/Vocabulary/RantDictionaryTerm.cs | 4 + 16 files changed, 662 insertions(+), 461 deletions(-) create mode 100644 Rant/Core/Constructs/QueryBuilder.cs create mode 100644 Rant/Core/Sandbox.State.cs create mode 100644 Rant/Vocabulary/EntryClass.cs diff --git a/Rant.Tools/Packer/PackGenerator.cs b/Rant.Tools/Packer/PackGenerator.cs index 428e3c4..ffc1d8b 100644 --- a/Rant.Tools/Packer/PackGenerator.cs +++ b/Rant.Tools/Packer/PackGenerator.cs @@ -24,7 +24,7 @@ public static void GetHelp() Console.WriteLine(" - Creates a package from the specified directories."); Console.WriteLine(" -out: Specifies the output path for the package. Optional if rantpkg.json specifies an output path."); Console.WriteLine(" Options:"); - Console.WriteLine(" --compression [true|false]: Enable or disable LZMA compression. Defaults to true."); + Console.WriteLine(" -compression [true|false]: Enable or disable LZMA compression. Defaults to true."); Console.WriteLine(" -string-table [mode]: Set the string table mode. 0 = none, 1 = keys, 2 = keys and values."); Console.WriteLine(" Defaults to keys."); Console.WriteLine(" -version [version]: Overrides the version in rantpkg.json."); @@ -71,11 +71,19 @@ public static void Run() pkg.AddDependency(dep); } - if (!string.IsNullOrWhiteSpace(info.OutputPath)) + // -out property overrides rantpkg.json's output path + if (!string.IsNullOrWhiteSpace(CmdLine.Property("out"))) + { + outputPath = Path.Combine(CmdLine.Property("out"), $"{pkg.ID}-{pkg.Version}.rantpkg"); + Directory.CreateDirectory(CmdLine.Property("out")); + } + // Otherwise, use rantpkg.json's "out" property + else if (!string.IsNullOrWhiteSpace(info.OutputPath)) { outputPath = Path.Combine(contentDir, info.OutputPath, $"{pkg.ID}-{pkg.Version}.rantpkg"); Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); } + // If it doesn't have one, put it in the package content directory else { outputPath = Path.Combine(Directory.GetParent(contentDir).FullName, $"{pkg.ID}-{pkg.Version}.rantpkg"); diff --git a/Rant/Core/Compiler/Syntax/RstQuery.cs b/Rant/Core/Compiler/Syntax/RstQuery.cs index b9389a2..4349c47 100644 --- a/Rant/Core/Compiler/Syntax/RstQuery.cs +++ b/Rant/Core/Compiler/Syntax/RstQuery.cs @@ -50,65 +50,7 @@ public RstQuery(LineCol location) : base(location) public override IEnumerator Run(Sandbox sb) { - if (sb.Engine.Dictionary == null) - { - sb.Print(Txtres.GetString("missing-table")); - yield break; - } - // carrier erase query - if (_query.Name == null) - { - foreach (CarrierComponentType type in Enum.GetValues(typeof(CarrierComponentType))) - foreach (string name in _query.Carrier.GetComponentsOfType(type)) - sb.CarrierState.RemoveType(type, name); - yield break; - } - - var result = sb.Engine.Dictionary.Query(sb, _query, sb.CarrierState); - - if (result == null) - sb.Print("[No Match]"); - else - { - if (result.IsSplit) - { - if (_query.Complement == null) - { - sb.Print(result.Value.Substring(0, result.ValueSplitIndex)); - sb.Print(' '); - sb.Print(result.Value.Substring(result.ValueSplitIndex)); - } - else if (result.ValueSplitIndex == 0) // Pushes complement to the left of the query result - { - yield return _query.Complement; - sb.Print(' '); - sb.Print(result.Value); - } - else if (result.ValueSplitIndex == result.Value.Length) - { - sb.Print(result.Value); - sb.Print(' '); - yield return _query.Complement; - } - else // Complement goes inside phrase - { - sb.Print(result.Value.Substring(0, result.ValueSplitIndex)); - sb.Print(' '); - yield return _query.Complement; - sb.Print(' '); - sb.Print(result.Value.Substring(result.ValueSplitIndex)); - } - } - else - { - sb.Print(result.Value); - if (_query.Complement != null) - { - sb.Print(' '); // TODO: Pull phrasal separator from format info - yield return _query.Complement; - } - } - } + return _query.Run(sb); } protected override IEnumerator Serialize(EasyWriter output) diff --git a/Rant/Core/Constructs/QueryBuilder.cs b/Rant/Core/Constructs/QueryBuilder.cs new file mode 100644 index 0000000..7fac9c8 --- /dev/null +++ b/Rant/Core/Constructs/QueryBuilder.cs @@ -0,0 +1,27 @@ +using Rant.Vocabulary.Querying; +using System.Collections.Generic; + +namespace Rant.Core.Constructs +{ + internal sealed class QueryBuilder + { + private readonly Dictionary _queries; + private Query _activeQuery; + + public QueryBuilder() + { + _queries = new Dictionary(); + } + + public Query CurrentQuery => _activeQuery; + + public Query GetQuery(string name) + { + if (!_queries.TryGetValue(name, out Query q)) + { + q = _queries[name] = new Query(); + } + return _activeQuery = q; + } + } +} diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 376bc82..e4dbdfc 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -37,6 +37,7 @@ using Rant.Core.Utilities; using Rant.Metadata; using Rant.Vocabulary.Utilities; +using Rant.Vocabulary.Querying; // ReSharper disable UnusedMember.Local @@ -910,5 +911,65 @@ private static void ReverseEx(Sandbox sb, [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] private static void Character(Sandbox sb, [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); - } + + [RantFunction("rcc")] + [RantDescription("Resets the specified carrier components.")] + private static void ResetCarrier(Sandbox sb, + [RantDescription("The list of carrier component identifiers to reset.")] + params string[] ids) + { + foreach(var id in ids) + { + if (String.IsNullOrWhiteSpace(id)) continue; + sb.CarrierState.DeleteAssociation(id); + sb.CarrierState.DeleteMatch(id); + sb.CarrierState.DeleteRhyme(id); + sb.CarrierState.DeleteUnique(id); + } + } + + [RantFunction("query")] + private static IEnumerator QueryRun(Sandbox sb) + { + return sb.QueryBuilder.CurrentQuery?.Run(sb); + } + + [RantFunction("qname")] + private static void QueryName(Sandbox sb, string id, string name) + { + sb.QueryBuilder.GetQuery(id).Name = name; + } + + [RantFunction("qsub")] + private static void QuerySubtype(Sandbox sb, string id, string name) + { + sb.QueryBuilder.GetQuery(id).Subtype = name; + } + + [RantFunction("qcf")] + private static void QueryClassFilterPositive(Sandbox sb, string id, params string[] classes) + { + Query q; + ClassFilter cf; + cf = (q = sb.QueryBuilder.GetQuery(id)).GetFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; + if (cf == null) q.AddFilter(cf = new ClassFilter()); + foreach(var cl in classes) + { + cf.AddRule(new ClassFilterRule(cl, true)); + } + } + + [RantFunction("qcfn")] + private static void QueryClassFilterNegative(Sandbox sb, string id, params string[] classes) + { + Query q; + ClassFilter cf; + cf = (q = sb.QueryBuilder.GetQuery(id)).GetFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; + if (cf == null) q.AddFilter(cf = new ClassFilter()); + foreach (var cl in classes) + { + cf.AddRule(new ClassFilterRule(cl, false)); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputChain.cs b/Rant/Core/Output/OutputChain.cs index 3d5cc5f..4a33c4a 100644 --- a/Rant/Core/Output/OutputChain.cs +++ b/Rant/Core/Output/OutputChain.cs @@ -37,7 +37,7 @@ internal class OutputChain // Engine private readonly Sandbox sandbox; // Targets - private readonly Dictionary targets = new Dictionary(); + private readonly Dictionary targets = new Dictionary(); public OutputChain(Sandbox sb, string name) { @@ -50,7 +50,7 @@ public OutputChain(Sandbox sb, string name) // Buffer endpoint references // Public - public OutputChainBuffer First { get; } + public OutputChainBuffer First { get; private set; } public OutputChainBuffer Last { get; private set; } public ChannelVisibility Visibility { get; set; } = ChannelVisibility.Public; public string Name { get; } @@ -60,29 +60,39 @@ public OutputChainBuffer AddBuffer() return Last = new OutputChainBuffer(sandbox, Last); } - public void InsertTarget(string targetName) + public void AddBufferBefore(int bufferInvIndex, string value) + { + OutputChainBuffer bufReference = Last; + for(int i = 0; i < bufferInvIndex; i++) + { + bufReference = bufReference.Prev; + } + var bufInsert = new OutputChainBuffer(sandbox, bufReference.Prev); + if (bufInsert.Next == First) First = bufInsert; + bufInsert.Print(value); + } + + public void InsertTarget(object targetName) { - // Check if the buffer was already created - OutputChainBuffer buffer; - if (!targets.TryGetValue(targetName, out buffer)) - buffer = targets[targetName] = AddBuffer(); - else - Last = new OutputChainBuffer(sandbox, Last, buffer); - - // Then add an empty buffer after it so we don't start printing onto the target. - AddBuffer(); + // Check if the buffer was already created + if (!targets.TryGetValue(targetName, out OutputChainBuffer buffer)) + buffer = targets[targetName] = AddBuffer(); + else + Last = new OutputChainBuffer(sandbox, Last, buffer); + + // Then add an empty buffer after it so we don't start printing onto the target. + AddBuffer(); } - public void PrintToTarget(string targetName, string value) + public void PrintToTarget(object targetName, object value) { - OutputChainBuffer buffer; - if (!targets.TryGetValue(targetName, out buffer)) - buffer = targets[targetName] = new OutputChainBuffer(sandbox, null); + if (!targets.TryGetValue(targetName, out OutputChainBuffer buffer)) + buffer = targets[targetName] = new OutputChainBuffer(sandbox, null); - buffer.Print(value); + buffer.Print(value); } - public void ClearTarget(string targetName) + public void ClearTarget(object targetName) { OutputChainBuffer buffer; if (targets.TryGetValue(targetName, out buffer)) diff --git a/Rant/Core/Output/OutputChainBuffer.cs b/Rant/Core/Output/OutputChainBuffer.cs index 8be2583..801ac57 100644 --- a/Rant/Core/Output/OutputChainBuffer.cs +++ b/Rant/Core/Output/OutputChainBuffer.cs @@ -57,7 +57,8 @@ public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev) if (prev != null) { - prev.Next = this; + if (prev.Next != null) prev.Next.Prev = this; + prev.Next = this; _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; NumberFormatter.BinaryFormat = prev.NumberFormatter.BinaryFormat; NumberFormatter.BinaryFormatDigits = prev.NumberFormatter.BinaryFormatDigits; @@ -100,7 +101,7 @@ public Capitalization Caps protected bool PrintedSinceCapsChange { get; private set; } = false; public NumberFormatter NumberFormatter { get; } = new NumberFormatter(); public OutputChainBuffer Next { get; private set; } - public OutputChainBuffer Prev { get; } + public OutputChainBuffer Prev { get; private set; } public char LastChar => _buffer.Length > 0 ? _buffer[_buffer.Length - 1] : '\0'; public char FirstChar => _buffer.Length > 0 ? _buffer[0] : '\0'; public int Length => _buffer.Length; diff --git a/Rant/Core/Output/OutputWriter.cs b/Rant/Core/Output/OutputWriter.cs index f36a3df..b71ba9f 100644 --- a/Rant/Core/Output/OutputWriter.cs +++ b/Rant/Core/Output/OutputWriter.cs @@ -91,9 +91,8 @@ public void Do(Action chainAction) public int GetChannelLength(string channelName) { - OutputChain c; - if (!chains.TryGetValue(channelName, out c)) return 0; - var buffer = c.First; + if (!chains.TryGetValue(channelName, out OutputChain c)) return 0; + var buffer = c.First; int length = 0; do { @@ -105,8 +104,18 @@ public int GetChannelLength(string channelName) public void Capitalize(Capitalization caps) => Do(chain => chain.Last.Caps = caps); public void Print(string value) => Do(chain => chain.Print(value)); public void Print(object obj) => Do(chain => chain.Print(obj)); - public void InsertTarget(string targetName) => Do(chain => chain.InsertTarget(targetName)); - public void PrintToTarget(string targetName, string value) => Do(chain => chain.PrintToTarget(targetName, value)); + public void InsertTarget(object targetName) => Do(chain => chain.InsertTarget(targetName)); + public void PrintToTarget(object targetName, string value) => Do(chain => chain.PrintToTarget(targetName, value)); + public object InsertAnonymousTarget() + { + var obj = new object(); + Do(chain => chain.InsertTarget(obj)); + return obj; + } + public void BackPrint(int invIndex, string value) + { + Do(chain => chain.AddBufferBefore(invIndex, value)); + } public RantOutput ToRantOutput() => new RantOutput(sandbox.RNG.Seed, sandbox.StartingGen, chains.Values); } } \ No newline at end of file diff --git a/Rant/Core/Sandbox.State.cs b/Rant/Core/Sandbox.State.cs new file mode 100644 index 0000000..fc944d5 --- /dev/null +++ b/Rant/Core/Sandbox.State.cs @@ -0,0 +1,146 @@ +using Rant.Core.Compiler.Syntax; +using Rant.Core.Constructs; +using Rant.Core.ObjectModel; +using Rant.Core.Output; +using Rant.Core.Utilities; +using Rant.Formats; +using Rant.Resources; +using Rant.Vocabulary.Querying; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text.RegularExpressions; + +namespace Rant.Core +{ + internal sealed partial class Sandbox + { + private readonly BlockManager _blockManager; + private readonly Stack _outputs; + private readonly Stopwatch _stopwatch; + private bool _plural = false; + private int _quoteLevel = 0; + private bool shouldYield = false; + + public QueryBuilder QueryBuilder { get; } = new QueryBuilder(); + + /// + /// Gets the currently loaded modules. + /// + public Dictionary Modules = new Dictionary(); + + /// + /// Modules that were loaded from packages. + /// + public Dictionary PackageModules = new Dictionary(); + + /// + /// Modules that were not loaded from code, but were provided to RantEngine by the user. + /// + public Dictionary UserModules = new Dictionary(); + + /// + /// Gets the engine instance to which the sandbox is bound. + /// + public RantEngine Engine { get; } + + /// + /// Gets the main output channel stack. + /// + public OutputWriter BaseOutput { get; } + + /// + /// Gets the current output channel stack. + /// + public OutputWriter Output => _outputs.Peek(); + + /// + /// Gets the random number generator in use by the interpreter. + /// + public RNG RNG { get; } + + /// + /// The starting generation of the RNG. + /// + public long StartingGen { get; } + + /// + /// Gets the currently set block attributes. + /// + public BlockAttribs CurrentBlockAttribs { get; private set; } = new BlockAttribs(); + + /// + /// Gets the format used by the interpreter. + /// + public RantFormat Format { get; } + + /// + /// Gest the object stack used by the interpreter. + /// + public ObjectStack Objects { get; } + + /// + /// Gets the block state stack. + /// + public Stack Blocks { get; } + + /// + /// Gets the replacer match stack. The topmost item is the current match for the current replacer. + /// + public Stack RegexMatches { get; } + + /// + /// Gets the current query state. + /// + public CarrierState CarrierState { get; } + + /// + /// Gets the current RantPattern. + /// + public RantProgram Pattern { get; } + + /// + /// Subroutine argument stack. + /// + public Stack> SubroutineArgs { get; } + + /// + /// Gets the synchronizer manager instance for the current Sandbox. + /// + public SyncManager SyncManager { get; } + + /// + /// Gets the size limit for the pattern. + /// + public Limit SizeLimit { get; } + + /// + /// Gets the current RantAction being executed. + /// + public RST CurrentAction { get; private set; } + + /// + /// Gets the last used timeout. + /// + public double LastTimeout { get; internal set; } + + /// + /// Gets the current object stack of the Richard engine. + /// + public Stack ScriptObjectStack { get; } + + /// + /// Gets or sets the expected result for the current flag condition. + /// + public bool FlagConditionExpectedResult { get; set; } + + /// + /// Gets a collection of the flags currently being used for the flag condition. + /// + public HashSet ConditionFlags { get; } = new HashSet(); + + /// + /// Gets the arguments passed to the pattern. + /// + public RantProgramArgs PatternArgs { get; } + } +} diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index ee2d855..748d01e 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -35,377 +35,259 @@ using Rant.Core.ObjectModel; using Rant.Core.Output; using Rant.Core.Utilities; -using Rant.Formats; -using Rant.Resources; using Rant.Vocabulary.Querying; using static Rant.Localization.Txtres; namespace Rant.Core { - /// - /// Represents a Rant interpreter instance that produces a single output. - /// - internal class Sandbox - { - private static readonly object fallbackArgsLockObj = new object(); - private readonly BlockManager _blockManager; - private readonly Stack _outputs; - private readonly Stopwatch _stopwatch; - private bool _plural = false; - private int _quoteLevel = 0; - - /// - /// Gets the currently loaded modules. - /// - public Dictionary Modules = new Dictionary(); - - /// - /// Modules that were loaded from packages. - /// - public Dictionary PackageModules = new Dictionary(); - - private bool shouldYield = false; - - /// - /// Modules that were not loaded from code, but were provided to RantEngine by the user. - /// - public Dictionary UserModules = new Dictionary(); - - public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = 0, CarrierState carrierState = null, - RantProgramArgs args = null) - { - Engine = engine; - Format = engine.Format; - SizeLimit = new Limit(sizeLimit); - BaseOutput = new OutputWriter(this); - _outputs = new Stack(); - _outputs.Push(BaseOutput); - RNG = rng; - StartingGen = rng.Generation; - Pattern = pattern; - Objects = new ObjectStack(engine.Objects); - Blocks = new Stack(); - RegexMatches = new Stack(); - CarrierState = carrierState ?? new CarrierState(); - SubroutineArgs = new Stack>(); - SyncManager = new SyncManager(this); - _blockManager = new BlockManager(); - ScriptObjectStack = new Stack(); - PatternArgs = args; - _stopwatch = new Stopwatch(); - } - - /// - /// Gets the engine instance to which the sandbox is bound. - /// - public RantEngine Engine { get; } - - /// - /// Gets the main output channel stack. - /// - public OutputWriter BaseOutput { get; } - - /// - /// Gets the current output channel stack. - /// - public OutputWriter Output => _outputs.Peek(); - - /// - /// Gets the random number generator in use by the interpreter. - /// - public RNG RNG { get; } - - /// - /// The starting generation of the RNG. - /// - public long StartingGen { get; } - - /// - /// Gets the currently set block attributes. - /// - public BlockAttribs CurrentBlockAttribs { get; private set; } = new BlockAttribs(); - - /// - /// Gets the format used by the interpreter. - /// - public RantFormat Format { get; } - - /// - /// Gest the object stack used by the interpreter. - /// - public ObjectStack Objects { get; } - - /// - /// Gets the block state stack. - /// - public Stack Blocks { get; } - - /// - /// Gets the replacer match stack. The topmost item is the current match for the current replacer. - /// - public Stack RegexMatches { get; } - - /// - /// Gets the current query state. - /// - public CarrierState CarrierState { get; } - - /// - /// Gets the current RantPattern. - /// - public RantProgram Pattern { get; } - - public Stack> SubroutineArgs { get; } - - /// - /// Gets the synchronizer manager instance for the current Sandbox. - /// - public SyncManager SyncManager { get; } - - /// - /// Gets the size limit for the pattern. - /// - public Limit SizeLimit { get; } - - /// - /// Gets the current RantAction being executed. - /// - public RST CurrentAction { get; private set; } - - /// - /// Gets the last used timeout. - /// - public double LastTimeout { get; internal set; } - - /// - /// Gets the current object stack of the Richard engine. - /// - public Stack ScriptObjectStack { get; } - - /// - /// Gets or sets the expected result for the current flag condition. - /// - public bool FlagConditionExpectedResult { get; set; } - - /// - /// Gets a collection of the flags currently being used for the flag condition. - /// - public HashSet ConditionFlags { get; } = new HashSet(); - - /// - /// Gets the arguments passed to the pattern. - /// - public RantProgramArgs PatternArgs { get; } - - /// - /// Prints the specified value to the output channel stack. - /// - /// The value to print. - public void Print(object obj) => Output.Do(chain => chain.Print(obj)); - - public void SetPlural(bool plural) => _plural = plural; - - public bool TakePlural() - { - bool p = _plural; - _plural = false; - return p; - } - - public void PrintMany(Func generator, int times) - { - if (times == 1) - { - Output.Do(chain => chain.Print(generator())); - return; - } - var buffer = new StringBuilder(); - for (int i = 0; i < times; i++) buffer.Append(generator()); - Output.Do(chain => chain.Print(buffer)); - } - - public void PrintMany(Func generator, int times) - { - if (times == 1) - { - Output.Do(chain => chain.Print(generator())); - return; - } - var buffer = new StringBuilder(); - for (int i = 0; i < times; i++) buffer.Append(generator()); - Output.Do(chain => chain.Print(buffer)); - } - - public void AddOutputWriter() => _outputs.Push(new OutputWriter(this)); - public RantOutput Return() => _outputs.Pop().ToRantOutput(); - public void IncreaseQuote() => _quoteLevel++; - public void DecreaseQuote() => _quoteLevel--; - - public void PrintOpeningQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.OpeningPrimaryQuote : Format.OpeningSecondaryQuote)); - - public void PrintClosingQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.ClosingPrimaryQuote : Format.ClosingSecondaryQuote)); - - /// - /// Dequeues the current block attribute set and returns it, queuing a new attribute set. - /// - /// - public BlockAttribs NextAttribs(RstBlock block) - { - var attribs = CurrentBlockAttribs; - - _blockManager.Add(attribs, block); - _blockManager.SetPrevAttribs(attribs); - - switch (attribs.Persistence) - { - case AttribPersistence.Off: - CurrentBlockAttribs = new BlockAttribs(); - break; - - case AttribPersistence.On: - CurrentBlockAttribs = new BlockAttribs(); - break; - - case AttribPersistence.Once: - CurrentBlockAttribs = _blockManager.GetPrevious(1); - break; - } - - return attribs; - } - - public void SetYield() => shouldYield = true; - - public RantOutput Run(double timeout, RantProgram pattern = null) - { - lock (PatternArgs ?? fallbackArgsLockObj) - { - if (pattern == null) pattern = Pattern; - LastTimeout = timeout; - long timeoutMS = (long)(timeout * 1000); - bool timed = timeoutMS > 0; - bool stopwatchAlreadyRunning = _stopwatch.IsRunning; - if (!_stopwatch.IsRunning) - { - _stopwatch.Reset(); - _stopwatch.Start(); - } - - ScriptObjectStack.Clear(); - var callStack = new Stack>(); - IEnumerator action; - - // Push the AST root - CurrentAction = pattern.SyntaxTree; - callStack.Push(pattern.SyntaxTree.Run(this)); - - top: - while (callStack.Any()) - { - // Get the topmost call stack item - action = callStack.Peek(); - - // Execute the node until it runs out of children - while (action.MoveNext()) - { - if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-pattern-timeout", timeout)); - } - - if (callStack.Count >= RantEngine.MaxStackSize) - { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-stack-overflow", RantEngine.MaxStackSize)); - } - - if (action.Current == null) break; - - // Push child node onto stack and start over - CurrentAction = action.Current; - callStack.Push(CurrentAction.Run(this)); - goto top; - } - - // Remove node once finished - callStack.Pop(); - } - - if (!stopwatchAlreadyRunning) _stopwatch.Stop(); - - return Return(); - } - } - - public IEnumerable RunSerial(double timeout, RantProgram pattern = null) - { - lock (PatternArgs ?? fallbackArgsLockObj) - { - if (pattern == null) pattern = Pattern; - LastTimeout = timeout; - long timeoutMS = (long)(timeout * 1000); - bool timed = timeoutMS > 0; - bool stopwatchAlreadyRunning = _stopwatch.IsRunning; - if (!_stopwatch.IsRunning) - { - _stopwatch.Reset(); - _stopwatch.Start(); - } - - ScriptObjectStack.Clear(); - var callStack = new Stack>(); - IEnumerator action; - - // Push the AST root - CurrentAction = pattern.SyntaxTree; - callStack.Push(pattern.SyntaxTree.Run(this)); - - top: - while (callStack.Any()) - { - // Get the topmost call stack item - action = callStack.Peek(); - - // Execute the node until it runs out of children - while (action.MoveNext()) - { - if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-pattern-timeout", timeout)); - } - - if (callStack.Count >= RantEngine.MaxStackSize) - { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-stack-overflow", RantEngine.MaxStackSize)); - } - - if (action.Current == null) break; - - // Push child node onto stack and start over - CurrentAction = action.Current; - callStack.Push(CurrentAction.Run(this)); - goto top; - } - - if (shouldYield) - { - shouldYield = false; - yield return Return(); - AddOutputWriter(); - } - - // Remove node once finished - callStack.Pop(); - } - - if (!stopwatchAlreadyRunning) _stopwatch.Stop(); - } - } - } + /// + /// Represents a Rant interpreter instance that produces a single output. + /// + internal sealed partial class Sandbox + { + private static readonly object fallbackArgsLockObj = new object(); + + public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = 0, CarrierState carrierState = null, + RantProgramArgs args = null) + { + // Public members + RNG = rng; + StartingGen = rng.Generation; + Engine = engine; + Format = engine.Format; + SizeLimit = new Limit(sizeLimit); + Pattern = pattern; + Objects = new ObjectStack(engine.Objects); + Blocks = new Stack(); + RegexMatches = new Stack(); + CarrierState = carrierState ?? new CarrierState(); + SubroutineArgs = new Stack>(); + SyncManager = new SyncManager(this); + ScriptObjectStack = new Stack(); + PatternArgs = args; + + // Private members + _blockManager = new BlockManager(); + _stopwatch = new Stopwatch(); + + // Output initialization + BaseOutput = new OutputWriter(this); + _outputs = new Stack(); + _outputs.Push(BaseOutput); + } + + /// + /// Prints the specified value to the output channel stack. + /// + /// The value to print. + public void Print(object obj) => Output.Do(chain => chain.Print(obj)); + + public void SetPlural(bool plural) => _plural = plural; + + public bool TakePlural() + { + bool p = _plural; + _plural = false; + return p; + } + + public void PrintMany(Func generator, int times) + { + if (times == 1) + { + Output.Do(chain => chain.Print(generator())); + return; + } + var buffer = new StringBuilder(); + for (int i = 0; i < times; i++) buffer.Append(generator()); + Output.Do(chain => chain.Print(buffer)); + } + + public void PrintMany(Func generator, int times) + { + if (times == 1) + { + Output.Do(chain => chain.Print(generator())); + return; + } + var buffer = new StringBuilder(); + for (int i = 0; i < times; i++) buffer.Append(generator()); + Output.Do(chain => chain.Print(buffer)); + } + + public void AddOutputWriter() => _outputs.Push(new OutputWriter(this)); + + public RantOutput Return() => _outputs.Pop().ToRantOutput(); + + public void IncreaseQuote() => _quoteLevel++; + + public void DecreaseQuote() => _quoteLevel--; + + public void PrintOpeningQuote() + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.OpeningPrimaryQuote : Format.OpeningSecondaryQuote)); + + public void PrintClosingQuote() + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.ClosingPrimaryQuote : Format.ClosingSecondaryQuote)); + + public void SetYield() => shouldYield = true; + + /// + /// Dequeues the current block attribute set and returns it, queuing a new attribute set. + /// + /// + public BlockAttribs NextAttribs(RstBlock block) + { + var attribs = CurrentBlockAttribs; + + _blockManager.Add(attribs, block); + _blockManager.SetPrevAttribs(attribs); + + switch (attribs.Persistence) + { + case AttribPersistence.Off: + CurrentBlockAttribs = new BlockAttribs(); + break; + + case AttribPersistence.On: + CurrentBlockAttribs = new BlockAttribs(); + break; + + case AttribPersistence.Once: + CurrentBlockAttribs = _blockManager.GetPrevious(1); + break; + } + + return attribs; + } + + public RantOutput Run(double timeout, RantProgram pattern = null) + { + lock (PatternArgs ?? fallbackArgsLockObj) + { + if (pattern == null) pattern = Pattern; + LastTimeout = timeout; + long timeoutMS = (long)(timeout * 1000); + bool timed = timeoutMS > 0; + bool stopwatchAlreadyRunning = _stopwatch.IsRunning; + if (!_stopwatch.IsRunning) + { + _stopwatch.Reset(); + _stopwatch.Start(); + } + + ScriptObjectStack.Clear(); + var callStack = new Stack>(); + IEnumerator action; + + // Push the AST root + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); + + top: + while (callStack.Any()) + { + // Get the topmost call stack item + action = callStack.Peek(); + + // Execute the node until it runs out of children + while (action.MoveNext()) + { + if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-pattern-timeout", timeout)); + } + + if (callStack.Count >= RantEngine.MaxStackSize) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-stack-overflow", RantEngine.MaxStackSize)); + } + + if (action.Current == null) break; + + // Push child node onto stack and start over + CurrentAction = action.Current; + callStack.Push(CurrentAction.Run(this)); + goto top; + } + + // Remove node once finished + callStack.Pop(); + } + + if (!stopwatchAlreadyRunning) _stopwatch.Stop(); + + return Return(); + } + } + + public IEnumerable RunSerial(double timeout, RantProgram pattern = null) + { + lock (PatternArgs ?? fallbackArgsLockObj) + { + if (pattern == null) pattern = Pattern; + LastTimeout = timeout; + long timeoutMS = (long)(timeout * 1000); + bool timed = timeoutMS > 0; + bool stopwatchAlreadyRunning = _stopwatch.IsRunning; + if (!_stopwatch.IsRunning) + { + _stopwatch.Reset(); + _stopwatch.Start(); + } + + ScriptObjectStack.Clear(); + var callStack = new Stack>(); + IEnumerator action; + + // Push the AST root + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); + + top: + while (callStack.Any()) + { + // Get the topmost call stack item + action = callStack.Peek(); + + // Execute the node until it runs out of children + while (action.MoveNext()) + { + if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-pattern-timeout", timeout)); + } + + if (callStack.Count >= RantEngine.MaxStackSize) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-stack-overflow", RantEngine.MaxStackSize)); + } + + if (action.Current == null) break; + + // Push child node onto stack and start over + CurrentAction = action.Current; + callStack.Push(CurrentAction.Run(this)); + goto top; + } + + if (shouldYield) + { + shouldYield = false; + yield return Return(); + AddOutputWriter(); + } + + // Remove node once finished + callStack.Pop(); + } + + if (!stopwatchAlreadyRunning) _stopwatch.Stop(); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Utilities/Limit.cs b/Rant/Core/Utilities/Limit.cs index 38eee61..cbc6920 100644 --- a/Rant/Core/Utilities/Limit.cs +++ b/Rant/Core/Utilities/Limit.cs @@ -27,19 +27,21 @@ namespace Rant.Core.Utilities { internal sealed class Limit { - private int _value; + private long _value; - public Limit(int max) + public Limit(long max) { Maximum = max; _value = 0; } - public int Maximum { get; } + public long Maximum { get; } + + public long Value => _value; public bool Accumulate(int value) { - return Maximum > 0 && (_value += value) > Maximum; + return (_value += value) > Maximum && Maximum > 0; } } } \ No newline at end of file diff --git a/Rant/Formats/EnglishPluralizer.cs b/Rant/Formats/EnglishPluralizer.cs index 254e5c6..b80c40d 100644 --- a/Rant/Formats/EnglishPluralizer.cs +++ b/Rant/Formats/EnglishPluralizer.cs @@ -91,8 +91,7 @@ public sealed class EnglishPluralizer : Pluralizer { "crisis", "crises" }, { "testis", "testes" }, { "nemesis", "nemeses" }, - { "genesis", "geneses" }, - { "matrix", "matrices" } + { "genesis", "geneses" } }; private static readonly HashSet ignore = new HashSet(StringComparer.InvariantCultureIgnoreCase) diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 4c10db2..f937233 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -176,9 +176,11 @@ + + diff --git a/Rant/Vocabulary/EntryClass.cs b/Rant/Vocabulary/EntryClass.cs new file mode 100644 index 0000000..d676bef --- /dev/null +++ b/Rant/Vocabulary/EntryClass.cs @@ -0,0 +1,33 @@ +using Rant.Core.Utilities; +using System; + +namespace Rant.Vocabulary +{ + public sealed class EntryClass + { + private readonly string _name; + + public EntryClass(string name) + { + if (!Util.ValidateName(name)) + throw new ArgumentException($"Invalid class name: {name}"); + _name = String.Intern(name.ToLowerInvariant()); + } + + public string Name => _name; + + public override bool Equals(object obj) + { + if (obj == null || GetType() != obj.GetType()) + { + return false; + } + return ReferenceEquals(_name, obj); + } + + public override int GetHashCode() + { + return _name.GetHashCode(); + } + } +} diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index a86a4ee..93d94b9 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -26,6 +26,9 @@ using System.Collections.Generic; using Rant.Core.Compiler.Syntax; +using Rant.Core; +using Rant.Localization; +using System; namespace Rant.Vocabulary.Querying { @@ -34,6 +37,8 @@ namespace Rant.Vocabulary.Querying /// internal sealed class Query { + private const string PHRASAL_SEP = " "; + private readonly HashSet _filters = new HashSet(); /// @@ -84,5 +89,69 @@ public IEnumerable GetFilters() { foreach (var filter in _filters) yield return filter; } + + internal IEnumerator Run(Sandbox sb) + { + if (Name == null) yield break; + if (sb.Engine.Dictionary == null) + { + sb.Print(Txtres.GetString("missing-table")); + yield break; + } + + var result = sb.Engine.Dictionary.Query(sb, this, sb.CarrierState); + + if (result == null) + { + sb.Print("[No Match]"); + } + else + { + if (result.IsSplit) + { + if (this.Complement == null) + { + sb.Print(result.LeftSide); + sb.Print(PHRASAL_SEP); + sb.Print(result.RightSide); + } + else if (result.ValueSplitIndex == 0) // Pushes complement to the left of the query result + { + long l = sb.SizeLimit.Value; + yield return this.Complement; + if (sb.SizeLimit.Value > l) sb.Print(PHRASAL_SEP); + sb.Print(result.Value); + } + else if (result.ValueSplitIndex == result.Value.Length) + { + sb.Print(result.Value); + long l = sb.SizeLimit.Value; + var t = sb.Output.InsertAnonymousTarget(); + yield return this.Complement; + if (sb.SizeLimit.Value > l) sb.Output.PrintToTarget(t, PHRASAL_SEP); + } + else // Complement goes inside phrase + { + sb.Print(result.LeftSide); + sb.Print(PHRASAL_SEP); + long l = sb.SizeLimit.Value; + yield return this.Complement; + if (sb.SizeLimit.Value > l) sb.Print(PHRASAL_SEP); + sb.Print(result.RightSide); + } + } + else + { + sb.Print(result.Value); + if (this.Complement != null) + { + long l = sb.SizeLimit.Value; + var t = sb.Output.InsertAnonymousTarget(); + yield return this.Complement; + if (sb.SizeLimit.Value > l) sb.Output.PrintToTarget(t, PHRASAL_SEP); + } + } + } + } } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index 48ff29b..8a6473b 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -347,7 +347,13 @@ public static bool ValidateClassName(string input) { if (input == null || input.Length == 0) return false; for (int i = 0; i < input.Length; i++) - if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' && i < input.Length - 1 && input[i] == '?') return false; + { + if (i < input.Length - 1) + { + if (!char.IsLetterOrDigit(input[i]) && input[i] != '_') return false; + } + else if (!char.IsLetterOrDigit(input[i]) && input[i] != '_' && input[i] != '?') return false; + } return true; } diff --git a/Rant/Vocabulary/RantDictionaryTerm.cs b/Rant/Vocabulary/RantDictionaryTerm.cs index 822eaa7..e6cb964 100644 --- a/Rant/Vocabulary/RantDictionaryTerm.cs +++ b/Rant/Vocabulary/RantDictionaryTerm.cs @@ -110,6 +110,10 @@ public string Value /// public bool IsSplit => ValueSplitIndex > -1; + public string LeftSide => Value.Substring(0, ValueSplitIndex); + + public string RightSide => Value.Substring(ValueSplitIndex); + /// /// Gets the split index of the term value. /// From 2bf56fe8af90a2d260fad0655c54cbe0d74226c0 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 14 Mar 2017 22:03:27 -0500 Subject: [PATCH 130/213] Localize more strings --- Rant.Benchmark/Rant.Benchmark.csproj | 4 ++-- Rant/Core/Compiler/Parsing/QueryParser.cs | 23 +++++++++++++++-------- Rant/Localization/de-DE.lang | 4 ++++ Rant/Localization/en-US.lang | 4 ++++ Rant/RantInternalException.cs | 8 +++++--- Rant/RantProgram.cs | 2 +- Rant/Vocabulary/RantDictionaryTable.cs | 5 +++-- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Rant.Benchmark/Rant.Benchmark.csproj b/Rant.Benchmark/Rant.Benchmark.csproj index 01b2b84..7e0b613 100644 --- a/Rant.Benchmark/Rant.Benchmark.csproj +++ b/Rant.Benchmark/Rant.Benchmark.csproj @@ -18,7 +18,7 @@ true full false - ..\bin\MainBuild\ + bin\Debug\ DEBUG;TRACE prompt 4 @@ -27,7 +27,7 @@ AnyCPU pdbonly true - ..\bin\MainBuild\ + bin\Release\ TRACE prompt 4 diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index d9e3618..456a90e 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -277,14 +277,21 @@ private void ReadCarriers(TokenReader reader, Carrier carrier, RantCompiler comp // match if (reader.PeekToken().Type == R.Equal) { - if (carrierType == CarrierComponentType.Associative) - carrierType = CarrierComponentType.MatchAssociative; - else if (carrierType == CarrierComponentType.Dissociative) - carrierType = CarrierComponentType.MatchDissociative; - else if (carrierType == CarrierComponentType.Divergent) - carrierType = CarrierComponentType.MatchDivergent; - else if (carrierType == CarrierComponentType.Relational) - carrierType = CarrierComponentType.MatchRelational; + switch (carrierType) + { + case CarrierComponentType.Associative: + carrierType = CarrierComponentType.MatchAssociative; + break; + case CarrierComponentType.Dissociative: + carrierType = CarrierComponentType.MatchDissociative; + break; + case CarrierComponentType.Divergent: + carrierType = CarrierComponentType.MatchDivergent; + break; + case CarrierComponentType.Relational: + carrierType = CarrierComponentType.MatchRelational; + break; + } reader.ReadToken(); } diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index fe8d34d..1d6ee30 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -27,6 +27,10 @@ err-missing-table-name = "#name-Anweisung vor der Eintragliste erwartet." err-empty-property = "Leeres Eigenschaftsfeld gefunden." err-misplaced-directive = "Die {0}-Anweisung darf nur im Header sein." err-invalid-weight = "Ungültiger Eintragsgewichtswert gefunden." +err-bad-term-count = "Begriffenanzahl pro Eintrag muss mehr als Null sein." +err-bad-pattern-name = "Ungültiger Vorlagename: {0}" +err-internal-error = "Ein interner Fehler ist aufgetreten. Diese Fehler sind meistens von einem Bug in Rant verursacht." +err-internal-error-msg = "Ein interner Fehler ist aufgetreten. Diese Fehler sind meistens von einem Bug in Rant verursacht. Fehlermeldung: {0}." err-pattern-timeout = "Der Ausführungszeitraum ist abgelaufen ({0} Sekunden)." err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Maximaltiefe: {0})." diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index baec3d3..79aa4d2 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -27,6 +27,10 @@ err-missing-table-name = "Expected #name directive before entry list." err-empty-property = "Empty property field found." err-misplaced-directive = "The {0} directive can only be used in the file header." err-invalid-weight = "Invalid entry weight value." +err-bad-term-count = "Terms per entry must be greater than zero." +err-bad-pattern-name = "Invalid pattern name: {0}" +err-internal-error = "An internal error has occurred. This is often caused by a bug in Rant." +err-internal-error-msg = "An internal error has occurred. This is often caused by a bug in Rant. Message: {0}." err-pattern-timeout = "The pattern execution timed out ({0} seconds)." err-stack-overflow = "Exceeded the maximum stack size ({0})." diff --git a/Rant/RantInternalException.cs b/Rant/RantInternalException.cs index 3938006..4736904 100644 --- a/Rant/RantInternalException.cs +++ b/Rant/RantInternalException.cs @@ -25,6 +25,8 @@ using System; +using Rant.Localization; + namespace Rant { /// @@ -34,17 +36,17 @@ namespace Rant public sealed class RantInternalException : Exception { internal RantInternalException() - : base("An internal error has occurred. This is often caused by a bug in Rant.") + : base(Txtres.GetString("err-internal-error")) { } internal RantInternalException(string message) - : base($"An internal error has occurred. This is often caused by a bug in Rant. Message: {message}.") + : base(Txtres.GetString("err-internal-error-msg", message)) { } internal RantInternalException(string message, Exception inner) - : base($"An internal error has occurred. This is often caused by a bug in Rant. Message: {message}.", inner) + : base(Txtres.GetString("err-internal-error-msg", message), inner) { } } diff --git a/Rant/RantProgram.cs b/Rant/RantProgram.cs index c536658..e05957e 100644 --- a/Rant/RantProgram.cs +++ b/Rant/RantProgram.cs @@ -87,7 +87,7 @@ public string Name set { if (!IsValidPatternName(value)) - throw new ArgumentException($"Invalid pattern name: '{value ?? ""}'"); + throw new ArgumentException(GetString("err-bad-pattern-name", value ?? "")); _name = string.Join("/", value.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()); } diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index b902e42..047d5cc 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -30,6 +30,7 @@ using Rant.Core; using Rant.Core.IO.Bson; using Rant.Core.Utilities; +using Rant.Localization; using Rant.Resources; using Rant.Vocabulary.Querying; using Rant.Vocabulary.Utilities; @@ -61,8 +62,8 @@ public sealed partial class RantDictionaryTable : RantResource public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) { if (name == null) throw new ArgumentNullException(nameof(name)); - if (termsPerEntry <= 0) throw new ArgumentException("Terms per entry must be greater than zero."); - if (!Util.ValidateName(name)) throw new ArgumentException($"Invalid table name: '{name}'"); + if (termsPerEntry <= 0) throw new ArgumentException(Txtres.GetString("err-bad-term-count")); + if (!Util.ValidateName(name)) throw new ArgumentException(Txtres.GetString("err-invalid-tablename", name)); if (hidden != null) _hidden = hidden; TermsPerEntry = termsPerEntry; Name = name; From 76b09a1f7eff67687911a58a401755bfd6f0a8e8 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 15 Mar 2017 14:51:14 -0500 Subject: [PATCH 131/213] Refactor formatting settings and allow verbalized numbers in different languages --- Rant.Console/Program.cs | 1 + Rant/Core/Compiler/Syntax/RstBlock.cs | 6 +- Rant/Core/Compiler/Syntax/RstEscape.cs | 12 +- Rant/Core/Formatting/NumberFormat.cs | 4 +- Rant/Core/Formatting/NumberFormatter.cs | 11 +- Rant/Core/Formatting/Numerals.cs | 145 +----------------- Rant/Core/Output/OutputChainBuffer.cs | 10 +- Rant/Core/Sandbox.cs | 4 +- Rant/Formats/EnglishNumberVerbalizer.cs | 87 +++++++++++ Rant/Formats/GermanNumberVerbalizer.cs | 87 +++++++++++ Rant/Formats/NumberVerbalizer.cs | 13 ++ Rant/Formats/QuotationMarks.cs | 59 ++++++++ Rant/Formats/RantFormat.cs | 191 +++++------------------- Rant/Formats/WritingSystem.cs | 40 +++++ Rant/Localization/Txtres.cs | 35 +++-- Rant/Rant.csproj | 5 + Rant/Vocabulary/Querying/Query.cs | 14 +- 17 files changed, 381 insertions(+), 343 deletions(-) create mode 100644 Rant/Formats/EnglishNumberVerbalizer.cs create mode 100644 Rant/Formats/GermanNumberVerbalizer.cs create mode 100644 Rant/Formats/NumberVerbalizer.cs create mode 100644 Rant/Formats/QuotationMarks.cs create mode 100644 Rant/Formats/WritingSystem.cs diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index d6d51d3..3107a50 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -11,6 +11,7 @@ using static System.Console; using static Rant.Common.CmdLine; +using Rant.Formats; namespace RantConsole { diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index 3b84106..058eb96 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -148,19 +148,19 @@ public override IEnumerator Run(Sandbox sb) if (attribs.EndSeparator != null) if (reps > 2) yield return attribs.EndSeparator; - sb.Print(sb.Format.StandardSpace); + sb.Print(sb.Format.WritingSystem.Space); // Add conjunction if specified (it normally should be, if it's a series) if (attribs.EndConjunction != null) { yield return attribs.EndConjunction; - sb.Print(sb.Format.StandardSpace); + sb.Print(sb.Format.WritingSystem.Space); } } else if (reps > 2) { yield return attribs.Separator; - sb.Print(sb.Format.StandardSpace); + sb.Print(sb.Format.WritingSystem.Space); } } else diff --git a/Rant/Core/Compiler/Syntax/RstEscape.cs b/Rant/Core/Compiler/Syntax/RstEscape.cs index b26757f..9efb2d7 100644 --- a/Rant/Core/Compiler/Syntax/RstEscape.cs +++ b/Rant/Core/Compiler/Syntax/RstEscape.cs @@ -58,13 +58,13 @@ internal class RstEscape : RST 'c', (sb, c) => sb.PrintMany( - () => char.ToLowerInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) + () => char.ToLowerInvariant(sb.Format.WritingSystem.AlphabetArray[sb.RNG.Next(sb.Format.WritingSystem.AlphabetArray.Length)]), c) }, { 'C', (sb, c) => sb.PrintMany( - () => char.ToUpperInvariant(sb.Format.LettersInternal[sb.RNG.Next(sb.Format.LettersInternal.Length)]), c) + () => char.ToUpperInvariant(sb.Format.WritingSystem.AlphabetArray[sb.RNG.Next(sb.Format.WritingSystem.AlphabetArray.Length)]), c) }, { 'x', (sb, c) => sb.PrintMany(() => "0123456789abcdef"[sb.RNG.Next(16)], c) }, { 'X', (sb, c) => sb.PrintMany(() => "0123456789ABCDEF"[sb.RNG.Next(16)], c) }, @@ -74,9 +74,9 @@ internal class RstEscape : RST int i; sb.PrintMany(() => { - i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); + i = sb.RNG.Next(sb.Format.WritingSystem.AlphabetArray.Length + 10); return i >= 10 - ? char.ToLowerInvariant(sb.Format.LettersInternal[i - 10]) + ? char.ToLowerInvariant(sb.Format.WritingSystem.AlphabetArray[i - 10]) : Convert.ToChar(i + 48); }, c); } @@ -87,9 +87,9 @@ internal class RstEscape : RST int i; sb.PrintMany(() => { - i = sb.RNG.Next(sb.Format.LettersInternal.Length + 10); + i = sb.RNG.Next(sb.Format.WritingSystem.AlphabetArray.Length + 10); return i >= 10 - ? char.ToUpperInvariant(sb.Format.LettersInternal[i - 10]) + ? char.ToUpperInvariant(sb.Format.WritingSystem.AlphabetArray[i - 10]) : Convert.ToChar(i + 48); }, c); } diff --git a/Rant/Core/Formatting/NumberFormat.cs b/Rant/Core/Formatting/NumberFormat.cs index b84658a..38b499b 100644 --- a/Rant/Core/Formatting/NumberFormat.cs +++ b/Rant/Core/Formatting/NumberFormat.cs @@ -50,8 +50,8 @@ internal enum NumberFormat [RantDescription("Lowercase Roman numerals.")] RomanLower, - [RantDescription("US English spellings of numbers. Only works with integers.")] - VerbalEn, + [RantDescription("Number verbalization. Only works with integers.")] + Verbal, [RantDescription("Uppercase hexadecimal.")] Hex, diff --git a/Rant/Core/Formatting/NumberFormatter.cs b/Rant/Core/Formatting/NumberFormatter.cs index bf151c3..cb8d90f 100644 --- a/Rant/Core/Formatting/NumberFormatter.cs +++ b/Rant/Core/Formatting/NumberFormatter.cs @@ -31,6 +31,8 @@ namespace Rant.Core.Formatting { internal class NumberFormatter { + private readonly Sandbox sb; + private static readonly NumberFormatInfo CommaGroupFormat = new NumberFormatInfo { NumberGroupSizes = new[] { 3 }, @@ -45,6 +47,11 @@ internal class NumberFormatter NumberDecimalSeparator = "," }; + public NumberFormatter(Sandbox sandbox) + { + sb = sandbox; + } + public Endianness Endianness { get; set; } = Endianness.Default; public BinaryFormat BinaryFormat { get; set; } = BinaryFormat.Normal; public NumberFormat NumberFormat { get; set; } = NumberFormat.Normal; @@ -67,8 +74,8 @@ public string FormatNumber(double number) return Numerals.ToRoman(number); case NumberFormat.RomanLower: return Numerals.ToRoman(number, true); - case NumberFormat.VerbalEn: - return number % 1 > 0 ? "?" : Numerals.ToVerbal((long)number); + case NumberFormat.Verbal: + return number % 1 > 0 ? "?" : sb.Format.NumberVerbalizer.Verbalize((long)number); case NumberFormat.Hex: case NumberFormat.HexUpper: return GetHex((long)number, true); diff --git a/Rant/Core/Formatting/Numerals.cs b/Rant/Core/Formatting/Numerals.cs index 2142257..61f6cd7 100644 --- a/Rant/Core/Formatting/Numerals.cs +++ b/Rant/Core/Formatting/Numerals.cs @@ -23,14 +23,13 @@ #endregion -using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; namespace Rant.Core.Formatting { - internal static class Numerals + internal static class Numerals { public const int MaxRomanValue = 3999; @@ -42,73 +41,6 @@ internal static class Numerals new[] { "", "M", "MM", "MMM" } }; - private static readonly List<_> Powers; - private static readonly List<_> Hundreds; - private static readonly List<_> TenUnits; - private static readonly List<_> Tens; - - static Numerals() - { - Powers = new List<_> - { - _.Create(100L, "hundred"), - _.Create(1000L, "thousand"), - _.Create(1000000L, "million"), - _.Create(1000000000L, "billion"), - _.Create(1000000000000L, "trillion"), - _.Create(1000000000000000L, "quadrillion"), - _.Create(1000000000000000000L, "quintillion") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - - Hundreds = new List<_> - { - _.Create(100L, "one hundred"), - _.Create(200L, "two hundred"), - _.Create(300L, "three hundred"), - _.Create(400L, "four hundred"), - _.Create(500L, "five hundred"), - _.Create(600L, "six hundred"), - _.Create(700L, "seven hundred"), - _.Create(800L, "eight hundred"), - _.Create(900L, "nine hundred") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - - TenUnits = new List<_> - { - _.Create(90, "ninety"), - _.Create(80, "eighty"), - _.Create(70, "seventy"), - _.Create(60, "sixty"), - _.Create(50, "fifty"), - _.Create(40, "forty"), - _.Create(30, "thirty"), - _.Create(20, "twenty") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - - Tens = new List<_> - { - _.Create(19, "nineteen"), - _.Create(18, "eighteen"), - _.Create(17, "seventeen"), - _.Create(16, "sixteen"), - _.Create(15, "fifteen"), - _.Create(14, "fourteen"), - _.Create(13, "thirteen"), - _.Create(12, "twelve"), - _.Create(11, "eleven"), - _.Create(10, "ten"), - _.Create(9, "nine"), - _.Create(8, "eight"), - _.Create(7, "seven"), - _.Create(6, "six"), - _.Create(5, "five"), - _.Create(4, "four"), - _.Create(3, "three"), - _.Create(2, "two"), - _.Create(1, "one") - }.OrderByDescending(tuple => tuple.Item1).ToList(); - } - public static string ToRoman(double number, bool lowerCase = false) { if (number <= 0 || number > MaxRomanValue || number % 1 > 0) return "?"; @@ -122,80 +54,5 @@ public static string ToRoman(double number, bool lowerCase = false) sb.Append(RomanNumerals[i][intArr[i]]); return lowerCase ? sb.ToString().ToLower() : sb.ToString(); } - - public static string ToVerbal(long number) - { - if (number == 0) return "zero"; - - var numBuilder = new StringBuilder(); - - if (number < 0) - { - numBuilder.Append("negative "); - number *= -1; - } - - // The input stack contains number units for the loop to translate - var input = new Queue<_>(); - - long unit = 0; - - foreach (var power in Powers) - { - if (number < power.Item1) continue; - unit = number / power.Item1; // Count of current unit (1-999) - number -= unit * power.Item1; // Strip the units from the number - input.Enqueue(_.Create(unit, power.Item2)); - } - - input.Enqueue(_.Create(number, "")); - - var buffer = new StringBuilder(); - - while (input.Any()) - { - var pair = input.Dequeue(); - long value = pair.Item1; - if (value == 0) continue; - - if (numBuilder.Length > 0) - { - if (input.Any()) - numBuilder.Append(", "); - else if (value > 0) - numBuilder.Append(" and "); - } - - buffer.Length = 0; - - foreach (var hundred in Hundreds) - { - if (value < hundred.Item1) continue; - value -= hundred.Item1; - buffer.AppendFormat("{0}{1}{2}", buffer.Length > 0 ? " " : string.Empty, hundred.Item2, - value > 0 ? " and" : string.Empty); - } - - foreach (var tenunit in TenUnits) - { - if (value < tenunit.Item1) continue; - value -= tenunit.Item1; - buffer.AppendFormat("{0}{1}", buffer.Length > 0 ? " " : string.Empty, tenunit.Item2); - break; - } - - foreach (var ten in Tens) - { - if (value != ten.Item1) continue; - buffer.AppendFormat("{0}{1}", buffer.Length > 0 ? " " : string.Empty, ten.Item2); - break; - } - - numBuilder.Append(buffer); - if (pair.Item2.Length > 0) - numBuilder.Append(" ").Append(pair.Item2); - } - return numBuilder.ToString(); - } } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputChainBuffer.cs b/Rant/Core/Output/OutputChainBuffer.cs index 801ac57..7bd2d2a 100644 --- a/Rant/Core/Output/OutputChainBuffer.cs +++ b/Rant/Core/Output/OutputChainBuffer.cs @@ -53,7 +53,8 @@ private static readonly HashSet _sentenceTerminators public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev) { - Prev = prev; + NumberFormatter = new NumberFormatter(sb); + Prev = prev; if (prev != null) { @@ -73,7 +74,8 @@ public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev) public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) { - Prev = prev; + NumberFormatter = new NumberFormatter(sb); + Prev = prev; if (prev != null) { @@ -82,7 +84,7 @@ public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer t } _buffer = targetOrigin._buffer; - _sandbox = sb; + _sandbox = sb; } public StringBuilder Buffer => _buffer; @@ -99,7 +101,7 @@ public Capitalization Caps public bool IsTarget { get; } = false; protected bool PrintedSinceCapsChange { get; private set; } = false; - public NumberFormatter NumberFormatter { get; } = new NumberFormatter(); + public NumberFormatter NumberFormatter { get; } public OutputChainBuffer Next { get; private set; } public OutputChainBuffer Prev { get; private set; } public char LastChar => _buffer.Length > 0 ? _buffer[_buffer.Length - 1] : '\0'; diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 748d01e..9e8686e 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -125,10 +125,10 @@ public void PrintMany(Func generator, int times) public void DecreaseQuote() => _quoteLevel--; public void PrintOpeningQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.OpeningPrimaryQuote : Format.OpeningSecondaryQuote)); + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.WritingSystem.Quotations.OpeningPrimary : Format.WritingSystem.Quotations.OpeningSecondary)); public void PrintClosingQuote() - => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.ClosingPrimaryQuote : Format.ClosingSecondaryQuote)); + => Output.Do(chain => chain.Print(_quoteLevel == 1 ? Format.WritingSystem.Quotations.ClosingPrimary : Format.WritingSystem.Quotations.ClosingSecondary)); public void SetYield() => shouldYield = true; diff --git a/Rant/Formats/EnglishNumberVerbalizer.cs b/Rant/Formats/EnglishNumberVerbalizer.cs new file mode 100644 index 0000000..9ccc50d --- /dev/null +++ b/Rant/Formats/EnglishNumberVerbalizer.cs @@ -0,0 +1,87 @@ +using System; +using System.Globalization; +using System.Text; + +namespace Rant.Formats +{ + public sealed class EnglishNumberVerbalizer : NumberVerbalizer + { + private readonly string[] thousandPowers = { "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion" }; + + private static readonly string[] cache; + + static EnglishNumberVerbalizer() + { + string[] tens = { "", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; + string[] pre = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", + "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; + cache = new string[1000]; + for(int i = 0; i < 1000; i++) + { + if (i < 20) + { + cache[i] = pre[i]; + } + else if (i < 100) + { + cache[i] = tens[i / 10] + (i % 10 > 0 ? $"-{pre[i % 10]}" : ""); + } + else + { + int h = i % 100; + cache[i] = pre[i / 100] + " hundred" + + (h > 0 + ? " and " + + (h < 20 + ? pre[h] + : tens[h / 10] + (h % 10 > 0 ? "-" + pre[i % 10] : "")) + : ""); + } + } + } + + public override string Verbalize(long number) + { + var sb = new StringBuilder(); + + if (number < 0) + { + number = -number; + sb.Append("negative "); + } + + var nstr = Convert.ToString(number, CultureInfo.InvariantCulture); + int dn = nstr.Length; + int firstGroupLength = dn % 3; + if (firstGroupLength == 0) firstGroupLength = 3; + int gn = (int)Math.Ceiling(dn / 3f); + string group; + + for (int i = 0; i < gn; i++) + { + group = i == 0 + ? nstr.Substring(0, firstGroupLength) + : nstr.Substring(firstGroupLength + (i - 1) * 3, 3); + + // Index of power name + int p = (gn - 1) - i; + int gv = Int32.Parse(group); + if (p > 0 && gv > 0) + { + // Print powers of thousand + sb.Append($"{cache[gv]} {thousandPowers[p - 1]}"); + + // If the last three digits are 000, there's no space needed. + if (!(p - 1 == 0 && number % 1000 == 0)) sb.Append(" "); + } + else if ((gn > 1 && gv != 0) || gn == 1) + { + if (gn > 0 && gv < 100) sb.Append("and "); + // Print last three digits + sb.Append(cache[gv]); + } + } + return sb.ToString(); + } + } +} diff --git a/Rant/Formats/GermanNumberVerbalizer.cs b/Rant/Formats/GermanNumberVerbalizer.cs new file mode 100644 index 0000000..de9ce68 --- /dev/null +++ b/Rant/Formats/GermanNumberVerbalizer.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rant.Formats +{ + public sealed class GermanNumberVerbalizer : NumberVerbalizer + { + private readonly string[] thousandPowers = { "tausend", "million", "milliarde", "billion", "billiarde", "trillion", "trilliarde", "quadrillion", "quadrilliarde" }; + + private static readonly string[] cache; + + static GermanNumberVerbalizer() + { + string[] tens = { "", "zehn", "zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig" }; + string[] und = { "", "einund", "zweiund", "dreiund", "vierund", "fünfund", "sechsund", "siebenund", "achtund", "neunund" }; + string[] pre = { "null", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", + "zehn", "elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn", "siebzehn", "achtzehn", "neunzehn" }; + cache = new string[1000]; + for (int i = 0; i < 1000; i++) + { + if (i < 20) + { + cache[i] = pre[i]; + } + else if (i < 100) + { + cache[i] = (i % 10 > 0 ? und[i % 10] : "") + tens[i / 10]; + } + else + { + int h = i % 100; + cache[i] = (i / 100 > 1 ? pre[i / 100] : "") + "hundert" + + (h > 0 + ? (h < 20 + ? pre[h] + : (h % 10 > 0 ? und[i % 10] : "") + tens[h / 10]) + : ""); + } + } + } + + public override string Verbalize(long number) + { + var sb = new StringBuilder(); + + if (number < 0) + { + number = -number; + sb.Append("minus "); + } + + var nstr = Convert.ToString(number, CultureInfo.InvariantCulture); + int dn = nstr.Length; + int firstGroupLength = dn % 3; + if (firstGroupLength == 0) firstGroupLength = 3; + int gn = (int)Math.Ceiling(dn / 3f); + string group; + + for (int i = 0; i < gn; i++) + { + group = i == 0 + ? nstr.Substring(0, firstGroupLength) + : nstr.Substring(firstGroupLength + (i - 1) * 3, 3); + + // Index of power name + int p = (gn - 1) - i; + int gv = Int32.Parse(group); + if (p > 0) + { + // Print powers of thousand + if (gv > 1) sb.Append(cache[gv]); + if (gv > 0) sb.Append(thousandPowers[p - 1]); + } + else if ((gn > 1 && gv != 0) || gn == 1) + { + // Print last three digits + sb.Append(cache[gv]); + } + } + return sb.ToString(); + } + } +} diff --git a/Rant/Formats/NumberVerbalizer.cs b/Rant/Formats/NumberVerbalizer.cs new file mode 100644 index 0000000..491817e --- /dev/null +++ b/Rant/Formats/NumberVerbalizer.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rant.Formats +{ + public abstract class NumberVerbalizer + { + public abstract string Verbalize(long number); + } +} diff --git a/Rant/Formats/QuotationMarks.cs b/Rant/Formats/QuotationMarks.cs new file mode 100644 index 0000000..1bfc607 --- /dev/null +++ b/Rant/Formats/QuotationMarks.cs @@ -0,0 +1,59 @@ +namespace Rant.Formats +{ + /// + /// Represents a configuration for quotation marks. + /// + public sealed class QuotationMarks + { + /// + /// Initializes a new instance of the QuotationFormat class with the default configuration. + /// + public QuotationMarks() + { + } + + /// + /// Initializes a new instance of the QuotationFormat class with the specified quotation marks. + /// + /// The opening primary quote. + /// The closing primary quote. + /// The opening secondary quote. + /// The closing secondary quote. + public QuotationMarks(char openPrimary, char closePrimary, char openSecondary, char closeSecondary) + { + OpeningPrimary = openPrimary; + ClosingPrimary = closePrimary; + OpeningSecondary = openSecondary; + ClosingSecondary = closeSecondary; + } + + /// + /// The opening primary quotation mark. + /// + public char OpeningPrimary { get; } = '\u201c'; + + /// + /// The closing primary quotation mark. + /// + public char ClosingPrimary { get; } = '\u201d'; + + /// + /// The opening secondary quotation mark. + /// + public char OpeningSecondary { get; } = '\u2018'; + + /// + /// The closing secondary quotation mark. + /// + public char ClosingSecondary { get; } = '\u2019'; + + /// + /// Returns a string representation of the configuration. + /// + /// + public override string ToString() + { + return $"{{ {OpeningPrimary}Primary{ClosingPrimary}, {OpeningSecondary}Secondary{ClosingSecondary} }}"; + } + } +} diff --git a/Rant/Formats/RantFormat.cs b/Rant/Formats/RantFormat.cs index bc888d1..eb81b14 100644 --- a/Rant/Formats/RantFormat.cs +++ b/Rant/Formats/RantFormat.cs @@ -40,14 +40,26 @@ public sealed class RantFormat /// /// English formatting. /// - public static RantFormat English; + public static readonly RantFormat English; + + /// + /// German formatting. + /// + public static readonly RantFormat German; static RantFormat() { English = new RantFormat(); - English.TitleCaseExclusions.AddRange( - "a", "an", "the", "that", "where", "when", "for", "any", "or", "and", "of", "in", "at", "as", "into", "if", - "are", "you", "why", "from"); + German = new RantFormat(CultureInfo.GetCultureInfo("de-DE"), + new WritingSystem(new[] + { + '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', + 'ä', 'ö', 'ü', 'ß' + }, " ", new QuotationMarks('\u201e', '\u201c', '\u201a', '\u2018')), + new string[0], + new EnglishPluralizer(), + new GermanNumberVerbalizer()); } /// @@ -58,147 +70,40 @@ public RantFormat() } /// - /// Creates a new RantFormat instance with the specified culture. - /// - /// The culture to associate with the format. - public RantFormat(CultureInfo culture) - { - Culture = culture; - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, and alphabet. - /// - /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters) - { - Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, and quotation marks. - /// - /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - /// The opening primary quotation mark to use. - /// The closing primary quotation mark to use. - /// The opening secondary quotation mark to use. - /// The closing secondary quotation mark to use. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, - char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote) - { - Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - OpeningPrimaryQuote = openingPrimaryQuote; - ClosingPrimaryQuote = closingPrimaryQuote; - OpeningSecondaryQuote = openingSecondaryQuote; - ClosingSecondaryQuote = closingSecondaryQuote; - } - - /// - /// Creates a new RantFormat instance with the specified culture and title case exclusion list. - /// - /// The culture to associate with the format. - /// A collection of words to exclude from title case capitalization. - public RantFormat(CultureInfo culture, IEnumerable titleCaseExclusions) - { - Culture = culture; - foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); - } - - /// - /// Creates a new RantFormat instance with the specified culture, title case exclusion list, and pluralizer. - /// - /// The culture to associate with the format. - /// A collection of words to exclude from title case capitalization. - /// The pluralizer to use. - public RantFormat(CultureInfo culture, IEnumerable titleCaseExclusions, Pluralizer pluralizer) - { - Culture = culture; - foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); - Pluralizer = pluralizer; - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, quotation marks, and title case - /// exclusion list. - /// - /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - /// The opening primary quotation mark to use. - /// The closing primary quotation mark to use. - /// The opening secondary quotation mark to use. - /// The closing secondary quotation mark to use. - /// A collection of words to exclude from title case capitalization. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, - char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote, - IEnumerable titleCaseExclusions) - { - Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - OpeningPrimaryQuote = openingPrimaryQuote; - ClosingPrimaryQuote = closingPrimaryQuote; - OpeningSecondaryQuote = openingSecondaryQuote; - ClosingSecondaryQuote = closingSecondaryQuote; - foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); - } - - /// - /// Creates a new RantFormat instance with the specified culture, standard space, alphabet, quotation marks, title case - /// exclusion list, and pluralizer. + /// Creates a new RantFormat instance with the specified configuration data. /// /// The culture to associate with the format. - /// The standard space character to use. - /// The alphabet to use with the format. - /// The opening primary quotation mark to use. - /// The closing primary quotation mark to use. - /// The opening secondary quotation mark to use. - /// The closing secondary quotation mark to use. + /// The writing system to use. + /// The quotation format to use. /// A collection of words to exclude from title case capitalization. /// The pluralizer to use. - public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, - char openingPrimaryQuote, char closingPrimaryQuote, char openingSecondaryQuote, char closingSecondaryQuote, - IEnumerable titleCaseExclusions, Pluralizer pluralizer) + public RantFormat( + CultureInfo culture, WritingSystem writingSystem, IEnumerable titleCaseExclusions, + Pluralizer pluralizer, NumberVerbalizer numVerbalizer) { Culture = culture; - StandardSpace = stdSpace; - LettersInternal = letters.ToArray(); - OpeningPrimaryQuote = openingPrimaryQuote; - ClosingPrimaryQuote = closingPrimaryQuote; - OpeningSecondaryQuote = openingSecondaryQuote; - ClosingSecondaryQuote = closingSecondaryQuote; + WritingSystem = writingSystem; foreach (string word in titleCaseExclusions) TitleCaseExclusions.Add(word); Pluralizer = pluralizer; + NumberVerbalizer = numVerbalizer; } /// /// Gets the collection of words excluded from Title Case capitalization. /// - private HashSet TitleCaseExclusions { get; } = new HashSet(StringComparer.InvariantCultureIgnoreCase); - - /// - /// The letter set used by escape sequences like \c and \w. - /// - public IEnumerable Letters => LettersInternal.AsEnumerable(); - - internal char[] LettersInternal { get; } = - { - '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' - }; + private HashSet TitleCaseExclusions { get; } = new HashSet( + new[] + { + "a", "an", "the", "that", "where", "when", "for", "any", "or", "and", + "of", "in", "at", "as", "into", "if", "are", "you", "why", "from", + "with", "these", "those" + }, + StringComparer.InvariantCultureIgnoreCase); /// - /// The standard space character used in automated formatting, such as series. - /// - public char StandardSpace { get; } = ' '; + /// The writing system for the current format. + /// + public WritingSystem WritingSystem { get; } = new WritingSystem(); /// /// The culture to format output strings with. @@ -210,30 +115,8 @@ public RantFormat(CultureInfo culture, char stdSpace, IEnumerable letters, /// public Pluralizer Pluralizer { get; } = new EnglishPluralizer(); - internal bool Excludes(string word) => TitleCaseExclusions.Contains(word); - - #region Quotation marks - - /// - /// The opening primary quotation mark. - /// - public char OpeningPrimaryQuote { get; } = '\u201c'; - - /// - /// The closing primary quotation mark. - /// - public char ClosingPrimaryQuote { get; } = '\u201d'; - - /// - /// The opening secondary quotation mark. - /// - public char OpeningSecondaryQuote { get; } = '\u2018'; + public NumberVerbalizer NumberVerbalizer { get; } = new EnglishNumberVerbalizer(); - /// - /// The closing secondary quotation mark. - /// - public char ClosingSecondaryQuote { get; } = '\u2019'; - - #endregion + internal bool Excludes(string word) => TitleCaseExclusions.Contains(word); } } \ No newline at end of file diff --git a/Rant/Formats/WritingSystem.cs b/Rant/Formats/WritingSystem.cs new file mode 100644 index 0000000..2eac8c4 --- /dev/null +++ b/Rant/Formats/WritingSystem.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rant.Formats +{ + /// + /// Represents configuration settings for a language's writing system. + /// + public sealed class WritingSystem + { + private readonly char[] _alphabet; + private readonly string _space; + + public WritingSystem(IEnumerable alphabet, string space, QuotationMarks quotations) + { + _alphabet = alphabet.ToArray(); + _space = space; + Quotations = quotations; + } + + public WritingSystem() + { + _alphabet = new[] + { + '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' + }; + _space = " "; + Quotations = new QuotationMarks(); + } + + internal char[] AlphabetArray => _alphabet; + + public IEnumerable GetAlphabet() => _alphabet.AsEnumerable(); + + public QuotationMarks Quotations { get; } + + public string Space => _space; + } +} diff --git a/Rant/Localization/Txtres.cs b/Rant/Localization/Txtres.cs index fab1650..296545f 100644 --- a/Rant/Localization/Txtres.cs +++ b/Rant/Localization/Txtres.cs @@ -136,11 +136,11 @@ private static void LoadStringTableData(string lang, Stream stream, Dictionary= valueLiteral.Length) goto loop; - short code; - if (!short.TryParse(valueLiteral.Substring(i + 1, 4), - NumberStyles.AllowHexSpecifier, - CultureInfo.InvariantCulture, out code)) goto loop; - sb.Append((char)code); + if (!short.TryParse(valueLiteral.Substring(i + 1, 4), + NumberStyles.AllowHexSpecifier, + CultureInfo.InvariantCulture, out short code)) + goto loop; + sb.Append((char)code); i += 6; continue; } @@ -169,19 +169,18 @@ private static void CheckLanguage() try { _langName = CultureInfo.CurrentCulture.Name; - Dictionary table; - if (!_languages.TryGetValue(_langName, out table)) - { - using ( - var stream = - Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{_langName}.lang")) - { - if (stream == null) return; - table = new Dictionary(); - LoadStringTableData(_langName, stream, table); - } - } - _currentTable = table; + if (!_languages.TryGetValue(_langName, out Dictionary table)) + { + using ( + var stream = + Assembly.GetExecutingAssembly().GetManifestResourceStream($"{LanguageResourceNamespace}.{_langName}.lang")) + { + if (stream == null) return; + table = new Dictionary(); + LoadStringTableData(_langName, stream, table); + } + } + _currentTable = table; } catch (Exception ex) { diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index f937233..7467732 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -181,6 +181,11 @@ + + + + + diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index 93d94b9..9254e2c 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -37,8 +37,6 @@ namespace Rant.Vocabulary.Querying /// internal sealed class Query { - private const string PHRASAL_SEP = " "; - private readonly HashSet _filters = new HashSet(); /// @@ -112,14 +110,14 @@ internal IEnumerator Run(Sandbox sb) if (this.Complement == null) { sb.Print(result.LeftSide); - sb.Print(PHRASAL_SEP); + sb.Print(sb.Format.WritingSystem.Space); sb.Print(result.RightSide); } else if (result.ValueSplitIndex == 0) // Pushes complement to the left of the query result { long l = sb.SizeLimit.Value; yield return this.Complement; - if (sb.SizeLimit.Value > l) sb.Print(PHRASAL_SEP); + if (sb.SizeLimit.Value > l) sb.Print(sb.Format.WritingSystem.Space); sb.Print(result.Value); } else if (result.ValueSplitIndex == result.Value.Length) @@ -128,15 +126,15 @@ internal IEnumerator Run(Sandbox sb) long l = sb.SizeLimit.Value; var t = sb.Output.InsertAnonymousTarget(); yield return this.Complement; - if (sb.SizeLimit.Value > l) sb.Output.PrintToTarget(t, PHRASAL_SEP); + if (sb.SizeLimit.Value > l) sb.Output.PrintToTarget(t, sb.Format.WritingSystem.Space); } else // Complement goes inside phrase { sb.Print(result.LeftSide); - sb.Print(PHRASAL_SEP); + sb.Print(sb.Format.WritingSystem.Space); long l = sb.SizeLimit.Value; yield return this.Complement; - if (sb.SizeLimit.Value > l) sb.Print(PHRASAL_SEP); + if (sb.SizeLimit.Value > l) sb.Print(sb.Format.WritingSystem.Space); sb.Print(result.RightSide); } } @@ -148,7 +146,7 @@ internal IEnumerator Run(Sandbox sb) long l = sb.SizeLimit.Value; var t = sb.Output.InsertAnonymousTarget(); yield return this.Complement; - if (sb.SizeLimit.Value > l) sb.Output.PrintToTarget(t, PHRASAL_SEP); + if (sb.SizeLimit.Value > l) sb.Output.PrintToTarget(t, sb.Format.WritingSystem.Space); } } } From 12289af785dd35805ade6cb9ebf080bc0e03f6d7 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 15 Mar 2017 15:15:49 -0500 Subject: [PATCH 132/213] Fix verbalizer bugs --- Rant/Formats/EnglishNumberVerbalizer.cs | 2 +- Rant/Formats/GermanNumberVerbalizer.cs | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Rant/Formats/EnglishNumberVerbalizer.cs b/Rant/Formats/EnglishNumberVerbalizer.cs index 9ccc50d..93c754b 100644 --- a/Rant/Formats/EnglishNumberVerbalizer.cs +++ b/Rant/Formats/EnglishNumberVerbalizer.cs @@ -76,7 +76,7 @@ public override string Verbalize(long number) } else if ((gn > 1 && gv != 0) || gn == 1) { - if (gn > 0 && gv < 100) sb.Append("and "); + if (gn > 1 && gv < 100) sb.Append("and "); // Print last three digits sb.Append(cache[gv]); } diff --git a/Rant/Formats/GermanNumberVerbalizer.cs b/Rant/Formats/GermanNumberVerbalizer.cs index de9ce68..95ab378 100644 --- a/Rant/Formats/GermanNumberVerbalizer.cs +++ b/Rant/Formats/GermanNumberVerbalizer.cs @@ -9,7 +9,8 @@ namespace Rant.Formats { public sealed class GermanNumberVerbalizer : NumberVerbalizer { - private readonly string[] thousandPowers = { "tausend", "million", "milliarde", "billion", "billiarde", "trillion", "trilliarde", "quadrillion", "quadrilliarde" }; + private readonly string[] thousandPowers = { "tausend", "eine Million ", "eine Milliarde ", "eine Billion ", "eine Billiarde ", "eine Trillion ", "eine Trilliarde ", "eine Quadrillion ", "eine Quadrilliarde " }; + private readonly string[] thousandPowersPl = { "tausend", " Millionen ", " Milliarden ", " Billionen ", " Billiarden ", " Trillionen ", " Trilliarden ", " Quadrillionen ", " Quadrilliarden " }; private static readonly string[] cache; @@ -71,9 +72,18 @@ public override string Verbalize(long number) int gv = Int32.Parse(group); if (p > 0) { - // Print powers of thousand - if (gv > 1) sb.Append(cache[gv]); - if (gv > 0) sb.Append(thousandPowers[p - 1]); + if (gv == 1 && p > 1) + { + // One million + + sb.Append(thousandPowers[p - 1]); + } + else + { + // Print powers of thousand + if (gv > 1) sb.Append(cache[gv]); + if (gv > 0) sb.Append(thousandPowersPl[p - 1]); + } + } else if ((gn > 1 && gv != 0) || gn == 1) { @@ -81,7 +91,7 @@ public override string Verbalize(long number) sb.Append(cache[gv]); } } - return sb.ToString(); + return sb.ToString().Trim(); } } } From 5566b9c35fcf007ffeceb8db5031cf3cd0061119 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 10:47:04 -0500 Subject: [PATCH 133/213] Implement block output redirection --- Rant.Console/Program.cs | 2 +- Rant/Core/Compiler/Parsing/BlockParser.cs | 50 +-- Rant/Core/Compiler/Syntax/RstBlock.cs | 475 ++++++++++---------- Rant/Core/Constructs/BlockAttribs.cs | 4 +- Rant/Core/Constructs/BlockManager.cs | 13 +- Rant/Core/Framework/RantFunctionRegistry.cs | 24 + Rant/Core/Sandbox.State.cs | 6 + Rant/Core/Sandbox.cs | 14 +- 8 files changed, 318 insertions(+), 270 deletions(-) diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 3107a50..3449df2 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -173,7 +173,7 @@ private static void PrintOutput(RantEngine engine, string source, bool isFile = #if DEBUG WriteLine($"'{chan.Value}'"); #else - WriteLine(chan.Value); + WriteLine(chan.Value.Normalize(NormalizationForm.FormC)); #endif } } diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 8af9de6..e0e35d9 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -58,33 +58,29 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var firstToken = reader.ReadLooseToken(); - // constant weight - if (reader.PeekLooseToken().Type == R.Text) - { - string value = reader.ReadLooseToken().Value; - double doubleValue; - if (!double.TryParse(value, out doubleValue)) - compiler.SyntaxError(reader.PrevLooseToken, false, "err-compiler-invalid-constweight"); - else - constantWeights.Add(new _(blockNumber, doubleValue)); - reader.Read(R.RightParen); - } - // dynamic weight - else - { - var weightActions = new List(); - - Action weightActionCallback = rst => weightActions.Add(rst); - - compiler.SetNextActionCallback(weightActionCallback); - compiler.AddContext(CompileContext.BlockWeight); - yield return Get(); - - if (weightActions.Count == 0) - compiler.SyntaxError(firstToken, false, "err-compiler-empty-weight"); - else - dynamicWeights.Add(new _(blockNumber, new RstSequence(weightActions, weightActions[0].Location))); - } + List sequence = new List(); + Action cb = rst => sequence.Add(rst); + compiler.SetNextActionCallback(cb); + compiler.AddContext(CompileContext.BlockWeight); + yield return Get(); + + // Constant + if (sequence.Count == 1 && sequence[0] is RstText txtNode) + { + string txt = txtNode.Text; + if (!double.TryParse(txt, out double doubleValue)) + compiler.SyntaxError(reader.PrevLooseToken, false, "err-compiler-invalid-constweight"); + else + constantWeights.Add(new _(blockNumber, doubleValue)); + } + // Dynamic + else + { + if (sequence.Count == 0) + compiler.SyntaxError(firstToken, false, "err-compiler-empty-weight"); + else + dynamicWeights.Add(new _(blockNumber, new RstSequence(sequence, sequence[0].Location))); + } } compiler.SetNextActionCallback(itemCallback); diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index 058eb96..c124706 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -33,230 +33,253 @@ namespace Rant.Core.Compiler.Syntax { - /// - /// Represents a block construct, which provides multiple options to the interpreter for the next sequence, one of which is - /// chosen. - /// - [RST("bloc")] - internal class RstBlock : RST - { - private double _constantWeightSum; - private int _count; - private List<_> _dynamicWeights = null; - private List _elements = new List(); - private bool _weighted = false; - // Item weights. - // Dynamic weights are patterns that must be run to get the weight value. - // Constant weights can be used directly. This is used for optimization. - // TODO: Move _weights to local scope for thread safety - private double[] _weights = null; - - public RstBlock(LineCol location) : base(location) - { - // Used by serializer - } - - public RstBlock(LineCol location, List items, - List<_> dynamicWeights, List<_> constantWeights) - : base(location) - { - _elements.AddRange(items); - _count = items.Count; - if (dynamicWeights != null && constantWeights != null) - { - _dynamicWeights = dynamicWeights; - _weights = new double[_count]; - for (int i = 0; i < _count; i++) _weights[i] = 1; - foreach (var cw in constantWeights) - _weights[cw.Item1] = cw.Item2; - _constantWeightSum = _weights.Sum() - _dynamicWeights.Count; - _weighted = true; - } - } - - public override IEnumerator Run(Sandbox sb) - { - var attribs = sb.NextAttribs(this); - - // Skip if chance doesn't fall within range - if (attribs.Chance < 100 && sb.RNG.NextDouble(0, 100) > attribs.Chance) - yield break; - - int next = -1; - int reps = attribs.RepEach ? _elements.Count : attribs.Repetitions; - var block = new BlockState(attribs.Repetitions); - double weightSum = _constantWeightSum; - - if (attribs.Start != null) yield return attribs.Start; - - if (_weighted && attribs.Sync == null) - { - foreach (var dw in _dynamicWeights) - { - sb.AddOutputWriter(); - yield return dw.Item2; - string strWeight = sb.Return().Main; - if (!double.TryParse(strWeight, out _weights[dw.Item1])) - { - throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, - GetString("err-runtime-invalid-dynamic-weight", strWeight)); - } - - weightSum += _weights[dw.Item1]; - } - } - - if (attribs.Sync?.Index == 0 && attribs.StartIndex >= 0) - attribs.Sync.Index = attribs.StartIndex; - - sb.Blocks.Push(block); - for (int i = 0; i < reps; i++) - { - if (i == 0 && attribs.StartIndex >= 0 && attribs.Sync == null) - next = attribs.StartIndex > _count ? _count - 1 : attribs.StartIndex; - else if (_weighted) - { - double choice = sb.RNG.NextDouble(weightSum); - for (int j = 0; j < _count; j++) - { - if (choice < _weights[j]) - { - next = j; - break; - } - choice -= _weights[j]; - } - } - else - next = attribs.NextIndex(_count, sb.RNG); - - if (next == -1) break; - - block.Next(next); // Set next block index - - sb.Blocks.Pop(); // Don't allow separator to access block state - - // Separator - if (i > 0 && attribs.Separator != null) - { - if (attribs.IsSeries) - { - // Check if we're on the last separator in a series - if (i == reps - 1) - { - // Add the oxford comma if specified - if (attribs.EndSeparator != null) - if (reps > 2) yield return attribs.EndSeparator; - - sb.Print(sb.Format.WritingSystem.Space); - - // Add conjunction if specified (it normally should be, if it's a series) - if (attribs.EndConjunction != null) - { - yield return attribs.EndConjunction; - sb.Print(sb.Format.WritingSystem.Space); - } - } - else if (reps > 2) - { - yield return attribs.Separator; - sb.Print(sb.Format.WritingSystem.Space); - } - } - else - yield return attribs.Separator; - } - sb.Blocks.Push(block); // Now put it back - - // Prefix - if (attribs.Before != null) yield return attribs.Before; - - // Content - sb.Objects.EnterScope(); - yield return _elements[next]; - sb.Objects.ExitScope(); - - // Affix - if (attribs.After != null) yield return attribs.After; - } - sb.Blocks.Pop(); - - if (attribs.End != null) yield return attribs.End; - } - - protected override IEnumerator Serialize(EasyWriter output) - { - output.Write(_count); - output.Write(_weighted); - if (_weighted) - { - // Write constant weights - if (_weights != null) - { - output.Write(true); - output.Write(_constantWeightSum); - for (int i = 0; i < _count; i++) - output.Write(_weights[i]); - } - else - output.Write(false); - - // Write dynamic weights - if (_dynamicWeights != null) - { - output.Write(_dynamicWeights.Count); - foreach (var dw in _dynamicWeights) - { - output.Write(dw.Item1); - yield return dw.Item2; - } - } - else - output.Write(0); - } - - // Block elements - foreach (var e in _elements) yield return e; - } - - protected override IEnumerator Deserialize(EasyReader input) - { - input.ReadInt32(out _count); - input.ReadBoolean(out _weighted); - if (_weighted) - { - // Read constant weights - if (input.ReadBoolean()) - { - input.ReadDouble(out _constantWeightSum); - _weights = new double[_count]; - for (int i = 0; i < _count; i++) - input.ReadDouble(out _weights[i]); - } - - // Read dynamic weights - int numDW = input.ReadInt32(); - if (numDW > 0) - { - _dynamicWeights = new List<_>(numDW); - for (int i = 0; i < numDW; i++) - { - int index = input.ReadInt32(); - var request = new DeserializeRequest(); - yield return request; - _dynamicWeights.Add(new _(index, request.Result)); - } - } - } - - // Read elements - _elements = new List(_count); - for (int i = 0; i < _count; i++) - { - var request = new DeserializeRequest(); - yield return request; - _elements.Add(request.Result); - } - } - } + /// + /// Represents a block construct, which provides multiple options to the interpreter for the next sequence, one of which is + /// chosen. + /// + [RST("bloc")] + internal class RstBlock : RST + { + private double _constantWeightSum; + private int _count; + private List<_> _dynamicWeights = null; + private List _elements = new List(); + private bool _weighted = false; + // Item weights. + // Dynamic weights are patterns that must be run to get the weight value. + // Constant weights can be used directly. This is used for optimization. + // TODO: Move _weights to local scope for thread safety + private double[] _weights = null; + + public RstBlock(LineCol location) : base(location) + { + // Used by serializer + } + + public RstBlock(LineCol location, List items, + List<_> dynamicWeights, List<_> constantWeights) + : base(location) + { + _elements.AddRange(items); + _count = items.Count; + if (dynamicWeights != null && constantWeights != null) + { + _dynamicWeights = dynamicWeights; + _weights = new double[_count]; + for (int i = 0; i < _count; i++) _weights[i] = 1; + foreach (var cw in constantWeights) + _weights[cw.Item1] = cw.Item2; + _constantWeightSum = _weights.Sum() - _dynamicWeights.Count; + _weighted = true; + } + } + + public override IEnumerator Run(Sandbox sb) + { + var attribs = sb.NextAttribs(this); + + // Skip if chance doesn't fall within range + if (attribs.Chance < 100 && sb.RNG.NextDouble(0, 100) > attribs.Chance) + yield break; + + int next = -1; + int reps = attribs.RepEach ? _elements.Count : attribs.Repetitions; + var block = new BlockState(attribs.Repetitions); + double weightSum = _constantWeightSum; + + if (attribs.Start != null) yield return attribs.Start; + + if (_weighted && attribs.Sync == null) + { + foreach (var dw in _dynamicWeights) + { + sb.AddOutputWriter(); + yield return dw.Item2; + string strWeight = sb.Return().Main; + if (string.IsNullOrEmpty(strWeight)) + { + _weights[dw.Item1] = 0.0; + } + else if (!double.TryParse(strWeight, out _weights[dw.Item1])) + { + throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, + GetString("err-runtime-invalid-dynamic-weight", strWeight)); + } + + weightSum += _weights[dw.Item1]; + } + } + + if (attribs.Sync?.Index == 0 && attribs.StartIndex >= 0) + attribs.Sync.Index = attribs.StartIndex; + + sb.Blocks.Push(block); + for (int i = 0; i < reps; i++) + { + if (i == 0 && attribs.StartIndex >= 0 && attribs.Sync == null) + { + next = attribs.StartIndex > _count ? _count - 1 : attribs.StartIndex; + } + else if (_weighted) + { + double choice = sb.RNG.NextDouble(weightSum); + for (int j = 0; j < _count; j++) + { + if (choice < _weights[j]) + { + next = j; + break; + } + choice -= _weights[j]; + } + } + else + { + next = attribs.NextIndex(_count, sb.RNG); + } + + if (next == -1) break; + + block.Next(next); // Set next block index + + sb.Blocks.Pop(); // Don't allow separator to access block state + + // Separator + if (i > 0 && attribs.Separator != null) + { + if (attribs.IsSeries) + { + // Check if we're on the last separator in a series + if (i == reps - 1) + { + // Add the oxford comma if specified + if (attribs.EndSeparator != null) + if (reps > 2) yield return attribs.EndSeparator; + + sb.Print(sb.Format.WritingSystem.Space); + + // Add conjunction if specified (it normally should be, if it's a series) + if (attribs.EndConjunction != null) + { + yield return attribs.EndConjunction; + sb.Print(sb.Format.WritingSystem.Space); + } + } + else if (reps > 2) + { + yield return attribs.Separator; + sb.Print(sb.Format.WritingSystem.Space); + } + } + else + yield return attribs.Separator; + } + sb.Blocks.Push(block); // Now put it back + + // Prefix + if (attribs.Before != null) yield return attribs.Before; + + // Content + + // Redirect output if requested + if (attribs.Redirect != null) + { + sb.AddOutputWriter(); + } + + sb.Objects.EnterScope(); + yield return _elements[next]; + sb.Objects.ExitScope(); + + // Retrieve redirected output + if (attribs.Redirect != null) + { + sb.PushRedirectedOutput(); + yield return attribs.Redirect; + sb.PopRedirectedOutput(); + } + + // Affix + if (attribs.After != null) yield return attribs.After; + } + sb.Blocks.Pop(); + + if (attribs.End != null) yield return attribs.End; + } + + protected override IEnumerator Serialize(EasyWriter output) + { + output.Write(_count); + output.Write(_weighted); + if (_weighted) + { + // Write constant weights + if (_weights != null) + { + output.Write(true); + output.Write(_constantWeightSum); + for (int i = 0; i < _count; i++) + output.Write(_weights[i]); + } + else + output.Write(false); + + // Write dynamic weights + if (_dynamicWeights != null) + { + output.Write(_dynamicWeights.Count); + foreach (var dw in _dynamicWeights) + { + output.Write(dw.Item1); + yield return dw.Item2; + } + } + else + output.Write(0); + } + + // Block elements + foreach (var e in _elements) yield return e; + } + + protected override IEnumerator Deserialize(EasyReader input) + { + input.ReadInt32(out _count); + input.ReadBoolean(out _weighted); + if (_weighted) + { + // Read constant weights + if (input.ReadBoolean()) + { + input.ReadDouble(out _constantWeightSum); + _weights = new double[_count]; + for (int i = 0; i < _count; i++) + input.ReadDouble(out _weights[i]); + } + + // Read dynamic weights + int numDW = input.ReadInt32(); + if (numDW > 0) + { + _dynamicWeights = new List<_>(numDW); + for (int i = 0; i < numDW; i++) + { + int index = input.ReadInt32(); + var request = new DeserializeRequest(); + yield return request; + _dynamicWeights.Add(new _(index, request.Result)); + } + } + } + + // Read elements + _elements = new List(_count); + for (int i = 0; i < _count; i++) + { + var request = new DeserializeRequest(); + yield return request; + _elements.Add(request.Result); + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/BlockAttribs.cs b/Rant/Core/Constructs/BlockAttribs.cs index 9b50aeb..b6ddd1a 100644 --- a/Rant/Core/Constructs/BlockAttribs.cs +++ b/Rant/Core/Constructs/BlockAttribs.cs @@ -51,6 +51,7 @@ public int Repetitions public RST Before { get; set; } public RST After { get; set; } public RST End { get; set; } + public RST Redirect { get; set; } public Synchronizer Sync { get; set; } public double Chance { get; set; } = 100.0; public AttribPersistence Persistence { get; set; } = AttribPersistence.Off; @@ -82,8 +83,7 @@ public void SetDefaults() public int NextIndex(int blockItemCount, RNG rng) { // Use synchronizer if available - if (Sync != null) - return Sync.NextItem(blockItemCount); + if (Sync != null) return Sync.NextItem(blockItemCount); return rng.Next(blockItemCount); } diff --git a/Rant/Core/Constructs/BlockManager.cs b/Rant/Core/Constructs/BlockManager.cs index 8eea27f..b84fad6 100644 --- a/Rant/Core/Constructs/BlockManager.cs +++ b/Rant/Core/Constructs/BlockManager.cs @@ -48,18 +48,7 @@ public BlockAttribs SetPrevAttribs(BlockAttribs attribs) return attribs; } - public BlockAttribs GetPrevious(int repeatMaximum) - { - if (repeatMaximum < 0) return _prevAttribs; - - if (_prevCount < repeatMaximum - 1) - { - _prevCount += 1; - return _prevAttribs; - } - _prevCount = 0; - return new BlockAttribs(); - } + public BlockAttribs GetPrevious() => _prevAttribs; public void Add(BlockAttribs attribs, RstBlock block) { diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index e4dbdfc..d947025 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -119,6 +119,12 @@ private static void Rep(Sandbox sb, [RantDescription("Sets the repetition count to the number of items in the next block.")] private static void RepEach(Sandbox sb) => sb.CurrentBlockAttribs.RepEach = true; + [RantFunction("sep")] + private static IEnumerator PrintSep(Sandbox sb) + { + yield return sb.BlockManager.GetPrevious().Separator; + } + [RantFunction("sep", "s")] [RantDescription("Sets the separator pattern for the next block.")] private static void Sep(Sandbox sb, @@ -971,5 +977,23 @@ private static void QueryClassFilterNegative(Sandbox sb, string id, params strin cf.AddRule(new ClassFilterRule(cl, false)); } } + + [RantFunction("pipe")] + private static void Redirect(Sandbox sb, RST redirectCallback) + { + sb.CurrentBlockAttribs.Redirect = redirectCallback; + } + + [RantFunction("item")] + private static void RedirectedItem(Sandbox sb) + { + sb.Print(sb.GetRedirectedOutput().Main); + } + + [RantFunction("item")] + private static void RedirectedItem(Sandbox sb, string channel) + { + sb.Print(sb.GetRedirectedOutput()[channel]); + } } } \ No newline at end of file diff --git a/Rant/Core/Sandbox.State.cs b/Rant/Core/Sandbox.State.cs index fc944d5..be66767 100644 --- a/Rant/Core/Sandbox.State.cs +++ b/Rant/Core/Sandbox.State.cs @@ -20,6 +20,7 @@ internal sealed partial class Sandbox private bool _plural = false; private int _quoteLevel = 0; private bool shouldYield = false; + private Stack _redirOutputs; public QueryBuilder QueryBuilder { get; } = new QueryBuilder(); @@ -142,5 +143,10 @@ internal sealed partial class Sandbox /// Gets the arguments passed to the pattern. /// public RantProgramArgs PatternArgs { get; } + + /// + /// The block manager. + /// + public BlockManager BlockManager => _blockManager; } } diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 9e8686e..4051c0f 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -69,7 +69,7 @@ public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = // Private members _blockManager = new BlockManager(); - _stopwatch = new Stopwatch(); + _stopwatch = new Stopwatch(); // Output initialization BaseOutput = new OutputWriter(this); @@ -132,6 +132,16 @@ public void PrintClosingQuote() public void SetYield() => shouldYield = true; + public void PushRedirectedOutput() + { + if (_redirOutputs == null) _redirOutputs = new Stack(); + _redirOutputs.Push(_outputs.Pop().ToRantOutput()); + } + + public RantOutput PopRedirectedOutput() => _redirOutputs.Pop(); + + public RantOutput GetRedirectedOutput() => _redirOutputs.Count > 0 ? _redirOutputs.Peek() : null; + /// /// Dequeues the current block attribute set and returns it, queuing a new attribute set. /// @@ -154,7 +164,7 @@ public BlockAttribs NextAttribs(RstBlock block) break; case AttribPersistence.Once: - CurrentBlockAttribs = _blockManager.GetPrevious(1); + CurrentBlockAttribs = _blockManager.GetPrevious(); break; } From 9792c5c66bcc44843a93d6f5fbbb3bd7fa48e87a Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 11:30:14 -0500 Subject: [PATCH 134/213] Re-enable weighting on queries --- Rant/RNG.cs | 2 +- Rant/RantEngine.cs | 17 ++++----- Rant/Vocabulary/Querying/CarrierState.cs | 11 +++--- Rant/Vocabulary/RantDictionary.cs | 22 +++++++----- Rant/Vocabulary/RantDictionaryEntry.cs | 13 ++++--- .../RantDictionaryTable.Importer.cs | 3 +- Rant/Vocabulary/RantDictionaryTable.cs | 31 +++++++++------- Rant/Vocabulary/Utilities/VocabUtils.cs | 36 ++++++++++++++++--- 8 files changed, 84 insertions(+), 51 deletions(-) diff --git a/Rant/RNG.cs b/Rant/RNG.cs index 9a44f12..ae4e6bb 100644 --- a/Rant/RNG.cs +++ b/Rant/RNG.cs @@ -38,7 +38,7 @@ public class RNG { private const int Mask32 = 0x7FFFFFFF; private const long Mask64 = 0x7FFFFFFFFFFFFFFF; - private const double MaxDouble = long.MaxValue; + private const double MaxDouble = double.MaxValue; [ThreadStatic] private static RNGHashState _hashState = new RNGHashState(); diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 321d911..ec75d02 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -75,8 +75,7 @@ public RantEngine() /// The vocabulary to load in this instance. public RantEngine(RantDictionary dictionary) { - if (dictionary == null) throw new ArgumentNullException(nameof(dictionary)); - _dictionary = dictionary; + _dictionary = dictionary ?? throw new ArgumentNullException(nameof(dictionary)); } /// @@ -92,8 +91,7 @@ public RantFormat Format get { return _format; } set { - if (value == null) throw new ArgumentNullException(nameof(value)); - _format = value; + _format = value ?? throw new ArgumentNullException(nameof(value)); } } @@ -105,8 +103,7 @@ public RantDictionary Dictionary get { return _dictionary; } set { - if (value == null) throw new ArgumentNullException(nameof(value)); - _dictionary = value; + _dictionary = value ?? throw new ArgumentNullException(nameof(value)); } } @@ -118,8 +115,7 @@ public RantDependencyResolver DependencyResolver get { return _resolver; } set { - if (value == null) throw new ArgumentNullException(nameof(value)); - _resolver = value; + _resolver = value ?? throw new ArgumentNullException(nameof(value)); } } @@ -222,9 +218,8 @@ public void LoadPackage(string path) /// internal RantProgram GetProgramInternal(string name) { - RantProgram pattern; - if (_patternCache.TryGetValue(name, out pattern)) return pattern; - return _patternCache[name] = RantProgram.CompileFile(name); + if (_patternCache.TryGetValue(name, out RantProgram pattern)) return pattern; + return _patternCache[name] = RantProgram.CompileFile(name); } #region Static members diff --git a/Rant/Vocabulary/Querying/CarrierState.cs b/Rant/Vocabulary/Querying/CarrierState.cs index 51d0fb5..d1a0104 100644 --- a/Rant/Vocabulary/Querying/CarrierState.cs +++ b/Rant/Vocabulary/Querying/CarrierState.cs @@ -74,10 +74,9 @@ public void Reset() _uniqueTable.Clear(); } - internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumerable pool, - RNG rng) + internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumerable pool, RNG rng, bool weighted) { - if (carrier == null) return pool.PickEntry(rng); + if (carrier == null) return pool.PickEntry(rng, weighted); RantDictionaryEntry result = null; @@ -160,7 +159,7 @@ internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumer pool = pool.Where(e => e.DivergesFrom(result)); } - result = pool.PickEntry(rng); + result = pool.PickEntry(rng, weighted); // Handle rhyme carrier foreach (string rhyme in carrier.GetComponentsOfType(CarrierComponentType.Rhyme)) @@ -170,7 +169,7 @@ internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumer { result = pool .Where(e => !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation)) - .PickEntry(rng); + .PickEntry(rng, weighted); if (result == null) return null; _rhymeTable[rhyme] = _.Create(result[subtypeIndex], new HashSet(new[] { result })); break; @@ -180,7 +179,7 @@ internal RantDictionaryEntry GetEntry(Carrier carrier, int subtypeIndex, IEnumer .Where(e => !Util.IsNullOrWhiteSpace(e[subtypeIndex].Pronunciation) && Rhymer.Rhyme(rhymeState.Item1, e[subtypeIndex])) - .PickEntry(rng); + .PickEntry(rng, weighted); if (result != null) rhymeState.Item2.Add(result); break; // Ignore any extra rhyme carriers diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index aff469d..7aac378 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -72,6 +72,12 @@ public RantDictionary(IEnumerable tables) /// public IEnumerable IncludedHiddenClasses => _exposedClasses.AsEnumerable(); + /// + /// Determines whether tables will favor weighted distribution, if available. + /// Weighted distribution has a significantl impact on performance. + /// + public bool EnableWeighting { get; set; } = true; + /// /// Exposes a hidden class to query results. /// @@ -129,14 +135,14 @@ public IEnumerable GetTables() foreach (var pair in _tables) yield return pair.Value; } - /// - /// Queries the RantDictionary according to the specified criteria and returns a random match. - /// - /// The random number generator to randomize the match with. - /// The search criteria to use. - /// The state object to use for carrier synchronization. - /// - internal RantDictionaryTerm Query(Sandbox sb, Query query, CarrierState syncState) + /// + /// Queries the RantDictionary according to the specified criteria and returns a random match. + /// + /// The sandbox the query is to be run under. + /// The search criteria to use. + /// The state object to use for carrier synchronization. + /// + internal RantDictionaryTerm Query(Sandbox sb, Query query, CarrierState syncState) { return !_tables.TryGetValue(query.Name, out RantDictionaryTable table) ? null diff --git a/Rant/Vocabulary/RantDictionaryEntry.cs b/Rant/Vocabulary/RantDictionaryEntry.cs index b279713..ef5dc23 100644 --- a/Rant/Vocabulary/RantDictionaryEntry.cs +++ b/Rant/Vocabulary/RantDictionaryEntry.cs @@ -52,7 +52,6 @@ public RantDictionaryEntry(RantDictionaryTerm[] terms) TermCount = _terms.Length; _classes = new HashSet(); _optionalClasses = new HashSet(); - Weight = 1; } /// @@ -61,7 +60,7 @@ public RantDictionaryEntry(RantDictionaryTerm[] terms) /// The terms in the entry. /// The classes associated with the entry. /// The weight of the entry. - public RantDictionaryEntry(string[] terms, IEnumerable classes, int weight = 1) + public RantDictionaryEntry(string[] terms, IEnumerable classes, float weight = 1.0f) : this(terms.Select(s => new RantDictionaryTerm(s)), classes, weight) { } @@ -72,7 +71,7 @@ public RantDictionaryEntry(string[] terms, IEnumerable classes, int weig /// The terms in the entry. /// The classes associated with the entry. /// The weight of the entry. - public RantDictionaryEntry(IEnumerable terms, IEnumerable classes, int weight = 1) + public RantDictionaryEntry(IEnumerable terms, IEnumerable classes, float weight = 1.0f) { if (terms == null) throw new ArgumentNullException(nameof(terms)); _terms = terms.ToArray(); @@ -126,10 +125,10 @@ public RantDictionaryTerm this[int index] } } - /// - /// Gets the weight value of the entry. - /// - public int Weight { get; set; } + /// + /// Gets the weight value of the entry. + /// + public float Weight { get; set; } = 1.0f; /// /// Enumerates the terms stored in the current entry. diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index 8a6473b..ca057f3 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -262,9 +262,10 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) break; case "weight": { - if (!int.TryParse(args[0].Value, out int weight) || weight <= 0) + if (!float.TryParse(args[0].Value, out float weight) || weight <= 0) throw new RantTableLoadException(origin, line, args[0].CharIndex + 1, "err-table-invalid-weight", args[0].Value); currentEntry.Weight = weight; + table.EnableWeighting = true; break; } case "pron": diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 047d5cc..bc6a010 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -51,15 +51,16 @@ public sealed partial class RantDictionaryTable : RantResource private readonly HashSet _hidden = new HashSet(new[] { NSFW }); private readonly Dictionary> _subtypeIndexMap = new Dictionary>(); private readonly Dictionary _subtypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - private ClassTree _classTree = new ClassTree(new RantDictionaryEntry[] { }); + private ClassTree _classTree = new ClassTree(new RantDictionaryEntry[0]); private SyllableBuckets[] _syllableBuckets; - /// - /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. - /// - /// The name of the table. - /// The number of terms to store in each entry. - public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) + /// + /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. + /// + /// The name of the table. + /// The number of terms to store in each entry. + /// Collection of hidden classes. + public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) { if (name == null) throw new ArgumentNullException(nameof(name)); if (termsPerEntry <= 0) throw new ArgumentException(Txtres.GetString("err-bad-term-count")); @@ -141,6 +142,11 @@ public bool IsClassHidden(string className) /// public bool UnhideClass(string className) => className != null && _hidden.Remove(className); + /// + /// Determines whether weights are enabled on this table. + /// + public bool EnableWeighting { get; set; } = false; + /// /// Adds the specified entry to the table. /// @@ -297,7 +303,7 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q if (index == -1) return null; - if (query.BareQuery) return _visibleEntriesList.PickEntry(sb.RNG)?[index]; + if (query.BareQuery) return _visibleEntriesList.PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; // process simple class filters using class tree var filters = query.GetFilters(); @@ -313,7 +319,7 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q // if it's just the class filters, let's leave now if (!filters.Any() && !query.HasCarrier) - return pool.ToList().PickEntry(sb.RNG)?[index]; + return pool.ToList().PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; // process syllable count filters using syllable buckets var rangeFilters = filters.OfType(); @@ -332,10 +338,9 @@ internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query q if (!pool.Any()) return null; - if (query.HasCarrier) - return syncState.GetEntry(query.Carrier, index, pool, sb.RNG)?[index]; - - return pool.PickEntry(sb.RNG)?[index]; + return query.HasCarrier + ? syncState.GetEntry(query.Carrier, index, pool, sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index] + : pool.PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; } internal override void DeserializeData(BsonItem data) diff --git a/Rant/Vocabulary/Utilities/VocabUtils.cs b/Rant/Vocabulary/Utilities/VocabUtils.cs index d6dc6fc..c75f411 100644 --- a/Rant/Vocabulary/Utilities/VocabUtils.cs +++ b/Rant/Vocabulary/Utilities/VocabUtils.cs @@ -33,14 +33,42 @@ internal static class VocabUtils { private static readonly Dictionary StringCache = new Dictionary(); - public static RantDictionaryEntry PickEntry(this List hash, RNG rng) + public static RantDictionaryEntry PickEntry(this List list, RNG rng, bool useWeights) { - return hash.Any() ? hash[rng.Next(hash.Count)] : null; + if (useWeights) + { + float sum = list.Sum(e => e.Weight); + float n = (float)rng.NextDouble(sum); + RantDictionaryEntry entry; + for(int i = 0; i < list.Count; i++) + { + entry = list[i]; + if (n < entry.Weight) + { + return entry; + } + n -= entry.Weight; + } + } + return list.Any() ? list[rng.Next(list.Count)] : null; } - public static RantDictionaryEntry PickEntry(this IEnumerable enumerable, RNG rng) + public static RantDictionaryEntry PickEntry(this IEnumerable entries, RNG rng, bool useWeights) { - var array = enumerable as RantDictionaryEntry[] ?? enumerable.ToArray(); + if (useWeights) + { + float sum = entries.Sum(e => e.Weight); + float n = (float)rng.NextDouble(sum); + foreach(RantDictionaryEntry entry in entries) + { + if (n < entry.Weight) + { + return entry; + } + n -= entry.Weight; + } + } + var array = entries as RantDictionaryEntry[] ?? entries.ToArray(); return array.Length > 0 ? array[rng.Next(array.Length)] : null; } From 1251ba7dffac0831c7c23cb4256f76d6cc3a1501 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 11:42:33 -0500 Subject: [PATCH 135/213] Touch up XML docs, make ClassTree internal --- Rant/Core/Constructs/BlockManager.cs | 1 - Rant/Formats/EnglishNumberVerbalizer.cs | 8 +++++++ Rant/Formats/GermanNumberVerbalizer.cs | 11 +++++++--- Rant/Formats/NumberVerbalizer.cs | 16 +++++++------- Rant/Formats/RantFormat.cs | 19 ++++++++++------- Rant/Formats/WritingSystem.cs | 21 ++++++++++++++++++- Rant/Vocabulary/ClassTree.cs | 4 ++-- .../RantDictionaryTable.Importer.cs | 19 ++++++++++++----- Rant/Vocabulary/RantDictionaryTable.cs | 3 +-- Rant/Vocabulary/RantDictionaryTerm.cs | 6 ++++++ 10 files changed, 79 insertions(+), 29 deletions(-) diff --git a/Rant/Core/Constructs/BlockManager.cs b/Rant/Core/Constructs/BlockManager.cs index b84fad6..4ad357d 100644 --- a/Rant/Core/Constructs/BlockManager.cs +++ b/Rant/Core/Constructs/BlockManager.cs @@ -35,7 +35,6 @@ internal class BlockManager { private readonly Dictionary> _blockList; private BlockAttribs _prevAttribs; - private int _prevCount = 0; public BlockManager() { diff --git a/Rant/Formats/EnglishNumberVerbalizer.cs b/Rant/Formats/EnglishNumberVerbalizer.cs index 93c754b..fa5f22e 100644 --- a/Rant/Formats/EnglishNumberVerbalizer.cs +++ b/Rant/Formats/EnglishNumberVerbalizer.cs @@ -4,6 +4,9 @@ namespace Rant.Formats { + /// + /// Represents a number verbalizer for English (US). + /// public sealed class EnglishNumberVerbalizer : NumberVerbalizer { private readonly string[] thousandPowers = { "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion" }; @@ -40,6 +43,11 @@ static EnglishNumberVerbalizer() } } + /// + /// Verbalizes the specified value. + /// + /// The number to verbalize. + /// public override string Verbalize(long number) { var sb = new StringBuilder(); diff --git a/Rant/Formats/GermanNumberVerbalizer.cs b/Rant/Formats/GermanNumberVerbalizer.cs index 95ab378..c83ee1f 100644 --- a/Rant/Formats/GermanNumberVerbalizer.cs +++ b/Rant/Formats/GermanNumberVerbalizer.cs @@ -1,12 +1,12 @@ using System; -using System.Collections.Generic; using System.Globalization; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace Rant.Formats { + /// + /// Represents a number verbalizer for Standard German. + /// public sealed class GermanNumberVerbalizer : NumberVerbalizer { private readonly string[] thousandPowers = { "tausend", "eine Million ", "eine Milliarde ", "eine Billion ", "eine Billiarde ", "eine Trillion ", "eine Trilliarde ", "eine Quadrillion ", "eine Quadrilliarde " }; @@ -44,6 +44,11 @@ static GermanNumberVerbalizer() } } + /// + /// Verbalizes the specified value. + /// + /// The number to verbalize. + /// public override string Verbalize(long number) { var sb = new StringBuilder(); diff --git a/Rant/Formats/NumberVerbalizer.cs b/Rant/Formats/NumberVerbalizer.cs index 491817e..6e39041 100644 --- a/Rant/Formats/NumberVerbalizer.cs +++ b/Rant/Formats/NumberVerbalizer.cs @@ -1,13 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Rant.Formats +namespace Rant.Formats { + /// + /// The base class for all number verbalizers. + /// public abstract class NumberVerbalizer { + /// + /// Verbalizes the specified value. + /// + /// The number to verbalize. + /// public abstract string Verbalize(long number); } } diff --git a/Rant/Formats/RantFormat.cs b/Rant/Formats/RantFormat.cs index eb81b14..63337ff 100644 --- a/Rant/Formats/RantFormat.cs +++ b/Rant/Formats/RantFormat.cs @@ -69,15 +69,15 @@ public RantFormat() { } - /// - /// Creates a new RantFormat instance with the specified configuration data. - /// - /// The culture to associate with the format. + /// + /// Creates a new RantFormat instance with the specified configuration data. + /// + /// The culture to associate with the format. /// The writing system to use. - /// The quotation format to use. - /// A collection of words to exclude from title case capitalization. - /// The pluralizer to use. - public RantFormat( + /// A collection of words to exclude from title case capitalization. + /// The pluralizer to use. + /// The number verbalizer to use. + public RantFormat( CultureInfo culture, WritingSystem writingSystem, IEnumerable titleCaseExclusions, Pluralizer pluralizer, NumberVerbalizer numVerbalizer) { @@ -115,6 +115,9 @@ public RantFormat( /// public Pluralizer Pluralizer { get; } = new EnglishPluralizer(); + /// + /// The number verbalizer for the current format. + /// public NumberVerbalizer NumberVerbalizer { get; } = new EnglishNumberVerbalizer(); internal bool Excludes(string word) => TitleCaseExclusions.Contains(word); diff --git a/Rant/Formats/WritingSystem.cs b/Rant/Formats/WritingSystem.cs index 2eac8c4..04fab73 100644 --- a/Rant/Formats/WritingSystem.cs +++ b/Rant/Formats/WritingSystem.cs @@ -11,6 +11,12 @@ public sealed class WritingSystem private readonly char[] _alphabet; private readonly string _space; + /// + /// Creates a new writing system with the specified configuration. + /// + /// The alphabet to use. + /// The standard space to use. + /// The quotation marks to use. public WritingSystem(IEnumerable alphabet, string space, QuotationMarks quotations) { _alphabet = alphabet.ToArray(); @@ -18,6 +24,9 @@ public WritingSystem(IEnumerable alphabet, string space, QuotationMarks qu Quotations = quotations; } + /// + /// Creates a new writing system with the default configuration. + /// public WritingSystem() { _alphabet = new[] @@ -31,10 +40,20 @@ public WritingSystem() internal char[] AlphabetArray => _alphabet; + /// + /// The alphabet used by the format. + /// + /// public IEnumerable GetAlphabet() => _alphabet.AsEnumerable(); + /// + /// The quotation marks used by the format. + /// public QuotationMarks Quotations { get; } - + + /// + /// The standard space used by series and phrasals. + /// public string Space => _space; } } diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs index c281d85..b189a6a 100644 --- a/Rant/Vocabulary/ClassTree.cs +++ b/Rant/Vocabulary/ClassTree.cs @@ -28,7 +28,7 @@ namespace Rant.Vocabulary { - public class ClassTree + internal class ClassTree { private const int MAX_DEPTH = 4; @@ -135,7 +135,7 @@ private IEnumerable OrderClasses(string[] ignoreClasses, IEnumerable ChildNodes = new Dictionary(); public string[] Classes; diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index ca057f3..c3d9bec 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -33,10 +33,18 @@ using Rant.Core.Utilities; +#pragma warning disable CS0162 // Unreachable code detected + namespace Rant.Vocabulary { public partial class RantDictionaryTable { + /// + /// Loads a table from the specified stream. + /// + /// The origin of the stream. This will typically be a file path or package name. + /// The stream to load the table from. + /// public static RantDictionaryTable FromStream(string origin, Stream stream) { string name = null; // Stores the table name before final table construction @@ -572,7 +580,8 @@ public static void ReadTerms(string origin, string str, int len, int line, ref i #if !UNITY [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - public static bool ReadArg(string origin, string str, int len, int line, ref int i, out Argument result) + + public static bool ReadArg(string origin, string str, int len, int line, ref int i, out Argument result) { result = null; while (i < len && char.IsWhiteSpace(str[i])) i++; @@ -716,8 +725,8 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int buffer.Append(c); continue; } - continue; - } + continue; + } case '\"': throw new RantTableLoadException(origin, line, i + 1, "err-table-incomplete-literal"); default: @@ -739,9 +748,9 @@ public static bool ReadArg(string origin, string str, int len, int line, ref int result = new Argument(start, buffer.ToString()); return true; } - } + } - internal sealed class Argument + internal sealed class Argument { public Argument(int charIndex, string value) { diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index bc6a010..8ddf00c 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -185,8 +185,7 @@ public bool RemoveEntry(RantDictionaryEntry entry) /// True if found, False if not. public bool ContainsEntry(RantDictionaryEntry entry) { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - return _entriesHash.Contains(entry); + return _entriesHash.Contains(entry ?? throw new ArgumentNullException(nameof(entry))); } /// diff --git a/Rant/Vocabulary/RantDictionaryTerm.cs b/Rant/Vocabulary/RantDictionaryTerm.cs index e6cb964..61fb520 100644 --- a/Rant/Vocabulary/RantDictionaryTerm.cs +++ b/Rant/Vocabulary/RantDictionaryTerm.cs @@ -110,8 +110,14 @@ public string Value /// public bool IsSplit => ValueSplitIndex > -1; + /// + /// Gets the term value substring on the left side of the split. + /// public string LeftSide => Value.Substring(0, ValueSplitIndex); + /// + /// Gets the term value substring on the right side of the split. + /// public string RightSide => Value.Substring(ValueSplitIndex); /// From d71e33f7d07cae5fdf85a8958c4afaf3387a4b07 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 11:54:14 -0500 Subject: [PATCH 136/213] Fix whitespace --- Rant/RantEngine.cs | 1028 ++++++++++++++++++++++---------------------- 1 file changed, 514 insertions(+), 514 deletions(-) diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index ec75d02..dd9497d 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -41,533 +41,533 @@ namespace Rant { - /// - /// The central class of the Rant engine that allows the execution of patterns. - /// - public sealed class RantEngine - { - private readonly HashSet _loadedPackages = new HashSet(); - private readonly Dictionary _patternCache = new Dictionary(); - - /// - /// The currently set flags. - /// - public readonly HashSet Flags = new HashSet(); - - internal readonly ObjectTable Objects = new ObjectTable(); - private CarrierState _carrierState = null; - private RantDictionary _dictionary = new RantDictionary(); - private RantFormat _format = RantFormat.English; - private bool _preserveCarrierState = false; - private RantDependencyResolver _resolver = new RantDependencyResolver(); - internal Dictionary PackageModules = new Dictionary(); - - /// - /// Creates a new RantEngine object without a dictionary. - /// - public RantEngine() - { - } - - /// - /// Creates a new RantEngine object with the specified vocabulary. - /// - /// The vocabulary to load in this instance. - public RantEngine(RantDictionary dictionary) - { + /// + /// The central class of the Rant engine that allows the execution of patterns. + /// + public sealed class RantEngine + { + private readonly HashSet _loadedPackages = new HashSet(); + private readonly Dictionary _patternCache = new Dictionary(); + + /// + /// The currently set flags. + /// + public readonly HashSet Flags = new HashSet(); + + internal readonly ObjectTable Objects = new ObjectTable(); + private CarrierState _carrierState = null; + private RantDictionary _dictionary = new RantDictionary(); + private RantFormat _format = RantFormat.English; + private bool _preserveCarrierState = false; + private RantDependencyResolver _resolver = new RantDependencyResolver(); + internal Dictionary PackageModules = new Dictionary(); + + /// + /// Creates a new RantEngine object without a dictionary. + /// + public RantEngine() + { + } + + /// + /// Creates a new RantEngine object with the specified vocabulary. + /// + /// The vocabulary to load in this instance. + public RantEngine(RantDictionary dictionary) + { _dictionary = dictionary ?? throw new ArgumentNullException(nameof(dictionary)); - } - - /// - /// User-defined Rant modules. - /// - public Dictionary Modules { get; } = new Dictionary(); - - /// - /// The current formatting settings for the engine. - /// - public RantFormat Format - { - get { return _format; } - set - { + } + + /// + /// User-defined Rant modules. + /// + public Dictionary Modules { get; } = new Dictionary(); + + /// + /// The current formatting settings for the engine. + /// + public RantFormat Format + { + get { return _format; } + set + { _format = value ?? throw new ArgumentNullException(nameof(value)); - } - } - - /// - /// The vocabulary associated with this instance. - /// - public RantDictionary Dictionary - { - get { return _dictionary; } - set - { + } + } + + /// + /// The vocabulary associated with this instance. + /// + public RantDictionary Dictionary + { + get { return _dictionary; } + set + { _dictionary = value ?? throw new ArgumentNullException(nameof(value)); - } - } - - /// - /// Gets or sets the depdendency resolver used for packages. - /// - public RantDependencyResolver DependencyResolver - { - get { return _resolver; } - set - { + } + } + + /// + /// Gets or sets the depdendency resolver used for packages. + /// + public RantDependencyResolver DependencyResolver + { + get { return _resolver; } + set + { _resolver = value ?? throw new ArgumentNullException(nameof(value)); - } - } - - /// - /// Specifies whether to preserve carrier states between patterns. - /// - public bool PreserveCarrierState - { - get { return _preserveCarrierState; } - set - { - if (!value) _carrierState = null; - _preserveCarrierState = value; - } - } - - /// - /// Accesses global variables. - /// - /// The name of the variable to access. - /// - public RantObject this[string name] - { - get { return Objects[name]; } - set { Objects[name] = value; } - } - - /// - /// Deletes all state data in the engine's persisted carrier state, if available. - /// - public void ResetCarrierState() - { - _carrierState?.Reset(); - } - - /// - /// Returns a boolean value indicating whether a program by the specified name has been loaded from a package. - /// - /// The name of the program to check. - /// - public bool ProgramNameLoaded(string patternName) - { - return _patternCache != null && _patternCache.ContainsKey(patternName); - } - - /// - /// Used by package loader - /// - /// Program to load - /// - internal bool CacheProgramInternal(RantProgram program) - { - if (Util.IsNullOrWhiteSpace(program.Name) || _patternCache.ContainsKey(program.Name)) return false; - _patternCache[program.Name] = program; - return true; - } - - /// - /// Loads the specified package into the engine. - /// - /// The package to load. - public void LoadPackage(RantPackage package) - { - if (package == null) throw new ArgumentNullException(nameof(package)); - if (_loadedPackages.Contains(RantPackageDependency.Create(package))) return; - - foreach (var dependency in package.GetDependencies()) - { - RantPackage pkg; - if (!_resolver.TryResolvePackage(dependency, out pkg)) - throw new FileNotFoundException(GetString("err-unresolvable-package", package, dependency)); - LoadPackage(pkg); - } - - foreach (var res in package.GetResources()) res.Load(this); - - _loadedPackages.Add(RantPackageDependency.Create(package)); - } - - /// - /// Loads the package at the specified file path into the engine. - /// - /// The path to the package to load. - public void LoadPackage(string path) - { - if (Util.IsNullOrWhiteSpace(path)) - throw new ArgumentException(GetString("err-empty-path")); - - if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) - path += RantPackage.EXTENSION; - - LoadPackage(RantPackage.Load(path)); - } - - /// - /// Returns a pattern with the specified name from the engine's cache. If the pattern doesn't exist, it is loaded from - /// file. - /// - /// The name or path of the pattern to retrieve. - /// - internal RantProgram GetProgramInternal(string name) - { + } + } + + /// + /// Specifies whether to preserve carrier states between patterns. + /// + public bool PreserveCarrierState + { + get { return _preserveCarrierState; } + set + { + if (!value) _carrierState = null; + _preserveCarrierState = value; + } + } + + /// + /// Accesses global variables. + /// + /// The name of the variable to access. + /// + public RantObject this[string name] + { + get { return Objects[name]; } + set { Objects[name] = value; } + } + + /// + /// Deletes all state data in the engine's persisted carrier state, if available. + /// + public void ResetCarrierState() + { + _carrierState?.Reset(); + } + + /// + /// Returns a boolean value indicating whether a program by the specified name has been loaded from a package. + /// + /// The name of the program to check. + /// + public bool ProgramNameLoaded(string patternName) + { + return _patternCache != null && _patternCache.ContainsKey(patternName); + } + + /// + /// Used by package loader + /// + /// Program to load + /// + internal bool CacheProgramInternal(RantProgram program) + { + if (Util.IsNullOrWhiteSpace(program.Name) || _patternCache.ContainsKey(program.Name)) return false; + _patternCache[program.Name] = program; + return true; + } + + /// + /// Loads the specified package into the engine. + /// + /// The package to load. + public void LoadPackage(RantPackage package) + { + if (package == null) throw new ArgumentNullException(nameof(package)); + if (_loadedPackages.Contains(RantPackageDependency.Create(package))) return; + + foreach (var dependency in package.GetDependencies()) + { + RantPackage pkg; + if (!_resolver.TryResolvePackage(dependency, out pkg)) + throw new FileNotFoundException(GetString("err-unresolvable-package", package, dependency)); + LoadPackage(pkg); + } + + foreach (var res in package.GetResources()) res.Load(this); + + _loadedPackages.Add(RantPackageDependency.Create(package)); + } + + /// + /// Loads the package at the specified file path into the engine. + /// + /// The path to the package to load. + public void LoadPackage(string path) + { + if (Util.IsNullOrWhiteSpace(path)) + throw new ArgumentException(GetString("err-empty-path")); + + if (Util.IsNullOrWhiteSpace(Path.GetExtension(path))) + path += RantPackage.EXTENSION; + + LoadPackage(RantPackage.Load(path)); + } + + /// + /// Returns a pattern with the specified name from the engine's cache. If the pattern doesn't exist, it is loaded from + /// file. + /// + /// The name or path of the pattern to retrieve. + /// + internal RantProgram GetProgramInternal(string name) + { if (_patternCache.TryGetValue(name, out RantProgram pattern)) return pattern; return _patternCache[name] = RantProgram.CompileFile(name); - } + } - #region Static members + #region Static members - private static int _maxStackSize = 64; - private static readonly RNG Seeds = new RNG(); + private static int _maxStackSize = 64; + private static readonly RNG Seeds = new RNG(); - static RantEngine() - { - ForceLoad(); - RantFunctionRegistry.Load(); - } + static RantEngine() + { + ForceLoad(); + RantFunctionRegistry.Load(); + } - /// - /// Gets or sets the maximum stack size allowed for a pattern. - /// - public static int MaxStackSize - { - get { return _maxStackSize; } - set - { - if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), GetString("err-zero-or-negative")); - _maxStackSize = value; - } - } + /// + /// Gets or sets the maximum stack size allowed for a pattern. + /// + public static int MaxStackSize + { + get { return _maxStackSize; } + set + { + if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), GetString("err-zero-or-negative")); + _maxStackSize = value; + } + } - #endregion + #endregion - #region Do, DoFile + #region Do, DoFile #if !UNITY - [MethodImpl(MethodImplOptions.AggressiveInlining)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif - private RantOutput RunVM(Sandbox vm, double timeout) - { - vm.UserModules = Modules; - vm.PackageModules = PackageModules; - if (_preserveCarrierState && _carrierState == null) - _carrierState = vm.CarrierState; - return vm.Run(timeout); - } - - private CarrierState GetPreservedCarrierState() => _preserveCarrierState ? _carrierState : null; - - /// - /// Compiles the specified string into a pattern, executes it, and returns the resulting output. - /// - /// The input string to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM( - new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), - args), timeout); - - /// - /// Loads the file located at the specified path and executes it, returning the resulting output. - /// - /// The path to the file to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM( - new Sandbox(this, RantProgram.CompileFile(path), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), - timeout); - - /// - /// Compiles the specified string into a pattern, executes it using a custom seed, and returns the resulting output. - /// - /// The input string to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args), - timeout); - - /// - /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. - /// - /// The path to the file to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - => - RunVM(new Sandbox(this, RantProgram.CompileFile(path), new RNG(seed), charLimit, GetPreservedCarrierState(), args), - timeout); - - /// - /// Compiles the specified string into a pattern, executes it using a custom RNG, and returns the resulting output. - /// - /// The input string to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. - /// - /// The path to the file to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, RantProgram.CompileFile(path), rng, charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern and returns the resulting output. - /// - /// The pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(RantProgram input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => - RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern using a custom seed and returns the resulting output. - /// - /// The pattern to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(RantProgram input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - => - RunVM(new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern using a custom random number generator and returns the resulting output. - /// - /// The pattern to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput Do(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - => - RunVM(new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args), timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(RantProgram input, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The patten to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(RantProgram input, long seed, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattero to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(string input, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), - args).RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args) - .RunSerial(timeout); - - /// - /// Executes the specified pattern and returns a series of outputs. - /// - /// The pattern to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) => - new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); - - /// - /// Executes a pattern that has been loaded from a package and returns the resulting output. - /// - /// The name of the pattern to execute. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) - { - if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); - - return - RunVM( - new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), - timeout); - } - - /// - /// Executes a pattern that has been loaded from a package and returns the resulting output. - /// - /// The name of the pattern to execute. - /// The seed to generate output with. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) - { - if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); - - return - RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, GetPreservedCarrierState(), args), - timeout); - } - - /// - /// Executes a pattern that has been loaded from a package using a custom random number generator and returns the resulting - /// output. - /// - /// The name of the pattern to execute. - /// The random number generator to use when generating output. - /// - /// The maximum number of characters that can be printed. An exception will be thrown if the limit - /// is exceeded. Set to zero or below for unlimited characters. - /// - /// The maximum number of seconds that the pattern will execute for. - /// The arguments to pass to the pattern. - /// - public RantOutput DoPackaged(string patternName, RNG rng, int charLimit = 0, double timeout = -1, - RantProgramArgs args = null) - { - if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); - - return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, GetPreservedCarrierState(), args), timeout); - } - - #endregion - } + private RantOutput RunVM(Sandbox vm, double timeout) + { + vm.UserModules = Modules; + vm.PackageModules = PackageModules; + if (_preserveCarrierState && _carrierState == null) + _carrierState = vm.CarrierState; + return vm.Run(timeout); + } + + private CarrierState GetPreservedCarrierState() => _preserveCarrierState ? _carrierState : null; + + /// + /// Compiles the specified string into a pattern, executes it, and returns the resulting output. + /// + /// The input string to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM( + new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), + args), timeout); + + /// + /// Loads the file located at the specified path and executes it, returning the resulting output. + /// + /// The path to the file to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM( + new Sandbox(this, RantProgram.CompileFile(path), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), + timeout); + + /// + /// Compiles the specified string into a pattern, executes it using a custom seed, and returns the resulting output. + /// + /// The input string to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args), + timeout); + + /// + /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. + /// + /// The path to the file to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + => + RunVM(new Sandbox(this, RantProgram.CompileFile(path), new RNG(seed), charLimit, GetPreservedCarrierState(), args), + timeout); + + /// + /// Compiles the specified string into a pattern, executes it using a custom RNG, and returns the resulting output. + /// + /// The input string to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Loads the file located at the specified path and executes it using a custom seed, returning the resulting output. + /// + /// The path to the file to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoFile(string path, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, RantProgram.CompileFile(path), rng, charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern and returns the resulting output. + /// + /// The pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(RantProgram input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => + RunVM(new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern using a custom seed and returns the resulting output. + /// + /// The pattern to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(RantProgram input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + => + RunVM(new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern using a custom random number generator and returns the resulting output. + /// + /// The pattern to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput Do(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + => + RunVM(new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args), timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(RantProgram input, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, input, new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The patten to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(RantProgram input, long seed, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, input, new RNG(seed), charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattero to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(RantProgram input, RNG rng, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, input, rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(string input, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), + args).RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args) + .RunSerial(timeout); + + /// + /// Executes the specified pattern and returns a series of outputs. + /// + /// The pattern to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) => + new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); + + /// + /// Executes a pattern that has been loaded from a package and returns the resulting output. + /// + /// The name of the pattern to execute. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + { + if (!ProgramNameLoaded(patternName)) + throw new ArgumentException("Pattern doesn't exist."); + + return + RunVM( + new Sandbox(this, _patternCache[patternName], new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), + timeout); + } + + /// + /// Executes a pattern that has been loaded from a package and returns the resulting output. + /// + /// The name of the pattern to execute. + /// The seed to generate output with. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) + { + if (!ProgramNameLoaded(patternName)) + throw new ArgumentException("Pattern doesn't exist."); + + return + RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, GetPreservedCarrierState(), args), + timeout); + } + + /// + /// Executes a pattern that has been loaded from a package using a custom random number generator and returns the resulting + /// output. + /// + /// The name of the pattern to execute. + /// The random number generator to use when generating output. + /// + /// The maximum number of characters that can be printed. An exception will be thrown if the limit + /// is exceeded. Set to zero or below for unlimited characters. + /// + /// The maximum number of seconds that the pattern will execute for. + /// The arguments to pass to the pattern. + /// + public RantOutput DoPackaged(string patternName, RNG rng, int charLimit = 0, double timeout = -1, + RantProgramArgs args = null) + { + if (!ProgramNameLoaded(patternName)) + throw new ArgumentException("Pattern doesn't exist."); + + return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, GetPreservedCarrierState(), args), timeout); + } + + #endregion + } } \ No newline at end of file From f38d5e97abf8016a4427e639b91ba0386d091813 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 12:32:01 -0500 Subject: [PATCH 137/213] Implement verbose character literals --- Rant/Core/Compiler/RantLexer.cs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Rant/Core/Compiler/RantLexer.cs b/Rant/Core/Compiler/RantLexer.cs index 8cb5e48..bdc3758 100644 --- a/Rant/Core/Compiler/RantLexer.cs +++ b/Rant/Core/Compiler/RantLexer.cs @@ -27,6 +27,7 @@ using System.Text; using Rant.Core.Utilities; +using Rant.Core.Formatting; namespace Rant.Core.Compiler { @@ -180,6 +181,30 @@ public static IEnumerable Lex(RantCompiler compiler, string input) int escStart = i++; // Skip the slash + // Verbose character + if (input[i] == '@') + { + int nameStart = ++i; + while(i < len) + { + if (input[i] == '@') + { + var name = input.Substring(nameStart, i - nameStart).Trim(); + var unicode = Unicode.GetByName(name); + if (string.IsNullOrEmpty(unicode)) + { + compiler.SyntaxError(line, lastLineStart, nameStart, i - nameStart, false, "err-compiler-invalid-vchar", name); + goto iterate; + } + yield return new Token(R.Text, line, lastLineStart, nameStart, unicode); + goto iterate; + } + i++; + } + compiler.SyntaxError(line, lastLineStart, i - 1, 1, false, "err-compiler-incomplete-vchar"); + break; + } + // No escaping whitespace. if (char.IsWhiteSpace(input[i])) { From c6dc7dd623ff0b5ebc0f1298e4fc6038726f0968 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 12:40:04 -0500 Subject: [PATCH 138/213] Add strings for verbose character errors --- Rant/Localization/de-DE.lang | 2 ++ Rant/Localization/en-US.lang | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 1d6ee30..bf4c221 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -62,6 +62,8 @@ err-compiler-empty-weight = "Leeres Blockelementgewicht." err-compiler-invalid-constweight = "Ungültige Gewichtskonstante. Sie muss eine positive Zahl sein." err-compiler-incomplete-verbatim = "Unvollständiges wörtliches Zeichenkettenliteral." err-compiler-missing-quantity-comma = "Komma nach der Anzahl erwartet." +err-compiler-invalid-vchar = "Ungültigen Unicode-Zeichennamen in wörtlichem Zeichenliteral gefunden: {0}" +err-compiler-incomplete-vchar = "Unvollständiges wörtliches Zeichenliteral." err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 79aa4d2..58aef95 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -64,6 +64,8 @@ err-compiler-incomplete-verbatim = "Incomplete verbatim string." err-compiler-incomplete-regex = "Incomplete regular expression literal." err-compiler-bad-escape-quantity = "Invalid escape quantifier. Must be an integer greater than zero." err-compiler-missing-quantity-comma = "Expected comma after quantity." +err-compiler-invalid-vchar = "Invalid Unicode character name in verbose character literal: {0}" +err-compiler-incomplete-vchar = "Incomplete verbose character literal." err-table-invalid-class = "Invalid class name: {0}" err-table-too-few-terms = "Too few terms in entry: Expected {0}, found {1}." From c307d80abd6e7fe33a8f4b87af09df16c34b5ae9 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 13:27:52 -0500 Subject: [PATCH 139/213] Add some basic variable functions --- Rant/Core/Framework/RantFunctionRegistry.cs | 1790 ++++++++++--------- Rant/Core/ObjectModel/ObjectStack.cs | 131 +- Rant/Core/Sandbox.State.cs | 5 - Rant/Core/Sandbox.cs | 7 +- 4 files changed, 987 insertions(+), 946 deletions(-) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index d947025..e26afd6 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -38,86 +38,87 @@ using Rant.Metadata; using Rant.Vocabulary.Utilities; using Rant.Vocabulary.Querying; +using Rant.Core.ObjectModel; // ReSharper disable UnusedMember.Local namespace Rant.Core.Framework { - // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. - // They may return either void or IEnumerator depending on your needs. - internal static partial class RantFunctionRegistry - { - [RantFunction("num", "n")] - [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] - private static void Number(Sandbox sb, - [RantDescription("The minimum value of the number to generate.")] int min, - [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); - - [RantFunction("num")] - [RantDescription("Formats an input string using the current number format settings and prints the result.")] - private static void Number(Sandbox sb, - [RantDescription("The string to convert into a number.")] string input) - { - double number; - sb.Print(double.TryParse(input, out number) ? number : 0); - } - - [RantFunction("numfmt")] - [RantDescription("Sets the current number formatting mode.")] - private static void NumberFormat(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); - - [RantFunction("numfmt")] - [RantDescription("Runs the specified pattern under a specific number formatting mode.")] - private static IEnumerator NumberFormatRange(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format, - [RantDescription("The pattern to run.")] RST rangeAction) - { - var oldFmtMap = new Dictionary(); - - sb.Output.Do(chain => - { - oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; - chain.Last.NumberFormatter.NumberFormat = format; - }); - - yield return rangeAction; - - NumberFormat fmt; - sb.Output.Do(chain => - { - if (!oldFmtMap.TryGetValue(chain, out fmt)) return; - chain.Last.NumberFormatter.NumberFormat = fmt; - }); - } - - [RantFunction] - [RantDescription("Specifies the current digit formatting mode for numbers.")] - private static void Digits(Sandbox sb, - [RantDescription("The digit format to use.")] BinaryFormat format, - [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => - { - chain.Last.NumberFormatter.BinaryFormat = format; - chain.Last.NumberFormatter.BinaryFormatDigits = digits; - }); - - [RantFunction] - [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] - private static void Endian(Sandbox sb, - [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); - - [RantFunction("init")] - [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] - private static void Initial(Sandbox sb, int index) => sb.CurrentBlockAttribs.StartIndex = index; - - [RantFunction("rep", "r")] - [RantDescription("Sets the repetition count for the next block.")] - private static void Rep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times) => sb.CurrentBlockAttribs.Repetitions = times; - - [RantFunction] - [RantDescription("Sets the repetition count to the number of items in the next block.")] - private static void RepEach(Sandbox sb) => sb.CurrentBlockAttribs.RepEach = true; + // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. + // They may return either void or IEnumerator depending on your needs. + internal static partial class RantFunctionRegistry + { + [RantFunction("num", "n")] + [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] + private static void Number(Sandbox sb, + [RantDescription("The minimum value of the number to generate.")] int min, + [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); + + [RantFunction("num")] + [RantDescription("Formats an input string using the current number format settings and prints the result.")] + private static void Number(Sandbox sb, + [RantDescription("The string to convert into a number.")] string input) + { + double number; + sb.Print(double.TryParse(input, out number) ? number : 0); + } + + [RantFunction("numfmt")] + [RantDescription("Sets the current number formatting mode.")] + private static void NumberFormat(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); + + [RantFunction("numfmt")] + [RantDescription("Runs the specified pattern under a specific number formatting mode.")] + private static IEnumerator NumberFormatRange(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format, + [RantDescription("The pattern to run.")] RST rangeAction) + { + var oldFmtMap = new Dictionary(); + + sb.Output.Do(chain => + { + oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; + chain.Last.NumberFormatter.NumberFormat = format; + }); + + yield return rangeAction; + + NumberFormat fmt; + sb.Output.Do(chain => + { + if (!oldFmtMap.TryGetValue(chain, out fmt)) return; + chain.Last.NumberFormatter.NumberFormat = fmt; + }); + } + + [RantFunction] + [RantDescription("Specifies the current digit formatting mode for numbers.")] + private static void Digits(Sandbox sb, + [RantDescription("The digit format to use.")] BinaryFormat format, + [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => + { + chain.Last.NumberFormatter.BinaryFormat = format; + chain.Last.NumberFormatter.BinaryFormatDigits = digits; + }); + + [RantFunction] + [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] + private static void Endian(Sandbox sb, + [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); + + [RantFunction("init")] + [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] + private static void Initial(Sandbox sb, int index) => sb.CurrentBlockAttribs.StartIndex = index; + + [RantFunction("rep", "r")] + [RantDescription("Sets the repetition count for the next block.")] + private static void Rep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times) => sb.CurrentBlockAttribs.Repetitions = times; + + [RantFunction] + [RantDescription("Sets the repetition count to the number of items in the next block.")] + private static void RepEach(Sandbox sb) => sb.CurrentBlockAttribs.RepEach = true; [RantFunction("sep")] private static IEnumerator PrintSep(Sandbox sb) @@ -125,806 +126,806 @@ private static IEnumerator PrintSep(Sandbox sb) yield return sb.BlockManager.GetPrevious().Separator; } - [RantFunction("sep", "s")] - [RantDescription("Sets the separator pattern for the next block.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.CurrentBlockAttribs.IsSeries = false; - sb.CurrentBlockAttribs.Separator = separator; - } - - [RantFunction("sep", "s")] - [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) - { - sb.CurrentBlockAttribs.IsSeries = true; - sb.CurrentBlockAttribs.Separator = separator; - sb.CurrentBlockAttribs.EndConjunction = conjunction; - } - - [RantFunction("sep", "s")] - [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, - [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) - { - sb.CurrentBlockAttribs.IsSeries = true; - sb.CurrentBlockAttribs.Separator = separator; - sb.CurrentBlockAttribs.EndSeparator = oxford; - sb.CurrentBlockAttribs.EndConjunction = conjunction; - } - - [RantFunction("rs")] - [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] - private static void RepSep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.CurrentBlockAttribs.IsSeries = false; - sb.CurrentBlockAttribs.Repetitions = times; - sb.CurrentBlockAttribs.Separator = separator; - } - - [RantFunction] - [RantDescription("Sets the prefix pattern for the next block.")] - private static void Before(Sandbox sb, - [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.CurrentBlockAttribs.Before = beforeAction; - - [RantFunction] - [RantDescription("Sets the postfix pattern for the next block.")] - private static void After(Sandbox sb, - [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.CurrentBlockAttribs.After = afterAction; - - [RantFunction] - [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] - private static void Chance(Sandbox sb, - [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.CurrentBlockAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; - - [RantFunction("case", "caps")] - [RantDescription("Changes the capitalization mode for all open channels.")] - private static void Case(Sandbox sb, - [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); - - [RantFunction] - [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] - private static void CapsInfer(Sandbox sb, - [RantDescription("A string that is capitalized in the format to be set.")] string sample) - { - var output = sb.Output; - if (string.IsNullOrEmpty(sample)) - { - output.Capitalize(Capitalization.None); - return; - } - var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (words.Length == 1) - { - string word = words[0]; - if (word.Length == 1) - output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); - else if (Util.IsUppercase(word)) - output.Capitalize(Capitalization.Upper); - else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - else - { - // No letters? Forget it. - if (!sample.Any(char.IsLetter)) - { - output.Capitalize(Capitalization.None); - return; - } - - // Is all-caps? - if (Util.IsUppercase(sample)) - { - output.Capitalize(Capitalization.Upper); - return; - } - - var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) - .Select(str => str.Trim()) - .Where(str => - !string.IsNullOrEmpty(str) - && !char.IsDigit(str[0])).ToArray(); - - // All words capitalized? - var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); - if (lwords.Any() && - (sentences.Length == 1 || - sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) - { - if (lwords.All(lw => char.IsUpper(lw[0]))) - { - output.Capitalize(Capitalization.Word); - return; - } - - if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) - { - output.Capitalize(Capitalization.Title); - return; - } - } - - // All sentences capitalized? - bool all = true; - bool none = true; - foreach (string sentence in sentences) - { - bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); - all = all && isCapitalized; - none = none && !isCapitalized; - } - - if (sentences.Length > 1 && all) - output.Capitalize(Capitalization.Sentence); - else if (none) - output.Capitalize(Capitalization.Lower); - else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the first.")] - private static IEnumerator First(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration == 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the first.")] - private static IEnumerator NotFirst(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration > 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the last.")] - private static IEnumerator Last(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == block.Count) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the last.")] - private static IEnumerator NotLast(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration < block.Count) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] - private static IEnumerator Middle(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration > 1 && block.Iteration < block.Count) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] - private static IEnumerator Ends(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == 1 || block.Iteration == block.Count) yield return action; - } - - [RantFunction("repnum", "rn")] - [RantDescription("Prints the iteration number of the current block.")] - private static void RepNum(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration); - } - - [RantFunction("repelapsed", "re")] - [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] - private static void RepElapsed(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration - 1); - } - - [RantFunction("repcount", "rc")] - [RantDescription("Prints the repetition count of the current block.")] - private static void RepCount(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Count); - } - - [RantFunction("reprem", "rr")] - [RantDescription("Prints the number of remaining repetitions queued after the current one.")] - private static void RepRem(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Count - block.Iteration); - } - - [RantFunction("repqueued", "rq")] - [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] - private static void RepQueued(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Count - (block.Iteration - 1)); - } - - [RantFunction] - [RantDescription("Prints the number of currently active blocks.")] - private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); - - [RantFunction("index", "i")] - [RantDescription("Prints the zero-based index of the block item currently being executed.")] - private static void Index(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index); - } - - [RantFunction("index1", "i1")] - [RantDescription("Prints the one-based index of the block item currently being executed.")] - private static void IndexOne(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index + 1); - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an odd number.")] - private static IEnumerator Odd(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an even number.")] - private static IEnumerator Even(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; - } - - [RantFunction] - [RantDescription("Returns the specified argument from the current subroutine.")] - private static IEnumerator Arg(Sandbox sb, - [RantDescription("The name of the argument to retrieve.")] string name) - { - if (!sb.SubroutineArgs.Any()) yield break; - var args = sb.SubroutineArgs.Peek(); - if (args.ContainsKey(name)) - yield return args[name]; - } - - [RantFunction] - [RantDescription("Retrieves and prints the current match string of the active replacer.")] - private static void Match(Sandbox sb) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Value); - } - - [RantFunction] - [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] - private static void Group(Sandbox sb, - [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); - } - - [RantFunction] - [RantDescription("Sets the current rhyming mode for queries.")] - private static void Rhyme(Sandbox sb, - [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; - - [RantFunction("sync", "x")] - [RantDescription("Creates and applies a synchronizer with the specified name and type.")] - private static void Sync(Sandbox sb, - [RantDescription("The name of the synchronizer.")] string name, - [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); - - [RantFunction("xpin")] - [RantDescription("Pins a synchronizer.")] - private static void SyncPin(Sandbox sb, - [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); - - [RantFunction("xunpin")] - [RantDescription("Unpins a synchronizer.")] - private static void SyncUnpin(Sandbox sb, - [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); - - [RantFunction("xstep")] - [RantDescription("Iterates a synchronizer.")] - private static void SyncStep(Sandbox sb, - [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); - - [RantFunction("xreset")] - [RantDescription("Resets a synchronizer to its initial state.")] - private static void SyncReset(Sandbox sb, - [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); - - [RantFunction("quote", "q")] - [RantDescription( - "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] - private static IEnumerator Quote(Sandbox sb, - [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) - { - sb.IncreaseQuote(); - sb.PrintOpeningQuote(); - yield return quoteAction; - sb.PrintClosingQuote(); - sb.DecreaseQuote(); - } - - [RantFunction] - [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] - private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) - { - sb.Output.OpenChannel(channelName, visibility); - yield return pattern; - sb.Output.CloseChannel(); - } - - [RantFunction("target", "t")] - [RantDescription("Places a target with the specified name at the current write position.")] - private static void Target(Sandbox sb, - [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); - - [RantFunction] - [RantDescription("Appends a string to the specified target's contents.")] - private static void Send(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); - - [RantFunction] - [RantDescription("Overwrites the specified target's contents with the provided value.")] - private static void SendOver(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) - { - sb.Output.Do(chain => chain.ClearTarget(targetName)); - sb.Output.PrintToTarget(targetName, value); - } - - [RantFunction("targetval")] - [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] - private static void GetTargetValue(Sandbox sb, - [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); - - [RantFunction("clrt")] - [RantDescription("Clears the contents of the specified target.")] - private static void ClearTarget(Sandbox sb, - [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] - private static IEnumerator Nth(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] - private static IEnumerator NthO(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] - private static IEnumerator NotNth(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." - )] - private static IEnumerator NotNthO(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Sets a pattern that will run before the next block.")] - private static void Start(Sandbox sb, - [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.CurrentBlockAttribs.Start = beforePattern; - - [RantFunction] - [RantDescription("Sets a pattern that will run after the next block.")] - private static void End(Sandbox sb, - [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.CurrentBlockAttribs.End = endPattern; - - // TODO: Finish [persist]. - //[RantFunction] - [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] - private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.CurrentBlockAttribs.Persistence = persistence; - - [RantFunction] - [RantDescription("Loads and runs a pattern from cache or file.")] - private static IEnumerator Import(Sandbox sb, - [RantDescription("The name or path of the pattern to load.")] string name) - { - RST action; - - try - { - action = sb.Engine.GetProgramInternal(name).SyntaxTree; - } - catch (RantCompilerException e) - { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, - $"Failed to compile imported pattern '{name}':\n{e.Message}"); - } - catch (Exception e) - { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, - $"Failed to import '{name}':\n{e.Message}"); - } - - yield return action; - } - - [RantFunction] - [RantDescription("Defines the specified flags.")] - private static void Define(Sandbox sb, - [RantDescription("The list of flags to define.")] params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.Engine.Flags.Add(flag); - } - - [RantFunction] - [RantDescription("Undefines the specified flags.")] - private static void Undef(Sandbox sb, - [RantDescription("The list of flags to undefine.")] params string[] flags) - { - foreach (string flag in flags) sb.Engine.Flags.Remove(flag); - } - - [RantFunction] - [RantDescription("Toggles the specified flags.")] - private static void Toggle(Sandbox sb, params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - { - if (sb.Engine.Flags.Contains(flag)) - sb.Engine.Flags.Remove(flag); - else - sb.Engine.Flags.Add(flag); - } - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] - private static void IfDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = true; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] - private static void IfNDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = false; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition passes.")] - private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) - { - if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) - yield return conditionPassPattern; - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition fails.")] - private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) - { - if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) - yield return conditionFailPattern; - } - - [RantFunction] - [RantDescription("Yields the currenty written output.")] - private static void Yield(Sandbox sb) => sb.SetYield(); - - [RantFunction] - [RantDescription("Branches the internal RNG according to a seed.")] - private static void Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); - - [RantFunction] - [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] - private static IEnumerator Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed, - [RantDescription("The pattern to run on the branch.")] RST branchAction) - { - sb.RNG.Branch(seed.Hash()); - yield return branchAction; - sb.RNG.Merge(); - } - - [RantFunction] - [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] - private static void Merge(Sandbox sb) => sb.RNG.Merge(); - - [RantFunction("in")] - [RantDescription("Prints the value of the specified pattern argument.")] - private static void PatternArg(Sandbox sb, - [RantDescription("The name of the argument to access.")] string argName) - { - if (sb.PatternArgs == null) return; - sb.Output.Print(sb.PatternArgs[argName]); - } - - [RantFunction("tm")] - [RantDescription("Prints the trademark symbol.")] - private static void Trademark(Sandbox sb) => sb.Print("\x2122"); - - [RantFunction("reg")] - [RantDescription("Prints the registered trademark symbol.")] - private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); - - [RantFunction("c")] - [RantDescription("Prints the copyright symbol.")] - private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); - - [RantFunction("em")] - [RantDescription("Prints an emdash.")] - private static void Emdash(Sandbox sb) => sb.Print("\x2014"); - - [RantFunction("en")] - [RantDescription("Prints an endash.")] - private static void Endash(Sandbox sb) => sb.Print("\x2013"); - - [RantFunction("b")] - [RantDescription("Prints a bullet character.")] - private static void Bullet(Sandbox sb) => sb.Print("\x2022"); - - [RantFunction("ss")] - [RantDescription("Prints an eszett (ß).")] - private static void Eszett(Sandbox sb) => sb.Print("\x00df"); - - [RantFunction("emoji")] - [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] - private static void PrintEmoji(Sandbox sb, - [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) - { - shortcode = shortcode.ToLower(); - if (!Emoji.Shortcodes.ContainsKey(shortcode)) - { - sb.Print("[missing emoji]"); - return; - } - sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); - } - - [RantFunction("plural", "pl")] - [RantDescription("Infers and prints the plural form of the specified word.")] - private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); - - [RantFunction("use")] - [RantDescription("Loads a module from the file name.module.rant, name.rant, or name, in that order.")] - private static void Use(Sandbox sb, string name) - { - if (sb.UserModules.ContainsKey(name)) - { - sb.Modules[name] = sb.UserModules[name]; - return; - } - if (sb.PackageModules.ContainsKey(name)) - { - sb.Modules[name] = sb.PackageModules[name]; - return; - } - string file; - if (File.Exists(name + ".module.rant")) - file = name + ".module.rant"; - else if (File.Exists(name + ".rant")) - file = name + ".rant"; - else if (File.Exists(name)) - file = name; - else - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Could not find module '{name}'."); - var pattern = RantProgram.CompileFile(file); - if (pattern.Module == null) - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"No module is defined in {file}."); - sb.Modules[Path.GetFileNameWithoutExtension(name)] = pattern.Module; - } - - [RantFunction] - [RantDescription("Prints the current length of the specified channel, in characters.")] - private static void Len(Sandbox sb, - [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); - - [RantFunction("rev")] - [RantDescription("Reverses the specified string and prints it to the output.")] - private static void Reverse(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = input[i]; - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = input[i]; - } - sb.Print(new string(buffer)); - } - - [RantFunction("revx")] - [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] - private static void ReverseEx(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = Util.ReverseChar(input[i]); - } - sb.Print(new string(buffer)); - } - - [RantFunction("accent")] - [RantDescription("Accents the previous character.")] - private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); - - [RantFunction("accent")] - [RantDescription("Accents the specified character.")] - private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); - - [RantFunction("acute", "act")] - [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] - private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); - - [RantFunction("circumflex", "cflex")] - [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] - private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); - - [RantFunction("grave", "grv")] - [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] - private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); - - [RantFunction("ring")] - [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] - private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); - - [RantFunction("tilde", "tld")] - [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] - private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); - - [RantFunction("diaeresis", "dia")] - [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] - private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); - - [RantFunction("caron", "crn")] - [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] - private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); - - [RantFunction("macron", "mcn")] - [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] - private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); - - [RantFunction("cedilla", "ced")] - [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] - private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); - - [RantFunction("char")] - [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] - private static void Character(Sandbox sb, - [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); + [RantFunction("sep", "s")] + [RantDescription("Sets the separator pattern for the next block.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.CurrentBlockAttribs.IsSeries = false; + sb.CurrentBlockAttribs.Separator = separator; + } + + [RantFunction("sep", "s")] + [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) + { + sb.CurrentBlockAttribs.IsSeries = true; + sb.CurrentBlockAttribs.Separator = separator; + sb.CurrentBlockAttribs.EndConjunction = conjunction; + } + + [RantFunction("sep", "s")] + [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, + [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) + { + sb.CurrentBlockAttribs.IsSeries = true; + sb.CurrentBlockAttribs.Separator = separator; + sb.CurrentBlockAttribs.EndSeparator = oxford; + sb.CurrentBlockAttribs.EndConjunction = conjunction; + } + + [RantFunction("rs")] + [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] + private static void RepSep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.CurrentBlockAttribs.IsSeries = false; + sb.CurrentBlockAttribs.Repetitions = times; + sb.CurrentBlockAttribs.Separator = separator; + } + + [RantFunction] + [RantDescription("Sets the prefix pattern for the next block.")] + private static void Before(Sandbox sb, + [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.CurrentBlockAttribs.Before = beforeAction; + + [RantFunction] + [RantDescription("Sets the postfix pattern for the next block.")] + private static void After(Sandbox sb, + [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.CurrentBlockAttribs.After = afterAction; + + [RantFunction] + [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] + private static void Chance(Sandbox sb, + [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.CurrentBlockAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; + + [RantFunction("case", "caps")] + [RantDescription("Changes the capitalization mode for all open channels.")] + private static void Case(Sandbox sb, + [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); + + [RantFunction] + [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] + private static void CapsInfer(Sandbox sb, + [RantDescription("A string that is capitalized in the format to be set.")] string sample) + { + var output = sb.Output; + if (string.IsNullOrEmpty(sample)) + { + output.Capitalize(Capitalization.None); + return; + } + var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (words.Length == 1) + { + string word = words[0]; + if (word.Length == 1) + output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); + else if (Util.IsUppercase(word)) + output.Capitalize(Capitalization.Upper); + else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + else + { + // No letters? Forget it. + if (!sample.Any(char.IsLetter)) + { + output.Capitalize(Capitalization.None); + return; + } + + // Is all-caps? + if (Util.IsUppercase(sample)) + { + output.Capitalize(Capitalization.Upper); + return; + } + + var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) + .Select(str => str.Trim()) + .Where(str => + !string.IsNullOrEmpty(str) + && !char.IsDigit(str[0])).ToArray(); + + // All words capitalized? + var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); + if (lwords.Any() && + (sentences.Length == 1 || + sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) + { + if (lwords.All(lw => char.IsUpper(lw[0]))) + { + output.Capitalize(Capitalization.Word); + return; + } + + if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) + { + output.Capitalize(Capitalization.Title); + return; + } + } + + // All sentences capitalized? + bool all = true; + bool none = true; + foreach (string sentence in sentences) + { + bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); + all = all && isCapitalized; + none = none && !isCapitalized; + } + + if (sentences.Length > 1 && all) + output.Capitalize(Capitalization.Sentence); + else if (none) + output.Capitalize(Capitalization.Lower); + else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the first.")] + private static IEnumerator First(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration == 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the first.")] + private static IEnumerator NotFirst(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration > 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the last.")] + private static IEnumerator Last(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == block.Count) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the last.")] + private static IEnumerator NotLast(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration < block.Count) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] + private static IEnumerator Middle(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration > 1 && block.Iteration < block.Count) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] + private static IEnumerator Ends(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == 1 || block.Iteration == block.Count) yield return action; + } + + [RantFunction("repnum", "rn")] + [RantDescription("Prints the iteration number of the current block.")] + private static void RepNum(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration); + } + + [RantFunction("repelapsed", "re")] + [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] + private static void RepElapsed(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration - 1); + } + + [RantFunction("repcount", "rc")] + [RantDescription("Prints the repetition count of the current block.")] + private static void RepCount(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Count); + } + + [RantFunction("reprem", "rr")] + [RantDescription("Prints the number of remaining repetitions queued after the current one.")] + private static void RepRem(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Count - block.Iteration); + } + + [RantFunction("repqueued", "rq")] + [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] + private static void RepQueued(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Count - (block.Iteration - 1)); + } + + [RantFunction] + [RantDescription("Prints the number of currently active blocks.")] + private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); + + [RantFunction("index", "i")] + [RantDescription("Prints the zero-based index of the block item currently being executed.")] + private static void Index(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index); + } + + [RantFunction("index1", "i1")] + [RantDescription("Prints the one-based index of the block item currently being executed.")] + private static void IndexOne(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index + 1); + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an odd number.")] + private static IEnumerator Odd(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an even number.")] + private static IEnumerator Even(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; + } + + [RantFunction] + [RantDescription("Returns the specified argument from the current subroutine.")] + private static IEnumerator Arg(Sandbox sb, + [RantDescription("The name of the argument to retrieve.")] string name) + { + if (!sb.SubroutineArgs.Any()) yield break; + var args = sb.SubroutineArgs.Peek(); + if (args.ContainsKey(name)) + yield return args[name]; + } + + [RantFunction] + [RantDescription("Retrieves and prints the current match string of the active replacer.")] + private static void Match(Sandbox sb) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Value); + } + + [RantFunction] + [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] + private static void Group(Sandbox sb, + [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); + } + + [RantFunction] + [RantDescription("Sets the current rhyming mode for queries.")] + private static void Rhyme(Sandbox sb, + [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; + + [RantFunction("sync", "x")] + [RantDescription("Creates and applies a synchronizer with the specified name and type.")] + private static void Sync(Sandbox sb, + [RantDescription("The name of the synchronizer.")] string name, + [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); + + [RantFunction("xpin")] + [RantDescription("Pins a synchronizer.")] + private static void SyncPin(Sandbox sb, + [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); + + [RantFunction("xunpin")] + [RantDescription("Unpins a synchronizer.")] + private static void SyncUnpin(Sandbox sb, + [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); + + [RantFunction("xstep")] + [RantDescription("Iterates a synchronizer.")] + private static void SyncStep(Sandbox sb, + [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); + + [RantFunction("xreset")] + [RantDescription("Resets a synchronizer to its initial state.")] + private static void SyncReset(Sandbox sb, + [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); + + [RantFunction("quote", "q")] + [RantDescription( + "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] + private static IEnumerator Quote(Sandbox sb, + [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) + { + sb.IncreaseQuote(); + sb.PrintOpeningQuote(); + yield return quoteAction; + sb.PrintClosingQuote(); + sb.DecreaseQuote(); + } + + [RantFunction] + [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] + private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) + { + sb.Output.OpenChannel(channelName, visibility); + yield return pattern; + sb.Output.CloseChannel(); + } + + [RantFunction("target", "t")] + [RantDescription("Places a target with the specified name at the current write position.")] + private static void Target(Sandbox sb, + [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); + + [RantFunction] + [RantDescription("Appends a string to the specified target's contents.")] + private static void Send(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); + + [RantFunction] + [RantDescription("Overwrites the specified target's contents with the provided value.")] + private static void SendOver(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) + { + sb.Output.Do(chain => chain.ClearTarget(targetName)); + sb.Output.PrintToTarget(targetName, value); + } + + [RantFunction("targetval")] + [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] + private static void GetTargetValue(Sandbox sb, + [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); + + [RantFunction("clrt")] + [RantDescription("Clears the contents of the specified target.")] + private static void ClearTarget(Sandbox sb, + [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] + private static IEnumerator Nth(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] + private static IEnumerator NthO(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] + private static IEnumerator NotNth(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." + )] + private static IEnumerator NotNthO(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Sets a pattern that will run before the next block.")] + private static void Start(Sandbox sb, + [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.CurrentBlockAttribs.Start = beforePattern; + + [RantFunction] + [RantDescription("Sets a pattern that will run after the next block.")] + private static void End(Sandbox sb, + [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.CurrentBlockAttribs.End = endPattern; + + // TODO: Finish [persist]. + //[RantFunction] + [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] + private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.CurrentBlockAttribs.Persistence = persistence; + + [RantFunction] + [RantDescription("Loads and runs a pattern from cache or file.")] + private static IEnumerator Import(Sandbox sb, + [RantDescription("The name or path of the pattern to load.")] string name) + { + RST action; + + try + { + action = sb.Engine.GetProgramInternal(name).SyntaxTree; + } + catch (RantCompilerException e) + { + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, + $"Failed to compile imported pattern '{name}':\n{e.Message}"); + } + catch (Exception e) + { + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, + $"Failed to import '{name}':\n{e.Message}"); + } + + yield return action; + } + + [RantFunction] + [RantDescription("Defines the specified flags.")] + private static void Define(Sandbox sb, + [RantDescription("The list of flags to define.")] params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.Engine.Flags.Add(flag); + } + + [RantFunction] + [RantDescription("Undefines the specified flags.")] + private static void Undef(Sandbox sb, + [RantDescription("The list of flags to undefine.")] params string[] flags) + { + foreach (string flag in flags) sb.Engine.Flags.Remove(flag); + } + + [RantFunction] + [RantDescription("Toggles the specified flags.")] + private static void Toggle(Sandbox sb, params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + { + if (sb.Engine.Flags.Contains(flag)) + sb.Engine.Flags.Remove(flag); + else + sb.Engine.Flags.Add(flag); + } + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] + private static void IfDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = true; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] + private static void IfNDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = false; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition passes.")] + private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) + { + if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) + yield return conditionPassPattern; + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition fails.")] + private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) + { + if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) + yield return conditionFailPattern; + } + + [RantFunction] + [RantDescription("Yields the currenty written output.")] + private static void Yield(Sandbox sb) => sb.SetYield(); + + [RantFunction] + [RantDescription("Branches the internal RNG according to a seed.")] + private static void Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); + + [RantFunction] + [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] + private static IEnumerator Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed, + [RantDescription("The pattern to run on the branch.")] RST branchAction) + { + sb.RNG.Branch(seed.Hash()); + yield return branchAction; + sb.RNG.Merge(); + } + + [RantFunction] + [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] + private static void Merge(Sandbox sb) => sb.RNG.Merge(); + + [RantFunction("in")] + [RantDescription("Prints the value of the specified pattern argument.")] + private static void PatternArg(Sandbox sb, + [RantDescription("The name of the argument to access.")] string argName) + { + if (sb.PatternArgs == null) return; + sb.Output.Print(sb.PatternArgs[argName]); + } + + [RantFunction("tm")] + [RantDescription("Prints the trademark symbol.")] + private static void Trademark(Sandbox sb) => sb.Print("\x2122"); + + [RantFunction("reg")] + [RantDescription("Prints the registered trademark symbol.")] + private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); + + [RantFunction("c")] + [RantDescription("Prints the copyright symbol.")] + private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); + + [RantFunction("em")] + [RantDescription("Prints an emdash.")] + private static void Emdash(Sandbox sb) => sb.Print("\x2014"); + + [RantFunction("en")] + [RantDescription("Prints an endash.")] + private static void Endash(Sandbox sb) => sb.Print("\x2013"); + + [RantFunction("b")] + [RantDescription("Prints a bullet character.")] + private static void Bullet(Sandbox sb) => sb.Print("\x2022"); + + [RantFunction("ss")] + [RantDescription("Prints an eszett (ß).")] + private static void Eszett(Sandbox sb) => sb.Print("\x00df"); + + [RantFunction("emoji")] + [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] + private static void PrintEmoji(Sandbox sb, + [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) + { + shortcode = shortcode.ToLower(); + if (!Emoji.Shortcodes.ContainsKey(shortcode)) + { + sb.Print("[missing emoji]"); + return; + } + sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); + } + + [RantFunction("plural", "pl")] + [RantDescription("Infers and prints the plural form of the specified word.")] + private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); + + [RantFunction("use")] + [RantDescription("Loads a module from the file name.module.rant, name.rant, or name, in that order.")] + private static void Use(Sandbox sb, string name) + { + if (sb.UserModules.ContainsKey(name)) + { + sb.Modules[name] = sb.UserModules[name]; + return; + } + if (sb.PackageModules.ContainsKey(name)) + { + sb.Modules[name] = sb.PackageModules[name]; + return; + } + string file; + if (File.Exists(name + ".module.rant")) + file = name + ".module.rant"; + else if (File.Exists(name + ".rant")) + file = name + ".rant"; + else if (File.Exists(name)) + file = name; + else + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Could not find module '{name}'."); + var pattern = RantProgram.CompileFile(file); + if (pattern.Module == null) + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"No module is defined in {file}."); + sb.Modules[Path.GetFileNameWithoutExtension(name)] = pattern.Module; + } + + [RantFunction] + [RantDescription("Prints the current length of the specified channel, in characters.")] + private static void Len(Sandbox sb, + [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); + + [RantFunction("rev")] + [RantDescription("Reverses the specified string and prints it to the output.")] + private static void Reverse(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = input[i]; + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = input[i]; + } + sb.Print(new string(buffer)); + } + + [RantFunction("revx")] + [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] + private static void ReverseEx(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = Util.ReverseChar(input[i]); + } + sb.Print(new string(buffer)); + } + + [RantFunction("accent")] + [RantDescription("Accents the previous character.")] + private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); + + [RantFunction("accent")] + [RantDescription("Accents the specified character.")] + private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); + + [RantFunction("acute", "act")] + [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] + private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); + + [RantFunction("circumflex", "cflex")] + [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] + private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); + + [RantFunction("grave", "grv")] + [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] + private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); + + [RantFunction("ring")] + [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] + private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); + + [RantFunction("tilde", "tld")] + [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] + private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); + + [RantFunction("diaeresis", "dia")] + [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] + private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); + + [RantFunction("caron", "crn")] + [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] + private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); + + [RantFunction("macron", "mcn")] + [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] + private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); + + [RantFunction("cedilla", "ced")] + [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] + private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); + + [RantFunction("char")] + [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] + private static void Character(Sandbox sb, + [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); [RantFunction("rcc")] [RantDescription("Resets the specified carrier components.")] - private static void ResetCarrier(Sandbox sb, + private static void ResetCarrier(Sandbox sb, [RantDescription("The list of carrier component identifiers to reset.")] params string[] ids) { - foreach(var id in ids) + foreach (var id in ids) { if (String.IsNullOrWhiteSpace(id)) continue; sb.CarrierState.DeleteAssociation(id); @@ -959,7 +960,7 @@ private static void QueryClassFilterPositive(Sandbox sb, string id, params strin ClassFilter cf; cf = (q = sb.QueryBuilder.GetQuery(id)).GetFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; if (cf == null) q.AddFilter(cf = new ClassFilter()); - foreach(var cl in classes) + foreach (var cl in classes) { cf.AddRule(new ClassFilterRule(cl, true)); } @@ -995,5 +996,54 @@ private static void RedirectedItem(Sandbox sb, string channel) { sb.Print(sb.GetRedirectedOutput()[channel]); } + + [RantFunction("vs")] + private static void VariableSet(Sandbox sb, string name, string value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vn")] + private static void VariableSet(Sandbox sb, string name, double value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vn")] + private static void VariableSet(Sandbox sb, string name, int min, int max) + { + sb.Objects[name] = new RantObject(sb.RNG.Next(min, max + 1)); + } + + [RantFunction("vp")] + private static void VariableSetLazy(Sandbox sb, string name, RST value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vcpy")] + private static void VariableCopy(Sandbox sb, string a, string b) + { + sb.Objects[b] = sb.Objects[a].Clone(); + } + + [RantFunction("v")] + private static IEnumerator VariableGet(Sandbox sb, string name) + { + var o = sb.Objects[name]; + if (o == null) + { + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction, "err-runtime-missing-var", name); + } + + if (o.Type == RantObjectType.Action) + { + yield return o.Value as RST; + } + else + { + sb.Print(o); + } + } } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/ObjectStack.cs b/Rant/Core/ObjectModel/ObjectStack.cs index eaeed6d..ad70e12 100644 --- a/Rant/Core/ObjectModel/ObjectStack.cs +++ b/Rant/Core/ObjectModel/ObjectStack.cs @@ -29,80 +29,79 @@ namespace Rant.Core.ObjectModel { - /// - /// Stores local variables for a VM instance. - /// - internal class ObjectStack - { - private readonly List> _scopes = new List>(); - private readonly ObjectTable _table; - private int _level; + /// + /// Stores local variables for a VM instance. + /// + internal class ObjectStack + { + private readonly List> _scopes = new List>(); + private readonly ObjectTable _table; + private int _level; - public ObjectStack(ObjectTable table) - { - _table = table; - } + public ObjectStack(ObjectTable table) + { + _table = table; + } - public RantObject this[string name] - { - get - { - if (!Util.ValidateName(name)) return null; + public RantObject this[string name] + { + get + { + if (!Util.ValidateName(name)) return null; - RantObject obj; - if (_table.Globals.TryGetValue(name, out obj)) return obj; - return CurrentLocals.TryGetValue(name, out obj) ? obj : null; - } - set - { - if (!Util.ValidateName(name)) return; + if (_table.Globals.TryGetValue(name, out RantObject obj)) return obj; + return CurrentLocals.TryGetValue(name, out obj) ? obj : null; + } + set + { + if (!Util.ValidateName(name)) return; - if (value == null) - { - if (_level == 0) - _table.Globals.Remove(name); - else - CurrentLocals.Remove(name); - return; - } + if (value == null) + { + if (_level == 0) + _table.Globals.Remove(name); + else + CurrentLocals.Remove(name); + return; + } - if (_level == 0) - _table.Globals[name] = value; - else - { - if (_table.Globals.ContainsKey(name)) - _table.Globals[name] = value; - if (!CurrentLocals.ContainsKey(name)) - _scopes[_level - 1].Add(name); - CurrentLocals[name] = value; - } - } - } + if (_level == 0) + _table.Globals[name] = value; + else + { + if (_table.Globals.ContainsKey(name)) + _table.Globals[name] = value; + if (!CurrentLocals.ContainsKey(name)) + _scopes[_level - 1].Add(name); + CurrentLocals[name] = value; + } + } + } - public Dictionary CurrentLocals { get; } = new Dictionary(); + public Dictionary CurrentLocals { get; } = new Dictionary(); - public void EnterScope() - { - if (++_level >= _scopes.Count) - _scopes.Add(new HashSet()); - } + public void EnterScope() + { + if (++_level >= _scopes.Count) + _scopes.Add(new HashSet()); + } - public void ExitScope() - { - if (_level == 0) return; - var garbage = _scopes[--_level]; - foreach (string name in garbage) - CurrentLocals.Remove(name); - garbage.Clear(); - } + public void ExitScope() + { + if (_level == 0) return; + var garbage = _scopes[--_level]; + foreach (string name in garbage) + CurrentLocals.Remove(name); + garbage.Clear(); + } - public void Clear() - { - CurrentLocals.Clear(); - _scopes.Clear(); - _level = 0; - _table.Globals.Clear(); - } - } + public void Clear() + { + CurrentLocals.Clear(); + _scopes.Clear(); + _level = 0; + _table.Globals.Clear(); + } + } } \ No newline at end of file diff --git a/Rant/Core/Sandbox.State.cs b/Rant/Core/Sandbox.State.cs index be66767..6e2e379 100644 --- a/Rant/Core/Sandbox.State.cs +++ b/Rant/Core/Sandbox.State.cs @@ -124,11 +124,6 @@ internal sealed partial class Sandbox /// public double LastTimeout { get; internal set; } - /// - /// Gets the current object stack of the Richard engine. - /// - public Stack ScriptObjectStack { get; } - /// /// Gets or sets the expected result for the current flag condition. /// diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 4051c0f..2c2d130 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -64,7 +64,6 @@ public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = CarrierState = carrierState ?? new CarrierState(); SubroutineArgs = new Stack>(); SyncManager = new SyncManager(this); - ScriptObjectStack = new Stack(); PatternArgs = args; // Private members @@ -185,8 +184,7 @@ public RantOutput Run(double timeout, RantProgram pattern = null) _stopwatch.Reset(); _stopwatch.Start(); } - - ScriptObjectStack.Clear(); + var callStack = new Stack>(); IEnumerator action; @@ -247,8 +245,7 @@ public IEnumerable RunSerial(double timeout, RantProgram pattern = n _stopwatch.Reset(); _stopwatch.Start(); } - - ScriptObjectStack.Clear(); + var callStack = new Stack>(); IEnumerator action; From ec2e96b7fb92772f1029c090c735ad6d5be30036 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 14:21:30 -0500 Subject: [PATCH 140/213] Add string entry for err-runtime-missing-var --- Rant/Core/Framework/RantFunctionRegistry.cs | 6 ++---- Rant/Localization/de-DE.lang | 1 + Rant/Localization/en-US.lang | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index e26afd6..b4ae995 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -59,8 +59,7 @@ private static void Number(Sandbox sb, private static void Number(Sandbox sb, [RantDescription("The string to convert into a number.")] string input) { - double number; - sb.Print(double.TryParse(input, out number) ? number : 0); + sb.Print(double.TryParse(input, out double number) ? number : 0); } [RantFunction("numfmt")] @@ -84,10 +83,9 @@ private static IEnumerator NumberFormatRange(Sandbox sb, yield return rangeAction; - NumberFormat fmt; sb.Output.Do(chain => { - if (!oldFmtMap.TryGetValue(chain, out fmt)) return; + if (!oldFmtMap.TryGetValue(chain, out NumberFormat fmt)) return; chain.Last.NumberFormatter.NumberFormat = fmt; }); } diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index bf4c221..40ca306 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -66,6 +66,7 @@ err-compiler-invalid-vchar = "Ungültigen Unicode-Zeichennamen in wörtlichem Ze err-compiler-incomplete-vchar = "Unvollständiges wörtliches Zeichenliteral." err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" +err-runtime-missing-var = "Die Variable '{0}' existiert nicht." acc-carrier-name = "Anfragezustandspeichernamen" acc-table-name = "Tabellenamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 58aef95..331ed28 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -72,6 +72,7 @@ err-table-too-few-terms = "Too few terms in entry: Expected {0}, found {1}." err-table-argc-mismatch = "Argument count mismatch: {0} expects {1}, found {2}" err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" +err-runtime-missing-var = "The variable '{0}' does not exist." acc-carrier-name = "carrier name" acc-table-name = "table name" From 78bb26835f2c9e0b9c437ff2558232b151288baf Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 16 Mar 2017 17:16:38 -0500 Subject: [PATCH 141/213] =?UTF-8?q?Add=20=EF=BC=A1=EF=BC=A5=EF=BC=B3?= =?UTF-8?q?=EF=BC=B4=EF=BC=A8=EF=BC=A5=EF=BC=B4=EF=BC=A9=EF=BC=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Rant/Core/Formatting/CharConversion.cs | 16 + Rant/Core/Formatting/CharConverter.cs | 143 +++++ Rant/Core/Framework/RantFunctionRegistry.cs | 6 + Rant/Core/Output/OutputChain.cs | 13 +- Rant/Core/Output/OutputChainBuffer.cs | 562 +++++++++++--------- Rant/Core/Output/OutputWriter.cs | 3 +- Rant/Rant.csproj | 2 + 7 files changed, 473 insertions(+), 272 deletions(-) create mode 100644 Rant/Core/Formatting/CharConversion.cs create mode 100644 Rant/Core/Formatting/CharConverter.cs diff --git a/Rant/Core/Formatting/CharConversion.cs b/Rant/Core/Formatting/CharConversion.cs new file mode 100644 index 0000000..cc37a4c --- /dev/null +++ b/Rant/Core/Formatting/CharConversion.cs @@ -0,0 +1,16 @@ +using Rant.Metadata; + +namespace Rant.Core.Formatting +{ + internal enum CharConversion + { + [RantDescription("No conversion.")] + None, + [RantDescription("Fullwidth characters.")] + Fullwidth, + [RantDescription("Cursive script.")] + Cursive, + [RantDescription("Bold cursive script.")] + BoldCursive + } +} diff --git a/Rant/Core/Formatting/CharConverter.cs b/Rant/Core/Formatting/CharConverter.cs new file mode 100644 index 0000000..d8e012a --- /dev/null +++ b/Rant/Core/Formatting/CharConverter.cs @@ -0,0 +1,143 @@ +using System.Text; + +namespace Rant.Core.Formatting +{ + internal static class CharConverter + { + public static char ToFullwidth(char c) + { + if (c < '!' || c > '~') return c; + return (char)(c + 0xfee0); + } + + public static string ToScript(char c) + { + switch (c) + { + case 'a': + return "\U0001d4b6"; + case 'b': + return "\U0001d4b7"; + case 'c': + return "\U0001d4b8"; + case 'd': + return "\U0001d4b9"; + case 'e': + return "\u212f"; + case 'f': + return "\U0001d4bb"; + case 'g': + return "\u210a"; + case 'h': + return "\U0001d4bd"; + case 'i': + return "\U0001d4be"; + case 'j': + return "\U0001d4bf"; + case 'k': + return "\U0001d4c0"; + case 'l': + return "\U0001d4c1"; + case 'm': + return "\U0001d4c2"; + case 'n': + return "\U0001d4c3"; + case 'o': + return "\u2134"; + case 'p': + return "\U0001d4c5"; + case 'q': + return "\U0001d4c6"; + case 'r': + return "\U0001d4c7"; + case 's': + return "\U0001d4c8"; + case 't': + return "\U0001d4c9"; + case 'u': + return "\U0001d4ca"; + case 'v': + return "\U0001d4cb"; + case 'w': + return "\U0001d4cc"; + case 'x': + return "\U0001d4cd"; + case 'y': + return "\U0001d4ce"; + case 'z': + return "\U0001d4cf"; + case 'A': + return "\U0001d49c"; + case 'B': + return "\u212c"; + case 'C': + return "\U0001d49e"; + case 'D': + return "\U0001d49f"; + case 'E': + return "\u2130"; + case 'F': + return "\u2131"; + case 'G': + return "\U0001d4a2"; + case 'H': + return "\u210b"; + case 'I': + return "\u2110"; + case 'J': + return "\U0001d4a5"; + case 'K': + return "\U0001d4a6"; + case 'L': + return "\u2112"; + case 'M': + return "\u2133"; + case 'N': + return "\U0001d4a9"; + case 'O': + return "\U0001d4aa"; + case 'P': + return "\U0001d4ab"; + case 'Q': + return "\U0001d4ac"; + case 'R': + return "\u211b"; + case 'S': + return "\U0001d4ae"; + case 'T': + return "\U0001d4af"; + case 'U': + return "\U0001d4b0"; + case 'V': + return "\U0001d4b1"; + case 'W': + return "\U0001d4b2"; + case 'X': + return "\U0001d4b3"; + case 'Y': + return "\U0001d4b4"; + case 'Z': + return "\U0001d4b5"; + default: + return c.ToString(); + } + } + + public static string ToBoldScript(char c) + { + const ushort a = 0x9390; + const ushort b = 0x93aa; + if (c >= 'A' && c <= 'Z') + { + ushort d = unchecked((ushort)(a + (c - 'A'))); + return Encoding.UTF8.GetString(new byte[] { 0xf0, 0x9d, (byte)((d & 0xff00) >> 8), (byte)(d & 0xff) }, 0, 4); + } + if (c >= 'a' && c <= 'z') + { + ushort d = unchecked((ushort)(b + (c - 'a'))); + return Encoding.UTF8.GetString(new byte[] { 0xf0, 0x9d, (byte)((d & 0xff00) >> 8), (byte)(d & 0xff) }, 0, 4); + } + return c.ToString(); + } + } +} diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index b4ae995..835a567 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -188,6 +188,12 @@ private static void Chance(Sandbox sb, private static void Case(Sandbox sb, [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); + [RantFunction("txtfmt")] + [RantDescription("Sets the text conversion format for all open channels.")] + private static void TxtFmt(Sandbox sb, + [RantDescription("The conversion mode to use.")] + CharConversion format) => sb.Output.SetConversion(format); + [RantFunction] [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] private static void CapsInfer(Sandbox sb, diff --git a/Rant/Core/Output/OutputChain.cs b/Rant/Core/Output/OutputChain.cs index 4a33c4a..b3722c4 100644 --- a/Rant/Core/Output/OutputChain.cs +++ b/Rant/Core/Output/OutputChain.cs @@ -47,8 +47,6 @@ public OutputChain(Sandbox sb, string name) Name = name; } - // Buffer endpoint references - // Public public OutputChainBuffer First { get; private set; } public OutputChainBuffer Last { get; private set; } @@ -94,16 +92,13 @@ public void PrintToTarget(object targetName, object value) public void ClearTarget(object targetName) { - OutputChainBuffer buffer; - if (targets.TryGetValue(targetName, out buffer)) - buffer.Clear(); - } + if (targets.TryGetValue(targetName, out OutputChainBuffer buffer)) buffer.Clear(); + } public string GetTargetValue(string targetName) { - OutputChainBuffer buffer; - return targets.TryGetValue(targetName, out buffer) ? buffer.ToString() : string.Empty; - } + return targets.TryGetValue(targetName, out OutputChainBuffer buffer) ? buffer.ToString() : string.Empty; + } public void Print(string value) { diff --git a/Rant/Core/Output/OutputChainBuffer.cs b/Rant/Core/Output/OutputChainBuffer.cs index 7bd2d2a..3de09e6 100644 --- a/Rant/Core/Output/OutputChainBuffer.cs +++ b/Rant/Core/Output/OutputChainBuffer.cs @@ -25,6 +25,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using Rant.Core.Formatting; @@ -34,278 +35,315 @@ namespace Rant.Core.Output { - internal class OutputChainBuffer - { - private const int InitialCapacity = 256; - - private static readonly HashSet _wordSepChars - = new HashSet(new[] { ' ', '\r', '\n', '\t', '\f', '\v', '\'', '\"', '/', '-' }); - - private static readonly HashSet _sentenceTerminators - = new HashSet(new[] { '.', '?', '!' }); - - protected readonly StringBuilder _buffer; - private readonly Sandbox _sandbox; - private Capitalization _caps = Capitalization.None; - // Determines if a print took place after capitalization was changed - // Size of the buffer before the last print - private int oldSize; - - public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev) - { + internal class OutputChainBuffer + { + private const int InitialCapacity = 128; + + private static readonly HashSet _wordSepChars + = new HashSet(new[] { ' ', '\r', '\n', '\t', '\f', '\v', '\'', '\"', '/', '-' }); + + private static readonly HashSet _sentenceTerminators + = new HashSet(new[] { '.', '?', '!' }); + + protected readonly StringBuilder _buffer; + private readonly Sandbox _sandbox; + private Capitalization _caps = Capitalization.None; + private CharConversion _charType = CharConversion.None; + // Determines if a print took place after capitalization was changed + // Size of the buffer before the last print + private int oldSize; + + public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev) + { NumberFormatter = new NumberFormatter(sb); Prev = prev; - if (prev != null) - { + if (prev != null) + { if (prev.Next != null) prev.Next.Prev = this; prev.Next = this; - _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; - NumberFormatter.BinaryFormat = prev.NumberFormatter.BinaryFormat; - NumberFormatter.BinaryFormatDigits = prev.NumberFormatter.BinaryFormatDigits; - NumberFormatter.Endianness = prev.NumberFormatter.Endianness; - NumberFormatter.NumberFormat = prev.NumberFormatter.NumberFormat; - } - - IsTarget = true; - _buffer = new StringBuilder(InitialCapacity); - _sandbox = sb; - } - - public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) - { + _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; + NumberFormatter.BinaryFormat = prev.NumberFormatter.BinaryFormat; + NumberFormatter.BinaryFormatDigits = prev.NumberFormatter.BinaryFormatDigits; + NumberFormatter.Endianness = prev.NumberFormatter.Endianness; + NumberFormatter.NumberFormat = prev.NumberFormatter.NumberFormat; + } + + IsTarget = true; + _buffer = new StringBuilder(InitialCapacity); + _sandbox = sb; + } + + public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) + { NumberFormatter = new NumberFormatter(sb); Prev = prev; - if (prev != null) - { - prev.Next = this; - _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; - } - - _buffer = targetOrigin._buffer; - _sandbox = sb; - } - - public StringBuilder Buffer => _buffer; - - public Capitalization Caps - { - get { return _caps; } - set - { - PrintedSinceCapsChange = false; - _caps = value; - } - } - - public bool IsTarget { get; } = false; - protected bool PrintedSinceCapsChange { get; private set; } = false; - public NumberFormatter NumberFormatter { get; } - public OutputChainBuffer Next { get; private set; } - public OutputChainBuffer Prev { get; private set; } - public char LastChar => _buffer.Length > 0 ? _buffer[_buffer.Length - 1] : '\0'; - public char FirstChar => _buffer.Length > 0 ? _buffer[0] : '\0'; - public int Length => _buffer.Length; - - protected virtual void OnPrevBufferChange() - { - } - - protected virtual void OnNextBufferChange() - { - } - - public void Print(string value) - { - if (string.IsNullOrEmpty(value)) return; - Format(ref value); - _buffer.Append(value); - PrintedSinceCapsChange = true; - Prev?.OnNextBufferChange(); - Next?.OnPrevBufferChange(); - UpdateSize(); - } - - public void Print(object value) - { - string str; - if (IOUtil.IsNumericType(value.GetType())) - { - double num = Convert.ToDouble(value); - str = NumberFormatter.FormatNumber(num); - // ReSharper disable once CompareOfFloatsByEqualityOperator - _sandbox.SetPlural(num != 1.0); - } - else - str = value.ToString(); - - Format(ref str); - _buffer.Append(str); - PrintedSinceCapsChange = true; - Prev?.OnNextBufferChange(); - Next?.OnPrevBufferChange(); - UpdateSize(); - } - - private void UpdateSize() - { - if (_sandbox.SizeLimit.Accumulate(_buffer.Length - oldSize)) - throw new InvalidOperationException($"Exceeded character limit ({_sandbox.SizeLimit.Maximum})"); - oldSize = _buffer.Length; - } - - public void Clear() - { + if (prev != null) + { + prev.Next = this; + _caps = prev is OutputChainArticleBuffer && prev.Caps == Capitalization.First ? Capitalization.None : prev._caps; + } + + _buffer = targetOrigin._buffer; + _sandbox = sb; + } + + public StringBuilder Buffer => _buffer; + + public Capitalization Caps + { + get { return _caps; } + set + { + PrintedSinceCapsChange = false; + _caps = value; + } + } + + public CharConversion Conversion + { + get { return _charType; } + set { _charType = value; } + } + + public bool IsTarget { get; } = false; + protected bool PrintedSinceCapsChange { get; private set; } = false; + public NumberFormatter NumberFormatter { get; } + public OutputChainBuffer Next { get; private set; } + public OutputChainBuffer Prev { get; private set; } + public char LastChar => _buffer.Length > 0 ? _buffer[_buffer.Length - 1] : '\0'; + public char FirstChar => _buffer.Length > 0 ? _buffer[0] : '\0'; + public int Length => _buffer.Length; + + protected virtual void OnPrevBufferChange() + { + } + + protected virtual void OnNextBufferChange() + { + } + + public void Print(string value) + { + if (string.IsNullOrEmpty(value)) return; + Format(ref value); + _buffer.Append(value); + PrintedSinceCapsChange = true; + Prev?.OnNextBufferChange(); + Next?.OnPrevBufferChange(); + UpdateSize(); + } + + public void Print(object value) + { + string str; + if (IOUtil.IsNumericType(value.GetType())) + { + double num = Convert.ToDouble(value); + str = NumberFormatter.FormatNumber(num); + // ReSharper disable once CompareOfFloatsByEqualityOperator + _sandbox.SetPlural(num != 1.0); + } + else + str = value.ToString(); + + Format(ref str); + _buffer.Append(str); + PrintedSinceCapsChange = true; + Prev?.OnNextBufferChange(); + Next?.OnPrevBufferChange(); + UpdateSize(); + } + + private void UpdateSize() + { + if (_sandbox.SizeLimit.Accumulate(_buffer.Length - oldSize)) + throw new InvalidOperationException($"Exceeded character limit ({_sandbox.SizeLimit.Maximum})"); + oldSize = _buffer.Length; + } + + public void Clear() + { #if UNITY _buffer.Length = 0; #else - _buffer.Clear(); + _buffer.Clear(); #endif - _sandbox.SizeLimit.Accumulate(-oldSize); - oldSize = 0; - } - - public override string ToString() => _buffer.ToString(); - - protected void Format(ref string value) - { - if (Util.IsNullOrWhiteSpace(value)) return; - - switch (_caps) - { - case Capitalization.Upper: - value = value.ToUpperInvariant(); - break; - case Capitalization.Lower: - value = value.ToLowerInvariant(); - break; - case Capitalization.Word: - { - char lastChar = _buffer.Length > 0 - ? _buffer[_buffer.Length - 1] - : Prev?.LastChar ?? '\0'; - if (char.IsWhiteSpace(lastChar) || _wordSepChars.Contains(lastChar) || lastChar == '\0') - CapitalizeFirstLetter(ref value); - } - break; - case Capitalization.Sentence: - { - var b = _buffer; - - // Capitalize sentences in input value - CapitalizeSentences(ref value); - - // If the buffer's empty, check previous buffer - if (_buffer.Length == 0) - { - // Check if we're at the start - if (Prev == null || Prev.Prev == null && Prev.Length == 0) - { - CapitalizeFirstLetter(ref value); - break; - } - // If there is a previous buffer, scan the end. - b = Prev._buffer; - } - else if (Prev == null || Prev.Length == 0) - { - for (int i = b.Length - 1; i >= 0; i--) - { - if (char.IsLetterOrDigit(b[i])) break; - if (_sentenceTerminators.Contains(b[i])) break; - if (i == 0) - CapitalizeFirstLetter(ref value); - } - } - - // Scan buffer end to determine if capitalization is needed - for (int i = b.Length - 1; i >= 0; i--) - { - if (char.IsLetterOrDigit(b[i])) break; - if (!_sentenceTerminators.Contains(b[i])) continue; - CapitalizeFirstLetter(ref value); - break; - } - } - break; - case Capitalization.Title: - { - CapitalizeTitleString(ref value, _sandbox.Format, !PrintedSinceCapsChange); - } - break; - case Capitalization.First: - if (CapitalizeFirstLetter(ref value) && !(this is OutputChainArticleBuffer)) _caps = Capitalization.None; - break; - } - } - - protected static void CapitalizeSentences(ref string value) - { - var sb = new StringBuilder(); - bool capitalize = false; - foreach (char c in value) - { - if (capitalize && char.IsLetter(c)) - { - sb.Append(char.ToUpperInvariant(c)); - capitalize = false; - } - else - { - if (_sentenceTerminators.Contains(c)) capitalize = true; - sb.Append(c); - } - } - value = sb.ToString(); - } - - protected static bool CapitalizeFirstLetter(ref string value) - { - for (int i = 0; i < value.Length; i++) - { - if (!char.IsLetter(value[i])) continue; - var sb = new StringBuilder(); - sb.Append(value.Substring(0, i)); - sb.Append(char.ToUpperInvariant(value[i])); - sb.Append(value.Substring(i + 1)); - value = sb.ToString(); - return true; - } - return false; - } - - protected static bool CapitalizeTitleString(ref string value, RantFormat format, bool capitalizeFirstLetter) - { - if (Util.IsNullOrWhiteSpace(value)) return false; - var wordBuffer = new StringBuilder(32); - var titleBuffer = new StringBuilder(value.Length); - bool first = true; - foreach (char c in value) - { - if (char.IsWhiteSpace(c)) - { - if (wordBuffer.Length > 0) - { - if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) - wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); - first = false; - titleBuffer.Append(wordBuffer); - wordBuffer.Length = 0; - } - titleBuffer.Append(c); - } - else - wordBuffer.Append(c); - } - if (wordBuffer.Length > 0) - { - if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) - wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); - titleBuffer.Append(wordBuffer); - } - value = titleBuffer.ToString(); - return true; - } - } + _sandbox.SizeLimit.Accumulate(-oldSize); + oldSize = 0; + } + + public override string ToString() => _buffer.ToString(); + + protected void Format(ref string value) + { + if (Util.IsNullOrWhiteSpace(value)) return; + + switch(_charType) + { + case CharConversion.Fullwidth: + value = new string(value.Select(c => CharConverter.ToFullwidth(c)).ToArray()); + break; + case CharConversion.Cursive: + { + var sb = new StringBuilder(); + foreach(char c in value) + { + sb.Append(CharConverter.ToScript(c)); + } + value = sb.ToString(); + break; + } + case CharConversion.BoldCursive: + { + var sb = new StringBuilder(); + foreach (char c in value) + { + sb.Append(CharConverter.ToBoldScript(c)); + } + value = sb.ToString(); + break; + } + + } + + switch (_caps) + { + case Capitalization.Upper: + value = value.ToUpperInvariant(); + break; + case Capitalization.Lower: + value = value.ToLowerInvariant(); + break; + case Capitalization.Word: + { + char lastChar = _buffer.Length > 0 + ? _buffer[_buffer.Length - 1] + : Prev?.LastChar ?? '\0'; + if (char.IsWhiteSpace(lastChar) || _wordSepChars.Contains(lastChar) || lastChar == '\0') + CapitalizeFirstLetter(ref value); + } + break; + case Capitalization.Sentence: + { + var b = _buffer; + + // Capitalize sentences in input value + CapitalizeSentences(ref value); + + // If the buffer's empty, check previous buffer + if (_buffer.Length == 0) + { + // Check if we're at the start + if (Prev == null || Prev.Prev == null && Prev.Length == 0) + { + CapitalizeFirstLetter(ref value); + break; + } + // If there is a previous buffer, scan the end. + b = Prev._buffer; + } + else if (Prev == null || Prev.Length == 0) + { + for (int i = b.Length - 1; i >= 0; i--) + { + if (char.IsLetterOrDigit(b[i])) break; + if (_sentenceTerminators.Contains(b[i])) break; + if (i == 0) + CapitalizeFirstLetter(ref value); + } + } + + // Scan buffer end to determine if capitalization is needed + for (int i = b.Length - 1; i >= 0; i--) + { + if (char.IsLetterOrDigit(b[i])) break; + if (!_sentenceTerminators.Contains(b[i])) continue; + CapitalizeFirstLetter(ref value); + break; + } + } + break; + case Capitalization.Title: + { + CapitalizeTitleString(ref value, _sandbox.Format, !PrintedSinceCapsChange); + } + break; + case Capitalization.First: + if (CapitalizeFirstLetter(ref value) && !(this is OutputChainArticleBuffer)) _caps = Capitalization.None; + break; + } + } + + protected static void CapitalizeSentences(ref string value) + { + var sb = new StringBuilder(); + bool capitalize = false; + foreach (char c in value) + { + if (capitalize && char.IsLetter(c)) + { + sb.Append(char.ToUpperInvariant(c)); + capitalize = false; + } + else + { + if (_sentenceTerminators.Contains(c)) capitalize = true; + sb.Append(c); + } + } + value = sb.ToString(); + } + + protected static bool CapitalizeFirstLetter(ref string value) + { + for (int i = 0; i < value.Length; i++) + { + if (!char.IsLetter(value[i])) continue; + var sb = new StringBuilder(); + sb.Append(value.Substring(0, i)); + sb.Append(char.ToUpperInvariant(value[i])); + sb.Append(value.Substring(i + 1)); + value = sb.ToString(); + return true; + } + return false; + } + + protected static bool CapitalizeTitleString(ref string value, RantFormat format, bool capitalizeFirstLetter) + { + if (Util.IsNullOrWhiteSpace(value)) return false; + var wordBuffer = new StringBuilder(32); + var titleBuffer = new StringBuilder(value.Length); + bool first = true; + foreach (char c in value) + { + if (char.IsWhiteSpace(c)) + { + if (wordBuffer.Length > 0) + { + if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) + wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); + first = false; + titleBuffer.Append(wordBuffer); + wordBuffer.Length = 0; + } + titleBuffer.Append(c); + } + else + { + wordBuffer.Append(c); + } + } + if (wordBuffer.Length > 0) + { + if (first && capitalizeFirstLetter || !format.Excludes(wordBuffer.ToString())) + wordBuffer[0] = char.ToUpperInvariant(wordBuffer[0]); + titleBuffer.Append(wordBuffer); + } + value = titleBuffer.ToString(); + return true; + } + } } \ No newline at end of file diff --git a/Rant/Core/Output/OutputWriter.cs b/Rant/Core/Output/OutputWriter.cs index b71ba9f..3d141b9 100644 --- a/Rant/Core/Output/OutputWriter.cs +++ b/Rant/Core/Output/OutputWriter.cs @@ -102,7 +102,8 @@ public int GetChannelLength(string channelName) } public void Capitalize(Capitalization caps) => Do(chain => chain.Last.Caps = caps); - public void Print(string value) => Do(chain => chain.Print(value)); + public void SetConversion(CharConversion conv) => Do(chain => chain.Last.Conversion = conv); + public void Print(string value) => Do(chain => chain.Print(value)); public void Print(object obj) => Do(chain => chain.Print(obj)); public void InsertTarget(object targetName) => Do(chain => chain.InsertTarget(targetName)); public void PrintToTarget(object targetName, string value) => Do(chain => chain.PrintToTarget(targetName, value)); diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 7467732..f504992 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -179,6 +179,8 @@ + + From 2402db7bb4d0273ac3f328ae4528605112d3d996 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 17 Mar 2017 03:02:19 -0500 Subject: [PATCH 142/213] Update README.md --- README.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b669160..4d2ac2a 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,13 @@

- Build status - + Build status - Build status - + Build status +

+

**Rant** is an all-purpose procedural text generation engine. @@ -24,7 +24,7 @@ With zero cost to you. Don't just write. Write with Rant. -[berkin.me/rant](http://berkin.me/rant) +**[berkin.me/rant](http://berkin.me/rant)** ## Features @@ -44,7 +44,7 @@ Rant is like a templating language but much more awesome. Here are a few example **Liven up a narrative with a few simple queries in your text.** ``` - likes to with pet on . + likes to with pet on . ``` ``` Alick likes to mount shuttlecocks with his pet bat on Mondays. @@ -54,7 +54,7 @@ Alick likes to mount shuttlecocks with his pet bat on Mondays. **Count to ten and spell it out.** ``` -[case:sentence][numfmt:verbal-en][rs:10;\s]{[rn].} +[case:sentence][numfmt:verbal][rs:10;\s]{[rn].} ``` ``` One. Two. Three. Four. Five. Six. Seven. Eight. Nine. Ten. @@ -107,7 +107,6 @@ If you speak a language besides English and want to translate Rant into your nat ## Learn Rant See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of the API and Rant language, as well as additional example code. -## Donate -If you love my work and want to support it by donating, you can do so [here](http://paypal.me/nicholasfleck). -Donations help me afford better software and equipment for my projects, and any amount is very appreciated. -Thank you! +## Donating +If you love my work, you can support me on [Patreon](https://patreon.com/Berkin) (preferred) or by donating through [PayPal](http://paypal.me/nicholasfleck). +Your support helps me make projects like Rant even better. Thank you! From b310d776ed6993e4e3abeb7aae57555c995834e7 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 17 Mar 2017 12:43:32 -0500 Subject: [PATCH 143/213] Fix broken tests --- Rant.Tests/Capitalization.cs | 2 +- Rant.Tests/Numbers.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Rant.Tests/Capitalization.cs b/Rant.Tests/Capitalization.cs index b1a9af4..cbc1d47 100644 --- a/Rant.Tests/Capitalization.cs +++ b/Rant.Tests/Capitalization.cs @@ -28,7 +28,7 @@ public void TitleCase() } [TestCase(@"[caps:sentence]this is a sentence. this is another sentence.", "This is a sentence. This is another sentence.")] - [TestCase(@"[caps:sentence][numfmt:verbal-en][n:1] is a number.", "One is a number.")] + [TestCase(@"[caps:sentence][numfmt:verbal][n:1] is a number.", "One is a number.")] public void SentenceCase(string pattern, string expected) { Assert.AreEqual(expected, rant.Do(pattern).Main); diff --git a/Rant.Tests/Numbers.cs b/Rant.Tests/Numbers.cs index 130a7e2..735c4f1 100644 --- a/Rant.Tests/Numbers.cs +++ b/Rant.Tests/Numbers.cs @@ -24,7 +24,7 @@ public void RandomNumbers() public void Verbal() { Assert.AreEqual("one, two, three, four, five, six, seven, eight, nine, ten", - rant.Do(@"[r:10][s:,\s][numfmt:verbal-en]{[rn]}").Main); + rant.Do(@"[r:10][s:,\s][numfmt:verbal]{[rn]}").Main); } [Test] From ff098d1492afcc6684cf671d45cf9953ad8de78a Mon Sep 17 00:00:00 2001 From: Tamme Schichler Date: Sat, 18 Mar 2017 01:20:38 +0100 Subject: [PATCH 144/213] Fix some errors and a few (possibly subjective) issues with phrasing in de-DE.lang --- Rant/Localization/de-DE.lang | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 40ca306..50a831f 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -13,7 +13,7 @@ err-pgmload-rst-creation-fail = "Fehler beim Erstellen des RSTs des Typs '{0}'." err-zero-or-negative = "Wert muss größer als Null sein." err-empty-path = "Der Dateipfad darf nicht leer oder NULL sein." err-unresolvable-package = "Der Verweis '{1}' im Paket '{0}' konnte nicht aufgelöst werden." -err-invalid-package-version = "Die Paketversion ({0}) ist nicht unterstützt." +err-invalid-package-version = "Die Paketversion ({0}) wird nicht unterstützt." err-missing-package-meta = "Paket mit fehlenden Metadaten gefunden." err-empty-pkg-title = "Der Pakettitel darf nicht leer sein." err-empty-pkg-id = "Der Paketbezeichner (ID) darf nicht leer sein." @@ -26,22 +26,22 @@ err-empty-entry = "Leerer Wörterbucheintrag gefunden." err-missing-table-name = "#name-Anweisung vor der Eintragliste erwartet." err-empty-property = "Leeres Eigenschaftsfeld gefunden." err-misplaced-directive = "Die {0}-Anweisung darf nur im Header sein." -err-invalid-weight = "Ungültiger Eintragsgewichtswert gefunden." -err-bad-term-count = "Begriffenanzahl pro Eintrag muss mehr als Null sein." +err-invalid-weight = "Ungültiges Eintragsgewicht gefunden." +err-bad-term-count = "Begriffsanzahl pro Eintrag muss mehr als Null sein." err-bad-pattern-name = "Ungültiger Vorlagename: {0}" -err-internal-error = "Ein interner Fehler ist aufgetreten. Diese Fehler sind meistens von einem Bug in Rant verursacht." -err-internal-error-msg = "Ein interner Fehler ist aufgetreten. Diese Fehler sind meistens von einem Bug in Rant verursacht. Fehlermeldung: {0}." +err-internal-error = "Ein interner Fehler ist aufgetreten. Diese Fehler werden meistens von einem Bug in Rant verursacht." +err-internal-error-msg = "Ein interner Fehler ist aufgetreten. Diese Fehler werden meistens von einem Bug in Rant verursacht. Fehlermeldung: {0}" err-pattern-timeout = "Der Ausführungszeitraum ist abgelaufen ({0} Sekunden)." err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Maximaltiefe: {0})." err-generic-runtime = "Ein unspezifizierter Laufzeitfehler ist aufgetreten." err-generic-compiler = "Ein unspezifizierter Erstellungsfehler ist aufgetreten." -err-unknown-flag = "Unbekannten Flagwert gefunden: '{0}'" +err-unknown-flag = "Unbekannter Flagwert gefunden: '{0}'" compiler-errors-found = "{0} Erstellungsfehler sind aufgetreten:" -compiler-errors-also-found = "{0} Erstellungsfehler sind auch aufgetreten:" -compiler-error-also-found = "Ein Erstellungsfehler ist auch aufgetreten:" +compiler-errors-also-found = "{0} weitere Erstellungsfehler sind aufgetreten:" +compiler-error-also-found = "Ein weiterer Erstellungsfehler ist aufgetreten:" err-compiler-internal = "Interner Fehler des Typs '{0}' beim Erstellen aufgetreten (siehe InnerException).\n\nFehlermeldung: {1}" err-compiler-eof = "Unerwartetes Dateiende." err-compiler-unexpected-token = "Unerwartetes Token gefunden: '{0}'" From 09f9ab1a45279ed857effcb21618137133e59295 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Sun, 19 Mar 2017 14:55:35 -0500 Subject: [PATCH 145/213] Update README.md --- README.md | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 4d2ac2a..230b723 100644 --- a/README.md +++ b/README.md @@ -13,36 +13,33 @@

-**Rant** is an all-purpose procedural text generation engine. +**Rant** is an all-purpose procedural text engine +that is most simply described as the opposite of Regex. It has been refined to include a dizzying array of features for handling everything from the most basic of string generation tasks to advanced dialogue generation, code templating, automatic formatting, and more. -The goal of the project is to enable creators, especially those in game development, +The goal of the project is to enable developers of all kinds to automate repetitive writing tasks with a high degree of creative freedom. -With zero cost to you. - -Don't just write. Write with Rant. **[berkin.me/rant](http://berkin.me/rant)** ## Features -* Recursive, weighted branching with several available selection modes -* Supports queryable dictionaries. -* Tools for automatic capitalization, rhyming, and indefinite articles -* Return multiple outputs at once -* Probability modifiers +* Recursive, weighted branching with several selection modes +* Queryable dictionaries +* Automatic capitalization, rhyming, English indefinite articles, and multi-lingual number verbalization +* Print to multiple separate outputs +* Probability modifiers for pattern elements * Loops, conditional statements, and subroutines +* Fully-functional object model * Import/Export resources easily with the .rantpkg format -* Unity3D-ready! -* **And that's just the beginning...** +* Fully-compatible with Unity3D +* *And much, much, much more...* ## Examples -Rant is like a templating language but much more awesome. Here are a few examples of how it works. - -**Liven up a narrative with a few simple queries in your text.** +**Liven up a narrative with a few simple queries.** ``` likes to with pet on . ``` From c5eaf8cd54967480ae403b76313452ff916c055c Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 09:27:39 -0500 Subject: [PATCH 146/213] Update README.md --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 230b723..60a89a3 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,6 @@

- - Build status - - - Build status - -

@@ -104,6 +97,16 @@ If you speak a language besides English and want to translate Rant into your nat ## Learn Rant See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of the API and Rant language, as well as additional example code. +## Build Status + + + Build status + +
+ + Build status + + ## Donating If you love my work, you can support me on [Patreon](https://patreon.com/Berkin) (preferred) or by donating through [PayPal](http://paypal.me/nicholasfleck). Your support helps me make projects like Rant even better. Thank you! From 73b98750ee7bf208a0da13c98b0c514b1b3cd5e1 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 09:29:45 -0500 Subject: [PATCH 147/213] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 60a89a3..ad9bf86 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

- + berkin.me/rant

**Rant** is an all-purpose procedural text engine @@ -15,7 +15,9 @@ code templating, automatic formatting, and more. The goal of the project is to enable developers of all kinds to automate repetitive writing tasks with a high degree of creative freedom. -**[berkin.me/rant](http://berkin.me/rant)** +

+ +

## Features From a53adfe9ea03a2c2183ef16545f720d5064f9022 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 09:37:24 -0500 Subject: [PATCH 148/213] Update README.md --- README.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index ad9bf86..514b893 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,7 @@

-Rant logo -

- -

- berkin.me/rant +Rant logo

+
**Rant** is an all-purpose procedural text engine that is most simply described as the opposite of Regex. @@ -69,7 +66,6 @@ The drug dug the smug plug. --- - ## NuGet Rant is also available as a [NuGet package](https://www.nuget.org/packages/Rant/). Enter this command in your package manager, @@ -85,9 +81,6 @@ Or if development builds are your thing: PM> Install-Package Rant -Pre ``` -## Standard Dictionary -Rant's standard dictionary can be found [**here**](http://github.com/TheBerkin/Rantionary). - ## License Rant is provided under [The MIT License](https://github.com/TheBerkin/Rant/blob/master/LICENSE). @@ -96,8 +89,10 @@ If there is something you want fixed, added, or changed, feel free to submit an If you speak a language besides English and want to translate Rant into your native language, please feel free to write a .lang file for it and send a pull request. -## Learn Rant -See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of the API and Rant language, as well as additional example code. +## Rant Resources +* [Rant Homepage](http://berkin.me/rant) +* [Rant Documentation](http://berkin.me/rantdocs) +* [Rantionary - Rant Standard Dictionary](https://github.com/TheBerkin/Rantionary) ## Build Status @@ -109,6 +104,6 @@ See [berkin.me/rantdocs](http://berkin.me/rantdocs) for full documentation of th Build status -## Donating -If you love my work, you can support me on [Patreon](https://patreon.com/Berkin) (preferred) or by donating through [PayPal](http://paypal.me/nicholasfleck). +## Support My Projects +If you love my work, you can support me on [Patreon](https://patreon.com/Berkin),or alternatively through [PayPal](http://paypal.me/nicholasfleck). Your support helps me make projects like Rant even better. Thank you! From ffc54994100de7c2dd43bcf1cfb2cbd42366d6b0 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 09:41:26 -0500 Subject: [PATCH 149/213] Update README.md --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 514b893..93cb340 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,6 @@ code templating, automatic formatting, and more. The goal of the project is to enable developers of all kinds to automate repetitive writing tasks with a high degree of creative freedom. -

- -

- ## Features * Recursive, weighted branching with several selection modes @@ -105,5 +101,12 @@ If you speak a language besides English and want to translate Rant into your nat ## Support My Projects -If you love my work, you can support me on [Patreon](https://patreon.com/Berkin),or alternatively through [PayPal](http://paypal.me/nicholasfleck). -Your support helps me make projects like Rant even better. Thank you! +
+

+ +

+ +If you love my work, please consider supporting me on [Patreon](https://patreon.com/Berkin). Alternatively, I also accept donations through [PayPal](http://paypal.me/nicholasfleck). +Donations help me make projects like Rant even better. Thank you. + + From 3b2bb89c8aad775c93c3ce082e07e53fb0c73b31 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 09:52:44 -0500 Subject: [PATCH 150/213] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 93cb340..b9bfd5a 100644 --- a/README.md +++ b/README.md @@ -81,9 +81,7 @@ PM> Install-Package Rant -Pre Rant is provided under [The MIT License](https://github.com/TheBerkin/Rant/blob/master/LICENSE). ## Improve Rant -If there is something you want fixed, added, or changed, feel free to submit an issue/pull request. I will try to get back to you within a day. - -If you speak a language besides English and want to translate Rant into your native language, please feel free to write a .lang file for it and send a pull request. +If there is something you want fixed, added, or changed, feel free to submit an issue/pull request; I will try to get back to you within a day. If you would like to translate Rant into your native language, simply write a .lang file for it [like this one here](https://github.com/TheBerkin/Rant/blob/dev-3.0/Rant/Localization/en-US.lang). ## Rant Resources * [Rant Homepage](http://berkin.me/rant) From c32a69f3d459945c25a8f205e15f0142f6ff8d19 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 13:35:34 -0500 Subject: [PATCH 151/213] Add [protect], properly handle internal errors --- Rant/Core/Compiler/Syntax/RstBlock.cs | 14 +- Rant/Core/Compiler/Syntax/RstFunction.cs | 18 +- Rant/Core/Constructs/BlockAttribManager.cs | 63 +++++ Rant/Core/Constructs/BlockManager.cs | 81 ------ Rant/Core/Constructs/BlockState.cs | 8 +- Rant/Core/Constructs/SyncManager.cs | 4 +- Rant/Core/Framework/RantFunctionRegistry.cs | 116 ++++++--- Rant/Core/ObjectModel/RantObject.cs | 5 +- Rant/Core/Output/OutputChainBuffer.cs | 6 +- Rant/Core/Sandbox.State.cs | 11 +- Rant/Core/Sandbox.cs | 258 +++++++++++--------- Rant/Localization/de-DE.lang | 6 + Rant/Localization/en-US.lang | 3 +- Rant/Rant.csproj | 2 +- Rant/RantInternalException.cs | 4 +- 15 files changed, 339 insertions(+), 260 deletions(-) create mode 100644 Rant/Core/Constructs/BlockAttribManager.cs delete mode 100644 Rant/Core/Constructs/BlockManager.cs diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index c124706..176f78e 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -76,7 +76,7 @@ public RstBlock(LineCol location, List items, public override IEnumerator Run(Sandbox sb) { - var attribs = sb.NextAttribs(this); + var attribs = sb.AttribManager.TakeAttribs(); // Skip if chance doesn't fall within range if (attribs.Chance < 100 && sb.RNG.NextDouble(0, 100) > attribs.Chance) @@ -84,7 +84,7 @@ public override IEnumerator Run(Sandbox sb) int next = -1; int reps = attribs.RepEach ? _elements.Count : attribs.Repetitions; - var block = new BlockState(attribs.Repetitions); + var block = new BlockState(reps, attribs); double weightSum = _constantWeightSum; if (attribs.Start != null) yield return attribs.Start; @@ -218,11 +218,12 @@ protected override IEnumerator Serialize(EasyWriter output) { output.Write(true); output.Write(_constantWeightSum); - for (int i = 0; i < _count; i++) - output.Write(_weights[i]); + for (int i = 0; i < _count; i++) output.Write(_weights[i]); } else + { output.Write(false); + } // Write dynamic weights if (_dynamicWeights != null) @@ -235,7 +236,9 @@ protected override IEnumerator Serialize(EasyWriter output) } } else + { output.Write(0); + } } // Block elements @@ -253,8 +256,7 @@ protected override IEnumerator Deserialize(EasyReader input) { input.ReadDouble(out _constantWeightSum); _weights = new double[_count]; - for (int i = 0; i < _count; i++) - input.ReadDouble(out _weights[i]); + for (int i = 0; i < _count; i++) input.ReadDouble(out _weights[i]); } // Read dynamic weights diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index b6c46f9..2c48062 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -65,9 +65,8 @@ public override IEnumerator Run(Sandbox sb) // Convert arguments to their native types int paramc = _funcInfo.Parameters.Length; var args = new object[_argc]; - double d; - RantFunctionParameter p; - for (int i = 0; i < _argc; i++) + RantFunctionParameter p; + for (int i = 0; i < _argc; i++) { p = GetParameter(i); switch (p.RantType) @@ -90,12 +89,17 @@ public override IEnumerator Run(Sandbox sb) sb.AddOutputWriter(); yield return _args[i]; string strNum = sb.Return().Main; - if (!double.TryParse(strNum, out d)) + if (!double.TryParse(strNum, out double d)) { d = 0; - int n; - if (Util.ParseInt(strNum, out n)) d = n; - } + if (Util.ParseInt(strNum, out int n)) + { + d = n; + } + else + { + } + } args[i] = Convert.ChangeType(d, p.NativeType); break; } diff --git a/Rant/Core/Constructs/BlockAttribManager.cs b/Rant/Core/Constructs/BlockAttribManager.cs new file mode 100644 index 0000000..6d83359 --- /dev/null +++ b/Rant/Core/Constructs/BlockAttribManager.cs @@ -0,0 +1,63 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; + +using Rant.Core.Compiler.Syntax; + +namespace Rant.Core.Constructs +{ + internal class BlockAttribManager + { + private Stack _attribStack; + + public BlockAttribManager() + { + _attribStack = new Stack(); + _attribStack.Push(new BlockAttribs()); + } + + public BlockAttribs CurrentAttribs => _attribStack.Peek(); + + public BlockAttribs TakeAttribs() + { + var attribs = _attribStack.Pop(); + _attribStack.Push(new BlockAttribs()); + return attribs; + } + + public void AddLayer() + { + _attribStack.Push(new BlockAttribs()); + } + + public void RemoveLayer() + { + _attribStack.Pop(); + } + } +} \ No newline at end of file diff --git a/Rant/Core/Constructs/BlockManager.cs b/Rant/Core/Constructs/BlockManager.cs deleted file mode 100644 index 4ad357d..0000000 --- a/Rant/Core/Constructs/BlockManager.cs +++ /dev/null @@ -1,81 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.Collections.Generic; -using System.Linq; - -using Rant.Core.Compiler.Syntax; - -namespace Rant.Core.Constructs -{ - internal class BlockManager - { - private readonly Dictionary> _blockList; - private BlockAttribs _prevAttribs; - - public BlockManager() - { - _blockList = new Dictionary>(); - } - - public BlockAttribs SetPrevAttribs(BlockAttribs attribs) - { - _prevAttribs = attribs; - return attribs; - } - - public BlockAttribs GetPrevious() => _prevAttribs; - - public void Add(BlockAttribs attribs, RstBlock block) - { - if (!_blockList.ContainsKey(attribs)) - _blockList.Add(attribs, new List { block }); - else - _blockList[attribs].Add(block); - } - - public void RemoveAttribs(BlockAttribs attribs) - { - if (!_blockList.ContainsKey(attribs)) - throw new InvalidOperationException("Attribs don't exist"); - - _blockList.Remove(attribs); - } - - public void RemoveBlock(BlockAttribs attribs, RstBlock block) - { - if (!_blockList.ContainsKey(attribs)) - throw new InvalidOperationException("Attribs don't exist"); - - if (!_blockList[attribs].Contains(block)) - throw new InvalidOperationException("Block doesn't exist"); - - _blockList[attribs].Remove(block); - } - - public BlockAttribs GetAttribs(RstBlock block) => _blockList.Single(p => p.Value.Contains(block)).Key; - } -} \ No newline at end of file diff --git a/Rant/Core/Constructs/BlockState.cs b/Rant/Core/Constructs/BlockState.cs index c2d0bff..9bf258a 100644 --- a/Rant/Core/Constructs/BlockState.cs +++ b/Rant/Core/Constructs/BlockState.cs @@ -30,14 +30,16 @@ namespace Rant.Core.Constructs /// internal class BlockState { - public BlockState(int count) + public BlockState(int reps, BlockAttribs attribs) { - Count = count; + Repetitions = reps; + Attribs = attribs; } - public int Count { get; } + public int Repetitions { get; } public int Iteration { get; private set; } public int Index { get; private set; } + public BlockAttribs Attribs { get; } public void Next(int index) { diff --git a/Rant/Core/Constructs/SyncManager.cs b/Rant/Core/Constructs/SyncManager.cs index a11b019..3d5f16d 100644 --- a/Rant/Core/Constructs/SyncManager.cs +++ b/Rant/Core/Constructs/SyncManager.cs @@ -58,14 +58,14 @@ public void Create(string name, SyncType type, bool apply) Pinned = _pinQueue.Remove(name) }; } - if (apply) _sb.CurrentBlockAttribs.Sync = sync; + if (apply) _sb.AttribManager.CurrentAttribs.Sync = sync; } public void Apply(string name) { Synchronizer sync; if (_syncTable.TryGetValue(name, out sync)) - _sb.CurrentBlockAttribs.Sync = sync; + _sb.AttribManager.CurrentAttribs.Sync = sync; } public void SetPinned(string name, bool isPinned) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 835a567..410f1ff 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -107,21 +107,21 @@ private static void Endian(Sandbox sb, [RantFunction("init")] [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] - private static void Initial(Sandbox sb, int index) => sb.CurrentBlockAttribs.StartIndex = index; + private static void Initial(Sandbox sb, int index) => sb.AttribManager.CurrentAttribs.StartIndex = index; [RantFunction("rep", "r")] [RantDescription("Sets the repetition count for the next block.")] private static void Rep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times) => sb.CurrentBlockAttribs.Repetitions = times; + [RantDescription("The number of times to repeat the next block.")] int times) => sb.AttribManager.CurrentAttribs.Repetitions = times; [RantFunction] [RantDescription("Sets the repetition count to the number of items in the next block.")] - private static void RepEach(Sandbox sb) => sb.CurrentBlockAttribs.RepEach = true; + private static void RepEach(Sandbox sb) => sb.AttribManager.CurrentAttribs.RepEach = true; [RantFunction("sep")] private static IEnumerator PrintSep(Sandbox sb) { - yield return sb.BlockManager.GetPrevious().Separator; + yield return sb.Blocks.Peek().Attribs.Separator; } [RantFunction("sep", "s")] @@ -129,8 +129,8 @@ private static IEnumerator PrintSep(Sandbox sb) private static void Sep(Sandbox sb, [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) { - sb.CurrentBlockAttribs.IsSeries = false; - sb.CurrentBlockAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.IsSeries = false; + sb.AttribManager.CurrentAttribs.Separator = separator; } [RantFunction("sep", "s")] @@ -139,9 +139,9 @@ private static void Sep(Sandbox sb, [RantDescription("The separator pattern to run between items.")] RST separator, [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) { - sb.CurrentBlockAttribs.IsSeries = true; - sb.CurrentBlockAttribs.Separator = separator; - sb.CurrentBlockAttribs.EndConjunction = conjunction; + sb.AttribManager.CurrentAttribs.IsSeries = true; + sb.AttribManager.CurrentAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; } [RantFunction("sep", "s")] @@ -151,10 +151,10 @@ private static void Sep(Sandbox sb, [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) { - sb.CurrentBlockAttribs.IsSeries = true; - sb.CurrentBlockAttribs.Separator = separator; - sb.CurrentBlockAttribs.EndSeparator = oxford; - sb.CurrentBlockAttribs.EndConjunction = conjunction; + sb.AttribManager.CurrentAttribs.IsSeries = true; + sb.AttribManager.CurrentAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.EndSeparator = oxford; + sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; } [RantFunction("rs")] @@ -163,25 +163,25 @@ private static void RepSep(Sandbox sb, [RantDescription("The number of times to repeat the next block.")] int times, [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) { - sb.CurrentBlockAttribs.IsSeries = false; - sb.CurrentBlockAttribs.Repetitions = times; - sb.CurrentBlockAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.IsSeries = false; + sb.AttribManager.CurrentAttribs.Repetitions = times; + sb.AttribManager.CurrentAttribs.Separator = separator; } [RantFunction] [RantDescription("Sets the prefix pattern for the next block.")] private static void Before(Sandbox sb, - [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.CurrentBlockAttribs.Before = beforeAction; + [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.AttribManager.CurrentAttribs.Before = beforeAction; [RantFunction] [RantDescription("Sets the postfix pattern for the next block.")] private static void After(Sandbox sb, - [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.CurrentBlockAttribs.After = afterAction; + [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.AttribManager.CurrentAttribs.After = afterAction; [RantFunction] [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] private static void Chance(Sandbox sb, - [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.CurrentBlockAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; + [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.AttribManager.CurrentAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; [RantFunction("case", "caps")] [RantDescription("Changes the capitalization mode for all open channels.")] @@ -305,7 +305,7 @@ private static IEnumerator Last(Sandbox sb, { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); - if (block.Iteration == block.Count) yield return action; + if (block.Iteration == block.Repetitions) yield return action; } [RantFunction] @@ -315,7 +315,7 @@ private static IEnumerator NotLast(Sandbox sb, { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); - if (block.Iteration < block.Count) yield return action; + if (block.Iteration < block.Repetitions) yield return action; } [RantFunction] @@ -325,7 +325,7 @@ private static IEnumerator Middle(Sandbox sb, { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); - if (block.Iteration > 1 && block.Iteration < block.Count) yield return action; + if (block.Iteration > 1 && block.Iteration < block.Repetitions) yield return action; } [RantFunction] @@ -335,7 +335,7 @@ private static IEnumerator Ends(Sandbox sb, { if (!sb.Blocks.Any()) yield break; var block = sb.Blocks.Peek(); - if (block.Iteration == 1 || block.Iteration == block.Count) yield return action; + if (block.Iteration == 1 || block.Iteration == block.Repetitions) yield return action; } [RantFunction("repnum", "rn")] @@ -359,7 +359,7 @@ private static void RepElapsed(Sandbox sb) private static void RepCount(Sandbox sb) { if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Count); + sb.Print(sb.Blocks.Peek().Repetitions); } [RantFunction("reprem", "rr")] @@ -368,7 +368,7 @@ private static void RepRem(Sandbox sb) { if (!sb.Blocks.Any()) return; var block = sb.Blocks.Peek(); - sb.Print(block.Count - block.Iteration); + sb.Print(block.Repetitions - block.Iteration); } [RantFunction("repqueued", "rq")] @@ -377,7 +377,7 @@ private static void RepQueued(Sandbox sb) { if (!sb.Blocks.Any()) return; var block = sb.Blocks.Peek(); - sb.Print(block.Count - (block.Iteration - 1)); + sb.Print(block.Repetitions - (block.Iteration - 1)); } [RantFunction] @@ -582,17 +582,17 @@ private static IEnumerator NotNthO(Sandbox sb, [RantFunction] [RantDescription("Sets a pattern that will run before the next block.")] private static void Start(Sandbox sb, - [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.CurrentBlockAttribs.Start = beforePattern; + [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.AttribManager.CurrentAttribs.Start = beforePattern; [RantFunction] [RantDescription("Sets a pattern that will run after the next block.")] private static void End(Sandbox sb, - [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.CurrentBlockAttribs.End = endPattern; + [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.AttribManager.CurrentAttribs.End = endPattern; // TODO: Finish [persist]. //[RantFunction] [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] - private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.CurrentBlockAttribs.Persistence = persistence; + private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.AttribManager.CurrentAttribs.Persistence = persistence; [RantFunction] [RantDescription("Loads and runs a pattern from cache or file.")] @@ -984,23 +984,39 @@ private static void QueryClassFilterNegative(Sandbox sb, string id, params strin } [RantFunction("pipe")] - private static void Redirect(Sandbox sb, RST redirectCallback) + [RantDescription("Redirects the output from the next block into the specified callback. Access block output with [item].")] + private static void Redirect(Sandbox sb, + [RantDescription("The callback to redirect block output to.")] + RST redirectCallback) { - sb.CurrentBlockAttribs.Redirect = redirectCallback; + sb.AttribManager.CurrentAttribs.Redirect = redirectCallback; } [RantFunction("item")] + [RantDescription("Prints the main output from the current block iteration.")] private static void RedirectedItem(Sandbox sb) { sb.Print(sb.GetRedirectedOutput().Main); } [RantFunction("item")] + [RantDescription("Prints the specified channel from the current block iteration.")] private static void RedirectedItem(Sandbox sb, string channel) { sb.Print(sb.GetRedirectedOutput()[channel]); } + [RantFunction("protect")] + [RantDescription("Spawns a new block attribute context for the specified callback so any blocks therein will not consume the current attributes.")] + private static IEnumerator Protect(Sandbox sb, + [RantDescription("The callback to protect.")] + RST pattern) + { + sb.AttribManager.AddLayer(); + yield return pattern; + sb.AttribManager.RemoveLayer(); + } + [RantFunction("vs")] private static void VariableSet(Sandbox sb, string name, string value) { @@ -1049,5 +1065,43 @@ private static IEnumerator VariableGet(Sandbox sb, string name) sb.Print(o); } } + + [RantFunction("add")] + private static void ValAdd(Sandbox sb, double a, double b) + { + sb.Print(a + b); + } + + [RantFunction("addval")] + private static void VarAddVal(Sandbox sb, string a, double b) + { + sb.Objects[a] += new RantObject(b); + } + + [RantFunction("addvar")] + private static void VarAddVar(Sandbox sb, string a, string b) + { + sb.Objects[a] += sb.Objects[b]; + } + + [RantFunction("sub")] + private static void ValSub(Sandbox sb, double a, double b) + { + sb.Print(a - b); + } + + [RantFunction("subval")] + private static void VarSubVal(Sandbox sb, string a, double b) + { + sb.Objects[a] -= new RantObject(b); + } + + [RantFunction("subvar")] + private static void VarSubVar(Sandbox sb, string a, string b) + { + sb.Objects[a] -= sb.Objects[b]; + } + + } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index fa4a517..f343232 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -238,9 +238,8 @@ public RantObject ConvertTo(RantObjectType type) return new RantObject(_boolean ? 1 : 0); case RantObjectType.String: { - double num; - return double.TryParse(_string, out num) ? new RantObject(num) : Null; - } + return double.TryParse(_string, out double num) ? new RantObject(num) : Null; + } } break; } diff --git a/Rant/Core/Output/OutputChainBuffer.cs b/Rant/Core/Output/OutputChainBuffer.cs index 3de09e6..bfec29e 100644 --- a/Rant/Core/Output/OutputChainBuffer.cs +++ b/Rant/Core/Output/OutputChainBuffer.cs @@ -180,15 +180,15 @@ protected void Format(ref string value) { if (Util.IsNullOrWhiteSpace(value)) return; - switch(_charType) + switch (_charType) { case CharConversion.Fullwidth: - value = new string(value.Select(c => CharConverter.ToFullwidth(c)).ToArray()); + value = new string(value.Select(c => CharConverter.ToFullwidth(c)).ToArray()); break; case CharConversion.Cursive: { var sb = new StringBuilder(); - foreach(char c in value) + foreach (char c in value) { sb.Append(CharConverter.ToScript(c)); } diff --git a/Rant/Core/Sandbox.State.cs b/Rant/Core/Sandbox.State.cs index 6e2e379..753d048 100644 --- a/Rant/Core/Sandbox.State.cs +++ b/Rant/Core/Sandbox.State.cs @@ -14,7 +14,7 @@ namespace Rant.Core { internal sealed partial class Sandbox { - private readonly BlockManager _blockManager; + private readonly BlockAttribManager _blockManager; private readonly Stack _outputs; private readonly Stopwatch _stopwatch; private bool _plural = false; @@ -64,18 +64,13 @@ internal sealed partial class Sandbox /// public long StartingGen { get; } - /// - /// Gets the currently set block attributes. - /// - public BlockAttribs CurrentBlockAttribs { get; private set; } = new BlockAttribs(); - /// /// Gets the format used by the interpreter. /// public RantFormat Format { get; } /// - /// Gest the object stack used by the interpreter. + /// Gets the object stack used by the interpreter. /// public ObjectStack Objects { get; } @@ -142,6 +137,6 @@ internal sealed partial class Sandbox /// /// The block manager. /// - public BlockManager BlockManager => _blockManager; + public BlockAttribManager AttribManager => _blockManager; } } diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 2c2d130..a8c32df 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -56,19 +56,19 @@ public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = StartingGen = rng.Generation; Engine = engine; Format = engine.Format; - SizeLimit = new Limit(sizeLimit); + SizeLimit = new Limit(sizeLimit); Pattern = pattern; Objects = new ObjectStack(engine.Objects); Blocks = new Stack(); RegexMatches = new Stack(); CarrierState = carrierState ?? new CarrierState(); SubroutineArgs = new Stack>(); - SyncManager = new SyncManager(this); + SyncManager = new SyncManager(this); PatternArgs = args; // Private members - _blockManager = new BlockManager(); - _stopwatch = new Stopwatch(); + _blockManager = new BlockAttribManager(); + _stopwatch = new Stopwatch(); // Output initialization BaseOutput = new OutputWriter(this); @@ -141,146 +141,165 @@ public void PushRedirectedOutput() public RantOutput GetRedirectedOutput() => _redirOutputs.Count > 0 ? _redirOutputs.Peek() : null; - /// - /// Dequeues the current block attribute set and returns it, queuing a new attribute set. - /// - /// - public BlockAttribs NextAttribs(RstBlock block) - { - var attribs = CurrentBlockAttribs; - - _blockManager.Add(attribs, block); - _blockManager.SetPrevAttribs(attribs); - - switch (attribs.Persistence) - { - case AttribPersistence.Off: - CurrentBlockAttribs = new BlockAttribs(); - break; - - case AttribPersistence.On: - CurrentBlockAttribs = new BlockAttribs(); - break; - - case AttribPersistence.Once: - CurrentBlockAttribs = _blockManager.GetPrevious(); - break; - } - - return attribs; - } - public RantOutput Run(double timeout, RantProgram pattern = null) { - lock (PatternArgs ?? fallbackArgsLockObj) +#if !DEBUG + try { - if (pattern == null) pattern = Pattern; - LastTimeout = timeout; - long timeoutMS = (long)(timeout * 1000); - bool timed = timeoutMS > 0; - bool stopwatchAlreadyRunning = _stopwatch.IsRunning; - if (!_stopwatch.IsRunning) +#endif + lock (PatternArgs ?? fallbackArgsLockObj) { - _stopwatch.Reset(); - _stopwatch.Start(); - } - - var callStack = new Stack>(); - IEnumerator action; + if (pattern == null) pattern = Pattern; + LastTimeout = timeout; + long timeoutMS = (long)(timeout * 1000); + bool timed = timeoutMS > 0; + bool stopwatchAlreadyRunning = _stopwatch.IsRunning; + if (!_stopwatch.IsRunning) + { + _stopwatch.Reset(); + _stopwatch.Start(); + } - // Push the AST root - CurrentAction = pattern.SyntaxTree; - callStack.Push(pattern.SyntaxTree.Run(this)); + var callStack = new Stack>(); + IEnumerator action; - top: - while (callStack.Any()) - { - // Get the topmost call stack item - action = callStack.Peek(); + // Push the AST root + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); - // Execute the node until it runs out of children - while (action.MoveNext()) + top: + while (callStack.Any()) { - if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-pattern-timeout", timeout)); - } + // Get the topmost call stack item + action = callStack.Peek(); - if (callStack.Count >= RantEngine.MaxStackSize) + // Execute the node until it runs out of children + while (action.MoveNext()) { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-stack-overflow", RantEngine.MaxStackSize)); + if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-pattern-timeout", timeout)); + } + + if (callStack.Count >= RantEngine.MaxStackSize) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-stack-overflow", RantEngine.MaxStackSize)); + } + + if (action.Current == null) break; + + // Push child node onto stack and start over + CurrentAction = action.Current; + callStack.Push(CurrentAction.Run(this)); + goto top; } - if (action.Current == null) break; - - // Push child node onto stack and start over - CurrentAction = action.Current; - callStack.Push(CurrentAction.Run(this)); - goto top; + // Remove node once finished + callStack.Pop(); } - // Remove node once finished - callStack.Pop(); - } - - if (!stopwatchAlreadyRunning) _stopwatch.Stop(); + if (!stopwatchAlreadyRunning) _stopwatch.Stop(); - return Return(); + return Return(); + } +#if !DEBUG + } + catch (RantRuntimeException) + { + throw; + } + catch (Exception ex) + { + throw new RantInternalException(ex); } +#endif } public IEnumerable RunSerial(double timeout, RantProgram pattern = null) { + Stack> callStack; + IEnumerator action; + LastTimeout = timeout; + long timeoutMS = (long)(timeout * 1000); + bool timed = timeoutMS > 0; + bool stopwatchAlreadyRunning = _stopwatch.IsRunning; lock (PatternArgs ?? fallbackArgsLockObj) { - if (pattern == null) pattern = Pattern; - LastTimeout = timeout; - long timeoutMS = (long)(timeout * 1000); - bool timed = timeoutMS > 0; - bool stopwatchAlreadyRunning = _stopwatch.IsRunning; - if (!_stopwatch.IsRunning) +#if !DEBUG + try { - _stopwatch.Reset(); - _stopwatch.Start(); - } - - var callStack = new Stack>(); - IEnumerator action; +#endif + if (pattern == null) pattern = Pattern; + + if (!_stopwatch.IsRunning) + { + _stopwatch.Reset(); + _stopwatch.Start(); + } - // Push the AST root - CurrentAction = pattern.SyntaxTree; - callStack.Push(pattern.SyntaxTree.Run(this)); + callStack = new Stack>(); + + // Push the AST root + CurrentAction = pattern.SyntaxTree; + callStack.Push(pattern.SyntaxTree.Run(this)); +#if !DEBUG + } + catch (RantRuntimeException) + { + throw; + } + catch (Exception ex) + { + throw new RantInternalException(ex); + } +#endif top: while (callStack.Any()) { - // Get the topmost call stack item - action = callStack.Peek(); - - // Execute the node until it runs out of children - while (action.MoveNext()) +#if !DEBUG + try { - if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) - { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-pattern-timeout", timeout)); - } +#endif + // Get the topmost call stack item + action = callStack.Peek(); - if (callStack.Count >= RantEngine.MaxStackSize) + // Execute the node until it runs out of children + while (action.MoveNext()) { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-stack-overflow", RantEngine.MaxStackSize)); + if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-pattern-timeout", timeout)); + } + + if (callStack.Count >= RantEngine.MaxStackSize) + { + throw new RantRuntimeException(pattern, action.Current.Location, + GetString("err-stack-overflow", RantEngine.MaxStackSize)); + } + + if (action.Current == null) break; + + // Push child node onto stack and start over + CurrentAction = action.Current; + callStack.Push(CurrentAction.Run(this)); + goto top; } - if (action.Current == null) break; - - // Push child node onto stack and start over - CurrentAction = action.Current; - callStack.Push(CurrentAction.Run(this)); - goto top; +#if !DEBUG + } + catch (RantRuntimeException) + { + throw; + } + catch (Exception ex) + { + throw new RantInternalException(ex); } +#endif if (shouldYield) { @@ -289,8 +308,23 @@ public IEnumerable RunSerial(double timeout, RantProgram pattern = n AddOutputWriter(); } - // Remove node once finished - callStack.Pop(); +#if !DEBUG + try + { +#endif + // Remove node once finished + callStack.Pop(); +#if !DEBUG + } + catch (RantRuntimeException) + { + throw; + } + catch (Exception ex) + { + throw new RantInternalException(ex); + } +#endif } if (!stopwatchAlreadyRunning) _stopwatch.Stop(); diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 50a831f..ba896af 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -67,6 +67,7 @@ err-compiler-incomplete-vchar = "Unvollständiges wörtliches Zeichenliteral." err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" err-runtime-missing-var = "Die Variable '{0}' existiert nicht." +err-runtime-invalid-arg = "Der Wert '{0}' ist für den Parameter '{1}' ungültig ({2} erwartet)." acc-carrier-name = "Anfragezustandspeichernamen" acc-table-name = "Tabellenamen" @@ -75,6 +76,11 @@ acc-syllable-range-value = "Silbenbereichswert" acc-function-name = "Funktionnamen" acc-subroutine-name = "Unterprogrammnamen" acc-arg-name = "Argumentnamen" +acc-number = "Zahl" +acc-string = "Zeichenkette" +acc-pattern = "Vorlage" +acc-mode = "Modus" +acc-flag = "Schalter" missing-table = "[Fehlende Tabelle]" bad-subtype = "[Ungültiger Subtyp]" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 331ed28..6c39eb8 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -30,7 +30,7 @@ err-invalid-weight = "Invalid entry weight value." err-bad-term-count = "Terms per entry must be greater than zero." err-bad-pattern-name = "Invalid pattern name: {0}" err-internal-error = "An internal error has occurred. This is often caused by a bug in Rant." -err-internal-error-msg = "An internal error has occurred. This is often caused by a bug in Rant. Message: {0}." +err-internal-error-msg = "An internal error has occurred. This is often caused by a bug in Rant.\nMessage: {0}" err-pattern-timeout = "The pattern execution timed out ({0} seconds)." err-stack-overflow = "Exceeded the maximum stack size ({0})." @@ -73,6 +73,7 @@ err-table-argc-mismatch = "Argument count mismatch: {0} expects {1}, found {2}" err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" err-runtime-missing-var = "The variable '{0}' does not exist." +err-runtime-invalid-arg = "The value '{0}' is not valid for the parameter '{1}' ({2} expected)." acc-carrier-name = "carrier name" acc-table-name = "table name" diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index f504992..f61fe96 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -175,7 +175,7 @@ - + diff --git a/Rant/RantInternalException.cs b/Rant/RantInternalException.cs index 4736904..67b6c3b 100644 --- a/Rant/RantInternalException.cs +++ b/Rant/RantInternalException.cs @@ -35,8 +35,8 @@ namespace Rant /// public sealed class RantInternalException : Exception { - internal RantInternalException() - : base(Txtres.GetString("err-internal-error")) + internal RantInternalException(Exception inner) + : base(Txtres.GetString("err-internal-error"), inner) { } From 8dbcbc9848b7683444f2d9fcbcf477b978952869 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 13:36:17 -0500 Subject: [PATCH 152/213] Fix small formatting error in runtime exception --- Rant/Core/Compiler/Syntax/RstFunction.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index 2c48062..d61072a 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -98,6 +98,7 @@ public override IEnumerator Run(Sandbox sb) } else { + throw new RantRuntimeException(sb.Pattern, sb.CurrentAction, "err-runtime-invalid-arg", strNum, p.Name, p.RantType.ToString().ToLower()); } } args[i] = Convert.ChangeType(d, p.NativeType); From 750f4459ab6850f43f0deef31bcdbff27d12d385 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 14:26:03 -0500 Subject: [PATCH 153/213] Get rid of old module system, add stack traces to runtime errors --- Rant.Console/Program.cs | 4 +- Rant.Tests/Modules.cs | 41 ---------- Rant.Tests/Rant.Tests.csproj | 1 - Rant/Core/Compiler/Parsing/TagParser.cs | 5 -- Rant/Core/Compiler/RantCompiler.cs | 3 - Rant/Core/Compiler/Syntax/RstBlock.cs | 7 +- .../Core/Compiler/Syntax/RstCallSubroutine.cs | 34 +++----- Rant/Core/Compiler/Syntax/RstFunction.cs | 13 +++- Rant/Core/Compiler/Syntax/RstQuery.cs | 7 +- Rant/Core/Compiler/Syntax/RstSequence.cs | 7 +- Rant/Core/Framework/RantFunctionRegistry.cs | 35 +-------- Rant/Core/Sandbox.State.cs | 15 ---- Rant/Core/Sandbox.cs | 25 ++++-- Rant/Localization/de-DE.lang | 2 +- Rant/Localization/en-US.lang | 2 +- Rant/Rant.csproj | 1 - Rant/RantEngine.cs | 8 -- Rant/RantProgram.cs | 4 - Rant/RantRuntimeException.cs | 35 ++++++--- Rant/Resources/RantModule.cs | 78 ------------------- 20 files changed, 90 insertions(+), 237 deletions(-) delete mode 100644 Rant.Tests/Modules.cs delete mode 100644 Rant/Resources/RantModule.cs diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 3449df2..0bab8b4 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -201,12 +201,12 @@ private static void PrintOutput(RantEngine engine, string source, bool isFile = catch (RantRuntimeException e) { ForegroundColor = ConsoleColor.Red; - WriteLine(e.Message); + WriteLine(e); } catch (RantCompilerException e) { ForegroundColor = ConsoleColor.Yellow; - WriteLine(e.Message); + WriteLine(e); } catch (Exception e) { diff --git a/Rant.Tests/Modules.cs b/Rant.Tests/Modules.cs deleted file mode 100644 index 448aa46..0000000 --- a/Rant.Tests/Modules.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.IO; -using NUnit.Framework; - -using Rant.Resources; - -namespace Rant.Tests -{ - [TestFixture] - public class Modules - { - private readonly RantEngine rant = new RantEngine(); - - [Test] - public void FileModules() - { - File.WriteAllText("rant_module_test.module.rant", "[$[.hey]:Hello, World!]"); - Assert.AreEqual("Hello, World!", rant.Do("[use:rant_module_test][$rant_module_test.hey]").Main); - File.Delete("rant_module_test.module.rant"); - } - - [Test] - public void UserModules() - { - var module = new RantModule("user_module"); - module.AddSubroutineFunction("test", RantProgram.CompileString("[$[.test]:A Good Test]")); - rant.Modules["user_module"] = module; - Assert.AreEqual("A Good Test", rant.Do("[use:user_module][$user_module.test]").Main); - } - - [Test] - public void PackageModules() - { - var package = new RantPackage(); - var pattern = RantProgram.CompileString("[$[.hello_world]:Hello World]"); - pattern.Name = "pkg_test"; - package.AddResource(pattern); - rant.LoadPackage(package); - Assert.AreEqual("Hello World", rant.Do("[use:pkg_test][$pkg_test.hello_world]").Main); - } - } -} diff --git a/Rant.Tests/Rant.Tests.csproj b/Rant.Tests/Rant.Tests.csproj index 04135fb..124998b 100644 --- a/Rant.Tests/Rant.Tests.csproj +++ b/Rant.Tests/Rant.Tests.csproj @@ -67,7 +67,6 @@ - diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index bcc56a5..4ed0c3f 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -148,11 +148,8 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex // subroutine definition if (reader.TakeLoose(R.LeftSquare, false)) { - bool inModule = false; - if (reader.TakeLoose(R.Period)) { - inModule = true; compiler.HasModule = true; } var subroutineName = reader.ReadLoose(R.Text, "acc-subroutine-name"); @@ -189,8 +186,6 @@ private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContex compiler.SetNextActionCallback(actionCallback); subroutine.Body = new RstSequence(actions, bodyStart.ToLocation()); - if (inModule) - compiler.Module.AddActionFunction(subroutineName.Value, subroutine); actionCallback(subroutine); } else diff --git a/Rant/Core/Compiler/RantCompiler.cs b/Rant/Core/Compiler/RantCompiler.cs index 2c427a5..3295708 100644 --- a/Rant/Core/Compiler/RantCompiler.cs +++ b/Rant/Core/Compiler/RantCompiler.cs @@ -39,7 +39,6 @@ internal class RantCompiler private readonly Stack _contextStack = new Stack(); private readonly TokenReader _reader; private readonly string _sourceName; - internal readonly RantModule Module; private List _errors; private Action _nextActionCallback = null; // private List _warnings; @@ -47,8 +46,6 @@ internal class RantCompiler public RantCompiler(string sourceName, string source) { - Module = new RantModule(sourceName); - _sourceName = sourceName; Source = source; _reader = new TokenReader(sourceName, RantLexer.Lex(this, source), this); diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index 176f78e..4b86702 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -102,7 +102,7 @@ public override IEnumerator Run(Sandbox sb) } else if (!double.TryParse(strWeight, out _weights[dw.Item1])) { - throw new RantRuntimeException(sb.Pattern, dw.Item2.Location, + throw new RantRuntimeException(sb, dw.Item2.Location, GetString("err-runtime-invalid-dynamic-weight", strWeight)); } @@ -283,5 +283,10 @@ protected override IEnumerator Deserialize(EasyReader input) _elements.Add(request.Result); } } + + public override string ToString() + { + return $"Block ({_count})"; + } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs index 4e2c9e6..c1817ea 100644 --- a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs @@ -53,30 +53,11 @@ public RstCallSubroutine(LineCol location) : base(location) public override IEnumerator Run(Sandbox sb) { - if (_inModule) - { - if (!sb.Modules.ContainsKey(Name)) - { - throw new RantRuntimeException( - sb.Pattern, - this, - $"The module '{Name}' does not exist or has not been imported." - ); - } - if (sb.Modules[Name][_moduleFunctionName] == null) - { - throw new RantRuntimeException( - sb.Pattern, - this, - $"The function '{_moduleFunctionName}' cannot be found in the module '{Name}'." - ); - } - } - else if (sb.Objects[Name] == null) - throw new RantRuntimeException(sb.Pattern, this, $"The subroutine '{Name}' does not exist."); - var sub = (RstDefineSubroutine)(_inModule ? sb.Modules[Name][_moduleFunctionName] : sb.Objects[Name].Value); + if (sb.Objects[Name] == null) + throw new RantRuntimeException(sb, this, $"The subroutine '{Name}' does not exist."); + var sub = (RstDefineSubroutine)(sb.Objects[Name].Value); if (sub.Parameters.Keys.Count != Arguments.Count) - throw new RantRuntimeException(sb.Pattern, this, "Argument mismatch on subroutine call."); + throw new RantRuntimeException(sb, this, "Argument mismatch on subroutine call."); var action = sub.Body; var args = new Dictionary(); var parameters = sub.Parameters.Keys.ToArray(); @@ -122,5 +103,10 @@ protected override IEnumerator Deserialize(EasyReader input) Arguments.Add(request.Result); } } - } + + public override string ToString() + { + return $"[${Name} ({Arguments.Count})]"; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index d61072a..aa97d5f 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -98,7 +98,7 @@ public override IEnumerator Run(Sandbox sb) } else { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction, "err-runtime-invalid-arg", strNum, p.Name, p.RantType.ToString().ToLower()); + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-arg", strNum, p.Name, p.RantType.ToString().ToLower()); } } args[i] = Convert.ChangeType(d, p.NativeType); @@ -114,7 +114,7 @@ public override IEnumerator Run(Sandbox sb) object value; if (!Util.TryParseEnum(p.NativeType, strMode, out value)) { - throw new RantRuntimeException(sb.Pattern, _args[i].Location, + throw new RantRuntimeException(sb, _args[i].Location, $"Unknown mode value '{strMode}'."); } args[i] = value; @@ -134,7 +134,7 @@ public override IEnumerator Run(Sandbox sb) { if (!Util.TryParseEnum(enumType, flag, out value)) { - throw new RantRuntimeException(sb.Pattern, _args[i].Location, + throw new RantRuntimeException(sb, _args[i].Location, $"Unknown flag value '{flag}'."); } flags |= Convert.ToInt64(value); @@ -182,5 +182,10 @@ protected override IEnumerator Deserialize(EasyReader input) _args.Add(request.Result); } } - } + + public override string ToString() + { + return _funcInfo.ToString(); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstQuery.cs b/Rant/Core/Compiler/Syntax/RstQuery.cs index 4349c47..50a2f98 100644 --- a/Rant/Core/Compiler/Syntax/RstQuery.cs +++ b/Rant/Core/Compiler/Syntax/RstQuery.cs @@ -104,5 +104,10 @@ protected override IEnumerator Deserialize(EasyReader input) yield return complementRequest; _query.Complement = complementRequest.Result; } - } + + public override string ToString() + { + return $"<{_query.Name}...>"; + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstSequence.cs b/Rant/Core/Compiler/Syntax/RstSequence.cs index ff64a77..e0d4bca 100644 --- a/Rant/Core/Compiler/Syntax/RstSequence.cs +++ b/Rant/Core/Compiler/Syntax/RstSequence.cs @@ -71,5 +71,10 @@ protected override IEnumerator Deserialize(EasyReader input) Actions.Add(request.Result); } } - } + + public override string ToString() + { + return "Pattern"; + } + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 410f1ff..70973ed 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -607,12 +607,12 @@ private static IEnumerator Import(Sandbox sb, } catch (RantCompilerException e) { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, + throw new RantRuntimeException(sb, sb.CurrentAction.Location, $"Failed to compile imported pattern '{name}':\n{e.Message}"); } catch (Exception e) { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, + throw new RantRuntimeException(sb, sb.CurrentAction.Location, $"Failed to import '{name}':\n{e.Message}"); } @@ -766,35 +766,6 @@ private static void PrintEmoji(Sandbox sb, [RantDescription("Infers and prints the plural form of the specified word.")] private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); - [RantFunction("use")] - [RantDescription("Loads a module from the file name.module.rant, name.rant, or name, in that order.")] - private static void Use(Sandbox sb, string name) - { - if (sb.UserModules.ContainsKey(name)) - { - sb.Modules[name] = sb.UserModules[name]; - return; - } - if (sb.PackageModules.ContainsKey(name)) - { - sb.Modules[name] = sb.PackageModules[name]; - return; - } - string file; - if (File.Exists(name + ".module.rant")) - file = name + ".module.rant"; - else if (File.Exists(name + ".rant")) - file = name + ".rant"; - else if (File.Exists(name)) - file = name; - else - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"Could not find module '{name}'."); - var pattern = RantProgram.CompileFile(file); - if (pattern.Module == null) - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction.Location, $"No module is defined in {file}."); - sb.Modules[Path.GetFileNameWithoutExtension(name)] = pattern.Module; - } - [RantFunction] [RantDescription("Prints the current length of the specified channel, in characters.")] private static void Len(Sandbox sb, @@ -1053,7 +1024,7 @@ private static IEnumerator VariableGet(Sandbox sb, string name) var o = sb.Objects[name]; if (o == null) { - throw new RantRuntimeException(sb.Pattern, sb.CurrentAction, "err-runtime-missing-var", name); + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", name); } if (o.Type == RantObjectType.Action) diff --git a/Rant/Core/Sandbox.State.cs b/Rant/Core/Sandbox.State.cs index 753d048..97c9c0a 100644 --- a/Rant/Core/Sandbox.State.cs +++ b/Rant/Core/Sandbox.State.cs @@ -24,21 +24,6 @@ internal sealed partial class Sandbox public QueryBuilder QueryBuilder { get; } = new QueryBuilder(); - /// - /// Gets the currently loaded modules. - /// - public Dictionary Modules = new Dictionary(); - - /// - /// Modules that were loaded from packages. - /// - public Dictionary PackageModules = new Dictionary(); - - /// - /// Modules that were not loaded from code, but were provided to RantEngine by the user. - /// - public Dictionary UserModules = new Dictionary(); - /// /// Gets the engine instance to which the sandbox is bound. /// diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index a8c32df..4989568 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -47,6 +47,7 @@ namespace Rant.Core internal sealed partial class Sandbox { private static readonly object fallbackArgsLockObj = new object(); + private readonly Stack _trace = new Stack(); public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = 0, CarrierState carrierState = null, RantProgramArgs args = null) @@ -141,6 +142,17 @@ public void PushRedirectedOutput() public RantOutput GetRedirectedOutput() => _redirOutputs.Count > 0 ? _redirOutputs.Peek() : null; + public string GetStackTrace() + { + var sb = new StringBuilder(); + foreach(var layer in _trace) + { + if (layer is RstSequence && layer != Pattern.SyntaxTree) continue; + sb.AppendLine($" in {layer}, Line {layer.Location.Line}"); + } + return sb.ToString(); + } + public RantOutput Run(double timeout, RantProgram pattern = null) { #if !DEBUG @@ -165,6 +177,7 @@ public RantOutput Run(double timeout, RantProgram pattern = null) // Push the AST root CurrentAction = pattern.SyntaxTree; + _trace.Push(pattern.SyntaxTree); callStack.Push(pattern.SyntaxTree.Run(this)); top: @@ -178,26 +191,28 @@ public RantOutput Run(double timeout, RantProgram pattern = null) { if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) { - throw new RantRuntimeException(pattern, action.Current.Location, + throw new RantRuntimeException(this, action.Current.Location, GetString("err-pattern-timeout", timeout)); } if (callStack.Count >= RantEngine.MaxStackSize) { - throw new RantRuntimeException(pattern, action.Current.Location, - GetString("err-stack-overflow", RantEngine.MaxStackSize)); + throw new RantRuntimeException(this, action.Current.Location, + GetString("err-stack-overflow")); } if (action.Current == null) break; // Push child node onto stack and start over CurrentAction = action.Current; + _trace.Push(action.Current); callStack.Push(CurrentAction.Run(this)); goto top; } // Remove node once finished callStack.Pop(); + _trace.Pop(); } if (!stopwatchAlreadyRunning) _stopwatch.Stop(); @@ -271,13 +286,13 @@ public IEnumerable RunSerial(double timeout, RantProgram pattern = n { if (timed && _stopwatch.ElapsedMilliseconds >= timeoutMS) { - throw new RantRuntimeException(pattern, action.Current.Location, + throw new RantRuntimeException(this, action.Current.Location, GetString("err-pattern-timeout", timeout)); } if (callStack.Count >= RantEngine.MaxStackSize) { - throw new RantRuntimeException(pattern, action.Current.Location, + throw new RantRuntimeException(this, action.Current.Location, GetString("err-stack-overflow", RantEngine.MaxStackSize)); } diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index ba896af..a919a60 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -33,7 +33,7 @@ err-internal-error = "Ein interner Fehler ist aufgetreten. Diese Fehler werden m err-internal-error-msg = "Ein interner Fehler ist aufgetreten. Diese Fehler werden meistens von einem Bug in Rant verursacht. Fehlermeldung: {0}" err-pattern-timeout = "Der Ausführungszeitraum ist abgelaufen ({0} Sekunden)." -err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten (Maximaltiefe: {0})." +err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten." err-generic-runtime = "Ein unspezifizierter Laufzeitfehler ist aufgetreten." err-generic-compiler = "Ein unspezifizierter Erstellungsfehler ist aufgetreten." diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 6c39eb8..116717b 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -33,7 +33,7 @@ err-internal-error = "An internal error has occurred. This is often caused by a err-internal-error-msg = "An internal error has occurred. This is often caused by a bug in Rant.\nMessage: {0}" err-pattern-timeout = "The pattern execution timed out ({0} seconds)." -err-stack-overflow = "Exceeded the maximum stack size ({0})." +err-stack-overflow = "Exceeded the maximum stack size." err-generic-runtime = "An unspecified runtime error was encountered." err-generic-compiler = "An unspecified compiler error was encountered." diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index f61fe96..db2ec0f 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -250,7 +250,6 @@ - diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index dd9497d..bb1f5b5 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -60,7 +60,6 @@ public sealed class RantEngine private RantFormat _format = RantFormat.English; private bool _preserveCarrierState = false; private RantDependencyResolver _resolver = new RantDependencyResolver(); - internal Dictionary PackageModules = new Dictionary(); /// /// Creates a new RantEngine object without a dictionary. @@ -78,11 +77,6 @@ public RantEngine(RantDictionary dictionary) _dictionary = dictionary ?? throw new ArgumentNullException(nameof(dictionary)); } - /// - /// User-defined Rant modules. - /// - public Dictionary Modules { get; } = new Dictionary(); - /// /// The current formatting settings for the engine. /// @@ -255,8 +249,6 @@ public static int MaxStackSize #endif private RantOutput RunVM(Sandbox vm, double timeout) { - vm.UserModules = Modules; - vm.PackageModules = PackageModules; if (_preserveCarrierState && _carrierState == null) _carrierState = vm.CarrierState; return vm.Run(timeout); diff --git a/Rant/RantProgram.cs b/Rant/RantProgram.cs index e05957e..b7380ce 100644 --- a/Rant/RantProgram.cs +++ b/Rant/RantProgram.cs @@ -61,7 +61,6 @@ internal RantProgram(string name, RantProgramOrigin type, string code) Code = code; var compiler = new RantCompiler(name, code); SyntaxTree = compiler.Compile(); - Module = compiler.HasModule ? compiler.Module : null; } internal RantProgram(string name, RantProgramOrigin type, RST rst) @@ -70,7 +69,6 @@ internal RantProgram(string name, RantProgramOrigin type, RST rst) Type = type; Code = null; SyntaxTree = rst; - Module = null; } internal RantProgram() @@ -104,7 +102,6 @@ public string Name public string Code { get; } internal RST SyntaxTree { get; private set; } - internal RantModule Module { get; } /// /// Compiles a program from the specified pattern. @@ -229,7 +226,6 @@ internal override BsonItem SerializeData() internal override void Load(RantEngine engine) { engine.CacheProgramInternal(this); - if (Module != null) engine.PackageModules[Name] = Module; } } } \ No newline at end of file diff --git a/Rant/RantRuntimeException.cs b/Rant/RantRuntimeException.cs index 12ac320..8d15037 100644 --- a/Rant/RantRuntimeException.cs +++ b/Rant/RantRuntimeException.cs @@ -29,6 +29,7 @@ using Rant.Core.Compiler.Syntax; using static Rant.Localization.Txtres; +using Rant.Core; namespace Rant { @@ -37,29 +38,31 @@ namespace Rant /// public sealed class RantRuntimeException : Exception { - internal RantRuntimeException(RantProgram source, LineCol token, string errorMessageType = "err-generic-runtime", + internal RantRuntimeException(Sandbox sb, LineCol token, string errorMessageType = "err-generic-runtime", params object[] errorArgs) : base((token.Index != -1 - ? $"{GetString("src-line-col", source.Name, token.Line, token.Column)} " - : $"({source.Name}) ") + GetString(errorMessageType, errorArgs)) + ? $"{GetString("src-line-col", sb.Pattern.Name, token.Line, token.Column)} " + : $"({sb.Pattern.Name}) ") + GetString(errorMessageType, errorArgs)) { - Code = source.Code; + Code = sb.Pattern.Code; Line = token.Line; Column = token.Column; Index = token.Index; + RantStackTrace = sb.GetStackTrace(); } - internal RantRuntimeException(RantProgram source, RST rst, string errorMessageType = "err-generic-runtime", + internal RantRuntimeException(Sandbox sb, RST rst, string errorMessageType = "err-generic-runtime", params object[] errorArgs) : base(rst == null - ? $"({source.Name}) {GetString(errorMessageType, errorArgs)}" - : $"{GetString("src-line-col", source.Name, rst.Location.Line, rst.Location.Column)} {GetString(errorMessageType, errorArgs)}" + ? $"({sb.Pattern.Name}) {GetString(errorMessageType, errorArgs)}" + : $"{GetString("src-line-col", sb.Pattern.Name, rst.Location.Line, rst.Location.Column)} {GetString(errorMessageType, errorArgs)}" ) { - Code = source.Code; + Code = sb.Pattern.Code; Line = rst?.Location.Line ?? 0; Column = rst?.Location.Column ?? 0; Index = rst?.Location.Index ?? -1; + RantStackTrace = sb.GetStackTrace(); } /// @@ -86,5 +89,19 @@ internal RantRuntimeException(RantProgram source, RST rst, string errorMessageTy /// The source of the error. /// public string Code { get; } - } + + /// + /// The stack trace from the pattern. + /// + public string RantStackTrace { get; } + + /// + /// Returns a string representation of the runtime error, including the message and stack trace. + /// + /// + public override string ToString() + { + return $"{Message}\n\nStack Trace:\n{RantStackTrace}"; + } + } } \ No newline at end of file diff --git a/Rant/Resources/RantModule.cs b/Rant/Resources/RantModule.cs deleted file mode 100644 index e0f546d..0000000 --- a/Rant/Resources/RantModule.cs +++ /dev/null @@ -1,78 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using Rant.Core.Compiler; -using Rant.Core.Compiler.Syntax; -using Rant.Core.ObjectModel; - -namespace Rant.Resources -{ - /// - /// Represents a collection of subroutines that can be loaded and used by other patterns. - /// - public sealed class RantModule - { - private readonly ObjectStack _objects = new ObjectStack(new ObjectTable()); - - /// - /// Creates a new RantModule with the specified name. - /// - /// The name to assign to the module. - public RantModule(string name) - { - Name = name; - } - - /// - /// The name of the module. - /// - public string Name { get; } - - internal RST this[string name] => (RST)_objects[name].Value; - - /// - /// Adds a RantPattern containing a subroutine to this module. - /// - /// The name of the function to add. - /// The pattern that will make up the body of the function. - public void AddSubroutineFunction(string name, RantProgram pattern) - { - var action = pattern.SyntaxTree.GetType() == typeof(RstSequence) - ? ((RstSequence)pattern.SyntaxTree).Actions[0] - : pattern.SyntaxTree; - if (action.GetType() != typeof(RstDefineSubroutine)) - { - throw new RantRuntimeException(pattern, LineCol.Unknown, - "Attempted to add non-subroutine pattern to a module."); - } - _objects[name] = new RantObject(action); - } - - internal void AddActionFunction(string name, RST body) - { - _objects[name] = new RantObject(body); - } - } -} \ No newline at end of file From 851f5fb38b0601cb377b1f9363e449f6489ff248 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 16:16:03 -0500 Subject: [PATCH 154/213] Improve stack trace output --- Rant.Console/Program.cs | 2 +- Rant/Core/Compiler/Syntax/RstBlock.cs | 2 +- Rant/Core/Compiler/Syntax/RstFunction.cs | 2 +- Rant/Core/Sandbox.cs | 4 +++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 0bab8b4..417f65d 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -206,7 +206,7 @@ private static void PrintOutput(RantEngine engine, string source, bool isFile = catch (RantCompilerException e) { ForegroundColor = ConsoleColor.Yellow; - WriteLine(e); + WriteLine(e.Message); } catch (Exception e) { diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index 4b86702..c2fbc2e 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -286,7 +286,7 @@ protected override IEnumerator Deserialize(EasyReader input) public override string ToString() { - return $"Block ({_count})"; + return $"{{ {_count}... }}"; } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index aa97d5f..37ba01e 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -98,7 +98,7 @@ public override IEnumerator Run(Sandbox sb) } else { - throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-arg", strNum, p.Name, p.RantType.ToString().ToLower()); + throw new RantRuntimeException(sb, _args[i], "err-runtime-invalid-arg", strNum, p.Name, p.RantType.ToString().ToLower()); } } args[i] = Convert.ChangeType(d, p.NativeType); diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 4989568..28e091c 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -145,10 +145,12 @@ public void PushRedirectedOutput() public string GetStackTrace() { var sb = new StringBuilder(); + int i = 0; foreach(var layer in _trace) { if (layer is RstSequence && layer != Pattern.SyntaxTree) continue; - sb.AppendLine($" in {layer}, Line {layer.Location.Line}"); + sb.AppendLine($" in {layer} @ ({layer.Location.Line}, {layer.Location.Column})"); + i++; } return sb.ToString(); } From f3deca1f60e83b7b12db1f389352ee331ce00ce4 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 17:02:15 -0500 Subject: [PATCH 155/213] Translate stack trace title --- Rant/Localization/de-DE.lang | 1 + Rant/Localization/en-US.lang | 1 + Rant/RantRuntimeException.cs | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index a919a60..d2aea41 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -1,6 +1,7 @@ untitled-package = "Unbenanntes Paket" default-package-id = "Paket" pattern = "Vorlage" +stack-trace = "Aufrufliste" src-line-col = "({0}: Zeile {1}, Spalte {2})" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 116717b..b05fec4 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -1,6 +1,7 @@ untitled-package = "Untitled Package" default-package-id = "Package" pattern = "Pattern" +stack-trace = "Stack Trace" src-line-col = "({0}: Ln {1}, Col {2})" diff --git a/Rant/RantRuntimeException.cs b/Rant/RantRuntimeException.cs index 8d15037..8cab417 100644 --- a/Rant/RantRuntimeException.cs +++ b/Rant/RantRuntimeException.cs @@ -30,6 +30,7 @@ using static Rant.Localization.Txtres; using Rant.Core; +using Rant.Localization; namespace Rant { @@ -101,7 +102,7 @@ internal RantRuntimeException(Sandbox sb, RST rst, string errorMessageType = "er /// public override string ToString() { - return $"{Message}\n\nStack Trace:\n{RantStackTrace}"; + return $"{Message}\n\n{GetString("stack-trace")}:\n{RantStackTrace}"; } } } \ No newline at end of file From 813ff3a75285042e3542c7d0094bc4b541c9a7a4 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 19:30:09 -0500 Subject: [PATCH 156/213] Localize more error messages --- Rant/Core/Compiler/Syntax/RstCallSubroutine.cs | 6 ++++-- Rant/Core/Compiler/Syntax/RstEscape.cs | 8 ++++++-- Rant/Core/Compiler/Syntax/RstFunction.cs | 12 ++++-------- Rant/Core/Compiler/Syntax/RstReplacer.cs | 7 ++++++- Rant/Localization/de-DE.lang | 4 ++++ Rant/Localization/en-US.lang | 4 ++++ Rant/RantEngine.cs | 2 +- 7 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs index c1817ea..cb376a8 100644 --- a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs @@ -54,10 +54,10 @@ public RstCallSubroutine(LineCol location) : base(location) public override IEnumerator Run(Sandbox sb) { if (sb.Objects[Name] == null) - throw new RantRuntimeException(sb, this, $"The subroutine '{Name}' does not exist."); + throw new RantRuntimeException(sb, this, "err-runtime-missing-subroutine", Name); var sub = (RstDefineSubroutine)(sb.Objects[Name].Value); if (sub.Parameters.Keys.Count != Arguments.Count) - throw new RantRuntimeException(sb, this, "Argument mismatch on subroutine call."); + throw new RantRuntimeException(sb, this, "err-runtime-subarg-mismatch", Name); var action = sub.Body; var args = new Dictionary(); var parameters = sub.Parameters.Keys.ToArray(); @@ -71,7 +71,9 @@ public override IEnumerator Run(Sandbox sb) args[parameters[i]] = new RstText(Location, output.Main); } else + { args[parameters[i]] = Arguments[i]; + } } sb.SubroutineArgs.Push(args); yield return action; diff --git a/Rant/Core/Compiler/Syntax/RstEscape.cs b/Rant/Core/Compiler/Syntax/RstEscape.cs index 9efb2d7..396f0c7 100644 --- a/Rant/Core/Compiler/Syntax/RstEscape.cs +++ b/Rant/Core/Compiler/Syntax/RstEscape.cs @@ -34,8 +34,8 @@ namespace Rant.Core.Compiler.Syntax [RST("eseq")] internal class RstEscape : RST { - private static readonly Dictionary> EscapeTable = new Dictionary - > + private static readonly Dictionary> EscapeTable = + new Dictionary> { { 'n', (sb, c) => sb.Print(new string('\n', c)) }, { @@ -136,9 +136,13 @@ public override IEnumerator Run(Sandbox sb) { Action func; if (!EscapeTable.TryGetValue(_codeHigh, out func)) + { sb.Print(new string(_codeHigh, _times)); + } else + { func(sb, _times); + } } yield break; } diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index 37ba01e..9eb3d4c 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -111,11 +111,9 @@ public override IEnumerator Run(Sandbox sb) sb.AddOutputWriter(); yield return _args[i]; string strMode = sb.Return().Main; - object value; - if (!Util.TryParseEnum(p.NativeType, strMode, out value)) + if (!Util.TryParseEnum(p.NativeType, strMode, out object value)) { - throw new RantRuntimeException(sb, _args[i].Location, - $"Unknown mode value '{strMode}'."); + throw new RantRuntimeException(sb, _args[i].Location, "err-runtime-unknown-mode", strMode); } args[i] = value; break; @@ -129,13 +127,11 @@ public override IEnumerator Run(Sandbox sb) yield return _args[i]; long flags = 0; string strFlags = sb.Return().Main; - object value; foreach (string flag in strFlags.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) { - if (!Util.TryParseEnum(enumType, flag, out value)) + if (!Util.TryParseEnum(enumType, flag, out object value)) { - throw new RantRuntimeException(sb, _args[i].Location, - $"Unknown flag value '{flag}'."); + throw new RantRuntimeException(sb, _args[i].Location, "err-runtime-unknown-flag", flag); } flags |= Convert.ToInt64(value); } diff --git a/Rant/Core/Compiler/Syntax/RstReplacer.cs b/Rant/Core/Compiler/Syntax/RstReplacer.cs index 722234f..7fb999a 100644 --- a/Rant/Core/Compiler/Syntax/RstReplacer.cs +++ b/Rant/Core/Compiler/Syntax/RstReplacer.cs @@ -75,7 +75,7 @@ public override IEnumerator Run(Sandbox sb) protected override IEnumerator Serialize(EasyWriter output) { - output.Write((_regex.Options & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase); // Ignore case? + output.Write((_regex.Options & RegexOptions.IgnoreCase) > 0); // Ignore case? output.Write(_regex.ToString()); yield return _rstSource; yield return _rstMatchEval; @@ -93,5 +93,10 @@ protected override IEnumerator Deserialize(EasyReader input) yield return request; _rstMatchEval = request.Result; } + + public override string ToString() + { + return $"Replacer `{_regex}`{((_regex.Options & RegexOptions.IgnoreCase) > 0 ? "i" : "")}{((_regex.Options & RegexOptions.Multiline) > 0 ? "m" : "")}"; + } } } \ No newline at end of file diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index d2aea41..2d33038 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -69,6 +69,10 @@ err-compiler-incomplete-vchar = "Unvollständiges wörtliches Zeichenliteral." err-runtime-invalid-dynamic-weight = "Vorlage für dynamisches Blockelementgewicht hat einen ungültigen Gewichtswert zurückgegeben: '{0}'" err-runtime-missing-var = "Die Variable '{0}' existiert nicht." err-runtime-invalid-arg = "Der Wert '{0}' ist für den Parameter '{1}' ungültig ({2} erwartet)." +err-runtime-missing-subroutine = "Das Unterprogramm '{0}' konnte nicht gefunden werden." +err-runtime-subarg-mismatch = "Die angegebenen Argumenten passen an die Signatur des Unterprogramms [${0}] nicht an." +err-runtime-unknown-flag = "Unbekannter Schalter: '{0}'" +err-runtime-unknown-mode = "Unbekannter Modus: '{0}'" acc-carrier-name = "Anfragezustandspeichernamen" acc-table-name = "Tabellenamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index b05fec4..d4b6da6 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -75,6 +75,10 @@ err-table-argc-mismatch = "Argument count mismatch: {0} expects {1}, found {2}" err-runtime-invalid-dynamic-weight = "Dynamic weight pattern returned an invalid weight value: '{0}'" err-runtime-missing-var = "The variable '{0}' does not exist." err-runtime-invalid-arg = "The value '{0}' is not valid for the parameter '{1}' ({2} expected)." +err-runtime-missing-subroutine = "The subroutine '{0}' could not be found." +err-runtime-subarg-mismatch = "The provided arguments do not match the signature of the subroutine [${0}]." +err-runtime-unknown-flag = "Unknown flag name: '{0}'" +err-runtime-unknown-mode = "Unknown mode name: '{0}'" acc-carrier-name = "carrier name" acc-table-name = "table name" diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index bb1f5b5..62d6572 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -218,7 +218,7 @@ internal RantProgram GetProgramInternal(string name) #region Static members - private static int _maxStackSize = 64; + private static int _maxStackSize = 128; private static readonly RNG Seeds = new RNG(); static RantEngine() From 248ea89102c282aa7c57e499a438db0e8fed4973 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 21:19:57 -0500 Subject: [PATCH 157/213] Add a whole bunch of object model functions --- Rant/Core/Compiler/Syntax/RstFunction.cs | 27 +++ .../Framework/RantFunctionParameterType.cs | 7 +- .../Framework/RantFunctionRegistry.Loader.cs | 3 + Rant/Core/Framework/RantFunctionRegistry.cs | 187 ++++++++++++++++-- Rant/Core/Framework/RantFunctionSignature.cs | 16 +- Rant/Core/ObjectModel/RantObject.cs | 47 +++++ 6 files changed, 264 insertions(+), 23 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index 9eb3d4c..65f28b7 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -83,6 +83,13 @@ public override IEnumerator Run(Sandbox sb) args[i] = sb.Return().Main; break; + // RantObjects are evaluated and fetched by name + case RantFunctionParameterType.RantObject: + sb.AddOutputWriter(); + yield return _args[i]; + args[i] = sb.Objects[sb.Return().Main]; + break; + // Numbers are evaluated, verified, and converted case RantFunctionParameterType.Number: { @@ -105,6 +112,26 @@ public override IEnumerator Run(Sandbox sb) break; } + case RantFunctionParameterType.Boolean: + { + sb.AddOutputWriter(); + yield return _args[i]; + var val = sb.Return().Main; + if (val.Equals("true", StringComparison.InvariantCultureIgnoreCase)) + { + args[i] = true; + } + else if (val.Equals("false", StringComparison.InvariantCultureIgnoreCase)) + { + args[i] = false; + } + else + { + throw new RantRuntimeException(sb, _args[i], "err-runtime-invalid-arg", val, p.Name, p.RantType.ToString().ToLower()); + } + break; + } + // Modes are parsed into enumeration members case RantFunctionParameterType.Mode: { diff --git a/Rant/Core/Framework/RantFunctionParameterType.cs b/Rant/Core/Framework/RantFunctionParameterType.cs index 767e07c..58d42d7 100644 --- a/Rant/Core/Framework/RantFunctionParameterType.cs +++ b/Rant/Core/Framework/RantFunctionParameterType.cs @@ -58,6 +58,11 @@ public enum RantFunctionParameterType /// /// Parameter is a RantObject. /// - RantObject + RantObject, + + /// + /// Parameter is a boolean. + /// + Boolean } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs index a153dd8..b29e64b 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.Loader.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.Loader.cs @@ -35,6 +35,9 @@ namespace Rant.Core.Framework { internal static partial class RantFunctionRegistry { + private const string TRUE = "true"; + private const string FALSE = "false"; + private static bool _loaded = false; private static readonly Dictionary FunctionTable = diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 70973ed..c807878 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1038,41 +1038,188 @@ private static IEnumerator VariableGet(Sandbox sb, string name) } [RantFunction("add")] - private static void ValAdd(Sandbox sb, double a, double b) + private static void AddVal(Sandbox sb, double a, double b) { sb.Print(a + b); } - [RantFunction("addval")] - private static void VarAddVal(Sandbox sb, string a, double b) + [RantFunction("vadd")] + private static void AddVar(Sandbox sb, string a, double b) { sb.Objects[a] += new RantObject(b); } - [RantFunction("addvar")] - private static void VarAddVar(Sandbox sb, string a, string b) - { - sb.Objects[a] += sb.Objects[b]; - } - [RantFunction("sub")] - private static void ValSub(Sandbox sb, double a, double b) + private static void SubVal(Sandbox sb, double a, double b) { sb.Print(a - b); } - [RantFunction("subval")] - private static void VarSubVal(Sandbox sb, string a, double b) + [RantFunction("vsub")] + private static void SubVar(Sandbox sb, string a, double b) { sb.Objects[a] -= new RantObject(b); } - [RantFunction("subvar")] - private static void VarSubVar(Sandbox sb, string a, string b) - { - sb.Objects[a] -= sb.Objects[b]; - } - - - } + [RantFunction("mul")] + private static void MulVal(Sandbox sb, double a, double b) + { + sb.Print(a * b); + } + + [RantFunction("vmul")] + private static void MulVar(Sandbox sb, string a, double b) + { + sb.Objects[a] *= new RantObject(b); + } + + [RantFunction("div")] + private static void DivVal(Sandbox sb, double a, double b) + { + sb.Print(a / b); + } + + [RantFunction("vdiv")] + private static void DivVar(Sandbox sb, string a, double b) + { + if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); + sb.Objects[a] /= new RantObject(b); + } + + [RantFunction("mod")] + private static void ModVal(Sandbox sb, double a, double b) + { + sb.Print(a % b); + } + + [RantFunction("vmod")] + private static void ModVar(Sandbox sb, string a, double b) + { + if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); + sb.Objects[a] %= new RantObject(b); + } + + [RantFunction("swap")] + private static void Swap(Sandbox sb, string a, string b) + { + var temp = sb.Objects[a]; + sb.Objects[a] = sb.Objects[b]; + sb.Objects[b] = temp; + } + + [RantFunction("veq")] + private static void CompEquals(Sandbox sb, RantObject a, RantObject b) + { + sb.Print(a.Value.Equals(b.Value) ? TRUE : FALSE); + } + + [RantFunction("eq")] + private static void CompEquals(Sandbox sb, string a, string b) + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? TRUE : FALSE); + } + + [RantFunction("eqi")] + private static void CompEqualsIgnoreCase(Sandbox sb, string a, string b) + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? TRUE : FALSE); + } + + [RantFunction("neq")] + private static void CompNotEquals(Sandbox sb, string a, string b) + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? FALSE : TRUE); + } + + [RantFunction("neqi")] + private static void CompNotEqualsIgnoreCase(Sandbox sb, string a, string b) + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? FALSE : TRUE); + } + + [RantFunction("gt")] + private static void CompGreater(Sandbox sb, double a, double b) + { + sb.Print(a > b ? TRUE : FALSE); + } + + [RantFunction("ge")] + private static void CompGreaterEqual(Sandbox sb, double a, double b) + { + sb.Print(a >= b ? TRUE : FALSE); + } + + [RantFunction("lt")] + private static void CompLess(Sandbox sb, double a, double b) + { + sb.Print(a < b ? TRUE : FALSE); + } + + [RantFunction("le")] + private static void CompLessEqual(Sandbox sb, double a, double b) + { + sb.Print(a <= b ? TRUE : FALSE); + } + + [RantFunction("not")] + private static void Not(Sandbox sb, bool a) + { + sb.Print(a ? FALSE : TRUE); + } + + [RantFunction("vnot")] + private static void Not(Sandbox sb, string a) + { + var o = sb.Objects[a]; + if (o == null) + { + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", a); + } + sb.Objects[a] = !o; + } + + [RantFunction("maybe")] + private static void Maybe(Sandbox sb) + { + sb.Print(sb.RNG.NextBoolean() ? TRUE : FALSE); + } + + [RantFunction("if")] + private static IEnumerator If(Sandbox sb, bool condition, RST body) + { + if (condition) yield return body; + } + + [RantFunction("ifnot", "ifn")] + private static IEnumerator IfNot(Sandbox sb, bool condition, RST body) + { + if (!condition) yield return body; + } + + [RantFunction("if")] + private static IEnumerator If(Sandbox sb, bool condition, RST body, RST elseBody) + { + if (condition) + { + yield return body; + } + else + { + yield return elseBody; + } + } + + [RantFunction("ifnot", "ifn")] + private static IEnumerator IfNot(Sandbox sb, bool condition, RST body, RST elseBody) + { + if (!condition) + { + yield return body; + } + else + { + yield return elseBody; + } + } + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionSignature.cs b/Rant/Core/Framework/RantFunctionSignature.cs index 22ca0da..442ed03 100644 --- a/Rant/Core/Framework/RantFunctionSignature.cs +++ b/Rant/Core/Framework/RantFunctionSignature.cs @@ -49,7 +49,7 @@ public RantFunctionSignature(string name, string description, MethodInfo method) { // Sanity checks if (method == null) throw new ArgumentNullException(nameof(method)); - if (!method.IsStatic) throw new ArgumentException($"({method.Name}) Method is not static."); + if (!method.IsStatic) throw new ArgumentException($"({method.Name}) Method must be static."); RawMethod = method; @@ -72,9 +72,13 @@ public RantFunctionSignature(string name, string description, MethodInfo method) type = type.GetElementType(); if (type == typeof(RST) || type.IsSubclassOf(typeof(RST))) + { rantType = RantFunctionParameterType.Pattern; + } else if (type == typeof(string)) + { rantType = RantFunctionParameterType.String; + } else if (type.IsEnum) { rantType = type.GetCustomAttributes(typeof(FlagsAttribute), false).Any() @@ -82,13 +86,21 @@ public RantFunctionSignature(string name, string description, MethodInfo method) : RantFunctionParameterType.Mode; } else if (IOUtil.IsNumericType(type)) + { rantType = RantFunctionParameterType.Number; + } + else if (type == typeof(bool)) + { + rantType = RantFunctionParameterType.Boolean; + } else if (type == typeof(RantObject)) + { rantType = RantFunctionParameterType.RantObject; + } else { throw new ArgumentException( - $"({method.Name}) Unsupported type '{type}' for parameter '{parameters[i].Name}'. Must be a string, number, or RantAction."); + $"({method.Name}) Unsupported type '{type}' for parameter '{parameters[i].Name}'. Must be a string, number, enum, or RantAction."); } // If there is a [RantDescription] attribute on the parameter, retrieve its value. Default to empty string if there isn't one. diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index f343232..e8c2cf3 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -291,6 +291,29 @@ public RantObject Clone() }; } + /// + /// Gets the boolean inverse of a RantObject. + /// + /// The object to invert from. + /// + public static RantObject operator !(RantObject a) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (a.Type) + { + case RantObjectType.Boolean: + return new RantObject(!a._boolean); + } + break; + } + } + + return Null; + } + /// /// Returns the sum of two RantObjects. /// @@ -413,6 +436,30 @@ public RantObject Clone() return Null; } + /// + /// Mods one RantObject by another. + /// + /// The object to mod. + /// The object to mod by. + /// + public static RantObject operator %(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number % b._number); + } + break; + } + } + + return Null; + } + /// /// Returns a string representation of the current RantObject. /// From fd52dd5fb4209e7af0d80648a7690f3a00cea77e Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 22 Mar 2017 21:28:49 -0500 Subject: [PATCH 158/213] Add boolean operators --- Rant/Core/Framework/RantFunctionRegistry.cs | 68 +++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index c807878..2cd63e7 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1178,6 +1178,74 @@ private static void Not(Sandbox sb, string a) sb.Objects[a] = !o; } + [RantFunction("and")] + private static void And(Sandbox sb, bool a, params bool[] b) + { + bool result = a; + if (!a) + { + sb.Print(FALSE); + return; + } + for(int i = 0; i < b.Length; i++) + { + result = result && b[i]; + } + sb.Print(result ? TRUE : FALSE); + } + + [RantFunction("nand")] + private static void Nand(Sandbox sb, bool a, params bool[] b) + { + bool result = a; + if (!a) + { + sb.Print(TRUE); + return; + } + for (int i = 0; i < b.Length; i++) + { + result = result && b[i]; + } + sb.Print(result ? FALSE : TRUE); + } + + [RantFunction("or")] + private static void Or(Sandbox sb, bool a, params bool[] b) + { + if (a) + { + sb.Print(TRUE); + return; + } + for (int i = 0; i < b.Length; i++) + { + if (!b[i]) continue; + sb.Print(TRUE); + return; + } + sb.Print(FALSE); + } + + [RantFunction("xor")] + private static void Xor(Sandbox sb, bool a, params bool[] b) + { + bool x = a; + for (int i = 0; i < b.Length; i++) + { + if (b[i]) + { + if (x) + { + sb.Print(FALSE); + return; + } + x = b[i]; + } + } + sb.Print(x ? TRUE : FALSE); + } + [RantFunction("maybe")] private static void Maybe(Sandbox sb) { From 0f7b374e82ed36e7fa896c4b39d2e0e42e0210cf Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 23 Mar 2017 16:50:44 -0500 Subject: [PATCH 159/213] Compiler and runtime optimizations --- Rant/Core/Compiler/Parsing/BlockParser.cs | 81 ++-- Rant/Core/Compiler/Parsing/TagParser.cs | 434 +++++++++++----------- Rant/Core/Sandbox.State.cs | 42 ++- Rant/Core/Sandbox.cs | 7 +- Rant/Core/Utilities/Util.cs | 258 ++++++++++--- 5 files changed, 506 insertions(+), 316 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index e0e35d9..c9274b6 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -30,33 +30,33 @@ namespace Rant.Core.Compiler.Parsing { - internal class BlockParser : Parser - { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - var blockStartToken = reader.PrevLooseToken; - var items = new List(); - var actions = new List(); + internal class BlockParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + var blockStartToken = reader.PrevLooseToken; + var items = new List(); + var actions = new List(); - // "why are these not lists or arrays" i yell into the void, too lazy to find out why - List<_> constantWeights = null; - List<_> dynamicWeights = null; - int blockNumber = 0; - Action itemCallback = action => actions.Add(action); + // "why are these not lists or arrays" i yell into the void, too lazy to find out why + List<_> constantWeights = null; + List<_> dynamicWeights = null; + int blockNumber = 0; + Action itemCallback = action => actions.Add(action); - compiler.AddContext(CompileContext.BlockEndSequence); - compiler.AddContext(CompileContext.BlockSequence); + compiler.AddContext(CompileContext.BlockEndSequence); + compiler.AddContext(CompileContext.BlockSequence); - while (compiler.NextContext == CompileContext.BlockSequence) - { - // block weight - if (reader.PeekLooseToken().Type == R.LeftParen) - { - constantWeights = constantWeights ?? (constantWeights = new List<_>()); - dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); + while (compiler.NextContext == CompileContext.BlockSequence) + { + // block weight + if (reader.PeekLooseToken().Type == R.LeftParen) + { + constantWeights = constantWeights ?? (constantWeights = new List<_>()); + dynamicWeights = dynamicWeights ?? (dynamicWeights = new List<_>()); - var firstToken = reader.ReadLooseToken(); + var firstToken = reader.ReadLooseToken(); List sequence = new List(); Action cb = rst => sequence.Add(rst); @@ -81,20 +81,29 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext else dynamicWeights.Add(new _(blockNumber, new RstSequence(sequence, sequence[0].Location))); } - } + } - compiler.SetNextActionCallback(itemCallback); - var startToken = reader.PeekToken(); - yield return Get(); - items.Add(new RstSequence(actions, startToken.ToLocation())); - actions.Clear(); - blockNumber++; - } + compiler.SetNextActionCallback(itemCallback); + var startToken = reader.PeekToken(); + yield return Get(); - compiler.LeaveContext(); - compiler.SetNextActionCallback(actionCallback); + // Don't wrap single nodes in a sequence, it's unnecessary + if (actions.Count == 1) + { + items.Add(actions[0]); + } + else + { + items.Add(new RstSequence(actions, startToken.ToLocation())); + } + actions.Clear(); + blockNumber++; + } - actionCallback(new RstBlock(blockStartToken.ToLocation(), items, dynamicWeights, constantWeights)); - } - } + compiler.LeaveContext(); + compiler.SetNextActionCallback(actionCallback); + + actionCallback(new RstBlock(blockStartToken.ToLocation(), items, dynamicWeights, constantWeights)); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Parsing/TagParser.cs b/Rant/Core/Compiler/Parsing/TagParser.cs index 4ed0c3f..b463a5d 100644 --- a/Rant/Core/Compiler/Parsing/TagParser.cs +++ b/Rant/Core/Compiler/Parsing/TagParser.cs @@ -32,211 +32,231 @@ namespace Rant.Core.Compiler.Parsing { - internal class TagParser : Parser - { - public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - var nextType = reader.PeekType(); - - var tagStart = reader.PrevToken; - - // replacer - switch (nextType) - { - case R.Regex: - { - var regex = reader.Read(R.Regex, "acc-replacer-regex"); - var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; - if (reader.IsNext(R.RegexFlags)) - { - var flagsToken = reader.ReadToken(); - foreach (char flag in flagsToken.Value) - { - switch (flag) - { - case 'i': - options |= RegexOptions.IgnoreCase; - break; - case 'm': - options |= RegexOptions.Multiline; - break; - } - } - } - - reader.Read(R.Colon); - - var arguments = new List(); - - var iterator = ReadArguments(compiler, reader, arguments); - while (iterator.MoveNext()) - yield return iterator.Current; - - compiler.SetNextActionCallback(actionCallback); - - if (arguments.Count != 2) - { - compiler.SyntaxError(tagStart, reader.PrevToken, false, "err-compiler-replacer-argcount"); - yield break; - } - - actionCallback(new RstReplacer(regex.ToLocation(), new Regex(regex.Value, options), arguments[0], arguments[1])); - } - break; - case R.Dollar: - { - reader.ReadToken(); - var e = ParseSubroutine(compiler, context, reader, actionCallback); - while (e.MoveNext()) - yield return e.Current; - } - break; - default: - { - var e = ParseFunction(compiler, context, reader, actionCallback); - while (e.MoveNext()) - yield return e.Current; - } - break; - } - } - - private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - var functionName = reader.Read(R.Text, "acc-function-name"); - - var arguments = new List(); - - if (reader.PeekType() == R.Colon) - { - reader.ReadToken(); - - var iterator = ReadArguments(compiler, reader, arguments); - while (iterator.MoveNext()) - yield return iterator.Current; - - compiler.SetNextActionCallback(actionCallback); - } - else - reader.Read(R.RightSquare); - - RantFunctionSignature sig = null; - - if (functionName.Value != null) - { - if (!RantFunctionRegistry.FunctionExists(functionName.Value)) - { - compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-function", functionName.Value); - yield break; - } - - if ((sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count)) == null) - { - compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-overload", functionName.Value, arguments.Count); - yield break; - } - - actionCallback(new RstFunction(functionName.ToLocation(), sig, arguments)); - } - } - - private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, - Action actionCallback) - { - // subroutine definition - if (reader.TakeLoose(R.LeftSquare, false)) - { - if (reader.TakeLoose(R.Period)) - { - compiler.HasModule = true; - } - var subroutineName = reader.ReadLoose(R.Text, "acc-subroutine-name"); - var subroutine = new RstDefineSubroutine(subroutineName.ToLocation()) - { - Parameters = new Dictionary(), - Name = subroutineName.Value - }; - - if (reader.PeekLooseToken().Type == R.Colon) - { - reader.ReadLooseToken(); - - do - { - var type = SubroutineParameterType.Greedy; - if (reader.TakeLoose(R.At)) - type = SubroutineParameterType.Loose; - - subroutine.Parameters[reader.ReadLoose(R.Text, "argument name").Value] = type; - } while (reader.TakeLoose(R.Semicolon, false)); - } - - reader.ReadLoose(R.RightSquare); - - var bodyStart = reader.ReadLoose(R.Colon); - - var actions = new List(); - Action bodyActionCallback = action => actions.Add(action); - - compiler.AddContext(CompileContext.SubroutineBody); - compiler.SetNextActionCallback(bodyActionCallback); - yield return Get(); - compiler.SetNextActionCallback(actionCallback); - - subroutine.Body = new RstSequence(actions, bodyStart.ToLocation()); - actionCallback(subroutine); - } - else - { - // subroutine call - var subroutineName = reader.Read(R.Text, "acc-subroutine-name"); - string moduleFunctionName = null; - - if (reader.TakeLoose(R.Period, false)) - moduleFunctionName = reader.Read(R.Text, "module function name").Value; - - var arguments = new List(); - - if (reader.PeekType() == R.Colon) - { - reader.ReadToken(); - - var iterator = ReadArguments(compiler, reader, arguments); - while (iterator.MoveNext()) - yield return iterator.Current; - - compiler.SetNextActionCallback(actionCallback); - } - else - reader.Read(R.RightSquare); - - var subroutine = new RstCallSubroutine(subroutineName.Value, subroutineName.ToLocation(), moduleFunctionName) { Arguments = arguments }; - - actionCallback(subroutine); - } - } - - private IEnumerator ReadArguments(RantCompiler compiler, TokenReader reader, List arguments) - { - var actions = new List(); - - Action argActionCallback = action => actions.Add(action); - compiler.SetNextActionCallback(argActionCallback); - compiler.AddContext(CompileContext.FunctionEndContext); - compiler.AddContext(CompileContext.ArgumentSequence); - - while (compiler.NextContext == CompileContext.ArgumentSequence) - { - reader.SkipSpace(); - var startToken = reader.PeekToken(); - yield return Get(); - arguments.Add(new RstSequence(actions, startToken.ToLocation())); - actions.Clear(); - } - - compiler.LeaveContext(); - } - } + internal class TagParser : Parser + { + public override IEnumerator Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + var nextType = reader.PeekType(); + + var tagStart = reader.PrevToken; + + // replacer + switch (nextType) + { + case R.Regex: + { + var regex = reader.Read(R.Regex, "acc-replacer-regex"); + var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; + if (reader.IsNext(R.RegexFlags)) + { + var flagsToken = reader.ReadToken(); + foreach (char flag in flagsToken.Value) + { + switch (flag) + { + case 'i': + options |= RegexOptions.IgnoreCase; + break; + case 'm': + options |= RegexOptions.Multiline; + break; + } + } + } + + reader.Read(R.Colon); + + var arguments = new List(); + + var iterator = ReadArguments(compiler, reader, arguments); + while (iterator.MoveNext()) + yield return iterator.Current; + + compiler.SetNextActionCallback(actionCallback); + + if (arguments.Count != 2) + { + compiler.SyntaxError(tagStart, reader.PrevToken, false, "err-compiler-replacer-argcount"); + yield break; + } + + actionCallback(new RstReplacer(regex.ToLocation(), new Regex(regex.Value, options), arguments[0], arguments[1])); + } + break; + case R.Dollar: + { + reader.ReadToken(); + var e = ParseSubroutine(compiler, context, reader, actionCallback); + while (e.MoveNext()) + yield return e.Current; + } + break; + default: + { + var e = ParseFunction(compiler, context, reader, actionCallback); + while (e.MoveNext()) + yield return e.Current; + } + break; + } + } + + private IEnumerator ParseFunction(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + var functionName = reader.Read(R.Text, "acc-function-name"); + + var arguments = new List(); + + if (reader.PeekType() == R.Colon) + { + reader.ReadToken(); + + var iterator = ReadArguments(compiler, reader, arguments); + while (iterator.MoveNext()) + yield return iterator.Current; + + compiler.SetNextActionCallback(actionCallback); + } + else + { + reader.Read(R.RightSquare); + } + + RantFunctionSignature sig = null; + + if (functionName.Value != null) + { + if (!RantFunctionRegistry.FunctionExists(functionName.Value)) + { + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-function", functionName.Value); + yield break; + } + + if ((sig = RantFunctionRegistry.GetFunction(functionName.Value, arguments.Count)) == null) + { + compiler.SyntaxError(functionName, false, "err-compiler-nonexistent-overload", functionName.Value, arguments.Count); + yield break; + } + + actionCallback(new RstFunction(functionName.ToLocation(), sig, arguments)); + } + } + + private IEnumerator ParseSubroutine(RantCompiler compiler, CompileContext context, TokenReader reader, + Action actionCallback) + { + // subroutine definition + if (reader.TakeLoose(R.LeftSquare, false)) + { + if (reader.TakeLoose(R.Period)) + { + compiler.HasModule = true; + } + var subroutineName = reader.ReadLoose(R.Text, "acc-subroutine-name"); + var subroutine = new RstDefineSubroutine(subroutineName.ToLocation()) + { + Parameters = new Dictionary(), + Name = subroutineName.Value + }; + + if (reader.PeekLooseToken().Type == R.Colon) + { + reader.ReadLooseToken(); + + do + { + var type = SubroutineParameterType.Greedy; + if (reader.TakeLoose(R.At)) + type = SubroutineParameterType.Loose; + + subroutine.Parameters[reader.ReadLoose(R.Text, "acc-arg-name").Value] = type; + } while (reader.TakeLoose(R.Semicolon, false)); + } + + reader.ReadLoose(R.RightSquare); + + var bodyStart = reader.ReadLoose(R.Colon); + + var actions = new List(); + Action bodyActionCallback = action => actions.Add(action); + + compiler.AddContext(CompileContext.SubroutineBody); + compiler.SetNextActionCallback(bodyActionCallback); + yield return Get(); + compiler.SetNextActionCallback(actionCallback); + if (actions.Count == 1) + { + subroutine.Body = actions[0]; + } + else + { + subroutine.Body = new RstSequence(actions, bodyStart.ToLocation()); + } + actionCallback(subroutine); + } + else + { + // subroutine call + var subroutineName = reader.Read(R.Text, "acc-subroutine-name"); + string moduleFunctionName = null; + + if (reader.TakeLoose(R.Period, false)) + moduleFunctionName = reader.Read(R.Text, "module function name").Value; + + var arguments = new List(); + + if (reader.PeekType() == R.Colon) + { + reader.ReadToken(); + + var iterator = ReadArguments(compiler, reader, arguments); + while (iterator.MoveNext()) + yield return iterator.Current; + + compiler.SetNextActionCallback(actionCallback); + } + else + { + reader.Read(R.RightSquare); + } + + var subroutine = new RstCallSubroutine(subroutineName.Value, subroutineName.ToLocation(), moduleFunctionName) { Arguments = arguments }; + + actionCallback(subroutine); + } + } + + private IEnumerator ReadArguments(RantCompiler compiler, TokenReader reader, List arguments) + { + var actions = new List(); + + Action argActionCallback = action => actions.Add(action); + compiler.SetNextActionCallback(argActionCallback); + compiler.AddContext(CompileContext.FunctionEndContext); + compiler.AddContext(CompileContext.ArgumentSequence); + + while (compiler.NextContext == CompileContext.ArgumentSequence) + { + reader.SkipSpace(); + var startToken = reader.PeekToken(); + yield return Get(); + + // Don't wrap single nodes in a sequence, it's unnecessary + if (actions.Count == 1) + { + arguments.Add(actions[0]); + } + else + { + arguments.Add(new RstSequence(actions, startToken.ToLocation())); + } + + actions.Clear(); + } + + compiler.LeaveContext(); + } + } } \ No newline at end of file diff --git a/Rant/Core/Sandbox.State.cs b/Rant/Core/Sandbox.State.cs index 97c9c0a..91faa56 100644 --- a/Rant/Core/Sandbox.State.cs +++ b/Rant/Core/Sandbox.State.cs @@ -21,6 +21,13 @@ internal sealed partial class Sandbox private int _quoteLevel = 0; private bool shouldYield = false; private Stack _redirOutputs; + private HashSet _conditionFlags; + private ObjectStack _objectStack; + private Stack> _subArgs; + private CarrierState _carrierState; + private Stack _matches; + private Stack _blocks; + private SyncManager _syncManager; public QueryBuilder QueryBuilder { get; } = new QueryBuilder(); @@ -57,22 +64,34 @@ internal sealed partial class Sandbox /// /// Gets the object stack used by the interpreter. /// - public ObjectStack Objects { get; } + public ObjectStack Objects + { + get { return _objectStack ?? (_objectStack = new ObjectStack(Engine.Objects)); } + } /// /// Gets the block state stack. /// - public Stack Blocks { get; } + public Stack Blocks + { + get { return _blocks ?? (_blocks = new Stack()); } + } /// /// Gets the replacer match stack. The topmost item is the current match for the current replacer. /// - public Stack RegexMatches { get; } + public Stack RegexMatches + { + get { return _matches ?? (_matches = new Stack()); } + } /// /// Gets the current query state. /// - public CarrierState CarrierState { get; } + public CarrierState CarrierState + { + get { return _carrierState ?? (_carrierState = new CarrierState()); } + } /// /// Gets the current RantPattern. @@ -82,12 +101,18 @@ internal sealed partial class Sandbox /// /// Subroutine argument stack. /// - public Stack> SubroutineArgs { get; } + public Stack> SubroutineArgs + { + get { return _subArgs ?? (_subArgs = new Stack>()); } + } /// /// Gets the synchronizer manager instance for the current Sandbox. /// - public SyncManager SyncManager { get; } + public SyncManager SyncManager + { + get { return _syncManager ?? (_syncManager = new SyncManager(this)); } + } /// /// Gets the size limit for the pattern. @@ -112,7 +137,10 @@ internal sealed partial class Sandbox /// /// Gets a collection of the flags currently being used for the flag condition. /// - public HashSet ConditionFlags { get; } = new HashSet(); + public HashSet ConditionFlags + { + get { return (_conditionFlags ?? (_conditionFlags = new HashSet())); } + } /// /// Gets the arguments passed to the pattern. diff --git a/Rant/Core/Sandbox.cs b/Rant/Core/Sandbox.cs index 28e091c..92c4111 100644 --- a/Rant/Core/Sandbox.cs +++ b/Rant/Core/Sandbox.cs @@ -59,17 +59,12 @@ public Sandbox(RantEngine engine, RantProgram pattern, RNG rng, int sizeLimit = Format = engine.Format; SizeLimit = new Limit(sizeLimit); Pattern = pattern; - Objects = new ObjectStack(engine.Objects); - Blocks = new Stack(); - RegexMatches = new Stack(); - CarrierState = carrierState ?? new CarrierState(); - SubroutineArgs = new Stack>(); - SyncManager = new SyncManager(this); PatternArgs = args; // Private members _blockManager = new BlockAttribManager(); _stopwatch = new Stopwatch(); + _carrierState = carrierState; // Output initialization BaseOutput = new OutputWriter(this); diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index cefc7d3..7afc07a 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -90,70 +90,208 @@ public static int HashOf(params object[] objects) return unchecked(objects.Select(o => o.GetHashCode()).Aggregate(17, (hash, next) => hash * 31 + next)); } - public static bool ParseInt(string value, out int number) - { - if (int.TryParse(value, out number)) return true; - if (IsNullOrWhiteSpace(value)) return false; - value = value.Trim(); - if (!char.IsLetter(value[value.Length - 1])) return false; - char power = value[value.Length - 1]; - value = value.Substring(0, value.Length - 1); - if (IsNullOrWhiteSpace(value)) return false; - double n; - if (!double.TryParse(value, out n)) return false; - switch (power) - { - case 'k': // Thousand - number = (int)(n * 1000); - return true; - case 'M': // Million - number = (int)(n * 1000000); - return true; - case 'B': // Billion - number = (int)(n * 1000000000); - return true; - default: - return false; - } - } + public static bool ParseInt(string str, out int number) + { + unchecked + { + int n = number = 0; + int l = str.Length - 1; + for (int i = l, x = 1; i >= 0; i--, x *= 10) + { + switch (str[i]) + { + case '-': + if (i == 0) + { + number = -n; + return true; + } + return false; - public static bool ParseDouble(string value, out double number) - { - number = 0; - if (IsNullOrWhiteSpace(value)) return false; - value = value.Trim(); - if (!char.IsLetter(value[value.Length - 1])) - return double.TryParse(value, out number); - char power = value[value.Length - 1]; - value = value.Substring(0, value.Length - 1); - if (IsNullOrWhiteSpace(value)) return false; - double n; - if (!double.TryParse(value, out n)) return false; - switch (power) - { - case 'k': // Thousand - number = (int)(n * 1000); - return true; - case 'M': // Million - number = (int)(n * 1000000); - return true; - case 'B': // Billion - number = (int)(n * 1000000000); - return true; - default: - return false; - } - } + case '0': + continue; + + case '1': + n += x; + break; + + case '2': + n += 2 * x; + break; + + case '3': + n += 3 * x; + break; + + case '4': + n += 4 * x; + break; + + case '5': + n += 5 * x; + break; + + case '6': + n += 6 * x; + break; + + case '7': + n += 7 * x; + break; + + case '8': + n += 8 * x; + break; + + case '9': + n += 9 * x; + break; + + default: + return false; + } + } + number = n; + return true; + } + } + + public static bool ParseDouble(string str, out double d) + { + unchecked + { + double num = d = 0.0; + if (str.Length == 0) return false; + int l = str.Length; + int ones = l - 1; + double x = 0.1; + + for (int i = 0; i < l; i++) + { + if (str[i] == '.') + { + ones = i - 1; + for (i++; i < l; i++, x /= 10.0) + { + switch (str[i]) + { + case '0': + continue; + + case '1': + num += x; + break; - public static bool BooleanRep(string input) + case '2': + num += x * 2; + break; + + case '3': + num += x * 3; + break; + + case '4': + num += x * 4; + break; + + case '5': + num += x * 5; + break; + + case '6': + num += x * 6; + break; + + case '7': + num += x * 7; + break; + + case '8': + num += x * 8; + break; + + case '9': + num += x * 9; + break; + + default: + return false; + } + } + break; + } + } + + x = 1.0; + for (int i = ones; i >= 0; i--, x *= 10.0) + { + switch (str[i]) + { + case '-': + if (i == 0) + { + d = -num; + return true; + } + return false; + + case '0': + continue; + + case '1': + num += x; + break; + + case '2': + num += x * 2; + break; + + case '3': + num += x * 3; + break; + + case '4': + num += x * 4; + break; + + case '5': + num += x * 5; + break; + + case '6': + num += x * 6; + break; + + case '7': + num += x * 7; + break; + + case '8': + num += x * 8; + break; + + case '9': + num += x * 9; + break; + + default: + return false; + } + } + + d = num; + return true; + } + } + + public static bool BooleanRep(string input) { if (IsNullOrWhiteSpace(input)) return false; - string v = input.ToLower().Trim(); - if (v == "false" || v == "0") return false; - if (v == "true") return true; - double d; - return double.TryParse(v, out d); - } + string v = input.Trim(); + if (String.Equals(v, "false", StringComparison.InvariantCultureIgnoreCase) || v == "0") return false; + if (String.Equals(v, "true", StringComparison.InvariantCultureIgnoreCase)) return true; + return ParseDouble(v, out double d); + } public static string SnakeToCamel(string name) { From 201fc4cb621d890c70341110971a7070969f96fb Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 23 Mar 2017 18:56:34 -0500 Subject: [PATCH 160/213] Make RantObject sealed --- Rant/Core/ObjectModel/RantObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index e8c2cf3..e9a2456 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -35,7 +35,7 @@ namespace Rant.Core.ObjectModel /// /// Represents a Rant variable. /// - public class RantObject + public sealed class RantObject { /// /// Null From 58e1282af3698b7d2b32ab617d430c7fea563716 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 24 Mar 2017 14:46:06 -0500 Subject: [PATCH 161/213] Modularize Rant cmdline tools --- Rant.Console/Program.cs | 396 ++++++++++++------------ Rant.Console/Properties/AssemblyInfo.cs | 4 +- Rant.Tools/Command.cs | 160 ++++++++++ Rant.Tools/CommandFlagAttribute.cs | 39 +++ Rant.Tools/CommandNameAttribute.cs | 41 +++ Rant.Tools/CommandParamAttribute.cs | 42 +++ Rant.Tools/Commands/BuildCommand.cs | 58 ++++ Rant.Tools/Commands/PackCommand.cs | 175 +++++++++++ Rant.Tools/Help.cs | 53 ---- Rant.Tools/Packer/PackGenerator.cs | 157 ---------- Rant.Tools/Program.cs | 90 ++---- Rant.Tools/Properties/AssemblyInfo.cs | 8 +- Rant.Tools/Rant.Tools.csproj | 10 +- Rant/Rant.csproj | 4 +- 14 files changed, 754 insertions(+), 483 deletions(-) create mode 100644 Rant.Tools/Command.cs create mode 100644 Rant.Tools/CommandFlagAttribute.cs create mode 100644 Rant.Tools/CommandNameAttribute.cs create mode 100644 Rant.Tools/CommandParamAttribute.cs create mode 100644 Rant.Tools/Commands/BuildCommand.cs create mode 100644 Rant.Tools/Commands/PackCommand.cs delete mode 100644 Rant.Tools/Help.cs delete mode 100644 Rant.Tools/Packer/PackGenerator.cs diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 417f65d..1ef0a21 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -15,51 +15,51 @@ namespace RantConsole { - internal class Program - { + internal class Program + { #if !DEBUG - public const double PATTERN_TIMEOUT = 10.0; + public const double PATTERN_TIMEOUT = 10.0; #else public const double PATTERN_TIMEOUT = 0.0; #endif - public static readonly string FILE = GetPaths().FirstOrDefault(); - public static readonly string PKG_DIR = Property("pkgdir"); - public static readonly string LEGACY_DIC_PATH = Property("ldict"); - public static readonly long SEED; - public static readonly bool USE_SEED; + public static readonly string FILE = GetPaths().FirstOrDefault(); + public static readonly string PKG_DIR = Property("pkgdir"); + public static readonly string LEGACY_DIC_PATH = Property("ldict"); + public static readonly long SEED; + public static readonly bool USE_SEED; - static Program() - { - USE_SEED = long.TryParse(Property("seed"), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out SEED); - } + static Program() + { + USE_SEED = long.TryParse(Property("seed"), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out SEED); + } - private static void Main(string[] args) - { - OutputEncoding = Encoding.Unicode; - Title = "Rant Console" + (Flag("nsfw") ? " [NSFW]" : ""); + private static void Main(string[] args) + { + OutputEncoding = Encoding.Unicode; + Title = "Rant Console" + (Flag("nsfw") ? " [NSFW]" : ""); - var rant = new RantEngine(); + var rant = new RantEngine(); #if !DEBUG - try - { + try + { #endif - if(!string.IsNullOrEmpty(LEGACY_DIC_PATH)) - { - var tables = - Directory - .GetFiles(LEGACY_DIC_PATH) - .Where(f => Path.GetExtension(f) == ".dic") - .Select(f => RantDictionaryTable.FromLegacyFile(f)); - rant.Dictionary = new RantDictionary(tables); - } - - if (!string.IsNullOrEmpty(PKG_DIR)) - { + if (!string.IsNullOrEmpty(LEGACY_DIC_PATH)) + { + var tables = + Directory + .GetFiles(LEGACY_DIC_PATH) + .Where(f => Path.GetExtension(f) == ".dic") + .Select(f => RantDictionaryTable.FromLegacyFile(f)); + rant.Dictionary = new RantDictionary(tables); + } + + if (!string.IsNullOrEmpty(PKG_DIR)) + { #if DEBUG Stopwatch timer = Stopwatch.StartNew(); #endif - foreach(var pkg in Directory.GetFiles(PKG_DIR, "*.rantpkg")) + foreach (var pkg in Directory.GetFiles(PKG_DIR, "*.rantpkg")) { rant.LoadPackage(pkg); } @@ -67,182 +67,186 @@ private static void Main(string[] args) timer.Stop(); WriteLine($"Package loading: {timer.ElapsedMilliseconds}ms"); #endif - } - else - { - foreach (string pkg in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.rantpkg", SearchOption.AllDirectories)) - { - rant.LoadPackage(pkg); - } - } + } + else + { + foreach (string pkg in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.rantpkg", SearchOption.AllDirectories)) + { + rant.LoadPackage(pkg); + } + } #if !DEBUG - } - catch (Exception e) - { - ForegroundColor = ConsoleColor.Cyan; - WriteLine($"Dictionary load error: {e.Message}"); - } + } + catch (Exception e) + { + ForegroundColor = ConsoleColor.Cyan; + WriteLine($"Dictionary load error: {e.Message}"); + } #endif - if (Flag("nsfw")) rant.Dictionary.IncludeHiddenClass("nsfw"); + if (Flag("nsfw")) rant.Dictionary.IncludeHiddenClass("nsfw"); - if (!string.IsNullOrEmpty(FILE)) - { + if (!string.IsNullOrEmpty(FILE)) + { #if !DEBUG - try - { + try + { #endif - PrintOutput(rant, File.ReadAllText(FILE)); + PrintOutput(rant, FILE, true); #if !DEBUG - } - catch (Exception ex) - { - ForegroundColor = ConsoleColor.Red; - WriteLine(ex.Message); - ResetColor(); - } + } + catch (Exception ex) + { + ForegroundColor = ConsoleColor.Red; + WriteLine(ex.Message); + ResetColor(); + } #endif - if (Flag("wait")) ReadKey(true); - return; - } - - while (true) - { - ForegroundColor = Flag("nsfw") ? ConsoleColor.DarkRed : ConsoleColor.Gray; - Write("RANT> "); - ForegroundColor = ConsoleColor.White; - string input = ReadLine(); - if (input == null) - { - return; - } - PrintOutput(rant, input); - } - } - - private static void PrintOutput(RantEngine engine, string source, bool isFile = false) - { - try - { - var sw = new Stopwatch(); - - sw.Start(); - var pattern = isFile - ? RantProgram.CompileFile(source) - : RantProgram.CompileString(source); - sw.Stop(); - var compileTime = sw.Elapsed; - - sw.Restart(); - var output = USE_SEED - ? engine.Do(pattern, SEED, 0, PATTERN_TIMEOUT) - : engine.Do(pattern, 0, PATTERN_TIMEOUT); - sw.Stop(); - - var runTime = sw.Elapsed; - - bool writeToFile = !string.IsNullOrEmpty(Property("out")); - foreach (var chan in output) - { - if (chan.Name != "main") - { - if (Flag("main")) continue; - if (!writeToFile) - { - ForegroundColor = ConsoleColor.DarkCyan; - WriteLine($"{chan.Name}:"); - ResetColor(); - } - } - ForegroundColor = ConsoleColor.Green; - if (chan.Value.Length > 0) - { - if (pattern.Type == RantProgramOrigin.File && writeToFile) - { - string path = Property("out"); - File.WriteAllText( - Path.Combine(Path.GetDirectoryName(path), - Path.GetFileNameWithoutExtension(path) + - (chan.Name != "main" - ? $".{chan.Name}" - : "" + "." + Path.GetExtension(path))), - chan.Value); - } - else - { + if (Flag("wait")) ReadKey(true); + return; + } + + while (true) + { + ForegroundColor = Flag("nsfw") ? ConsoleColor.DarkRed : ConsoleColor.Gray; + Write("RANT> "); + ForegroundColor = ConsoleColor.White; + string input = ReadLine(); + if (input == null) + { + return; + } + PrintOutput(rant, input); + } + } + + private static void PrintOutput(RantEngine engine, string source, bool isFile = false) + { + try + { + var sw = new Stopwatch(); + + sw.Start(); + var pattern = isFile + ? source.EndsWith(".rantpgm") + ? RantProgram.LoadFile(source) + : RantProgram.CompileFile(source) + : RantProgram.CompileString(source); + sw.Stop(); + + var compileTime = sw.Elapsed; + + sw.Restart(); + var output = USE_SEED + ? engine.Do(pattern, SEED, 0, PATTERN_TIMEOUT) + : engine.Do(pattern, 0, PATTERN_TIMEOUT); + sw.Stop(); + + var runTime = sw.Elapsed; + + bool writeToFile = !string.IsNullOrEmpty(Property("out")); + foreach (var chan in output) + { + if (chan.Name != "main") + { + if (Flag("main")) continue; + if (!writeToFile) + { + ForegroundColor = ConsoleColor.DarkCyan; + WriteLine($"{chan.Name}:"); + ResetColor(); + } + } + ForegroundColor = ConsoleColor.Green; + if (chan.Value.Length > 0) + { + if (pattern.Type == RantProgramOrigin.File && writeToFile) + { + string path = Property("out"); + File.WriteAllText( + Path.Combine(Path.GetDirectoryName(path), + Path.GetFileNameWithoutExtension(path) + + (chan.Name != "main" + ? $".{chan.Name}" + : "" + "." + Path.GetExtension(path))), + chan.Value); + } + else + { #if DEBUG WriteLine($"'{chan.Value}'"); #else - WriteLine(chan.Value.Normalize(NormalizationForm.FormC)); + WriteLine(chan.Value.Normalize(NormalizationForm.FormC)); #endif - } - } - else if (!writeToFile) - { - ForegroundColor = ConsoleColor.DarkGray; - if (pattern.Type != RantProgramOrigin.File) WriteLine("[Empty]"); - } - ResetColor(); - WriteLine(); - } - - if ((pattern.Type != RantProgramOrigin.File || Flag("wait")) && !Flag("nostats")) - { - PrintStats( - new Stat("Seed", - $"{output.Seed:X16}{(output.BaseGeneration != 0 ? ":" + output.BaseGeneration : string.Empty)}"), - new Stat("Compile Time", compileTime.ToString("c")), - new Stat("Run Time", runTime.ToString("c")) - ); - WriteLine(); - } - } + } + } + else if (!writeToFile) + { + ForegroundColor = ConsoleColor.DarkGray; + if (pattern.Type != RantProgramOrigin.File) WriteLine("[Empty]"); + } + ResetColor(); + WriteLine(); + } + + if (!Flag("nostats")) + { + PrintStats( + new Stat("Seed", + $"{output.Seed:X16}{(output.BaseGeneration != 0 ? ":" + output.BaseGeneration : string.Empty)}"), + new Stat(isFile && source.EndsWith(".rantpgm") ? "Load Time" : "Compile Time", compileTime.ToString("c")), + new Stat("Run Time", runTime.ToString("c")) + ); + WriteLine(); + } + if (isFile && Flag("wait")) Console.ReadKey(); + } #if !DEBUG - catch (RantRuntimeException e) - { - ForegroundColor = ConsoleColor.Red; - WriteLine(e); - } - catch (RantCompilerException e) - { - ForegroundColor = ConsoleColor.Yellow; - WriteLine(e.Message); - } - catch (Exception e) - { - WriteLine(e.ToString()); // Print the whole stack trace if it isn't a Rant error - } + catch (RantRuntimeException e) + { + ForegroundColor = ConsoleColor.Red; + WriteLine(e); + } + catch (RantCompilerException e) + { + ForegroundColor = ConsoleColor.Yellow; + WriteLine(e.Message); + } + catch (Exception e) + { + WriteLine(e.ToString()); // Print the whole stack trace if it isn't a Rant error + } #endif - finally - { - ResetColor(); - } - } - - private static void PrintStats(params Stat[] stats) - { - int alignment = stats.Max(s => s.Name.Length); - string fmtString = $"{{0, {alignment}}}: "; - foreach (var stat in stats) - { - ForegroundColor = ConsoleColor.DarkGray; - Write(fmtString, stat.Name); - ForegroundColor = ConsoleColor.DarkMagenta; - WriteLine(stat.Value); - } - ResetColor(); - } - - private class Stat - { - public readonly string Name; - public readonly object Value; - - public Stat(string name, object value) - { - Name = name; - Value = value; - } - } - } + finally + { + ResetColor(); + } + } + + private static void PrintStats(params Stat[] stats) + { + int alignment = stats.Max(s => s.Name.Length); + string fmtString = $"{{0, {alignment}}}: "; + foreach (var stat in stats) + { + ForegroundColor = ConsoleColor.DarkGray; + Write(fmtString, stat.Name); + ForegroundColor = ConsoleColor.DarkMagenta; + WriteLine(stat.Value); + } + ResetColor(); + } + + private class Stat + { + public readonly string Name; + public readonly object Value; + + public Stat(string name, object value) + { + Name = name; + Value = value; + } + } + } } \ No newline at end of file diff --git a/Rant.Console/Properties/AssemblyInfo.cs b/Rant.Console/Properties/AssemblyInfo.cs index f393086..b351a4a 100644 --- a/Rant.Console/Properties/AssemblyInfo.cs +++ b/Rant.Console/Properties/AssemblyInfo.cs @@ -4,11 +4,11 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("RantConsole")] +[assembly: AssemblyTitle("Rant Console")] [assembly: AssemblyDescription("Rant Console")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("RantConsole")] +[assembly: AssemblyProduct("Rant Console")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/Rant.Tools/Command.cs b/Rant.Tools/Command.cs new file mode 100644 index 0000000..1923d33 --- /dev/null +++ b/Rant.Tools/Command.cs @@ -0,0 +1,160 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Rant.Tools +{ + internal abstract class Command + { + private static readonly Dictionary _cmdMap; + private readonly List _params = new List(); + private readonly List _flags = new List(); + private string _name, _desc; + private bool _requiresPath, _usesPath; + + public string Name => _name; + public string Description => _desc; + + static Command() + { + _cmdMap = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + foreach (var type in Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(Command)))) + { + var nameAttr = type.GetCustomAttribute(); + if (nameAttr == null) continue; + var cmd = _cmdMap[nameAttr.Name] = Activator.CreateInstance(type) as Command; + cmd._name = nameAttr.Name; + cmd._desc = nameAttr.Description; + cmd._params.AddRange(type.GetCustomAttributes()); + cmd._flags.AddRange(type.GetCustomAttributes()); + cmd._requiresPath = nameAttr.RequireFilePath; + cmd._usesPath = nameAttr.UsesPath; + } + } + + public static void Run(string cmdname) + { + if (String.IsNullOrWhiteSpace(cmdname)) + { + Console.WriteLine($"\nRant Command Line Tools for Rant {typeof(RantEngine).Assembly.GetName().Version.ToString(3)}\n"); + Console.WriteLine($"Usage: {Program.Name} [args]\n"); + Console.WriteLine("Use the --help option on any command to display its help text.\n"); + Console.WriteLine("Available commands: "); + foreach (var c in _cmdMap.Values.OrderBy(c => c.Name)) + { + Console.WriteLine($" {c.Name}\t\t{c.Description}"); + } + Console.WriteLine(); + return; + } + + if (!_cmdMap.TryGetValue(cmdname, out Command cmd)) + { + Console.WriteLine($"Command '{cmdname}' does not exist."); + } + + if (CmdLine.Flag("h") || CmdLine.Flag("help")) + { + GetHelpText(cmd); + return; + } + + if (cmd._requiresPath && CmdLine.GetPaths().Length == 0) + { + throw new ArgumentException($"The command '{cmd.Name}' requires a path."); + } + + var missing = cmd._params.Where(p => p.Required && String.IsNullOrEmpty(CmdLine.Property(p.Name))).ToArray(); + if (missing.Length > 0) + { + throw new ArgumentException($"The command '{cmd.Name}' is missing the following required properties: {missing.Aggregate(missing[0].Name, (c, n) => c + ", " + n.Name)}"); + } + + foreach (var p in cmd._params.Where(p => p.Required)) + { + if (String.IsNullOrEmpty(CmdLine.Property(p.Name))) + { + throw new ArgumentException($"The command '{cmd.Name}' requires a -{p.Name} parameter."); + } + } + + cmd.OnRun(); + } + + public static void GetHelpText(string cmdname) + { + if (!_cmdMap.TryGetValue(cmdname, out Command cmd)) + { + Console.WriteLine($"Command '{cmdname}' does not exist."); + } + + GetHelpText(cmd); + } + + public static void GetHelpText(Command cmd) + { + Console.WriteLine(); + Console.WriteLine(cmd.Name.ToUpperInvariant()); + Console.WriteLine(); + Console.WriteLine(cmd.Description); + + var pRequired = cmd._params.Where(p => p.Required).Select(p => $"-{p.Name} ...").ToArray(); + var pOptional = cmd._params.Where(p => !p.Required).Select(p => $"[-{p.Name} ...]").ToArray(); + var flags = cmd._flags.Select(f => $"[--{f.Name}]").ToArray(); + + Console.Write($"\nUsage: {Program.Name} {cmd.Name}"); + if (pRequired.Length > 0) Console.Write($" {pRequired.Aggregate((c, n) => c + " " + n)}"); + if (pOptional.Length > 0) Console.Write($" {pOptional.Aggregate((c, n) => c + " " + n)}"); + if (flags.Length > 0) Console.Write($" {flags.Aggregate((c, n) => c + " " + n)}"); + if (cmd._requiresPath || cmd._usesPath) Console.Write(cmd._requiresPath ? " path" : " [path]"); + Console.WriteLine(); + + Console.WriteLine("\nParameters:"); + if (cmd._params.Count == 0 && cmd._flags.Count == 0) + { + Console.WriteLine("(None)"); + } + else + { + foreach (var p in cmd._params) + { + Console.WriteLine("{0, -32} {1}", $" -{p.Name}{(p.Required ? " (Required) " : " ")}", p.Description); + } + + foreach (var f in cmd._flags) + { + Console.WriteLine("{0, -32} {1}", $" --{f.Name}", f.Description); + } + } + Console.WriteLine(); + } + + protected abstract void OnRun(); + } +} \ No newline at end of file diff --git a/Rant.Tools/CommandFlagAttribute.cs b/Rant.Tools/CommandFlagAttribute.cs new file mode 100644 index 0000000..d116ac7 --- /dev/null +++ b/Rant.Tools/CommandFlagAttribute.cs @@ -0,0 +1,39 @@ +#region License +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. +#endregion + +using System; + +namespace Rant.Tools +{ + internal sealed class CommandFlagAttribute : Attribute + { + public string Name { get; } + public string Description { get; } + + public CommandFlagAttribute(string name, string description) + { + Name = name; + Description = description; + } + } +} \ No newline at end of file diff --git a/Rant.Tools/CommandNameAttribute.cs b/Rant.Tools/CommandNameAttribute.cs new file mode 100644 index 0000000..91af7de --- /dev/null +++ b/Rant.Tools/CommandNameAttribute.cs @@ -0,0 +1,41 @@ +#region License +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. +#endregion + +using System; + +namespace Rant.Tools +{ + [AttributeUsage(AttributeTargets.Class)] + internal sealed class CommandNameAttribute : Attribute + { + public string Name { get; } + public string Description { get; set; } = "(No Description)"; + public bool RequireFilePath { get; set; } = false; + public bool UsesPath { get; set; } = false; + + public CommandNameAttribute(string name) + { + Name = name; + } + } +} \ No newline at end of file diff --git a/Rant.Tools/CommandParamAttribute.cs b/Rant.Tools/CommandParamAttribute.cs new file mode 100644 index 0000000..3f1cb68 --- /dev/null +++ b/Rant.Tools/CommandParamAttribute.cs @@ -0,0 +1,42 @@ +#region License +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. +#endregion + +using System; + +namespace Rant.Tools +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] + internal sealed class CommandParamAttribute : Attribute + { + public string Name { get; } + public bool Required { get; } + public string Description { get; } + + public CommandParamAttribute(string name, bool required, string description) + { + Name = name; + Required = required; + Description = description; + } + } +} \ No newline at end of file diff --git a/Rant.Tools/Commands/BuildCommand.cs b/Rant.Tools/Commands/BuildCommand.cs new file mode 100644 index 0000000..abc4aef --- /dev/null +++ b/Rant.Tools/Commands/BuildCommand.cs @@ -0,0 +1,58 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; +using System.IO; + +namespace Rant.Tools.Commands +{ + [CommandName("build", Description = "Compiles the specified Rant patterns into programs.", RequireFilePath = true)] + internal sealed class BuildCommand : Command + { + protected override void OnRun() + { + foreach (var path in CmdLine.GetPaths()) + { + try + { + Console.Write($"Building {path}..."); + + var pgm = RantProgram.CompileFile(path); + var pgmpath = Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path) + ".rantpgm"); + pgm.SaveToFile(pgmpath); + Console.WriteLine(" Done."); + } + catch (RantCompilerException ex) + { + throw new Exception($"Build failed for {path}.\n{ex.Message}\n"); + } + catch (Exception ex) + { + throw new Exception($"Error while building: {ex.Message}"); + } + } + } + } +} \ No newline at end of file diff --git a/Rant.Tools/Commands/PackCommand.cs b/Rant.Tools/Commands/PackCommand.cs new file mode 100644 index 0000000..db54ac3 --- /dev/null +++ b/Rant.Tools/Commands/PackCommand.cs @@ -0,0 +1,175 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; +using System.IO; +using System.Linq; +using System.Text; + +using Newtonsoft.Json; + +using Rant.Core.IO.Bson; +using Rant.Resources; +using Rant.Tools.Packer; +using Rant.Vocabulary; + +namespace Rant.Tools.Commands +{ + [CommandName("pack", Description = "Packages resources in a specified directory into a .rantpkg archive.", UsesPath = true)] + [CommandParam("out", false, "Output path for package.")] + [CommandParam("version", false, "Overrides the package version string in rantpkg.json.")] + [CommandFlag("no-compress", "Indicates that the package content should not be compressed.")] + internal sealed class PackCommand : Command + { + public PackCommand() + { + + } + + protected override void OnRun() + { + var pkg = new RantPackage(); + var paths = CmdLine.GetPaths(); + bool compress = !CmdLine.Flag("no-compress"); + int stringTableMode = int.Parse(CmdLine.Property("string-table", "1")); + + if (stringTableMode < 0 || stringTableMode > 2) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Invalid string table mode."); + Console.ResetColor(); + return; + } + + var modeEnum = (BsonStringTableMode)stringTableMode; + + Console.WriteLine("Packing..."); + + string contentDir = Path.GetFullPath(paths.Length == 0 ? Environment.CurrentDirectory : paths[0]); + + Pack(pkg, contentDir); + + string outputPath; + string infoPath = Path.Combine(contentDir, "rantpkg.json"); + if (!File.Exists(infoPath)) + throw new FileNotFoundException("rantpkg.json missing from root directory."); + + var info = JsonConvert.DeserializeObject(File.ReadAllText(infoPath)); + pkg.Title = info.Title; + pkg.Authors = info.Authors; + pkg.Version = RantPackageVersion.Parse(!string.IsNullOrWhiteSpace(CmdLine.Property("version")) ? CmdLine.Property("version") : info.Version); + pkg.Description = info.Description; + pkg.ID = info.ID; + pkg.Tags = info.Tags; + + foreach (var dep in info.Dependencies) + { + pkg.AddDependency(dep); + } + + // -out property overrides rantpkg.json's output path + if (!string.IsNullOrWhiteSpace(CmdLine.Property("out"))) + { + outputPath = Path.Combine(CmdLine.Property("out"), $"{pkg.ID}-{pkg.Version}.rantpkg"); + Directory.CreateDirectory(CmdLine.Property("out")); + } + // Otherwise, use rantpkg.json's "out" property + else if (!string.IsNullOrWhiteSpace(info.OutputPath)) + { + outputPath = Path.Combine(contentDir, info.OutputPath, $"{pkg.ID}-{pkg.Version}.rantpkg"); + Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); + } + // If it doesn't have one, put it in the package content directory + else + { + outputPath = Path.Combine(Directory.GetParent(contentDir).FullName, $"{pkg.ID}-{pkg.Version}.rantpkg"); + } + + Console.WriteLine($"String table mode: {modeEnum}"); + Console.WriteLine($"Compression: {(compress ? "yes" : "no")}"); + + Console.WriteLine(compress ? "Compressing and saving..." : "Saving..."); + pkg.Save(outputPath, compress, modeEnum); + + Console.WriteLine("\nPackage saved to " + outputPath.Replace('\\', '/')); + + Console.ResetColor(); + } + + private static void Pack(RantPackage package, string contentPath) + { + foreach (string path in Directory.EnumerateFiles(contentPath, "*.*", SearchOption.AllDirectories) + .Where(p => p.EndsWith(".rant") || p.EndsWith(".rants"))) + { + var pattern = RantProgram.CompileFile(path); + string relativePath; + TryGetRelativePath(contentPath, path, out relativePath, true); + pattern.Name = relativePath; + package.AddResource(pattern); + Console.WriteLine("+ " + pattern.Name); + } + + foreach (string path in Directory.GetFiles(contentPath, "*.table", SearchOption.AllDirectories)) + { + Console.WriteLine("+ " + path); + var table = RantDictionaryTable.FromStream(Path.GetFileNameWithoutExtension(path), File.Open(path, FileMode.Open)); + package.AddResource(table); + } + } + + private static bool TryGetRelativePath(string rootDir, string fullPath, out string relativePath, bool removeExtension = false) + { + relativePath = null; + if (string.IsNullOrWhiteSpace(rootDir) || string.IsNullOrWhiteSpace(fullPath)) return false; + var rootParts = Path.GetFullPath(rootDir).Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); + var fullParts = Path.GetFullPath(fullPath).Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); + if (rootParts.Length == 0 || fullParts.Length <= rootParts.Length) + { + relativePath = fullPath; + return true; + } + for (int i = 0; i < rootParts.Length; i++) + { + if (rootParts[i] != fullParts[i]) return false; + } + var sb = new StringBuilder(); + int indDot; + for (int j = rootParts.Length; j < fullParts.Length; j++) + { + if (j > rootParts.Length) sb.Append('/'); + if (removeExtension && j == fullParts.Length - 1 && (indDot = fullParts[j].LastIndexOf('.')) > -1) + { + sb.Append(fullParts[j].Substring(0, indDot)); + } + else + { + sb.Append(fullParts[j]); + } + } + relativePath = sb.ToString(); + return true; + } + } +} \ No newline at end of file diff --git a/Rant.Tools/Help.cs b/Rant.Tools/Help.cs deleted file mode 100644 index a7139fa..0000000 --- a/Rant.Tools/Help.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Rant.Tools -{ - public static class Help - { - private static readonly Dictionary Items = new Dictionary(); - - static Help() - { - AddHelpItem("docs", "Generates HTML documentation for Rant dictionaries."); - AddHelpItem("pack", "Packages patterns and dictionaries into a portable archive format that can be loaded directly into Rant."); - AddHelpItem("sort", "Formats table (.dic) files into a readable, class-hierarchy format. Supports Diffmark."); - } - - public static void Print() - { - Console.WriteLine(); - Console.WriteLine("Rant Command Line Tools"); - Console.WriteLine($"\n Rant Version: {typeof(RantEngine).Assembly.GetName().Version.ToString(3)}"); - Console.WriteLine(); - Console.WriteLine("Usage: rant [args] [options]"); - Console.WriteLine("\nAvailable options:"); - Console.WriteLine(" --version\t\t\tPrints the Rant version number."); - Console.WriteLine(" --help\t\t\tDisplays Rant help."); - Console.WriteLine("\nAvailable commands:"); - foreach (var item in Items.Values) - { - Console.WriteLine($" {item.Name}\t\t\t{item.Description}"); - } - } - - private static void AddHelpItem(string name, string desc) - { - Items[name] = new HelpItem(name, desc); - } - - private class HelpItem - { - public readonly string Description; - public readonly string Name; - - public HelpItem(string name, string desc) - { - Name = name; - Description = desc; - } - - public override string ToString() => $"{Name}: {Description}"; - } - } -} \ No newline at end of file diff --git a/Rant.Tools/Packer/PackGenerator.cs b/Rant.Tools/Packer/PackGenerator.cs deleted file mode 100644 index ffc1d8b..0000000 --- a/Rant.Tools/Packer/PackGenerator.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text; - -using Newtonsoft.Json; - -using Rant.Core.IO.Bson; -using Rant.Resources; -using Rant.Vocabulary; - -namespace Rant.Tools.Packer -{ - public static class PackGenerator - { - public static void GetHelp() - { - Console.WriteLine("Usage:"); - - Console.WriteLine(" rant pack <-out package-path>"); - Console.WriteLine(" - Creates a package from the current directory."); - Console.WriteLine(" -out: Specifies the output path for the package. Optional if rantpkg.json specifies an output path."); - Console.WriteLine(" rant pack [content-dir] <-out package-path>"); - Console.WriteLine(" - Creates a package from the specified directories."); - Console.WriteLine(" -out: Specifies the output path for the package. Optional if rantpkg.json specifies an output path."); - Console.WriteLine(" Options:"); - Console.WriteLine(" -compression [true|false]: Enable or disable LZMA compression. Defaults to true."); - Console.WriteLine(" -string-table [mode]: Set the string table mode. 0 = none, 1 = keys, 2 = keys and values."); - Console.WriteLine(" Defaults to keys."); - Console.WriteLine(" -version [version]: Overrides the version in rantpkg.json."); - } - - public static void Run() - { - var pkg = new RantPackage(); - var paths = CmdLine.GetPaths(); - bool compress = CmdLine.Property("compression", "true") == "true"; - int stringTableMode = int.Parse(CmdLine.Property("string-table", "1")); - - if (stringTableMode < 0 || stringTableMode > 2) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("Invalid string table mode."); - Console.ResetColor(); - return; - } - - var modeEnum = (BsonStringTableMode)stringTableMode; - - Console.WriteLine("Packing..."); - - string contentDir = Path.GetFullPath(paths.Length == 0 ? Environment.CurrentDirectory : paths[0]); - - Pack(pkg, contentDir); - - string outputPath; - string infoPath = Path.Combine(contentDir, "rantpkg.json"); - if (!File.Exists(infoPath)) - throw new FileNotFoundException("rantpkg.json missing from root directory."); - - var info = JsonConvert.DeserializeObject(File.ReadAllText(infoPath)); - pkg.Title = info.Title; - pkg.Authors = info.Authors; - pkg.Version = RantPackageVersion.Parse(!string.IsNullOrWhiteSpace(CmdLine.Property("version")) ? CmdLine.Property("version") : info.Version); - pkg.Description = info.Description; - pkg.ID = info.ID; - pkg.Tags = info.Tags; - - foreach (var dep in info.Dependencies) - { - pkg.AddDependency(dep); - } - - // -out property overrides rantpkg.json's output path - if (!string.IsNullOrWhiteSpace(CmdLine.Property("out"))) - { - outputPath = Path.Combine(CmdLine.Property("out"), $"{pkg.ID}-{pkg.Version}.rantpkg"); - Directory.CreateDirectory(CmdLine.Property("out")); - } - // Otherwise, use rantpkg.json's "out" property - else if (!string.IsNullOrWhiteSpace(info.OutputPath)) - { - outputPath = Path.Combine(contentDir, info.OutputPath, $"{pkg.ID}-{pkg.Version}.rantpkg"); - Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); - } - // If it doesn't have one, put it in the package content directory - else - { - outputPath = Path.Combine(Directory.GetParent(contentDir).FullName, $"{pkg.ID}-{pkg.Version}.rantpkg"); - } - - Console.WriteLine($"String table mode: {modeEnum}"); - Console.WriteLine($"Compression: {(compress ? "yes" : "no")}"); - - Console.WriteLine(compress ? "Compressing and saving..." : "Saving..."); - pkg.Save(outputPath, compress, modeEnum); - - Console.WriteLine("\nPackage saved to " + outputPath); - - Console.ResetColor(); - } - - private static void Pack(RantPackage package, string contentPath) - { - foreach (string path in Directory.EnumerateFiles(contentPath, "*.*", SearchOption.AllDirectories) - .Where(p => p.EndsWith(".rant") || p.EndsWith(".rants"))) - { - var pattern = RantProgram.CompileFile(path); - string relativePath; - TryGetRelativePath(contentPath, path, out relativePath, true); - pattern.Name = relativePath; - package.AddResource(pattern); - Console.WriteLine("+ " + pattern.Name); - } - - foreach (string path in Directory.GetFiles(contentPath, "*.table", SearchOption.AllDirectories)) - { - Console.WriteLine("+ " + path); - var table = RantDictionaryTable.FromStream(Path.GetFileNameWithoutExtension(path), File.Open(path, FileMode.Open)); - package.AddResource(table); - } - } - - private static bool TryGetRelativePath(string rootDir, string fullPath, out string relativePath, bool removeExtension = false) - { - relativePath = null; - if (string.IsNullOrWhiteSpace(rootDir) || string.IsNullOrWhiteSpace(fullPath)) return false; - var rootParts = Path.GetFullPath(rootDir).Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); - var fullParts = Path.GetFullPath(fullPath).Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); - if (rootParts.Length == 0 || fullParts.Length <= rootParts.Length) - { - relativePath = fullPath; - return true; - } - for (int i = 0; i < rootParts.Length; i++) - { - if (rootParts[i] != fullParts[i]) return false; - } - var sb = new StringBuilder(); - int indDot; - for (int j = rootParts.Length; j < fullParts.Length; j++) - { - if (j > rootParts.Length) sb.Append('/'); - if (removeExtension && j == fullParts.Length - 1 && (indDot = fullParts[j].LastIndexOf('.')) > -1) - { - sb.Append(fullParts[j].Substring(0, indDot)); - } - else - { - sb.Append(fullParts[j]); - } - } - relativePath = sb.ToString(); - return true; - } - } -} \ No newline at end of file diff --git a/Rant.Tools/Program.cs b/Rant.Tools/Program.cs index 4a45ee1..1db68cb 100644 --- a/Rant.Tools/Program.cs +++ b/Rant.Tools/Program.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Reflection; using Rant.Tools.Packer; @@ -7,75 +8,32 @@ namespace Rant.Tools { - internal class Program - { - private static void Main(string[] args) - { - if (CmdLine.Flag("version")) - { - WriteLine($"Rant {typeof(RantEngine).Assembly.GetName().Version}"); - } + internal class Program + { + public static readonly string Name = Assembly.GetExecutingAssembly().GetName().Name.ToLowerInvariant(); - if (string.IsNullOrEmpty(CmdLine.Command)) - { - Help.Print(); - return; - } + private static void Main(string[] args) + { + if (CmdLine.Flag("version")) + { + WriteLine($"Rant {typeof(RantEngine).Assembly.GetName().Version}"); + return; + } #if !DEBUG - try - { + try + { #endif - switch (CmdLine.Command) - { - case "pack": - { - PackGenerator.Run(); - break; - } - case "build": - { - var paths = CmdLine.GetPaths(); - foreach (var path in paths.Length == 0 ? Directory.GetFiles(Environment.CurrentDirectory, "*.rant") : paths) - { - Build(path); - } - Console.WriteLine("Done"); - break; - } - default: - WriteLine($"Unknown command: '{CmdLine.Command}'"); - break; - } + Command.Run(CmdLine.Command); #if !DEBUG - } - catch (Exception ex) - { - ForegroundColor = ConsoleColor.Red; - WriteLine(ex.Message); - ResetColor(); - Environment.Exit(1); - } + } + catch (Exception ex) + { + ForegroundColor = ConsoleColor.Red; + WriteLine(ex.Message); + ResetColor(); + Environment.Exit(1); + } #endif - } - - private static void Build(string path) - { - try - { - Console.WriteLine($"Building: {path}"); - - var pgm = RantProgram.CompileFile(path); - - pgm.SaveToFile(Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path) + ".rantpgm")); - } - catch (RantCompilerException ex) - { - Console.WriteLine($"Build failed for {path}.\n{ex.Message}\n"); - } - catch (Exception ex) - { - Console.WriteLine($"Error while building: {ex.Message}"); - } - } - } + } + } } \ No newline at end of file diff --git a/Rant.Tools/Properties/AssemblyInfo.cs b/Rant.Tools/Properties/AssemblyInfo.cs index f5d6e27..159034e 100644 --- a/Rant.Tools/Properties/AssemblyInfo.cs +++ b/Rant.Tools/Properties/AssemblyInfo.cs @@ -5,12 +5,12 @@ // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("Rant Command Line Tools")] -[assembly: AssemblyDescription("Command-line utilities for Rant")] +[assembly: AssemblyTitle("Rant Command-Line Tools")] +[assembly: AssemblyDescription("Command-line tools for building Rant resource files")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Rant Command Line Tools")] -[assembly: AssemblyCopyright("Copyright © Nicholas Fleck 2015")] +[assembly: AssemblyProduct("Rant Command-Line Tools")] +[assembly: AssemblyCopyright("Copyright © Nicholas Fleck 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/Rant.Tools/Rant.Tools.csproj b/Rant.Tools/Rant.Tools.csproj index 0bffe0a..6ddecc3 100644 --- a/Rant.Tools/Rant.Tools.csproj +++ b/Rant.Tools/Rant.Tools.csproj @@ -8,7 +8,7 @@ Exe Properties Rant.Tools - Rant + RCT v4.5 512 @@ -55,11 +55,15 @@ + - + + + + - + diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index db2ec0f..d8173e3 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -8,7 +8,7 @@ Library Properties Rant - RantEngine + Rant v4.5 512 @@ -43,7 +43,7 @@ TRACE prompt 4 - ..\bin\MainBuild\RantEngine.xml + ..\bin\MainBuild\Rant.xml false From 9d79edf0ec9a99a663e4c3fecaa5348a52e1f55c Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 27 Mar 2017 02:41:09 -0500 Subject: [PATCH 162/213] Simplify class caching logic --- Rant.Benchmark/Program.cs | 10 - Rant.Console/Program.cs | 10 - Rant.Tests/Compiler/Serialization.cs | 2 +- Rant.Tests/Packages.cs | 56 +- Rant.Tools/Program.cs | 2 +- Rant/Core/Compiler/Syntax/RstQuery.cs | 14 +- Rant/Core/Framework/RantFunctionRegistry.cs | 2048 ++++++++--------- Rant/Rant.csproj | 3 +- Rant/Vocabulary/ClassCache.cs | 105 + Rant/Vocabulary/ClassTree.cs | 148 -- Rant/Vocabulary/Legacy/DicLexer.cs | 125 - .../Legacy/RantDictionaryTable.Loader.cs | 307 --- Rant/Vocabulary/Querying/ClassFilter.cs | 2 + Rant/Vocabulary/Querying/Query.cs | 21 +- Rant/Vocabulary/Querying/RangeFilter.cs | 2 +- Rant/Vocabulary/RantDictionary.cs | 2 + .../RantDictionaryTable.Importer.cs | 2 +- Rant/Vocabulary/RantDictionaryTable.cs | 107 +- 18 files changed, 1238 insertions(+), 1728 deletions(-) create mode 100644 Rant/Vocabulary/ClassCache.cs delete mode 100644 Rant/Vocabulary/ClassTree.cs delete mode 100644 Rant/Vocabulary/Legacy/DicLexer.cs delete mode 100644 Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs diff --git a/Rant.Benchmark/Program.cs b/Rant.Benchmark/Program.cs index a104a40..9f43acc 100644 --- a/Rant.Benchmark/Program.cs +++ b/Rant.Benchmark/Program.cs @@ -11,7 +11,6 @@ namespace Rant.Benchmark { class Program { - public static readonly string LEGACY_DIC_PATH = Property("ldict"); public static readonly string PKG_PATH = Property("package"); public static readonly int ITERATIONS; @@ -24,15 +23,6 @@ static Program() static void Main(string[] args) { var rant = new RantEngine(); - if (!string.IsNullOrEmpty(LEGACY_DIC_PATH)) - { - var tables = - Directory - .GetFiles(LEGACY_DIC_PATH) - .Where(f => Path.GetExtension(f) == ".dic") - .Select(f => RantDictionaryTable.FromLegacyFile(f)); - rant.Dictionary = new RantDictionary(tables); - } if (!string.IsNullOrEmpty(PKG_PATH)) { diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 1ef0a21..42c3e65 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -24,7 +24,6 @@ internal class Program #endif public static readonly string FILE = GetPaths().FirstOrDefault(); public static readonly string PKG_DIR = Property("pkgdir"); - public static readonly string LEGACY_DIC_PATH = Property("ldict"); public static readonly long SEED; public static readonly bool USE_SEED; @@ -44,15 +43,6 @@ private static void Main(string[] args) try { #endif - if (!string.IsNullOrEmpty(LEGACY_DIC_PATH)) - { - var tables = - Directory - .GetFiles(LEGACY_DIC_PATH) - .Where(f => Path.GetExtension(f) == ".dic") - .Select(f => RantDictionaryTable.FromLegacyFile(f)); - rant.Dictionary = new RantDictionary(tables); - } if (!string.IsNullOrEmpty(PKG_DIR)) { diff --git a/Rant.Tests/Compiler/Serialization.cs b/Rant.Tests/Compiler/Serialization.cs index 907446c..5cd4e0a 100644 --- a/Rant.Tests/Compiler/Serialization.cs +++ b/Rant.Tests/Compiler/Serialization.cs @@ -26,7 +26,7 @@ public class Serialization [TestCase(@"[`[aeiou]+[wy]?`:The quick brown fox jumps over the lazy dog.;ur]")] [TestCase(@"[$[concat:a;b]:[arg:a][arg:b]][$concat:Hello\s;World!]")] [TestCase(@"[$[runx2:@a]:[arg:a] [arg:a]][$runx2:[x:_;forward][xpin:_][after:[xstep:_]]{Hello|World!}]")] - [TestCase(@"")] + [TestCase(@"")] public void SerializeAndExecute(string pattern) { var ms = new MemoryStream(); diff --git a/Rant.Tests/Packages.cs b/Rant.Tests/Packages.cs index 9ec609f..2fa228a 100644 --- a/Rant.Tests/Packages.cs +++ b/Rant.Tests/Packages.cs @@ -7,34 +7,34 @@ namespace Rant.Tests { - [TestFixture] - public class Packages - { - private readonly RantEngine rant = new RantEngine(); + [TestFixture] + public class Packages + { + private readonly RantEngine rant = new RantEngine(); - [Test] - public void SaveLoadRun() - { - var package = new RantPackage - { - ID = "TestPackage", - Description = "This is a test.", - Title = "Test Package?!", - Version = new RantPackageVersion(1, 1, 0) - }; + [Test] + public void SaveLoadRun() + { + var package = new RantPackage + { + ID = "TestPackage", + Description = "This is a test.", + Title = "Test Package?!", + Version = new RantPackageVersion(1, 1, 0) + }; - package.AddResource(RantDictionaryTable.FromStream("nouns", File.Open("Tables/nouns.table", FileMode.Open))); - package.AddResource(RantProgram.CompileString("TestProgram", @"[case:title] [rs:5;,\s]{[rn]}")); - package.Save("TestPackage.rantpkg"); - - package = RantPackage.Load("TestPackage.rantpkg"); - rant.LoadPackage(package); - - Assert.AreEqual("Banana 1, 2, 3, 4, 5", rant.DoPackaged("TestProgram").Main); - Assert.AreEqual("TestPackage", package.ID); - Assert.AreEqual("This is a test.", package.Description); - Assert.AreEqual("Test Package?!", package.Title); - Assert.AreEqual("1.1.0", package.Version.ToString()); - } - } + package.AddResource(RantDictionaryTable.FromStream("nouns", File.Open("Tables/nouns.table", FileMode.Open))); + package.AddResource(RantProgram.CompileString("TestProgram", @"[case:title] [rs:5;,\s]{[rn]}")); + package.Save("TestPackage.rantpkg"); + + package = RantPackage.Load("TestPackage.rantpkg"); + rant.LoadPackage(package); + + Assert.AreEqual("Banana 1, 2, 3, 4, 5", rant.DoPackaged("TestProgram").Main); + Assert.AreEqual("TestPackage", package.ID); + Assert.AreEqual("This is a test.", package.Description); + Assert.AreEqual("Test Package?!", package.Title); + Assert.AreEqual("1.1.0", package.Version.ToString()); + } + } } \ No newline at end of file diff --git a/Rant.Tools/Program.cs b/Rant.Tools/Program.cs index 1db68cb..44b5b4b 100644 --- a/Rant.Tools/Program.cs +++ b/Rant.Tools/Program.cs @@ -17,7 +17,7 @@ private static void Main(string[] args) if (CmdLine.Flag("version")) { WriteLine($"Rant {typeof(RantEngine).Assembly.GetName().Version}"); - return; + return; } #if !DEBUG try diff --git a/Rant/Core/Compiler/Syntax/RstQuery.cs b/Rant/Core/Compiler/Syntax/RstQuery.cs index 50a2f98..61f7f5b 100644 --- a/Rant/Core/Compiler/Syntax/RstQuery.cs +++ b/Rant/Core/Compiler/Syntax/RstQuery.cs @@ -50,7 +50,7 @@ public RstQuery(LineCol location) : base(location) public override IEnumerator Run(Sandbox sb) { - return _query.Run(sb); + return _query.Run(sb); } protected override IEnumerator Serialize(EasyWriter output) @@ -59,7 +59,7 @@ protected override IEnumerator Serialize(EasyWriter output) output.Write(_query.Subtype); output.Write(_query.Exclusive); output.Write(_query.FilterCount); - foreach (var filter in _query.GetFilters()) + foreach (var filter in _query.GetAllFilters()) filter.Serialize(output); // Carrier @@ -105,9 +105,9 @@ protected override IEnumerator Deserialize(EasyReader input) _query.Complement = complementRequest.Result; } - public override string ToString() - { - return $"<{_query.Name}...>"; - } - } + public override string ToString() + { + return $"<{_query.Name}...>"; + } + } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 2cd63e7..ad792ca 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -44,1022 +44,1022 @@ namespace Rant.Core.Framework { - // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. - // They may return either void or IEnumerator depending on your needs. - internal static partial class RantFunctionRegistry - { - [RantFunction("num", "n")] - [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] - private static void Number(Sandbox sb, - [RantDescription("The minimum value of the number to generate.")] int min, - [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); - - [RantFunction("num")] - [RantDescription("Formats an input string using the current number format settings and prints the result.")] - private static void Number(Sandbox sb, - [RantDescription("The string to convert into a number.")] string input) - { - sb.Print(double.TryParse(input, out double number) ? number : 0); - } - - [RantFunction("numfmt")] - [RantDescription("Sets the current number formatting mode.")] - private static void NumberFormat(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); - - [RantFunction("numfmt")] - [RantDescription("Runs the specified pattern under a specific number formatting mode.")] - private static IEnumerator NumberFormatRange(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format, - [RantDescription("The pattern to run.")] RST rangeAction) - { - var oldFmtMap = new Dictionary(); - - sb.Output.Do(chain => - { - oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; - chain.Last.NumberFormatter.NumberFormat = format; - }); - - yield return rangeAction; - - sb.Output.Do(chain => - { - if (!oldFmtMap.TryGetValue(chain, out NumberFormat fmt)) return; - chain.Last.NumberFormatter.NumberFormat = fmt; - }); - } - - [RantFunction] - [RantDescription("Specifies the current digit formatting mode for numbers.")] - private static void Digits(Sandbox sb, - [RantDescription("The digit format to use.")] BinaryFormat format, - [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => - { - chain.Last.NumberFormatter.BinaryFormat = format; - chain.Last.NumberFormatter.BinaryFormatDigits = digits; - }); - - [RantFunction] - [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] - private static void Endian(Sandbox sb, - [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); - - [RantFunction("init")] - [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] - private static void Initial(Sandbox sb, int index) => sb.AttribManager.CurrentAttribs.StartIndex = index; - - [RantFunction("rep", "r")] - [RantDescription("Sets the repetition count for the next block.")] - private static void Rep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times) => sb.AttribManager.CurrentAttribs.Repetitions = times; - - [RantFunction] - [RantDescription("Sets the repetition count to the number of items in the next block.")] - private static void RepEach(Sandbox sb) => sb.AttribManager.CurrentAttribs.RepEach = true; - - [RantFunction("sep")] - private static IEnumerator PrintSep(Sandbox sb) - { - yield return sb.Blocks.Peek().Attribs.Separator; - } - - [RantFunction("sep", "s")] - [RantDescription("Sets the separator pattern for the next block.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.AttribManager.CurrentAttribs.IsSeries = false; - sb.AttribManager.CurrentAttribs.Separator = separator; - } - - [RantFunction("sep", "s")] - [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) - { - sb.AttribManager.CurrentAttribs.IsSeries = true; - sb.AttribManager.CurrentAttribs.Separator = separator; - sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; - } - - [RantFunction("sep", "s")] - [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, - [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) - { - sb.AttribManager.CurrentAttribs.IsSeries = true; - sb.AttribManager.CurrentAttribs.Separator = separator; - sb.AttribManager.CurrentAttribs.EndSeparator = oxford; - sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; - } - - [RantFunction("rs")] - [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] - private static void RepSep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.AttribManager.CurrentAttribs.IsSeries = false; - sb.AttribManager.CurrentAttribs.Repetitions = times; - sb.AttribManager.CurrentAttribs.Separator = separator; - } - - [RantFunction] - [RantDescription("Sets the prefix pattern for the next block.")] - private static void Before(Sandbox sb, - [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.AttribManager.CurrentAttribs.Before = beforeAction; - - [RantFunction] - [RantDescription("Sets the postfix pattern for the next block.")] - private static void After(Sandbox sb, - [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.AttribManager.CurrentAttribs.After = afterAction; - - [RantFunction] - [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] - private static void Chance(Sandbox sb, - [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.AttribManager.CurrentAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; - - [RantFunction("case", "caps")] - [RantDescription("Changes the capitalization mode for all open channels.")] - private static void Case(Sandbox sb, - [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); - - [RantFunction("txtfmt")] - [RantDescription("Sets the text conversion format for all open channels.")] - private static void TxtFmt(Sandbox sb, - [RantDescription("The conversion mode to use.")] - CharConversion format) => sb.Output.SetConversion(format); - - [RantFunction] - [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] - private static void CapsInfer(Sandbox sb, - [RantDescription("A string that is capitalized in the format to be set.")] string sample) - { - var output = sb.Output; - if (string.IsNullOrEmpty(sample)) - { - output.Capitalize(Capitalization.None); - return; - } - var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (words.Length == 1) - { - string word = words[0]; - if (word.Length == 1) - output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); - else if (Util.IsUppercase(word)) - output.Capitalize(Capitalization.Upper); - else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - else - { - // No letters? Forget it. - if (!sample.Any(char.IsLetter)) - { - output.Capitalize(Capitalization.None); - return; - } - - // Is all-caps? - if (Util.IsUppercase(sample)) - { - output.Capitalize(Capitalization.Upper); - return; - } - - var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) - .Select(str => str.Trim()) - .Where(str => - !string.IsNullOrEmpty(str) - && !char.IsDigit(str[0])).ToArray(); - - // All words capitalized? - var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); - if (lwords.Any() && - (sentences.Length == 1 || - sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) - { - if (lwords.All(lw => char.IsUpper(lw[0]))) - { - output.Capitalize(Capitalization.Word); - return; - } - - if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) - { - output.Capitalize(Capitalization.Title); - return; - } - } - - // All sentences capitalized? - bool all = true; - bool none = true; - foreach (string sentence in sentences) - { - bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); - all = all && isCapitalized; - none = none && !isCapitalized; - } - - if (sentences.Length > 1 && all) - output.Capitalize(Capitalization.Sentence); - else if (none) - output.Capitalize(Capitalization.Lower); - else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the first.")] - private static IEnumerator First(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration == 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the first.")] - private static IEnumerator NotFirst(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration > 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the last.")] - private static IEnumerator Last(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == block.Repetitions) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the last.")] - private static IEnumerator NotLast(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration < block.Repetitions) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] - private static IEnumerator Middle(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration > 1 && block.Iteration < block.Repetitions) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] - private static IEnumerator Ends(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == 1 || block.Iteration == block.Repetitions) yield return action; - } - - [RantFunction("repnum", "rn")] - [RantDescription("Prints the iteration number of the current block.")] - private static void RepNum(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration); - } - - [RantFunction("repelapsed", "re")] - [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] - private static void RepElapsed(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration - 1); - } - - [RantFunction("repcount", "rc")] - [RantDescription("Prints the repetition count of the current block.")] - private static void RepCount(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Repetitions); - } - - [RantFunction("reprem", "rr")] - [RantDescription("Prints the number of remaining repetitions queued after the current one.")] - private static void RepRem(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Repetitions - block.Iteration); - } - - [RantFunction("repqueued", "rq")] - [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] - private static void RepQueued(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Repetitions - (block.Iteration - 1)); - } - - [RantFunction] - [RantDescription("Prints the number of currently active blocks.")] - private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); - - [RantFunction("index", "i")] - [RantDescription("Prints the zero-based index of the block item currently being executed.")] - private static void Index(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index); - } - - [RantFunction("index1", "i1")] - [RantDescription("Prints the one-based index of the block item currently being executed.")] - private static void IndexOne(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index + 1); - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an odd number.")] - private static IEnumerator Odd(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an even number.")] - private static IEnumerator Even(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; - } - - [RantFunction] - [RantDescription("Returns the specified argument from the current subroutine.")] - private static IEnumerator Arg(Sandbox sb, - [RantDescription("The name of the argument to retrieve.")] string name) - { - if (!sb.SubroutineArgs.Any()) yield break; - var args = sb.SubroutineArgs.Peek(); - if (args.ContainsKey(name)) - yield return args[name]; - } - - [RantFunction] - [RantDescription("Retrieves and prints the current match string of the active replacer.")] - private static void Match(Sandbox sb) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Value); - } - - [RantFunction] - [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] - private static void Group(Sandbox sb, - [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); - } - - [RantFunction] - [RantDescription("Sets the current rhyming mode for queries.")] - private static void Rhyme(Sandbox sb, - [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; - - [RantFunction("sync", "x")] - [RantDescription("Creates and applies a synchronizer with the specified name and type.")] - private static void Sync(Sandbox sb, - [RantDescription("The name of the synchronizer.")] string name, - [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); - - [RantFunction("xpin")] - [RantDescription("Pins a synchronizer.")] - private static void SyncPin(Sandbox sb, - [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); - - [RantFunction("xunpin")] - [RantDescription("Unpins a synchronizer.")] - private static void SyncUnpin(Sandbox sb, - [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); - - [RantFunction("xstep")] - [RantDescription("Iterates a synchronizer.")] - private static void SyncStep(Sandbox sb, - [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); - - [RantFunction("xreset")] - [RantDescription("Resets a synchronizer to its initial state.")] - private static void SyncReset(Sandbox sb, - [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); - - [RantFunction("quote", "q")] - [RantDescription( - "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] - private static IEnumerator Quote(Sandbox sb, - [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) - { - sb.IncreaseQuote(); - sb.PrintOpeningQuote(); - yield return quoteAction; - sb.PrintClosingQuote(); - sb.DecreaseQuote(); - } - - [RantFunction] - [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] - private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) - { - sb.Output.OpenChannel(channelName, visibility); - yield return pattern; - sb.Output.CloseChannel(); - } - - [RantFunction("target", "t")] - [RantDescription("Places a target with the specified name at the current write position.")] - private static void Target(Sandbox sb, - [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); - - [RantFunction] - [RantDescription("Appends a string to the specified target's contents.")] - private static void Send(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); - - [RantFunction] - [RantDescription("Overwrites the specified target's contents with the provided value.")] - private static void SendOver(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) - { - sb.Output.Do(chain => chain.ClearTarget(targetName)); - sb.Output.PrintToTarget(targetName, value); - } - - [RantFunction("targetval")] - [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] - private static void GetTargetValue(Sandbox sb, - [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); - - [RantFunction("clrt")] - [RantDescription("Clears the contents of the specified target.")] - private static void ClearTarget(Sandbox sb, - [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] - private static IEnumerator Nth(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] - private static IEnumerator NthO(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] - private static IEnumerator NotNth(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." - )] - private static IEnumerator NotNthO(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Sets a pattern that will run before the next block.")] - private static void Start(Sandbox sb, - [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.AttribManager.CurrentAttribs.Start = beforePattern; - - [RantFunction] - [RantDescription("Sets a pattern that will run after the next block.")] - private static void End(Sandbox sb, - [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.AttribManager.CurrentAttribs.End = endPattern; - - // TODO: Finish [persist]. - //[RantFunction] - [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] - private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.AttribManager.CurrentAttribs.Persistence = persistence; - - [RantFunction] - [RantDescription("Loads and runs a pattern from cache or file.")] - private static IEnumerator Import(Sandbox sb, - [RantDescription("The name or path of the pattern to load.")] string name) - { - RST action; - - try - { - action = sb.Engine.GetProgramInternal(name).SyntaxTree; - } - catch (RantCompilerException e) - { - throw new RantRuntimeException(sb, sb.CurrentAction.Location, - $"Failed to compile imported pattern '{name}':\n{e.Message}"); - } - catch (Exception e) - { - throw new RantRuntimeException(sb, sb.CurrentAction.Location, - $"Failed to import '{name}':\n{e.Message}"); - } - - yield return action; - } - - [RantFunction] - [RantDescription("Defines the specified flags.")] - private static void Define(Sandbox sb, - [RantDescription("The list of flags to define.")] params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.Engine.Flags.Add(flag); - } - - [RantFunction] - [RantDescription("Undefines the specified flags.")] - private static void Undef(Sandbox sb, - [RantDescription("The list of flags to undefine.")] params string[] flags) - { - foreach (string flag in flags) sb.Engine.Flags.Remove(flag); - } - - [RantFunction] - [RantDescription("Toggles the specified flags.")] - private static void Toggle(Sandbox sb, params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - { - if (sb.Engine.Flags.Contains(flag)) - sb.Engine.Flags.Remove(flag); - else - sb.Engine.Flags.Add(flag); - } - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] - private static void IfDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = true; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] - private static void IfNDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = false; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition passes.")] - private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) - { - if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) - yield return conditionPassPattern; - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition fails.")] - private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) - { - if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) - yield return conditionFailPattern; - } - - [RantFunction] - [RantDescription("Yields the currenty written output.")] - private static void Yield(Sandbox sb) => sb.SetYield(); - - [RantFunction] - [RantDescription("Branches the internal RNG according to a seed.")] - private static void Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); - - [RantFunction] - [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] - private static IEnumerator Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed, - [RantDescription("The pattern to run on the branch.")] RST branchAction) - { - sb.RNG.Branch(seed.Hash()); - yield return branchAction; - sb.RNG.Merge(); - } - - [RantFunction] - [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] - private static void Merge(Sandbox sb) => sb.RNG.Merge(); - - [RantFunction("in")] - [RantDescription("Prints the value of the specified pattern argument.")] - private static void PatternArg(Sandbox sb, - [RantDescription("The name of the argument to access.")] string argName) - { - if (sb.PatternArgs == null) return; - sb.Output.Print(sb.PatternArgs[argName]); - } - - [RantFunction("tm")] - [RantDescription("Prints the trademark symbol.")] - private static void Trademark(Sandbox sb) => sb.Print("\x2122"); - - [RantFunction("reg")] - [RantDescription("Prints the registered trademark symbol.")] - private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); - - [RantFunction("c")] - [RantDescription("Prints the copyright symbol.")] - private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); - - [RantFunction("em")] - [RantDescription("Prints an emdash.")] - private static void Emdash(Sandbox sb) => sb.Print("\x2014"); - - [RantFunction("en")] - [RantDescription("Prints an endash.")] - private static void Endash(Sandbox sb) => sb.Print("\x2013"); - - [RantFunction("b")] - [RantDescription("Prints a bullet character.")] - private static void Bullet(Sandbox sb) => sb.Print("\x2022"); - - [RantFunction("ss")] - [RantDescription("Prints an eszett (ß).")] - private static void Eszett(Sandbox sb) => sb.Print("\x00df"); - - [RantFunction("emoji")] - [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] - private static void PrintEmoji(Sandbox sb, - [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) - { - shortcode = shortcode.ToLower(); - if (!Emoji.Shortcodes.ContainsKey(shortcode)) - { - sb.Print("[missing emoji]"); - return; - } - sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); - } - - [RantFunction("plural", "pl")] - [RantDescription("Infers and prints the plural form of the specified word.")] - private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); - - [RantFunction] - [RantDescription("Prints the current length of the specified channel, in characters.")] - private static void Len(Sandbox sb, - [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); - - [RantFunction("rev")] - [RantDescription("Reverses the specified string and prints it to the output.")] - private static void Reverse(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = input[i]; - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = input[i]; - } - sb.Print(new string(buffer)); - } - - [RantFunction("revx")] - [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] - private static void ReverseEx(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = Util.ReverseChar(input[i]); - } - sb.Print(new string(buffer)); - } - - [RantFunction("accent")] - [RantDescription("Accents the previous character.")] - private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); - - [RantFunction("accent")] - [RantDescription("Accents the specified character.")] - private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); - - [RantFunction("acute", "act")] - [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] - private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); - - [RantFunction("circumflex", "cflex")] - [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] - private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); - - [RantFunction("grave", "grv")] - [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] - private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); - - [RantFunction("ring")] - [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] - private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); - - [RantFunction("tilde", "tld")] - [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] - private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); - - [RantFunction("diaeresis", "dia")] - [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] - private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); - - [RantFunction("caron", "crn")] - [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] - private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); - - [RantFunction("macron", "mcn")] - [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] - private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); - - [RantFunction("cedilla", "ced")] - [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] - private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); - - [RantFunction("char")] - [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] - private static void Character(Sandbox sb, - [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); - - [RantFunction("rcc")] - [RantDescription("Resets the specified carrier components.")] - private static void ResetCarrier(Sandbox sb, - [RantDescription("The list of carrier component identifiers to reset.")] - params string[] ids) - { - foreach (var id in ids) - { - if (String.IsNullOrWhiteSpace(id)) continue; - sb.CarrierState.DeleteAssociation(id); - sb.CarrierState.DeleteMatch(id); - sb.CarrierState.DeleteRhyme(id); - sb.CarrierState.DeleteUnique(id); - } - } - - [RantFunction("query")] - private static IEnumerator QueryRun(Sandbox sb) - { - return sb.QueryBuilder.CurrentQuery?.Run(sb); - } - - [RantFunction("qname")] - private static void QueryName(Sandbox sb, string id, string name) - { - sb.QueryBuilder.GetQuery(id).Name = name; - } - - [RantFunction("qsub")] - private static void QuerySubtype(Sandbox sb, string id, string name) - { - sb.QueryBuilder.GetQuery(id).Subtype = name; - } - - [RantFunction("qcf")] - private static void QueryClassFilterPositive(Sandbox sb, string id, params string[] classes) - { - Query q; - ClassFilter cf; - cf = (q = sb.QueryBuilder.GetQuery(id)).GetFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; - if (cf == null) q.AddFilter(cf = new ClassFilter()); - foreach (var cl in classes) - { - cf.AddRule(new ClassFilterRule(cl, true)); - } - } - - [RantFunction("qcfn")] - private static void QueryClassFilterNegative(Sandbox sb, string id, params string[] classes) - { - Query q; - ClassFilter cf; - cf = (q = sb.QueryBuilder.GetQuery(id)).GetFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; - if (cf == null) q.AddFilter(cf = new ClassFilter()); - foreach (var cl in classes) - { - cf.AddRule(new ClassFilterRule(cl, false)); - } - } - - [RantFunction("pipe")] - [RantDescription("Redirects the output from the next block into the specified callback. Access block output with [item].")] - private static void Redirect(Sandbox sb, - [RantDescription("The callback to redirect block output to.")] - RST redirectCallback) - { - sb.AttribManager.CurrentAttribs.Redirect = redirectCallback; - } - - [RantFunction("item")] - [RantDescription("Prints the main output from the current block iteration.")] - private static void RedirectedItem(Sandbox sb) - { - sb.Print(sb.GetRedirectedOutput().Main); - } - - [RantFunction("item")] - [RantDescription("Prints the specified channel from the current block iteration.")] - private static void RedirectedItem(Sandbox sb, string channel) - { - sb.Print(sb.GetRedirectedOutput()[channel]); - } - - [RantFunction("protect")] - [RantDescription("Spawns a new block attribute context for the specified callback so any blocks therein will not consume the current attributes.")] - private static IEnumerator Protect(Sandbox sb, - [RantDescription("The callback to protect.")] - RST pattern) - { - sb.AttribManager.AddLayer(); - yield return pattern; - sb.AttribManager.RemoveLayer(); - } - - [RantFunction("vs")] - private static void VariableSet(Sandbox sb, string name, string value) - { - sb.Objects[name] = new RantObject(value); - } - - [RantFunction("vn")] - private static void VariableSet(Sandbox sb, string name, double value) - { - sb.Objects[name] = new RantObject(value); - } - - [RantFunction("vn")] - private static void VariableSet(Sandbox sb, string name, int min, int max) - { - sb.Objects[name] = new RantObject(sb.RNG.Next(min, max + 1)); - } - - [RantFunction("vp")] - private static void VariableSetLazy(Sandbox sb, string name, RST value) - { - sb.Objects[name] = new RantObject(value); - } - - [RantFunction("vcpy")] - private static void VariableCopy(Sandbox sb, string a, string b) - { - sb.Objects[b] = sb.Objects[a].Clone(); - } - - [RantFunction("v")] - private static IEnumerator VariableGet(Sandbox sb, string name) - { - var o = sb.Objects[name]; - if (o == null) - { - throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", name); - } - - if (o.Type == RantObjectType.Action) - { - yield return o.Value as RST; - } - else - { - sb.Print(o); - } - } - - [RantFunction("add")] - private static void AddVal(Sandbox sb, double a, double b) - { - sb.Print(a + b); - } - - [RantFunction("vadd")] - private static void AddVar(Sandbox sb, string a, double b) - { - sb.Objects[a] += new RantObject(b); - } - - [RantFunction("sub")] - private static void SubVal(Sandbox sb, double a, double b) - { - sb.Print(a - b); - } - - [RantFunction("vsub")] - private static void SubVar(Sandbox sb, string a, double b) - { - sb.Objects[a] -= new RantObject(b); - } + // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. + // They may return either void or IEnumerator depending on your needs. + internal static partial class RantFunctionRegistry + { + [RantFunction("num", "n")] + [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] + private static void Number(Sandbox sb, + [RantDescription("The minimum value of the number to generate.")] int min, + [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); + + [RantFunction("num")] + [RantDescription("Formats an input string using the current number format settings and prints the result.")] + private static void Number(Sandbox sb, + [RantDescription("The string to convert into a number.")] string input) + { + sb.Print(double.TryParse(input, out double number) ? number : 0); + } + + [RantFunction("numfmt")] + [RantDescription("Sets the current number formatting mode.")] + private static void NumberFormat(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); + + [RantFunction("numfmt")] + [RantDescription("Runs the specified pattern under a specific number formatting mode.")] + private static IEnumerator NumberFormatRange(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format, + [RantDescription("The pattern to run.")] RST rangeAction) + { + var oldFmtMap = new Dictionary(); + + sb.Output.Do(chain => + { + oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; + chain.Last.NumberFormatter.NumberFormat = format; + }); + + yield return rangeAction; + + sb.Output.Do(chain => + { + if (!oldFmtMap.TryGetValue(chain, out NumberFormat fmt)) return; + chain.Last.NumberFormatter.NumberFormat = fmt; + }); + } + + [RantFunction] + [RantDescription("Specifies the current digit formatting mode for numbers.")] + private static void Digits(Sandbox sb, + [RantDescription("The digit format to use.")] BinaryFormat format, + [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => + { + chain.Last.NumberFormatter.BinaryFormat = format; + chain.Last.NumberFormatter.BinaryFormatDigits = digits; + }); + + [RantFunction] + [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] + private static void Endian(Sandbox sb, + [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); + + [RantFunction("init")] + [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] + private static void Initial(Sandbox sb, int index) => sb.AttribManager.CurrentAttribs.StartIndex = index; + + [RantFunction("rep", "r")] + [RantDescription("Sets the repetition count for the next block.")] + private static void Rep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times) => sb.AttribManager.CurrentAttribs.Repetitions = times; + + [RantFunction] + [RantDescription("Sets the repetition count to the number of items in the next block.")] + private static void RepEach(Sandbox sb) => sb.AttribManager.CurrentAttribs.RepEach = true; + + [RantFunction("sep")] + private static IEnumerator PrintSep(Sandbox sb) + { + yield return sb.Blocks.Peek().Attribs.Separator; + } + + [RantFunction("sep", "s")] + [RantDescription("Sets the separator pattern for the next block.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.AttribManager.CurrentAttribs.IsSeries = false; + sb.AttribManager.CurrentAttribs.Separator = separator; + } + + [RantFunction("sep", "s")] + [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) + { + sb.AttribManager.CurrentAttribs.IsSeries = true; + sb.AttribManager.CurrentAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; + } + + [RantFunction("sep", "s")] + [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, + [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) + { + sb.AttribManager.CurrentAttribs.IsSeries = true; + sb.AttribManager.CurrentAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.EndSeparator = oxford; + sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; + } + + [RantFunction("rs")] + [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] + private static void RepSep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.AttribManager.CurrentAttribs.IsSeries = false; + sb.AttribManager.CurrentAttribs.Repetitions = times; + sb.AttribManager.CurrentAttribs.Separator = separator; + } + + [RantFunction] + [RantDescription("Sets the prefix pattern for the next block.")] + private static void Before(Sandbox sb, + [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.AttribManager.CurrentAttribs.Before = beforeAction; + + [RantFunction] + [RantDescription("Sets the postfix pattern for the next block.")] + private static void After(Sandbox sb, + [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.AttribManager.CurrentAttribs.After = afterAction; + + [RantFunction] + [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] + private static void Chance(Sandbox sb, + [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.AttribManager.CurrentAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; + + [RantFunction("case", "caps")] + [RantDescription("Changes the capitalization mode for all open channels.")] + private static void Case(Sandbox sb, + [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); + + [RantFunction("txtfmt")] + [RantDescription("Sets the text conversion format for all open channels.")] + private static void TxtFmt(Sandbox sb, + [RantDescription("The conversion mode to use.")] + CharConversion format) => sb.Output.SetConversion(format); + + [RantFunction] + [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] + private static void CapsInfer(Sandbox sb, + [RantDescription("A string that is capitalized in the format to be set.")] string sample) + { + var output = sb.Output; + if (string.IsNullOrEmpty(sample)) + { + output.Capitalize(Capitalization.None); + return; + } + var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (words.Length == 1) + { + string word = words[0]; + if (word.Length == 1) + output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); + else if (Util.IsUppercase(word)) + output.Capitalize(Capitalization.Upper); + else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + else + { + // No letters? Forget it. + if (!sample.Any(char.IsLetter)) + { + output.Capitalize(Capitalization.None); + return; + } + + // Is all-caps? + if (Util.IsUppercase(sample)) + { + output.Capitalize(Capitalization.Upper); + return; + } + + var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) + .Select(str => str.Trim()) + .Where(str => + !string.IsNullOrEmpty(str) + && !char.IsDigit(str[0])).ToArray(); + + // All words capitalized? + var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); + if (lwords.Any() && + (sentences.Length == 1 || + sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) + { + if (lwords.All(lw => char.IsUpper(lw[0]))) + { + output.Capitalize(Capitalization.Word); + return; + } + + if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) + { + output.Capitalize(Capitalization.Title); + return; + } + } + + // All sentences capitalized? + bool all = true; + bool none = true; + foreach (string sentence in sentences) + { + bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); + all = all && isCapitalized; + none = none && !isCapitalized; + } + + if (sentences.Length > 1 && all) + output.Capitalize(Capitalization.Sentence); + else if (none) + output.Capitalize(Capitalization.Lower); + else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the first.")] + private static IEnumerator First(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration == 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the first.")] + private static IEnumerator NotFirst(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration > 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the last.")] + private static IEnumerator Last(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the last.")] + private static IEnumerator NotLast(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration < block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] + private static IEnumerator Middle(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration > 1 && block.Iteration < block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] + private static IEnumerator Ends(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == 1 || block.Iteration == block.Repetitions) yield return action; + } + + [RantFunction("repnum", "rn")] + [RantDescription("Prints the iteration number of the current block.")] + private static void RepNum(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration); + } + + [RantFunction("repelapsed", "re")] + [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] + private static void RepElapsed(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration - 1); + } + + [RantFunction("repcount", "rc")] + [RantDescription("Prints the repetition count of the current block.")] + private static void RepCount(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Repetitions); + } + + [RantFunction("reprem", "rr")] + [RantDescription("Prints the number of remaining repetitions queued after the current one.")] + private static void RepRem(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Repetitions - block.Iteration); + } + + [RantFunction("repqueued", "rq")] + [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] + private static void RepQueued(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Repetitions - (block.Iteration - 1)); + } + + [RantFunction] + [RantDescription("Prints the number of currently active blocks.")] + private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); + + [RantFunction("index", "i")] + [RantDescription("Prints the zero-based index of the block item currently being executed.")] + private static void Index(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index); + } + + [RantFunction("index1", "i1")] + [RantDescription("Prints the one-based index of the block item currently being executed.")] + private static void IndexOne(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index + 1); + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an odd number.")] + private static IEnumerator Odd(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an even number.")] + private static IEnumerator Even(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; + } + + [RantFunction] + [RantDescription("Returns the specified argument from the current subroutine.")] + private static IEnumerator Arg(Sandbox sb, + [RantDescription("The name of the argument to retrieve.")] string name) + { + if (!sb.SubroutineArgs.Any()) yield break; + var args = sb.SubroutineArgs.Peek(); + if (args.ContainsKey(name)) + yield return args[name]; + } + + [RantFunction] + [RantDescription("Retrieves and prints the current match string of the active replacer.")] + private static void Match(Sandbox sb) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Value); + } + + [RantFunction] + [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] + private static void Group(Sandbox sb, + [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); + } + + [RantFunction] + [RantDescription("Sets the current rhyming mode for queries.")] + private static void Rhyme(Sandbox sb, + [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; + + [RantFunction("sync", "x")] + [RantDescription("Creates and applies a synchronizer with the specified name and type.")] + private static void Sync(Sandbox sb, + [RantDescription("The name of the synchronizer.")] string name, + [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); + + [RantFunction("xpin")] + [RantDescription("Pins a synchronizer.")] + private static void SyncPin(Sandbox sb, + [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); + + [RantFunction("xunpin")] + [RantDescription("Unpins a synchronizer.")] + private static void SyncUnpin(Sandbox sb, + [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); + + [RantFunction("xstep")] + [RantDescription("Iterates a synchronizer.")] + private static void SyncStep(Sandbox sb, + [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); + + [RantFunction("xreset")] + [RantDescription("Resets a synchronizer to its initial state.")] + private static void SyncReset(Sandbox sb, + [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); + + [RantFunction("quote", "q")] + [RantDescription( + "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] + private static IEnumerator Quote(Sandbox sb, + [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) + { + sb.IncreaseQuote(); + sb.PrintOpeningQuote(); + yield return quoteAction; + sb.PrintClosingQuote(); + sb.DecreaseQuote(); + } + + [RantFunction] + [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] + private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) + { + sb.Output.OpenChannel(channelName, visibility); + yield return pattern; + sb.Output.CloseChannel(); + } + + [RantFunction("target", "t")] + [RantDescription("Places a target with the specified name at the current write position.")] + private static void Target(Sandbox sb, + [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); + + [RantFunction] + [RantDescription("Appends a string to the specified target's contents.")] + private static void Send(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); + + [RantFunction] + [RantDescription("Overwrites the specified target's contents with the provided value.")] + private static void SendOver(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) + { + sb.Output.Do(chain => chain.ClearTarget(targetName)); + sb.Output.PrintToTarget(targetName, value); + } + + [RantFunction("targetval")] + [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] + private static void GetTargetValue(Sandbox sb, + [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); + + [RantFunction("clrt")] + [RantDescription("Clears the contents of the specified target.")] + private static void ClearTarget(Sandbox sb, + [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] + private static IEnumerator Nth(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] + private static IEnumerator NthO(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] + private static IEnumerator NotNth(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." + )] + private static IEnumerator NotNthO(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Sets a pattern that will run before the next block.")] + private static void Start(Sandbox sb, + [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.AttribManager.CurrentAttribs.Start = beforePattern; + + [RantFunction] + [RantDescription("Sets a pattern that will run after the next block.")] + private static void End(Sandbox sb, + [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.AttribManager.CurrentAttribs.End = endPattern; + + // TODO: Finish [persist]. + //[RantFunction] + [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] + private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.AttribManager.CurrentAttribs.Persistence = persistence; + + [RantFunction] + [RantDescription("Loads and runs a pattern from cache or file.")] + private static IEnumerator Import(Sandbox sb, + [RantDescription("The name or path of the pattern to load.")] string name) + { + RST action; + + try + { + action = sb.Engine.GetProgramInternal(name).SyntaxTree; + } + catch (RantCompilerException e) + { + throw new RantRuntimeException(sb, sb.CurrentAction.Location, + $"Failed to compile imported pattern '{name}':\n{e.Message}"); + } + catch (Exception e) + { + throw new RantRuntimeException(sb, sb.CurrentAction.Location, + $"Failed to import '{name}':\n{e.Message}"); + } + + yield return action; + } + + [RantFunction] + [RantDescription("Defines the specified flags.")] + private static void Define(Sandbox sb, + [RantDescription("The list of flags to define.")] params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.Engine.Flags.Add(flag); + } + + [RantFunction] + [RantDescription("Undefines the specified flags.")] + private static void Undef(Sandbox sb, + [RantDescription("The list of flags to undefine.")] params string[] flags) + { + foreach (string flag in flags) sb.Engine.Flags.Remove(flag); + } + + [RantFunction] + [RantDescription("Toggles the specified flags.")] + private static void Toggle(Sandbox sb, params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + { + if (sb.Engine.Flags.Contains(flag)) + sb.Engine.Flags.Remove(flag); + else + sb.Engine.Flags.Add(flag); + } + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] + private static void IfDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = true; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] + private static void IfNDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = false; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition passes.")] + private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) + { + if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) + yield return conditionPassPattern; + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition fails.")] + private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) + { + if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) + yield return conditionFailPattern; + } + + [RantFunction] + [RantDescription("Yields the currenty written output.")] + private static void Yield(Sandbox sb) => sb.SetYield(); + + [RantFunction] + [RantDescription("Branches the internal RNG according to a seed.")] + private static void Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); + + [RantFunction] + [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] + private static IEnumerator Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed, + [RantDescription("The pattern to run on the branch.")] RST branchAction) + { + sb.RNG.Branch(seed.Hash()); + yield return branchAction; + sb.RNG.Merge(); + } + + [RantFunction] + [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] + private static void Merge(Sandbox sb) => sb.RNG.Merge(); + + [RantFunction("in")] + [RantDescription("Prints the value of the specified pattern argument.")] + private static void PatternArg(Sandbox sb, + [RantDescription("The name of the argument to access.")] string argName) + { + if (sb.PatternArgs == null) return; + sb.Output.Print(sb.PatternArgs[argName]); + } + + [RantFunction("tm")] + [RantDescription("Prints the trademark symbol.")] + private static void Trademark(Sandbox sb) => sb.Print("\x2122"); + + [RantFunction("reg")] + [RantDescription("Prints the registered trademark symbol.")] + private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); + + [RantFunction("c")] + [RantDescription("Prints the copyright symbol.")] + private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); + + [RantFunction("em")] + [RantDescription("Prints an emdash.")] + private static void Emdash(Sandbox sb) => sb.Print("\x2014"); + + [RantFunction("en")] + [RantDescription("Prints an endash.")] + private static void Endash(Sandbox sb) => sb.Print("\x2013"); + + [RantFunction("b")] + [RantDescription("Prints a bullet character.")] + private static void Bullet(Sandbox sb) => sb.Print("\x2022"); + + [RantFunction("ss")] + [RantDescription("Prints an eszett (ß).")] + private static void Eszett(Sandbox sb) => sb.Print("\x00df"); + + [RantFunction("emoji")] + [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] + private static void PrintEmoji(Sandbox sb, + [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) + { + shortcode = shortcode.ToLower(); + if (!Emoji.Shortcodes.ContainsKey(shortcode)) + { + sb.Print("[missing emoji]"); + return; + } + sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); + } + + [RantFunction("plural", "pl")] + [RantDescription("Infers and prints the plural form of the specified word.")] + private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); + + [RantFunction] + [RantDescription("Prints the current length of the specified channel, in characters.")] + private static void Len(Sandbox sb, + [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); + + [RantFunction("rev")] + [RantDescription("Reverses the specified string and prints it to the output.")] + private static void Reverse(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = input[i]; + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = input[i]; + } + sb.Print(new string(buffer)); + } + + [RantFunction("revx")] + [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] + private static void ReverseEx(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = Util.ReverseChar(input[i]); + } + sb.Print(new string(buffer)); + } + + [RantFunction("accent")] + [RantDescription("Accents the previous character.")] + private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); + + [RantFunction("accent")] + [RantDescription("Accents the specified character.")] + private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); + + [RantFunction("acute", "act")] + [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] + private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); + + [RantFunction("circumflex", "cflex")] + [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] + private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); + + [RantFunction("grave", "grv")] + [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] + private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); + + [RantFunction("ring")] + [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] + private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); + + [RantFunction("tilde", "tld")] + [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] + private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); + + [RantFunction("diaeresis", "dia")] + [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] + private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); + + [RantFunction("caron", "crn")] + [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] + private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); + + [RantFunction("macron", "mcn")] + [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] + private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); + + [RantFunction("cedilla", "ced")] + [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] + private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); + + [RantFunction("char")] + [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] + private static void Character(Sandbox sb, + [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); + + [RantFunction("rcc")] + [RantDescription("Resets the specified carrier components.")] + private static void ResetCarrier(Sandbox sb, + [RantDescription("The list of carrier component identifiers to reset.")] + params string[] ids) + { + foreach (var id in ids) + { + if (String.IsNullOrWhiteSpace(id)) continue; + sb.CarrierState.DeleteAssociation(id); + sb.CarrierState.DeleteMatch(id); + sb.CarrierState.DeleteRhyme(id); + sb.CarrierState.DeleteUnique(id); + } + } + + [RantFunction("query")] + private static IEnumerator QueryRun(Sandbox sb) + { + return sb.QueryBuilder.CurrentQuery?.Run(sb); + } + + [RantFunction("qname")] + private static void QueryName(Sandbox sb, string id, string name) + { + sb.QueryBuilder.GetQuery(id).Name = name; + } + + [RantFunction("qsub")] + private static void QuerySubtype(Sandbox sb, string id, string name) + { + sb.QueryBuilder.GetQuery(id).Subtype = name; + } + + [RantFunction("qcf")] + private static void QueryClassFilterPositive(Sandbox sb, string id, params string[] classes) + { + Query q; + ClassFilter cf; + cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; + if (cf == null) q.AddFilter(cf = new ClassFilter()); + foreach (var cl in classes) + { + cf.AddRule(new ClassFilterRule(cl, true)); + } + } + + [RantFunction("qcfn")] + private static void QueryClassFilterNegative(Sandbox sb, string id, params string[] classes) + { + Query q; + ClassFilter cf; + cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; + if (cf == null) q.AddFilter(cf = new ClassFilter()); + foreach (var cl in classes) + { + cf.AddRule(new ClassFilterRule(cl, false)); + } + } + + [RantFunction("pipe")] + [RantDescription("Redirects the output from the next block into the specified callback. Access block output with [item].")] + private static void Redirect(Sandbox sb, + [RantDescription("The callback to redirect block output to.")] + RST redirectCallback) + { + sb.AttribManager.CurrentAttribs.Redirect = redirectCallback; + } + + [RantFunction("item")] + [RantDescription("Prints the main output from the current block iteration.")] + private static void RedirectedItem(Sandbox sb) + { + sb.Print(sb.GetRedirectedOutput().Main); + } + + [RantFunction("item")] + [RantDescription("Prints the specified channel from the current block iteration.")] + private static void RedirectedItem(Sandbox sb, string channel) + { + sb.Print(sb.GetRedirectedOutput()[channel]); + } + + [RantFunction("protect")] + [RantDescription("Spawns a new block attribute context for the specified callback so any blocks therein will not consume the current attributes.")] + private static IEnumerator Protect(Sandbox sb, + [RantDescription("The callback to protect.")] + RST pattern) + { + sb.AttribManager.AddLayer(); + yield return pattern; + sb.AttribManager.RemoveLayer(); + } + + [RantFunction("vs")] + private static void VariableSet(Sandbox sb, string name, string value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vn")] + private static void VariableSet(Sandbox sb, string name, double value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vn")] + private static void VariableSet(Sandbox sb, string name, int min, int max) + { + sb.Objects[name] = new RantObject(sb.RNG.Next(min, max + 1)); + } + + [RantFunction("vp")] + private static void VariableSetLazy(Sandbox sb, string name, RST value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vcpy")] + private static void VariableCopy(Sandbox sb, string a, string b) + { + sb.Objects[b] = sb.Objects[a].Clone(); + } + + [RantFunction("v")] + private static IEnumerator VariableGet(Sandbox sb, string name) + { + var o = sb.Objects[name]; + if (o == null) + { + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", name); + } + + if (o.Type == RantObjectType.Action) + { + yield return o.Value as RST; + } + else + { + sb.Print(o); + } + } + + [RantFunction("add")] + private static void AddVal(Sandbox sb, double a, double b) + { + sb.Print(a + b); + } + + [RantFunction("vadd")] + private static void AddVar(Sandbox sb, string a, double b) + { + sb.Objects[a] += new RantObject(b); + } + + [RantFunction("sub")] + private static void SubVal(Sandbox sb, double a, double b) + { + sb.Print(a - b); + } + + [RantFunction("vsub")] + private static void SubVar(Sandbox sb, string a, double b) + { + sb.Objects[a] -= new RantObject(b); + } [RantFunction("mul")] private static void MulVal(Sandbox sb, double a, double b) @@ -1109,9 +1109,9 @@ private static void Swap(Sandbox sb, string a, string b) [RantFunction("veq")] private static void CompEquals(Sandbox sb, RantObject a, RantObject b) - { - sb.Print(a.Value.Equals(b.Value) ? TRUE : FALSE); - } + { + sb.Print(a.Value.Equals(b.Value) ? TRUE : FALSE); + } [RantFunction("eq")] private static void CompEquals(Sandbox sb, string a, string b) @@ -1187,7 +1187,7 @@ private static void And(Sandbox sb, bool a, params bool[] b) sb.Print(FALSE); return; } - for(int i = 0; i < b.Length; i++) + for (int i = 0; i < b.Length; i++) { result = result && b[i]; } @@ -1253,10 +1253,10 @@ private static void Maybe(Sandbox sb) } [RantFunction("if")] - private static IEnumerator If(Sandbox sb, bool condition, RST body) - { - if (condition) yield return body; - } + private static IEnumerator If(Sandbox sb, bool condition, RST body) + { + if (condition) yield return body; + } [RantFunction("ifnot", "ifn")] private static IEnumerator IfNot(Sandbox sb, bool condition, RST body) diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index d8173e3..0b8362a 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -267,9 +267,8 @@ + - - diff --git a/Rant/Vocabulary/ClassCache.cs b/Rant/Vocabulary/ClassCache.cs new file mode 100644 index 0000000..caac114 --- /dev/null +++ b/Rant/Vocabulary/ClassCache.cs @@ -0,0 +1,105 @@ +#region License +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; + +using Rant.Vocabulary.Querying; + +namespace Rant.Vocabulary +{ + internal sealed class ClassCache + { + private readonly Dictionary> _cache = new Dictionary>(); + private readonly Dictionary> _invCache = new Dictionary>(); + + public void BuildCache(RantDictionaryTable table) + { + _cache.Clear(); + _invCache.Clear(); + var clSet = new HashSet(); + + foreach (var entry in table.GetEntries()) + { + foreach (var cl in entry.GetClasses()) + { + HashSet set; + clSet.Add(cl); + if (!_cache.TryGetValue(cl, out set)) + { + set = _cache[cl] = new HashSet(); + } + set.Add(entry); + } + } + + foreach (var cl in clSet) + { + if (!_invCache.TryGetValue(cl, out HashSet set)) + { + set = _invCache[cl] = new HashSet(); + } + foreach (var entry in table.GetEntries()) + { + if (!entry.ContainsClass(cl)) set.Add(entry); + } + } + } + + public IEnumerable Filter(IEnumerable rules, RantDictionary dictionary, RantDictionaryTable table) + { + var r = rules.ToArray(); + if (r.Length == 0) return table.GetEntries(); + HashSet setCached; + var set = new HashSet(); + var hide = table.HiddenClasses + // Exclude overridden hidden classes + .Except(dictionary.IncludedHiddenClasses) + // Exclude hidden classes filtered for + .Where(cl => !r.Any(rule => rule.ShouldMatch && String.Equals(rule.Class, cl, StringComparison.InvariantCultureIgnoreCase))).ToArray(); + + // Get initial pool + if (r[0].ShouldMatch) + { + if (!_cache.TryGetValue(r[0].Class, out setCached)) return null; + } + else + { + if (!_invCache.TryGetValue(r[0].Class, out setCached)) setCached = table.EntriesHash; + } + + foreach (var item in setCached) + { + if (hide.Length == 0 || !hide.Any(cl => item.ContainsClass(cl))) set.Add(item); + } + + for (int i = 1; i < r.Length; i++) + { + set.IntersectWith(r[i].ShouldMatch ? _cache[r[i].Class] : _invCache[r[i].Class]); + } + + return set; + } + } +} \ No newline at end of file diff --git a/Rant/Vocabulary/ClassTree.cs b/Rant/Vocabulary/ClassTree.cs deleted file mode 100644 index b189a6a..0000000 --- a/Rant/Vocabulary/ClassTree.cs +++ /dev/null @@ -1,148 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System.Collections.Generic; -using System.Linq; - -namespace Rant.Vocabulary -{ - internal class ClassTree - { - private const int MAX_DEPTH = 4; - - public ClassTreeNode RootNode; - - public ClassTree(IEnumerable entries) - { - RootNode = new ClassTreeNode - { - Name = "root", - Classes = new string[] { }, - Entries = entries.Where(e => !e.HasClasses).ToList() - }; - - var rootClasses = OrderClasses(new string[] { }, entries); - foreach (string className in rootClasses) - { - var node = new ClassTreeNode { Name = className, Classes = new[] { className } }; - - PopulateNode(node, entries.Where(e => e.ContainsClass(className))); - CountNode(node); - - RootNode.ChildNodes[className] = node; - } - } - - public IEnumerable Query(IEnumerable classes, HashSet hiddenClasses) - { - return QueryNode(RootNode, new HashSet(classes), hiddenClasses); - } - - private IEnumerable QueryNode(ClassTreeNode node, HashSet classes, HashSet hiddenClasses) - { - if (node.DepthLimit) - return node.Entries.Where(e => classes.All(c => e.ContainsClass(c))); - - // find the largest class - var largestClass = node.ChildNodes - .Where(kv => classes.Contains(kv.Key)) - .OrderByDescending(kv => kv.Value.Count) - .Select(kv => kv.Value) - .FirstOrDefault(); - - if (largestClass == default(ClassTreeNode)) - { - if (classes.Any()) - return new List(); - return node.Entries.Where(e => !e.GetClasses().Any(c => hiddenClasses.Contains(c))); - } - - return QueryNode(largestClass, new HashSet(classes.Where(c => c != largestClass.Name)), hiddenClasses); - } - - private void PopulateNode(ClassTreeNode node, IEnumerable entries) - { - node.Entries = entries.Where(e => e.ClassCount >= node.Classes.Length).ToList(); - var otherEntries = entries.Where(e => e.ClassCount > node.Classes.Length); - - if (node.Depth == MAX_DEPTH) - { - node.DepthLimit = true; - return; - } - - var classes = OrderClasses(node.Classes, otherEntries); - foreach (string className in classes) - { - var childNode = new ClassTreeNode { Name = className, Classes = node.Classes.Concat(new[] { className }).ToArray() }; - childNode.Depth = node.Depth + 1; - - PopulateNode(childNode, otherEntries.Where(e => e.ContainsClass(className))); - CountNode(node); - - node.ChildNodes[className] = childNode; - } - } - - private int CountNode(ClassTreeNode node) - { - int count = node.Entries.Count; - - foreach (var child in node.ChildNodes.Values) - count += CountNode(child); - - node.Count = count; - return count; - } - - private IEnumerable OrderClasses(string[] ignoreClasses, IEnumerable entries) - { - var classCounts = new Dictionary(); - - foreach (var entry in entries) - { - foreach (string c in entry.GetClasses()) - { - if (ignoreClasses.Contains(c)) continue; - - classCounts[c] = classCounts.ContainsKey(c) ? classCounts[c] + 1 : 1; - } - } - - return classCounts.OrderByDescending(kv => kv.Value).Select(kv => kv.Key); - } - } - - internal class ClassTreeNode - { - public Dictionary ChildNodes = new Dictionary(); - public string[] Classes; - public int Count = 0; - public int Depth = 1; - public bool DepthLimit = false; - public List Entries = new List(); - public string Name; - } -} \ No newline at end of file diff --git a/Rant/Vocabulary/Legacy/DicLexer.cs b/Rant/Vocabulary/Legacy/DicLexer.cs deleted file mode 100644 index 6939729..0000000 --- a/Rant/Vocabulary/Legacy/DicLexer.cs +++ /dev/null @@ -1,125 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System.Collections.Generic; -using System.Globalization; -using System.IO; - -namespace Rant.Vocabulary -{ - internal static class DicLexer - { - public static IEnumerable Tokenize(string source, string data) - { - var reader = new StringReader(data); - string currentLine; - char firstChar; - int lineNumber = 1; - - while (reader.Peek() >= 0) - { - lineNumber++; - - currentLine = reader.ReadLine().Trim(); - if (string.IsNullOrWhiteSpace(currentLine)) continue; - firstChar = currentLine[0]; - - switch (firstChar) - { - case '#': - yield return new DicToken(DicTokenType.Directive, lineNumber, currentLine.Substring(1).Trim()); - break; - case '@': - break; - case '>': - { - currentLine = currentLine.Substring(1); - - bool diffmark = false; - if (currentLine[0] == '>') - { - diffmark = true; - currentLine = currentLine.Substring(1); - } - - yield return new DicToken(diffmark ? DicTokenType.DiffEntry : DicTokenType.Entry, lineNumber, currentLine.Trim()); - break; - } - case '|': - yield return new DicToken(DicTokenType.Property, lineNumber, currentLine.Substring(1).Trim()); - break; - default: - throw new InvalidDataException($"{source}: (Line {lineNumber}, Col 1) Unexpected token: '{firstChar}'."); - } - } - - yield return new DicToken(DicTokenType.EOF, lineNumber, null); - } - } - - internal enum DicTokenType - { - Directive, - Entry, - DiffEntry, - Property, - Ignore, - EOF - } - - internal struct DicToken - { - public static readonly DicToken None = new DicToken(DicTokenType.Ignore, 1, null); - public DicTokenType Type; - public string Value; - public int Line; - - public DicToken(DicTokenType type, int line, string value) - { - Type = type; - Value = value; - Line = line; - } - - public DicToken(DicTokenType type, int line, char value) - { - Type = type; - Value = value.ToString(CultureInfo.InvariantCulture); - Line = line; - } - - public static implicit operator string(DicToken token) - { - return token.Value; - } - - public static implicit operator DicToken(string data) - { - return new DicToken(DicTokenType.Ignore, 1, data); - } - - public int Length => Value?.Length ?? 0; - } -} \ No newline at end of file diff --git a/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs b/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs deleted file mode 100644 index 666b8fa..0000000 --- a/Rant/Vocabulary/Legacy/RantDictionaryTable.Loader.cs +++ /dev/null @@ -1,307 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; - -using Rant.Core.Utilities; -using Rant.Vocabulary.Utilities; - -namespace Rant.Vocabulary -{ - public sealed partial class RantDictionaryTable - { - /// - /// Loads a RantDictionary from the file at the specified path. - /// - /// The path to the file to load. - /// - public static RantDictionaryTable FromLegacyFile(string path) - { - string name = ""; - string[] subtypes = { "default" }; - bool header = true; - - var scopedClassSet = new HashSet(); - RantDictionaryEntry entry = null; - var entries = new List(); - var entryStringes = new List(); - var types = new Dictionary(); - var hiddenClasses = new HashSet { "nsfw" }; - - foreach (var token in DicLexer.Tokenize(path, File.ReadAllText(path))) - { - switch (token.Type) - { - case DicTokenType.Directive: - { - var parts = VocabUtils.GetArgs(token.Value).ToArray(); - if (!parts.Any()) continue; - string dirName = parts.First().ToLower(); - var args = parts.Skip(1).ToArray(); - - switch (dirName) - { - case "name": - if (!header) LoadError(path, token, "The #name directive may only be used in the file header."); - if (args.Length != 1) LoadError(path, token, "#name directive expected one word:\r\n\r\n" + token.Value); - if (!Util.ValidateName(args[0])) LoadError(path, token, $"Invalid #name value: '{args[1]}'"); - name = args[0].ToLower(); - break; - case "subs": - if (!header) LoadError(path, token, "The #subs directive may only be used in the file header."); - subtypes = args.Select(s => s.Trim().ToLower()).ToArray(); - break; - case "version": // Kept here for backwards-compatability - if (!header) LoadError(path, token, "The #version directive may only be used in the file header."); - break; - case "hidden": - if (!header) LoadError(path, token, "The #hidden directive may only be used in the file header."); - if (Util.ValidateName(args[0])) hiddenClasses.Add(args[0]); - break; - // Deprecated, remove in Rant 3 - case "nsfw": - scopedClassSet.Add("nsfw"); - break; - // Deprecated, remove in Rant 3 - case "sfw": - scopedClassSet.Remove("nsfw"); - break; - case "class": - { - if (args.Length < 2) LoadError(path, token, "The #class directive expects an operation and at least one value."); - switch (args[0].ToLower()) - { - case "add": - foreach (string cl in args.Skip(1)) - scopedClassSet.Add(cl.ToLower()); - break; - case "remove": - foreach (string cl in args.Skip(1)) - scopedClassSet.Remove(cl.ToLower()); - break; - } - } - break; - case "type": - { - if (!header) LoadError(path, token, "The #type directive may only be used in the file header."); - if (args.Length != 3) LoadError(path, token, "#type directive requires 3 arguments."); - types.Add(args[0], new EntryTypeDef(args[0], args[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), - Util.IsNullOrWhiteSpace(args[2]) ? null : new EntryTypeDefFilter(args[2]))); - } - break; - } - } - break; - case DicTokenType.Entry: - { - if (Util.IsNullOrWhiteSpace(name)) - LoadError(path, token, "Missing table name before entry list."); - if (Util.IsNullOrWhiteSpace(token.Value)) - LoadError(path, token, "Encountered empty entry."); - header = false; - entry = new RantDictionaryEntry(token.Value.Split('/').Select(s => s.Trim()).ToArray(), scopedClassSet); - entries.Add(entry); - entryStringes.Add(token); - } - break; - case DicTokenType.DiffEntry: - { - if (Util.IsNullOrWhiteSpace(name)) - LoadError(path, token, "Missing table name before entry list."); - if (Util.IsNullOrWhiteSpace(token.Value)) - LoadError(path, token, "Encountered empty entry."); - header = false; - string first = null; - entry = new RantDictionaryEntry(token.Value.Split('/') - .Select((s, i) => - { - if (i > 0) return Diff.Mark(first, s); - return first = s.Trim(); - }).ToArray(), scopedClassSet); - entries.Add(entry); - entryStringes.Add(token); - } - break; - case DicTokenType.Property: - { - var parts = token.Value.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries); - if (!parts.Any()) LoadError(path, token, "Empty property field."); - switch (parts[0].ToLower()) - { - case "class": - { - if (parts.Length < 2) continue; - foreach (string cl in parts[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) - { - bool opt = cl.EndsWith("?"); - entry.AddClass(VocabUtils.GetString(opt ? cl.Substring(0, cl.Length - 1) : cl), opt); - } - } - break; - case "weight": - { - if (parts.Length != 2) LoadError(path, token, "'weight' property expected a value."); - int weight; - if (!Int32.TryParse(parts[1], out weight)) - LoadError(path, token, "Invalid weight value: '" + parts[1] + "'"); - entry.Weight = weight; - } - break; - case "pron": - { - if (parts.Length != 2) LoadError(path, token, "'" + parts[0] + "' property expected a value."); - var pron = - parts[1].Split('/') - .Select(s => s.Trim()) - .ToArray(); - if (subtypes.Length == pron.Length) - { - for (int i = 0; i < entry.TermCount; i++) - entry[i].Pronunciation = pron[i]; - } - } - break; - default: - { - EntryTypeDef typeDef; - if (!types.TryGetValue(parts[0], out typeDef)) - LoadError(path, token, $"Unknown property name '{parts[0]}'."); - // Okay, it's a type. - if (parts.Length != 2) LoadError(path, token, "Missing type value."); - entry.AddClass(VocabUtils.GetString(parts[1])); - if (!typeDef.IsValidValue(parts[1])) - LoadError(path, token, $"'{parts[1]}' is not a valid value for type '{typeDef.Name}'."); - break; - } - } - } - break; - } - } - - if (types.Any()) - { - var eEntries = entries.GetEnumerator(); - var eEntryStringes = entryStringes.GetEnumerator(); - while (eEntries.MoveNext() && eEntryStringes.MoveNext()) - { - foreach (var type in types.Values) - { - if (!type.Test(eEntries.Current)) - { - // TODO: Find a way to output multiple non-fatal table load errors without making a gigantic exception message. - LoadError(path, eEntryStringes.Current, $"Entry '{eEntries.Current}' does not satisfy type '{type.Name}'."); - } - } - } - } - - var table = new RantDictionaryTable(name, subtypes.Length, hiddenClasses); - for (int i = 0; i < subtypes.Length; i++) - table.AddSubtype(subtypes[i], i); - - for (int i = 0; i < entries.Count; i++) - table.AddEntry(entries[i]); - - table.Commit(); - - return table; - } - - private static void LoadError(string file, DicToken data, string message) - { - throw new RantLegacyTableLoadException(file, data, message); - } - } - - internal class RantLegacyTableLoadException : Exception - { - public RantLegacyTableLoadException(string file, DicToken data, string message) - : base($"{file}: (Line {data.Line}) {message}") - { - } - } - - internal class EntryTypeDefFilter - { - private readonly _[] _filterParts; - private readonly Regex _filterRegex = new Regex(@"!?\w+"); - - public EntryTypeDefFilter(string filter) - { - if (filter.Trim() == "*") return; - _filterParts = filter - .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) - .Where(s => _filterRegex.IsMatch(s)) - .Select(s => _.Create(s.TrimStart('!'), s.StartsWith("!"))) - .ToArray(); - } - - private bool DoTest(RantDictionaryEntry entry) - { - return _filterParts == null || _filterParts.All(f => entry.ContainsClass(f.Item1) == f.Item2); - } - - /// - /// Determines whether a type should apply to the specifed entry according to the specified filter. - /// - /// The filter to test with. - /// The entry to test. - /// - public static bool Test(EntryTypeDefFilter filter, RantDictionaryEntry entry) => filter?.DoTest(entry) ?? false; - } - - internal class EntryTypeDef - { - private readonly HashSet _classes; - - public EntryTypeDef(string name, IEnumerable classes, EntryTypeDefFilter filter) - { - Name = name; - _classes = new HashSet(); - foreach (string c in classes) _classes.Add(c); - Filter = filter; - } - - public string Name { get; } - - public EntryTypeDefFilter Filter { get; } - - public IEnumerator GetTypeClasses() => _classes.AsEnumerable().GetEnumerator(); - - public bool IsValidValue(string value) => _classes.Contains(value); - - public bool Test(RantDictionaryEntry entry) - { - if (!EntryTypeDefFilter.Test(Filter, entry)) return true; - return entry.GetClasses().Where(IsValidValue).Count() == 1; - } - } -} \ No newline at end of file diff --git a/Rant/Vocabulary/Querying/ClassFilter.cs b/Rant/Vocabulary/Querying/ClassFilter.cs index ba9bd4a..6cb4865 100644 --- a/Rant/Vocabulary/Querying/ClassFilter.cs +++ b/Rant/Vocabulary/Querying/ClassFilter.cs @@ -69,6 +69,8 @@ public void AddRuleSwitch(params ClassFilterRule[] items) _items.Add(items); } + public IEnumerable GenerateRequiredSet(RNG rng) => _items.Select(set => set[rng.Next(set.Length)]); + public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) { bool match = query.Exclusive diff --git a/Rant/Vocabulary/Querying/Query.cs b/Rant/Vocabulary/Querying/Query.cs index 9254e2c..47882c9 100644 --- a/Rant/Vocabulary/Querying/Query.cs +++ b/Rant/Vocabulary/Querying/Query.cs @@ -29,6 +29,7 @@ using Rant.Core; using Rant.Localization; using System; +using System.Linq; namespace Rant.Vocabulary.Querying { @@ -83,11 +84,27 @@ internal sealed class Query public void AddFilter(Filter filter) => _filters.Add(filter); - public IEnumerable GetFilters() + /// + /// Gets all non-class filters in the query. + /// + /// + public IEnumerable GetNonClassFilters() { - foreach (var filter in _filters) yield return filter; + foreach (var filter in _filters.Where(f => !(f is ClassFilter))) yield return filter; } + /// + /// Gets all class filters in the query. + /// + /// + public IEnumerable GetClassFilters() => _filters.OfType(); + + /// + /// Gets all filters in the query. + /// + /// + public IEnumerable GetAllFilters() => _filters.AsEnumerable(); + internal IEnumerator Run(Sandbox sb) { if (Name == null) yield break; diff --git a/Rant/Vocabulary/Querying/RangeFilter.cs b/Rant/Vocabulary/Querying/RangeFilter.cs index 9162658..40cf1e4 100644 --- a/Rant/Vocabulary/Querying/RangeFilter.cs +++ b/Rant/Vocabulary/Querying/RangeFilter.cs @@ -87,7 +87,7 @@ public int? Maximum /// public static RangeFilter Anything => new RangeFilter(null, null); - public override int Priority => 1; + public override int Priority => 90; /// /// Determines if the specified number is within the current range. diff --git a/Rant/Vocabulary/RantDictionary.cs b/Rant/Vocabulary/RantDictionary.cs index 7aac378..2fec4ce 100644 --- a/Rant/Vocabulary/RantDictionary.cs +++ b/Rant/Vocabulary/RantDictionary.cs @@ -123,7 +123,9 @@ public void AddTable(RantDictionaryTable table) oldTable.Merge(table); } else + { _tables[table.Name] = table; + } } /// diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index c3d9bec..be78d78 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -299,7 +299,7 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) foreach (string hc in hidden) table.HideClass(hc); - table.Commit(); + table.RebuildCache(); return table; } diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 8ddf00c..f516cfc 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -46,26 +46,26 @@ public sealed partial class RantDictionaryTable : RantResource internal const string MissingTerm = "[?]"; private readonly HashSet _entriesHash = new HashSet(); private readonly List _entriesList = new List(); // TODO: Use for indexing / weighted selection - // entries that don't have any hidden classes - private readonly List _visibleEntriesList = new List(); private readonly HashSet _hidden = new HashSet(new[] { NSFW }); private readonly Dictionary> _subtypeIndexMap = new Dictionary>(); private readonly Dictionary _subtypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - private ClassTree _classTree = new ClassTree(new RantDictionaryEntry[0]); + private readonly ClassCache _cache; + private bool _dirty = true; private SyllableBuckets[] _syllableBuckets; - /// - /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. - /// - /// The name of the table. - /// The number of terms to store in each entry. - /// Collection of hidden classes. - public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) + /// + /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. + /// + /// The name of the table. + /// The number of terms to store in each entry. + /// Collection of hidden classes. + public RantDictionaryTable(string name, int termsPerEntry, HashSet hidden = null) { if (name == null) throw new ArgumentNullException(nameof(name)); if (termsPerEntry <= 0) throw new ArgumentException(Txtres.GetString("err-bad-term-count")); if (!Util.ValidateName(name)) throw new ArgumentException(Txtres.GetString("err-invalid-tablename", name)); if (hidden != null) _hidden = hidden; + _cache = new ClassCache(); TermsPerEntry = termsPerEntry; Name = name; @@ -75,6 +75,7 @@ public RantDictionaryTable(string name, int termsPerEntry, HashSet hidde internal RantDictionaryTable() { // Used by serializer + _cache = new ClassCache(); } /// @@ -106,10 +107,7 @@ internal RantDictionaryTable() /// Enumerates the entries stored in the table. /// /// - public IEnumerable GetEntries() - { - foreach (var entry in _entriesHash) yield return entry; - } + public IEnumerable GetEntries() => _entriesHash.AsEnumerable(); /// /// Enumerates the subtypes contained in the current table. @@ -142,10 +140,17 @@ public bool IsClassHidden(string className) /// public bool UnhideClass(string className) => className != null && _hidden.Remove(className); - /// - /// Determines whether weights are enabled on this table. - /// - public bool EnableWeighting { get; set; } = false; + /// + /// Determines whether weights are enabled on this table. + /// + public bool EnableWeighting { get; set; } = false; + + /// + /// Indicates whether the cache needs to be rebuilt. + /// + public bool CacheNeedsRebuild => _dirty; + + internal HashSet EntriesHash => _entriesHash; /// /// Adds the specified entry to the table. @@ -157,9 +162,8 @@ public bool AddEntry(RantDictionaryEntry entry) if (entry == null) throw new ArgumentNullException(nameof(entry)); if (entry.TermCount != TermsPerEntry) return false; if (!_entriesHash.Add(entry)) return false; - if (entry.GetClasses().All(c => !_hidden.Contains(c))) - _visibleEntriesList.Add(entry); - _entriesList.Add(entry); + _entriesList.Add(entry); + _dirty = true; return true; } @@ -172,9 +176,8 @@ public bool RemoveEntry(RantDictionaryEntry entry) { if (entry == null) throw new ArgumentNullException(nameof(entry)); if (!_entriesHash.Remove(entry)) return false; - if(entry.GetClasses().All(c => !_hidden.Contains(c))) - _visibleEntriesList.Add(entry); - _entriesList.Remove(entry); + _entriesList.Remove(entry); + _dirty = true; return true; } @@ -276,9 +279,9 @@ public bool Merge(RantDictionaryTable other) if (other.Name != Name || other == this) return false; if (other.TermsPerEntry != TermsPerEntry) return false; _entriesHash.AddRange(other._entriesHash); - _visibleEntriesList.AddRange(other._visibleEntriesList); - _entriesList.AddRange(other._entriesHash); - Commit(); + _entriesList.AddRange(other._entriesHash); + _dirty = true; + RebuildCache(); return true; } @@ -286,60 +289,42 @@ public bool Merge(RantDictionaryTable other) /// Optimizes the table. Call this after writing items to the table or removing items from a table. /// If you're writing or removing multiple items, call this after all the actions have been performed. /// - public void Commit() + public void RebuildCache() { - _classTree = new ClassTree(_entriesHash); + if (!_dirty) return; + _cache.BuildCache(this); CreateSyllableBuckets(); for (int i = 0; i < TermsPerEntry; i++) _syllableBuckets[i] = new SyllableBuckets(i, _entriesList); + _dirty = false; } internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) { + RebuildCache(); + int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() ? GetSubtypeIndex(query.PluralSubtype) : GetSubtypeIndex(query.Subtype); if (index == -1) return null; - if (query.BareQuery) return _visibleEntriesList.PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; - - // process simple class filters using class tree - var filters = query.GetFilters(); - var classes = filters - .Where(f => f is ClassFilter) - .SelectMany(f => (f as ClassFilter).RequiredClasses); - - filters = filters.Where(f => !(f is ClassFilter) || !(f as ClassFilter).SimpleFilter); - - IEnumerable pool = _visibleEntriesList; - if (classes.Any()) - pool = _classTree.Query(classes, new HashSet(_hidden.Where(c => !classes.Contains(c)))); + var filtersEnumerable = query.GetNonClassFilters(); + var filters = filtersEnumerable as Filter[] ?? filtersEnumerable.ToArray(); - // if it's just the class filters, let's leave now - if (!filters.Any() && !query.HasCarrier) - return pool.ToList().PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; + IEnumerable pool + = _cache.Filter(query.GetClassFilters().SelectMany(cf => cf.GenerateRequiredSet(sb.RNG)).Distinct(), dictionary, this)?.ToList(); - // process syllable count filters using syllable buckets - var rangeFilters = filters.OfType(); - if (rangeFilters.Any()) - { - CreateSyllableBuckets(); - - foreach (var filter in rangeFilters) - pool = pool.Intersect(_syllableBuckets[index].Query(filter)); - - filters = filters.Where(f => !(f is RangeFilter)); - } + if (pool == null) return null; - if (filters.Any()) + if (filters.Length > 0) pool = pool.Where((e, i) => filters.OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, index, query))); if (!pool.Any()) return null; - return query.HasCarrier - ? syncState.GetEntry(query.Carrier, index, pool, sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index] - : pool.PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; + return query.HasCarrier + ? syncState.GetEntry(query.Carrier, index, pool, sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index] + : pool.ToList().PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; } internal override void DeserializeData(BsonItem data) @@ -394,7 +379,7 @@ from BsonItem termData in entryData["terms"].Values AddEntry(entry); } - Commit(); + RebuildCache(); } internal override BsonItem SerializeData() From 228a56c17ebc2673a0f4b315701397028b952d4d Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 27 Mar 2017 12:53:16 -0500 Subject: [PATCH 163/213] [RCT] Add fdocs command; document a few more functions --- Rant.Tools/Commands/FuncDocsCommand.cs | 72 +++++++++++++++++++++ Rant.Tools/Rant.Tools.csproj | 1 + Rant/Core/Framework/RantFunctionRegistry.cs | 27 ++++++-- Rant/Rant.csproj | 1 - 4 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 Rant.Tools/Commands/FuncDocsCommand.cs diff --git a/Rant.Tools/Commands/FuncDocsCommand.cs b/Rant.Tools/Commands/FuncDocsCommand.cs new file mode 100644 index 0000000..a2eec13 --- /dev/null +++ b/Rant.Tools/Commands/FuncDocsCommand.cs @@ -0,0 +1,72 @@ +using Rant.Core.Framework; +using System; +using System.IO; +using System.Linq; +using System.Text; + +namespace Rant.Tools.Commands +{ + [CommandName("fdocs", UsesPath = false, Description = "Generates a Rant function reference document in Markdown format.")] + [CommandParam("out", false, "Indicates the output path for the generated file.")] + internal class FuncDocsCommand : Command + { + protected override void OnRun() + { + var argOut = CmdLine.Property("out", Path.Combine(Environment.CurrentDirectory, "functions.md")); + + using (var writer = new StreamWriter(argOut)) + { + writer.Write("# Function reference\n\n"); + + foreach (var group in RantUtils.GetFunctions().OrderBy(g => g.Name)) + { + writer.Write($"## {group.Name}\n\n"); + + var aliases = RantUtils.GetFunctionAliases(group.Name).Where(a => a != group.Name).ToArray(); + + if (aliases.Length > 0) + { + writer.Write($"**Aliases:** {aliases.Select(a => $"`{a}`").Aggregate((c, n) => c + ", " + n)}
"); + } + writer.Write($"**Overloads:** {group.Overloads.Count()}\n\n"); + + foreach (var func in group.Overloads.OrderBy(f => f.ParamCount)) + { + + writer.Write($"### {func}\n\n"); + writer.Write(func.Description); + + var fparams = func.GetParameters().ToArray(); + + if (fparams.Length > 0) + { + writer.Write("\n\n**Parameters**\n\n|Name|Type|Description|\n|---|---|---|\n"); + + foreach (var p in fparams) + { + + if (p.RantType == RantFunctionParameterType.Mode || p.RantType == RantFunctionParameterType.Flags) + { + var sb = new StringBuilder(); + sb.Append("
    "); + foreach (var mode in p.GetEnumValues()) + { + sb.Append($"
  • {mode.Name}
    {mode.Description}
  • "); + } + sb.Append("
"); + writer.Write($"|{p.Name + (p.IsParams ? "..." : "")}|{p.RantType}|{(String.IsNullOrEmpty(p.Description) ? sb.ToString() : p.Description + "

" + sb.ToString())}|\n"); + } + else + { + writer.Write($"|{p.Name + (p.IsParams ? "..." : "")}|{p.RantType}|{(String.IsNullOrEmpty(p.Description) ? "*No description*" : p.Description)}|\n"); + } + } + } + + writer.Write("\n***\n"); + } + } + } + } + } +} diff --git a/Rant.Tools/Rant.Tools.csproj b/Rant.Tools/Rant.Tools.csproj index 6ddecc3..c20e3b6 100644 --- a/Rant.Tools/Rant.Tools.csproj +++ b/Rant.Tools/Rant.Tools.csproj @@ -61,6 +61,7 @@ + diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index ad792ca..d28ffdc 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1100,6 +1100,7 @@ private static void ModVar(Sandbox sb, string a, double b) } [RantFunction("swap")] + [RantDescription("Swaps the values of the variables with the two specified names.")] private static void Swap(Sandbox sb, string a, string b) { var temp = sb.Objects[a]; @@ -1108,31 +1109,43 @@ private static void Swap(Sandbox sb, string a, string b) } [RantFunction("veq")] - private static void CompEquals(Sandbox sb, RantObject a, RantObject b) + [RantDescription("Prints a boolean value indicating whether the variables with the two specified names are equal to each other.")] + private static void CompEquals(Sandbox sb, RantObject a, RantObject b) { sb.Print(a.Value.Equals(b.Value) ? TRUE : FALSE); } - [RantFunction("eq")] + [RantFunction("vne")] + [RantDescription("Prints a boolean value indicating whether the variables with the two specified names are not equal to each other.")] + private static void CompNotEquals(Sandbox sb, RantObject a, RantObject b) + { + sb.Print(a.Value.Equals(b.Value) ? FALSE : TRUE); + } + + [RantFunction("eq")] + [RantDescription("Prints a boolean value indicating whether the two values have equal string representations.")] private static void CompEquals(Sandbox sb, string a, string b) { sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? TRUE : FALSE); } [RantFunction("eqi")] - private static void CompEqualsIgnoreCase(Sandbox sb, string a, string b) + [RantDescription("Prints a boolean value indicating whether the two values have equal string representations, ignoring case.")] + private static void CompEqualsIgnoreCase(Sandbox sb, string a, string b) { sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? TRUE : FALSE); } - [RantFunction("neq")] - private static void CompNotEquals(Sandbox sb, string a, string b) + [RantFunction("ne")] + [RantDescription("Prints a boolean value indicating whether the two values do not have equal string representations.")] + private static void CompNotEquals(Sandbox sb, string a, string b) { sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? FALSE : TRUE); } - [RantFunction("neqi")] - private static void CompNotEqualsIgnoreCase(Sandbox sb, string a, string b) + [RantFunction("nei")] + [RantDescription("Prints a boolean value indicating whether two values do not have equal string representations, ignoring case.")] + private static void CompNotEqualsIgnoreCase(Sandbox sb, string a, string b) { sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? FALSE : TRUE); } diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 0b8362a..f1a3a89 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -268,7 +268,6 @@ - From cb88f9d0e5eabf054ed6d99a4e70be785d249e3c Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 27 Mar 2017 13:11:24 -0500 Subject: [PATCH 164/213] More documentation --- Rant/Core/Framework/RantFunctionRegistry.cs | 2550 ++++++++++--------- 1 file changed, 1313 insertions(+), 1237 deletions(-) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index d28ffdc..8db9dd2 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -44,1076 +44,1152 @@ namespace Rant.Core.Framework { - // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. - // They may return either void or IEnumerator depending on your needs. - internal static partial class RantFunctionRegistry - { - [RantFunction("num", "n")] - [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] - private static void Number(Sandbox sb, - [RantDescription("The minimum value of the number to generate.")] int min, - [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); - - [RantFunction("num")] - [RantDescription("Formats an input string using the current number format settings and prints the result.")] - private static void Number(Sandbox sb, - [RantDescription("The string to convert into a number.")] string input) - { - sb.Print(double.TryParse(input, out double number) ? number : 0); - } - - [RantFunction("numfmt")] - [RantDescription("Sets the current number formatting mode.")] - private static void NumberFormat(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); - - [RantFunction("numfmt")] - [RantDescription("Runs the specified pattern under a specific number formatting mode.")] - private static IEnumerator NumberFormatRange(Sandbox sb, - [RantDescription("The number format to use.")] NumberFormat format, - [RantDescription("The pattern to run.")] RST rangeAction) - { - var oldFmtMap = new Dictionary(); - - sb.Output.Do(chain => - { - oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; - chain.Last.NumberFormatter.NumberFormat = format; - }); - - yield return rangeAction; - - sb.Output.Do(chain => - { - if (!oldFmtMap.TryGetValue(chain, out NumberFormat fmt)) return; - chain.Last.NumberFormatter.NumberFormat = fmt; - }); - } - - [RantFunction] - [RantDescription("Specifies the current digit formatting mode for numbers.")] - private static void Digits(Sandbox sb, - [RantDescription("The digit format to use.")] BinaryFormat format, - [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => - { - chain.Last.NumberFormatter.BinaryFormat = format; - chain.Last.NumberFormatter.BinaryFormatDigits = digits; - }); - - [RantFunction] - [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] - private static void Endian(Sandbox sb, - [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); - - [RantFunction("init")] - [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] - private static void Initial(Sandbox sb, int index) => sb.AttribManager.CurrentAttribs.StartIndex = index; - - [RantFunction("rep", "r")] - [RantDescription("Sets the repetition count for the next block.")] - private static void Rep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times) => sb.AttribManager.CurrentAttribs.Repetitions = times; - - [RantFunction] - [RantDescription("Sets the repetition count to the number of items in the next block.")] - private static void RepEach(Sandbox sb) => sb.AttribManager.CurrentAttribs.RepEach = true; - - [RantFunction("sep")] - private static IEnumerator PrintSep(Sandbox sb) - { - yield return sb.Blocks.Peek().Attribs.Separator; - } - - [RantFunction("sep", "s")] - [RantDescription("Sets the separator pattern for the next block.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.AttribManager.CurrentAttribs.IsSeries = false; - sb.AttribManager.CurrentAttribs.Separator = separator; - } - - [RantFunction("sep", "s")] - [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) - { - sb.AttribManager.CurrentAttribs.IsSeries = true; - sb.AttribManager.CurrentAttribs.Separator = separator; - sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; - } - - [RantFunction("sep", "s")] - [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] - private static void Sep(Sandbox sb, - [RantDescription("The separator pattern to run between items.")] RST separator, - [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, - [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) - { - sb.AttribManager.CurrentAttribs.IsSeries = true; - sb.AttribManager.CurrentAttribs.Separator = separator; - sb.AttribManager.CurrentAttribs.EndSeparator = oxford; - sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; - } - - [RantFunction("rs")] - [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] - private static void RepSep(Sandbox sb, - [RantDescription("The number of times to repeat the next block.")] int times, - [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) - { - sb.AttribManager.CurrentAttribs.IsSeries = false; - sb.AttribManager.CurrentAttribs.Repetitions = times; - sb.AttribManager.CurrentAttribs.Separator = separator; - } - - [RantFunction] - [RantDescription("Sets the prefix pattern for the next block.")] - private static void Before(Sandbox sb, - [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.AttribManager.CurrentAttribs.Before = beforeAction; - - [RantFunction] - [RantDescription("Sets the postfix pattern for the next block.")] - private static void After(Sandbox sb, - [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.AttribManager.CurrentAttribs.After = afterAction; - - [RantFunction] - [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] - private static void Chance(Sandbox sb, - [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.AttribManager.CurrentAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; - - [RantFunction("case", "caps")] - [RantDescription("Changes the capitalization mode for all open channels.")] - private static void Case(Sandbox sb, - [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); - - [RantFunction("txtfmt")] - [RantDescription("Sets the text conversion format for all open channels.")] - private static void TxtFmt(Sandbox sb, - [RantDescription("The conversion mode to use.")] - CharConversion format) => sb.Output.SetConversion(format); - - [RantFunction] - [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] - private static void CapsInfer(Sandbox sb, - [RantDescription("A string that is capitalized in the format to be set.")] string sample) - { - var output = sb.Output; - if (string.IsNullOrEmpty(sample)) - { - output.Capitalize(Capitalization.None); - return; - } - var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (words.Length == 1) - { - string word = words[0]; - if (word.Length == 1) - output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); - else if (Util.IsUppercase(word)) - output.Capitalize(Capitalization.Upper); - else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - else - { - // No letters? Forget it. - if (!sample.Any(char.IsLetter)) - { - output.Capitalize(Capitalization.None); - return; - } - - // Is all-caps? - if (Util.IsUppercase(sample)) - { - output.Capitalize(Capitalization.Upper); - return; - } - - var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) - .Select(str => str.Trim()) - .Where(str => - !string.IsNullOrEmpty(str) - && !char.IsDigit(str[0])).ToArray(); - - // All words capitalized? - var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); - if (lwords.Any() && - (sentences.Length == 1 || - sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) - { - if (lwords.All(lw => char.IsUpper(lw[0]))) - { - output.Capitalize(Capitalization.Word); - return; - } - - if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) - { - output.Capitalize(Capitalization.Title); - return; - } - } - - // All sentences capitalized? - bool all = true; - bool none = true; - foreach (string sentence in sentences) - { - bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); - all = all && isCapitalized; - none = none && !isCapitalized; - } - - if (sentences.Length > 1 && all) - output.Capitalize(Capitalization.Sentence); - else if (none) - output.Capitalize(Capitalization.Lower); - else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) - output.Capitalize(Capitalization.First); - else - output.Capitalize(Capitalization.None); - } - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the first.")] - private static IEnumerator First(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration == 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the first.")] - private static IEnumerator NotFirst(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration > 1) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the last.")] - private static IEnumerator Last(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == block.Repetitions) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the last.")] - private static IEnumerator NotLast(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration < block.Repetitions) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] - private static IEnumerator Middle(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration > 1 && block.Iteration < block.Repetitions) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] - private static IEnumerator Ends(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == 1 || block.Iteration == block.Repetitions) yield return action; - } - - [RantFunction("repnum", "rn")] - [RantDescription("Prints the iteration number of the current block.")] - private static void RepNum(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration); - } - - [RantFunction("repelapsed", "re")] - [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] - private static void RepElapsed(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Iteration - 1); - } - - [RantFunction("repcount", "rc")] - [RantDescription("Prints the repetition count of the current block.")] - private static void RepCount(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Repetitions); - } - - [RantFunction("reprem", "rr")] - [RantDescription("Prints the number of remaining repetitions queued after the current one.")] - private static void RepRem(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Repetitions - block.Iteration); - } - - [RantFunction("repqueued", "rq")] - [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] - private static void RepQueued(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - var block = sb.Blocks.Peek(); - sb.Print(block.Repetitions - (block.Iteration - 1)); - } - - [RantFunction] - [RantDescription("Prints the number of currently active blocks.")] - private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); - - [RantFunction("index", "i")] - [RantDescription("Prints the zero-based index of the block item currently being executed.")] - private static void Index(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index); - } - - [RantFunction("index1", "i1")] - [RantDescription("Prints the one-based index of the block item currently being executed.")] - private static void IndexOne(Sandbox sb) - { - if (!sb.Blocks.Any()) return; - sb.Print(sb.Blocks.Peek().Index + 1); - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an odd number.")] - private static IEnumerator Odd(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is an even number.")] - private static IEnumerator Even(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; - } - - [RantFunction] - [RantDescription("Returns the specified argument from the current subroutine.")] - private static IEnumerator Arg(Sandbox sb, - [RantDescription("The name of the argument to retrieve.")] string name) - { - if (!sb.SubroutineArgs.Any()) yield break; - var args = sb.SubroutineArgs.Peek(); - if (args.ContainsKey(name)) - yield return args[name]; - } - - [RantFunction] - [RantDescription("Retrieves and prints the current match string of the active replacer.")] - private static void Match(Sandbox sb) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Value); - } - - [RantFunction] - [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] - private static void Group(Sandbox sb, - [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) - { - if (!sb.RegexMatches.Any()) return; - sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); - } - - [RantFunction] - [RantDescription("Sets the current rhyming mode for queries.")] - private static void Rhyme(Sandbox sb, - [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; - - [RantFunction("sync", "x")] - [RantDescription("Creates and applies a synchronizer with the specified name and type.")] - private static void Sync(Sandbox sb, - [RantDescription("The name of the synchronizer.")] string name, - [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); - - [RantFunction("xpin")] - [RantDescription("Pins a synchronizer.")] - private static void SyncPin(Sandbox sb, - [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); - - [RantFunction("xunpin")] - [RantDescription("Unpins a synchronizer.")] - private static void SyncUnpin(Sandbox sb, - [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); - - [RantFunction("xstep")] - [RantDescription("Iterates a synchronizer.")] - private static void SyncStep(Sandbox sb, - [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); - - [RantFunction("xreset")] - [RantDescription("Resets a synchronizer to its initial state.")] - private static void SyncReset(Sandbox sb, - [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); - - [RantFunction("quote", "q")] - [RantDescription( - "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] - private static IEnumerator Quote(Sandbox sb, - [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) - { - sb.IncreaseQuote(); - sb.PrintOpeningQuote(); - yield return quoteAction; - sb.PrintClosingQuote(); - sb.DecreaseQuote(); - } - - [RantFunction] - [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] - private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) - { - sb.Output.OpenChannel(channelName, visibility); - yield return pattern; - sb.Output.CloseChannel(); - } - - [RantFunction("target", "t")] - [RantDescription("Places a target with the specified name at the current write position.")] - private static void Target(Sandbox sb, - [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); - - [RantFunction] - [RantDescription("Appends a string to the specified target's contents.")] - private static void Send(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); - - [RantFunction] - [RantDescription("Overwrites the specified target's contents with the provided value.")] - private static void SendOver(Sandbox sb, - [RantDescription("The name of the target to send to.")] string targetName, - [RantDescription("The string to send to the target.")] string value) - { - sb.Output.Do(chain => chain.ClearTarget(targetName)); - sb.Output.PrintToTarget(targetName, value); - } - - [RantFunction("targetval")] - [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] - private static void GetTargetValue(Sandbox sb, - [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); - - [RantFunction("clrt")] - [RantDescription("Clears the contents of the specified target.")] - private static void ClearTarget(Sandbox sb, - [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] - private static IEnumerator Nth(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] - private static IEnumerator NthO(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] - private static IEnumerator NotNth(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." - )] - private static IEnumerator NotNthO(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Sets a pattern that will run before the next block.")] - private static void Start(Sandbox sb, - [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.AttribManager.CurrentAttribs.Start = beforePattern; - - [RantFunction] - [RantDescription("Sets a pattern that will run after the next block.")] - private static void End(Sandbox sb, - [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.AttribManager.CurrentAttribs.End = endPattern; - - // TODO: Finish [persist]. - //[RantFunction] - [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] - private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.AttribManager.CurrentAttribs.Persistence = persistence; - - [RantFunction] - [RantDescription("Loads and runs a pattern from cache or file.")] - private static IEnumerator Import(Sandbox sb, - [RantDescription("The name or path of the pattern to load.")] string name) - { - RST action; - - try - { - action = sb.Engine.GetProgramInternal(name).SyntaxTree; - } - catch (RantCompilerException e) - { - throw new RantRuntimeException(sb, sb.CurrentAction.Location, - $"Failed to compile imported pattern '{name}':\n{e.Message}"); - } - catch (Exception e) - { - throw new RantRuntimeException(sb, sb.CurrentAction.Location, - $"Failed to import '{name}':\n{e.Message}"); - } - - yield return action; - } - - [RantFunction] - [RantDescription("Defines the specified flags.")] - private static void Define(Sandbox sb, - [RantDescription("The list of flags to define.")] params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.Engine.Flags.Add(flag); - } - - [RantFunction] - [RantDescription("Undefines the specified flags.")] - private static void Undef(Sandbox sb, - [RantDescription("The list of flags to undefine.")] params string[] flags) - { - foreach (string flag in flags) sb.Engine.Flags.Remove(flag); - } - - [RantFunction] - [RantDescription("Toggles the specified flags.")] - private static void Toggle(Sandbox sb, params string[] flags) - { - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - { - if (sb.Engine.Flags.Contains(flag)) - sb.Engine.Flags.Remove(flag); - else - sb.Engine.Flags.Add(flag); - } - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] - private static void IfDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = true; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription( - "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] - private static void IfNDef(Sandbox sb, params string[] flags) - { - sb.FlagConditionExpectedResult = false; - sb.ConditionFlags.Clear(); - foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) - sb.ConditionFlags.Add(flag); - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition passes.")] - private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) - { - if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) - yield return conditionPassPattern; - } - - [RantFunction] - [RantDescription("Executes a pattern if the current flag condition fails.")] - private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) - { - if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) - yield return conditionFailPattern; - } - - [RantFunction] - [RantDescription("Yields the currenty written output.")] - private static void Yield(Sandbox sb) => sb.SetYield(); - - [RantFunction] - [RantDescription("Branches the internal RNG according to a seed.")] - private static void Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); - - [RantFunction] - [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] - private static IEnumerator Branch(Sandbox sb, - [RantDescription("The seed for the branch.")] string seed, - [RantDescription("The pattern to run on the branch.")] RST branchAction) - { - sb.RNG.Branch(seed.Hash()); - yield return branchAction; - sb.RNG.Merge(); - } - - [RantFunction] - [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] - private static void Merge(Sandbox sb) => sb.RNG.Merge(); - - [RantFunction("in")] - [RantDescription("Prints the value of the specified pattern argument.")] - private static void PatternArg(Sandbox sb, - [RantDescription("The name of the argument to access.")] string argName) - { - if (sb.PatternArgs == null) return; - sb.Output.Print(sb.PatternArgs[argName]); - } - - [RantFunction("tm")] - [RantDescription("Prints the trademark symbol.")] - private static void Trademark(Sandbox sb) => sb.Print("\x2122"); - - [RantFunction("reg")] - [RantDescription("Prints the registered trademark symbol.")] - private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); - - [RantFunction("c")] - [RantDescription("Prints the copyright symbol.")] - private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); - - [RantFunction("em")] - [RantDescription("Prints an emdash.")] - private static void Emdash(Sandbox sb) => sb.Print("\x2014"); - - [RantFunction("en")] - [RantDescription("Prints an endash.")] - private static void Endash(Sandbox sb) => sb.Print("\x2013"); - - [RantFunction("b")] - [RantDescription("Prints a bullet character.")] - private static void Bullet(Sandbox sb) => sb.Print("\x2022"); - - [RantFunction("ss")] - [RantDescription("Prints an eszett (ß).")] - private static void Eszett(Sandbox sb) => sb.Print("\x00df"); - - [RantFunction("emoji")] - [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] - private static void PrintEmoji(Sandbox sb, - [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) - { - shortcode = shortcode.ToLower(); - if (!Emoji.Shortcodes.ContainsKey(shortcode)) - { - sb.Print("[missing emoji]"); - return; - } - sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); - } - - [RantFunction("plural", "pl")] - [RantDescription("Infers and prints the plural form of the specified word.")] - private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); - - [RantFunction] - [RantDescription("Prints the current length of the specified channel, in characters.")] - private static void Len(Sandbox sb, - [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); - - [RantFunction("rev")] - [RantDescription("Reverses the specified string and prints it to the output.")] - private static void Reverse(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = input[i]; - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = input[i]; - } - sb.Print(new string(buffer)); - } - - [RantFunction("revx")] - [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] - private static void ReverseEx(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = Util.ReverseChar(input[i]); - } - sb.Print(new string(buffer)); - } - - [RantFunction("accent")] - [RantDescription("Accents the previous character.")] - private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); - - [RantFunction("accent")] - [RantDescription("Accents the specified character.")] - private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); - - [RantFunction("acute", "act")] - [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] - private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); - - [RantFunction("circumflex", "cflex")] - [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] - private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); - - [RantFunction("grave", "grv")] - [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] - private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); - - [RantFunction("ring")] - [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] - private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); - - [RantFunction("tilde", "tld")] - [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] - private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); - - [RantFunction("diaeresis", "dia")] - [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] - private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); - - [RantFunction("caron", "crn")] - [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] - private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); - - [RantFunction("macron", "mcn")] - [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] - private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); - - [RantFunction("cedilla", "ced")] - [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] - private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); - - [RantFunction("char")] - [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] - private static void Character(Sandbox sb, - [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); - - [RantFunction("rcc")] - [RantDescription("Resets the specified carrier components.")] - private static void ResetCarrier(Sandbox sb, - [RantDescription("The list of carrier component identifiers to reset.")] - params string[] ids) - { - foreach (var id in ids) - { - if (String.IsNullOrWhiteSpace(id)) continue; - sb.CarrierState.DeleteAssociation(id); - sb.CarrierState.DeleteMatch(id); - sb.CarrierState.DeleteRhyme(id); - sb.CarrierState.DeleteUnique(id); - } - } - - [RantFunction("query")] - private static IEnumerator QueryRun(Sandbox sb) - { - return sb.QueryBuilder.CurrentQuery?.Run(sb); - } - - [RantFunction("qname")] - private static void QueryName(Sandbox sb, string id, string name) - { - sb.QueryBuilder.GetQuery(id).Name = name; - } - - [RantFunction("qsub")] - private static void QuerySubtype(Sandbox sb, string id, string name) - { - sb.QueryBuilder.GetQuery(id).Subtype = name; - } - - [RantFunction("qcf")] - private static void QueryClassFilterPositive(Sandbox sb, string id, params string[] classes) - { - Query q; - ClassFilter cf; - cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; - if (cf == null) q.AddFilter(cf = new ClassFilter()); - foreach (var cl in classes) - { - cf.AddRule(new ClassFilterRule(cl, true)); - } - } - - [RantFunction("qcfn")] - private static void QueryClassFilterNegative(Sandbox sb, string id, params string[] classes) - { - Query q; - ClassFilter cf; - cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; - if (cf == null) q.AddFilter(cf = new ClassFilter()); - foreach (var cl in classes) - { - cf.AddRule(new ClassFilterRule(cl, false)); - } - } - - [RantFunction("pipe")] - [RantDescription("Redirects the output from the next block into the specified callback. Access block output with [item].")] - private static void Redirect(Sandbox sb, - [RantDescription("The callback to redirect block output to.")] - RST redirectCallback) - { - sb.AttribManager.CurrentAttribs.Redirect = redirectCallback; - } - - [RantFunction("item")] - [RantDescription("Prints the main output from the current block iteration.")] - private static void RedirectedItem(Sandbox sb) - { - sb.Print(sb.GetRedirectedOutput().Main); - } - - [RantFunction("item")] - [RantDescription("Prints the specified channel from the current block iteration.")] - private static void RedirectedItem(Sandbox sb, string channel) - { - sb.Print(sb.GetRedirectedOutput()[channel]); - } - - [RantFunction("protect")] - [RantDescription("Spawns a new block attribute context for the specified callback so any blocks therein will not consume the current attributes.")] - private static IEnumerator Protect(Sandbox sb, - [RantDescription("The callback to protect.")] - RST pattern) - { - sb.AttribManager.AddLayer(); - yield return pattern; - sb.AttribManager.RemoveLayer(); - } - - [RantFunction("vs")] - private static void VariableSet(Sandbox sb, string name, string value) - { - sb.Objects[name] = new RantObject(value); - } - - [RantFunction("vn")] - private static void VariableSet(Sandbox sb, string name, double value) - { - sb.Objects[name] = new RantObject(value); - } - - [RantFunction("vn")] - private static void VariableSet(Sandbox sb, string name, int min, int max) - { - sb.Objects[name] = new RantObject(sb.RNG.Next(min, max + 1)); - } - - [RantFunction("vp")] - private static void VariableSetLazy(Sandbox sb, string name, RST value) - { - sb.Objects[name] = new RantObject(value); - } - - [RantFunction("vcpy")] - private static void VariableCopy(Sandbox sb, string a, string b) - { - sb.Objects[b] = sb.Objects[a].Clone(); - } - - [RantFunction("v")] - private static IEnumerator VariableGet(Sandbox sb, string name) - { - var o = sb.Objects[name]; - if (o == null) - { - throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", name); - } - - if (o.Type == RantObjectType.Action) - { - yield return o.Value as RST; - } - else - { - sb.Print(o); - } - } - - [RantFunction("add")] - private static void AddVal(Sandbox sb, double a, double b) - { - sb.Print(a + b); - } - - [RantFunction("vadd")] - private static void AddVar(Sandbox sb, string a, double b) - { - sb.Objects[a] += new RantObject(b); - } - - [RantFunction("sub")] - private static void SubVal(Sandbox sb, double a, double b) - { - sb.Print(a - b); - } - - [RantFunction("vsub")] - private static void SubVar(Sandbox sb, string a, double b) - { - sb.Objects[a] -= new RantObject(b); - } - - [RantFunction("mul")] - private static void MulVal(Sandbox sb, double a, double b) - { - sb.Print(a * b); - } - - [RantFunction("vmul")] - private static void MulVar(Sandbox sb, string a, double b) - { - sb.Objects[a] *= new RantObject(b); - } - - [RantFunction("div")] - private static void DivVal(Sandbox sb, double a, double b) - { - sb.Print(a / b); - } - - [RantFunction("vdiv")] - private static void DivVar(Sandbox sb, string a, double b) - { - if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); - sb.Objects[a] /= new RantObject(b); - } - - [RantFunction("mod")] - private static void ModVal(Sandbox sb, double a, double b) - { - sb.Print(a % b); - } - - [RantFunction("vmod")] - private static void ModVar(Sandbox sb, string a, double b) - { - if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); - sb.Objects[a] %= new RantObject(b); - } - - [RantFunction("swap")] + // Methods representing Rant functions must be marked with [RantFunction] attribute to get registered by the engine. + // They may return either void or IEnumerator depending on your needs. + internal static partial class RantFunctionRegistry + { + [RantFunction("num", "n")] + [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] + private static void Number(Sandbox sb, + [RantDescription("The minimum value of the number to generate.")] int min, + [RantDescription("The maximum value of the number to generate.")] int max) => sb.Print(sb.RNG.Next(min, max + 1)); + + [RantFunction("num")] + [RantDescription("Formats an input string using the current number format settings and prints the result.")] + private static void Number(Sandbox sb, + [RantDescription("The string to convert into a number.")] string input) + { + sb.Print(double.TryParse(input, out double number) ? number : 0); + } + + [RantFunction("numfmt")] + [RantDescription("Sets the current number formatting mode.")] + private static void NumberFormat(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format) => sb.Output.Do(chain => chain.Last.NumberFormatter.NumberFormat = format); + + [RantFunction("numfmt")] + [RantDescription("Runs the specified pattern under a specific number formatting mode.")] + private static IEnumerator NumberFormatRange(Sandbox sb, + [RantDescription("The number format to use.")] NumberFormat format, + [RantDescription("The pattern to run.")] RST rangeAction) + { + var oldFmtMap = new Dictionary(); + + sb.Output.Do(chain => + { + oldFmtMap[chain] = chain.Last.NumberFormatter.NumberFormat; + chain.Last.NumberFormatter.NumberFormat = format; + }); + + yield return rangeAction; + + sb.Output.Do(chain => + { + if (!oldFmtMap.TryGetValue(chain, out NumberFormat fmt)) return; + chain.Last.NumberFormatter.NumberFormat = fmt; + }); + } + + [RantFunction] + [RantDescription("Specifies the current digit formatting mode for numbers.")] + private static void Digits(Sandbox sb, + [RantDescription("The digit format to use.")] BinaryFormat format, + [RantDescription("The digit count to associate with the mode.")] int digits) => sb.Output.Do(chain => + { + chain.Last.NumberFormatter.BinaryFormat = format; + chain.Last.NumberFormatter.BinaryFormatDigits = digits; + }); + + [RantFunction] + [RantDescription("Sets the current endianness for hex and binary formatted numbers.")] + private static void Endian(Sandbox sb, + [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); + + [RantFunction("init")] + [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] + private static void Initial(Sandbox sb, int index) => sb.AttribManager.CurrentAttribs.StartIndex = index; + + [RantFunction("rep", "r")] + [RantDescription("Sets the repetition count for the next block.")] + private static void Rep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times) => sb.AttribManager.CurrentAttribs.Repetitions = times; + + [RantFunction] + [RantDescription("Sets the repetition count to the number of items in the next block.")] + private static void RepEach(Sandbox sb) => sb.AttribManager.CurrentAttribs.RepEach = true; + + [RantFunction("sep")] + private static IEnumerator PrintSep(Sandbox sb) + { + yield return sb.Blocks.Peek().Attribs.Separator; + } + + [RantFunction("sep", "s")] + [RantDescription("Sets the separator pattern for the next block.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.AttribManager.CurrentAttribs.IsSeries = false; + sb.AttribManager.CurrentAttribs.Separator = separator; + } + + [RantFunction("sep", "s")] + [RantDescription("Flags the next block as a series and sets the separator and conjunction patterns.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The conjunction pattern to run before the last item.")] RST conjunction) + { + sb.AttribManager.CurrentAttribs.IsSeries = true; + sb.AttribManager.CurrentAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; + } + + [RantFunction("sep", "s")] + [RantDescription("Sets the separator, Oxford comma, and conjunction patterns for the next series.")] + private static void Sep(Sandbox sb, + [RantDescription("The separator pattern to run between items.")] RST separator, + [RantDescription("The Oxford comma pattern to run before the last item.")] RST oxford, + [RantDescription("The conjunction pattern to run before the last item in the series.")] RST conjunction) + { + sb.AttribManager.CurrentAttribs.IsSeries = true; + sb.AttribManager.CurrentAttribs.Separator = separator; + sb.AttribManager.CurrentAttribs.EndSeparator = oxford; + sb.AttribManager.CurrentAttribs.EndConjunction = conjunction; + } + + [RantFunction("rs")] + [RantDescription("Sets the repetitions and separator for the next block. A combination of rep and sep.")] + private static void RepSep(Sandbox sb, + [RantDescription("The number of times to repeat the next block.")] int times, + [RantDescription("The separator pattern to run between iterations of the next block.")] RST separator) + { + sb.AttribManager.CurrentAttribs.IsSeries = false; + sb.AttribManager.CurrentAttribs.Repetitions = times; + sb.AttribManager.CurrentAttribs.Separator = separator; + } + + [RantFunction] + [RantDescription("Sets the prefix pattern for the next block.")] + private static void Before(Sandbox sb, + [RantDescription("The pattern to run before each iteration of the next block.")] RST beforeAction) => sb.AttribManager.CurrentAttribs.Before = beforeAction; + + [RantFunction] + [RantDescription("Sets the postfix pattern for the next block.")] + private static void After(Sandbox sb, + [RantDescription("The pattern to run after each iteration of the next block.")] RST afterAction) => sb.AttribManager.CurrentAttribs.After = afterAction; + + [RantFunction] + [RantDescription("Modifies the likelihood that the next block will execute. Specified in percentage.")] + private static void Chance(Sandbox sb, + [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.AttribManager.CurrentAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; + + [RantFunction("case", "caps")] + [RantDescription("Changes the capitalization mode for all open channels.")] + private static void Case(Sandbox sb, + [RantDescription("The capitalization mode to use.")] Capitalization mode) => sb.Output.Capitalize(mode); + + [RantFunction("txtfmt")] + [RantDescription("Sets the text conversion format for all open channels.")] + private static void TxtFmt(Sandbox sb, + [RantDescription("The conversion mode to use.")] + CharConversion format) => sb.Output.SetConversion(format); + + [RantFunction] + [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] + private static void CapsInfer(Sandbox sb, + [RantDescription("A string that is capitalized in the format to be set.")] string sample) + { + var output = sb.Output; + if (string.IsNullOrEmpty(sample)) + { + output.Capitalize(Capitalization.None); + return; + } + var words = sample.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (words.Length == 1) + { + string word = words[0]; + if (word.Length == 1) + output.Capitalize(char.IsUpper(word[0]) ? Capitalization.First : Capitalization.None); + else if (Util.IsUppercase(word)) + output.Capitalize(Capitalization.Upper); + else if (char.IsUpper(word.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + else + { + // No letters? Forget it. + if (!sample.Any(char.IsLetter)) + { + output.Capitalize(Capitalization.None); + return; + } + + // Is all-caps? + if (Util.IsUppercase(sample)) + { + output.Capitalize(Capitalization.Upper); + return; + } + + var sentences = sample.Split(new[] { '.', '?', '!' }, StringSplitOptions.RemoveEmptyEntries) + .Select(str => str.Trim()) + .Where(str => + !string.IsNullOrEmpty(str) + && !char.IsDigit(str[0])).ToArray(); + + // All words capitalized? + var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); + if (lwords.Any() && + (sentences.Length == 1 || + sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) + { + if (lwords.All(lw => char.IsUpper(lw[0]))) + { + output.Capitalize(Capitalization.Word); + return; + } + + if (lwords.All(lw => char.IsLower(lw[0]) == sb.Format.Excludes(lw))) + { + output.Capitalize(Capitalization.Title); + return; + } + } + + // All sentences capitalized? + bool all = true; + bool none = true; + foreach (string sentence in sentences) + { + bool isCapitalized = char.IsUpper(sentence.SkipWhile(c => !char.IsLetter(c)).FirstOrDefault()); + all = all && isCapitalized; + none = none && !isCapitalized; + } + + if (sentences.Length > 1 && all) + output.Capitalize(Capitalization.Sentence); + else if (none) + output.Capitalize(Capitalization.Lower); + else if (char.IsUpper(sample.SkipWhile(c => !char.IsLetterOrDigit(c)).FirstOrDefault())) + output.Capitalize(Capitalization.First); + else + output.Capitalize(Capitalization.None); + } + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the first.")] + private static IEnumerator First(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration == 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the first.")] + private static IEnumerator NotFirst(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration > 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the last.")] + private static IEnumerator Last(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the last.")] + private static IEnumerator NotLast(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration < block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] + private static IEnumerator Middle(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration > 1 && block.Iteration < block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] + private static IEnumerator Ends(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == 1 || block.Iteration == block.Repetitions) yield return action; + } + + [RantFunction("repnum", "rn")] + [RantDescription("Prints the iteration number of the current block.")] + private static void RepNum(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration); + } + + [RantFunction("repelapsed", "re")] + [RantDescription("Prints the number of iterations remaining to be performed on the current block.")] + private static void RepElapsed(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Iteration - 1); + } + + [RantFunction("repcount", "rc")] + [RantDescription("Prints the repetition count of the current block.")] + private static void RepCount(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Repetitions); + } + + [RantFunction("reprem", "rr")] + [RantDescription("Prints the number of remaining repetitions queued after the current one.")] + private static void RepRem(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Repetitions - block.Iteration); + } + + [RantFunction("repqueued", "rq")] + [RantDescription("Prints the number of repetitions remaining to be completed on the current block.")] + private static void RepQueued(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + var block = sb.Blocks.Peek(); + sb.Print(block.Repetitions - (block.Iteration - 1)); + } + + [RantFunction] + [RantDescription("Prints the number of currently active blocks.")] + private static void Depth(Sandbox sb) => sb.Print(sb.Blocks.Count); + + [RantFunction("index", "i")] + [RantDescription("Prints the zero-based index of the block item currently being executed.")] + private static void Index(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index); + } + + [RantFunction("index1", "i1")] + [RantDescription("Prints the one-based index of the block item currently being executed.")] + private static void IndexOne(Sandbox sb) + { + if (!sb.Blocks.Any()) return; + sb.Print(sb.Blocks.Peek().Index + 1); + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an odd number.")] + private static IEnumerator Odd(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 != 0) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is an even number.")] + private static IEnumerator Even(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; + } + + [RantFunction] + [RantDescription("Returns the specified argument from the current subroutine.")] + private static IEnumerator Arg(Sandbox sb, + [RantDescription("The name of the argument to retrieve.")] string name) + { + if (!sb.SubroutineArgs.Any()) yield break; + var args = sb.SubroutineArgs.Peek(); + if (args.ContainsKey(name)) + yield return args[name]; + } + + [RantFunction] + [RantDescription("Retrieves and prints the current match string of the active replacer.")] + private static void Match(Sandbox sb) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Value); + } + + [RantFunction] + [RantDescription("Retrieves and prints the specified group value of the current match from the active replacer.")] + private static void Group(Sandbox sb, + [RantDescription("The name of the match group whose value will be retrieved.")] string groupName) + { + if (!sb.RegexMatches.Any()) return; + sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); + } + + [RantFunction] + [RantDescription("Sets the current rhyming mode for queries.")] + private static void Rhyme(Sandbox sb, + [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; + + [RantFunction("sync", "x")] + [RantDescription("Creates and applies a synchronizer with the specified name and type.")] + private static void Sync(Sandbox sb, + [RantDescription("The name of the synchronizer.")] string name, + [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); + + [RantFunction("xpin")] + [RantDescription("Pins a synchronizer.")] + private static void SyncPin(Sandbox sb, + [RantDescription("The name of the synchronizer to pin.")] string name) => sb.SyncManager.SetPinned(name, true); + + [RantFunction("xunpin")] + [RantDescription("Unpins a synchronizer.")] + private static void SyncUnpin(Sandbox sb, + [RantDescription("The name of the synchronizer to unpin.")] string name) => sb.SyncManager.SetPinned(name, false); + + [RantFunction("xstep")] + [RantDescription("Iterates a synchronizer.")] + private static void SyncStep(Sandbox sb, + [RantDescription("The name of the synchronizer to iterate.")] string name) => sb.SyncManager.Step(name); + + [RantFunction("xreset")] + [RantDescription("Resets a synchronizer to its initial state.")] + private static void SyncReset(Sandbox sb, + [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); + + [RantFunction("quote", "q")] + [RantDescription( + "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] + private static IEnumerator Quote(Sandbox sb, + [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) + { + sb.IncreaseQuote(); + sb.PrintOpeningQuote(); + yield return quoteAction; + sb.PrintClosingQuote(); + sb.DecreaseQuote(); + } + + [RantFunction] + [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] + private static IEnumerator Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) + { + sb.Output.OpenChannel(channelName, visibility); + yield return pattern; + sb.Output.CloseChannel(); + } + + [RantFunction("target", "t")] + [RantDescription("Places a target with the specified name at the current write position.")] + private static void Target(Sandbox sb, + [RantDescription("The name of the target.")] string targetName) => sb.Output.InsertTarget(targetName); + + [RantFunction] + [RantDescription("Appends a string to the specified target's contents.")] + private static void Send(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) => sb.Output.PrintToTarget(targetName, value); + + [RantFunction] + [RantDescription("Overwrites the specified target's contents with the provided value.")] + private static void SendOver(Sandbox sb, + [RantDescription("The name of the target to send to.")] string targetName, + [RantDescription("The string to send to the target.")] string value) + { + sb.Output.Do(chain => chain.ClearTarget(targetName)); + sb.Output.PrintToTarget(targetName, value); + } + + [RantFunction("targetval")] + [RantDescription("Prints the current value of the specified target. This function will not spawn a target.")] + private static void GetTargetValue(Sandbox sb, + [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); + + [RantFunction("clrt")] + [RantDescription("Clears the contents of the specified target.")] + private static void ClearTarget(Sandbox sb, + [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] + private static IEnumerator Nth(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] + private static IEnumerator NthO(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] + private static IEnumerator NotNth(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration % interval == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription( + "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." + )] + private static IEnumerator NotNthO(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) + { + if (!sb.Blocks.Any()) yield break; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; + yield return pattern; + } + + [RantFunction] + [RantDescription("Sets a pattern that will run before the next block.")] + private static void Start(Sandbox sb, + [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.AttribManager.CurrentAttribs.Start = beforePattern; + + [RantFunction] + [RantDescription("Sets a pattern that will run after the next block.")] + private static void End(Sandbox sb, + [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.AttribManager.CurrentAttribs.End = endPattern; + + // TODO: Finish [persist]. + //[RantFunction] + [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] + private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.AttribManager.CurrentAttribs.Persistence = persistence; + + [RantFunction] + [RantDescription("Loads and runs a pattern from cache or file.")] + private static IEnumerator Import(Sandbox sb, + [RantDescription("The name or path of the pattern to load.")] string name) + { + RST action; + + try + { + action = sb.Engine.GetProgramInternal(name).SyntaxTree; + } + catch (RantCompilerException e) + { + throw new RantRuntimeException(sb, sb.CurrentAction.Location, + $"Failed to compile imported pattern '{name}':\n{e.Message}"); + } + catch (Exception e) + { + throw new RantRuntimeException(sb, sb.CurrentAction.Location, + $"Failed to import '{name}':\n{e.Message}"); + } + + yield return action; + } + + [RantFunction] + [RantDescription("Defines the specified flags.")] + private static void Define(Sandbox sb, + [RantDescription("The list of flags to define.")] params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.Engine.Flags.Add(flag); + } + + [RantFunction] + [RantDescription("Undefines the specified flags.")] + private static void Undef(Sandbox sb, + [RantDescription("The list of flags to undefine.")] params string[] flags) + { + foreach (string flag in flags) sb.Engine.Flags.Remove(flag); + } + + [RantFunction] + [RantDescription("Toggles the specified flags.")] + private static void Toggle(Sandbox sb, params string[] flags) + { + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + { + if (sb.Engine.Flags.Contains(flag)) + sb.Engine.Flags.Remove(flag); + else + sb.Engine.Flags.Add(flag); + } + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are set.")] + private static void IfDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = true; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription( + "Sets the current flag condition for [then] ... [else] calls to be true if all the specified flags are unset.")] + private static void IfNDef(Sandbox sb, params string[] flags) + { + sb.FlagConditionExpectedResult = false; + sb.ConditionFlags.Clear(); + foreach (string flag in flags.Where(f => !Util.IsNullOrWhiteSpace(f) && Util.ValidateName(f))) + sb.ConditionFlags.Add(flag); + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition passes.")] + private static IEnumerator Then(Sandbox sb, RST conditionPassPattern) + { + if (sb.Engine.Flags.All(flag => sb.ConditionFlags.Contains(flag) == sb.FlagConditionExpectedResult)) + yield return conditionPassPattern; + } + + [RantFunction] + [RantDescription("Executes a pattern if the current flag condition fails.")] + private static IEnumerator Else(Sandbox sb, RST conditionFailPattern) + { + if (sb.Engine.Flags.Any(flag => sb.ConditionFlags.Contains(flag) != sb.FlagConditionExpectedResult)) + yield return conditionFailPattern; + } + + [RantFunction] + [RantDescription("Yields the currenty written output.")] + private static void Yield(Sandbox sb) => sb.SetYield(); + + [RantFunction] + [RantDescription("Branches the internal RNG according to a seed.")] + private static void Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed) => sb.RNG.Branch(seed.Hash()); + + [RantFunction] + [RantDescription("Branches the internal RNG, executes the specified pattern, and then merges the branch.")] + private static IEnumerator Branch(Sandbox sb, + [RantDescription("The seed for the branch.")] string seed, + [RantDescription("The pattern to run on the branch.")] RST branchAction) + { + sb.RNG.Branch(seed.Hash()); + yield return branchAction; + sb.RNG.Merge(); + } + + [RantFunction] + [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] + private static void Merge(Sandbox sb) => sb.RNG.Merge(); + + [RantFunction("in")] + [RantDescription("Prints the value of the specified pattern argument.")] + private static void PatternArg(Sandbox sb, + [RantDescription("The name of the argument to access.")] string argName) + { + if (sb.PatternArgs == null) return; + sb.Output.Print(sb.PatternArgs[argName]); + } + + [RantFunction("tm")] + [RantDescription("Prints the trademark symbol.")] + private static void Trademark(Sandbox sb) => sb.Print("\x2122"); + + [RantFunction("reg")] + [RantDescription("Prints the registered trademark symbol.")] + private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); + + [RantFunction("c")] + [RantDescription("Prints the copyright symbol.")] + private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); + + [RantFunction("em")] + [RantDescription("Prints an emdash.")] + private static void Emdash(Sandbox sb) => sb.Print("\x2014"); + + [RantFunction("en")] + [RantDescription("Prints an endash.")] + private static void Endash(Sandbox sb) => sb.Print("\x2013"); + + [RantFunction("b")] + [RantDescription("Prints a bullet character.")] + private static void Bullet(Sandbox sb) => sb.Print("\x2022"); + + [RantFunction("ss")] + [RantDescription("Prints an eszett (ß).")] + private static void Eszett(Sandbox sb) => sb.Print("\x00df"); + + [RantFunction("emoji")] + [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] + private static void PrintEmoji(Sandbox sb, + [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) + { + shortcode = shortcode.ToLower(); + if (!Emoji.Shortcodes.ContainsKey(shortcode)) + { + sb.Print("[missing emoji]"); + return; + } + sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); + } + + [RantFunction("plural", "pl")] + [RantDescription("Infers and prints the plural form of the specified word.")] + private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); + + [RantFunction] + [RantDescription("Prints the current length of the specified channel, in characters.")] + private static void Len(Sandbox sb, + [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); + + [RantFunction("rev")] + [RantDescription("Reverses the specified string and prints it to the output.")] + private static void Reverse(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = input[i]; + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = input[i]; + } + sb.Print(new string(buffer)); + } + + [RantFunction("revx")] + [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] + private static void ReverseEx(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = Util.ReverseChar(input[i]); + } + sb.Print(new string(buffer)); + } + + [RantFunction("accent")] + [RantDescription("Accents the previous character.")] + private static void AddAccent(Sandbox sb, Accent accent) => sb.Print(accent.GetAccentChar()); + + [RantFunction("accent")] + [RantDescription("Accents the specified character.")] + private static void AddAccent(Sandbox sb, string character, Accent accent) => sb.Print($"{character}{accent.GetAccentChar()}".Normalize(NormalizationForm.FormC)); + + [RantFunction("acute", "act")] + [RantDescription("Accents the specified character with an acute (a\u0301) accent.")] + private static void AccentAcute(Sandbox sb, string character) => sb.Print($"{character}\u0301".Normalize(NormalizationForm.FormC)); + + [RantFunction("circumflex", "cflex")] + [RantDescription("Accents the specified character with a circumflex (a\u0302) accent.")] + private static void AccentCircumflex(Sandbox sb, string character) => sb.Print($"{character}\u0302".Normalize(NormalizationForm.FormC)); + + [RantFunction("grave", "grv")] + [RantDescription("Accents the specified character with a grave (a\u0300) accent.")] + private static void AccentGrave(Sandbox sb, string character) => sb.Print($"{character}\u0300".Normalize(NormalizationForm.FormC)); + + [RantFunction("ring")] + [RantDescription("Accents the specified character with a ring (a\u030A) accent.")] + private static void AccentRing(Sandbox sb, string character) => sb.Print($"{character}\u030A".Normalize(NormalizationForm.FormC)); + + [RantFunction("tilde", "tld")] + [RantDescription("Accents the specified character with a tilde (a\u0303) accent.")] + private static void AccentTilde(Sandbox sb, string character) => sb.Print($"{character}\u0303".Normalize(NormalizationForm.FormC)); + + [RantFunction("diaeresis", "dia")] + [RantDescription("Accents the specified character with a diaeresis (a\u0308) accent.")] + private static void AccentDiaeresis(Sandbox sb, string character) => sb.Print($"{character}\u0308".Normalize(NormalizationForm.FormC)); + + [RantFunction("caron", "crn")] + [RantDescription("Accents the specified character with a caron (c\u030C) accent.")] + private static void AccentCaron(Sandbox sb, string character) => sb.Print($"{character}\u030C".Normalize(NormalizationForm.FormC)); + + [RantFunction("macron", "mcn")] + [RantDescription("Accents the specified character with a macron (c\u0304) accent.")] + private static void AccentMacron(Sandbox sb, string character) => sb.Print($"{character}\u0304".Normalize(NormalizationForm.FormC)); + + [RantFunction("cedilla", "ced")] + [RantDescription("Accents the specified character with a cedilla (c\u0327) accent.")] + private static void AccentCedilla(Sandbox sb, string character) => sb.Print($"{character}\u0327".Normalize(NormalizationForm.FormC)); + + [RantFunction("char")] + [RantDescription("Prints a Unicode character given its official Unicode-designated name (e.g. 'LATIN CAPITAL LETTER R' -> 'R').")] + private static void Character(Sandbox sb, + [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); + + [RantFunction("rcc")] + [RantDescription("Resets the specified carrier components.")] + private static void ResetCarrier(Sandbox sb, + [RantDescription("The list of carrier component identifiers to reset.")] + params string[] ids) + { + foreach (var id in ids) + { + if (String.IsNullOrWhiteSpace(id)) continue; + sb.CarrierState.DeleteAssociation(id); + sb.CarrierState.DeleteMatch(id); + sb.CarrierState.DeleteRhyme(id); + sb.CarrierState.DeleteUnique(id); + } + } + + [RantFunction("query")] + private static IEnumerator QueryRun(Sandbox sb) + { + return sb.QueryBuilder.CurrentQuery?.Run(sb); + } + + [RantFunction("qname")] + private static void QueryName(Sandbox sb, string id, string name) + { + sb.QueryBuilder.GetQuery(id).Name = name; + } + + [RantFunction("qsub")] + private static void QuerySubtype(Sandbox sb, string id, string name) + { + sb.QueryBuilder.GetQuery(id).Subtype = name; + } + + [RantFunction("qcf")] + private static void QueryClassFilterPositive(Sandbox sb, string id, params string[] classes) + { + Query q; + ClassFilter cf; + cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; + if (cf == null) q.AddFilter(cf = new ClassFilter()); + foreach (var cl in classes) + { + cf.AddRule(new ClassFilterRule(cl, true)); + } + } + + [RantFunction("qcfn")] + private static void QueryClassFilterNegative(Sandbox sb, string id, params string[] classes) + { + Query q; + ClassFilter cf; + cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; + if (cf == null) q.AddFilter(cf = new ClassFilter()); + foreach (var cl in classes) + { + cf.AddRule(new ClassFilterRule(cl, false)); + } + } + + [RantFunction("pipe")] + [RantDescription("Redirects the output from the next block into the specified callback. Access block output with [item].")] + private static void Redirect(Sandbox sb, + [RantDescription("The callback to redirect block output to.")] + RST redirectCallback) + { + sb.AttribManager.CurrentAttribs.Redirect = redirectCallback; + } + + [RantFunction("item")] + [RantDescription("Prints the main output from the current block iteration.")] + private static void RedirectedItem(Sandbox sb) + { + sb.Print(sb.GetRedirectedOutput().Main); + } + + [RantFunction("item")] + [RantDescription("Prints the specified channel from the current block iteration.")] + private static void RedirectedItem(Sandbox sb, + [RantDescription("The output channel to print from.")] + string channel) + { + sb.Print(sb.GetRedirectedOutput()[channel]); + } + + [RantFunction("protect")] + [RantDescription("Spawns a new block attribute context for the specified callback so any blocks therein will not consume the current attributes.")] + private static IEnumerator Protect(Sandbox sb, + [RantDescription("The callback to protect.")] + RST pattern) + { + sb.AttribManager.AddLayer(); + yield return pattern; + sb.AttribManager.RemoveLayer(); + } + + [RantFunction("vs")] + [RantDescription("Creates a new string variable with the specified name and value.")] + private static void VariableSet(Sandbox sb, + [RantDescription("The name of the variable.")] + string name, + [RantDescription("The value of the variable.")] + string value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vn")] + [RantDescription("Creates a new number variable with the specified name and value.")] + private static void VariableSet(Sandbox sb, + [RantDescription("The name of the variable.")] + string name, + [RantDescription("The value of the variable.")] + double value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vn")] + [RantDescription("Creates a new number variable with a random value between the specified minimum and maximum bounds.")] + private static void VariableSet(Sandbox sb, + [RantDescription("The name of the variable.")] + string name, + [RantDescription("The minimum bound of the value.")] + int min, + [RantDescription("The maximum bound of the value.")] + int max) + { + sb.Objects[name] = new RantObject(sb.RNG.Next(min, max + 1)); + } + + [RantFunction("vp")] + [RantDescription("Creates a new pattern variable with the specified callback.")] + private static void VariableSetLazy(Sandbox sb, + [RantDescription("The name of the variable.")] + string name, + [RantDescription("The value of the variable.")] + RST value) + { + sb.Objects[name] = new RantObject(value); + } + + [RantFunction("vcpy")] + [RantDescription("Copies the value of the variable with the first name to the variable with the second name.")] + private static void VariableCopy(Sandbox sb, + [RantDescription("The variable to copy from.")] + string a, + [RantDescription("The variable to copy to.")] + string b) + { + sb.Objects[b] = sb.Objects[a].Clone(); + } + + [RantFunction("v")] + [RantDescription("Prints the value of the specified variable.")] + private static IEnumerator VariableGet(Sandbox sb, + [RantDescription("The name of the variable to retrieve.")] + string name) + { + var o = sb.Objects[name]; + if (o == null) + { + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", name); + } + + if (o.Type == RantObjectType.Action) + { + yield return o.Value as RST; + } + else + { + sb.Print(o); + } + } + + [RantFunction("add")] + [RantDescription("Prints the num of the specified values.")] + private static void AddVal(Sandbox sb, + [RantDescription("The first operand.")] + double a, + [RantDescription("The second operand.")] + double b) + { + sb.Print(a + b); + } + + [RantFunction("vadd")] + [RantDescription("Adds a number to the specified variable.")] + private static void AddVar(Sandbox sb, + [RantDescription("The name of the variable to add to.")] + string a, + [RantDescription("The value to add.")] + double b) + { + sb.Objects[a] += new RantObject(b); + } + + [RantFunction("sub")] + [RantDescription("Prints the difference of the specified values.")] + private static void SubVal(Sandbox sb, + [RantDescription("The first operand.")] + double a, + [RantDescription("The second operand.")] + double b) + { + sb.Print(a - b); + } + + [RantFunction("vsub")] + [RantDescription("Subtracts a number from the specified variable.")] + private static void SubVar(Sandbox sb, + [RantDescription("The name of the variable to subtract from.")] + string a, + [RantDescription("The value to subtract.")] + double b) + { + sb.Objects[a] -= new RantObject(b); + } + + [RantFunction("mul")] + [RantDescription("Prints the product of the specified numbers.")] + private static void MulVal(Sandbox sb, + [RantDescription("The first operand.")] + double a, + [RantDescription("The second operand.")] + double b) + { + sb.Print(a * b); + } + + [RantFunction("vmul")] + [RantDescription("Multiplies the specified variable by a number.")] + private static void MulVar(Sandbox sb, + [RantDescription("The name of the variable to multiply.")] + string a, + [RantDescription("The value to multiply by.")] + double b) + { + sb.Objects[a] *= new RantObject(b); + } + + [RantFunction("div")] + [RantDescription("Prints the quotient of the two specified numbers.")] + private static void DivVal(Sandbox sb, + [RantDescription("The dividend.")] + double a, + [RantDescription("The divisor.")] + double b) + { + sb.Print(a / b); + } + + [RantFunction("vdiv")] + [RantDescription("Divides the specified variable by a number.")] + private static void DivVar(Sandbox sb, + [RantDescription("The name of the variable to divide.")] + string a, + [RantDescription("The divisor.")] + double b) + { + if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); + sb.Objects[a] /= new RantObject(b); + } + + [RantFunction("mod")] + private static void ModVal(Sandbox sb, double a, double b) + { + sb.Print(a % b); + } + + [RantFunction("vmod")] + private static void ModVar(Sandbox sb, string a, double b) + { + if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); + sb.Objects[a] %= new RantObject(b); + } + + [RantFunction("swap")] [RantDescription("Swaps the values of the variables with the two specified names.")] - private static void Swap(Sandbox sb, string a, string b) - { - var temp = sb.Objects[a]; - sb.Objects[a] = sb.Objects[b]; - sb.Objects[b] = temp; - } - - [RantFunction("veq")] + private static void Swap(Sandbox sb, + [RantDescription("The name of the first variable.")] + string a, + [RantDescription("The name of the second variable.")] + string b) + { + var temp = sb.Objects[a]; + sb.Objects[a] = sb.Objects[b]; + sb.Objects[b] = temp; + } + + [RantFunction("veq")] [RantDescription("Prints a boolean value indicating whether the variables with the two specified names are equal to each other.")] private static void CompEquals(Sandbox sb, RantObject a, RantObject b) - { - sb.Print(a.Value.Equals(b.Value) ? TRUE : FALSE); - } + { + sb.Print(a.Value.Equals(b.Value) ? TRUE : FALSE); + } [RantFunction("vne")] [RantDescription("Prints a boolean value indicating whether the variables with the two specified names are not equal to each other.")] @@ -1124,183 +1200,183 @@ private static void CompNotEquals(Sandbox sb, RantObject a, RantObject b) [RantFunction("eq")] [RantDescription("Prints a boolean value indicating whether the two values have equal string representations.")] - private static void CompEquals(Sandbox sb, string a, string b) - { - sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? TRUE : FALSE); - } + private static void CompEquals(Sandbox sb, string a, string b) + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? TRUE : FALSE); + } - [RantFunction("eqi")] + [RantFunction("eqi")] [RantDescription("Prints a boolean value indicating whether the two values have equal string representations, ignoring case.")] private static void CompEqualsIgnoreCase(Sandbox sb, string a, string b) - { - sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? TRUE : FALSE); - } + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? TRUE : FALSE); + } - [RantFunction("ne")] + [RantFunction("ne")] [RantDescription("Prints a boolean value indicating whether the two values do not have equal string representations.")] private static void CompNotEquals(Sandbox sb, string a, string b) - { - sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? FALSE : TRUE); - } + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCulture) ? FALSE : TRUE); + } - [RantFunction("nei")] + [RantFunction("nei")] [RantDescription("Prints a boolean value indicating whether two values do not have equal string representations, ignoring case.")] private static void CompNotEqualsIgnoreCase(Sandbox sb, string a, string b) - { - sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? FALSE : TRUE); - } - - [RantFunction("gt")] - private static void CompGreater(Sandbox sb, double a, double b) - { - sb.Print(a > b ? TRUE : FALSE); - } - - [RantFunction("ge")] - private static void CompGreaterEqual(Sandbox sb, double a, double b) - { - sb.Print(a >= b ? TRUE : FALSE); - } - - [RantFunction("lt")] - private static void CompLess(Sandbox sb, double a, double b) - { - sb.Print(a < b ? TRUE : FALSE); - } - - [RantFunction("le")] - private static void CompLessEqual(Sandbox sb, double a, double b) - { - sb.Print(a <= b ? TRUE : FALSE); - } - - [RantFunction("not")] - private static void Not(Sandbox sb, bool a) - { - sb.Print(a ? FALSE : TRUE); - } - - [RantFunction("vnot")] - private static void Not(Sandbox sb, string a) - { - var o = sb.Objects[a]; - if (o == null) - { - throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", a); - } - sb.Objects[a] = !o; - } - - [RantFunction("and")] - private static void And(Sandbox sb, bool a, params bool[] b) - { - bool result = a; - if (!a) - { - sb.Print(FALSE); - return; - } - for (int i = 0; i < b.Length; i++) - { - result = result && b[i]; - } - sb.Print(result ? TRUE : FALSE); - } - - [RantFunction("nand")] - private static void Nand(Sandbox sb, bool a, params bool[] b) - { - bool result = a; - if (!a) - { - sb.Print(TRUE); - return; - } - for (int i = 0; i < b.Length; i++) - { - result = result && b[i]; - } - sb.Print(result ? FALSE : TRUE); - } - - [RantFunction("or")] - private static void Or(Sandbox sb, bool a, params bool[] b) - { - if (a) - { - sb.Print(TRUE); - return; - } - for (int i = 0; i < b.Length; i++) - { - if (!b[i]) continue; - sb.Print(TRUE); - return; - } - sb.Print(FALSE); - } - - [RantFunction("xor")] - private static void Xor(Sandbox sb, bool a, params bool[] b) - { - bool x = a; - for (int i = 0; i < b.Length; i++) - { - if (b[i]) - { - if (x) - { - sb.Print(FALSE); - return; - } - x = b[i]; - } - } - sb.Print(x ? TRUE : FALSE); - } - - [RantFunction("maybe")] - private static void Maybe(Sandbox sb) - { - sb.Print(sb.RNG.NextBoolean() ? TRUE : FALSE); - } - - [RantFunction("if")] - private static IEnumerator If(Sandbox sb, bool condition, RST body) - { - if (condition) yield return body; - } - - [RantFunction("ifnot", "ifn")] - private static IEnumerator IfNot(Sandbox sb, bool condition, RST body) - { - if (!condition) yield return body; - } - - [RantFunction("if")] - private static IEnumerator If(Sandbox sb, bool condition, RST body, RST elseBody) - { - if (condition) - { - yield return body; - } - else - { - yield return elseBody; - } - } - - [RantFunction("ifnot", "ifn")] - private static IEnumerator IfNot(Sandbox sb, bool condition, RST body, RST elseBody) - { - if (!condition) - { - yield return body; - } - else - { - yield return elseBody; - } - } - } + { + sb.Print(String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase) ? FALSE : TRUE); + } + + [RantFunction("gt")] + private static void CompGreater(Sandbox sb, double a, double b) + { + sb.Print(a > b ? TRUE : FALSE); + } + + [RantFunction("ge")] + private static void CompGreaterEqual(Sandbox sb, double a, double b) + { + sb.Print(a >= b ? TRUE : FALSE); + } + + [RantFunction("lt")] + private static void CompLess(Sandbox sb, double a, double b) + { + sb.Print(a < b ? TRUE : FALSE); + } + + [RantFunction("le")] + private static void CompLessEqual(Sandbox sb, double a, double b) + { + sb.Print(a <= b ? TRUE : FALSE); + } + + [RantFunction("not")] + private static void Not(Sandbox sb, bool a) + { + sb.Print(a ? FALSE : TRUE); + } + + [RantFunction("vnot")] + private static void Not(Sandbox sb, string a) + { + var o = sb.Objects[a]; + if (o == null) + { + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", a); + } + sb.Objects[a] = !o; + } + + [RantFunction("and")] + private static void And(Sandbox sb, bool a, params bool[] b) + { + bool result = a; + if (!a) + { + sb.Print(FALSE); + return; + } + for (int i = 0; i < b.Length; i++) + { + result = result && b[i]; + } + sb.Print(result ? TRUE : FALSE); + } + + [RantFunction("nand")] + private static void Nand(Sandbox sb, bool a, params bool[] b) + { + bool result = a; + if (!a) + { + sb.Print(TRUE); + return; + } + for (int i = 0; i < b.Length; i++) + { + result = result && b[i]; + } + sb.Print(result ? FALSE : TRUE); + } + + [RantFunction("or")] + private static void Or(Sandbox sb, bool a, params bool[] b) + { + if (a) + { + sb.Print(TRUE); + return; + } + for (int i = 0; i < b.Length; i++) + { + if (!b[i]) continue; + sb.Print(TRUE); + return; + } + sb.Print(FALSE); + } + + [RantFunction("xor")] + private static void Xor(Sandbox sb, bool a, params bool[] b) + { + bool x = a; + for (int i = 0; i < b.Length; i++) + { + if (b[i]) + { + if (x) + { + sb.Print(FALSE); + return; + } + x = b[i]; + } + } + sb.Print(x ? TRUE : FALSE); + } + + [RantFunction("maybe")] + private static void Maybe(Sandbox sb) + { + sb.Print(sb.RNG.NextBoolean() ? TRUE : FALSE); + } + + [RantFunction("if")] + private static IEnumerator If(Sandbox sb, bool condition, RST body) + { + if (condition) yield return body; + } + + [RantFunction("ifnot", "ifn")] + private static IEnumerator IfNot(Sandbox sb, bool condition, RST body) + { + if (!condition) yield return body; + } + + [RantFunction("if")] + private static IEnumerator If(Sandbox sb, bool condition, RST body, RST elseBody) + { + if (condition) + { + yield return body; + } + else + { + yield return elseBody; + } + } + + [RantFunction("ifnot", "ifn")] + private static IEnumerator IfNot(Sandbox sb, bool condition, RST body, RST elseBody) + { + if (!condition) + { + yield return body; + } + else + { + yield return elseBody; + } + } + } } \ No newline at end of file From 4b0be0c479bbc5f17abf340de17bd588ad109612 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Mon, 27 Mar 2017 14:03:57 -0500 Subject: [PATCH 165/213] Fix filter switches --- Rant/Core/Compiler/Parsing/QueryParser.cs | 17 +++++++++++++---- Rant/Core/Framework/RantFunctionRegistry.cs | 1 + Rant/Vocabulary/Querying/ClassFilter.cs | 8 ++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index 456a90e..c0a2fdb 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -30,6 +30,7 @@ using Rant.Core.Compiler.Syntax; using Rant.Core.Utilities; using Rant.Vocabulary.Querying; +using System.Linq; namespace Rant.Core.Compiler.Parsing { @@ -95,7 +96,14 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext // read class filter case R.Hyphen: { - var classFilter = new ClassFilter(); + ClassFilter classFilter; + if ((classFilter = query.GetClassFilters().FirstOrDefault()) == null) + { + classFilter = new ClassFilter(); + query.AddFilter(classFilter); + } + + var filterSwitches = new List(); do { reader.SkipSpace(); @@ -109,10 +117,11 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var classFilterName = reader.Read(R.Text, "acc-class-filter-rule"); if (classFilterName.Value == null) continue; var rule = new ClassFilterRule(classFilterName.Value, !blacklist); - classFilter.AddRule(rule); + filterSwitches.Add(rule); + } while (reader.TakeLoose(R.Pipe)); //fyi: this feature is undocumented - - query.AddFilter(classFilter); + + classFilter.AddRuleSwitch(filterSwitches.ToArray()); break; } // read regex filter diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 8db9dd2..c700a4a 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1143,6 +1143,7 @@ private static void DivVal(Sandbox sb, [RantDescription("The divisor.")] double b) { + if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); sb.Print(a / b); } diff --git a/Rant/Vocabulary/Querying/ClassFilter.cs b/Rant/Vocabulary/Querying/ClassFilter.cs index 6cb4865..dd5513a 100644 --- a/Rant/Vocabulary/Querying/ClassFilter.cs +++ b/Rant/Vocabulary/Querying/ClassFilter.cs @@ -27,6 +27,7 @@ using System.Linq; using Rant.Core.IO; +using System; namespace Rant.Vocabulary.Querying { @@ -69,9 +70,12 @@ public void AddRuleSwitch(params ClassFilterRule[] items) _items.Add(items); } - public IEnumerable GenerateRequiredSet(RNG rng) => _items.Select(set => set[rng.Next(set.Length)]); + public IEnumerable GenerateRequiredSet(RNG rng) + { + return _items.Select(set => set[rng.Next(set.Length)]); + } - public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) + public override bool Test(RantDictionary dictionary, RantDictionaryTable table, RantDictionaryEntry entry, int termIndex, Query query) { bool match = query.Exclusive ? _items.Any() == entry.GetClasses().Any() From dfc18db1e3ce75bf3509db5cbb1a19b954246854 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 29 Mar 2017 20:40:10 -0500 Subject: [PATCH 166/213] Fix Unity compatability --- Rant/Core/Formatting/Unicode.cs | 4 +++- Rant/Core/Framework/RantFunctionRegistry.cs | 2 +- Rant/Core/ObjectModel/RantObject.cs | 22 ++++++++++++++++++++- Rant/Core/Utilities/Util.cs | 9 +++++++-- appveyor.yml | 2 +- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/Rant/Core/Formatting/Unicode.cs b/Rant/Core/Formatting/Unicode.cs index 1e73f82..8a2b062 100644 --- a/Rant/Core/Formatting/Unicode.cs +++ b/Rant/Core/Formatting/Unicode.cs @@ -29,6 +29,8 @@ using System.Reflection; using System.Text; +using Rant.Core.Utilities; + namespace Rant.Core.Formatting { internal static class Unicode @@ -47,7 +49,7 @@ static Unicode() while (!reader.EndOfStream) { string line = reader.ReadLine(); - if (String.IsNullOrWhiteSpace(line)) continue; + if (Util.IsNullOrWhiteSpace(line)) continue; var entry = line.Split(','); _unicodeCharacterMap[entry[0].Trim()] = Convert.ToUInt32(entry[1].Trim()); } diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index c700a4a..80708f8 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -902,7 +902,7 @@ private static void ResetCarrier(Sandbox sb, { foreach (var id in ids) { - if (String.IsNullOrWhiteSpace(id)) continue; + if (Util.IsNullOrWhiteSpace(id)) continue; sb.CarrierState.DeleteAssociation(id); sb.CarrierState.DeleteMatch(id); sb.CarrierState.DeleteRhyme(id); diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index e9a2456..a85e8aa 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -158,7 +158,7 @@ public RantObject(RantObjectType type) /// /// The type of the object. /// - public RantObjectType Type { get; internal set; } = RantObjectType.Null; + public RantObjectType Type { get; private set; } = RantObjectType.Null; /// /// The value of the object. @@ -188,6 +188,26 @@ public object Value } } + /// + /// Gets or sets the object at the specified index in the object. + /// Only works with list objects. + /// + /// The index of the item to access. + /// + public RantObject this[int index] + { + get + { + if (Type != RantObjectType.List) return null; + return index >= 0 && index < _list.Count ? _list[index] : null; + } + set + { + if (Type != RantObjectType.List) return; + if (index >= 0 && index < _list.Count) _list[index] = value; + } + } + /// /// Converts the current object to a RantObject of the specified type and returns it. /// diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index 7afc07a..b7df30f 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -77,11 +77,17 @@ public static bool TryParseEnum(Type enumType, string modeString, out object val return true; } + /// + /// Alternative implementation of String.IsNullOrWhitespace for Unity compatability. + /// + /// The string to check. + /// #if !UNITY [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public static bool IsNullOrWhiteSpace(string value) { + // ReSharper disable once ReplaceWithStringIsNullOrEmpty return value == null || value.Length == 0 || value.All(char.IsWhiteSpace); } @@ -439,9 +445,8 @@ public static bool TryParseSurrogatePair(string value, out char highSurrogate, o const uint lowSurrogateOffset = 0xDC00; const uint highSurrogateOffset = 0xD800; const uint minCodePoint = 0x10000; - uint codePoint; - if (!uint.TryParse(value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + if (!uint.TryParse(value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out uint codePoint)) return false; if (codePoint < minCodePoint) return false; diff --git a/appveyor.yml b/appveyor.yml index 3bf9042..1f55d0c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.{build} +version: 3.0.{build} branches: only: - master From 248e8b2efcd85c1a237e9458681406178c8adfd7 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 29 Mar 2017 20:46:26 -0500 Subject: [PATCH 167/213] Adjust assembly naming for Unity build --- Rant/Properties/AssemblyInfo.cs | 8 ++++++-- Rant/Rant.csproj | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Rant/Properties/AssemblyInfo.cs b/Rant/Properties/AssemblyInfo.cs index b1467fd..f9d8f72 100644 --- a/Rant/Properties/AssemblyInfo.cs +++ b/Rant/Properties/AssemblyInfo.cs @@ -31,15 +31,19 @@ // set of attributes. Change these attribute values to modify the information // associated with an assembly. +#if UNITY +[assembly: AssemblyTitle("Rant for Unity")] +#else [assembly: AssemblyTitle("Rant")] +#endif [assembly: AssemblyDescription("Rant procedural text generation engine")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Rant")] -[assembly: AssemblyCopyright("Copyright © 2016 Nicholas Fleck")] +[assembly: AssemblyCopyright("Copyright © 2017 Nicholas Fleck")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -[assembly: InternalsVisibleTo("Rave")] +[assembly: InternalsVisibleTo("Rant.Tools")] [assembly: InternalsVisibleTo("Rant.Tests")] // Setting ComVisible to false makes the types in this assembly not visible diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index f1a3a89..dfa41e4 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -121,12 +121,12 @@ v3.5 - RantEngine-Unity + Rant.Unity ..\bin\UnityBuild\ TRACE;UNITY - ..\bin\UnityBuild\RantEngine-Unity.xml + ..\bin\UnityBuild\Rant.Unity.xml true AnyCPU prompt From 1f8540bfe79b2da0d744858a4cfe3bbe202f5298 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 29 Mar 2017 20:55:51 -0500 Subject: [PATCH 168/213] Let's try actually building the Unity config... --- appveyor.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 1f55d0c..829824d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,7 +4,9 @@ branches: - master - dev-3.0 image: Visual Studio 2017 -configuration: Release +configuration: + - Release + - Unity shallow_clone: true assembly_info: patch: true From ced2fede7ca5fe5d976ccae027c903d6124c06e2 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 30 Mar 2017 19:10:16 -0500 Subject: [PATCH 169/213] Rename RantEngine.DoPackaged to RantEngine.DoName --- Rant.Console/Program.cs | 2 +- Rant.Tests/Packages.cs | 2 +- Rant/Rant.nuspec | 10 +++++----- Rant/RantEngine.cs | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 42c3e65..2c322b7 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -34,7 +34,7 @@ static Program() private static void Main(string[] args) { - OutputEncoding = Encoding.Unicode; + OutputEncoding = Encoding.UTF8; Title = "Rant Console" + (Flag("nsfw") ? " [NSFW]" : ""); var rant = new RantEngine(); diff --git a/Rant.Tests/Packages.cs b/Rant.Tests/Packages.cs index 2fa228a..84b86e8 100644 --- a/Rant.Tests/Packages.cs +++ b/Rant.Tests/Packages.cs @@ -30,7 +30,7 @@ public void SaveLoadRun() package = RantPackage.Load("TestPackage.rantpkg"); rant.LoadPackage(package); - Assert.AreEqual("Banana 1, 2, 3, 4, 5", rant.DoPackaged("TestProgram").Main); + Assert.AreEqual("Banana 1, 2, 3, 4, 5", rant.DoName("TestProgram").Main); Assert.AreEqual("TestPackage", package.ID); Assert.AreEqual("This is a test.", package.Description); Assert.AreEqual("Test Package?!", package.Title); diff --git a/Rant/Rant.nuspec b/Rant/Rant.nuspec index df8c8c1..68f7bf9 100644 --- a/Rant/Rant.nuspec +++ b/Rant/Rant.nuspec @@ -1,5 +1,5 @@ - + Rant 3.0.0 @@ -8,11 +8,11 @@ Nicholas Fleck, Andrew Rogers https://github.com/TheBerkin/Rant/blob/master/LICENSE https://github.com/TheBerkin/Rant - http://i.imgur.com/EZinvT5.png + http://i.imgur.com/E0mZ9YL.png false - Rant is a language for adding rich variations to text. It combines a markup language with functional and imperative programming concepts to deliver a concise but powerful tool for procedurally generating text. The goal of Rant is to augment human creativity with the boundless potential of randomness, enabling content producers to consider their next idea as not just a concept, but a seed for countless possibilities. - Flexible, powerful procedural text generation language - Copyright 2015 Nicholas Fleck + Rant is a free, all-purpose procedural text generation language developed for .NET. It has been refined over several years of development to include a dizzying array of features designed to handle everything from the most rudimentary of string generation tasks to dynamic game dialogue generation, code templating, automatic formatting, poetry, and much more. + Flexible, powerful procedural text engine + Copyright 2017 Nicholas Fleck rant procedural text generation scripting language .net C# diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 62d6572..61b84e2 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -504,7 +504,7 @@ public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0 /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) + public RantOutput DoName(string patternName, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) { if (!ProgramNameLoaded(patternName)) throw new ArgumentException("Pattern doesn't exist."); @@ -527,7 +527,7 @@ public RantOutput DoPackaged(string patternName, int charLimit = 0, double timeo /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, double timeout = -1, + public RantOutput DoName(string patternName, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) { if (!ProgramNameLoaded(patternName)) @@ -551,7 +551,7 @@ public RantOutput DoPackaged(string patternName, long seed, int charLimit = 0, d /// The maximum number of seconds that the pattern will execute for. /// The arguments to pass to the pattern. /// - public RantOutput DoPackaged(string patternName, RNG rng, int charLimit = 0, double timeout = -1, + public RantOutput DoName(string patternName, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) { if (!ProgramNameLoaded(patternName)) From 9ff5b9eb6048ff59547750fb1cae34c9e225d422 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 31 Mar 2017 19:10:16 -0500 Subject: [PATCH 170/213] Improve constant block weight detection --- Rant.Tests/Compiler/Serialization.cs | 24 +++++++++++++++++++++++ Rant/Core/Compiler/Parsing/BlockParser.cs | 12 ++++++++---- Rant/Core/Compiler/Syntax/RstBlock.cs | 9 +++++++-- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Rant.Tests/Compiler/Serialization.cs b/Rant.Tests/Compiler/Serialization.cs index 5cd4e0a..5488cd6 100644 --- a/Rant.Tests/Compiler/Serialization.cs +++ b/Rant.Tests/Compiler/Serialization.cs @@ -10,11 +10,34 @@ public class Serialization { private readonly RantEngine rant = new RantEngine(); + private const string BigPattern1 = @"{ + [$[x]:[x:__gender;locked]] + [chan:first-name;public;[$x]{|}]\s + [chan:middle-name;public;[$x]{|}]\s + [chan:last-name;public;{(30)|-}] + [chan:age;private; + { + (0.1)[n:1;9]| + [n:10;12]| + (4)[n:13;17]| + (8)[n:18;20]| + (15)[n:20;30]| + (3)[n:40;60]| + (1.5)[n:60;80]| + (0.5)[n:80;100] + } + ] + [chan:gender;private;[$x]{male|female}] + [chan:occupation;private;] +}"; + [TestCase(@"")] [TestCase(@"Test")] [TestCase(@"\100,c")] [TestCase(@"\100,c \100,d")] [TestCase(@"{Test}")] + [TestCase(@"{TestA|TestB}")] + [TestCase(@"{[$[x]:[x:__gender;locked]][chan:name;public;]}")] [TestCase(@"{A|B|C}")] [TestCase(@"[r:10]{A|B|C}")] [TestCase(@"[r:[n:5;10]]{A|B|C}")] @@ -27,6 +50,7 @@ public class Serialization [TestCase(@"[$[concat:a;b]:[arg:a][arg:b]][$concat:Hello\s;World!]")] [TestCase(@"[$[runx2:@a]:[arg:a] [arg:a]][$runx2:[x:_;forward][xpin:_][after:[xstep:_]]{Hello|World!}]")] [TestCase(@"")] + [TestCase(BigPattern1)] public void SerializeAndExecute(string pattern) { var ms = new MemoryStream(); diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index c9274b6..5fd233b 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -25,8 +25,10 @@ using System; using System.Collections.Generic; +using System.Text; using Rant.Core.Compiler.Syntax; +using Rant.Core.Utilities; namespace Rant.Core.Compiler.Parsing { @@ -63,12 +65,14 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext compiler.SetNextActionCallback(cb); compiler.AddContext(CompileContext.BlockWeight); yield return Get(); - + // Constant - if (sequence.Count == 1 && sequence[0] is RstText txtNode) + if (sequence.TrueForAll(rst => rst is RstText)) { - string txt = txtNode.Text; - if (!double.TryParse(txt, out double doubleValue)) + var sb = new StringBuilder(); + foreach (var rst in sequence) sb.Append((rst as RstText).Text); + string txt = sb.ToString(); + if (!Util.ParseDouble(txt, out double doubleValue)) compiler.SyntaxError(reader.PrevLooseToken, false, "err-compiler-invalid-constweight"); else constantWeights.Add(new _(blockNumber, doubleValue)); diff --git a/Rant/Core/Compiler/Syntax/RstBlock.cs b/Rant/Core/Compiler/Syntax/RstBlock.cs index c2fbc2e..4c57e04 100644 --- a/Rant/Core/Compiler/Syntax/RstBlock.cs +++ b/Rant/Core/Compiler/Syntax/RstBlock.cs @@ -23,11 +23,13 @@ #endregion +using System; using System.Collections.Generic; using System.Linq; using Rant.Core.Constructs; using Rant.Core.IO; +using Rant.Core.Utilities; using static Rant.Localization.Txtres; @@ -91,6 +93,7 @@ public override IEnumerator Run(Sandbox sb) if (_weighted && attribs.Sync == null) { + if (_dynamicWeights != null) foreach (var dw in _dynamicWeights) { sb.AddOutputWriter(); @@ -100,7 +103,7 @@ public override IEnumerator Run(Sandbox sb) { _weights[dw.Item1] = 0.0; } - else if (!double.TryParse(strWeight, out _weights[dw.Item1])) + else if (!Util.ParseDouble(strWeight, out _weights[dw.Item1])) { throw new RantRuntimeException(sb, dw.Item2.Location, GetString("err-runtime-invalid-dynamic-weight", strWeight)); @@ -172,7 +175,9 @@ public override IEnumerator Run(Sandbox sb) } } else + { yield return attribs.Separator; + } } sb.Blocks.Push(block); // Now put it back @@ -180,7 +185,7 @@ public override IEnumerator Run(Sandbox sb) if (attribs.Before != null) yield return attribs.Before; // Content - + // Redirect output if requested if (attribs.Redirect != null) { From cc2222d73c1f029f3697ec425391afcc0373cf95 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Tue, 4 Apr 2017 18:25:33 -0400 Subject: [PATCH 171/213] Add support for loading single package files in Rant Console. --- CmdLine.cs | 29 +++++++++++++++++++++-------- Rant.Console/Program.cs | 21 ++++++++++++++++++--- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/CmdLine.cs b/CmdLine.cs index 336a5b1..349cf44 100644 --- a/CmdLine.cs +++ b/CmdLine.cs @@ -6,7 +6,7 @@ namespace Rant.Common { internal static class CmdLine { - private static readonly Dictionary Arguments = new Dictionary(); + private static readonly Dictionary> Arguments = new Dictionary>(); private static readonly HashSet Flags = new HashSet(); private static readonly List Paths = new List(); @@ -33,7 +33,14 @@ static CmdLine() { if (isProperty) { - Arguments[args[i - 1].TrimStart('-')] = args[i]; + var name = args[i - 1].TrimStart('-'); + if (Arguments.ContainsKey(name)) + Arguments[name].Add(args[i]); + else + { + Arguments[name] = new List(); + Arguments[name].Add(args[i]); + } isProperty = false; } else if (args[i].StartsWith("--")) @@ -55,20 +62,26 @@ static CmdLine() public static string Property(string name) { - string arg; - if (!Arguments.TryGetValue(name.ToLower(), out arg)) + List args; + if (!Arguments.TryGetValue(name.ToLower(), out args)) { - arg = ""; + return ""; } - return arg; + return args.First(); } public static string Property(string name, string defaultValue) { - string arg; - return !Arguments.TryGetValue(name.ToLower(), out arg) ? defaultValue : arg; + List args; + return !Arguments.TryGetValue(name.ToLower(), out args) ? defaultValue : args.First(); } + public static IEnumerable Properties(string name) + { + List args; + return Arguments.TryGetValue(name.ToLower(), out args) ? args : new List(); + } + public static bool Flag(string name) => Flags.Contains(name); } } diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 3449df2..940743f 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -4,10 +4,10 @@ using System.IO; using System.Linq; using System.Text; +using System.Collections.Generic; using Rant; using Rant.Vocabulary; - using static System.Console; using static Rant.Common.CmdLine; @@ -24,6 +24,7 @@ internal class Program #endif public static readonly string FILE = GetPaths().FirstOrDefault(); public static readonly string PKG_DIR = Property("pkgdir"); + public static readonly IEnumerable PKG_FILES = Properties("pkg"); public static readonly string LEGACY_DIC_PATH = Property("ldict"); public static readonly long SEED; public static readonly bool USE_SEED; @@ -54,7 +55,21 @@ private static void Main(string[] args) rant.Dictionary = new RantDictionary(tables); } - if (!string.IsNullOrEmpty(PKG_DIR)) + if (PKG_FILES.Any()) + { +#if DEBUG + Stopwatch timer = Stopwatch.StartNew(); +#endif + foreach (var pkg in PKG_FILES) + { + rant.LoadPackage(pkg); + } +#if DEBUG + timer.Stop(); + WriteLine($"Package loading: {timer.ElapsedMilliseconds}ms"); +#endif + } + else if (!string.IsNullOrEmpty(PKG_DIR)) { #if DEBUG Stopwatch timer = Stopwatch.StartNew(); @@ -84,7 +99,7 @@ private static void Main(string[] args) } #endif if (Flag("nsfw")) rant.Dictionary.IncludeHiddenClass("nsfw"); - + if (!string.IsNullOrEmpty(FILE)) { #if !DEBUG From 43725812c6e72b5234dd9570a054e37a120ff846 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Tue, 4 Apr 2017 18:56:08 -0400 Subject: [PATCH 172/213] Add [at] function. --- Rant.Console/Program.cs | 11 ----------- Rant.Tests/StringOps.cs | 17 +++++++++++++++++ Rant/Core/Framework/RantFunctionRegistry.cs | 11 +++++++++++ Rant/Localization/de-DE.lang | 1 + Rant/Localization/en-US.lang | 1 + 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Rant.Console/Program.cs b/Rant.Console/Program.cs index 0a79719..07d903a 100644 --- a/Rant.Console/Program.cs +++ b/Rant.Console/Program.cs @@ -25,7 +25,6 @@ internal class Program public static readonly string FILE = GetPaths().FirstOrDefault(); public static readonly string PKG_DIR = Property("pkgdir"); public static readonly IEnumerable PKG_FILES = Properties("pkg"); - public static readonly string LEGACY_DIC_PATH = Property("ldict"); public static readonly long SEED; public static readonly bool USE_SEED; @@ -45,16 +44,6 @@ private static void Main(string[] args) try { #endif - if(!string.IsNullOrEmpty(LEGACY_DIC_PATH)) - { - var tables = - Directory - .GetFiles(LEGACY_DIC_PATH) - .Where(f => Path.GetExtension(f) == ".dic") - .Select(f => RantDictionaryTable.FromLegacyFile(f)); - rant.Dictionary = new RantDictionary(tables); - } - if (PKG_FILES.Any()) { #if DEBUG diff --git a/Rant.Tests/StringOps.cs b/Rant.Tests/StringOps.cs index f28b015..17189a2 100644 --- a/Rant.Tests/StringOps.cs +++ b/Rant.Tests/StringOps.cs @@ -23,5 +23,22 @@ public void ReverseEx(string original, string reverse) { Assert.AreEqual(reverse, rant.Do($"[revx:{original}]").Main); } + + [TestCase(@"abc", 2, "c")] + [TestCase(@"abc", 1, "b")] + [TestCase(@"abc", 0, "a")] + public void StringAt(string full, int pos, string result) + { + Assert.AreEqual(result, rant.Do($"[at:{full};{pos}]").Main); + } + + [TestCase] + public void StringAtException() + { + Assert.Throws(() => + { + rant.Do("[at:abc;-1]"); + }); + } } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 80708f8..3959d82 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1379,5 +1379,16 @@ private static IEnumerator IfNot(Sandbox sb, bool condition, RST body, RST yield return elseBody; } } + + [RantFunction("at")] + [RantDescription("Prints the character at the specified position in the input. Throws an exception if the position is outside of the string.")] + private static void At(Sandbox sb, + [RantDescription("The input string.")] string input, + [RantDescription("The position of the character to find.")] int pos) + { + if (pos < 0 || pos > input.Length) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-string-index", pos); + sb.Print(input.Substring(pos, 1)); + } } } \ No newline at end of file diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 2d33038..74119ef 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -73,6 +73,7 @@ err-runtime-missing-subroutine = "Das Unterprogramm '{0}' konnte nicht gefunden err-runtime-subarg-mismatch = "Die angegebenen Argumenten passen an die Signatur des Unterprogramms [${0}] nicht an." err-runtime-unknown-flag = "Unbekannter Schalter: '{0}'" err-runtime-unknown-mode = "Unbekannter Modus: '{0}'" +err-runtime-invalid-string-index = "Index in string ist nicht gültig: {0}" acc-carrier-name = "Anfragezustandspeichernamen" acc-table-name = "Tabellenamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index d4b6da6..adc3bc2 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -79,6 +79,7 @@ err-runtime-missing-subroutine = "The subroutine '{0}' could not be found." err-runtime-subarg-mismatch = "The provided arguments do not match the signature of the subroutine [${0}]." err-runtime-unknown-flag = "Unknown flag name: '{0}'" err-runtime-unknown-mode = "Unknown mode name: '{0}'" +err-runtime-invalid-string-index = "Index in string is not valid: {0}" acc-carrier-name = "carrier name" acc-table-name = "table name" From ebde4ab6abc06eda5bd50fdbb24421e1431a1a17 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Tue, 4 Apr 2017 21:07:19 -0400 Subject: [PATCH 173/213] Subroutine overloading. --- Rant.Tests/StringOps.cs | 8 +++--- Rant.Tests/Subroutines.cs | 6 +++++ .../Core/Compiler/Syntax/RstCallSubroutine.cs | 9 +++++-- .../Compiler/Syntax/RstDefineSubroutine.cs | 27 ++++++++++++++----- Rant/Core/ObjectModel/ObjectStack.cs | 7 +++++ 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Rant.Tests/StringOps.cs b/Rant.Tests/StringOps.cs index 17189a2..648a13f 100644 --- a/Rant.Tests/StringOps.cs +++ b/Rant.Tests/StringOps.cs @@ -32,13 +32,11 @@ public void StringAt(string full, int pos, string result) Assert.AreEqual(result, rant.Do($"[at:{full};{pos}]").Main); } - [TestCase] + [Test] + [ExpectedException(typeof(RantRuntimeException))] public void StringAtException() { - Assert.Throws(() => - { - rant.Do("[at:abc;-1]"); - }); + rant.Do("[at:abc;-1]"); } } } \ No newline at end of file diff --git a/Rant.Tests/Subroutines.cs b/Rant.Tests/Subroutines.cs index a901e7c..ec1fae3 100644 --- a/Rant.Tests/Subroutines.cs +++ b/Rant.Tests/Subroutines.cs @@ -65,5 +65,11 @@ public void StackOverflow() { new RantEngine().Do(@"[$[_]:[$_]][$_]"); } + + [Test] + public void Overloading() + { + Assert.AreEqual("12", new RantEngine().Do(@"[$[test:a;b]:1][$[test:a]:2][$test:1;2][$test:0]").Main); + } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs index cb376a8..3998a1d 100644 --- a/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstCallSubroutine.cs @@ -27,6 +27,7 @@ using System.Linq; using Rant.Core.IO; +using Rant.Core.ObjectModel; namespace Rant.Core.Compiler.Syntax { @@ -55,8 +56,12 @@ public override IEnumerator Run(Sandbox sb) { if (sb.Objects[Name] == null) throw new RantRuntimeException(sb, this, "err-runtime-missing-subroutine", Name); - var sub = (RstDefineSubroutine)(sb.Objects[Name].Value); - if (sub.Parameters.Keys.Count != Arguments.Count) + var subs = (List)(sb.Objects[Name].Value); + var sub = subs + .Where(s => (s.Value as RstDefineSubroutine).Parameters.Count == Arguments.Count) + .Select(s => s.Value as RstDefineSubroutine) + .FirstOrDefault(); + if (sub == default(RstDefineSubroutine)) throw new RantRuntimeException(sb, this, "err-runtime-subarg-mismatch", Name); var action = sub.Body; var args = new Dictionary(); diff --git a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs index 457c003..bf10488 100644 --- a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs @@ -24,6 +24,7 @@ #endregion using System.Collections.Generic; +using System.Linq; using Rant.Core.IO; using Rant.Core.ObjectModel; @@ -37,12 +38,26 @@ internal class RstDefineSubroutine : RstSubroutineBase public RstDefineSubroutine(LineCol location) : base(location) { - // Used by serializer - } - - public override IEnumerator Run(Sandbox sb) + // Used by serializer + } + + public override IEnumerator Run(Sandbox sb) { - sb.Objects[Name] = new RantObject(this); + if(sb.Objects.ContainsKey(Name)) + { + var subroutines = sb.Objects[Name].Value as List; + if(subroutines.Any(s => (s.Value as RstDefineSubroutine).Parameters.Count == Parameters.Count)) + { + subroutines.RemoveAll(s => (s.Value as RstDefineSubroutine).Parameters.Count == Parameters.Count); + } + subroutines.Add(new RantObject(this)); + } + else + { + var list = new List(); + list.Add(new RantObject(this)); + sb.Objects[Name] = new RantObject(list); + } yield break; } @@ -70,7 +85,7 @@ protected override IEnumerator Deserialize(EasyReader input) Parameters[key] = (SubroutineParameterType)input.ReadByte(); } } - } + } internal enum SubroutineParameterType : byte { diff --git a/Rant/Core/ObjectModel/ObjectStack.cs b/Rant/Core/ObjectModel/ObjectStack.cs index ad70e12..350e9fb 100644 --- a/Rant/Core/ObjectModel/ObjectStack.cs +++ b/Rant/Core/ObjectModel/ObjectStack.cs @@ -81,6 +81,13 @@ public RantObject this[string name] public Dictionary CurrentLocals { get; } = new Dictionary(); + public bool ContainsKey(string key) + { + if (!Util.ValidateName(key)) return false; + if (_table.Globals.ContainsKey(key)) return true; + return CurrentLocals.ContainsKey(key); + } + public void EnterScope() { if (++_level >= _scopes.Count) From e21902f62fba9ffa13224a2fc565bcc63a4bd7e1 Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Tue, 4 Apr 2017 21:08:58 -0400 Subject: [PATCH 174/213] Fix indentation. --- .../Compiler/Syntax/RstDefineSubroutine.cs | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs index bf10488..631d8d6 100644 --- a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs @@ -31,22 +31,22 @@ namespace Rant.Core.Compiler.Syntax { - [RST("dsub")] - internal class RstDefineSubroutine : RstSubroutineBase - { - public Dictionary Parameters; + [RST("dsub")] + internal class RstDefineSubroutine : RstSubroutineBase + { + public Dictionary Parameters; - public RstDefineSubroutine(LineCol location) : base(location) - { + public RstDefineSubroutine(LineCol location) : base(location) + { // Used by serializer } - + public override IEnumerator Run(Sandbox sb) - { - if(sb.Objects.ContainsKey(Name)) + { + if (sb.Objects.ContainsKey(Name)) { var subroutines = sb.Objects[Name].Value as List; - if(subroutines.Any(s => (s.Value as RstDefineSubroutine).Parameters.Count == Parameters.Count)) + if (subroutines.Any(s => (s.Value as RstDefineSubroutine).Parameters.Count == Parameters.Count)) { subroutines.RemoveAll(s => (s.Value as RstDefineSubroutine).Parameters.Count == Parameters.Count); } @@ -58,38 +58,38 @@ public override IEnumerator Run(Sandbox sb) list.Add(new RantObject(this)); sb.Objects[Name] = new RantObject(list); } - yield break; - } + yield break; + } - protected override IEnumerator Serialize(EasyWriter output) - { - var iterMain = base.Serialize(output); - while (iterMain.MoveNext()) yield return iterMain.Current; - output.Write(Parameters.Count); - foreach (var kv in Parameters) - { - output.Write(kv.Key); - output.Write((byte)kv.Value); - } - } + protected override IEnumerator Serialize(EasyWriter output) + { + var iterMain = base.Serialize(output); + while (iterMain.MoveNext()) yield return iterMain.Current; + output.Write(Parameters.Count); + foreach (var kv in Parameters) + { + output.Write(kv.Key); + output.Write((byte)kv.Value); + } + } - protected override IEnumerator Deserialize(EasyReader input) - { - var iterMain = base.Deserialize(input); - while (iterMain.MoveNext()) yield return iterMain.Current; - int pCount = input.ReadInt32(); - if (Parameters == null) Parameters = new Dictionary(pCount); - for (int i = 0; i < pCount; i++) - { - string key = input.ReadString(); - Parameters[key] = (SubroutineParameterType)input.ReadByte(); - } - } + protected override IEnumerator Deserialize(EasyReader input) + { + var iterMain = base.Deserialize(input); + while (iterMain.MoveNext()) yield return iterMain.Current; + int pCount = input.ReadInt32(); + if (Parameters == null) Parameters = new Dictionary(pCount); + for (int i = 0; i < pCount; i++) + { + string key = input.ReadString(); + Parameters[key] = (SubroutineParameterType)input.ReadByte(); + } + } } - internal enum SubroutineParameterType : byte - { - Loose, - Greedy - } + internal enum SubroutineParameterType : byte + { + Loose, + Greedy + } } \ No newline at end of file From 082b1c130c1150389f284ad5788f6ed079745437 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 4 Apr 2017 20:57:10 -0500 Subject: [PATCH 175/213] Localize missing pattern message; add credits --- CREDITS.md | 19 +++++++++++++++++++ Rant/Localization/de-DE.lang | 3 ++- Rant/Localization/en-US.lang | 1 + Rant/RantEngine.cs | 7 ++++--- 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 CREDITS.md diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000..3a323b7 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,19 @@ +# Credits + +These people have all supported the development of this project at some point; +be it financially, by offering skills/knowledge, or some other way. +Thank you. + +## Contributors + +- Andrew Rogers ([@cpancake](https://github.com/cpancake)) +- Santeri Kasvi ([@Spanfile](https://github.com/Spanfile)) + +## Patreon Supporters ($5 or more) + +- [Pål Trefall](https://www.patreon.com/user/creators?u=4929142) ([@ptrefall](https://github.com/ptrefall)) +- [Key Wraith](https://www.patreon.com/user/creators?u=4336045) + +## Special Thanks + +- [@voraciousviolet](https://github.com/voraciousviolet) - _Offered valuable ideas and support in the early stages of the project, as well as for its predecessor, the "Moist Banana" story generator._ \ No newline at end of file diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 74119ef..2381e49 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -32,6 +32,7 @@ err-bad-term-count = "Begriffsanzahl pro Eintrag muss mehr als Null sein." err-bad-pattern-name = "Ungültiger Vorlagename: {0}" err-internal-error = "Ein interner Fehler ist aufgetreten. Diese Fehler werden meistens von einem Bug in Rant verursacht." err-internal-error-msg = "Ein interner Fehler ist aufgetreten. Diese Fehler werden meistens von einem Bug in Rant verursacht. Fehlermeldung: {0}" +err-missing-pattern = "Die Vorlage '{0}' existiert nicht." err-pattern-timeout = "Der Ausführungszeitraum ist abgelaufen ({0} Sekunden)." err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten." @@ -73,7 +74,7 @@ err-runtime-missing-subroutine = "Das Unterprogramm '{0}' konnte nicht gefunden err-runtime-subarg-mismatch = "Die angegebenen Argumenten passen an die Signatur des Unterprogramms [${0}] nicht an." err-runtime-unknown-flag = "Unbekannter Schalter: '{0}'" err-runtime-unknown-mode = "Unbekannter Modus: '{0}'" -err-runtime-invalid-string-index = "Index in string ist nicht gültig: {0}" +err-runtime-invalid-string-index = "Der angegebene Index '{0}' liegt außerhalb der Zeichenkette." acc-carrier-name = "Anfragezustandspeichernamen" acc-table-name = "Tabellenamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index adc3bc2..eab0287 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -32,6 +32,7 @@ err-bad-term-count = "Terms per entry must be greater than zero." err-bad-pattern-name = "Invalid pattern name: {0}" err-internal-error = "An internal error has occurred. This is often caused by a bug in Rant." err-internal-error-msg = "An internal error has occurred. This is often caused by a bug in Rant.\nMessage: {0}" +err-missing-pattern = "The pattern '{0}' does not exist." err-pattern-timeout = "The pattern execution timed out ({0} seconds)." err-stack-overflow = "Exceeded the maximum stack size." diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 61b84e2..19e0ba6 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -33,6 +33,7 @@ using Rant.Core.ObjectModel; using Rant.Core.Utilities; using Rant.Formats; +using Rant.Localization; using Rant.Resources; using Rant.Vocabulary; using Rant.Vocabulary.Querying; @@ -507,7 +508,7 @@ public IEnumerable DoSerial(string input, RNG rng, int charLimit = 0 public RantOutput DoName(string patternName, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) { if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); + throw new ArgumentException(GetString("err-missing-pattern", patternName)); return RunVM( @@ -531,7 +532,7 @@ public RantOutput DoName(string patternName, long seed, int charLimit = 0, doubl RantProgramArgs args = null) { if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); + throw new ArgumentException(GetString("err-missing-pattern", patternName)); return RunVM(new Sandbox(this, _patternCache[patternName], new RNG(seed), charLimit, GetPreservedCarrierState(), args), @@ -555,7 +556,7 @@ public RantOutput DoName(string patternName, RNG rng, int charLimit = 0, double RantProgramArgs args = null) { if (!ProgramNameLoaded(patternName)) - throw new ArgumentException("Pattern doesn't exist."); + throw new ArgumentException(GetString("err-missing-pattern", patternName)); return RunVM(new Sandbox(this, _patternCache[patternName], rng, charLimit, GetPreservedCarrierState(), args), timeout); } From 96c3bfefc444481e0973f3266c907c5c853678bb Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 4 Apr 2017 21:22:22 -0500 Subject: [PATCH 176/213] Update CREDITS.md --- CREDITS.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 3a323b7..3a60314 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,19 +1,21 @@ -# Credits - These people have all supported the development of this project at some point; be it financially, by offering skills/knowledge, or some other way. Thank you. ## Contributors +### Programmers - Andrew Rogers ([@cpancake](https://github.com/cpancake)) - Santeri Kasvi ([@Spanfile](https://github.com/Spanfile)) -## Patreon Supporters ($5 or more) +### Localization +- Tamme Schichler ([@Tamschi](https://github.com/Tamschi)) + +## Patreon Supporters ($5 or more pledged) - [Pål Trefall](https://www.patreon.com/user/creators?u=4929142) ([@ptrefall](https://github.com/ptrefall)) - [Key Wraith](https://www.patreon.com/user/creators?u=4336045) ## Special Thanks -- [@voraciousviolet](https://github.com/voraciousviolet) - _Offered valuable ideas and support in the early stages of the project, as well as for its predecessor, the "Moist Banana" story generator._ \ No newline at end of file +- [@voraciousviolet](https://github.com/voraciousviolet) - _Offered valuable ideas and support in the early stages of the project, as well as for its predecessor, the "Moist Banana" story generator._ From 53bbaaec4864e88f55a2762ac7b01a99aab93d33 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Tue, 4 Apr 2017 21:25:24 -0500 Subject: [PATCH 177/213] Update CREDITS.md --- CREDITS.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index 3a60314..4d0b366 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -11,7 +11,11 @@ Thank you. ### Localization - Tamme Schichler ([@Tamschi](https://github.com/Tamschi)) -## Patreon Supporters ($5 or more pledged) +## Financial Support + +- [Michael Nielsen](https://twitter.com/Nosteme) + +### Patreon ($5 or more pledged) - [Pål Trefall](https://www.patreon.com/user/creators?u=4929142) ([@ptrefall](https://github.com/ptrefall)) - [Key Wraith](https://www.patreon.com/user/creators?u=4336045) From 598b49f6c7fe164a33c87282ec542cea7aab1f9a Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Wed, 5 Apr 2017 19:37:46 -0500 Subject: [PATCH 178/213] Slightly optimize loading of large tables --- Rant/Core/IO/Bson/BsonItem.cs | 16 ++++++++++------ Rant/Core/IO/EasyReader.cs | 10 +++++----- Rant/Resources/RantPackage.cs | 4 ++-- Rant/Vocabulary/RantDictionaryEntry.cs | 17 +++++++++-------- Rant/Vocabulary/RantDictionaryTable.cs | 22 ++++++++++++---------- 5 files changed, 38 insertions(+), 31 deletions(-) diff --git a/Rant/Core/IO/Bson/BsonItem.cs b/Rant/Core/IO/Bson/BsonItem.cs index 4576877..584cd7e 100644 --- a/Rant/Core/IO/Bson/BsonItem.cs +++ b/Rant/Core/IO/Bson/BsonItem.cs @@ -26,6 +26,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using System.Linq; namespace Rant.Core.IO.Bson @@ -124,9 +125,7 @@ public BsonItem this[string key] { get { - if (!HasKey(key)) - return null; - return _objectValues[key]; + return !HasKey(key) ? null : _objectValues[key]; } set { _objectValues[key] = value; } } @@ -138,8 +137,8 @@ public BsonItem this[string key] /// The value of the specified key. public BsonItem this[int key] { - get { return _objectValues[key.ToString()]; } - set { _objectValues[key.ToString()] = value; } + get { return _objectValues[key.ToString(CultureInfo.InvariantCulture)]; } + set { _objectValues[key.ToString(CultureInfo.InvariantCulture)] = value; } } /// @@ -171,7 +170,12 @@ public static implicit operator string(BsonItem a) public static explicit operator string[](BsonItem a) { - return a?.Values?.Select(i => (string)i).ToArray() ?? new string[] { }; + var values = a?.Values; + if (values == null) return new string[0]; + var arr = new string[a.Count]; + int i = 0; + foreach (var v in values) arr[i++] = v; + return arr; } /// diff --git a/Rant/Core/IO/EasyReader.cs b/Rant/Core/IO/EasyReader.cs index 5d4f4c5..47e0ebd 100644 --- a/Rant/Core/IO/EasyReader.cs +++ b/Rant/Core/IO/EasyReader.cs @@ -37,6 +37,7 @@ namespace Rant.Core.IO internal class EasyReader : IDisposable { private readonly byte[] _buffer = new byte[128]; + private readonly StringBuilder _strBuffer = new StringBuilder(128); private readonly bool _leaveOpen; /// @@ -501,11 +502,10 @@ public EasyReader ReadString(Encoding encoding, out string value) /// The string that was read. public string ReadCString() { - var bytes = new List(); - byte c; - while ((c = ReadByte()) != 0x00) - bytes.Add(c); - return Encoding.UTF8.GetString(bytes.ToArray()); + _strBuffer.Length = 0; + int b; + while ((b = BaseStream.ReadByte()) != 0) _strBuffer.Append((char)b); + return _strBuffer.ToString(); } /// diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 72b4525..7aa3a8c 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -28,6 +28,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading; using Rant.Core.IO; using Rant.Core.IO.Bson; @@ -346,8 +347,7 @@ public static RantPackage Load(Stream source) }); } } - - + package._resources.AddRange(doc["resources"].Values.Select(RantResource.DeserializeResource).Where(res => res != null)); return package; diff --git a/Rant/Vocabulary/RantDictionaryEntry.cs b/Rant/Vocabulary/RantDictionaryEntry.cs index ef5dc23..1ae9654 100644 --- a/Rant/Vocabulary/RantDictionaryEntry.cs +++ b/Rant/Vocabulary/RantDictionaryEntry.cs @@ -36,7 +36,7 @@ public sealed class RantDictionaryEntry { private const int INITIAL_METADATA_CAPACITY = 4; private readonly HashSet _classes; - private readonly HashSet _optionalClasses; + private HashSet _optionalClasses; private readonly RantDictionaryTerm[] _terms; private Dictionary _metadata; @@ -51,7 +51,7 @@ public RantDictionaryEntry(RantDictionaryTerm[] terms) if (_terms.Length == 0) throw new ArgumentException("Term list is empty."); TermCount = _terms.Length; _classes = new HashSet(); - _optionalClasses = new HashSet(); + _optionalClasses = null; } /// @@ -74,17 +74,17 @@ public RantDictionaryEntry(string[] terms, IEnumerable classes, float we public RantDictionaryEntry(IEnumerable terms, IEnumerable classes, float weight = 1.0f) { if (terms == null) throw new ArgumentNullException(nameof(terms)); - _terms = terms.ToArray(); + _terms = (terms as RantDictionaryTerm[]) ?? terms.ToArray(); if (_terms.Length == 0) throw new ArgumentException("Term list is empty."); TermCount = _terms.Length; _classes = new HashSet(); - _optionalClasses = new HashSet(); + _optionalClasses = null; foreach (string c in classes) { if (c.EndsWith("?")) { string trimmed = string.Intern(c.Substring(0, c.Length - 1)); - _optionalClasses.Add(trimmed); + (_optionalClasses ?? (_optionalClasses = new HashSet())).Add(trimmed); _classes.Add(trimmed); } else @@ -151,6 +151,7 @@ public IEnumerable GetClasses() /// public IEnumerable GetOptionalClasses() { + if (_optionalClasses == null) yield break; foreach (string className in _optionalClasses) yield return className; } @@ -167,7 +168,7 @@ public void AddClass(string className, bool optional = false) className = string.Intern(className.Trim().TrimEnd('?')); } _classes.Add(className); - if (optional) _optionalClasses.Add(className); + if (optional) (_optionalClasses ?? (_optionalClasses = new HashSet())).Add(className); } /// @@ -177,7 +178,7 @@ public void AddClass(string className, bool optional = false) public void RemoveClass(string className) { _classes.Remove(className); - _optionalClasses.Remove(className); + _optionalClasses?.Remove(className); } /// @@ -245,7 +246,7 @@ public bool ContainsMetadataKey(string key) /// Returns a collection of required (non-optional) classes assigned to the current entry. /// /// - public IEnumerable GetRequiredClasses() => _classes.Except(_optionalClasses); + public IEnumerable GetRequiredClasses() => _optionalClasses == null ? _classes : _classes.Except(_optionalClasses); /// /// Returns a string representation of the current instance. diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index f516cfc..23b6596 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -354,19 +354,21 @@ internal override void DeserializeData(BsonItem data) { var entryData = entries[i]; - // Terms - var terms = - from BsonItem termData in entryData["terms"].Values - let value = (string)termData["value"] - let pron = (string)termData["pron"] - let valueSplit = (int)(termData["value-split"] ?? -1) - let pronSplit = (int)(termData["pron-split"] ?? -1) - select new RantDictionaryTerm(value, pron, valueSplit, pronSplit); + var termsObject = entryData["terms"]; + + var termArray = new RantDictionaryTerm[termsObject.Count]; + int j = 0; + foreach (var termData in termsObject.Values) + { + var value = (string)termData["value"]; + var pron = (string)termData["pron"]; + var valueSplit = (int)(termData["value-split"] ?? -1); + var pronSplit = (int)(termData["pron-split"] ?? -1); + termArray[j++] = new RantDictionaryTerm(value, pron, valueSplit, pronSplit); + } var entryClasses = (string[])entryData["classes"]; - var termArray = terms.ToArray(); var entry = new RantDictionaryEntry(termArray, entryClasses, entryData["weight"] ?? 1); - // Optional classes foreach (var optionalClass in entryData["optional-classes"].Values) entry.AddClass(optionalClass, true); From be1ed727008bcbb696241af3a10909f4892f68ef Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Thu, 6 Apr 2017 16:24:40 -0400 Subject: [PATCH 179/213] Whitespace test. --- Rant.Tests/BasicInput.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Rant.Tests/BasicInput.cs b/Rant.Tests/BasicInput.cs index 2e6be06..ede85dc 100644 --- a/Rant.Tests/BasicInput.cs +++ b/Rant.Tests/BasicInput.cs @@ -118,5 +118,12 @@ public void SurrogatePairs() Assert.AreEqual("\U0001F602\U0001F4AF", rant.Do(@"\U0001F602\U0001F4AF").Main); } + + [Test] + public void CommentWhitespace() + { + Assert.AreEqual("c", rant.Do(@"{(0)a|#b + c}").Main); + } } } From d55f6bc4ed793c0955ef9749bb03c7855b84aa69 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Thu, 6 Apr 2017 15:45:35 -0500 Subject: [PATCH 180/213] Fix blackspace not being skipped in some cases --- Rant.Tests/BasicInput.cs | 19 +++++++++++++++---- Rant/Core/Compiler/Parsing/BlockParser.cs | 20 ++++++++------------ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/Rant.Tests/BasicInput.cs b/Rant.Tests/BasicInput.cs index ede85dc..9b3cc9c 100644 --- a/Rant.Tests/BasicInput.cs +++ b/Rant.Tests/BasicInput.cs @@ -24,7 +24,19 @@ public void Blackspace() Assert.AreEqual("ABCD", rant.Do("A\n B\nC \n D ").Main); } - [Test] + [Test] + public void BlackspaceInBlock() + { + Assert.AreEqual("A", rant.Do("{ A | (0) B}").Main); + } + + [Test] + public void BlackspaceInBlockEnd() + { + Assert.AreEqual("B", rant.Do("{ (0) A | B }").Main); + } + + [Test] public void Comments() { Assert.AreEqual("Hello world", rant.Do("#This is a comment.\nHello world # This is another comment.").Main); @@ -120,10 +132,9 @@ public void SurrogatePairs() } [Test] - public void CommentWhitespace() + public void BlackspaceAfterComment() { - Assert.AreEqual("c", rant.Do(@"{(0)a|#b - c}").Main); + Assert.AreEqual("c", rant.Do("{\n\t(0) a | # b\n\tc\n}").Main); } } } diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 5fd233b..24f1685 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -45,7 +45,7 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext List<_> constantWeights = null; List<_> dynamicWeights = null; int blockNumber = 0; - Action itemCallback = action => actions.Add(action); + void itemCallback(RST action) => actions.Add(action); compiler.AddContext(CompileContext.BlockEndSequence); compiler.AddContext(CompileContext.BlockSequence); @@ -60,9 +60,10 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext var firstToken = reader.ReadLooseToken(); - List sequence = new List(); - Action cb = rst => sequence.Add(rst); - compiler.SetNextActionCallback(cb); + var sequence = new List(); + void weightCallback(RST rst) => sequence.Add(rst); + + compiler.SetNextActionCallback(weightCallback); compiler.AddContext(CompileContext.BlockWeight); yield return Get(); @@ -87,19 +88,14 @@ public override IEnumerator Parse(RantCompiler compiler, CompileContext } } + reader.SkipSpace(); + compiler.SetNextActionCallback(itemCallback); var startToken = reader.PeekToken(); yield return Get(); // Don't wrap single nodes in a sequence, it's unnecessary - if (actions.Count == 1) - { - items.Add(actions[0]); - } - else - { - items.Add(new RstSequence(actions, startToken.ToLocation())); - } + items.Add(actions.Count == 1 ? actions[0] : new RstSequence(actions, startToken.ToLocation())); actions.Clear(); blockNumber++; } From 62d9c0bf63bccf7678573703cc4331df46a87cab Mon Sep 17 00:00:00 2001 From: Andrew Rogers Date: Thu, 6 Apr 2017 17:39:12 -0400 Subject: [PATCH 181/213] String array for table lookup instead of dict. --- Rant/Core/IO/Bson/BsonDocument.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs index bc0b2f4..4d95122 100644 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ b/Rant/Core/IO/Bson/BsonDocument.cs @@ -56,7 +56,7 @@ internal class BsonDocument /// public BsonDocument( BsonStringTableMode mode = BsonStringTableMode.None, - Dictionary reverseStringTable = null) + string[] reverseStringTable = null) { StringTableMode = mode; _stringTable = new Dictionary(); @@ -76,7 +76,8 @@ public BsonItem this[string key] } public BsonStringTableMode StringTableMode { get; } = BsonStringTableMode.None; - public Dictionary ReverseStringTable { get; } + + public string[] ReverseStringTable { get; } /// /// Returns this document encoded in BSON as a byte array. @@ -269,22 +270,24 @@ public static BsonDocument Read(Stream data) internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) { var stringTableMode = BsonStringTableMode.None; - Dictionary stringTable = null; + string[] stringTable = null; if (parent == null) { bool includesStringTable = reader.ReadBoolean(); if (includesStringTable) { - stringTable = new Dictionary(); stringTableMode = (BsonStringTableMode)reader.ReadByte(); byte version = reader.ReadByte(); if (version != STRING_TABLE_VERSION) throw new InvalidDataException("Unsupported string table version: " + version); int tableLength = reader.ReadInt32(); int tableEntries = reader.ReadInt32(); + stringTable = new string[tableEntries]; for (int i = 0; i < tableEntries; i++) { int num = reader.ReadInt32(); + if (num > tableEntries) + throw new InvalidDataException("Non-sequential string IDs currently not supported."); string val = reader.ReadString(Encoding.UTF8); stringTable[num] = val; } @@ -295,6 +298,7 @@ internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, stringTable = parent.ReverseStringTable; stringTableMode = parent.StringTableMode; } + var document = new BsonDocument(stringTableMode, stringTable); int length = reader.ReadInt32(); From 25d2a74686a2ce104c1e3ce9f7949774e0762328 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck Date: Fri, 7 Apr 2017 13:50:32 -0500 Subject: [PATCH 182/213] Add samples, optimize table loading a bit --- Rant/Core/IO/Bson/BsonDocument.cs | 42 ++++---- Rant/Vocabulary/ClassCache.cs | 140 +++++++++++++++---------- Rant/Vocabulary/RantDictionaryTable.cs | 2 - Samples/person.rant | 21 ++++ Samples/santa.rant | 75 +++++++++++++ 5 files changed, 202 insertions(+), 78 deletions(-) create mode 100644 Samples/person.rant create mode 100644 Samples/santa.rant diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs index 4d95122..5c7e27d 100644 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ b/Rant/Core/IO/Bson/BsonDocument.cs @@ -49,27 +49,27 @@ internal class BsonDocument /// The top item of this BSON document. /// public BsonItem Top; + + /// + /// Creates an empty BSON document. + /// Whether or not to generate and use a string table. + /// + public BsonDocument( + BsonStringTableMode mode = BsonStringTableMode.None, + string[] reverseStringTable = null, Dictionary stringTable = null) + { + StringTableMode = mode; + _stringTable = stringTable ?? new Dictionary(); + ReverseStringTable = reverseStringTable; + Top = new BsonItem(); + } - /// - /// Creates an empty BSON document. - /// Whether or not to generate and use a string table. - /// - public BsonDocument( - BsonStringTableMode mode = BsonStringTableMode.None, - string[] reverseStringTable = null) - { - StringTableMode = mode; - _stringTable = new Dictionary(); - ReverseStringTable = reverseStringTable; - Top = new BsonItem(); - } - - /// - /// Retreives the value of the given key if it exists. - /// - /// The key to retrieve. - /// The value of the given key, or null if it does not exist. - public BsonItem this[string key] + /// + /// Retreives the value of the given key if it exists. + /// + /// The key to retrieve. + /// The value of the given key, or null if it does not exist. + public BsonItem this[string key] { get { return Top.HasKey(key) ? Top[key] : null; } set { Top[key] = value; } @@ -299,7 +299,7 @@ internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, stringTableMode = parent.StringTableMode; } - var document = new BsonDocument(stringTableMode, stringTable); + var document = new BsonDocument(stringTableMode, stringTable, parent?._stringTable); int length = reader.ReadInt32(); while (!reader.EndOfStream) diff --git a/Rant/Vocabulary/ClassCache.cs b/Rant/Vocabulary/ClassCache.cs index caac114..e30a44b 100644 --- a/Rant/Vocabulary/ClassCache.cs +++ b/Rant/Vocabulary/ClassCache.cs @@ -31,75 +31,105 @@ namespace Rant.Vocabulary { internal sealed class ClassCache { - private readonly Dictionary> _cache = new Dictionary>(); + private static readonly Stack> _recycle = new Stack>(24); + private readonly Dictionary> _cache = new Dictionary>(); private readonly Dictionary> _invCache = new Dictionary>(); + private readonly HashSet _allClasses = new HashSet(); + + private readonly object syncObject = new object(); + + private void ClearAll() + { + foreach (var pair in _cache) + { + pair.Value.Clear(); + _recycle.Push(pair.Value); + } + + foreach (var pair in _invCache) + { + pair.Value.Clear(); + _recycle.Push(pair.Value); + } + + _allClasses.Clear(); + } + + private static HashSet Reclaim() + { + return _recycle.Count == 0 ? new HashSet() : _recycle.Pop(); + } public void BuildCache(RantDictionaryTable table) { - _cache.Clear(); - _invCache.Clear(); - var clSet = new HashSet(); + lock (syncObject) + { + ClearAll(); - foreach (var entry in table.GetEntries()) - { - foreach (var cl in entry.GetClasses()) - { - HashSet set; - clSet.Add(cl); - if (!_cache.TryGetValue(cl, out set)) - { - set = _cache[cl] = new HashSet(); - } - set.Add(entry); - } - } + foreach (var entry in table.GetEntries()) + { + foreach (var cl in entry.GetClasses()) + { + HashSet set; + _allClasses.Add(cl); + if (!_cache.TryGetValue(cl, out set)) + { + set = _cache[cl] = Reclaim(); + } + set.Add(entry); + } + } - foreach (var cl in clSet) - { - if (!_invCache.TryGetValue(cl, out HashSet set)) - { - set = _invCache[cl] = new HashSet(); - } - foreach (var entry in table.GetEntries()) - { - if (!entry.ContainsClass(cl)) set.Add(entry); - } - } + foreach (var cl in _allClasses) + { + if (!_invCache.TryGetValue(cl, out HashSet set)) + { + set = _invCache[cl] = Reclaim(); + } + foreach (var entry in table.GetEntries()) + { + if (!entry.ContainsClass(cl)) set.Add(entry); + } + } + } } public IEnumerable Filter(IEnumerable rules, RantDictionary dictionary, RantDictionaryTable table) { - var r = rules.ToArray(); - if (r.Length == 0) return table.GetEntries(); - HashSet setCached; - var set = new HashSet(); - var hide = table.HiddenClasses - // Exclude overridden hidden classes - .Except(dictionary.IncludedHiddenClasses) - // Exclude hidden classes filtered for - .Where(cl => !r.Any(rule => rule.ShouldMatch && String.Equals(rule.Class, cl, StringComparison.InvariantCultureIgnoreCase))).ToArray(); + lock (syncObject) + { + var r = rules.ToArray(); + if (r.Length == 0) return table.GetEntries(); + HashSet setCached; + var set = new HashSet(); + var hide = table.HiddenClasses + // Exclude overridden hidden classes + .Except(dictionary.IncludedHiddenClasses) + // Exclude hidden classes filtered for + .Where(cl => !r.Any(rule => rule.ShouldMatch && String.Equals(rule.Class, cl, StringComparison.InvariantCultureIgnoreCase))).ToArray(); - // Get initial pool - if (r[0].ShouldMatch) - { - if (!_cache.TryGetValue(r[0].Class, out setCached)) return null; - } - else - { - if (!_invCache.TryGetValue(r[0].Class, out setCached)) setCached = table.EntriesHash; - } + // Get initial pool + if (r[0].ShouldMatch) + { + if (!_cache.TryGetValue(r[0].Class, out setCached)) return null; + } + else + { + if (!_invCache.TryGetValue(r[0].Class, out setCached)) setCached = table.EntriesHash; + } - foreach (var item in setCached) - { - if (hide.Length == 0 || !hide.Any(cl => item.ContainsClass(cl))) set.Add(item); - } + foreach (var item in setCached) + { + if (hide.Length == 0 || !hide.Any(cl => item.ContainsClass(cl))) set.Add(item); + } - for (int i = 1; i < r.Length; i++) - { - set.IntersectWith(r[i].ShouldMatch ? _cache[r[i].Class] : _invCache[r[i].Class]); - } + for (int i = 1; i < r.Length; i++) + { + set.IntersectWith(r[i].ShouldMatch ? _cache[r[i].Class] : _invCache[r[i].Class]); + } - return set; + return set; + } } } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index 23b6596..df2e193 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -380,8 +380,6 @@ internal override void DeserializeData(BsonItem data) AddEntry(entry); } - - RebuildCache(); } internal override BsonItem SerializeData() diff --git a/Samples/person.rant b/Samples/person.rant new file mode 100644 index 0000000..201e7ad --- /dev/null +++ b/Samples/person.rant @@ -0,0 +1,21 @@ +{ + [$[x]:[x:__gender;locked]] + [chan:first-name;public;[$x]{|}]\s + [chan:middle-name;public;{[$x]{|}|(.05)[q:[case:title]-[case:none]]}]\s + [chan:last-name;public;{(30)|-}] + [chan:age;private; + { + (.1)[n:1;9]| + [n:10;12]| + (4)[n:13;17]| + (8)[n:18;20]| + (15)[n:20;30]| + (3)[n:40;60]| + (1.5)[n:60;80]| + (.5)[n:80;100] + } + ] + [chan:gender;private;[$x]{male|female}] + [chan:occupation;private;] + [chan:hobbies;private;[rs:[n:1;3];,\s]{}] +} \ No newline at end of file diff --git a/Samples/santa.rant b/Samples/santa.rant new file mode 100644 index 0000000..34b8486 --- /dev/null +++ b/Samples/santa.rant @@ -0,0 +1,75 @@ +{ + [$[santa]:[branch:santa; <name::@?santa>]] + [$[side]:{top|bottom|left|right|front|back|inside|tip}] + [case:sentence] + [rhyme:forced] + 'Twas the <noun-timeofday::=time> before <noun-holiday::=holiday>, when all through the <noun-building>\n + Not a <noun-animal::!a> was <verb.ing-motion>, not even a <noun-animal::!a>;\n + The <noun.pl-clothing::=stocking> were <verb.pp-transitive> by the <noun> with care,\n + In hopes that [$santa] soon would be there;\n + \n + The <noun.pl-person> were nestled all <adj> in their <noun.pl-furniture>,\n + While visions of <noun.pl-food> <verb.ed-intransitive> in their heads;\n + And mamma in her <noun-clothing>, and I in my <noun-clothing>,\n + Had just settled down for a long winter's <verb.nom>,\n + \n + When out on the lawn there arose such a <noun-sound>,\n + I <verb.ed-motion> from the <noun-furniture> to see what was the matter.\n + Away to the window I <verb.ed-motion> like a <noun>,\n + <verb.ed-transitive-violent> open the <noun.pl> and <verb.ed-transitive-violent> {up|down|left|right|out|around|about} the <noun>.\n + \n + The <noun> on the <noun> of the new-<verb.pp-intransitive> <noun-uc>\n + Gave the <adj.ness> of <noun-timeofday> to <noun.pl> below,\n + When, what to my <adj> <noun.pl-body> should appear,\n + But a <adj-appearance> <noun-vehicle::=sleigh>, and eight <adj-appearance> <noun.pl-animal>,\n + \n + With a <adj-appearance> <adj-!appearance> <noun-job>, so <adj> and <adj>,\n + I knew in a moment it must be [$santa].\n + More <adj> than <noun.pl-animal> <pro.dposs::@?santa> <noun.pl> they came,\n + And he <verb.ed-intransitive>, and <verb.ed-intransitive>, and called them by name;\n + \n + [q:Now, <name::!d>! now, <name::!d>! now, <name::!d> and <name::!d>!\n + On, <name::!d>! on, <name::!d>! on, <name::!d> and <name::!d>!\n + To the [$side] of the <noun-place>! to the [$side] of the <noun-place>!\n + Now <verb-intransitive::=dash> away! <verb::=dash> away! <verb::=dash> away{\sall|(.1), you {<noun.pl-job>|<noun>-[pl:<verb.er>]}}!]\n + \n + As <adj-appearance> <noun.pl> that before the <adj> <adj> fly,\n + When they <verb-intransitive> with \a <noun>, <verb> to the sky.\n + So {up|over|out|away} to the <noun-building>-{top|side|interior|exterior|bottom} the <noun.pl-job> they flew,\n + With the <noun-vehicle::=sleigh> full of <noun.pl::=toy>, and [$santa] too.\n + \n + And then, in a <verb.nom-intransitive>, I heard on the roof\n + The <verb.nom-intransitive> and <verb.nom-intransitive> of each little <noun-body>.\n + As I drew in my head, and was turning around,\n + Down the <noun-hole::=chimney> [$santa] came with a bound.\n + \n + <pro::@?santa> was dressed all in <noun-uc>, from <pro.dposs::@?santa> <noun-body> to <pro.dposs::@?santa> <noun-body>,\n + And <pro.dposs::@?santa> clothes were all <verb.pp-transitive> with <noun-uc::!ash> and <noun-uc::!ash>.\n + A bundle of <noun.pl::=toy> he had flung on <pro.dposs::@?santa> back,\n + And he looked like a <noun-job>, just <verb.ing-transitive> <pro.dposs::@?santa> pack.\n + \n + <pro.dposs::@?santa> <noun.pl-body::!bodydesc>-how they <verb-visual>! <pro.dposs::@?santa> <noun.pl-body::!bodydesc> how <adj-!appearance>!\n + <pro.dposs::@?santa> <noun.pl-body::!bodydesc> were like <noun.pl>, <pro.dposs::@?santa> <noun-body::!bodydesc> like a <noun>!\n + <pro.dposs::@?santa> <adj-!appearance> <adj-appearance> <noun-body::!bodydesc> was <verb.pp-transitive> like a <noun>,\n + And the <noun-body::!bodydesc> of <pro.dposs::@?santa> <noun-body::!bodydesc> was as <adj-appearance> as the <noun-uc>.\n + \n + The <noun> of a <noun> <pro::@?santa> held tight in <pro.dposs::@?santa> teeth,\n + And the smoke it encircled <pro.dposs::@?santa> head like a wreath.\n + <pro::@?santa> had a <adj-appearance::!face> face and a <adj-appearance::!belly> <adj-appearance::!belly> <noun-body>,\n + That <verb.ed-motion-intransitive> when <pro::@?santa> laughed, like a <noun-container>ful of <noun-uc-liquid>!\n + \n + <pro::@?santa> was <adj-appearance> and plump, a right jolly old elf,\n + And I laughed when I saw <pro.acc::@?santa>, in spite of myself!\n + A wink of <pro.dposs::@?santa> eye and a {twist|spin|demonic 180-degree rotation} of <pro.dposs::@?santa> head,\n + Soon gave me to know I had {{almost\s|}nothing|everything} to dread.\n + \n + <pro::@?santa> spoke not a word, but went straight to <pro.dposs::@?santa> work,\n + And filled all the <noun.pl-clothing::=stocking>, then turned with a jerk.\n + And laying <pro.dposs::@?santa> finger aside of <pro.dposs::@?santa> nose,\n + And giving a nod, up the <noun-hole::=chimney> he rose!\n + \n + <pro::@?santa> sprang to <pro.dposs::@?santa> sleigh, to <pro.dposs::@?santa> team gave a <noun-sound>,\n + And away they all flew like the <noun> of a <noun>.\n + But I heard <pro.acc::@?santa> exclaim, ‘ere <pro::@?santa> drove out of sight,\n + [q:{Happy|<adj>} <noun::=holiday> to all, and to all a good-[`\s+`:<noun-timeofday::=time>;-]!] +} \ No newline at end of file From fde0fe71cb2c5ad7f2b0208b8ad60a3e2e65a3cd Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Sun, 9 Apr 2017 15:39:46 -0500 Subject: [PATCH 183/213] Fix bug where filterless query includes hidden classes --- Rant.Tests/Queries.cs | 19 ++++++++++++++ Rant.Tests/Rant.Tests.csproj | 3 +++ Rant.Tests/Tables/nouns.table | 5 ++++ Rant.Tests/Tables/nsfw.table | 7 ++++++ Rant/Vocabulary/ClassCache.cs | 47 +++++++++++++++++++++++------------ 5 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 Rant.Tests/Tables/nsfw.table diff --git a/Rant.Tests/Queries.cs b/Rant.Tests/Queries.cs index 342e1e6..d8c6516 100644 --- a/Rant.Tests/Queries.cs +++ b/Rant.Tests/Queries.cs @@ -14,6 +14,8 @@ internal class Queries public Queries() { rant.Dictionary.AddTable(RantDictionaryTable.FromStream("verbs", File.Open("Tables/verbs.table", FileMode.Open))); + rant.Dictionary.AddTable(RantDictionaryTable.FromStream("nouns", File.Open("Tables/nouns.table", FileMode.Open))); + rant.Dictionary.AddTable(RantDictionaryTable.FromStream("nsfw", File.Open("Tables/nsfw.table", FileMode.Open))); } [Test] @@ -28,5 +30,22 @@ public void PhrasalVerb() Assert.AreEqual("It really pisses him off.", rant.Do(@"It really <verb.s-phrasal_test[him]>.").Main); Assert.AreEqual("Whom will he piss off today?", rant.Do(@"Whom will he <verb-phrasal_test> today?").Main); } + + [TestCase(@"<noun-unhidden_class>", "[No Match]")] + [TestCase(@"<nsfw>", "[No Match]")] + [TestCase(@"<noun-nsfw>", "butt")] + public void HiddenClass(string pattern, string expected) + { + Assert.AreEqual(expected, rant.Do(pattern).Main); + } + + [Test] + public void UnhiddenClass() + { + rant.Dictionary.IncludeHiddenClass("nsfw"); + Assert.AreEqual("butt", rant.Do(@"<noun-unhidden_class>").Main); + rant.Dictionary.ExcludeHiddenClass("nsfw"); + Assert.AreEqual("[No Match]", rant.Do(@"<noun-unhidden_class>").Main); + } } } diff --git a/Rant.Tests/Rant.Tests.csproj b/Rant.Tests/Rant.Tests.csproj index 124998b..e51a016 100644 --- a/Rant.Tests/Rant.Tests.csproj +++ b/Rant.Tests/Rant.Tests.csproj @@ -91,6 +91,9 @@ <None Include="Tables\emoji.table"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> + <None Include="Tables\nsfw.table"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> <None Include="Tables\verbs.table"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> diff --git a/Rant.Tests/Tables/nouns.table b/Rant.Tests/Tables/nouns.table index 0d6e23a..856975b 100644 --- a/Rant.Tests/Tables/nouns.table +++ b/Rant.Tests/Tables/nouns.table @@ -14,4 +14,9 @@ > banana, bananas - class yellow - shape long, curved +@endclass + +@class nsfw +> butt, butts + - class unhidden_class @endclass \ No newline at end of file diff --git a/Rant.Tests/Tables/nsfw.table b/Rant.Tests/Tables/nsfw.table new file mode 100644 index 0000000..8873a11 --- /dev/null +++ b/Rant.Tests/Tables/nsfw.table @@ -0,0 +1,7 @@ +@name nsfw +@sub sg, singular +@sub pl, plural + +@class nsfw +> dick, dicks +> butt, butts \ No newline at end of file diff --git a/Rant/Vocabulary/ClassCache.cs b/Rant/Vocabulary/ClassCache.cs index e30a44b..136d10b 100644 --- a/Rant/Vocabulary/ClassCache.cs +++ b/Rant/Vocabulary/ClassCache.cs @@ -55,7 +55,7 @@ private void ClearAll() _allClasses.Clear(); } - private static HashSet<RantDictionaryEntry> Reclaim() + private static HashSet<RantDictionaryEntry> GetPool() { return _recycle.Count == 0 ? new HashSet<RantDictionaryEntry>() : _recycle.Pop(); } @@ -74,7 +74,7 @@ public void BuildCache(RantDictionaryTable table) _allClasses.Add(cl); if (!_cache.TryGetValue(cl, out set)) { - set = _cache[cl] = Reclaim(); + set = _cache[cl] = GetPool(); } set.Add(entry); } @@ -84,7 +84,7 @@ public void BuildCache(RantDictionaryTable table) { if (!_invCache.TryGetValue(cl, out HashSet<RantDictionaryEntry> set)) { - set = _invCache[cl] = Reclaim(); + set = _invCache[cl] = GetPool(); } foreach (var entry in table.GetEntries()) { @@ -98,34 +98,49 @@ public IEnumerable<RantDictionaryEntry> Filter(IEnumerable<ClassFilterRule> rule { lock (syncObject) { - var r = rules.ToArray(); - if (r.Length == 0) return table.GetEntries(); + int startIndex = 0; + var ruleArray = rules as ClassFilterRule[] ?? rules.ToArray(); HashSet<RantDictionaryEntry> setCached; - var set = new HashSet<RantDictionaryEntry>(); + var set = GetPool(); var hide = table.HiddenClasses // Exclude overridden hidden classes .Except(dictionary.IncludedHiddenClasses) // Exclude hidden classes filtered for - .Where(cl => !r.Any(rule => rule.ShouldMatch && String.Equals(rule.Class, cl, StringComparison.InvariantCultureIgnoreCase))).ToArray(); + .Where(cl => !ruleArray.Any(rule => rule.ShouldMatch && String.Equals(rule.Class, cl, StringComparison.InvariantCultureIgnoreCase))).ToArray(); // Get initial pool - if (r[0].ShouldMatch) + if (hide.Length > 0) { - if (!_cache.TryGetValue(r[0].Class, out setCached)) return null; + // Retrieve the inverse pool of the first hidden class + if (!_invCache.TryGetValue(hide[0], out setCached)) setCached = table.EntriesHash; } - else - { - if (!_invCache.TryGetValue(r[0].Class, out setCached)) setCached = table.EntriesHash; - } - + else if (ruleArray.Length > 0) + { + if (ruleArray[0].ShouldMatch) + { + if (!_cache.TryGetValue(ruleArray[0].Class, out setCached)) return null; + } + else + { + if (!_invCache.TryGetValue(ruleArray[0].Class, out setCached)) setCached = table.EntriesHash; + } + startIndex = 1; + } + else + { + setCached = table.EntriesHash; + } + + // Transfer items from cached pool to our new pool and exclude hidden classes foreach (var item in setCached) { if (hide.Length == 0 || !hide.Any(cl => item.ContainsClass(cl))) set.Add(item); } - for (int i = 1; i < r.Length; i++) + // Apply filters by intersecting pools + for (int i = startIndex; i < ruleArray.Length; i++) { - set.IntersectWith(r[i].ShouldMatch ? _cache[r[i].Class] : _invCache[r[i].Class]); + set.IntersectWith(ruleArray[i].ShouldMatch ? _cache[ruleArray[i].Class] : _invCache[ruleArray[i].Class]); } return set; From 3d930875a5bc8ac306394b63a8f537c718a1af22 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Sun, 9 Apr 2017 18:24:49 -0500 Subject: [PATCH 184/213] Fix another blackspace bug --- Rant.Tests/BasicInput.cs | 6 + Rant/Core/Compiler/Parsing/BlockParser.cs | 4 +- Rant/Core/Compiler/Parsing/SequenceParser.cs | 1 - Rant/Core/Compiler/RantLexer.cs | 2 +- Rant/Core/Compiler/TokenReader.cs | 946 +++++++++---------- Samples/fibonacci.rant | 18 + 6 files changed, 500 insertions(+), 477 deletions(-) create mode 100644 Samples/fibonacci.rant diff --git a/Rant.Tests/BasicInput.cs b/Rant.Tests/BasicInput.cs index 9b3cc9c..7a4d01b 100644 --- a/Rant.Tests/BasicInput.cs +++ b/Rant.Tests/BasicInput.cs @@ -25,6 +25,12 @@ public void Blackspace() } [Test] + public void BlackspaceInMultilineBlock() + { + Assert.AreEqual("AAAA", rant.Do("\t#test\n\t[r:4]\n\t#test\n\t{\n\t\tA\n\t}").Main); + } + + [Test] public void BlackspaceInBlock() { Assert.AreEqual("A", rant.Do("{ A | (0) B}").Main); diff --git a/Rant/Core/Compiler/Parsing/BlockParser.cs b/Rant/Core/Compiler/Parsing/BlockParser.cs index 24f1685..72400c7 100644 --- a/Rant/Core/Compiler/Parsing/BlockParser.cs +++ b/Rant/Core/Compiler/Parsing/BlockParser.cs @@ -49,7 +49,7 @@ public override IEnumerator<Parser> Parse(RantCompiler compiler, CompileContext compiler.AddContext(CompileContext.BlockEndSequence); compiler.AddContext(CompileContext.BlockSequence); - + while (compiler.NextContext == CompileContext.BlockSequence) { // block weight @@ -93,7 +93,7 @@ public override IEnumerator<Parser> Parse(RantCompiler compiler, CompileContext compiler.SetNextActionCallback(itemCallback); var startToken = reader.PeekToken(); yield return Get<SequenceParser>(); - + // Don't wrap single nodes in a sequence, it's unnecessary items.Add(actions.Count == 1 ? actions[0] : new RstSequence(actions, startToken.ToLocation())); actions.Clear(); diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index 9c96a78..a18c448 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -37,7 +37,6 @@ public override IEnumerator<Parser> Parse(RantCompiler compiler, CompileContext Action<RST> actionCallback) { Token token; - while (!reader.End) { token = reader.ReadToken(); diff --git a/Rant/Core/Compiler/RantLexer.cs b/Rant/Core/Compiler/RantLexer.cs index bdc3758..1d0d35d 100644 --- a/Rant/Core/Compiler/RantLexer.cs +++ b/Rant/Core/Compiler/RantLexer.cs @@ -160,7 +160,7 @@ public static IEnumerable<Token> Lex(RantCompiler compiler, string input) } // Just eat the line and ignore it while (i < len && input[i] != '\n') i++; - goto iterate; + continue; // Escape sequence case '\\': diff --git a/Rant/Core/Compiler/TokenReader.cs b/Rant/Core/Compiler/TokenReader.cs index 7e8506f..34b670b 100644 --- a/Rant/Core/Compiler/TokenReader.cs +++ b/Rant/Core/Compiler/TokenReader.cs @@ -31,477 +31,477 @@ namespace Rant.Core.Compiler { - internal class TokenReader - { - private readonly RantCompiler _compiler; - private readonly Token[] _tokens; - - public TokenReader(string sourceName, IEnumerable<Token> tokens, RantCompiler compiler) - { - SourceName = sourceName; - _compiler = compiler; - _tokens = tokens.ToArray(); - Position = 0; - } - - public string SourceName { get; } - public int Position { get; set; } - - /// <summary> - /// Determines whether the reader has reached the end of the token stream. - /// </summary> - public bool End => Position >= _tokens.Length; - - /// <summary> - /// The last token that was read. - /// </summary> - public Token PrevToken => Position == 0 ? Token.None : _tokens[Position - 1]; - - public LineCol BaseLocation => _tokens.Length > 0 ? _tokens[0].ToLocation() : new LineCol(1, 1, 0); - - /// <summary> - /// The last non-whitespace token before the current reader position. - /// </summary> - public Token PrevLooseToken - { - get - { - if (Position == 0) return Token.None; - int tempPos = Position - 1; - while (tempPos > 0 && _tokens[tempPos].Type == R.Whitespace) - tempPos--; - return _tokens[tempPos].Type != R.Whitespace ? _tokens[tempPos] : Token.None; - } - } - - /// <summary> - /// The last non-whitespace token type. - /// </summary> - public R LastNonSpaceType - { - get - { - if (Position == 0) return R.EOF; - R Type; - for (int i = Position; i >= 0; i--) - if ((Type = _tokens[i].Type) != R.Whitespace) return Type; - return R.EOF; - } - } - - public Token this[int pos] => _tokens[pos]; - - /// <summary> - /// Reads the next available token. - /// </summary> - /// <returns></returns> - public Token ReadToken() - { - if (End) - { - _compiler.SyntaxError(Token.None, true, GetString("err-compiler-eof")); - return Token.None; - } - return _tokens[Position++]; - } - - /// <summary> - /// Returns the next available token, but does not consume it. - /// </summary> - /// <returns></returns> - public Token PeekToken() - { - return End ? Token.None : _tokens[Position]; - } - - /// <summary> - /// Returns the next available non-whitespace token, but does not consume it. - /// </summary> - /// <returns></returns> - public Token PeekLooseToken() - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return Token.None; - } - int pos = Position; - SkipSpace(); - var token = _tokens[Position]; - Position = pos; - return token; - } - - /// <summary> - /// Returns the type of the next available token. - /// </summary> - /// <returns></returns> - public R PeekType() => End ? R.EOF : _tokens[Position].Type; - - /// <summary> - /// Determines whether the next token is of the specified type. - /// </summary> - /// <param name="type">The type to check for.</param> - /// <returns></returns> - public bool IsNext(R type) - { - return !End && _tokens[Position].Type == type; - } - - /// <summary> - /// Consumes the next token if its type matches the specified type. Returns true if it matches. - /// </summary> - /// <param name="type">The type to consume.</param> - /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> - /// <returns></returns> - public bool Take(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - if (_tokens[Position].Type != type) return false; - Position++; - return true; - } - - /// <summary> - /// Consumes the next non-whitespace token if its type matches the specified type. Returns true if it matches. - /// </summary> - /// <param name="type">The type to consume.</param> - /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> - /// <returns></returns> - public bool TakeLoose(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - SkipSpace(); - if (_tokens[Position].Type != type) return false; - Position++; - SkipSpace(); - return true; - } - - /// <summary> - /// Consumes the next token if its type matches any of the specified types. Returns true if a match was found. - /// </summary> - /// <param name="types">The types to consume.</param> - /// <returns></returns> - public bool TakeAny(params R[] types) - { - if (End) return false; - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - Position++; - return true; - } - return false; - } - - /// <summary> - /// Consumes the next token if its type matches any of the specified types, and outputs the matching type. Returns true if - /// a match was found. - /// </summary> - /// <param name="result">The matched type.</param> - /// <param name="types">The types to consume.</param> - /// <returns></returns> - public bool TakeAny(out R result, params R[] types) - { - result = default(R); - if (End) return false; - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - result = type; - Position++; - return true; - } - return false; - } - - /// <summary> - /// Consumes the next non-whitespace token if its type matches any of the specified types. Returns true if a match was - /// found. - /// </summary> - /// <param name="types">The types to consume.</param> - /// <returns></returns> - public bool TakeAnyLoose(params R[] types) - { - if (End) return false; - SkipSpace(); - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - Position++; - SkipSpace(); - return true; - } - return false; - } - - /// <summary> - /// Consumes the next non-whitespace token if its type matches any of the specified types, and outputs the matching type. - /// Returns true if a match was found. - /// </summary> - /// <param name="result">The matched type.</param> - /// <param name="types">The types to consume.</param> - /// <returns></returns> - public bool TakeAnyLoose(out R result, params R[] types) - { - result = default(R); - if (End) return false; - SkipSpace(); - foreach (var type in types) - { - if (_tokens[Position].Type != type) continue; - result = type; - Position++; - SkipSpace(); - return true; - } - return false; - } - - /// <summary> - /// Consumes as many tokens as possible, as long as they match the specified type. Returns true if at least one was found. - /// </summary> - /// <param name="type">The type to consume.</param> - /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> - /// <returns></returns> - public bool TakeAll(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - if (_tokens[Position].Type != type) return false; - do - { - Position++; - } while (!End && _tokens[Position].Type == type); - return true; - } - - /// <summary> - /// Consumes as many non-whitespace tokens as possible, as long as they match the specified type. Returns true if at least - /// one was found. - /// </summary> - /// <param name="type">The type to consume.</param> - /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> - /// <returns></returns> - public bool TakeAllLoose(R type, bool allowEof = true) - { - if (End) - { - if (!allowEof) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - return false; - } - SkipSpace(); - if (_tokens[Position].Type != type) return false; - do - { - SkipSpace(); - Position++; - } while (!End && _tokens[Position].Type == type); - return true; - } - - /// <summary> - /// Reads and returns the next token if its type matches the specified type. - /// If it does not match, a RantCompilerException is thrown with the expected token name. - /// </summary> - /// <param name="type">The token type to read.</param> - /// <param name="expectedTokenName">A display name describing what the token is for.</param> - /// <returns></returns> - public Token Read(R type, string expectedTokenName = null) - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - if (_tokens[Position].Type != type) - { - _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - return _tokens[Position++]; - } - - /// <summary> - /// Reads and returns the next token if its type matches any of the given types - /// If it does not match, a RantCompilerException is thrown with the expected token names. - /// </summary> - /// <param name="types">The token types accepted for the read token.</param> - /// <returns></returns> - public Token ReadAny(params R[] types) - { - if (End) - { - _compiler.SyntaxError(Token.None, true, - "err-compiler-missing-token-any-eof", - string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); - return Token.None; - } - - if (!types.Contains(_tokens[Position].Type)) // NOTE: .Contains isn't too fast but does it matter in this case? - { - _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token-any", - string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); - return Token.None; - } - - return _tokens[Position++]; - } - - /// <summary> - /// Reads and returns the next non-whitespace token if its type matches the specified type. - /// If it does not match, a RantCompilerException is thrown with the expected token name. - /// </summary> - /// <param name="type">The token type to read.</param> - /// <param name="expectedTokenName">A display name describing what the token is for.</param> - /// <returns></returns> - public Token ReadLoose(R type, string expectedTokenName = null) - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - SkipSpace(); - if (_tokens[Position].Type != type) - { - _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", - expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); - return Token.None; - } - var t = _tokens[Position++]; - SkipSpace(); - return t; - } - - /// <summary> - /// Reads a series of tokens into a buffer as long as they match the types specified in an array, in the order they appear. - /// Returns True if reading was successful. - /// </summary> - /// <param name="buffer">The buffer to read into.</param> - /// <param name="offset">The offset at which to begin writing tokens into the buffer.</param> - /// <param name="types">The required types.</param> - /// <returns></returns> - public bool TakeSeries(Token[] buffer, int offset, params R[] types) - { - if (Position >= _tokens.Length) return types.Length == 0; - if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) - return false; - for (int i = 0; i < types.Length; i++) - { - if (_tokens[Position + i].Type != types[i]) return false; - buffer[i + offset] = _tokens[Position + i]; - } - Position += types.Length; - return true; - } - - /// <summary> - /// Reads a series of non-whitespace tokens into a buffer as long as they match the types specified in an array, in the - /// order they appear. Returns True if reading was successful. - /// </summary> - /// <param name="buffer">The buffer to read into.</param> - /// <param name="offset">The offset at which to begin writing tokens into the buffer.</param> - /// <param name="types">The required types.</param> - /// <returns></returns> - public bool TakeSeriesLoose(Token[] buffer, int offset, params R[] types) - { - if (Position >= _tokens.Length) return types.Length == 0; - if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) - return false; - int i = 0; - int j = 0; - while (i < types.Length) - { - if (Position + j >= _tokens.Length) return false; - while (_tokens[Position + j].Type == R.Whitespace) j++; - if (Position + j >= _tokens.Length) return false; - - if (_tokens[Position + j].Type != types[i]) return false; - buffer[i + offset] = _tokens[Position + i]; - j++; - i++; - } - Position += j; - return true; - } - - /// <summary> - /// Reads and returns the next non-whitespace token. - /// </summary> - /// <returns></returns> - public Token ReadLooseToken() - { - if (End) - { - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return Token.None; - } - SkipSpace(); - var token = _tokens[Position++]; - //SkipSpace(); - return token; - } - - /// <summary> - /// Consumes as many token as possible while they satisfy the specified predicate. - /// </summary> - /// <param name="predicate">The predicate to test tokens with.</param> - /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> - /// <returns></returns> - public bool TakeAllWhile(Func<Token, bool> predicate, bool allowEof = true) - { - if (predicate == null) throw new ArgumentNullException(nameof(predicate)); - if (End) - { - if (!allowEof) - _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); - return false; - } - - int i = Position; - Token t; - while (Position < _tokens.Length) - { - t = _tokens[Position]; - if (!predicate(t)) - return Position > i; - Position++; - } - return true; - } - - public bool SkipSpace() => TakeAll(R.Whitespace); - } + internal class TokenReader + { + private readonly RantCompiler _compiler; + private readonly Token[] _tokens; + + public TokenReader(string sourceName, IEnumerable<Token> tokens, RantCompiler compiler) + { + SourceName = sourceName; + _compiler = compiler; + _tokens = tokens.ToArray(); + Position = 0; + } + + public string SourceName { get; } + public int Position { get; set; } + + /// <summary> + /// Determines whether the reader has reached the end of the token stream. + /// </summary> + public bool End => Position >= _tokens.Length; + + /// <summary> + /// The last token that was read. + /// </summary> + public Token PrevToken => Position == 0 ? Token.None : _tokens[Position - 1]; + + public LineCol BaseLocation => _tokens.Length > 0 ? _tokens[0].ToLocation() : new LineCol(1, 1, 0); + + /// <summary> + /// The last non-whitespace token before the current reader position. + /// </summary> + public Token PrevLooseToken + { + get + { + if (Position == 0) return Token.None; + int tempPos = Position - 1; + while (tempPos > 0 && _tokens[tempPos].Type == R.Whitespace) + tempPos--; + return _tokens[tempPos].Type != R.Whitespace ? _tokens[tempPos] : Token.None; + } + } + + /// <summary> + /// The last non-whitespace token type. + /// </summary> + public R LastNonSpaceType + { + get + { + if (Position == 0) return R.EOF; + R Type; + for (int i = Position; i >= 0; i--) + if ((Type = _tokens[i].Type) != R.Whitespace) return Type; + return R.EOF; + } + } + + public Token this[int pos] => _tokens[pos]; + + /// <summary> + /// Reads the next available token. + /// </summary> + /// <returns></returns> + public Token ReadToken() + { + if (End) + { + _compiler.SyntaxError(Token.None, true, GetString("err-compiler-eof")); + return Token.None; + } + return _tokens[Position++]; + } + + /// <summary> + /// Returns the next available token, but does not consume it. + /// </summary> + /// <returns></returns> + public Token PeekToken() + { + return End ? Token.None : _tokens[Position]; + } + + /// <summary> + /// Returns the next available non-whitespace token, but does not consume it. + /// </summary> + /// <returns></returns> + public Token PeekLooseToken() + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return Token.None; + } + int pos = Position; + SkipSpace(); + var token = _tokens[Position]; + Position = pos; + return token; + } + + /// <summary> + /// Returns the type of the next available token. + /// </summary> + /// <returns></returns> + public R PeekType() => End ? R.EOF : _tokens[Position].Type; + + /// <summary> + /// Determines whether the next token is of the specified type. + /// </summary> + /// <param name="type">The type to check for.</param> + /// <returns></returns> + public bool IsNext(R type) + { + return !End && _tokens[Position].Type == type; + } + + /// <summary> + /// Consumes the next token if its type matches the specified type. Returns true if it matches. + /// </summary> + /// <param name="type">The type to consume.</param> + /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> + /// <returns></returns> + public bool Take(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + if (_tokens[Position].Type != type) return false; + Position++; + return true; + } + + /// <summary> + /// Consumes the next non-whitespace token if its type matches the specified type. Returns true if it matches. + /// </summary> + /// <param name="type">The type to consume.</param> + /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> + /// <returns></returns> + public bool TakeLoose(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + SkipSpace(); + if (_tokens[Position].Type != type) return false; + Position++; + SkipSpace(); + return true; + } + + /// <summary> + /// Consumes the next token if its type matches any of the specified types. Returns true if a match was found. + /// </summary> + /// <param name="types">The types to consume.</param> + /// <returns></returns> + public bool TakeAny(params R[] types) + { + if (End) return false; + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + Position++; + return true; + } + return false; + } + + /// <summary> + /// Consumes the next token if its type matches any of the specified types, and outputs the matching type. Returns true if + /// a match was found. + /// </summary> + /// <param name="result">The matched type.</param> + /// <param name="types">The types to consume.</param> + /// <returns></returns> + public bool TakeAny(out R result, params R[] types) + { + result = default(R); + if (End) return false; + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + result = type; + Position++; + return true; + } + return false; + } + + /// <summary> + /// Consumes the next non-whitespace token if its type matches any of the specified types. Returns true if a match was + /// found. + /// </summary> + /// <param name="types">The types to consume.</param> + /// <returns></returns> + public bool TakeAnyLoose(params R[] types) + { + if (End) return false; + SkipSpace(); + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + Position++; + SkipSpace(); + return true; + } + return false; + } + + /// <summary> + /// Consumes the next non-whitespace token if its type matches any of the specified types, and outputs the matching type. + /// Returns true if a match was found. + /// </summary> + /// <param name="result">The matched type.</param> + /// <param name="types">The types to consume.</param> + /// <returns></returns> + public bool TakeAnyLoose(out R result, params R[] types) + { + result = default(R); + if (End) return false; + SkipSpace(); + foreach (var type in types) + { + if (_tokens[Position].Type != type) continue; + result = type; + Position++; + SkipSpace(); + return true; + } + return false; + } + + /// <summary> + /// Consumes as many tokens as possible, as long as they match the specified type. Returns true if at least one was found. + /// </summary> + /// <param name="type">The type to consume.</param> + /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> + /// <returns></returns> + public bool TakeAll(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + if (_tokens[Position].Type != type) return false; + do + { + Position++; + } while (!End && _tokens[Position].Type == type); + return true; + } + + /// <summary> + /// Consumes as many non-whitespace tokens as possible, as long as they match the specified type. Returns true if at least + /// one was found. + /// </summary> + /// <param name="type">The type to consume.</param> + /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> + /// <returns></returns> + public bool TakeAllLoose(R type, bool allowEof = true) + { + if (End) + { + if (!allowEof) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + return false; + } + SkipSpace(); + if (_tokens[Position].Type != type) return false; + do + { + SkipSpace(); + Position++; + } while (!End && _tokens[Position].Type == type); + return true; + } + + /// <summary> + /// Reads and returns the next token if its type matches the specified type. + /// If it does not match, a RantCompilerException is thrown with the expected token name. + /// </summary> + /// <param name="type">The token type to read.</param> + /// <param name="expectedTokenName">A display name describing what the token is for.</param> + /// <returns></returns> + public Token Read(R type, string expectedTokenName = null) + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + if (_tokens[Position].Type != type) + { + _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + return _tokens[Position++]; + } + + /// <summary> + /// Reads and returns the next token if its type matches any of the given types + /// If it does not match, a RantCompilerException is thrown with the expected token names. + /// </summary> + /// <param name="types">The token types accepted for the read token.</param> + /// <returns></returns> + public Token ReadAny(params R[] types) + { + if (End) + { + _compiler.SyntaxError(Token.None, true, + "err-compiler-missing-token-any-eof", + string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); + return Token.None; + } + + if (!types.Contains(_tokens[Position].Type)) // NOTE: .Contains isn't too fast but does it matter in this case? + { + _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token-any", + string.Join(" ", types.Select(RantLexer.GetSymbolForType).ToArray())); + return Token.None; + } + + return _tokens[Position++]; + } + + /// <summary> + /// Reads and returns the next non-whitespace token if its type matches the specified type. + /// If it does not match, a RantCompilerException is thrown with the expected token name. + /// </summary> + /// <param name="type">The token type to read.</param> + /// <param name="expectedTokenName">A display name describing what the token is for.</param> + /// <returns></returns> + public Token ReadLoose(R type, string expectedTokenName = null) + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-missing-token-eof", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + SkipSpace(); + if (_tokens[Position].Type != type) + { + _compiler.SyntaxError(_tokens[Position], false, "err-compiler-missing-token", + expectedTokenName != null ? GetString(expectedTokenName) : RantLexer.GetSymbolForType(type)); + return Token.None; + } + var t = _tokens[Position++]; + SkipSpace(); + return t; + } + + /// <summary> + /// Reads a series of tokens into a buffer as long as they match the types specified in an array, in the order they appear. + /// Returns True if reading was successful. + /// </summary> + /// <param name="buffer">The buffer to read into.</param> + /// <param name="offset">The offset at which to begin writing tokens into the buffer.</param> + /// <param name="types">The required types.</param> + /// <returns></returns> + public bool TakeSeries(Token[] buffer, int offset, params R[] types) + { + if (Position >= _tokens.Length) return types.Length == 0; + if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) + return false; + for (int i = 0; i < types.Length; i++) + { + if (_tokens[Position + i].Type != types[i]) return false; + buffer[i + offset] = _tokens[Position + i]; + } + Position += types.Length; + return true; + } + + /// <summary> + /// Reads a series of non-whitespace tokens into a buffer as long as they match the types specified in an array, in the + /// order they appear. Returns True if reading was successful. + /// </summary> + /// <param name="buffer">The buffer to read into.</param> + /// <param name="offset">The offset at which to begin writing tokens into the buffer.</param> + /// <param name="types">The required types.</param> + /// <returns></returns> + public bool TakeSeriesLoose(Token[] buffer, int offset, params R[] types) + { + if (Position >= _tokens.Length) return types.Length == 0; + if (_tokens.Length - Position < types.Length || buffer.Length - offset < types.Length) + return false; + int i = 0; + int j = 0; + while (i < types.Length) + { + if (Position + j >= _tokens.Length) return false; + while (_tokens[Position + j].Type == R.Whitespace) j++; + if (Position + j >= _tokens.Length) return false; + + if (_tokens[Position + j].Type != types[i]) return false; + buffer[i + offset] = _tokens[Position + i]; + j++; + i++; + } + Position += j; + return true; + } + + /// <summary> + /// Reads and returns the next non-whitespace token. + /// </summary> + /// <returns></returns> + public Token ReadLooseToken() + { + if (End) + { + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return Token.None; + } + SkipSpace(); + var token = _tokens[Position++]; + //SkipSpace(); + return token; + } + + /// <summary> + /// Consumes as many token as possible while they satisfy the specified predicate. + /// </summary> + /// <param name="predicate">The predicate to test tokens with.</param> + /// <param name="allowEof">Allow end-of-file tokens. Specifying False will throw an exception instead.</param> + /// <returns></returns> + public bool TakeAllWhile(Func<Token, bool> predicate, bool allowEof = true) + { + if (predicate == null) throw new ArgumentNullException(nameof(predicate)); + if (End) + { + if (!allowEof) + _compiler.SyntaxError(Token.None, true, "err-compiler-eof"); + return false; + } + + int i = Position; + Token t; + while (Position < _tokens.Length) + { + t = _tokens[Position]; + if (!predicate(t)) + return Position > i; + Position++; + } + return true; + } + + public bool SkipSpace() => TakeAll(R.Whitespace); + } } \ No newline at end of file diff --git a/Samples/fibonacci.rant b/Samples/fibonacci.rant new file mode 100644 index 0000000..c57723a --- /dev/null +++ b/Samples/fibonacci.rant @@ -0,0 +1,18 @@ +{ + # Set verbalization mode to spell out numbers + [numfmt:verbal] + # Creates state variables + [vn:a;0][vn:b;1] + # Set repeater to cycle 50x on separate lines + [rs:50;\n] + # Capitalize the first letter of each line + [before:[case:first]] + { + # Print a + [v:a] + # t = a, a = b + [vcpy:a;t][vcpy:b;a] + # Add t to b + [vadd:b;[v:t]] + } +} \ No newline at end of file From 98a5f1f63961c1b51a7f00b5fe06682f6ddb977a Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Sun, 9 Apr 2017 22:15:58 -0500 Subject: [PATCH 185/213] Organize Rant function defs into regions, fix number variables ignoring formatting --- Rant.Tests/Rant.Tests.csproj | 1 + Rant.Tests/Variables.cs | 76 ++ Rant/Core/Framework/RantFunctionRegistry.cs | 943 +++++++++++--------- Rant/Core/ObjectModel/RantObject.cs | 20 + 4 files changed, 608 insertions(+), 432 deletions(-) create mode 100644 Rant.Tests/Variables.cs diff --git a/Rant.Tests/Rant.Tests.csproj b/Rant.Tests/Rant.Tests.csproj index e51a016..1da033c 100644 --- a/Rant.Tests/Rant.Tests.csproj +++ b/Rant.Tests/Rant.Tests.csproj @@ -82,6 +82,7 @@ <Compile Include="Tables.cs" /> <Compile Include="Targets.cs" /> <Compile Include="Misc\Utilities.cs" /> + <Compile Include="Variables.cs" /> </ItemGroup> <ItemGroup> <None Include="ComplexTestFile.bson"> diff --git a/Rant.Tests/Variables.cs b/Rant.Tests/Variables.cs new file mode 100644 index 0000000..29bea61 --- /dev/null +++ b/Rant.Tests/Variables.cs @@ -0,0 +1,76 @@ +using NUnit.Framework; + +namespace Rant.Tests +{ + [TestFixture] + public class Variables + { + [Test] + public void VariableExists() + { + var rant = new RantEngine(); + rant.Do("[vn:testvar;123]"); + Assert.IsNotNull(rant["testvar"]); + } + + [Test] + public void VariableDoesNotExist() + { + var rant = new RantEngine(); + Assert.IsNull(rant["testvar"]); + } + + [Test] + public void PrintNumericVariable() + { + var rant = new RantEngine(); + Assert.AreEqual("123", rant.Do("[vn:a;123][v:a]").Main); + } + + [Test] + public void PrintStringVariable() + { + var rant = new RantEngine(); + Assert.AreEqual("Example", rant.Do("[vs:a;Example][v:a]").Main); + } + + [Test] + public void AddNumbers() + { + var rant = new RantEngine(); + Assert.AreEqual("100", rant.Do("[vn:a;75][vn:b;25][add:[v:a];[v:b]]").Main); + } + + [Test] + public void AddStrings() + { + var rant = new RantEngine(); + Assert.AreEqual("FooBar", rant.Do("[vs:a;Foo][vs:b;Bar][v:a][v:b]").Main); + } + + [Test] + public void PatternVariable() + { + var rant = new RantEngine(); + Assert.AreEqual("AB", rant.Do("[vp:a;[x:_;forward]{A|B}][v:a][v:a]").Main); + } + + [Test] + public void VariableScope() + { + var rant = new RantEngine(); + rant.Do("{[vn:a;100]}[vn:b;150]"); + Assert.IsNull(rant["a"]); + Assert.IsNotNull(rant["b"]); + } + + [Test] + public void VariableSwap() + { + var rant = new RantEngine(); + rant.Do("[vn:a;3][vn:b;5][swap:a;b]"); + Assert.AreEqual(rant["a"].Value, 5); + Assert.AreEqual(rant["b"].Value, 3); + } + } +} \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 3959d82..933012b 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -26,19 +26,19 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.IO; using System.Linq; using System.Text; using Rant.Core.Compiler.Syntax; using Rant.Core.Constructs; using Rant.Core.Formatting; +using Rant.Core.ObjectModel; using Rant.Core.Output; using Rant.Core.Utilities; using Rant.Metadata; -using Rant.Vocabulary.Utilities; using Rant.Vocabulary.Querying; -using Rant.Core.ObjectModel; +using Rant.Vocabulary.Utilities; +// ReSharper disable UnusedParameter.Local // ReSharper disable UnusedMember.Local @@ -48,6 +48,109 @@ namespace Rant.Core.Framework // They may return either void or IEnumerator<RantAction> depending on your needs. internal static partial class RantFunctionRegistry { + #region Subroutines + + [RantFunction] + [RantDescription("Returns the specified argument from the current subroutine.")] + private static IEnumerator<RST> Arg(Sandbox sb, + [RantDescription("The name of the argument to retrieve.")] string name) + { + if (!sb.SubroutineArgs.Any()) yield break; + var args = sb.SubroutineArgs.Peek(); + if (args.ContainsKey(name)) + yield return args[name]; + } + + #endregion + + #region Channels + + [RantFunction] + [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] + private static IEnumerator<RST> Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) + { + sb.Output.OpenChannel(channelName, visibility); + yield return pattern; + sb.Output.CloseChannel(); + } + + #endregion + + #region Dependencies + + [RantFunction("require")] + [RantDescription("Loads and runs a pattern from cache or file.")] + private static IEnumerator<RST> Require(Sandbox sb, + [RantDescription("The name or path of the pattern to load.")] string name) + { + RST action; + + try + { + action = sb.Engine.GetProgramInternal(name).SyntaxTree; + } + catch (RantCompilerException e) + { + throw new RantRuntimeException(sb, sb.CurrentAction.Location, + $"Failed to compile imported pattern '{name}':\n{e.Message}"); + } + catch (Exception e) + { + throw new RantRuntimeException(sb, sb.CurrentAction.Location, + $"Failed to import '{name}':\n{e.Message}"); + } + + yield return action; + } + + #endregion + + #region Serial + + [RantFunction] + [RantDescription("Yields the currenty written output.")] + private static void Yield(Sandbox sb) => sb.SetYield(); + + #endregion + + #region Input + + [RantFunction("in")] + [RantDescription("Prints the value of the specified pattern argument.")] + private static void PatternArg(Sandbox sb, + [RantDescription("The name of the argument to access.")] string argName) + { + if (sb.PatternArgs == null) return; + sb.Output.Print(sb.PatternArgs[argName]); + } + + #endregion + + #region Conditions + + [RantFunction("switch")] + private static IEnumerator<RST> Switch(Sandbox sb, string input, params RST[] casePairs) + { + if (casePairs.Length % 2 != 0) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-switch-incomplete-pair"); + + for (int i = 0; i < casePairs.Length; i += 2) + { + sb.AddOutputWriter(); + yield return casePairs[i]; + string output = sb.Return().Main; + if (String.Equals(input, output, StringComparison.Ordinal)) + { + yield return casePairs[i + 1]; + yield break; + } + } + } + + #endregion + + #region Numbers and Number Formatting + [RantFunction("num", "n")] [RantDescription("Prints a random number between the specified minimum and maximum bounds.")] private static void Number(Sandbox sb, @@ -105,6 +208,64 @@ private static void Digits(Sandbox sb, private static void Endian(Sandbox sb, [RantDescription("The endianness to use.")] Endianness endianness) => sb.Output.Do(chain => chain.Last.NumberFormatter.Endianness = endianness); + #endregion + + #region Block Attributes + + // TODO: Finish [persist]. + //[RantFunction] + [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] + private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.AttribManager.CurrentAttribs.Persistence = persistence; + + [RantFunction("pipe")] + [RantDescription("Redirects the output from the next block into the specified callback. Access block output with [item].")] + private static void Redirect(Sandbox sb, + [RantDescription("The callback to redirect block output to.")] RST redirectCallback) + { + sb.AttribManager.CurrentAttribs.Redirect = redirectCallback; + } + + [RantFunction("item")] + [RantDescription("Prints the main output from the current block iteration.")] + private static void RedirectedItem(Sandbox sb) + { + sb.Print(sb.GetRedirectedOutput().Main); + } + + [RantFunction("item")] + [RantDescription("Prints the specified channel from the current block iteration.")] + private static void RedirectedItem(Sandbox sb, + [RantDescription("The output channel to print from.")] string channel) + { + sb.Print(sb.GetRedirectedOutput()[channel]); + } + + [RantFunction("protect")] + [RantDescription("Spawns a new block attribute context for the specified callback so any blocks therein will not consume the current attributes.")] + private static IEnumerator<RST> Protect(Sandbox sb, + [RantDescription("The callback to protect.")] RST pattern) + { + sb.AttribManager.AddLayer(); + yield return pattern; + sb.AttribManager.RemoveLayer(); + } + + [RantFunction] + [RantDescription("Sets a pattern that will run before the next block.")] + private static void Start(Sandbox sb, + [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.AttribManager.CurrentAttribs.Start = beforePattern; + + [RantFunction] + [RantDescription("Sets a pattern that will run after the next block.")] + private static void End(Sandbox sb, + [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.AttribManager.CurrentAttribs.End = endPattern; + + [RantFunction("sync", "x")] + [RantDescription("Creates and applies a synchronizer with the specified name and type.")] + private static void Sync(Sandbox sb, + [RantDescription("The name of the synchronizer.")] string name, + [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); + [RantFunction("init")] [RantDescription("Sets the index of the element to execute on the next block. Set to -1 to disable.")] private static void Initial(Sandbox sb, int index) => sb.AttribManager.CurrentAttribs.StartIndex = index; @@ -183,6 +344,180 @@ private static void After(Sandbox sb, private static void Chance(Sandbox sb, [RantDescription("The percent probability that the next block will execute.")] double chance) => sb.AttribManager.CurrentAttribs.Chance = chance < 0 ? 0 : chance > 100 ? 100 : chance; + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the first.")] + private static IEnumerator<RST> First(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration == 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the first.")] + private static IEnumerator<RST> NotFirst(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + if (sb.Blocks.Peek().Iteration > 1) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is the last.")] + private static IEnumerator<RST> Last(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is not the last.")] + private static IEnumerator<RST> NotLast(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration < block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] + private static IEnumerator<RST> Middle(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration > 1 && block.Iteration < block.Repetitions) yield return action; + } + + [RantFunction] + [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] + private static IEnumerator<RST> Ends(Sandbox sb, + [RantDescription("The pattern to run when the condition is met.")] RST action) + { + if (!sb.Blocks.Any()) yield break; + var block = sb.Blocks.Peek(); + if (block.Iteration == 1 || block.Iteration == block.Repetitions) yield return action; + } + + #endregion + + #region Text Formatting and Analysis + + [RantFunction("at")] + [RantDescription("Prints the character at the specified position in the input. Throws an exception if the position is outside of the string.")] + private static void At(Sandbox sb, + [RantDescription("The input string.")] string input, + [RantDescription("The position of the character to find.")] int pos) + { + if (pos < 0 || pos > input.Length) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-string-index", pos); + sb.Print(input.Substring(pos, 1)); + } + + [RantFunction] + [RantDescription("Prints the current length of the specified channel, in characters.")] + private static void Len(Sandbox sb, + [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); + + [RantFunction("rev")] + [RantDescription("Reverses the specified string and prints it to the output.")] + private static void Reverse(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = input[i]; + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = input[i]; + } + sb.Print(new string(buffer)); + } + + [RantFunction("revx")] + [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] + private static void ReverseEx(Sandbox sb, + [RantDescription("The string to reverse.")] string input) + { + if (string.IsNullOrEmpty(input)) return; + var buffer = new char[input.Length]; + int numCombiners = 0; + int lastIndex = input.Length - 1; + for (int i = lastIndex; i >= 0; i--) + { + if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) + { + // It's combining, so increase the combiner count until we hit a regular char + numCombiners++; + } + else if (numCombiners > 0) + { + // We've hit a non-combining character with combiners added. + // First thing to do is add the character to the buffer. + buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); + + // Then we insert all the combining characters that come after it. + for (int j = 1; j <= numCombiners; j++) + buffer[lastIndex - i - numCombiners + j] = input[i + j]; + numCombiners = 0; + } + else if (char.IsLowSurrogate(input[i])) + buffer[lastIndex - i + 1] = input[i]; + else if (char.IsHighSurrogate(input[i])) + buffer[lastIndex - i - 1] = input[i]; + else + buffer[lastIndex - i] = Util.ReverseChar(input[i]); + } + sb.Print(new string(buffer)); + } + + [RantFunction("plural", "pl")] + [RantDescription("Infers and prints the plural form of the specified word.")] + private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); + + [RantFunction("quote", "q")] + [RantDescription( + "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] + private static IEnumerator<RST> Quote(Sandbox sb, + [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) + { + sb.IncreaseQuote(); + sb.PrintOpeningQuote(); + yield return quoteAction; + sb.PrintClosingQuote(); + sb.DecreaseQuote(); + } + + [RantFunction] + [RantDescription("Sets the current rhyming mode for queries.")] + private static void Rhyme(Sandbox sb, + [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; + [RantFunction("case", "caps")] [RantDescription("Changes the capitalization mode for all open channels.")] private static void Case(Sandbox sb, @@ -191,8 +526,7 @@ private static void Case(Sandbox sb, [RantFunction("txtfmt")] [RantDescription("Sets the text conversion format for all open channels.")] private static void TxtFmt(Sandbox sb, - [RantDescription("The conversion mode to use.")] - CharConversion format) => sb.Output.SetConversion(format); + [RantDescription("The conversion mode to use.")] CharConversion format) => sb.Output.SetConversion(format); [RantFunction] [RantDescription("Infers the capitalization of a given string and sets the capitalization mode to match it.")] @@ -238,13 +572,14 @@ private static void CapsInfer(Sandbox sb, .Select(str => str.Trim()) .Where(str => !string.IsNullOrEmpty(str) - && !char.IsDigit(str[0])).ToArray(); + && !char.IsDigit(str[0])) + .ToArray(); // All words capitalized? var lwords = words.Where(w => char.IsLetter(w[0])).ToArray(); if (lwords.Any() && (sentences.Length == 1 || - sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) + sentences.Any(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length > 1))) { if (lwords.All(lw => char.IsUpper(lw[0]))) { @@ -280,62 +615,57 @@ private static void CapsInfer(Sandbox sb, } } - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the first.")] - private static IEnumerator<RST> First(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration == 1) yield return action; - } + #endregion - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the first.")] - private static IEnumerator<RST> NotFirst(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration > 1) yield return action; - } + #region Block State [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is the last.")] - private static IEnumerator<RST> Last(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) + [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] + private static IEnumerator<RST> Nth(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) { if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == block.Repetitions) yield return action; + if (sb.Blocks.Peek().Iteration % interval != 0) yield break; + yield return pattern; } [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not the last.")] - private static IEnumerator<RST> NotLast(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) + [RantDescription( + "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] + private static IEnumerator<RST> NthO(Sandbox sb, + [RantDescription("The interval at which the pattern should be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) { if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration < block.Repetitions) yield return action; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; + yield return pattern; } [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is neither the first nor last.")] - private static IEnumerator<RST> Middle(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) + [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] + private static IEnumerator<RST> NotNth(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) { if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration > 1 && block.Iteration < block.Repetitions) yield return action; + if (sb.Blocks.Peek().Iteration % interval == 0) yield break; + yield return pattern; } [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is either the first or last.")] - private static IEnumerator<RST> Ends(Sandbox sb, - [RantDescription("The pattern to run when the condition is met.")] RST action) + [RantDescription( + "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." + )] + private static IEnumerator<RST> NotNthO(Sandbox sb, + [RantDescription("The interval at which the pattern should not be run.")] int interval, + [RantDescription("The number of iterations to offset the interval by.")] int offset, + [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) { if (!sb.Blocks.Any()) yield break; - var block = sb.Blocks.Peek(); - if (block.Iteration == 1 || block.Iteration == block.Repetitions) yield return action; + if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; + yield return pattern; } [RantFunction("repnum", "rn")] @@ -418,16 +748,9 @@ private static IEnumerator<RST> Even(Sandbox sb, if (sb.Blocks.Peek().Iteration % 2 == 0) yield return action; } - [RantFunction] - [RantDescription("Returns the specified argument from the current subroutine.")] - private static IEnumerator<RST> Arg(Sandbox sb, - [RantDescription("The name of the argument to retrieve.")] string name) - { - if (!sb.SubroutineArgs.Any()) yield break; - var args = sb.SubroutineArgs.Peek(); - if (args.ContainsKey(name)) - yield return args[name]; - } + #endregion + + #region Replacer [RantFunction] [RantDescription("Retrieves and prints the current match string of the active replacer.")] @@ -446,16 +769,9 @@ private static void Group(Sandbox sb, sb.Print(sb.RegexMatches.Peek().Groups[groupName].Value); } - [RantFunction] - [RantDescription("Sets the current rhyming mode for queries.")] - private static void Rhyme(Sandbox sb, - [RantDescription("The rhyme types to use.")] RhymeFlags flags) => sb.CarrierState.Rhymer.AllowedRhymes = flags; + #endregion - [RantFunction("sync", "x")] - [RantDescription("Creates and applies a synchronizer with the specified name and type.")] - private static void Sync(Sandbox sb, - [RantDescription("The name of the synchronizer.")] string name, - [RantDescription("The synchronization type to use.")] SyncType type) => sb.SyncManager.Create(name, type, true); + #region Synchronizer [RantFunction("xpin")] [RantDescription("Pins a synchronizer.")] @@ -477,27 +793,9 @@ private static void SyncStep(Sandbox sb, private static void SyncReset(Sandbox sb, [RantDescription("The name of the synchronizer to reset.")] string name) => sb.SyncManager.Reset(name); - [RantFunction("quote", "q")] - [RantDescription( - "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] - private static IEnumerator<RST> Quote(Sandbox sb, - [RantDescription("The pattern to run whose output will be surrounded in quotes.")] RST quoteAction) - { - sb.IncreaseQuote(); - sb.PrintOpeningQuote(); - yield return quoteAction; - sb.PrintClosingQuote(); - sb.DecreaseQuote(); - } + #endregion - [RantFunction] - [RantDescription("Opens a channel for writing and executes the specified pattern inside of it.")] - private static IEnumerator<RST> Chan(Sandbox sb, string channelName, ChannelVisibility visibility, RST pattern) - { - sb.Output.OpenChannel(channelName, visibility); - yield return pattern; - sb.Output.CloseChannel(); - } + #region Targets [RantFunction("target", "t")] [RantDescription("Places a target with the specified name at the current write position.")] @@ -525,99 +823,14 @@ private static void SendOver(Sandbox sb, private static void GetTargetValue(Sandbox sb, [RantDescription("The name of the target whose value to print.")] string targetName) => sb.Output.Do(chain => chain.Print(chain.GetTargetValue(targetName))); - [RantFunction("clrt")] - [RantDescription("Clears the contents of the specified target.")] - private static void ClearTarget(Sandbox sb, - [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is a multiple of the specified number.")] - private static IEnumerator<RST> Nth(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is a multiple of the specified number offset by a specific amount.")] - private static IEnumerator<RST> NthO(Sandbox sb, - [RantDescription("The interval at which the pattern should be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) != 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Runs a pattern if the current block iteration is not a multiple of the specified number.")] - private static IEnumerator<RST> NotNth(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (sb.Blocks.Peek().Iteration % interval == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription( - "Runs a pattern if the current block iteration is not a multiple of the specified number offset by a specific amount." - )] - private static IEnumerator<RST> NotNthO(Sandbox sb, - [RantDescription("The interval at which the pattern should not be run.")] int interval, - [RantDescription("The number of iterations to offset the interval by.")] int offset, - [RantDescription("The pattern to run when the condition is satisfied.")] RST pattern) - { - if (!sb.Blocks.Any()) yield break; - if (Util.Mod(sb.Blocks.Peek().Iteration - offset, interval) == 0) yield break; - yield return pattern; - } - - [RantFunction] - [RantDescription("Sets a pattern that will run before the next block.")] - private static void Start(Sandbox sb, - [RantDescription("The pattern to run before the next block.")] RST beforePattern) => sb.AttribManager.CurrentAttribs.Start = beforePattern; - - [RantFunction] - [RantDescription("Sets a pattern that will run after the next block.")] - private static void End(Sandbox sb, - [RantDescription("The pattern to run after the next block.")] RST endPattern) => sb.AttribManager.CurrentAttribs.End = endPattern; - - // TODO: Finish [persist]. - //[RantFunction] - [RantDescription("Instructs Rant not to consume the block attributes after they are used.")] - private static void Persist(Sandbox sb, AttribPersistence persistence) => sb.AttribManager.CurrentAttribs.Persistence = persistence; - - [RantFunction] - [RantDescription("Loads and runs a pattern from cache or file.")] - private static IEnumerator<RST> Import(Sandbox sb, - [RantDescription("The name or path of the pattern to load.")] string name) - { - RST action; + [RantFunction("clrt")] + [RantDescription("Clears the contents of the specified target.")] + private static void ClearTarget(Sandbox sb, + [RantDescription("The name of the target to be cleared.")] string targetName) => sb.Output.Do(chain => chain.ClearTarget(targetName)); - try - { - action = sb.Engine.GetProgramInternal(name).SyntaxTree; - } - catch (RantCompilerException e) - { - throw new RantRuntimeException(sb, sb.CurrentAction.Location, - $"Failed to compile imported pattern '{name}':\n{e.Message}"); - } - catch (Exception e) - { - throw new RantRuntimeException(sb, sb.CurrentAction.Location, - $"Failed to import '{name}':\n{e.Message}"); - } + #endregion - yield return action; - } + #region Flags [RantFunction] [RantDescription("Defines the specified flags.")] @@ -687,9 +900,9 @@ private static IEnumerator<RST> Else(Sandbox sb, RST conditionFailPattern) yield return conditionFailPattern; } - [RantFunction] - [RantDescription("Yields the currenty written output.")] - private static void Yield(Sandbox sb) => sb.SetYield(); + #endregion + + #region RNG [RantFunction] [RantDescription("Branches the internal RNG according to a seed.")] @@ -711,139 +924,9 @@ private static IEnumerator<RST> Branch(Sandbox sb, [RantDescription("Merges the topmost branch of the internal RNG, if it has been branched at least once.")] private static void Merge(Sandbox sb) => sb.RNG.Merge(); - [RantFunction("in")] - [RantDescription("Prints the value of the specified pattern argument.")] - private static void PatternArg(Sandbox sb, - [RantDescription("The name of the argument to access.")] string argName) - { - if (sb.PatternArgs == null) return; - sb.Output.Print(sb.PatternArgs[argName]); - } - - [RantFunction("tm")] - [RantDescription("Prints the trademark symbol.")] - private static void Trademark(Sandbox sb) => sb.Print("\x2122"); - - [RantFunction("reg")] - [RantDescription("Prints the registered trademark symbol.")] - private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); - - [RantFunction("c")] - [RantDescription("Prints the copyright symbol.")] - private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); - - [RantFunction("em")] - [RantDescription("Prints an emdash.")] - private static void Emdash(Sandbox sb) => sb.Print("\x2014"); - - [RantFunction("en")] - [RantDescription("Prints an endash.")] - private static void Endash(Sandbox sb) => sb.Print("\x2013"); - - [RantFunction("b")] - [RantDescription("Prints a bullet character.")] - private static void Bullet(Sandbox sb) => sb.Print("\x2022"); - - [RantFunction("ss")] - [RantDescription("Prints an eszett (ß).")] - private static void Eszett(Sandbox sb) => sb.Print("\x00df"); - - [RantFunction("emoji")] - [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] - private static void PrintEmoji(Sandbox sb, - [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) - { - shortcode = shortcode.ToLower(); - if (!Emoji.Shortcodes.ContainsKey(shortcode)) - { - sb.Print("[missing emoji]"); - return; - } - sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); - } - - [RantFunction("plural", "pl")] - [RantDescription("Infers and prints the plural form of the specified word.")] - private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); - - [RantFunction] - [RantDescription("Prints the current length of the specified channel, in characters.")] - private static void Len(Sandbox sb, - [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); - - [RantFunction("rev")] - [RantDescription("Reverses the specified string and prints it to the output.")] - private static void Reverse(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = input[i]; - - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = input[i]; - } - sb.Print(new string(buffer)); - } - - [RantFunction("revx")] - [RantDescription("Reverses the specified string and inverts common brackets and quotation marks, then prints the result to the output.")] - private static void ReverseEx(Sandbox sb, - [RantDescription("The string to reverse.")] string input) - { - if (string.IsNullOrEmpty(input)) return; - var buffer = new char[input.Length]; - int numCombiners = 0; - int lastIndex = input.Length - 1; - for (int i = lastIndex; i >= 0; i--) - { - if (CharUnicodeInfo.GetUnicodeCategory(input[i]) == UnicodeCategory.NonSpacingMark) - { - // It's combining, so increase the combiner count until we hit a regular char - numCombiners++; - } - else if (numCombiners > 0) - { - // We've hit a non-combining character with combiners added. - // First thing to do is add the character to the buffer. - buffer[lastIndex - i - numCombiners] = Util.ReverseChar(input[i]); + #endregion - // Then we insert all the combining characters that come after it. - for (int j = 1; j <= numCombiners; j++) - buffer[lastIndex - i - numCombiners + j] = input[i + j]; - numCombiners = 0; - } - else if (char.IsLowSurrogate(input[i])) - buffer[lastIndex - i + 1] = input[i]; - else if (char.IsHighSurrogate(input[i])) - buffer[lastIndex - i - 1] = input[i]; - else - buffer[lastIndex - i] = Util.ReverseChar(input[i]); - } - sb.Print(new string(buffer)); - } + #region Characters, Accents, and Special Prints [RantFunction("accent")] [RantDescription("Accents the previous character.")] @@ -894,13 +977,58 @@ private static void ReverseEx(Sandbox sb, private static void Character(Sandbox sb, [RantDescription("The name of the character to print (case-insensitive).")] string name) => sb.Print(Unicode.GetByName(name)); + [RantFunction("tm")] + [RantDescription("Prints the trademark symbol.")] + private static void Trademark(Sandbox sb) => sb.Print("\x2122"); + + [RantFunction("reg")] + [RantDescription("Prints the registered trademark symbol.")] + private static void RegisteredTrademark(Sandbox sb) => sb.Print("\x00ae"); + + [RantFunction("c")] + [RantDescription("Prints the copyright symbol.")] + private static void Copyright(Sandbox sb) => sb.Print("\x00a9"); + + [RantFunction("em")] + [RantDescription("Prints an emdash.")] + private static void Emdash(Sandbox sb) => sb.Print("\x2014"); + + [RantFunction("en")] + [RantDescription("Prints an endash.")] + private static void Endash(Sandbox sb) => sb.Print("\x2013"); + + [RantFunction("b")] + [RantDescription("Prints a bullet character.")] + private static void Bullet(Sandbox sb) => sb.Print("\x2022"); + + [RantFunction("ss")] + [RantDescription("Prints an eszett (ß).")] + private static void Eszett(Sandbox sb) => sb.Print("\x00df"); + + [RantFunction("emoji")] + [RantDescription("Takes an emoji shortcode and prints the corresponding emoji.")] + private static void PrintEmoji(Sandbox sb, + [RantDescription("The emoji shortcode to use, without colons.")] string shortcode) + { + shortcode = shortcode.ToLower(); + if (!Emoji.Shortcodes.ContainsKey(shortcode)) + { + sb.Print("[missing emoji]"); + return; + } + sb.Print(char.ConvertFromUtf32(Emoji.Shortcodes[shortcode])); + } + + #endregion + + #region Query Building + [RantFunction("rcc")] [RantDescription("Resets the specified carrier components.")] private static void ResetCarrier(Sandbox sb, - [RantDescription("The list of carrier component identifiers to reset.")] - params string[] ids) + [RantDescription("The list of carrier component identifiers to reset.")] params string[] ids) { - foreach (var id in ids) + foreach (string id in ids) { if (Util.IsNullOrWhiteSpace(id)) continue; sb.CarrierState.DeleteAssociation(id); @@ -935,7 +1063,7 @@ private static void QueryClassFilterPositive(Sandbox sb, string id, params strin ClassFilter cf; cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; if (cf == null) q.AddFilter(cf = new ClassFilter()); - foreach (var cl in classes) + foreach (string cl in classes) { cf.AddRule(new ClassFilterRule(cl, true)); } @@ -948,55 +1076,58 @@ private static void QueryClassFilterNegative(Sandbox sb, string id, params strin ClassFilter cf; cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; if (cf == null) q.AddFilter(cf = new ClassFilter()); - foreach (var cl in classes) + foreach (string cl in classes) { cf.AddRule(new ClassFilterRule(cl, false)); } } - [RantFunction("pipe")] - [RantDescription("Redirects the output from the next block into the specified callback. Access block output with [item].")] - private static void Redirect(Sandbox sb, - [RantDescription("The callback to redirect block output to.")] - RST redirectCallback) - { - sb.AttribManager.CurrentAttribs.Redirect = redirectCallback; - } + #endregion - [RantFunction("item")] - [RantDescription("Prints the main output from the current block iteration.")] - private static void RedirectedItem(Sandbox sb) + #region Variables + + [RantFunction("rvr")] + [RantDescription("Rotates the values of a list of variables once to the right.")] + private static void RotateVariablesRight(Sandbox sb, + [RantDescription("The list of the names of variables whose values will be rotated in order.")] params string[] varNames) { - sb.Print(sb.GetRedirectedOutput().Main); + if (varNames.Length < 2) return; + var rightmostObject = sb.Objects[varNames[varNames.Length - 1]]; + for (int i = varNames.Length - 1; i >= 1; i--) + { + sb.Objects[varNames[i]] = sb.Objects[varNames[i - 1]]; + } + sb.Objects[varNames[0]] = rightmostObject; } - [RantFunction("item")] - [RantDescription("Prints the specified channel from the current block iteration.")] - private static void RedirectedItem(Sandbox sb, - [RantDescription("The output channel to print from.")] - string channel) + [RantFunction("rvl")] + [RantDescription("Rotates the values of a list of variables once to the left.")] + private static void RotateVariablesLeft(Sandbox sb, + [RantDescription("The list of the names of variables whose values will be rotated in order.")] params string[] varNames) { - sb.Print(sb.GetRedirectedOutput()[channel]); + if (varNames.Length < 2) return; + var leftmostObject = sb.Objects[varNames[0]]; + for (int i = 1; i < varNames.Length - 1; i++) + { + sb.Objects[varNames[i - 1]] = sb.Objects[varNames[i]]; + } + sb.Objects[varNames[varNames.Length - 1]] = leftmostObject; } - [RantFunction("protect")] - [RantDescription("Spawns a new block attribute context for the specified callback so any blocks therein will not consume the current attributes.")] - private static IEnumerator<RST> Protect(Sandbox sb, - [RantDescription("The callback to protect.")] - RST pattern) + [RantFunction("vs")] + [RantDescription("Creates a new string variable with the specified name and value.")] + private static void VariableSet(Sandbox sb, + [RantDescription("The name of the variable.")] string name, + [RantDescription("The value of the variable.")] string value) { - sb.AttribManager.AddLayer(); - yield return pattern; - sb.AttribManager.RemoveLayer(); + sb.Objects[name] = new RantObject(value); } - [RantFunction("vs")] + [RantFunction("vb")] [RantDescription("Creates a new string variable with the specified name and value.")] private static void VariableSet(Sandbox sb, - [RantDescription("The name of the variable.")] - string name, - [RantDescription("The value of the variable.")] - string value) + [RantDescription("The name of the variable.")] string name, + [RantDescription("The value of the variable.")] bool value) { sb.Objects[name] = new RantObject(value); } @@ -1004,10 +1135,8 @@ private static void VariableSet(Sandbox sb, [RantFunction("vn")] [RantDescription("Creates a new number variable with the specified name and value.")] private static void VariableSet(Sandbox sb, - [RantDescription("The name of the variable.")] - string name, - [RantDescription("The value of the variable.")] - double value) + [RantDescription("The name of the variable.")] string name, + [RantDescription("The value of the variable.")] double value) { sb.Objects[name] = new RantObject(value); } @@ -1015,12 +1144,9 @@ private static void VariableSet(Sandbox sb, [RantFunction("vn")] [RantDescription("Creates a new number variable with a random value between the specified minimum and maximum bounds.")] private static void VariableSet(Sandbox sb, - [RantDescription("The name of the variable.")] - string name, - [RantDescription("The minimum bound of the value.")] - int min, - [RantDescription("The maximum bound of the value.")] - int max) + [RantDescription("The name of the variable.")] string name, + [RantDescription("The minimum bound of the value.")] int min, + [RantDescription("The maximum bound of the value.")] int max) { sb.Objects[name] = new RantObject(sb.RNG.Next(min, max + 1)); } @@ -1028,10 +1154,8 @@ private static void VariableSet(Sandbox sb, [RantFunction("vp")] [RantDescription("Creates a new pattern variable with the specified callback.")] private static void VariableSetLazy(Sandbox sb, - [RantDescription("The name of the variable.")] - string name, - [RantDescription("The value of the variable.")] - RST value) + [RantDescription("The name of the variable.")] string name, + [RantDescription("The value of the variable.")] RST value) { sb.Objects[name] = new RantObject(value); } @@ -1039,10 +1163,8 @@ private static void VariableSetLazy(Sandbox sb, [RantFunction("vcpy")] [RantDescription("Copies the value of the variable with the first name to the variable with the second name.")] private static void VariableCopy(Sandbox sb, - [RantDescription("The variable to copy from.")] - string a, - [RantDescription("The variable to copy to.")] - string b) + [RantDescription("The variable to copy from.")] string a, + [RantDescription("The variable to copy to.")] string b) { sb.Objects[b] = sb.Objects[a].Clone(); } @@ -1050,14 +1172,9 @@ private static void VariableCopy(Sandbox sb, [RantFunction("v")] [RantDescription("Prints the value of the specified variable.")] private static IEnumerator<RST> VariableGet(Sandbox sb, - [RantDescription("The name of the variable to retrieve.")] - string name) + [RantDescription("The name of the variable to retrieve.")] string name) { - var o = sb.Objects[name]; - if (o == null) - { - throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", name); - } + var o = sb.Objects[name] ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", name); if (o.Type == RantObjectType.Action) { @@ -1065,17 +1182,15 @@ private static IEnumerator<RST> VariableGet(Sandbox sb, } else { - sb.Print(o); + sb.Print(o.PrintableValue); } } [RantFunction("add")] [RantDescription("Prints the num of the specified values.")] private static void AddVal(Sandbox sb, - [RantDescription("The first operand.")] - double a, - [RantDescription("The second operand.")] - double b) + [RantDescription("The first operand.")] double a, + [RantDescription("The second operand.")] double b) { sb.Print(a + b); } @@ -1083,10 +1198,8 @@ private static void AddVal(Sandbox sb, [RantFunction("vadd")] [RantDescription("Adds a number to the specified variable.")] private static void AddVar(Sandbox sb, - [RantDescription("The name of the variable to add to.")] - string a, - [RantDescription("The value to add.")] - double b) + [RantDescription("The name of the variable to add to.")] string a, + [RantDescription("The value to add.")] double b) { sb.Objects[a] += new RantObject(b); } @@ -1094,10 +1207,8 @@ private static void AddVar(Sandbox sb, [RantFunction("sub")] [RantDescription("Prints the difference of the specified values.")] private static void SubVal(Sandbox sb, - [RantDescription("The first operand.")] - double a, - [RantDescription("The second operand.")] - double b) + [RantDescription("The first operand.")] double a, + [RantDescription("The second operand.")] double b) { sb.Print(a - b); } @@ -1105,10 +1216,8 @@ private static void SubVal(Sandbox sb, [RantFunction("vsub")] [RantDescription("Subtracts a number from the specified variable.")] private static void SubVar(Sandbox sb, - [RantDescription("The name of the variable to subtract from.")] - string a, - [RantDescription("The value to subtract.")] - double b) + [RantDescription("The name of the variable to subtract from.")] string a, + [RantDescription("The value to subtract.")] double b) { sb.Objects[a] -= new RantObject(b); } @@ -1116,10 +1225,8 @@ private static void SubVar(Sandbox sb, [RantFunction("mul")] [RantDescription("Prints the product of the specified numbers.")] private static void MulVal(Sandbox sb, - [RantDescription("The first operand.")] - double a, - [RantDescription("The second operand.")] - double b) + [RantDescription("The first operand.")] double a, + [RantDescription("The second operand.")] double b) { sb.Print(a * b); } @@ -1127,10 +1234,8 @@ private static void MulVal(Sandbox sb, [RantFunction("vmul")] [RantDescription("Multiplies the specified variable by a number.")] private static void MulVar(Sandbox sb, - [RantDescription("The name of the variable to multiply.")] - string a, - [RantDescription("The value to multiply by.")] - double b) + [RantDescription("The name of the variable to multiply.")] string a, + [RantDescription("The value to multiply by.")] double b) { sb.Objects[a] *= new RantObject(b); } @@ -1138,11 +1243,10 @@ private static void MulVar(Sandbox sb, [RantFunction("div")] [RantDescription("Prints the quotient of the two specified numbers.")] private static void DivVal(Sandbox sb, - [RantDescription("The dividend.")] - double a, - [RantDescription("The divisor.")] - double b) + [RantDescription("The dividend.")] double a, + [RantDescription("The divisor.")] double b) { + // ReSharper disable once CompareOfFloatsByEqualityOperator if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); sb.Print(a / b); } @@ -1150,11 +1254,10 @@ private static void DivVal(Sandbox sb, [RantFunction("vdiv")] [RantDescription("Divides the specified variable by a number.")] private static void DivVar(Sandbox sb, - [RantDescription("The name of the variable to divide.")] - string a, - [RantDescription("The divisor.")] - double b) + [RantDescription("The name of the variable to divide.")] string a, + [RantDescription("The divisor.")] double b) { + // ReSharper disable once CompareOfFloatsByEqualityOperator if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); sb.Objects[a] /= new RantObject(b); } @@ -1168,6 +1271,7 @@ private static void ModVal(Sandbox sb, double a, double b) [RantFunction("vmod")] private static void ModVar(Sandbox sb, string a, double b) { + // ReSharper disable once CompareOfFloatsByEqualityOperator if (b == 0.0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-div-by-zero"); sb.Objects[a] %= new RantObject(b); } @@ -1175,10 +1279,8 @@ private static void ModVar(Sandbox sb, string a, double b) [RantFunction("swap")] [RantDescription("Swaps the values of the variables with the two specified names.")] private static void Swap(Sandbox sb, - [RantDescription("The name of the first variable.")] - string a, - [RantDescription("The name of the second variable.")] - string b) + [RantDescription("The name of the first variable.")] string a, + [RantDescription("The name of the second variable.")] string b) { var temp = sb.Objects[a]; sb.Objects[a] = sb.Objects[b]; @@ -1357,38 +1459,15 @@ private static IEnumerator<RST> IfNot(Sandbox sb, bool condition, RST body) [RantFunction("if")] private static IEnumerator<RST> If(Sandbox sb, bool condition, RST body, RST elseBody) { - if (condition) - { - yield return body; - } - else - { - yield return elseBody; - } + yield return condition ? body : elseBody; } [RantFunction("ifnot", "ifn")] private static IEnumerator<RST> IfNot(Sandbox sb, bool condition, RST body, RST elseBody) { - if (!condition) - { - yield return body; - } - else - { - yield return elseBody; - } + yield return !condition ? body : elseBody; } - [RantFunction("at")] - [RantDescription("Prints the character at the specified position in the input. Throws an exception if the position is outside of the string.")] - private static void At(Sandbox sb, - [RantDescription("The input string.")] string input, - [RantDescription("The position of the character to find.")] int pos) - { - if (pos < 0 || pos > input.Length) - throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-string-index", pos); - sb.Print(input.Substring(pos, 1)); - } + #endregion } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index a85e8aa..8109f30 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -188,6 +188,26 @@ public object Value } } + internal object PrintableValue + { + get + { + switch (Type) + { + case RantObjectType.Null: + return null; + case RantObjectType.Boolean: + return _boolean; + case RantObjectType.Number: + return _number; + case RantObjectType.String: + return _string; + default: + return ToString(); + } + } + } + /// <summary> /// Gets or sets the object at the specified index in the object. /// Only works with list objects. From d306acffa74270cc6f20182527bd24689a2d676a Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Sun, 9 Apr 2017 22:48:55 -0500 Subject: [PATCH 186/213] Add carrier component support to query-builders --- Rant/Core/Constructs/QueryBuilder.cs | 15 ++++++++++++ Rant/Core/Framework/RantFunctionRegistry.cs | 27 ++++++++++++++++++--- Rant/Vocabulary/ClassCache.cs | 19 ++++++++++++++- Samples/santa.rant | 4 +-- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/Rant/Core/Constructs/QueryBuilder.cs b/Rant/Core/Constructs/QueryBuilder.cs index 7fac9c8..b3df03c 100644 --- a/Rant/Core/Constructs/QueryBuilder.cs +++ b/Rant/Core/Constructs/QueryBuilder.cs @@ -1,5 +1,8 @@ using Rant.Vocabulary.Querying; using System.Collections.Generic; +using System.Linq; + +using Rant.Core.Compiler.Syntax; namespace Rant.Core.Constructs { @@ -23,5 +26,17 @@ public Query GetQuery(string name) } return _activeQuery = q; } + + public void ResetQuery(string name) + { + _queries.Remove(name); + } + + public IEnumerator<RST> RunQuery(Sandbox sb, string id) + { + if (!_queries.TryGetValue(id, out Query q)) yield break; + var action = q.Run(sb); + while (action.MoveNext()) yield return action.Current; + } } } diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 933012b..e0479f0 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -500,7 +500,7 @@ private static void ReverseEx(Sandbox sb, [RantDescription("Infers and prints the plural form of the specified word.")] private static void Plural(Sandbox sb, string word) => sb.Print(sb.Format.Pluralizer.Pluralize(word)); - [RantFunction("quote", "q")] + [RantFunction("quote", "quot")] [RantDescription( "Surrounds the specified pattern in quotes. Nested quotes use the secondary quotes defined in the format settings.")] private static IEnumerator<RST> Quote(Sandbox sb, @@ -1038,12 +1038,18 @@ private static void ResetCarrier(Sandbox sb, } } - [RantFunction("query")] + [RantFunction("query", "q")] private static IEnumerator<RST> QueryRun(Sandbox sb) { return sb.QueryBuilder.CurrentQuery?.Run(sb); } + [RantFunction("query", "q")] + private static IEnumerator<RST> QueryRun(Sandbox sb, string id) + { + return sb.QueryBuilder.RunQuery(sb, id); + } + [RantFunction("qname")] private static void QueryName(Sandbox sb, string id, string name) { @@ -1073,8 +1079,7 @@ private static void QueryClassFilterPositive(Sandbox sb, string id, params strin private static void QueryClassFilterNegative(Sandbox sb, string id, params string[] classes) { Query q; - ClassFilter cf; - cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; + var cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; if (cf == null) q.AddFilter(cf = new ClassFilter()); foreach (string cl in classes) { @@ -1082,6 +1087,20 @@ private static void QueryClassFilterNegative(Sandbox sb, string id, params strin } } + [RantFunction("qcc")] + private static void QueryCarrierComponent(Sandbox sb, string id, string componentId, CarrierComponentType componentType) + { + if (!Util.ValidateName(componentId)) throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-ccid", componentId); + var q = sb.QueryBuilder.GetQuery(id); + (q.Carrier ?? (q.Carrier = new Carrier())).AddComponent(componentType, componentId); + } + + [RantFunction("qreset")] + private static void QueryDelete(Sandbox sb, string id) + { + sb.QueryBuilder.ResetQuery(id); + } + #endregion #region Variables diff --git a/Rant/Vocabulary/ClassCache.cs b/Rant/Vocabulary/ClassCache.cs index 136d10b..15ad6de 100644 --- a/Rant/Vocabulary/ClassCache.cs +++ b/Rant/Vocabulary/ClassCache.cs @@ -140,7 +140,24 @@ public IEnumerable<RantDictionaryEntry> Filter(IEnumerable<ClassFilterRule> rule // Apply filters by intersecting pools for (int i = startIndex; i < ruleArray.Length; i++) { - set.IntersectWith(ruleArray[i].ShouldMatch ? _cache[ruleArray[i].Class] : _invCache[ruleArray[i].Class]); + if (ruleArray[i].ShouldMatch) + { + if (_cache.TryGetValue(ruleArray[i].Class, out setCached)) + { + set.IntersectWith(setCached); + } + else + { + return null; + } + } + else + { + if (_invCache.TryGetValue(ruleArray[i].Class, out setCached)) + { + set.IntersectWith(setCached); + } + } } return set; diff --git a/Samples/santa.rant b/Samples/santa.rant index 34b8486..4f3059f 100644 --- a/Samples/santa.rant +++ b/Samples/santa.rant @@ -28,7 +28,7 @@ More <adj> than <noun.pl-animal> <pro.dposs::@?santa> <noun.pl> they came,\n And he <verb.ed-intransitive>, and <verb.ed-intransitive>, and called them by name;\n \n - [q:Now, <name::!d>! now, <name::!d>! now, <name::!d> and <name::!d>!\n + [quot:Now, <name::!d>! now, <name::!d>! now, <name::!d> and <name::!d>!\n On, <name::!d>! on, <name::!d>! on, <name::!d> and <name::!d>!\n To the [$side] of the <noun-place>! to the [$side] of the <noun-place>!\n Now <verb-intransitive::=dash> away! <verb::=dash> away! <verb::=dash> away{\sall|(.1), you {<noun.pl-job>|<noun>-[pl:<verb.er>]}}!]\n @@ -71,5 +71,5 @@ <pro::@?santa> sprang to <pro.dposs::@?santa> sleigh, to <pro.dposs::@?santa> team gave a <noun-sound>,\n And away they all flew like the <noun> of a <noun>.\n But I heard <pro.acc::@?santa> exclaim, ‘ere <pro::@?santa> drove out of sight,\n - [q:{Happy|<adj>} <noun::=holiday> to all, and to all a good-[`\s+`:<noun-timeofday::=time>;-]!] + [quot:{Happy|<adj>} <noun::=holiday> to all, and to all a good-[`\s+`:<noun-timeofday::=time>;-]!] } \ No newline at end of file From 2b23ac1c59c22173a21f0d2dfc892c234297e452 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Mon, 10 Apr 2017 01:10:18 -0500 Subject: [PATCH 187/213] Add more query builder functions; make mode/flag error messages more helpful --- Rant/Core/Compiler/Syntax/RstFunction.cs | 4 +- Rant/Core/Framework/RantFunctionRegistry.cs | 129 ++++++++++++++++++-- Rant/Core/Utilities/Util.cs | 43 +++++-- Rant/Localization/de-DE.lang | 4 +- Rant/Localization/en-US.lang | 4 +- 5 files changed, 158 insertions(+), 26 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index 65f28b7..ebecf19 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -140,7 +140,7 @@ public override IEnumerator<RST> Run(Sandbox sb) string strMode = sb.Return().Main; if (!Util.TryParseEnum(p.NativeType, strMode, out object value)) { - throw new RantRuntimeException(sb, _args[i].Location, "err-runtime-unknown-mode", strMode); + throw new RantRuntimeException(sb, _args[i].Location, "err-runtime-unknown-mode", strMode, Util.GetEnumListString(p.NativeType)); } args[i] = value; break; @@ -158,7 +158,7 @@ public override IEnumerator<RST> Run(Sandbox sb) { if (!Util.TryParseEnum(enumType, flag, out object value)) { - throw new RantRuntimeException(sb, _args[i].Location, "err-runtime-unknown-flag", flag); + throw new RantRuntimeException(sb, _args[i].Location, "err-runtime-unknown-flag", flag, Util.GetEnumListString(enumType)); } flags |= Convert.ToInt64(value); } diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index e0479f0..c371946 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -28,6 +28,7 @@ using System.Globalization; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using Rant.Core.Compiler.Syntax; using Rant.Core.Constructs; @@ -1039,31 +1040,61 @@ private static void ResetCarrier(Sandbox sb, } [RantFunction("query", "q")] + [RantDescription("Runs the last-accessed constructed query.")] private static IEnumerator<RST> QueryRun(Sandbox sb) { return sb.QueryBuilder.CurrentQuery?.Run(sb); } [RantFunction("query", "q")] - private static IEnumerator<RST> QueryRun(Sandbox sb, string id) + [RantDescription("Runs the constructed query with the specified identifier.")] + private static IEnumerator<RST> QueryRun(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id) { return sb.QueryBuilder.RunQuery(sb, id); } [RantFunction("qname")] - private static void QueryName(Sandbox sb, string id, string name) + [RantDescription("Sets the table name for a constructed query.")] + private static void QueryName(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The name of the table.")] + string name) { sb.QueryBuilder.GetQuery(id).Name = name; } [RantFunction("qsub")] - private static void QuerySubtype(Sandbox sb, string id, string name) + [RantDescription("Sets the subtype for a constructed query.")] + private static void QuerySubtype(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The subtype of the term to select from the returned entry.")] + string subtype) { - sb.QueryBuilder.GetQuery(id).Subtype = name; + sb.QueryBuilder.GetQuery(id).Subtype = subtype; + } + + [RantFunction("qsubp")] + [RantDescription("Sets the plural subtype for a constructed query.")] + private static void QueryPluralSubtype(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The subtype of the term to select from the returned entry, if the plural flag is set.")] + string pluralSubtype) + { + sb.QueryBuilder.GetQuery(id).PluralSubtype = pluralSubtype; } [RantFunction("qcf")] - private static void QueryClassFilterPositive(Sandbox sb, string id, params string[] classes) + [RantDescription("Adds positive class filters to a constructed query.")] + private static void QueryClassFilterPositive(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The names of the classes that the returned entry must belong to.")] + params string[] classes) { Query q; ClassFilter cf; @@ -1076,7 +1107,12 @@ private static void QueryClassFilterPositive(Sandbox sb, string id, params strin } [RantFunction("qcfn")] - private static void QueryClassFilterNegative(Sandbox sb, string id, params string[] classes) + [RantDescription("Adds negative class filters to a constructed query.")] + private static void QueryClassFilterNegative(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The names of the classes that the returned entry must not belong to.")] + params string[] classes) { Query q; var cf = (q = sb.QueryBuilder.GetQuery(id)).GetNonClassFilters().FirstOrDefault(f => f is ClassFilter) as ClassFilter; @@ -1088,7 +1124,14 @@ private static void QueryClassFilterNegative(Sandbox sb, string id, params strin } [RantFunction("qcc")] - private static void QueryCarrierComponent(Sandbox sb, string id, string componentId, CarrierComponentType componentType) + [RantDescription("Adds a carrier component to a constructed query.")] + private static void QueryCarrierComponent(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The ID to assign to the carrier component.")] + string componentId, + [RantDescription("The component type.")] + CarrierComponentType componentType) { if (!Util.ValidateName(componentId)) throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-ccid", componentId); var q = sb.QueryBuilder.GetQuery(id); @@ -1096,11 +1139,81 @@ private static void QueryCarrierComponent(Sandbox sb, string id, string componen } [RantFunction("qreset")] - private static void QueryDelete(Sandbox sb, string id) + [RantDescription("Removes all stored data associated with the specified constructed query ID.")] + private static void QueryDelete(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id) { sb.QueryBuilder.ResetQuery(id); } + [RantFunction("qregf")] + [RantDescription("Adds a positive regex filter to a constructed query.")] + private static void QueryRegexFilter(Sandbox sb, string id, string regexPattern, string options) + { + Regex regex; + try + { + regex = new Regex(regexPattern, Util.GetRegexOptionsFromString(options)); + } + catch (Exception ex) + { + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-regex", ex.Message); + } + sb.QueryBuilder.GetQuery(id).AddFilter(new RegexFilter(regex, true)); + } + + [RantFunction("qregfn")] + [RantDescription("Adds a positive regex filter to a constructed query.")] + private static void QueryNegativeRegexFilter(Sandbox sb, string id, string regexPattern, string options) + { + Regex regex; + try + { + regex = new Regex(regexPattern, Util.GetRegexOptionsFromString(options)); + } + catch (Exception ex) + { + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-regex", ex.Message); + } + sb.QueryBuilder.GetQuery(id).AddFilter(new RegexFilter(regex, false)); + } + + [RantFunction("qsylf")] + [RantDescription("Adds an syllable count range filter to a constructed query that defines an absolute syllable count.")] + private static void QuerySyllableFilterAbsolute(Sandbox sb, string id, int syllables) + { + if (syllables < 1) throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-abs", syllables); + sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(syllables, syllables)); + } + + [RantFunction("qsylf")] + [RantDescription("Adds a syllable count range filter to a constructed query.")] + private static void QuerySyllableFilterRange(Sandbox sb, string id, int minSyllables, int maxSyllables) + { + if (minSyllables < 1 || maxSyllables < 1 || minSyllables > maxSyllables) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-range", minSyllables, maxSyllables); + sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(minSyllables, maxSyllables)); + } + + [RantFunction("qsylminf")] + [RantDescription("Adds a syllable count range filter to a constructed query that defines only a minimum bound.")] + private static void QuerySyllableFilterMin(Sandbox sb, string id, int minSyllables) + { + if (minSyllables < 1) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-min", minSyllables); + sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(minSyllables, null)); + } + + [RantFunction("qsylmaxf")] + [RantDescription("Adds a syllable count range filter to a constructed query that defines only a maximum bound.")] + private static void QuerySyllableFilterMax(Sandbox sb, string id, int maxSyllables) + { + if (maxSyllables < 1) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-max", maxSyllables); + sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(null, maxSyllables)); + } + #endregion #region Variables diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index b7df30f..36ea7e2 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -336,24 +336,24 @@ public static string CamelToSnake(string camelName) return sb.ToString(); } - public static Regex ParseRegex(string regexLiteral) - { - if (string.IsNullOrEmpty(regexLiteral)) - throw new ArgumentException($"Argument '{nameof(regexLiteral)}' cannot be null nor empty."); - bool noCase = regexLiteral.EndsWith("i"); - string literal = regexLiteral.TrimEnd('i'); - if (!literal.StartsWith("`") || !literal.EndsWith("`")) - throw new FormatException("Regex literal was not in the correct format."); - - return new Regex(literal.Substring(1, literal.Length - 2), - (noCase ? RegexOptions.IgnoreCase : RegexOptions.None) | RegexOptions.ExplicitCapture | RegexOptions.Compiled); - } + public static string GetEnumListString(Type enumType) + { + if (!enumType.IsEnum) return String.Empty; + var sb = new StringBuilder(); + foreach (var name in Enum.GetNames(enumType).OrderBy(str => str).Select(CamelToSnake)) + { + if (sb.Length > 0) sb.Append(", "); + sb.Append(name); + } + return sb.ToString(); + } #if !UNITY [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public static bool ValidateName(string input) { + // ReSharper disable once ReplaceWithStringIsNullOrEmpty return input != null && input.Length > 0 && input.All(c => char.IsLetterOrDigit(c) || c == '_'); } @@ -456,5 +456,24 @@ public static bool TryParseSurrogatePair(string value, out char highSurrogate, o return true; } + + public static RegexOptions GetRegexOptionsFromString(string optionsString) + { + RegexOptions options = RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture; + if (IsNullOrWhiteSpace(optionsString)) return options; + for (int i = 0; i < optionsString.Length; i++) + { + switch (optionsString[i]) + { + case 'i': + options |= RegexOptions.IgnoreCase; + break; + case 'm': + options |= RegexOptions.Multiline; + break; + } + } + return options; + } } } \ No newline at end of file diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index 2381e49..abcb13d 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -39,7 +39,7 @@ err-stack-overflow = "Ein Stapelüberlauf ist aufgetreten." err-generic-runtime = "Ein unspezifizierter Laufzeitfehler ist aufgetreten." err-generic-compiler = "Ein unspezifizierter Erstellungsfehler ist aufgetreten." -err-unknown-flag = "Unbekannter Flagwert gefunden: '{0}'" +err-unknown-flag = "Unbekannter Flagwert gefunden: '{0}'. Gültige Werte für diesen Parameter: {1}" compiler-errors-found = "{0} Erstellungsfehler sind aufgetreten:" compiler-errors-also-found = "{0} weitere Erstellungsfehler sind aufgetreten:" @@ -73,7 +73,7 @@ err-runtime-invalid-arg = "Der Wert '{0}' ist für den Parameter '{1}' ungültig err-runtime-missing-subroutine = "Das Unterprogramm '{0}' konnte nicht gefunden werden." err-runtime-subarg-mismatch = "Die angegebenen Argumenten passen an die Signatur des Unterprogramms [${0}] nicht an." err-runtime-unknown-flag = "Unbekannter Schalter: '{0}'" -err-runtime-unknown-mode = "Unbekannter Modus: '{0}'" +err-runtime-unknown-mode = "Unbekannter Modus: '{0}'. Gültige Werte für diesen Parameter: {1}" err-runtime-invalid-string-index = "Der angegebene Index '{0}' liegt außerhalb der Zeichenkette." acc-carrier-name = "Anfragezustandspeichernamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index eab0287..b551cf6 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -39,7 +39,7 @@ err-stack-overflow = "Exceeded the maximum stack size." err-generic-runtime = "An unspecified runtime error was encountered." err-generic-compiler = "An unspecified compiler error was encountered." -err-unknown-flag = "Unknown flag value: '{0}'" +err-unknown-flag = "Unknown flag value: '{0}'. Valid values for this parameter are: {1}" compiler-errors-found = "{0} compiler errors found:" compiler-errors-also-found = "{0} compiler errors also found:" @@ -79,7 +79,7 @@ err-runtime-invalid-arg = "The value '{0}' is not valid for the parameter '{1}' err-runtime-missing-subroutine = "The subroutine '{0}' could not be found." err-runtime-subarg-mismatch = "The provided arguments do not match the signature of the subroutine [${0}]." err-runtime-unknown-flag = "Unknown flag name: '{0}'" -err-runtime-unknown-mode = "Unknown mode name: '{0}'" +err-runtime-unknown-mode = "Unknown mode name: '{0}'. Valid values for this parameter are: {1}" err-runtime-invalid-string-index = "Index in string is not valid: {0}" acc-carrier-name = "carrier name" From e21f4941bcffa5af9577da8756b8a47837e54b57 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Mon, 10 Apr 2017 13:31:16 -0500 Subject: [PATCH 188/213] Add list functions --- Rant/Core/Compiler/Syntax/RstFunction.cs | 15 +- Rant/Core/Framework/RantFunctionRegistry.cs | 291 ++++- Rant/Core/ObjectModel/RantObject.cs | 1055 ++++++++++--------- Rant/Core/ObjectModel/RantObjectType.cs | 5 - Rant/Core/Utilities/Util.cs | 3 +- Rant/RantRuntimeException.cs | 11 +- 6 files changed, 843 insertions(+), 537 deletions(-) diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index ebecf19..6bcaddb 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -85,12 +85,15 @@ public override IEnumerator<RST> Run(Sandbox sb) // RantObjects are evaluated and fetched by name case RantFunctionParameterType.RantObject: - sb.AddOutputWriter(); - yield return _args[i]; - args[i] = sb.Objects[sb.Return().Main]; - break; - - // Numbers are evaluated, verified, and converted + { + sb.AddOutputWriter(); + yield return _args[i]; + var name = sb.Return().Main; + args[i] = sb.Objects[name] ?? throw new RantRuntimeException(sb, _args[i], "err-runtime-missing-var", name); + break; + } + + // Numbers are evaluated, verified, and converted case RantFunctionParameterType.Number: { sb.AddOutputWriter(); diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index c371946..eeab756 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1218,6 +1218,295 @@ private static void QuerySyllableFilterMax(Sandbox sb, string id, int maxSyllabl #region Variables + [RantFunction("vexists")] + [RantDescription("Prints a boolean value indicating whether a variable with the specified name exists.")] + private static void VarExists(Sandbox sb, + [RantDescription("The name of the variable to check.")] + string name) + { + sb.Print(sb.Objects[name] == null ? FALSE : TRUE); + } + + [RantFunction("vl")] + [RantDescription("Creates a new list.")] + private static void VariableList(Sandbox sb, + [RantDescription("The name of the list.")] + string name) + { + sb.Objects[name] = new RantObject(new List<RantObject>()); + } + + [RantFunction("vl")] + [RantDescription("Creates a new list with a specified length.")] + private static void VariableList(Sandbox sb, + [RantDescription("The name of the list.")] + string name, + [RantDescription("The length of the list.")] + int length) + { + if (length < 0) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-invalid-length", length); + sb.Objects[name] = new RantObject(Enumerable.Repeat<RantObject>(null, length).ToList()); + } + + [RantFunction("ladd", "ladds")] + [RantDescription("Adds a string to a list.")] + private static void ListAdd(Sandbox sb, + [RantDescription("The list to add to.")] + RantObject listObj, + [RantDescription("The string to add.")] + string value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Add(new RantObject(value)); + } + + [RantFunction("laddn")] + [RantDescription("Adds a number to a list.")] + private static void ListAddNumber(Sandbox sb, + [RantDescription("The list to add to.")] + RantObject listObj, + [RantDescription("The number to add.")] + double value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Add(new RantObject(value)); + } + + [RantFunction("laddp")] + [RantDescription("Adds a pattern to a list.")] + private static void ListAddPattern(Sandbox sb, + [RantDescription("The list to add to.")] + RantObject listObj, + [RantDescription("The pattern to add.")] + RST value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Add(new RantObject(value)); + } + + [RantFunction("laddv")] + [RantDescription("Adds a variable to a list.")] + private static void ListAddPattern(Sandbox sb, + [RantDescription("The list to add to.")] + RantObject listObj, + [RantDescription("The variable to add.")] + RantObject value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Add(value); + } + + [RantFunction("lpre", "lpres")] + [RantDescription("Prepends a string to a list.")] + private static void ListPrepend(Sandbox sb, RantObject listObj, string value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Insert(0, new RantObject(value)); + } + + [RantFunction("lpren")] + [RantDescription("Prepends a number to a list.")] + private static void ListPrependNumber(Sandbox sb, RantObject listObj, double value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Insert(0, new RantObject(value)); + } + + [RantFunction("lprep")] + [RantDescription("Prepends a pattern to a list.")] + private static void ListPrependPattern(Sandbox sb, RantObject listObj, RST value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Insert(0, new RantObject(value)); + } + + [RantFunction("lget")] + [RantDescription("Prints a list item from the specified index.")] + private static void ListGet(Sandbox sb, RantObject listObj, int index) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index >= list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + sb.Print(list[index].PrintableValue); + } + + [RantFunction("lset")] + [RantDescription("Sets the item at a specified index in a list.")] + private static void ListSet(Sandbox sb, RantObject listObj, int index, string value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index >= list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list[index] = new RantObject(value); + } + + [RantFunction("lsetn")] + [RantDescription("Sets the item at a specified index in a list to a number.")] + private static void ListSetNumber(Sandbox sb, RantObject listObj, int index, double value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index >= list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list[index] = new RantObject(value); + } + + [RantFunction("lsetp")] + [RantDescription("Sets the item at a specified index in a list to a pattern.")] + private static void ListSetPattern(Sandbox sb, RantObject listObj, int index, RST value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index >= list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list[index] = new RantObject(value); + } + + [RantFunction("lsetv")] + [RantDescription("Sets the item at a specified index in a list to a variable.")] + private static void ListSetVar(Sandbox sb, RantObject listObj, int index, RantObject value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index >= list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list[index] = value; + } + + [RantFunction("lins")] + [RantDescription("Inserts a string at the specified index in a list.")] + private static void ListInsert(Sandbox sb, RantObject listObj, int index, string value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index > list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list.Insert(index, new RantObject(value)); + } + + [RantFunction("linsn")] + [RantDescription("Inserts a number at the specified index in a list.")] + private static void ListInsert(Sandbox sb, RantObject listObj, int index, double value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index > list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list.Insert(index, new RantObject(value)); + } + + [RantFunction("linsp")] + [RantDescription("Inserts a pattern at the specified index in a list.")] + private static void ListInsertPattern(Sandbox sb, RantObject listObj, int index, RST value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index > list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list.Insert(index, new RantObject(value)); + } + + [RantFunction("linv")] + [RantDescription("Inserts a variable at the specified index in a list.")] + private static void ListInsertVar(Sandbox sb, RantObject listObj, int index, RantObject value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index > list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + list.Insert(index, value); + } + + [RantFunction("lfind")] + [RantDescription("Searches a list for the specified value and prints the index if found. Otherwise, prints -1.")] + private static void ListFind(Sandbox sb, RantObject listObj, string value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + for (int i = 0; i < list.Count; i++) + { + if (String.Equals(list[i].PrintableValue.ToString(), value, StringComparison.Ordinal)) + { + sb.Print(i); + return; + } + } + sb.Print(-1); + } + + [RantFunction("lfindv")] + [RantDescription("Searches a list for the specified variable and prints the index if found. Otherwise, prints -1.")] + private static void ListFind(Sandbox sb, RantObject listObj, RantObject value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + for (int i = 0; i < list.Count; i++) + { + if (list[i] == value) + { + sb.Print(i); + return; + } + } + sb.Print(-1); + } + + [RantFunction("lfindi")] + [RantDescription("Searches a list for the specified value, ignoring case, and prints the index if found. Otherwise, prints -1.")] + private static void ListFindIgnoreCase(Sandbox sb, RantObject listObj, string value) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + for (int i = 0; i < list.Count; i++) + { + if (String.Equals(list[i].PrintableValue.ToString(), value, StringComparison.OrdinalIgnoreCase)) + { + sb.Print(i); + return; + } + } + sb.Print(-1); + } + + [RantFunction("lclr")] + [RantDescription("Clears the specified list.")] + private static void ListClear(Sandbox sb, RantObject listObj) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + list.Clear(); + } + + [RantFunction("lpop")] + [RantDescription("Removes the last item from a list.")] + private static void ListPop(Sandbox sb, RantObject listObj) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (list.Count == 0) return; + list.RemoveAt(list.Count - 1); + } + + [RantFunction("lpopf")] + [RantDescription("Removes the first item from a list.")] + private static void ListPopStart(Sandbox sb, RantObject listObj) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (list.Count == 0) return; + list.RemoveAt(0); + } + + [RantFunction("lcpy")] + [RantDescription("Copies an item from a list into a variable.")] + private static void ListCopyItemToVar(Sandbox sb, RantObject listObj, int index, string variable) + { + var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + if (index < 0 || index >= list.Count) throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-index-out-of-range", list.Count - 1, index); + sb.Objects[variable] = list[index]; + } + + [RantFunction("lclone")] + [RantDescription("Clones a list to another variable.")] + private static void ListCopy(Sandbox sb, RantObject listObj, string variable) + { + if (listObj.Type != RantObjectType.List) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + sb.Objects[variable] = listObj.Clone(); + } + + [RantFunction("vlen")] + [RantDescription("Gets the length of the specified variable.")] + private static void VariableLength(Sandbox sb, RantObject obj) + { + sb.Print(obj.Length); + } + + [RantFunction("typeof")] + [RantDescription("Gets the type of the specified variable.")] + private static void GetVariableType(Sandbox sb, string name) + { + sb.Print(Util.CamelToSnake(sb.Objects[name]?.Type.ToString() ?? "???")); + } + [RantFunction("rvr")] [RantDescription("Rotates the values of a list of variables once to the right.")] private static void RotateVariablesRight(Sandbox sb, @@ -1261,7 +1550,7 @@ private static void VariableSet(Sandbox sb, [RantDescription("The name of the variable.")] string name, [RantDescription("The value of the variable.")] bool value) { - sb.Objects[name] = new RantObject(value); + sb.Objects[name] = value ? RantObject.True : RantObject.False; } [RantFunction("vn")] diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index 8109f30..6794057 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -32,525 +32,548 @@ namespace Rant.Core.ObjectModel { - /// <summary> - /// Represents a Rant variable. - /// </summary> - public sealed class RantObject - { - /// <summary> - /// Null - /// </summary> - public static readonly RantObject Null = new RantObject(); - - private bool _boolean = false; - private List<RantObject> _list = null; - private double _number = 0; - private RantProgram _pattern = null; - private RST _rst = null; - private string _string = null; - - /// <summary> - /// Creates a No object. - /// </summary> - public RantObject() - { - } - - /// <summary> - /// Creates a new RantObject instance with a list value. - /// </summary> - /// <param name="list">The list to assign to the object.</param> - public RantObject(List<RantObject> list) - { - if (list == null) return; - Type = RantObjectType.List; - _list = list; - } - - /// <summary> - /// Creates a new RantObject instance with a boolean value. - /// </summary> - /// <param name="boolean">The boolean value to assign to the object.</param> - public RantObject(bool boolean) - { - Type = RantObjectType.Boolean; - _boolean = boolean; - } - - /// <summary> - /// Creates a new RantObject instance with a string value. - /// </summary> - /// <param name="str">The string to assign to the object.</param> - public RantObject(string str) - { - if (str == null) return; - Type = RantObjectType.String; - _string = str; - } - - /// <summary> - /// Creates a new RantObject instance with a decimal number value. - /// </summary> - /// <param name="num">The number to assign to the object.</param> - public RantObject(double num) - { - Type = RantObjectType.Number; - _number = num; - } - - internal RantObject(RST rst) - { - Type = RantObjectType.Action; - _rst = rst; - } - - /// <summary> - /// Creates a new RantObject instance from the specified object. - /// </summary> - /// <param name="obj">The value to assign to the object.</param> - public RantObject(object obj) - { - if (obj == null) return; - - if (obj is string) - { - _string = obj.ToString(); - Type = RantObjectType.String; - } - else if (obj is bool) - { - _boolean = (bool)obj; - Type = RantObjectType.Boolean; - } - else if (IsNumber(obj)) - { - _number = (double)obj; - Type = RantObjectType.Number; - } - else if (obj is List<RantObject>) - { - _list = (List<RantObject>)obj; - Type = RantObjectType.List; - } - else if (obj.GetType().IsArray) - { - _list = ((object[])obj).Select(o => new RantObject(o)).ToList(); - Type = RantObjectType.List; - } - else if (obj is RantProgram) - _pattern = (RantProgram)obj; - else if (obj is RST) - { - _rst = (RST)obj; - Type = RantObjectType.Action; - } - } - - /// <summary> - /// Creates a new RantObject with the specified object type and a default value. - /// </summary> - /// <param name="type">The type of object to create.</param> - public RantObject(RantObjectType type) - { - Type = type; - } - - /// <summary> - /// The type of the object. - /// </summary> - public RantObjectType Type { get; private set; } = RantObjectType.Null; - - /// <summary> - /// The value of the object. - /// </summary> - public object Value - { - get - { - switch (Type) - { - case RantObjectType.Null: - return null; - case RantObjectType.Boolean: - return _boolean; - case RantObjectType.Number: - return _number; - case RantObjectType.Pattern: - return _pattern; - case RantObjectType.String: - return _string; - case RantObjectType.List: - return _list; - case RantObjectType.Action: - return _rst; - } - return null; - } - } - - internal object PrintableValue - { - get - { + /// <summary> + /// Represents a Rant variable. + /// </summary> + public sealed class RantObject + { + /// <summary> + /// Null + /// </summary> + public static readonly RantObject Null = new RantObject(); + + /// <summary> + /// True + /// </summary> + public static readonly RantObject True = new RantObject(true); + + /// <summary> + /// False + /// </summary> + public static readonly RantObject False = new RantObject(false); + + private bool _boolean = false; + private List<RantObject> _list = null; + private double _number = 0; + private RST _rst = null; + private string _string = null; + + /// <summary> + /// Creates a null object. + /// </summary> + public RantObject() + { + } + + /// <summary> + /// Creates a new RantObject instance with a list value. + /// </summary> + /// <param name="list">The list to assign to the object.</param> + public RantObject(List<RantObject> list) + { + if (list == null) return; + Type = RantObjectType.List; + _list = list; + } + + /// <summary> + /// Creates a new RantObject instance with a boolean value. + /// </summary> + /// <param name="boolean">The boolean value to assign to the object.</param> + public RantObject(bool boolean) + { + Type = RantObjectType.Boolean; + _boolean = boolean; + } + + /// <summary> + /// Creates a new RantObject instance with a string value. + /// </summary> + /// <param name="str">The string to assign to the object.</param> + public RantObject(string str) + { + if (str == null) return; + Type = RantObjectType.String; + _string = str; + } + + /// <summary> + /// Creates a new RantObject instance with a decimal number value. + /// </summary> + /// <param name="num">The number to assign to the object.</param> + public RantObject(double num) + { + Type = RantObjectType.Number; + _number = num; + } + + internal RantObject(RST rst) + { + Type = RantObjectType.Action; + _rst = rst; + } + + /// <summary> + /// Creates a new RantObject instance from the specified object. + /// </summary> + /// <param name="obj">The value to assign to the object.</param> + public RantObject(object obj) + { + if (obj == null) return; + + if (obj is string) + { + _string = obj.ToString(); + Type = RantObjectType.String; + } + else if (obj is bool) + { + _boolean = (bool)obj; + Type = RantObjectType.Boolean; + } + else if (IsNumber(obj)) + { + _number = (double)obj; + Type = RantObjectType.Number; + } + else if (obj is List<RantObject>) + { + _list = (List<RantObject>)obj; + Type = RantObjectType.List; + } + else if (obj.GetType().IsArray) + { + _list = ((object[])obj).Select(o => new RantObject(o)).ToList(); + Type = RantObjectType.List; + } + else if (obj is RST) + { + _rst = (RST)obj; + Type = RantObjectType.Action; + } + } + + /// <summary> + /// Creates a new RantObject with the specified object type and a default value. + /// </summary> + /// <param name="type">The type of object to create.</param> + public RantObject(RantObjectType type) + { + Type = type; + } + + /// <summary> + /// The type of the object. + /// </summary> + public RantObjectType Type { get; private set; } = RantObjectType.Null; + + /// <summary> + /// The value of the object. + /// </summary> + public object Value + { + get + { switch (Type) - { - case RantObjectType.Null: - return null; - case RantObjectType.Boolean: - return _boolean; - case RantObjectType.Number: - return _number; - case RantObjectType.String: - return _string; + { + case RantObjectType.Null: + return null; + case RantObjectType.Boolean: + return _boolean; + case RantObjectType.Number: + return _number; + case RantObjectType.String: + return _string; + case RantObjectType.List: + return _list; + case RantObjectType.Action: + return _rst; + } + return null; + } + } + + internal object PrintableValue + { + get + { + switch (Type) + { + case RantObjectType.Null: + return null; + case RantObjectType.Boolean: + return _boolean; + case RantObjectType.Number: + return _number; + case RantObjectType.String: + return _string; default: return ToString(); - } + } + } + } + + /// <summary> + /// Gets the length of the object. For strings, this is the character count. For lists, this is the item count. For all other types, -1 is returned. + /// </summary> + public int Length + { + get + { + switch (Type) + { + case RantObjectType.List: + return _list.Count; + case RantObjectType.String: + return _string.Length; + default: + return -1; + } + } + } + + /// <summary> + /// Gets or sets the object at the specified index in the object. + /// Only works with list objects. + /// </summary> + /// <param name="index">The index of the item to access.</param> + /// <returns></returns> + public RantObject this[int index] + { + get + { + if (Type != RantObjectType.List) return null; + return index >= 0 && index < _list.Count ? _list[index] : null; + } + set + { + if (Type != RantObjectType.List) return; + if (index >= 0 && index < _list.Count) _list[index] = value; + } + } + + /// <summary> + /// Converts the current object to a RantObject of the specified type and returns it. + /// </summary> + /// <param name="type">The object type to convert to.</param> + /// <returns></returns> + public RantObject ConvertTo(RantObjectType type) + { + if (Type == type) return Clone(); + + switch (type) + { + case RantObjectType.String: + { + switch (Type) + { + case RantObjectType.Boolean: + return new RantObject(_boolean.ToString()); + case RantObjectType.Number: + return new RantObject(_number.ToString(CultureInfo.InvariantCulture)); + case RantObjectType.List: + { + var sb = new StringBuilder(); + bool first = true; + sb.Append("("); + foreach (var rantObject in _list) + { + if (first) + { + first = false; + sb.Append(", "); + } + + sb.Append(rantObject); + } + sb.Append(")"); + return new RantObject(sb.ToString()); + } + } + break; + } + case RantObjectType.Number: + { + switch (Type) + { + case RantObjectType.Boolean: + return new RantObject(_boolean ? 1 : 0); + case RantObjectType.String: + { + return double.TryParse(_string, out double num) ? new RantObject(num) : Null; + } + } + break; + } + case RantObjectType.Boolean: + { + switch (Type) + { + case RantObjectType.Number: + return new RantObject(_number != 0); + case RantObjectType.String: + { + string bstr = _string.ToLower().Trim(); + switch (bstr) + { + case "true": + return new RantObject(true); + case "false": + return new RantObject(false); + } + break; + } + } + break; + } + case RantObjectType.List: + { + return new RantObject(new List<RantObject> { this }); + } } - } - - /// <summary> - /// Gets or sets the object at the specified index in the object. - /// Only works with list objects. - /// </summary> - /// <param name="index">The index of the item to access.</param> - /// <returns></returns> - public RantObject this[int index] - { - get - { - if (Type != RantObjectType.List) return null; - return index >= 0 && index < _list.Count ? _list[index] : null; - } - set - { - if (Type != RantObjectType.List) return; - if (index >= 0 && index < _list.Count) _list[index] = value; - } - } - - /// <summary> - /// Converts the current object to a RantObject of the specified type and returns it. - /// </summary> - /// <param name="type">The object type to convert to.</param> - /// <returns></returns> - public RantObject ConvertTo(RantObjectType type) - { - if (Type == type) return Clone(); - - switch (type) - { - case RantObjectType.String: - { - switch (Type) - { - case RantObjectType.Boolean: - return new RantObject(_boolean.ToString()); - case RantObjectType.Number: - return new RantObject(_number.ToString(CultureInfo.InvariantCulture)); - case RantObjectType.Pattern: - return new RantObject(_pattern.Code); - case RantObjectType.List: - { - var sb = new StringBuilder(); - bool first = true; - sb.Append("("); - foreach (var rantObject in _list) - { - if (first) - { - first = false; - sb.Append(", "); - } - - sb.Append(rantObject); - } - sb.Append(")"); - return new RantObject(sb.ToString()); - } - } - break; - } - case RantObjectType.Number: - { - switch (Type) - { - case RantObjectType.Boolean: - return new RantObject(_boolean ? 1 : 0); - case RantObjectType.String: - { - return double.TryParse(_string, out double num) ? new RantObject(num) : Null; + + return Null; + } + + /// <summary> + /// Returns another RantObject instance with the exact same value as the current instance. + /// </summary> + /// <returns></returns> + public RantObject Clone() + { + return new RantObject + { + _boolean = _boolean, + _list = _list?.ToList(), // Create a copy of the list + _number = _number, + _string = _string, + _rst = _rst, + Type = Type + }; + } + + #region Operators + + /// <summary> + /// Gets the boolean inverse of a RantObject. + /// </summary> + /// <param name="a">The object to invert from.</param> + /// <returns></returns> + public static RantObject operator !(RantObject a) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (a.Type) + { + case RantObjectType.Boolean: + return new RantObject(!a._boolean); } - } - break; - } - case RantObjectType.Boolean: - { - switch (Type) - { - case RantObjectType.Number: - return new RantObject(_number != 0); - case RantObjectType.String: - { - string bstr = _string.ToLower().Trim(); - switch (bstr) - { - case "true": - return new RantObject(true); - case "false": - return new RantObject(false); - } - break; - } - } - break; - } - case RantObjectType.List: - { - return new RantObject(new List<RantObject> { this }); - } - } - - return Null; - } - - /// <summary> - /// Returns another RantObject instance with the exact same value as the current instance. - /// </summary> - /// <returns></returns> - public RantObject Clone() - { - return new RantObject - { - _boolean = _boolean, - _list = _list?.ToList(), // Create a copy of the list - _number = _number, - _pattern = _pattern, - _string = _string, - _rst = _rst, - Type = Type - }; - } - - /// <summary> - /// Gets the boolean inverse of a RantObject. - /// </summary> - /// <param name="a">The object to invert from.</param> - /// <returns></returns> - public static RantObject operator !(RantObject a) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (a.Type) - { - case RantObjectType.Boolean: - return new RantObject(!a._boolean); - } - break; - } - } - - return Null; - } - - /// <summary> - /// Returns the sum of two RantObjects. - /// </summary> - /// <param name="a">The first object.</param> - /// <param name="b">The second object.</param> - /// <returns></returns> - public static RantObject operator +(RantObject a, RantObject b) - { - switch (a.Type) // TODO: Cover all cases - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number + b._number); - } - break; - } - case RantObjectType.String: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._string + b._number); - case RantObjectType.String: - return new RantObject(a._string + b._string); - } - break; - } - } - - return Null; - } - - /// <summary> - /// Subtracts a RantObject from another. - /// </summary> - /// <param name="a">The object to subtract from.</param> - /// <param name="b">The object to subtract.</param> - /// <returns></returns> - public static RantObject operator -(RantObject a, RantObject b) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number - b._number); - } - break; - } - } - - return Null; - } - - /// <summary> - /// Returns the product of two RantObjects. - /// </summary> - /// <param name="a">The first object.</param> - /// <param name="b">The second object.</param> - /// <returns></returns> - public static RantObject operator *(RantObject a, RantObject b) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number * b._number); - } - break; - } - case RantObjectType.String: - { - switch (b.Type) - { - case RantObjectType.Number: - { - var sb = new StringBuilder(); - int c = (int)b._number; - for (int i = 0; i < c; i++) - sb.Append(a._string); - return new RantObject(sb.ToString()); - } - } - break; - } - } - - return Null; - } - - /// <summary> - /// Divides one RantObject by another. - /// </summary> - /// <param name="a">The object to divide.</param> - /// <param name="b">The object to divide by.</param> - /// <returns></returns> - public static RantObject operator /(RantObject a, RantObject b) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number / b._number); - } - break; - } - } - - return Null; - } - - /// <summary> - /// Mods one RantObject by another. - /// </summary> - /// <param name="a">The object to mod.</param> - /// <param name="b">The object to mod by.</param> - /// <returns></returns> - public static RantObject operator %(RantObject a, RantObject b) - { - switch (a.Type) - { - case RantObjectType.Number: - { - switch (b.Type) - { - case RantObjectType.Number: - return new RantObject(a._number % b._number); - } - break; - } - } - - return Null; - } - - /// <summary> - /// Returns a string representation of the current RantObject. - /// </summary> - /// <returns></returns> - public override string ToString() - { - switch (Type) - { - case RantObjectType.Boolean: - return _boolean ? "true" : "false"; - case RantObjectType.String: - return _string; - case RantObjectType.Null: - return "no"; - case RantObjectType.Undefined: - return "???"; - case RantObjectType.Number: - return _number.ToString(CultureInfo.InvariantCulture); - case RantObjectType.Pattern: - return $"$\"{_pattern.Code}\""; - case RantObjectType.List: - { - var sb = new StringBuilder(); - bool first = true; - sb.Append("("); - foreach (var rantObject in _list) - { - if (!first) sb.Append(", "); - first = false; - sb.Append(rantObject); - } - sb.Append(")"); - return sb.ToString(); - } - } - return Value.ToString(); - } - - private static bool IsNumber(object value) - { - return value is sbyte - || value is byte - || value is short - || value is ushort - || value is int - || value is uint - || value is long - || value is ulong - || value is float - || value is double - || value is decimal; - } - } + break; + } + } + + return Null; + } + + /// <summary> + /// Returns the sum of two RantObjects. + /// </summary> + /// <param name="a">The first object.</param> + /// <param name="b">The second object.</param> + /// <returns></returns> + public static RantObject operator +(RantObject a, RantObject b) + { + switch (a.Type) // TODO: Cover all cases + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number + b._number); + } + break; + } + case RantObjectType.String: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._string + b._number); + case RantObjectType.String: + return new RantObject(a._string + b._string); + } + break; + } + } + + return Null; + } + + /// <summary> + /// Subtracts a RantObject from another. + /// </summary> + /// <param name="a">The object to subtract from.</param> + /// <param name="b">The object to subtract.</param> + /// <returns></returns> + public static RantObject operator -(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number - b._number); + } + break; + } + } + + return Null; + } + + /// <summary> + /// Returns the product of two RantObjects. + /// </summary> + /// <param name="a">The first object.</param> + /// <param name="b">The second object.</param> + /// <returns></returns> + public static RantObject operator *(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number * b._number); + } + break; + } + case RantObjectType.String: + { + switch (b.Type) + { + case RantObjectType.Number: + { + var sb = new StringBuilder(); + int c = (int)b._number; + for (int i = 0; i < c; i++) + sb.Append(a._string); + return new RantObject(sb.ToString()); + } + } + break; + } + } + + return Null; + } + + /// <summary> + /// Divides one RantObject by another. + /// </summary> + /// <param name="a">The object to divide.</param> + /// <param name="b">The object to divide by.</param> + /// <returns></returns> + public static RantObject operator /(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number / b._number); + } + break; + } + } + + return Null; + } + + /// <summary> + /// Mods one RantObject by another. + /// </summary> + /// <param name="a">The object to mod.</param> + /// <param name="b">The object to mod by.</param> + /// <returns></returns> + public static RantObject operator %(RantObject a, RantObject b) + { + switch (a.Type) + { + case RantObjectType.Number: + { + switch (b.Type) + { + case RantObjectType.Number: + return new RantObject(a._number % b._number); + } + break; + } + } + + return Null; + } + + #endregion + + /// <summary> + /// Returns a string representation of the current RantObject. + /// </summary> + /// <returns></returns> + public override string ToString() + { + switch (Type) + { + case RantObjectType.Boolean: + return _boolean ? "true" : "false"; + case RantObjectType.String: + return _string; + case RantObjectType.Null: + return "null"; + case RantObjectType.Undefined: + return "???"; + case RantObjectType.Number: + return _number.ToString(CultureInfo.InvariantCulture); + case RantObjectType.List: + { + var sb = new StringBuilder(); + bool first = true; + sb.Append("("); + foreach (var rantObject in _list) + { + if (!first) sb.Append(", "); + first = false; + sb.Append(rantObject); + } + sb.Append(")"); + return sb.ToString(); + } + } + return Value.ToString(); + } + + private static bool IsNumber(object value) + { + return value is sbyte + || value is byte + || value is short + || value is ushort + || value is int + || value is uint + || value is long + || value is ulong + || value is float + || value is double + || value is decimal; + } + } } \ No newline at end of file diff --git a/Rant/Core/ObjectModel/RantObjectType.cs b/Rant/Core/ObjectModel/RantObjectType.cs index b44111d..df38321 100644 --- a/Rant/Core/ObjectModel/RantObjectType.cs +++ b/Rant/Core/ObjectModel/RantObjectType.cs @@ -40,11 +40,6 @@ public enum RantObjectType /// </summary> String, - /// <summary> - /// Represents a compiled Rant pattern. - /// </summary> - Pattern, - /// <summary> /// Represents a boolean value. /// </summary> diff --git a/Rant/Core/Utilities/Util.cs b/Rant/Core/Utilities/Util.cs index 36ea7e2..d5d8c5b 100644 --- a/Rant/Core/Utilities/Util.cs +++ b/Rant/Core/Utilities/Util.cs @@ -353,8 +353,9 @@ public static string GetEnumListString(Type enumType) #endif public static bool ValidateName(string input) { - // ReSharper disable once ReplaceWithStringIsNullOrEmpty + // ReSharper disable ReplaceWithStringIsNullOrEmpty return input != null && input.Length > 0 && input.All(c => char.IsLetterOrDigit(c) || c == '_'); + // ReSharper restore ReplaceWithStringIsNullOrEmpty } public static string Alt(string input, string alternate) diff --git a/Rant/RantRuntimeException.cs b/Rant/RantRuntimeException.cs index 8cab417..3b653ac 100644 --- a/Rant/RantRuntimeException.cs +++ b/Rant/RantRuntimeException.cs @@ -69,22 +69,17 @@ internal RantRuntimeException(Sandbox sb, RST rst, string errorMessageType = "er /// <summary> /// The line on which the error occurred. /// </summary> - public int Line { get; private set; } + public int Line { get; } /// <summary> /// The column on which the error occurred. /// </summary> - public int Column { get; private set; } + public int Column { get; } /// <summary> /// The character index on which the error occurred. /// </summary> - public int Index { get; private set; } - - /// <summary> - /// The length of the substring in which the error occurred. - /// </summary> - public int Length { get; private set; } + public int Index { get; } /// <summary> /// The source of the error. From 413abcbc9c282912aefea95e399f640143facea5 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Mon, 10 Apr 2017 13:41:37 -0500 Subject: [PATCH 189/213] Localize additional error messages --- Rant/Localization/de-DE.lang | 3 +++ Rant/Localization/en-US.lang | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index abcb13d..fec9cd8 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -75,6 +75,9 @@ err-runtime-subarg-mismatch = "Die angegebenen Argumenten passen an die Signatur err-runtime-unknown-flag = "Unbekannter Schalter: '{0}'" err-runtime-unknown-mode = "Unbekannter Modus: '{0}'. Gültige Werte für diesen Parameter: {1}" err-runtime-invalid-string-index = "Der angegebene Index '{0}' liegt außerhalb der Zeichenkette." +err-runtime-unexpected-type = "Unerwarteter Variablentyp: {0} erwartet, aber {1} angegeben." +err-runtime-index-out-of-range = "Der angegebene Index '{1}' liegt außerhalb des Indexbereichs [0, {0}]." +err-runtime-div-by-zero = "Nulldivision versucht." acc-carrier-name = "Anfragezustandspeichernamen" acc-table-name = "Tabellenamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index b551cf6..346bb56 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -81,6 +81,9 @@ err-runtime-subarg-mismatch = "The provided arguments do not match the signature err-runtime-unknown-flag = "Unknown flag name: '{0}'" err-runtime-unknown-mode = "Unknown mode name: '{0}'. Valid values for this parameter are: {1}" err-runtime-invalid-string-index = "Index in string is not valid: {0}" +err-runtime-unexpected-type = "Unexpected variable type: Expected {0}, got {1}." +err-runtime-index-out-of-range = "The provided index '{1}' was outside the allowed range: [0, {0}]." +err-runtime-div-by-zero = "Attempted to divide by zero." acc-carrier-name = "carrier name" acc-table-name = "table name" From 7392643ca3091e07921324e77b3a10bb658240fe Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 00:09:11 -0400 Subject: [PATCH 190/213] List filter and map functions. --- Rant.Tests/Variables.cs | 20 +++++ Rant/Core/Framework/RantFunctionRegistry.cs | 97 +++++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/Rant.Tests/Variables.cs b/Rant.Tests/Variables.cs index 29bea61..69d6a67 100644 --- a/Rant.Tests/Variables.cs +++ b/Rant.Tests/Variables.cs @@ -72,5 +72,25 @@ public void VariableSwap() Assert.AreEqual(rant["a"].Value, 5); Assert.AreEqual(rant["b"].Value, 3); } + + [Test] + public void ListFilter() + { + var rant = new RantEngine(); + var result = rant.Do(@" + [vl:test][laddn:test;1][laddn:test;2][laddn:test;3][laddn:test;4] + [lfilter:test;a;[gt:[v:a];2]][v:test]").Main; + Assert.AreEqual("(3, 4)", result); + } + + [Test] + public void ListMap() + { + var rant = new RantEngine(); + var result = rant.Do(@" + [vl:test][laddn:test;1][laddn:test;2][laddn:test;3][laddn:test;4] + [lmap:test;a;[v:a][v:a]][v:test]").Main; + Assert.AreEqual("(11, 22, 33, 44)", result); + } } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index eeab756..8f001d1 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1493,6 +1493,103 @@ private static void ListCopy(Sandbox sb, RantObject listObj, string variable) sb.Objects[variable] = listObj.Clone(); } + [RantFunction("lfilter")] + [RantDescription("Filters out elements of a list when the condition returns false. Creates new list with results.")] + private static IEnumerator<RST> ListFilter(Sandbox sb, + [RantDescription("The name of the list object to filter.")] + string listName, + [RantDescription("The name of the list that will contain the filtered result.")] + string outputListName, + [RantDescription("The name of the variable that will contain the current item within the condition.")] + string varname, + [RantDescription("The condition that will be checked for each item.")] + RST condition) + { + var listObj = sb.Objects[listName]; + if (listObj == null) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", listName); + if (listObj.Type != RantObjectType.List) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + var list = listObj.Value as List<RantObject>; + var newList = new List<RantObject>(list.Count); + foreach(var val in list) + { + sb.Objects.EnterScope(); + sb.Objects[varname] = val; + sb.AddOutputWriter(); + yield return condition; + var output = sb.Return(); + sb.Objects.ExitScope(); + + if(output == TRUE) + newList.Add(val); + else if (output != FALSE) // if output is neither, it's not a boolean + throw new RantRuntimeException(sb, condition, "err-runtime-unexpected-type", RantObjectType.Boolean, RantObjectType.String); + } + + sb.Objects[outputListName] = new RantObject(newList); + } + + [RantFunction("lfilter")] + [RantDescription("Filters out elements of a list when the condition returns false. Mutates list.")] + private static IEnumerator<RST> ListFilter(Sandbox sb, + [RantDescription("The name of the list object to filter.")] + string listName, + [RantDescription("The name of the variable that will contain the current item within the condition.")] + string varname, + [RantDescription("The condition that will be checked for each item.")] + RST condition) + { + return ListFilter(sb, listName, listName, varname, condition); + } + + [RantFunction("lmap")] + [RantDescription("Runs each item in the input list through the body and adds results to output list.")] + private static IEnumerator<RST> ListMap(Sandbox sb, + [RantDescription("The name of the list object to map.")] + string listName, + [RantDescription("The name of the list that will contain the mapped result.")] + string outputListName, + [RantDescription("The name of the variable that will contain the current item within the body.")] + string varname, + [RantDescription("The body that will be run for each item.")] + RST body) + { + var listObj = sb.Objects[listName]; + if (listObj == null) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-missing-var", listName); + if (listObj.Type != RantObjectType.List) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + var list = listObj.Value as List<RantObject>; + var newList = new List<RantObject>(list.Count); + foreach (var val in list) + { + sb.Objects.EnterScope(); + sb.Objects[varname] = val; + sb.AddOutputWriter(); + yield return body; + var output = sb.Return(); + sb.Objects.ExitScope(); + + newList.Add(new RantObject(output)); + } + + sb.Objects[outputListName] = new RantObject(newList); + } + + [RantFunction("lmap")] + [RantDescription("Replaces each item in the input list with its value when run through body.")] + private static IEnumerator<RST> ListMap(Sandbox sb, + [RantDescription("The name of the list object to map.")] + string listName, + [RantDescription("The name of the variable that will contain the current item within the body.")] + string varname, + [RantDescription("The body that will be run for each item.")] + RST body) + { + return ListMap(sb, listName, listName, varname, body); + } + [RantFunction("vlen")] [RantDescription("Gets the length of the specified variable.")] private static void VariableLength(Sandbox sb, RantObject obj) From 64f020ebac5f347eaee8544f9f56695279d116f9 Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 00:17:41 -0400 Subject: [PATCH 191/213] String split. --- Rant.Tests/Variables.cs | 8 +++++++ Rant/Core/Framework/RantFunctionRegistry.cs | 26 +++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Rant.Tests/Variables.cs b/Rant.Tests/Variables.cs index 69d6a67..e76435e 100644 --- a/Rant.Tests/Variables.cs +++ b/Rant.Tests/Variables.cs @@ -92,5 +92,13 @@ public void ListMap() [lmap:test;a;[v:a][v:a]][v:test]").Main; Assert.AreEqual("(11, 22, 33, 44)", result); } + + [Test] + public void StringSplit() + { + var rant = new RantEngine(); + var result = rant.Do("[split:a;,;\"a,b,c,d\"][v:a]").Main; + Assert.AreEqual("(a, b, c, d)", result); + } } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 8f001d1..63cf34c 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1590,6 +1590,32 @@ private static IEnumerator<RST> ListMap(Sandbox sb, return ListMap(sb, listName, listName, varname, body); } + [RantFunction("split")] + [RantDescription("Splits the specified string by the given delimiter.")] + private static void StringSplit(Sandbox sb, + [RantDescription("The name of the variable that will contain the output list.")] + string listName, + [RantDescription("The delimiter.")] + string delimiter, + [RantDescription("The string to split.")] + string input) + { + var results = input.Split(new[] { delimiter }, StringSplitOptions.None); + sb.Objects[listName] = new RantObject(results.Select(r => new RantObject(r)).ToList()); + } + + [RantFunction("split")] + [RantDescription("Splits the specified string into a list of chars.")] + private static void StringSplit(Sandbox sb, + [RantDescription("The name of the variable that will contain the output list.")] + string listName, + [RantDescription("The string to split.")] + string input) + { + var chars = input.ToCharArray(); + sb.Objects[listName] = new RantObject(chars.Select(c => new RantObject(c)).ToList()); + } + [RantFunction("vlen")] [RantDescription("Gets the length of the specified variable.")] private static void VariableLength(Sandbox sb, RantObject obj) From 00a5bab8f74d1375b5da90804703370bc838d1d9 Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 00:27:31 -0400 Subject: [PATCH 192/213] ladd functions accept multiple values --- Rant/Core/Framework/RantFunctionRegistry.cs | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 63cf34c..a36a6e3 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1249,51 +1249,51 @@ private static void VariableList(Sandbox sb, } [RantFunction("ladd", "ladds")] - [RantDescription("Adds a string to a list.")] + [RantDescription("Adds one or more strings to a list.")] private static void ListAdd(Sandbox sb, [RantDescription("The list to add to.")] RantObject listObj, - [RantDescription("The string to add.")] - string value) + [RantDescription("The strings to add.")] + params string[] values) { var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); - list.Add(new RantObject(value)); + list.AddRange(values.Select(s => new RantObject(s)).ToList()); } [RantFunction("laddn")] - [RantDescription("Adds a number to a list.")] + [RantDescription("Adds one or more numbers to a list.")] private static void ListAddNumber(Sandbox sb, [RantDescription("The list to add to.")] RantObject listObj, - [RantDescription("The number to add.")] - double value) + [RantDescription("The numbers to add.")] + params double[] values) { var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); - list.Add(new RantObject(value)); + list.AddRange(values.Select(s => new RantObject(s)).ToList()); } [RantFunction("laddp")] - [RantDescription("Adds a pattern to a list.")] + [RantDescription("Adds one or more patterns to a list.")] private static void ListAddPattern(Sandbox sb, [RantDescription("The list to add to.")] RantObject listObj, - [RantDescription("The pattern to add.")] - RST value) + [RantDescription("The patterns to add.")] + params RST[] values) { var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); - list.Add(new RantObject(value)); + list.AddRange(values.Select(s => new RantObject(s)).ToList()); } [RantFunction("laddv")] - [RantDescription("Adds a variable to a list.")] + [RantDescription("Adds one or more variables to a list.")] private static void ListAddPattern(Sandbox sb, [RantDescription("The list to add to.")] RantObject listObj, - [RantDescription("The variable to add.")] - RantObject value) + [RantDescription("The variables to add.")] + params RantObject[] values) { var list = listObj.Value as List<RantObject> ?? throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); - list.Add(value); + list.AddRange(values.Select(s => new RantObject(s)).ToList()); } [RantFunction("lpre", "lpres")] From 72c21fd2704867c74113f8554b6ad73017fd65cd Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 00:37:09 -0400 Subject: [PATCH 193/213] Fix subroutine bug with lists of the same name. --- Rant.Tests/Subroutines.cs | 6 ++++++ Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Rant.Tests/Subroutines.cs b/Rant.Tests/Subroutines.cs index ec1fae3..80b037b 100644 --- a/Rant.Tests/Subroutines.cs +++ b/Rant.Tests/Subroutines.cs @@ -71,5 +71,11 @@ public void Overloading() { Assert.AreEqual("12", new RantEngine().Do(@"[$[test:a;b]:1][$[test:a]:2][$test:1;2][$test:0]").Main); } + + [Test] + public void SubroutineVariableCollision() + { + new RantEngine().Do("[vl:a][ladd:a;1;2][$[a]:o]"); + } } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs index 631d8d6..e4858df 100644 --- a/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs +++ b/Rant/Core/Compiler/Syntax/RstDefineSubroutine.cs @@ -43,7 +43,7 @@ public RstDefineSubroutine(LineCol location) : base(location) public override IEnumerator<RST> Run(Sandbox sb) { - if (sb.Objects.ContainsKey(Name)) + if (sb.Objects.ContainsKey(Name) && CheckIfSubroutineList(sb.Objects[Name])) { var subroutines = sb.Objects[Name].Value as List<RantObject>; if (subroutines.Any(s => (s.Value as RstDefineSubroutine).Parameters.Count == Parameters.Count)) @@ -85,6 +85,13 @@ protected override IEnumerator<DeserializeRequest> Deserialize(EasyReader input) Parameters[key] = (SubroutineParameterType)input.ReadByte(); } } + + private bool CheckIfSubroutineList(RantObject obj) + { + if (obj.Type != RantObjectType.List) return false; + var list = obj.Value as List<RantObject>; + return list.All(a => a.Value is RstDefineSubroutine); + } } internal enum SubroutineParameterType : byte From 237a22d497966659b752cc123004fc76e33ba484 Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 00:39:14 -0400 Subject: [PATCH 194/213] Fix failing quot test. --- Rant.Tests/Capitalization.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rant.Tests/Capitalization.cs b/Rant.Tests/Capitalization.cs index cbc1d47..4146bab 100644 --- a/Rant.Tests/Capitalization.cs +++ b/Rant.Tests/Capitalization.cs @@ -38,7 +38,7 @@ public void SentenceCase(string pattern, string expected) public void QuotedSentence() { Assert.AreEqual("“This is a sentence. This is another sentence.”", - rant.Do(@"[q:[caps:sentence]this is a sentence. this is another sentence.]").Main); + rant.Do(@"[quot:[caps:sentence]this is a sentence. this is another sentence.]").Main); } [Test] From b3093805bf54cd7253ff78dd4f3657a269cdf032 Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 00:55:37 -0400 Subject: [PATCH 195/213] List rand and string join functions. --- Rant/Core/Framework/RantFunctionRegistry.cs | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index a36a6e3..425ac51 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1590,6 +1590,22 @@ private static IEnumerator<RST> ListMap(Sandbox sb, return ListMap(sb, listName, listName, varname, body); } + [RantFunction("lrand")] + [RantDescription("Returns a random value from the specified list.")] + private static IEnumerator<RST> ListRandom(Sandbox sb, + [RantDescription("The list to pick from.")] + RantObject obj) + { + if (obj.Type != RantObjectType.List) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, obj.Type); + var list = obj.Value as List<RantObject>; + var item = list[sb.RNG.Next(list.Count)]; + if (item.Type == RantObjectType.Action) + yield return item.Value as RST; + else + sb.Print(item.PrintableValue); + } + [RantFunction("split")] [RantDescription("Splits the specified string by the given delimiter.")] private static void StringSplit(Sandbox sb, @@ -1616,6 +1632,30 @@ private static void StringSplit(Sandbox sb, sb.Objects[listName] = new RantObject(chars.Select(c => new RantObject(c)).ToList()); } + [RantFunction("join")] + [RantDescription("Joins the specified list into a string seperated by the delimiter and returns it.")] + private static void StringJoin(Sandbox sb, + [RantDescription("The list to join.")] + RantObject listObj, + [RantDescription("The delimiter.")] + string delimiter) + { + if (listObj.Type != RantObjectType.List) + throw new RantRuntimeException(sb, sb.CurrentAction, "err-runtime-unexpected-type", RantObjectType.List, listObj.Type); + var list = listObj.Value as List<RantObject>; + var result = string.Join(delimiter, list.Select(a => a.PrintableValue)); + sb.Print(result); + } + + [RantFunction("join")] + [RantDescription("Joins the specified list into a string.")] + private static void StringJoin(Sandbox sb, + [RantDescription("The list to join.")] + RantObject listObj) + { + StringJoin(sb, listObj, ""); + } + [RantFunction("vlen")] [RantDescription("Gets the length of the specified variable.")] private static void VariableLength(Sandbox sb, RantObject obj) From 42711893a7e7c0d9e98b7d287c1753375d1a8511 Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 01:21:59 -0400 Subject: [PATCH 196/213] Loop function. --- Rant.Tests/Variables.cs | 8 +++++++ Rant/Core/Framework/RantFunctionRegistry.cs | 25 ++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Rant.Tests/Variables.cs b/Rant.Tests/Variables.cs index e76435e..0aaf213 100644 --- a/Rant.Tests/Variables.cs +++ b/Rant.Tests/Variables.cs @@ -100,5 +100,13 @@ public void StringSplit() var result = rant.Do("[split:a;,;\"a,b,c,d\"][v:a]").Main; Assert.AreEqual("(a, b, c, d)", result); } + + [Test] + public void Loop() + { + var rant = new RantEngine(); + var result = rant.Do("[vn:a;10][while:[gt:[v:a];0];[vsub:a;1]a]").Main; + Assert.AreEqual(result, "aaaaaaaaaa"); + } } } \ No newline at end of file diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 425ac51..4436feb 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1629,7 +1629,7 @@ private static void StringSplit(Sandbox sb, string input) { var chars = input.ToCharArray(); - sb.Objects[listName] = new RantObject(chars.Select(c => new RantObject(c)).ToList()); + sb.Objects[listName] = new RantObject(chars.Select(c => new RantObject(c.ToString())).ToList()); } [RantFunction("join")] @@ -2052,6 +2052,29 @@ private static IEnumerator<RST> IfNot(Sandbox sb, bool condition, RST body, RST yield return !condition ? body : elseBody; } + [RantFunction("while", "loop")] + [RantDescription("Runs the body over and over while condition remains true.")] + private static IEnumerator<RST> WhileLoop(Sandbox sb, + [RantDescription("The condition to check each iteration.")] + RST condition, + [RantDescription("The body of the loop.")] + RST body) + { + while(true) + { + sb.AddOutputWriter(); + yield return condition; + var output = sb.Return(); + + if (output == FALSE) + break; + else if (output == TRUE) + yield return body; + else + throw new RantRuntimeException(sb, condition, "err-runtime-unexpected-type", RantObjectType.Boolean, RantObjectType.String); + } + } + #endregion } } \ No newline at end of file From 8b2826b8920b6b2439f65b1b80a7f72f08feffce Mon Sep 17 00:00:00 2001 From: Andrew Rogers <anrogers529@gmail.com> Date: Wed, 12 Apr 2017 01:31:29 -0400 Subject: [PATCH 197/213] Rant country sample. --- Samples/country.rant | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Samples/country.rant diff --git a/Samples/country.rant b/Samples/country.rant new file mode 100644 index 0000000..65222dd --- /dev/null +++ b/Samples/country.rant @@ -0,0 +1,52 @@ +# A perhaps vastly overengineered fantasy country name generator. +[vl:consonants][ladd:consonants;b;c;d;f;g;h;j;k;l;m;n;p;q;r;s;t;v;w;x;y;z] +[$[cons]: [lrand:consonants]] +[$[vow]: {a|e|i|o|u}] +[$[suffix]: {an|[$vow]stan|ia|[$vow]ba|[$vow]na|ica|ican|en|esia|burg|bourg|ania|[$vow]rea|ey|ary}] +[$[mid]: {han|hin|uxem|ap|uin|ung|eng|ngl|rae|indo|nes|ait}] +[$[rmid]: [rep:[n:1;2]]{[$mid]}] + +[$[dedup_consonants:t]: [`[bcdfghjklmnpqrstvxzwy]{3}`:[arg:t];[at:[match];0]]] +[$[dedup_vowels:t]: [`(a+|e+|i+|o+|u+)`:[arg:t];[at:[match];0]]] +[$[remove_strange:t]: [`(h+|x+|jm)`:[arg:t];[at:[match];0]]] +[$[no_spaces:t]:[`\s`:[arg:t];]] + +# is consonant +[$[is_cons:c]:[ne:[lfindi:consonants;[arg:c]];-1]] + +# transform country name by adding vowels after every consonant %50 of the time +[$[transform:s]: + [split:schars;[arg:s]] + [lmap:schars;c; + [chance:50] + {[if:[$is_cons:[v:c]]; + [v:c][$vow]; + [v:c]]}] + [join:schars] +] + +# get rid of undesirable character sequences +[$[process:t]: + [$no_spaces: + [$remove_strange: + [$dedup_vowels: + [$dedup_consonants: + [arg:t]]]]]] + +[$[country_i]: [case:lower]{ + [$vow][$mid][$suffix] | + [$cons][$vow][$mid][$suffix] | + [$rmid][$suffix] | + [$transform:<country>][$suffix] +}] + +# process country name +[$[country_p]: [case:first][$process:[$country_i]]] + +# make sure country name is < 15 chars +[$[country]: + [vs:c;[$country_p]] + [while:[gt:[vlen:c];15];[vs:c;[$country_p]]] + [v:c] +] +[rs:20;\n]{[$country]} From 4de7602e625ed0b4d8748886f3210341a7ba40cf Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Wed, 12 Apr 2017 12:59:54 -0500 Subject: [PATCH 198/213] Improve country name sample, flesh out query builders --- Rant/Core/Framework/RantFunctionRegistry.cs | 65 +++++++++++++++++---- Samples/country.rant | 19 ++++-- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 4436feb..6124062 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -1147,9 +1147,15 @@ private static void QueryDelete(Sandbox sb, sb.QueryBuilder.ResetQuery(id); } - [RantFunction("qregf")] + [RantFunction("qhas")] [RantDescription("Adds a positive regex filter to a constructed query.")] - private static void QueryRegexFilter(Sandbox sb, string id, string regexPattern, string options) + private static void QueryRegexFilter(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The regex pattern for the filter.")] + string regexPattern, + [RantDescription("The regex option string for the filter.")] + string options) { Regex regex; try @@ -1163,9 +1169,15 @@ private static void QueryRegexFilter(Sandbox sb, string id, string regexPattern, sb.QueryBuilder.GetQuery(id).AddFilter(new RegexFilter(regex, true)); } - [RantFunction("qregfn")] + [RantFunction("qhasno")] [RantDescription("Adds a positive regex filter to a constructed query.")] - private static void QueryNegativeRegexFilter(Sandbox sb, string id, string regexPattern, string options) + private static void QueryNegativeRegexFilter(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The regex pattern for the filter.")] + string regexPattern, + [RantDescription("The regex option string for the filter.")] + string options) { Regex regex; try @@ -1179,41 +1191,70 @@ private static void QueryNegativeRegexFilter(Sandbox sb, string id, string regex sb.QueryBuilder.GetQuery(id).AddFilter(new RegexFilter(regex, false)); } - [RantFunction("qsylf")] + [RantFunction("qsyl")] [RantDescription("Adds an syllable count range filter to a constructed query that defines an absolute syllable count.")] - private static void QuerySyllableFilterAbsolute(Sandbox sb, string id, int syllables) + private static void QuerySyllableFilterAbsolute(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The number of syllables.")] + int syllables) { if (syllables < 1) throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-abs", syllables); sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(syllables, syllables)); } - [RantFunction("qsylf")] + [RantFunction("qsyl")] [RantDescription("Adds a syllable count range filter to a constructed query.")] - private static void QuerySyllableFilterRange(Sandbox sb, string id, int minSyllables, int maxSyllables) + private static void QuerySyllableFilterRange(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The minimum syllable count.")] + int minSyllables, + [RantDescription("The maximum syllable count.")] + int maxSyllables) { if (minSyllables < 1 || maxSyllables < 1 || minSyllables > maxSyllables) throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-range", minSyllables, maxSyllables); sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(minSyllables, maxSyllables)); } - [RantFunction("qsylminf")] + [RantFunction("qsylmin")] [RantDescription("Adds a syllable count range filter to a constructed query that defines only a minimum bound.")] - private static void QuerySyllableFilterMin(Sandbox sb, string id, int minSyllables) + private static void QuerySyllableFilterMin(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The minimum syllable count.")] + int minSyllables) { if (minSyllables < 1) throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-min", minSyllables); sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(minSyllables, null)); } - [RantFunction("qsylmaxf")] + [RantFunction("qsylmax")] [RantDescription("Adds a syllable count range filter to a constructed query that defines only a maximum bound.")] - private static void QuerySyllableFilterMax(Sandbox sb, string id, int maxSyllables) + private static void QuerySyllableFilterMax(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The maximum syllable count.")] + int maxSyllables) { if (maxSyllables < 1) throw new RantRuntimeException(sb, sb.CurrentAction, "err-invalid-syllables-max", maxSyllables); sb.QueryBuilder.GetQuery(id).AddFilter(new RangeFilter(null, maxSyllables)); } + [RantFunction("qphr")] + [RantDescription("Adds a phrasal complement to a constructed query.")] + private static void QueryPhrasalComplement(Sandbox sb, + [RantDescription("The ID string for the constructed query.")] + string id, + [RantDescription("The phrasal complement pattern.")] + RST complement) + { + sb.QueryBuilder.GetQuery(id).Complement = complement; + } + #endregion #region Variables diff --git a/Samples/country.rant b/Samples/country.rant index 65222dd..ae8274a 100644 --- a/Samples/country.rant +++ b/Samples/country.rant @@ -1,14 +1,16 @@ # A perhaps vastly overengineered fantasy country name generator. [vl:consonants][ladd:consonants;b;c;d;f;g;h;j;k;l;m;n;p;q;r;s;t;v;w;x;y;z] +[$[randacc]:{acute|grave|circumflex|tilde|ring|diaeresis|caron|macron}] [$[cons]: [lrand:consonants]] [$[vow]: {a|e|i|o|u}] -[$[suffix]: {an|[$vow]stan|ia|[$vow]ba|[$vow]na|ica|ican|en|esia|burg|bourg|ania|[$vow]rea|ey|ary}] +[$[suffix]: {an|[$vow]stan|ia|[$vow]ba|[$vow]na|ica|ican|en|esia|burg|bourg|ania|ika|ara|[$vow]nka|olia|[$vow]roa|kka|[$vow]rea|ey|ary}] [$[mid]: {han|hin|uxem|ap|uin|ung|eng|ngl|rae|indo|nes|ait}] [$[rmid]: [rep:[n:1;2]]{[$mid]}] [$[dedup_consonants:t]: [`[bcdfghjklmnpqrstvxzwy]{3}`:[arg:t];[at:[match];0]]] [$[dedup_vowels:t]: [`(a+|e+|i+|o+|u+)`:[arg:t];[at:[match];0]]] [$[remove_strange:t]: [`(h+|x+|jm)`:[arg:t];[at:[match];0]]] +[$[add_accents:t]: [`[aeiou]`i:[arg:t];{(10)[match]|[accent:[match];[$randacc]]}]] [$[no_spaces:t]:[`\s`:[arg:t];]] # is consonant @@ -28,10 +30,17 @@ # get rid of undesirable character sequences [$[process:t]: [$no_spaces: - [$remove_strange: - [$dedup_vowels: - [$dedup_consonants: - [arg:t]]]]]] + [$add_accents: + [$remove_strange: + [$dedup_vowels: + [$dedup_consonants: + [arg:t] + ] + ] + ] + ] + ] +] [$[country_i]: [case:lower]{ [$vow][$mid][$suffix] | From 033a828c1ff0ae9eb574af33a959ab78a1545e70 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Wed, 12 Apr 2017 14:56:00 -0500 Subject: [PATCH 199/213] Add new sample, new functions: [xdel], [abbr], [len] --- Rant/Core/Constructs/SyncManager.cs | 9 ++-- Rant/Core/Framework/RantFunctionRegistry.cs | 39 +++++++++++++++- Rant/Formats/RantFormat.cs | 2 +- Samples/business.rant | 50 +++++++++++++++++++++ 4 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 Samples/business.rant diff --git a/Rant/Core/Constructs/SyncManager.cs b/Rant/Core/Constructs/SyncManager.cs index 3d5f16d..a826bd1 100644 --- a/Rant/Core/Constructs/SyncManager.cs +++ b/Rant/Core/Constructs/SyncManager.cs @@ -40,12 +40,11 @@ public SyncManager(Sandbox sb) _sb = sb; } - public Synchronizer this[string name] - { - get { return _syncTable[name]; } - } + public Synchronizer this[string name] => _syncTable[name]; + + public bool SynchronizerExists(string name) => _syncTable.ContainsKey(name); - public bool SynchronizerExists(string name) => _syncTable.ContainsKey(name); + public void Delete(string name) => _syncTable.Remove(name); public void Create(string name, SyncType type, bool apply) { diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 6124062..2fe596f 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -407,6 +407,27 @@ private static IEnumerator<RST> Ends(Sandbox sb, #region Text Formatting and Analysis + [RantFunction("abbr")] + [RantDescription("Abbreviates the specified string.")] + private static void Abbreviate(Sandbox sb, + [RantDescription("The string to abbreviate.")] + string value) + { + var words = value.Split(new[] { ' ', '-', '/', '.' }, StringSplitOptions.RemoveEmptyEntries); + if (words.Length < 3) + { + sb.Print(words.Aggregate((c, n) => c + Char.ToUpperInvariant(n[0]).ToString())); + return; + } + var buffer = new StringBuilder(); + for(int i = 0; i < words.Length; i++) + { + if (i > 0 && sb.Engine.Format.Excludes(words[i])) continue; + buffer.Append(Char.ToUpperInvariant(words[i][0])); + } + sb.Print(buffer.ToString()); + } + [RantFunction("at")] [RantDescription("Prints the character at the specified position in the input. Throws an exception if the position is outside of the string.")] private static void At(Sandbox sb, @@ -418,9 +439,18 @@ private static void At(Sandbox sb, sb.Print(input.Substring(pos, 1)); } - [RantFunction] + [RantFunction("len")] + [RantDescription("Gets the length of the specified string.")] + private static void StringLength(Sandbox sb, + [RantDescription("The string to measure.")] + string str) + { + sb.Print(str.Length); + } + + [RantFunction("chlen")] [RantDescription("Prints the current length of the specified channel, in characters.")] - private static void Len(Sandbox sb, + private static void ChannelLength(Sandbox sb, [RantDescription("The channel for which to retrieve the length.")] string channelName) => sb.Print(sb.Output.GetChannelLength(channelName)); [RantFunction("rev")] @@ -774,6 +804,11 @@ private static void Group(Sandbox sb, #region Synchronizer + [RantFunction("xdel")] + [RantDescription("Deletes a synchronizer.")] + private static void SyncDelete(Sandbox sb, + [RantDescription("The name of the synchronizer to delete.")] string name) => sb.SyncManager.Delete(name); + [RantFunction("xpin")] [RantDescription("Pins a synchronizer.")] private static void SyncPin(Sandbox sb, diff --git a/Rant/Formats/RantFormat.cs b/Rant/Formats/RantFormat.cs index 63337ff..72a86e4 100644 --- a/Rant/Formats/RantFormat.cs +++ b/Rant/Formats/RantFormat.cs @@ -96,7 +96,7 @@ public RantFormat( { "a", "an", "the", "that", "where", "when", "for", "any", "or", "and", "of", "in", "at", "as", "into", "if", "are", "you", "why", "from", - "with", "these", "those" + "with", "these", "those", "to" }, StringComparer.InvariantCultureIgnoreCase); diff --git a/Samples/business.rant b/Samples/business.rant new file mode 100644 index 0000000..a3b8a11 --- /dev/null +++ b/Samples/business.rant @@ -0,0 +1,50 @@ +[rs:20;\n] +{ + [case:first] + { + # Variant 1 + (20) + [`[aeiou]+`i: + [r:{(4)2|3}][x:__name;deck] + { + { + fas|fa|tac|pro|neo|fast|sp{eed|ede}|good|man|you|fan|tast|iso|lai|us|quik|lite|bri{ght|te}|up|king|mega|at|site|in|sum|bar|exo|smart|clev|levi|vox| + tek|tech|com|cell|mob|tele|phon|fon|handy|serv|done|big|right|rite|two|three|four|five|real|tru|true|min|max|jack|re{ad|dd}y|gold|silver|ruby|mirror| + glass|clear|easy + }| + { + {g|b|r|f|l}{a|i|o|u|e}{[r:{1|2}]{b|d|z|r|l|n|t}|st|th|rt|rth}{|{o|a|i}} + } + } + [xdel:__name] + ; + { + (5)[match] + | + [capsinfer:[match]] + [r:[len:[match]]]{a|e|i|o|u} + [case:none] + }] + + | + + # Variant 2 + <surname> & <surname> + + } + [case:title] + {(2)|\s + { + {(10)|{<noun>|<verb.nom>}\s}{Solutions|Innovations}| + Enterprises| + Corporation| + International| + Law{|\sFirm}| + Laboratories| + Research| + Group| + Studios| + {<noun.pl>|<verb.nom>} + } + } +} \ No newline at end of file From 376af19adc7026e2bae9c6c4c8a7025305be4878 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Thu, 13 Apr 2017 01:35:28 -0500 Subject: [PATCH 200/213] Add no-repeat synchronizer type --- Rant/Core/Constructs/SyncType.cs | 61 +++++++++++---------- Rant/Core/Constructs/Synchronizer.cs | 8 +++ Rant/Core/Framework/RantFunctionRegistry.cs | 5 ++ 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/Rant/Core/Constructs/SyncType.cs b/Rant/Core/Constructs/SyncType.cs index c2cc9fb..53adf97 100644 --- a/Rant/Core/Constructs/SyncType.cs +++ b/Rant/Core/Constructs/SyncType.cs @@ -27,33 +27,36 @@ namespace Rant.Core.Constructs { - internal enum SyncType - { - [RantDescription("A random element is selected each time.")] - None, - - [RantDescription("Executes from left to right.")] - Forward, - - [RantDescription("Executes from right to left.")] - Reverse, - //[RantDescription("Executes from left to right, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] - //ForwardSkip, - //[RantDescription("Executes from right to left, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] - //ReverseSkip, - [RantDescription("Shuffles items and executes in order. Re-shuffled each time all items are used up.")] - Deck, - - [RantDescription("Shuffles items and executes in order. The same order is reused for each traversal.")] - Cdeck, - - [RantDescription("Chosen randomly, the same element is selected each time.")] - Locked, - - [RantDescription("Starting at the first item, iterates through all elements in order and then reverses without repeating boundary elements.")] - Ping, - - [RantDescription("Starting at the last item, iterates through all elements backwards and then reverses without repeating boundary elements.")] - Pong - } + internal enum SyncType + { + [RantDescription("A random element is selected each time.")] + None, + + [RantDescription("Executes from left to right.")] + Forward, + + [RantDescription("Executes from right to left.")] + Reverse, + //[RantDescription("Executes from left to right, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] + //ForwardSkip, + //[RantDescription("Executes from right to left, but randomly skips elements. This mode can reduce the iteration count when using [repeach].")] + //ReverseSkip, + [RantDescription("Shuffles items and executes in order. Re-shuffled each time all items are used up.")] + Deck, + + [RantDescription("Shuffles items and executes in order. The same order is reused for each traversal.")] + Cdeck, + + [RantDescription("Chosen randomly, the same element is selected each time.")] + Locked, + + [RantDescription("Starting at the first item, iterates through all elements in order and then reverses without repeating boundary elements.")] + Ping, + + [RantDescription("Starting at the last item, iterates through all elements backwards and then reverses without repeating boundary elements.")] + Pong, + + [RantDescription("The same element will never be chosen twice in a row, as long as the block contains at least two elements.")] + NoRepeat + } } \ No newline at end of file diff --git a/Rant/Core/Constructs/Synchronizer.cs b/Rant/Core/Constructs/Synchronizer.cs index 8ed4017..cb3cb01 100644 --- a/Rant/Core/Constructs/Synchronizer.cs +++ b/Rant/Core/Constructs/Synchronizer.cs @@ -100,6 +100,7 @@ public int Step(bool force) break; } } + // [xstep] will set force to true, allowing a pinned synchronizer to iterate if (Pinned && !force) return _state[Index]; switch (Type) @@ -107,6 +108,11 @@ public int Step(bool force) case SyncType.Ping: case SyncType.Pong: return _bounce ? _state[_state.Length - 1 - Index++] : _state[Index++]; + case SyncType.NoRepeat: + { + Index = _state.Length > 1 ? (Index + _rng.Next(1, _state.Length)) % _state.Length : 0; + return _state[Index]; + } default: return _state[Index++]; } @@ -118,9 +124,11 @@ private void FillSlots() { case SyncType.Forward: case SyncType.Ping: + case SyncType.NoRepeat: for (int i = 0; i < _state.Length; _state[i] = i++) { } + if (Type == SyncType.NoRepeat) Index = _rng.Next(_state.Length); break; case SyncType.Reverse: case SyncType.Pong: diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 2fe596f..9e58202 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -423,6 +423,11 @@ private static void Abbreviate(Sandbox sb, for(int i = 0; i < words.Length; i++) { if (i > 0 && sb.Engine.Format.Excludes(words[i])) continue; + if (words[i].All(Char.IsDigit)) + { + buffer.Append(words[i]); + continue; + } buffer.Append(Char.ToUpperInvariant(words[i][0])); } sb.Print(buffer.ToString()); From d89b5f74ccddb1aebd89cdd9666e3c6e9d5d1ee9 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Thu, 13 Apr 2017 02:29:42 -0500 Subject: [PATCH 201/213] Fix locale-specific number parsing errors --- .../Comparison.cs => Rant.Tests/Parsing.cs | 57 +- Rant.Tests/Rant.Tests.csproj | 1 + Rant/Core/Compiler/Parsing/SequenceParser.cs | 388 ++++----- Rant/Core/Compiler/Syntax/RstFunction.cs | 2 +- Rant/Core/Framework/RantFunctionRegistry.cs | 2 +- Rant/Core/ObjectModel/RantObject.cs | 3 +- Rant/Formats/Grammar/Aspect.cs | 35 + Rant/Formats/Grammar/EnglishInflection.cs | 72 ++ Rant/Formats/Grammar/Gender.cs | 34 + Rant/Formats/Grammar/Inflection.cs | 32 + Rant/Formats/Grammar/Person.cs | 37 + Rant/Formats/Grammar/Tense.cs | 35 + Rant/Rant.csproj | 13 +- .../RantDictionaryTable.Importer.cs | 2 +- Rant/Vocabulary/RantDictionaryTable.cs | 814 +++++++++--------- Samples/gradient.rant | 12 + 16 files changed, 890 insertions(+), 649 deletions(-) rename Rant/Core/Constructs/Comparison.cs => Rant.Tests/Parsing.cs (50%) create mode 100644 Rant/Formats/Grammar/Aspect.cs create mode 100644 Rant/Formats/Grammar/EnglishInflection.cs create mode 100644 Rant/Formats/Grammar/Gender.cs create mode 100644 Rant/Formats/Grammar/Inflection.cs create mode 100644 Rant/Formats/Grammar/Person.cs create mode 100644 Rant/Formats/Grammar/Tense.cs create mode 100644 Samples/gradient.rant diff --git a/Rant/Core/Constructs/Comparison.cs b/Rant.Tests/Parsing.cs similarity index 50% rename from Rant/Core/Constructs/Comparison.cs rename to Rant.Tests/Parsing.cs index c8d1357..6ad982c 100644 --- a/Rant/Core/Constructs/Comparison.cs +++ b/Rant.Tests/Parsing.cs @@ -1,5 +1,4 @@ #region License - // https://github.com/TheBerkin/Rant // // Copyright (c) 2017 Nicholas Fleck @@ -20,51 +19,23 @@ // 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. - #endregion - -using System; +using NUnit.Framework; using Rant.Core.Utilities; -namespace Rant.Core.Constructs +namespace Rant.Tests { - internal class Comparison - { - public Comparison(string a, string b) - { - A = a; - B = b; - double na, nb; - if (!double.TryParse(a, out na)) na = double.NaN; - if (!double.TryParse(b, out nb)) nb = double.NaN; - bool ba = Util.BooleanRep(a); - bool bb = Util.BooleanRep(b); - - Result |= a == b ? ComparisonResult.Equal : ComparisonResult.NotEqual; - - Result |= ba && bb ? ComparisonResult.All : ba || bb ? ComparisonResult.Any : ComparisonResult.None; - if (ba != bb) Result |= ComparisonResult.One; - if (na < nb) Result |= ComparisonResult.Less; - if (na > nb) Result |= ComparisonResult.Greater; - } - - public ComparisonResult Result { get; } - public string A { get; } - public string B { get; } - } - - [Flags] - internal enum ComparisonResult - { - NotEqual = 0x01, - Different = NotEqual, - Equal = 0x02, - Less = 0x04, - Greater = 0x08, - All = 0x10, - Any = 0x20, - One = 0x40, - None = 0x80 - } + [TestFixture] + public class Parsing + { + [Test] + public void DoubleParse() + { + Util.ParseDouble("0.5", out double d); + Assert.AreEqual(0.5, d); + Util.ParseDouble("1.5", out d); + Assert.AreEqual(1.5, d); + } + } } \ No newline at end of file diff --git a/Rant.Tests/Rant.Tests.csproj b/Rant.Tests/Rant.Tests.csproj index 1da033c..eff392f 100644 --- a/Rant.Tests/Rant.Tests.csproj +++ b/Rant.Tests/Rant.Tests.csproj @@ -69,6 +69,7 @@ <Compile Include="Misc\Bson.cs" /> <Compile Include="Packages.cs" /> <Compile Include="PackageVersions.cs" /> + <Compile Include="Parsing.cs" /> <Compile Include="PatternArgs.cs" /> <Compile Include="Numbers.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> diff --git a/Rant/Core/Compiler/Parsing/SequenceParser.cs b/Rant/Core/Compiler/Parsing/SequenceParser.cs index a18c448..4f314d7 100644 --- a/Rant/Core/Compiler/Parsing/SequenceParser.cs +++ b/Rant/Core/Compiler/Parsing/SequenceParser.cs @@ -28,201 +28,201 @@ using System.Globalization; using Rant.Core.Compiler.Syntax; +using Rant.Core.Utilities; namespace Rant.Core.Compiler.Parsing { - internal class SequenceParser : Parser - { - public override IEnumerator<Parser> Parse(RantCompiler compiler, CompileContext context, TokenReader reader, - Action<RST> actionCallback) - { - Token token; - while (!reader.End) - { - token = reader.ReadToken(); - - switch (token.Type) - { - case R.LeftAngle: - yield return Get<QueryParser>(); - break; - - case R.LeftSquare: - yield return Get<TagParser>(); - break; - - case R.LeftCurly: - reader.SkipSpace(); - yield return Get<BlockParser>(); - break; - - case R.Pipe: - if (context == CompileContext.BlockSequence) - yield break; - goto default; // Print it if we're not in a block - - case R.RightCurly: - if (context == CompileContext.BlockSequence) - { - compiler.LeaveContext(); - yield break; - } - compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); - break; - - // end of argument - case R.Semicolon: - if (context == CompileContext.ArgumentSequence) - yield break; - // this is probably just a semicolon in text - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - - case R.RightSquare: - // end of arguments / direct object in query - switch (context) - { - case CompileContext.ArgumentSequence: - case CompileContext.SubroutineBody: - case CompileContext.QueryComplement: - compiler.LeaveContext(); - yield break; - } - compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); - break; - - case R.RightAngle: - compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); - break; - - // the end of a block weight, maybe - case R.RightParen: - if (context == CompileContext.BlockWeight) - { - reader.SkipSpace(); - compiler.LeaveContext(); - yield break; - } - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - - case R.Whitespace: - switch (context) - { - case CompileContext.BlockSequence: - switch (reader.PeekType()) - { - case R.Pipe: - case R.RightCurly: - continue; // Ignore whitespace at the end of block elements - } - goto default; - default: - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - } - break; - - case R.EscapeSequenceChar: // Handle escape sequences - actionCallback(new RstEscape(token.ToLocation(), 1, false, token.Value[0])); - break; - case R.EscapeSequenceUnicode: - { - short codePoint; - if (!short.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), 1, true, Convert.ToChar(codePoint))); - break; - } - case R.EscapeSequenceSurrogatePair: - { - uint surrogatePairCodePoint; - if (!uint.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) - || surrogatePairCodePoint < 0x10000) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); - break; - } - - surrogatePairCodePoint -= 0x10000; - ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); - ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x003FF)); - char low, high; - if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), 1, true, high, low)); - break; - } - case R.EscapeSequenceQuantifier: - { - int quantity; - if (!int.TryParse(token.Value, out quantity) || quantity <= 0) - { - compiler.SyntaxError(token, false, "err-compiler-escape-bad-quantity"); - break; - } - switch (reader.PeekType()) - { - case R.EscapeSequenceChar: - actionCallback(new RstEscape(token.ToLocation(), quantity, false, reader.ReadToken().Value[0])); - break; - case R.EscapeSequenceUnicode: - { - short codePoint; - if (!short.TryParse(reader.ReadToken().Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), quantity, true, Convert.ToChar(codePoint))); - break; - } - case R.EscapeSequenceSurrogatePair: - { - var pairToken = reader.ReadToken(); - uint surrogatePairCodePoint; - if (!uint.TryParse(pairToken.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) - || surrogatePairCodePoint < 0x10000) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); - break; - } - - surrogatePairCodePoint -= 0x10000; - ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); - ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x3FF)); - char low, high; - if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) - { - compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); - break; - } - actionCallback(new RstEscape(token.ToLocation(), quantity, true, high, low)); - break; - } - } - break; - } - - case R.EOF: - if (context != CompileContext.DefaultSequence) - compiler.SyntaxError(token, true, "err-compiler-eof"); - yield break; - - default: // Handle text - actionCallback(new RstText(token.Value, token.ToLocation())); - break; - } - } - - if (reader.End && context != CompileContext.DefaultSequence) - compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); - } - } + internal class SequenceParser : Parser + { + public override IEnumerator<Parser> Parse(RantCompiler compiler, CompileContext context, TokenReader reader, + Action<RST> actionCallback) + { + Token token; + while (!reader.End) + { + token = reader.ReadToken(); + + switch (token.Type) + { + case R.LeftAngle: + yield return Get<QueryParser>(); + break; + + case R.LeftSquare: + yield return Get<TagParser>(); + break; + + case R.LeftCurly: + reader.SkipSpace(); + yield return Get<BlockParser>(); + break; + + case R.Pipe: + if (context == CompileContext.BlockSequence) + yield break; + goto default; // Print it if we're not in a block + + case R.RightCurly: + if (context == CompileContext.BlockSequence) + { + compiler.LeaveContext(); + yield break; + } + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); + break; + + // end of argument + case R.Semicolon: + if (context == CompileContext.ArgumentSequence) + yield break; + // this is probably just a semicolon in text + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + + case R.RightSquare: + // end of arguments / direct object in query + switch (context) + { + case CompileContext.ArgumentSequence: + case CompileContext.SubroutineBody: + case CompileContext.QueryComplement: + compiler.LeaveContext(); + yield break; + } + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); + break; + + case R.RightAngle: + compiler.SyntaxError(token, false, "err-compiler-unexpected-token", token.Value); + break; + + // the end of a block weight, maybe + case R.RightParen: + if (context == CompileContext.BlockWeight) + { + reader.SkipSpace(); + compiler.LeaveContext(); + yield break; + } + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + + case R.Whitespace: + switch (context) + { + case CompileContext.BlockSequence: + switch (reader.PeekType()) + { + case R.Pipe: + case R.RightCurly: + continue; // Ignore whitespace at the end of block elements + } + goto default; + default: + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + } + break; + + case R.EscapeSequenceChar: // Handle escape sequences + actionCallback(new RstEscape(token.ToLocation(), 1, false, token.Value[0])); + break; + case R.EscapeSequenceUnicode: + { + short codePoint; + if (!short.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), 1, true, Convert.ToChar(codePoint))); + break; + } + case R.EscapeSequenceSurrogatePair: + { + uint surrogatePairCodePoint; + if (!uint.TryParse(token.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) + || surrogatePairCodePoint < 0x10000) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); + break; + } + + surrogatePairCodePoint -= 0x10000; + ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); + ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x003FF)); + char low, high; + if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", token.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), 1, true, high, low)); + break; + } + case R.EscapeSequenceQuantifier: + { + if (!Util.ParseInt(token.Value, out int quantity) || quantity <= 0) + { + compiler.SyntaxError(token, false, "err-compiler-escape-bad-quantity"); + break; + } + switch (reader.PeekType()) + { + case R.EscapeSequenceChar: + actionCallback(new RstEscape(token.ToLocation(), quantity, false, reader.ReadToken().Value[0])); + break; + case R.EscapeSequenceUnicode: + { + short codePoint; + if (!short.TryParse(reader.ReadToken().Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out codePoint)) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-unicode", reader.PrevToken.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), quantity, true, Convert.ToChar(codePoint))); + break; + } + case R.EscapeSequenceSurrogatePair: + { + var pairToken = reader.ReadToken(); + uint surrogatePairCodePoint; + if (!uint.TryParse(pairToken.Value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out surrogatePairCodePoint) + || surrogatePairCodePoint < 0x10000) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); + break; + } + + surrogatePairCodePoint -= 0x10000; + ushort highCodePoint = (ushort)(0xD800 + ((surrogatePairCodePoint & 0xFFC00) >> 10)); + ushort lowCodePoint = (ushort)(0xDC00 + (surrogatePairCodePoint & 0x3FF)); + char low, high; + if (!char.IsSurrogatePair(high = Convert.ToChar(highCodePoint), low = Convert.ToChar(lowCodePoint))) + { + compiler.SyntaxError(reader.PrevToken, false, "err-compiler-invalid-escape-surrogate", pairToken.Value); + break; + } + actionCallback(new RstEscape(token.ToLocation(), quantity, true, high, low)); + break; + } + } + break; + } + + case R.EOF: + if (context != CompileContext.DefaultSequence) + compiler.SyntaxError(token, true, "err-compiler-eof"); + yield break; + + default: // Handle text + actionCallback(new RstText(token.Value, token.ToLocation())); + break; + } + } + + if (reader.End && context != CompileContext.DefaultSequence) + compiler.SyntaxError(reader.PrevToken, true, "err-compiler-eof"); + } + } } \ No newline at end of file diff --git a/Rant/Core/Compiler/Syntax/RstFunction.cs b/Rant/Core/Compiler/Syntax/RstFunction.cs index 6bcaddb..f9b9994 100644 --- a/Rant/Core/Compiler/Syntax/RstFunction.cs +++ b/Rant/Core/Compiler/Syntax/RstFunction.cs @@ -99,7 +99,7 @@ public override IEnumerator<RST> Run(Sandbox sb) sb.AddOutputWriter(); yield return _args[i]; string strNum = sb.Return().Main; - if (!double.TryParse(strNum, out double d)) + if (!Util.ParseDouble(strNum, out double d)) { d = 0; if (Util.ParseInt(strNum, out int n)) diff --git a/Rant/Core/Framework/RantFunctionRegistry.cs b/Rant/Core/Framework/RantFunctionRegistry.cs index 9e58202..23f5d76 100644 --- a/Rant/Core/Framework/RantFunctionRegistry.cs +++ b/Rant/Core/Framework/RantFunctionRegistry.cs @@ -163,7 +163,7 @@ private static void Number(Sandbox sb, private static void Number(Sandbox sb, [RantDescription("The string to convert into a number.")] string input) { - sb.Print(double.TryParse(input, out double number) ? number : 0); + sb.Print(Util.ParseDouble(input, out double number) ? number : 0); } [RantFunction("numfmt")] diff --git a/Rant/Core/ObjectModel/RantObject.cs b/Rant/Core/ObjectModel/RantObject.cs index 6794057..1aeb93e 100644 --- a/Rant/Core/ObjectModel/RantObject.cs +++ b/Rant/Core/ObjectModel/RantObject.cs @@ -29,6 +29,7 @@ using System.Text; using Rant.Core.Compiler.Syntax; +using Rant.Core.Utilities; namespace Rant.Core.ObjectModel { @@ -300,7 +301,7 @@ public RantObject ConvertTo(RantObjectType type) return new RantObject(_boolean ? 1 : 0); case RantObjectType.String: { - return double.TryParse(_string, out double num) ? new RantObject(num) : Null; + return Util.ParseDouble(_string, out double num) ? new RantObject(num) : Null; } } break; diff --git a/Rant/Formats/Grammar/Aspect.cs b/Rant/Formats/Grammar/Aspect.cs new file mode 100644 index 0000000..d217d38 --- /dev/null +++ b/Rant/Formats/Grammar/Aspect.cs @@ -0,0 +1,35 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Formats.Grammar +{ + internal enum Aspect + { + Simple, + Continuous, + Perfect, + PerfectContinuous + } +} \ No newline at end of file diff --git a/Rant/Formats/Grammar/EnglishInflection.cs b/Rant/Formats/Grammar/EnglishInflection.cs new file mode 100644 index 0000000..6e2cab7 --- /dev/null +++ b/Rant/Formats/Grammar/EnglishInflection.cs @@ -0,0 +1,72 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +using System; +using System.Collections.Generic; + +namespace Rant.Formats.Grammar +{ + internal class EnglishInflection : Inflection + { + private static readonly Dictionary<string, PastForms> irregularSimplePastForms; + + static EnglishInflection() + { + irregularSimplePastForms = new Dictionary<string, PastForms> + { + { "eat", new PastForms("ate", "eaten") }, + { "begin", new PastForms("began", "begun") }, + { "bend", new PastForms("bended", "bent") }, + { "beat", new PastForms("beat", "beaten") }, + { "bind", new PastForms("bound") }, + { "bite", new PastForms("bit", "bitten") }, + { "cast", new PastForms("cast") } + }; + } + + public override string ConjugateVerb(string root, Person person, Gender gender, Tense tense, Aspect aspect) + { + throw new NotImplementedException(); + } + + private sealed class PastForms + { + public PastForms(string simple, string pastParticiple) + { + Simple = simple; + PastParticiple = pastParticiple; + } + + public PastForms(string form) + { + Simple = form; + PastParticiple = form; + } + + public string Simple { get; } + public string PastParticiple { get; } + } + } +} \ No newline at end of file diff --git a/Rant/Formats/Grammar/Gender.cs b/Rant/Formats/Grammar/Gender.cs new file mode 100644 index 0000000..1094e95 --- /dev/null +++ b/Rant/Formats/Grammar/Gender.cs @@ -0,0 +1,34 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Formats.Grammar +{ + internal enum Gender + { + Masculine, + Feminine, + Neuter + } +} \ No newline at end of file diff --git a/Rant/Formats/Grammar/Inflection.cs b/Rant/Formats/Grammar/Inflection.cs new file mode 100644 index 0000000..3cca3b8 --- /dev/null +++ b/Rant/Formats/Grammar/Inflection.cs @@ -0,0 +1,32 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Formats.Grammar +{ + internal abstract class Inflection + { + public abstract string ConjugateVerb(string root, Person person, Gender gender, Tense tense, Aspect aspect); + } +} \ No newline at end of file diff --git a/Rant/Formats/Grammar/Person.cs b/Rant/Formats/Grammar/Person.cs new file mode 100644 index 0000000..4e71f96 --- /dev/null +++ b/Rant/Formats/Grammar/Person.cs @@ -0,0 +1,37 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Formats.Grammar +{ + internal enum Person + { + FirstPersonSingular, + SecondPersonSingular, + ThirdPersonSingular, + FirstPersonPlural, + SecondPersonPlural, + ThirdPersonPlural + } +} \ No newline at end of file diff --git a/Rant/Formats/Grammar/Tense.cs b/Rant/Formats/Grammar/Tense.cs new file mode 100644 index 0000000..53a753b --- /dev/null +++ b/Rant/Formats/Grammar/Tense.cs @@ -0,0 +1,35 @@ +#region License + +// https://github.com/TheBerkin/Rant +// +// Copyright (c) 2017 Nicholas Fleck +// +// 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. + +#endregion + +namespace Rant.Formats.Grammar +{ + internal enum Tense + { + Present, + Past, + Future, + PastFuture + } +} \ No newline at end of file diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index dfa41e4..c7d6d2c 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -13,6 +13,8 @@ <FileAlignment>512</FileAlignment> <TargetFrameworkProfile> </TargetFrameworkProfile> + <NuGetPackageImportStamp> + </NuGetPackageImportStamp> </PropertyGroup> <PropertyGroup> <SignAssembly>false</SignAssembly> @@ -35,6 +37,7 @@ <Prefer32Bit>false</Prefer32Bit> <DocumentationFile> </DocumentationFile> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>none</DebugType> @@ -45,6 +48,7 @@ <WarningLevel>4</WarningLevel> <DocumentationFile>..\bin\MainBuild\Rant.xml</DocumentationFile> <Prefer32Bit>false</Prefer32Bit> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Install|AnyCPU' "> <OutputPath>C:\rant\</OutputPath> @@ -56,6 +60,7 @@ <ErrorReport>prompt</ErrorReport> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <Prefer32Bit>false</Prefer32Bit> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Install|x86' "> <OutputPath>C:\rant\x86\</OutputPath> @@ -132,6 +137,7 @@ <ErrorReport>prompt</ErrorReport> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <Prefer32Bit>false</Prefer32Bit> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Unity|x86'"> <OutputPath>..\bin\UnityBuild\x86\</OutputPath> @@ -185,8 +191,14 @@ <Compile Include="Core\Sandbox.State.cs" /> <Compile Include="Formats\EnglishNumberVerbalizer.cs" /> <Compile Include="Formats\GermanNumberVerbalizer.cs" /> + <Compile Include="Formats\Grammar\Aspect.cs" /> + <Compile Include="Formats\Grammar\EnglishInflection.cs" /> + <Compile Include="Formats\Grammar\Gender.cs" /> <Compile Include="Formats\NumberVerbalizer.cs" /> <Compile Include="Formats\QuotationMarks.cs" /> + <Compile Include="Formats\Grammar\Inflection.cs" /> + <Compile Include="Formats\Grammar\Person.cs" /> + <Compile Include="Formats\Grammar\Tense.cs" /> <Compile Include="Formats\WritingSystem.cs" /> <Compile Include="Localization\Txtres.cs" /> <Compile Include="Metadata\IRantFunction.cs" /> @@ -269,7 +281,6 @@ <Compile Include="Resources\RantPackage.cs" /> <Compile Include="Vocabulary\ClassCache.cs" /> <Compile Include="Vocabulary\Querying\Carrier.cs" /> - <Compile Include="Core\Constructs\Comparison.cs" /> <Compile Include="Vocabulary\Querying\CarrierComponent.cs" /> <Compile Include="Vocabulary\Querying\CarrierState.cs" /> <Compile Include="Vocabulary\Querying\ClassFilter.cs" /> diff --git a/Rant/Vocabulary/RantDictionaryTable.Importer.cs b/Rant/Vocabulary/RantDictionaryTable.Importer.cs index be78d78..f92bfbe 100644 --- a/Rant/Vocabulary/RantDictionaryTable.Importer.cs +++ b/Rant/Vocabulary/RantDictionaryTable.Importer.cs @@ -129,7 +129,7 @@ public static RantDictionaryTable FromStream(string origin, Stream stream) throw new RantTableLoadException(origin, line, dPos + 1, "err-table-subtype-args"); // If the first argument is a number, use it as the subtype index. - if (int.TryParse(args[0].Value, out int termIndex)) + if (Util.ParseInt(args[0].Value, out int termIndex)) { // Disallow negative term indices if (termIndex < 0) diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index df2e193..b052f60 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -37,412 +37,412 @@ namespace Rant.Vocabulary { - /// <summary> - /// Represents a named collection of dictionary entries. - /// </summary> - public sealed partial class RantDictionaryTable : RantResource - { - internal const string NSFW = "nsfw"; - internal const string MissingTerm = "[?]"; - private readonly HashSet<RantDictionaryEntry> _entriesHash = new HashSet<RantDictionaryEntry>(); - private readonly List<RantDictionaryEntry> _entriesList = new List<RantDictionaryEntry>(); // TODO: Use for indexing / weighted selection - private readonly HashSet<string> _hidden = new HashSet<string>(new[] { NSFW }); - private readonly Dictionary<int, HashSet<string>> _subtypeIndexMap = new Dictionary<int, HashSet<string>>(); - private readonly Dictionary<string, int> _subtypes = new Dictionary<string, int>(StringComparer.InvariantCultureIgnoreCase); - private readonly ClassCache _cache; - private bool _dirty = true; - private SyllableBuckets[] _syllableBuckets; - - /// <summary> - /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. - /// </summary> - /// <param name="name">The name of the table.</param> - /// <param name="termsPerEntry">The number of terms to store in each entry.</param> - /// <param name="hidden">Collection of hidden classes.</param> - public RantDictionaryTable(string name, int termsPerEntry, HashSet<string> hidden = null) - { - if (name == null) throw new ArgumentNullException(nameof(name)); - if (termsPerEntry <= 0) throw new ArgumentException(Txtres.GetString("err-bad-term-count")); - if (!Util.ValidateName(name)) throw new ArgumentException(Txtres.GetString("err-invalid-tablename", name)); - if (hidden != null) _hidden = hidden; - _cache = new ClassCache(); - TermsPerEntry = termsPerEntry; - Name = name; - - CreateSyllableBuckets(); - } - - internal RantDictionaryTable() - { - // Used by serializer - _cache = new ClassCache(); - } - - /// <summary> - /// Gets the name of the table. - /// </summary> - public string Name { get; private set; } - - /// <summary> - /// Gets the language code associated with the table (not yet used). - /// </summary> - public string Language { get; private set; } = "en-US"; - - /// <summary> - /// Gets the hidden classes of the table. - /// </summary> - public IEnumerable<string> HiddenClasses => _hidden.AsEnumerable(); - - /// <summary> - /// Gets the number of entries stored in the table. - /// </summary> - public int EntryCount => _entriesHash.Count; - - /// <summary> - /// Gets the number of terms required for entries contained in the current table. - /// </summary> - public int TermsPerEntry { get; private set; } - - /// <summary> - /// Enumerates the entries stored in the table. - /// </summary> - /// <returns></returns> - public IEnumerable<RantDictionaryEntry> GetEntries() => _entriesHash.AsEnumerable(); - - /// <summary> - /// Enumerates the subtypes contained in the current table. - /// </summary> - /// <returns></returns> - public IEnumerable<string> GetSubtypes() => _subtypes.Keys; - - /// <summary> - /// Determines whether the specified class is hidden by the table. - /// </summary> - /// <param name="className">The name of the class to check.</param> - /// <returns></returns> - public bool IsClassHidden(string className) - { - if (className == null) throw new ArgumentNullException(nameof(className)); - return _hidden.Contains(className); - } - - /// <summary> - /// Hides the specified class. - /// </summary> - /// <param name="className">The name of the class to hide.</param> - /// <returns></returns> - public bool HideClass(string className) => Util.ValidateName(className) && _hidden.Add(className); - - /// <summary> - /// Unhides the specified class. - /// </summary> - /// <param name="className">The name of the class to unhide.</param> - /// <returns></returns> - public bool UnhideClass(string className) => className != null && _hidden.Remove(className); - - /// <summary> - /// Determines whether weights are enabled on this table. - /// </summary> - public bool EnableWeighting { get; set; } = false; - - /// <summary> - /// Indicates whether the cache needs to be rebuilt. - /// </summary> - public bool CacheNeedsRebuild => _dirty; - - internal HashSet<RantDictionaryEntry> EntriesHash => _entriesHash; - - /// <summary> - /// Adds the specified entry to the table. - /// </summary> - /// <param name="entry">The entry to add to the table.</param> - /// <returns>True if successfully added; otherwise, False.</returns> - public bool AddEntry(RantDictionaryEntry entry) - { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - if (entry.TermCount != TermsPerEntry) return false; - if (!_entriesHash.Add(entry)) return false; - _entriesList.Add(entry); - _dirty = true; - return true; - } - - /// <summary> - /// Removes the specified entry from the table. - /// </summary> - /// <param name="entry">The entry to remove from the table.</param> - /// <returns>True if successfully removed; otherwise, False.</returns> - public bool RemoveEntry(RantDictionaryEntry entry) - { - if (entry == null) throw new ArgumentNullException(nameof(entry)); - if (!_entriesHash.Remove(entry)) return false; - _entriesList.Remove(entry); - _dirty = true; - return true; - } - - /// <summary> - /// Checks if the table contains the specified entry. - /// </summary> - /// <param name="entry">The entry to search for.</param> - /// <returns>True if found, False if not.</returns> - public bool ContainsEntry(RantDictionaryEntry entry) - { - return _entriesHash.Contains(entry ?? throw new ArgumentNullException(nameof(entry))); - } - - /// <summary> - /// Searches entries in the current table and enumerates every single distinct class found. - /// </summary> - /// <returns></returns> - public IEnumerable<string> GetClasses() - { - var lstClasses = new HashSet<string>(); - - foreach (string c in _entriesHash.SelectMany(e => e.GetClasses())) - if (lstClasses.Add(c)) yield return c; - } - - /// <summary> - /// Adds a subtype of the specified name to the table. - /// If a subtype with the name already exists, it will be overwritten. - /// Subtypes are case insensitive. - /// If the name is not a valid identifier string, it will not be accepted. - /// </summary> - /// <param name="subtypeName">The name of the subtype to add.</param> - /// <param name="index">The term index to associate with the name.</param> - /// <returns> - /// FALSE if the name was not a valid identifier or the index was out of range. TRUE if the operation was - /// successful. - /// </returns> - public bool AddSubtype(string subtypeName, int index) - { - if (index < 0 || index >= TermsPerEntry) return false; - if (subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); - if (!Util.ValidateName(subtypeName)) return false; - _subtypes[subtypeName] = index; - if (!_subtypeIndexMap.TryGetValue(index, out HashSet<string> subs)) - _subtypeIndexMap[index] = subs = new HashSet<string>(); - subs.Add(subtypeName); - return true; - } - - /// <summary> - /// Removes the specified subtype from the table, if it exists. - /// Subtypes are case insensitive. - /// </summary> - /// <param name="subtypeName">The name of the subtype to remove.</param> - /// <returns>TRUE if the subtype was found and removed. FALSE if the subtype was not found.</returns> - public bool RemoveSubtype(string subtypeName) - { - if (Util.IsNullOrWhiteSpace(subtypeName)) return false; - if (!_subtypes.ContainsKey(subtypeName)) return false; - if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out HashSet<string> subs)) - return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); - return false; - } - - /// <summary> - /// Retrieves the term index assigned to the specified subtype. - /// If the subtype is not found, the method will return -1. - /// If the subtype is a null, whitespace, or an empty string, the method will return 0. - /// </summary> - /// <param name="subtype">The subtype to look up.</param> - /// <returns></returns> - public int GetSubtypeIndex(string subtype) - { - if (Util.IsNullOrWhiteSpace(subtype)) return 0; - if (!Util.ValidateName(subtype)) return -1; - if (int.TryParse(subtype, out int index) && index >= 0) return index; - return _subtypes.TryGetValue(subtype, out index) ? index : -1; - } - - /// <summary> - /// Enumerates the subtypes associated with the specified term index. - /// </summary> - /// <param name="index">The index to get subtypes for.</param> - /// <returns></returns> - public IEnumerable<string> GetSubtypesForIndex(int index) - { - if (index < 0 || index >= TermsPerEntry) yield break; - if (!_subtypeIndexMap.TryGetValue(index, out HashSet<string> subs)) yield break; - foreach (string sub in subs) yield return sub; - } - - /// <summary> - /// Adds another table's entries to the current table, given that they share the same name and term count. - /// </summary> - /// <param name="other">The table whose entries will be added to the current instance.</param> - /// <returns>True if merge succeeded; otherwise, False.</returns> - public bool Merge(RantDictionaryTable other) - { - if (other.Name != Name || other == this) return false; - if (other.TermsPerEntry != TermsPerEntry) return false; - _entriesHash.AddRange(other._entriesHash); - _entriesList.AddRange(other._entriesHash); - _dirty = true; - RebuildCache(); - return true; - } - - /// <summary> - /// Optimizes the table. Call this after writing items to the table or removing items from a table. - /// If you're writing or removing multiple items, call this after all the actions have been performed. - /// </summary> - public void RebuildCache() - { - if (!_dirty) return; - _cache.BuildCache(this); - CreateSyllableBuckets(); - for (int i = 0; i < TermsPerEntry; i++) - _syllableBuckets[i] = new SyllableBuckets(i, _entriesList); - _dirty = false; - } - - internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) - { - RebuildCache(); - - int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() - ? GetSubtypeIndex(query.PluralSubtype) - : GetSubtypeIndex(query.Subtype); - - if (index == -1) return null; - - var filtersEnumerable = query.GetNonClassFilters(); - var filters = filtersEnumerable as Filter[] ?? filtersEnumerable.ToArray(); - - IEnumerable<RantDictionaryEntry> pool - = _cache.Filter(query.GetClassFilters().SelectMany(cf => cf.GenerateRequiredSet(sb.RNG)).Distinct(), dictionary, this)?.ToList(); - - if (pool == null) return null; - - if (filters.Length > 0) - pool = pool.Where((e, i) => filters.OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, index, query))); - - if (!pool.Any()) return null; - - return query.HasCarrier - ? syncState.GetEntry(query.Carrier, index, pool, sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index] - : pool.ToList().PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; - } - - internal override void DeserializeData(BsonItem data) - { - // General data - Name = data["name"]; - TermsPerEntry = data["termc"]; - Language = data["lang"]; - - // Subtypes - var subs = data["subs"].Values; - int si = 0; - foreach (var subList in subs) - { - foreach (var sub in subList.Values) AddSubtype(sub, si); - si++; - } - - // Hidden classes - foreach (var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); - - var entries = data["entries"]; - int count = entries.Count; - - // Entries - for (int i = 0; i < count; i++) - { - var entryData = entries[i]; - - var termsObject = entryData["terms"]; - + /// <summary> + /// Represents a named collection of dictionary entries. + /// </summary> + public sealed partial class RantDictionaryTable : RantResource + { + internal const string NSFW = "nsfw"; + internal const string MissingTerm = "[?]"; + private readonly HashSet<RantDictionaryEntry> _entriesHash = new HashSet<RantDictionaryEntry>(); + private readonly List<RantDictionaryEntry> _entriesList = new List<RantDictionaryEntry>(); // TODO: Use for indexing / weighted selection + private readonly HashSet<string> _hidden = new HashSet<string>(new[] { NSFW }); + private readonly Dictionary<int, HashSet<string>> _subtypeIndexMap = new Dictionary<int, HashSet<string>>(); + private readonly Dictionary<string, int> _subtypes = new Dictionary<string, int>(StringComparer.InvariantCultureIgnoreCase); + private readonly ClassCache _cache; + private bool _dirty = true; + private SyllableBuckets[] _syllableBuckets; + + /// <summary> + /// Initializes a new instance of the RantDictionaryTable class with the specified name and term count. + /// </summary> + /// <param name="name">The name of the table.</param> + /// <param name="termsPerEntry">The number of terms to store in each entry.</param> + /// <param name="hidden">Collection of hidden classes.</param> + public RantDictionaryTable(string name, int termsPerEntry, HashSet<string> hidden = null) + { + if (name == null) throw new ArgumentNullException(nameof(name)); + if (termsPerEntry <= 0) throw new ArgumentException(Txtres.GetString("err-bad-term-count")); + if (!Util.ValidateName(name)) throw new ArgumentException(Txtres.GetString("err-invalid-tablename", name)); + if (hidden != null) _hidden = hidden; + _cache = new ClassCache(); + TermsPerEntry = termsPerEntry; + Name = name; + + CreateSyllableBuckets(); + } + + internal RantDictionaryTable() + { + // Used by serializer + _cache = new ClassCache(); + } + + /// <summary> + /// Gets the name of the table. + /// </summary> + public string Name { get; private set; } + + /// <summary> + /// Gets the language code associated with the table (not yet used). + /// </summary> + public string Language { get; private set; } = "en-US"; + + /// <summary> + /// Gets the hidden classes of the table. + /// </summary> + public IEnumerable<string> HiddenClasses => _hidden.AsEnumerable(); + + /// <summary> + /// Gets the number of entries stored in the table. + /// </summary> + public int EntryCount => _entriesHash.Count; + + /// <summary> + /// Gets the number of terms required for entries contained in the current table. + /// </summary> + public int TermsPerEntry { get; private set; } + + /// <summary> + /// Enumerates the entries stored in the table. + /// </summary> + /// <returns></returns> + public IEnumerable<RantDictionaryEntry> GetEntries() => _entriesHash.AsEnumerable(); + + /// <summary> + /// Enumerates the subtypes contained in the current table. + /// </summary> + /// <returns></returns> + public IEnumerable<string> GetSubtypes() => _subtypes.Keys; + + /// <summary> + /// Determines whether the specified class is hidden by the table. + /// </summary> + /// <param name="className">The name of the class to check.</param> + /// <returns></returns> + public bool IsClassHidden(string className) + { + if (className == null) throw new ArgumentNullException(nameof(className)); + return _hidden.Contains(className); + } + + /// <summary> + /// Hides the specified class. + /// </summary> + /// <param name="className">The name of the class to hide.</param> + /// <returns></returns> + public bool HideClass(string className) => Util.ValidateName(className) && _hidden.Add(className); + + /// <summary> + /// Unhides the specified class. + /// </summary> + /// <param name="className">The name of the class to unhide.</param> + /// <returns></returns> + public bool UnhideClass(string className) => className != null && _hidden.Remove(className); + + /// <summary> + /// Determines whether weights are enabled on this table. + /// </summary> + public bool EnableWeighting { get; set; } = false; + + /// <summary> + /// Indicates whether the cache needs to be rebuilt. + /// </summary> + public bool CacheNeedsRebuild => _dirty; + + internal HashSet<RantDictionaryEntry> EntriesHash => _entriesHash; + + /// <summary> + /// Adds the specified entry to the table. + /// </summary> + /// <param name="entry">The entry to add to the table.</param> + /// <returns>True if successfully added; otherwise, False.</returns> + public bool AddEntry(RantDictionaryEntry entry) + { + if (entry == null) throw new ArgumentNullException(nameof(entry)); + if (entry.TermCount != TermsPerEntry) return false; + if (!_entriesHash.Add(entry)) return false; + _entriesList.Add(entry); + _dirty = true; + return true; + } + + /// <summary> + /// Removes the specified entry from the table. + /// </summary> + /// <param name="entry">The entry to remove from the table.</param> + /// <returns>True if successfully removed; otherwise, False.</returns> + public bool RemoveEntry(RantDictionaryEntry entry) + { + if (entry == null) throw new ArgumentNullException(nameof(entry)); + if (!_entriesHash.Remove(entry)) return false; + _entriesList.Remove(entry); + _dirty = true; + return true; + } + + /// <summary> + /// Checks if the table contains the specified entry. + /// </summary> + /// <param name="entry">The entry to search for.</param> + /// <returns>True if found, False if not.</returns> + public bool ContainsEntry(RantDictionaryEntry entry) + { + return _entriesHash.Contains(entry ?? throw new ArgumentNullException(nameof(entry))); + } + + /// <summary> + /// Searches entries in the current table and enumerates every single distinct class found. + /// </summary> + /// <returns></returns> + public IEnumerable<string> GetClasses() + { + var lstClasses = new HashSet<string>(); + + foreach (string c in _entriesHash.SelectMany(e => e.GetClasses())) + if (lstClasses.Add(c)) yield return c; + } + + /// <summary> + /// Adds a subtype of the specified name to the table. + /// If a subtype with the name already exists, it will be overwritten. + /// Subtypes are case insensitive. + /// If the name is not a valid identifier string, it will not be accepted. + /// </summary> + /// <param name="subtypeName">The name of the subtype to add.</param> + /// <param name="index">The term index to associate with the name.</param> + /// <returns> + /// FALSE if the name was not a valid identifier or the index was out of range. TRUE if the operation was + /// successful. + /// </returns> + public bool AddSubtype(string subtypeName, int index) + { + if (index < 0 || index >= TermsPerEntry) return false; + if (subtypeName == null) throw new ArgumentNullException(nameof(subtypeName)); + if (!Util.ValidateName(subtypeName)) return false; + _subtypes[subtypeName] = index; + if (!_subtypeIndexMap.TryGetValue(index, out HashSet<string> subs)) + _subtypeIndexMap[index] = subs = new HashSet<string>(); + subs.Add(subtypeName); + return true; + } + + /// <summary> + /// Removes the specified subtype from the table, if it exists. + /// Subtypes are case insensitive. + /// </summary> + /// <param name="subtypeName">The name of the subtype to remove.</param> + /// <returns>TRUE if the subtype was found and removed. FALSE if the subtype was not found.</returns> + public bool RemoveSubtype(string subtypeName) + { + if (Util.IsNullOrWhiteSpace(subtypeName)) return false; + if (!_subtypes.ContainsKey(subtypeName)) return false; + if (_subtypeIndexMap.TryGetValue(_subtypes[subtypeName], out HashSet<string> subs)) + return subs.Remove(subtypeName) && _subtypes.Remove(subtypeName); + return false; + } + + /// <summary> + /// Retrieves the term index assigned to the specified subtype. + /// If the subtype is not found, the method will return -1. + /// If the subtype is a null, whitespace, or an empty string, the method will return 0. + /// </summary> + /// <param name="subtype">The subtype to look up.</param> + /// <returns></returns> + public int GetSubtypeIndex(string subtype) + { + if (Util.IsNullOrWhiteSpace(subtype)) return 0; + if (!Util.ValidateName(subtype)) return -1; + if (Util.ParseInt(subtype, out int index) && index >= 0) return index; + return _subtypes.TryGetValue(subtype, out index) ? index : -1; + } + + /// <summary> + /// Enumerates the subtypes associated with the specified term index. + /// </summary> + /// <param name="index">The index to get subtypes for.</param> + /// <returns></returns> + public IEnumerable<string> GetSubtypesForIndex(int index) + { + if (index < 0 || index >= TermsPerEntry) yield break; + if (!_subtypeIndexMap.TryGetValue(index, out HashSet<string> subs)) yield break; + foreach (string sub in subs) yield return sub; + } + + /// <summary> + /// Adds another table's entries to the current table, given that they share the same name and term count. + /// </summary> + /// <param name="other">The table whose entries will be added to the current instance.</param> + /// <returns>True if merge succeeded; otherwise, False.</returns> + public bool Merge(RantDictionaryTable other) + { + if (other.Name != Name || other == this) return false; + if (other.TermsPerEntry != TermsPerEntry) return false; + _entriesHash.AddRange(other._entriesHash); + _entriesList.AddRange(other._entriesHash); + _dirty = true; + RebuildCache(); + return true; + } + + /// <summary> + /// Optimizes the table. Call this after writing items to the table or removing items from a table. + /// If you're writing or removing multiple items, call this after all the actions have been performed. + /// </summary> + public void RebuildCache() + { + if (!_dirty) return; + _cache.BuildCache(this); + CreateSyllableBuckets(); + for (int i = 0; i < TermsPerEntry; i++) + _syllableBuckets[i] = new SyllableBuckets(i, _entriesList); + _dirty = false; + } + + internal RantDictionaryTerm Query(RantDictionary dictionary, Sandbox sb, Query query, CarrierState syncState) + { + RebuildCache(); + + int index = !String.IsNullOrEmpty(query.PluralSubtype) && sb.TakePlural() + ? GetSubtypeIndex(query.PluralSubtype) + : GetSubtypeIndex(query.Subtype); + + if (index == -1) return null; + + var filtersEnumerable = query.GetNonClassFilters(); + var filters = filtersEnumerable as Filter[] ?? filtersEnumerable.ToArray(); + + IEnumerable<RantDictionaryEntry> pool + = _cache.Filter(query.GetClassFilters().SelectMany(cf => cf.GenerateRequiredSet(sb.RNG)).Distinct(), dictionary, this)?.ToList(); + + if (pool == null) return null; + + if (filters.Length > 0) + pool = pool.Where((e, i) => filters.OrderBy(f => f.Priority).All(f => f.Test(dictionary, this, e, index, query))); + + if (!pool.Any()) return null; + + return query.HasCarrier + ? syncState.GetEntry(query.Carrier, index, pool, sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index] + : pool.ToList().PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; + } + + internal override void DeserializeData(BsonItem data) + { + // General data + Name = data["name"]; + TermsPerEntry = data["termc"]; + Language = data["lang"]; + + // Subtypes + var subs = data["subs"].Values; + int si = 0; + foreach (var subList in subs) + { + foreach (var sub in subList.Values) AddSubtype(sub, si); + si++; + } + + // Hidden classes + foreach (var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); + + var entries = data["entries"]; + int count = entries.Count; + + // Entries + for (int i = 0; i < count; i++) + { + var entryData = entries[i]; + + var termsObject = entryData["terms"]; + var termArray = new RantDictionaryTerm[termsObject.Count]; - int j = 0; - foreach (var termData in termsObject.Values) - { - var value = (string)termData["value"]; - var pron = (string)termData["pron"]; - var valueSplit = (int)(termData["value-split"] ?? -1); - var pronSplit = (int)(termData["pron-split"] ?? -1); - termArray[j++] = new RantDictionaryTerm(value, pron, valueSplit, pronSplit); - } - - var entryClasses = (string[])entryData["classes"]; - var entry = new RantDictionaryEntry(termArray, entryClasses, entryData["weight"] ?? 1); - // Optional classes - foreach (var optionalClass in entryData["optional-classes"].Values) - entry.AddClass(optionalClass, true); - - // Metadata - var meta = entryData["metadata"]; - foreach (string metaKey in meta.Keys) - entry.SetMetadata(metaKey, meta[metaKey].Value); - - AddEntry(entry); - } - } - - internal override BsonItem SerializeData() - { - var data = new BsonItem - { - ["name"] = Name, - ["lang"] = Language, - ["termc"] = TermsPerEntry - }; - - var subs = new BsonItem[TermsPerEntry]; - for (int i = 0; i < TermsPerEntry; i++) - subs[i] = new BsonItem(GetSubtypesForIndex(i).ToArray()); - data["subs"] = new BsonItem(subs); - - data["hidden-classes"] = new BsonItem(_hidden.ToArray()); - - var entries = new BsonItem[_entriesList.Count]; - for (int i = 0; i < _entriesList.Count; i++) - { - var entry = _entriesList[i]; - var entryData = new BsonItem(); - var termData = new BsonItem[TermsPerEntry]; - - for (int j = 0; j < TermsPerEntry; j++) - { - termData[j] = new BsonItem - { - ["value"] = entry[j].Value, - ["pron"] = entry[j].Pronunciation, - ["value-split"] = entry[j].ValueSplitIndex, - ["pron-split"] = entry[j].PronunciationSplitIndex - }; - } - entryData["terms"] = new BsonItem(termData); - - entryData["classes"] = new BsonItem(entry.GetRequiredClasses().ToArray()); - entryData["optional-classes"] = new BsonItem(entry.GetOptionalClasses().ToArray()); - - var metaData = new BsonItem(); - foreach (string metaKey in entry.GetMetadataKeys()) - metaData[metaKey] = new BsonItem(entry.GetMetadata(metaKey)); - entryData["metadata"] = metaData; - entries[i] = entryData; - } - - data["entries"] = new BsonItem(entries); - - return data; - } - - internal override void Load(RantEngine engine) - { - engine.Dictionary.AddTable(this); - } - - internal void CreateSyllableBuckets() - { - if (_syllableBuckets != null) return; - _syllableBuckets = new SyllableBuckets[TermsPerEntry]; - for (int i = 0; i < TermsPerEntry; i++) - _syllableBuckets[i] = new SyllableBuckets(i, new RantDictionaryEntry[] { }); - } - } + int j = 0; + foreach (var termData in termsObject.Values) + { + var value = (string)termData["value"]; + var pron = (string)termData["pron"]; + var valueSplit = (int)(termData["value-split"] ?? -1); + var pronSplit = (int)(termData["pron-split"] ?? -1); + termArray[j++] = new RantDictionaryTerm(value, pron, valueSplit, pronSplit); + } + + var entryClasses = (string[])entryData["classes"]; + var entry = new RantDictionaryEntry(termArray, entryClasses, entryData["weight"] ?? 1); + // Optional classes + foreach (var optionalClass in entryData["optional-classes"].Values) + entry.AddClass(optionalClass, true); + + // Metadata + var meta = entryData["metadata"]; + foreach (string metaKey in meta.Keys) + entry.SetMetadata(metaKey, meta[metaKey].Value); + + AddEntry(entry); + } + } + + internal override BsonItem SerializeData() + { + var data = new BsonItem + { + ["name"] = Name, + ["lang"] = Language, + ["termc"] = TermsPerEntry + }; + + var subs = new BsonItem[TermsPerEntry]; + for (int i = 0; i < TermsPerEntry; i++) + subs[i] = new BsonItem(GetSubtypesForIndex(i).ToArray()); + data["subs"] = new BsonItem(subs); + + data["hidden-classes"] = new BsonItem(_hidden.ToArray()); + + var entries = new BsonItem[_entriesList.Count]; + for (int i = 0; i < _entriesList.Count; i++) + { + var entry = _entriesList[i]; + var entryData = new BsonItem(); + var termData = new BsonItem[TermsPerEntry]; + + for (int j = 0; j < TermsPerEntry; j++) + { + termData[j] = new BsonItem + { + ["value"] = entry[j].Value, + ["pron"] = entry[j].Pronunciation, + ["value-split"] = entry[j].ValueSplitIndex, + ["pron-split"] = entry[j].PronunciationSplitIndex + }; + } + entryData["terms"] = new BsonItem(termData); + + entryData["classes"] = new BsonItem(entry.GetRequiredClasses().ToArray()); + entryData["optional-classes"] = new BsonItem(entry.GetOptionalClasses().ToArray()); + + var metaData = new BsonItem(); + foreach (string metaKey in entry.GetMetadataKeys()) + metaData[metaKey] = new BsonItem(entry.GetMetadata(metaKey)); + entryData["metadata"] = metaData; + entries[i] = entryData; + } + + data["entries"] = new BsonItem(entries); + + return data; + } + + internal override void Load(RantEngine engine) + { + engine.Dictionary.AddTable(this); + } + + internal void CreateSyllableBuckets() + { + if (_syllableBuckets != null) return; + _syllableBuckets = new SyllableBuckets[TermsPerEntry]; + for (int i = 0; i < TermsPerEntry; i++) + _syllableBuckets[i] = new SyllableBuckets(i, new RantDictionaryEntry[] { }); + } + } } \ No newline at end of file diff --git a/Samples/gradient.rant b/Samples/gradient.rant new file mode 100644 index 0000000..a013d70 --- /dev/null +++ b/Samples/gradient.rant @@ -0,0 +1,12 @@ +# Prints a "gradient" out of shaded box characters + +[rs:50;\n] +{ + [r:100] + { + ([div:[re];3])\u2591| + ([div:[re];2])\u2592| + ([re])\u2593| + ([rr])\s + } +} \ No newline at end of file From 0cd0a34b37e4e29d6c58a636ff6b19a073b55aba Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Thu, 13 Apr 2017 02:39:21 -0500 Subject: [PATCH 202/213] Improve gradient sample --- Samples/gradient.rant | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Samples/gradient.rant b/Samples/gradient.rant index a013d70..26d3a8c 100644 --- a/Samples/gradient.rant +++ b/Samples/gradient.rant @@ -1,12 +1,14 @@ # Prints a "gradient" out of shaded box characters - -[rs:50;\n] +[rs:50;\n] # 50 rows { - [r:100] + [r:100] # 100 cols { - ([div:[re];3])\u2591| - ([div:[re];2])\u2592| - ([re])\u2593| - ([rr])\s + { + # Print box with probability decreasing with inner repeater iteration + ([rr]){\u2591|(2)\u2592|(4)\u2593}| + # Print space with probability increasing with inner repeater iteration + ([mul:[re];1.5])\s + } } -} \ No newline at end of file +} +# Note: Delete the braces on lines 6 and 11 and see what happens! \ No newline at end of file From c63e9bea3f3e05ab5b64a81d0a920dff1818aee4 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Thu, 13 Apr 2017 03:02:23 -0500 Subject: [PATCH 203/213] Add streetname.rant sample --- Samples/streetname.rant | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Samples/streetname.rant diff --git a/Samples/streetname.rant b/Samples/streetname.rant new file mode 100644 index 0000000..721bd42 --- /dev/null +++ b/Samples/streetname.rant @@ -0,0 +1,14 @@ +[case:word] +[rs:25;\n] +{ + { + [`[^aeiou\-\s]`: + {{(10)|{[numfmt:verbal;[n:1;10]]|<verb.pp-transitive>}\s}<noun..pl-place|animal|person|tool?!`\s`>|<adj-appearance?!`\s`>|<surname?!`\s`>} + ; + {(10)[match]|[capsinfer:[match]]{b|t|c|n|m|l|k|g|w|cc|ll|dd|gg|(.1)x}[case:word]} + ] + + {(5)|\s{creek|lake|river|rock}|{wood|way}} + }\s + {road|street|avenue|boulevard|lane|drive|way|court|trail|parkway|view|cove|crossing|alley|circle|drive} +} \ No newline at end of file From 07d16cbb6ab1151aa4617620bf34e2aeeb4fa956 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Thu, 13 Apr 2017 03:04:14 -0500 Subject: [PATCH 204/213] Tidy up streetname.rant --- Samples/streetname.rant | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Samples/streetname.rant b/Samples/streetname.rant index 721bd42..4f2f9ba 100644 --- a/Samples/streetname.rant +++ b/Samples/streetname.rant @@ -1,14 +1,11 @@ [case:word] [rs:25;\n] { - { - [`[^aeiou\-\s]`: - {{(10)|{[numfmt:verbal;[n:1;10]]|<verb.pp-transitive>}\s}<noun..pl-place|animal|person|tool?!`\s`>|<adj-appearance?!`\s`>|<surname?!`\s`>} + [`[^aeiou\-\s]`: + {{(10)|{[numfmt:verbal;[n:1;10]]|<verb.pp-transitive>}\s}<noun..pl-place|animal|person|tool?!`\s`>|<adj-appearance?!`\s`>|<surname?!`\s`>} ; - {(10)[match]|[capsinfer:[match]]{b|t|c|n|m|l|k|g|w|cc|ll|dd|gg|(.1)x}[case:word]} - ] - - {(5)|\s{creek|lake|river|rock}|{wood|way}} - }\s + {(10)[match]|[capsinfer:[match]]{b|t|c|n|m|l|k|g|w|cc|ll|dd|gg|(.1)x}[case:word]} + ] + {(5)|\s{creek|lake|river|rock}|{wood|way}}\s {road|street|avenue|boulevard|lane|drive|way|court|trail|parkway|view|cove|crossing|alley|circle|drive} } \ No newline at end of file From 10f4fb9e6a59f779955302b6cef299796e53ef79 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Fri, 14 Apr 2017 12:11:10 -0500 Subject: [PATCH 205/213] Deprecate Do() overloads that take strings for patterns --- Rant/Core/Compiler/Parsing/QueryParser.cs | 2 +- Rant/Localization/de-DE.lang | 1 + Rant/Localization/en-US.lang | 1 + Rant/RantEngine.cs | 7 +++++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Rant/Core/Compiler/Parsing/QueryParser.cs b/Rant/Core/Compiler/Parsing/QueryParser.cs index c0a2fdb..c28f034 100644 --- a/Rant/Core/Compiler/Parsing/QueryParser.cs +++ b/Rant/Core/Compiler/Parsing/QueryParser.cs @@ -131,7 +131,7 @@ public override IEnumerator<Parser> Parse(RantCompiler compiler, CompileContext reader.SkipSpace(); bool blacklist = token.Type == R.Without; - var regexFilter = reader.Read(R.Regex, "regex filter rule"); + var regexFilter = reader.Read(R.Regex, "acc-regex-filter-rule"); var options = RegexOptions.Compiled | RegexOptions.ExplicitCapture; if (reader.IsNext(R.RegexFlags)) { diff --git a/Rant/Localization/de-DE.lang b/Rant/Localization/de-DE.lang index fec9cd8..c58bc56 100644 --- a/Rant/Localization/de-DE.lang +++ b/Rant/Localization/de-DE.lang @@ -82,6 +82,7 @@ err-runtime-div-by-zero = "Nulldivision versucht." acc-carrier-name = "Anfragezustandspeichernamen" acc-table-name = "Tabellenamen" acc-class-filter-rule = "Klassenfilterteil" +acc-regex-filter-rule = "Regexfilterteil" acc-syllable-range-value = "Silbenbereichswert" acc-function-name = "Funktionnamen" acc-subroutine-name = "Unterprogrammnamen" diff --git a/Rant/Localization/en-US.lang b/Rant/Localization/en-US.lang index 346bb56..9f83191 100644 --- a/Rant/Localization/en-US.lang +++ b/Rant/Localization/en-US.lang @@ -88,6 +88,7 @@ err-runtime-div-by-zero = "Attempted to divide by zero." acc-carrier-name = "carrier name" acc-table-name = "table name" acc-class-filter-rule = "class filter rule" +acc-regex-filter-rule = "regex filter rule" acc-syllable-range-value = "syllable range value" acc-function-name = "function name" acc-subroutine-name = "subroutine name" diff --git a/Rant/RantEngine.cs b/Rant/RantEngine.cs index 19e0ba6..9c3eac5 100644 --- a/Rant/RantEngine.cs +++ b/Rant/RantEngine.cs @@ -268,6 +268,7 @@ private RantOutput RunVM(Sandbox vm, double timeout) /// <param name="timeout">The maximum number of seconds that the pattern will execute for.</param> /// <param name="args">The arguments to pass to the pattern.</param> /// <returns></returns> + [Obsolete("Use an overload of Do() that accepts a RantProgram instead of a string.")] public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => RunVM( new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), @@ -284,6 +285,7 @@ public RantOutput Do(string input, int charLimit = 0, double timeout = -1, RantP /// <param name="timeout">The maximum number of seconds that the pattern will execute for.</param> /// <param name="args">The arguments to pass to the pattern.</param> /// <returns></returns> + [Obsolete("Use an overload of Do() that accepts a RantProgram instead of a string.")] public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => RunVM( new Sandbox(this, RantProgram.CompileFile(path), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), args), @@ -301,6 +303,7 @@ public RantOutput DoFile(string path, int charLimit = 0, double timeout = -1, Ra /// <param name="timeout">The maximum number of seconds that the pattern will execute for.</param> /// <param name="args">The arguments to pass to the pattern.</param> /// <returns></returns> + [Obsolete("Use an overload of Do() that accepts a RantProgram instead of a string.")] public RantOutput Do(string input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => RunVM(new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args), timeout); @@ -334,6 +337,7 @@ public RantOutput DoFile(string path, long seed, int charLimit = 0, double timeo /// <param name="timeout">The maximum number of seconds that the pattern will execute for.</param> /// <param name="args">The arguments to pass to the pattern.</param> /// <returns></returns> + [Obsolete("Use an overload of Do() that accepts a RantProgram instead of a string.")] public RantOutput Do(string input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => RunVM(new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args), timeout); @@ -456,6 +460,7 @@ public IEnumerable<RantOutput> DoSerial(RantProgram input, RNG rng, int charLimi /// <param name="timeout">The maximum number of seconds that the pattern will execute for.</param> /// <param name="args">The arguments to pass to the pattern.</param> /// <returns></returns> + [Obsolete("Use an overload of DoSerial() that accepts a RantProgram instead of a string.")] public IEnumerable<RantOutput> DoSerial(string input, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => new Sandbox(this, RantProgram.CompileString(input), new RNG(Seeds.NextRaw()), charLimit, GetPreservedCarrierState(), @@ -473,6 +478,7 @@ public IEnumerable<RantOutput> DoSerial(string input, int charLimit = 0, double /// <param name="timeout">The maximum number of seconds that the pattern will execute for.</param> /// <param name="args">The arguments to pass to the pattern.</param> /// <returns></returns> + [Obsolete("Use an overload of DoSerial() that accepts a RantProgram instead of a string.")] public IEnumerable<RantOutput> DoSerial(string input, long seed, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => new Sandbox(this, RantProgram.CompileString(input), new RNG(seed), charLimit, GetPreservedCarrierState(), args) @@ -490,6 +496,7 @@ public IEnumerable<RantOutput> DoSerial(string input, long seed, int charLimit = /// <param name="timeout">The maximum number of seconds that the pattern will execute for.</param> /// <param name="args">The arguments to pass to the pattern.</param> /// <returns></returns> + [Obsolete("Use an overload of DoSerial() that accepts a RantProgram instead of a string.")] public IEnumerable<RantOutput> DoSerial(string input, RNG rng, int charLimit = 0, double timeout = -1, RantProgramArgs args = null) => new Sandbox(this, RantProgram.CompileString(input), rng, charLimit, GetPreservedCarrierState(), args).RunSerial(timeout); From 4042e4f8f03a739f80c2ee54df3f772d31dba859 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Mon, 17 Apr 2017 12:16:15 -0500 Subject: [PATCH 206/213] Localize package metadata exceptions --- Rant/Resources/RantPackage.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 7aa3a8c..8e81bc3 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -36,6 +36,7 @@ using Rant.Core.Utilities; using static Rant.Localization.Txtres; +using Rant.Localization; namespace Rant.Resources { @@ -61,7 +62,7 @@ public string Title get { return _title; } set { - if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("Title cannot be empty."); + if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException(GetString("err-empty-pkg-title")); _title = value; } } @@ -74,7 +75,7 @@ public string ID get { return _id; } set { - if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException("ID cannot be empty."); + if (Util.IsNullOrWhiteSpace(value)) throw new ArgumentException(GetString("err-empty-pkg-id")); _id = value; } } From 3f97019269eb158df8b691f7bd31093d19910691 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Mon, 17 Apr 2017 18:00:01 -0500 Subject: [PATCH 207/213] Replace BSON package format with static binary format --- Rant.Tests/Misc/Bson.cs | 116 -- Rant.Tests/Rant.Tests.csproj | 1 - Rant.Tools/Commands/PackCommand.cs | 19 +- Rant/Core/IO/Bson/BsonDocument.cs | 390 ----- Rant/Core/IO/Bson/BsonItem.cs | 298 ---- Rant/Core/IO/Bson/BsonStringTableMode.cs | 48 - Rant/Core/IO/Compression/CRC.cs | 85 - Rant/Core/IO/Compression/EasyCompressor.cs | 101 -- Rant/Core/IO/Compression/ICoder.cs | 199 --- Rant/Core/IO/Compression/LZ/IMatchFinder.cs | 48 - Rant/Core/IO/Compression/LZ/LzBinTree.cs | 411 ----- Rant/Core/IO/Compression/LZ/LzInWindow.cs | 170 -- Rant/Core/IO/Compression/LZ/LzOutWindow.cs | 131 -- Rant/Core/IO/Compression/LZMA/LzmaBase.cs | 114 -- Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs | 400 ----- Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs | 1514 ----------------- .../IO/Compression/RangeCoder/RangeCoder.cs | 253 --- .../Compression/RangeCoder/RangeCoderBit.cs | 150 -- .../RangeCoder/RangeCoderBitTree.cs | 180 -- Rant/Core/IO/EasyReader.cs | 9 +- Rant/Core/IO/EasyWriter.cs | 7 +- Rant/Rant.csproj | 16 - Rant/RantProgram.cs | 39 +- Rant/Resources/RantPackage.cs | 184 +- Rant/Resources/RantResource.cs | 37 +- Rant/Vocabulary/RantDictionaryTable.cs | 170 +- 26 files changed, 233 insertions(+), 4857 deletions(-) delete mode 100644 Rant.Tests/Misc/Bson.cs delete mode 100644 Rant/Core/IO/Bson/BsonDocument.cs delete mode 100644 Rant/Core/IO/Bson/BsonItem.cs delete mode 100644 Rant/Core/IO/Bson/BsonStringTableMode.cs delete mode 100644 Rant/Core/IO/Compression/CRC.cs delete mode 100644 Rant/Core/IO/Compression/EasyCompressor.cs delete mode 100644 Rant/Core/IO/Compression/ICoder.cs delete mode 100644 Rant/Core/IO/Compression/LZ/IMatchFinder.cs delete mode 100644 Rant/Core/IO/Compression/LZ/LzBinTree.cs delete mode 100644 Rant/Core/IO/Compression/LZ/LzInWindow.cs delete mode 100644 Rant/Core/IO/Compression/LZ/LzOutWindow.cs delete mode 100644 Rant/Core/IO/Compression/LZMA/LzmaBase.cs delete mode 100644 Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs delete mode 100644 Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs delete mode 100644 Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs delete mode 100644 Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs delete mode 100644 Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs diff --git a/Rant.Tests/Misc/Bson.cs b/Rant.Tests/Misc/Bson.cs deleted file mode 100644 index fd17f44..0000000 --- a/Rant.Tests/Misc/Bson.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System.IO; -using System.Linq; - -using NUnit.Framework; - -using Rant.Core.IO.Bson; - -namespace Rant.Tests.Misc -{ - [TestFixture] - public class Bson - { - private void CompareByteArrays(byte[] array1, byte[] array2) - { - for (int i = 0; - i < (array1.Length > array2.Length ? array2.Length : array1.Length); - i++) - { - // we use this instead of data.SequenceEqual because this tells us exactly what byte is wrong - if (array1[i] != array2[i]) - { - // print in hex instead of decimal - Assert.AreEqual(array2[i].ToString("X2"), array1[i].ToString("X2")); - } - } - } - - [Test] - public void BsonArray() - { - var document = new BsonDocument { ["test"] = new BsonItem(new[] { "testing", "123" }) }; - var data = document.ToByteArray(); - var readDocument = BsonDocument.Read(data); - Assert.AreEqual(2, readDocument["test"].Count); - Assert.AreEqual("testing", readDocument["test"][0].Value); - Assert.AreEqual("123", readDocument["test"][1].Value); - } - - [Test] - public void BsonArrayOfObjects() - { - var document = new BsonDocument(); - var item1 = new BsonItem { ["prop"] = true }; - var item2 = new BsonItem { ["pro2"] = false }; - document["test"] = new BsonItem(new[] { item1, item2 }); - var data = document.ToByteArray(); - var readDocument = BsonDocument.Read(data); - Assert.AreEqual(2, readDocument["test"].Count); - Assert.AreEqual(true, readDocument["test"][0]["prop"].Value); - } - - [Test(Description = "Make sure the generated file is exactly identical to a test file.")] - public void BsonByteAccurate() - { - // the example document: { "number": 2 } in bson - var document = new BsonDocument { ["number"] = 2 }; - var data = document.ToByteArray(); - File.WriteAllBytes("TestOutput.bson", data); // write the data for debugging purposes - var exampleData = File.ReadAllBytes("TestFile.bson"); - // we skip the first byte to account for the string table - CompareByteArrays(data.Skip(1).ToArray(), exampleData); - } - - [Test(Description = "Compares a complex generated file to an example file.")] - public void BsonComplexByteAccurate() - { - var document = new BsonDocument - { - ["number"] = 2, - ["object"] = new BsonItem - { - ["array"] = new BsonItem(new BsonItem[] - { - "string", - "another_string", - 2, - 5.2 - }), - ["float"] = 4.2223 - }, - ["str"] = "string" - }; - var data = document.ToByteArray(); - File.WriteAllBytes("ComplexTestOutput.bson", data); - var exampleData = File.ReadAllBytes("ComplexTestFile.bson"); - CompareByteArrays(data.Skip(1).ToArray(), exampleData); - } - - [Test] - public void BsonDeepObject() - { - var document = new BsonDocument - { - ["test"] = new BsonItem - { - ["test_level2"] = new BsonItem - { - ["test_level3"] = true - } - } - }; - var data = document.ToByteArray(); - var readDocument = BsonDocument.Read(data); - Assert.AreEqual(true, readDocument["test"]["test_level2"]["test_level3"].Value); - } - - [Test] - public void BsonSingleValue() - { - var document = new BsonDocument { ["test"] = 2 }; - var data = document.ToByteArray(); - var readDocument = BsonDocument.Read(data); - Assert.AreEqual(2, readDocument["test"].Value); - } - } -} \ No newline at end of file diff --git a/Rant.Tests/Rant.Tests.csproj b/Rant.Tests/Rant.Tests.csproj index eff392f..660450e 100644 --- a/Rant.Tests/Rant.Tests.csproj +++ b/Rant.Tests/Rant.Tests.csproj @@ -66,7 +66,6 @@ <Compile Include="Compiler\Serialization.cs" /> <Compile Include="Compiler\Valid.cs" /> <Compile Include="Flags.cs" /> - <Compile Include="Misc\Bson.cs" /> <Compile Include="Packages.cs" /> <Compile Include="PackageVersions.cs" /> <Compile Include="Parsing.cs" /> diff --git a/Rant.Tools/Commands/PackCommand.cs b/Rant.Tools/Commands/PackCommand.cs index db54ac3..79c9531 100644 --- a/Rant.Tools/Commands/PackCommand.cs +++ b/Rant.Tools/Commands/PackCommand.cs @@ -30,7 +30,6 @@ using Newtonsoft.Json; -using Rant.Core.IO.Bson; using Rant.Resources; using Rant.Tools.Packer; using Rant.Vocabulary; @@ -53,18 +52,7 @@ protected override void OnRun() var pkg = new RantPackage(); var paths = CmdLine.GetPaths(); bool compress = !CmdLine.Flag("no-compress"); - int stringTableMode = int.Parse(CmdLine.Property("string-table", "1")); - - if (stringTableMode < 0 || stringTableMode > 2) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("Invalid string table mode."); - Console.ResetColor(); - return; - } - - var modeEnum = (BsonStringTableMode)stringTableMode; - + Console.WriteLine("Packing..."); string contentDir = Path.GetFullPath(paths.Length == 0 ? Environment.CurrentDirectory : paths[0]); @@ -106,12 +94,11 @@ protected override void OnRun() { outputPath = Path.Combine(Directory.GetParent(contentDir).FullName, $"{pkg.ID}-{pkg.Version}.rantpkg"); } - - Console.WriteLine($"String table mode: {modeEnum}"); + Console.WriteLine($"Compression: {(compress ? "yes" : "no")}"); Console.WriteLine(compress ? "Compressing and saving..." : "Saving..."); - pkg.Save(outputPath, compress, modeEnum); + pkg.Save(outputPath, compress); Console.WriteLine("\nPackage saved to " + outputPath.Replace('\\', '/')); diff --git a/Rant/Core/IO/Bson/BsonDocument.cs b/Rant/Core/IO/Bson/BsonDocument.cs deleted file mode 100644 index 5c7e27d..0000000 --- a/Rant/Core/IO/Bson/BsonDocument.cs +++ /dev/null @@ -1,390 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace Rant.Core.IO.Bson -{ - /// <summary> - /// Represents a document encoded in BSON. - /// </summary> - internal class BsonDocument - { - /// <summary> - /// The current string table version. - /// At some point we might want to make modifications to the format, - /// and we'll want a way to maintain backwards compatibility. - /// </summary> - public const int STRING_TABLE_VERSION = 1; - - private readonly Dictionary<string, int> _stringTable; - private int _stringTableIndex = 0; - - /// <summary> - /// The top item of this BSON document. - /// </summary> - public BsonItem Top; - - /// <summary> - /// Creates an empty BSON document. - /// <param>Whether or not to generate and use a string table.</param> - /// </summary> - public BsonDocument( - BsonStringTableMode mode = BsonStringTableMode.None, - string[] reverseStringTable = null, Dictionary<string, int> stringTable = null) - { - StringTableMode = mode; - _stringTable = stringTable ?? new Dictionary<string, int>(); - ReverseStringTable = reverseStringTable; - Top = new BsonItem(); - } - - /// <summary> - /// Retreives the value of the given key if it exists. - /// </summary> - /// <param name="key">The key to retrieve.</param> - /// <returns>The value of the given key, or null if it does not exist.</returns> - public BsonItem this[string key] - { - get { return Top.HasKey(key) ? Top[key] : null; } - set { Top[key] = value; } - } - - public BsonStringTableMode StringTableMode { get; } = BsonStringTableMode.None; - - public string[] ReverseStringTable { get; } - - /// <summary> - /// Returns this document encoded in BSON as a byte array. - /// </summary> - /// <returns>This document converted to BSON.</returns> - public byte[] ToByteArray(bool includeStringTable = false) - { - var stream = new MemoryStream(); - Write(stream, includeStringTable); - stream.Close(); - return stream.ToArray(); - } - - public byte[] GenerateStringTable() - { - var stream = new MemoryStream(); - var writer = new EasyWriter(stream); - writer.Write(_stringTable.Count); - foreach (string key in _stringTable.Keys) - { - writer.Write(_stringTable[key]); - writer.Write(key, Encoding.UTF8); - } - writer.Close(); - stream.Close(); - return stream.ToArray(); - } - - /// <summary> - /// Writes this BSON document to the specified path. - /// </summary> - /// <param name="path">The path to write to.</param> - /// <param name="includeStringTable"></param> - public void Write(string path, bool includeStringTable = false) - { - var stream = File.Open(path, FileMode.Create); - var writer = new EasyWriter(stream); - Write(writer); - writer.Close(); - stream.Close(); - } - - /// <summary> - /// Writes this document as BSON to the specified stream. - /// </summary> - /// <param name="stream">The stream that will be written to.</param> - /// <param name="includeStringTable">Specifies whether to include the string table.</param> - public void Write(Stream stream, bool includeStringTable = false) - { - var memoryStream = new MemoryStream(); - using (var writer = new EasyWriter(memoryStream)) - { - Write(writer); - } - memoryStream.Close(); - var bytes = memoryStream.ToArray(); - var tableWriter = new EasyWriter(stream); - WriteStringTable(tableWriter, includeStringTable); - stream.Write(bytes, 0, bytes.Length); - } - - /// <summary> - /// Writes this document using the specified EasyWriter. - /// </summary> - /// <param name="writer">The writer that will be used to write this document.</param> - internal void Write(EasyWriter writer) - { - _stringTableIndex = 0; - _stringTable.Clear(); - WriteItem(writer, Top, null, true); - writer.Close(); - } - - internal void WriteStringTable(EasyWriter writer, bool include) - { - writer.Write(include); - if (!include) return; - writer.Write((byte)StringTableMode); - writer.Write((byte)STRING_TABLE_VERSION); - var stringTableBytes = GenerateStringTable(); - writer.Write(stringTableBytes.Length); - writer.Write(stringTableBytes); - } - - private void WriteItem(EasyWriter writer, BsonItem item, string name, bool isTop = false, bool isArray = false) - { - if (!isTop) - { - writer.Write(item.Type); - writer.Write(isArray ? name : GetKeyName(name), Encoding.UTF8, true); - } - - if (item.HasValues) // object or array - we need to write a document - { - var stream = new MemoryStream(); - var vWriter = new EasyWriter(stream); - foreach (string key in item.Keys) - WriteItem(vWriter, item[key], key, false, item.IsArray); - vWriter.Close(); - var data = stream.ToArray(); - // length of data + length of length + null terminator - writer.Write(data.Length + 4 + 1); - writer.Write(data); - writer.Write((byte)0x00); - return; - } - - switch (item.Type) - { - case 0x01: // double - writer.Write((double)item.Value); - break; - case 0x02: // string - var bytes = Encoding.UTF8.GetBytes(GetKeyName((string)item.Value, true)); - writer.Write(bytes.Length + 1); // includes null terminator - writer.WriteBytes(bytes); - writer.Write((byte)0x00); - break; - case 0x05: // binary - var byteArray = (byte[])item.Value; - writer.Write(byteArray.Length); - writer.Write((byte)0x00); - writer.Write(byteArray); - break; - case 0x07: // objectid - writer.Write((byte[])item.Value); - break; - case 0x08: // bool - writer.Write((bool)item.Value); - break; - case 0x09: // UTC datetime - case 0x11: // timestamp - case 0x12: // 64 bit int - writer.Write((long)item.Value); - break; - case 0x10: // 32 bit int - writer.Write((int)item.Value); - break; - default: - Console.WriteLine(item.Value); - throw new NotSupportedException($"Item type {item.Value.GetType()} (code {item.Type}) not supported."); - } - } - - /// <summary> - /// Determines the correct name for the provided key. - /// This will return the string table key instead if it's enabled. - /// </summary> - /// <param name="name">The name of the key.</param> - /// <param name="value">Determines whether the original key string should be used.</param> - /// <returns>The correct name for the provided key.</returns> - private string GetKeyName(string name, bool value = false) - { - if (StringTableMode == BsonStringTableMode.None || - value && StringTableMode == BsonStringTableMode.Keys) - return name; - if (_stringTable.ContainsKey(name)) - return _stringTable[name].ToString(); - _stringTable[name] = _stringTableIndex++; - return _stringTable[name].ToString(); - } - - /// <summary> - /// Reads a BSON document from the specified byte array. - /// </summary> - /// <param name="data">The byte array that this document will be read from.</param> - /// <returns>The document that was read.</returns> - public static BsonDocument Read(byte[] data) - { - return Read(new EasyReader(data)); - } - - /// <summary> - /// Reads a BSON document from the specified stream. - /// </summary> - /// <param name="data">The stream that this document will be read from.</param> - /// <returns>The document that was read.</returns> - public static BsonDocument Read(Stream data) - { - return Read(new EasyReader(data)); - } - - /// <summary> - /// Reads a BSON document from the specified EasyReader. - /// </summary> - /// <param name="reader">The reader that will be used to read this document.</param> - /// <param name="parent">The parent document.</param> - /// <param name="inArray">Specifies whether the document belongs to an array.</param> - /// <returns>The document that was read.</returns> - internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) - { - var stringTableMode = BsonStringTableMode.None; - string[] stringTable = null; - if (parent == null) - { - bool includesStringTable = reader.ReadBoolean(); - if (includesStringTable) - { - stringTableMode = (BsonStringTableMode)reader.ReadByte(); - byte version = reader.ReadByte(); - if (version != STRING_TABLE_VERSION) - throw new InvalidDataException("Unsupported string table version: " + version); - int tableLength = reader.ReadInt32(); - int tableEntries = reader.ReadInt32(); - stringTable = new string[tableEntries]; - for (int i = 0; i < tableEntries; i++) - { - int num = reader.ReadInt32(); - if (num > tableEntries) - throw new InvalidDataException("Non-sequential string IDs currently not supported."); - string val = reader.ReadString(Encoding.UTF8); - stringTable[num] = val; - } - } - } - else - { - stringTable = parent.ReverseStringTable; - stringTableMode = parent.StringTableMode; - } - - var document = new BsonDocument(stringTableMode, stringTable, parent?._stringTable); - - int length = reader.ReadInt32(); - while (!reader.EndOfStream) - { - byte code = reader.ReadByte(); - if (code == 0x00) // end of document - break; - string name = reader.ReadCString(); - if (!inArray && document.StringTableMode != BsonStringTableMode.None) - name = document.ReverseStringTable[int.Parse(name)]; - var data = ReadItem(code, document, reader); - document.Top[name] = data; - } - return document; - } - - private static BsonItem ReadItem(byte code, BsonDocument document, EasyReader reader) - { - object val = null; - switch (code) - { - case 0x01: // double - val = reader.ReadDouble(); - break; - case 0x02: // string - val = reader.ReadString(Encoding.UTF8).TrimEnd('\x00'); - if (document.StringTableMode == BsonStringTableMode.KeysAndValues) - val = document.ReverseStringTable[int.Parse((string)val)]; - break; - case 0x03: // document - val = Read(reader, document).Top; - break; - case 0x04: // array - val = Read(reader, document, true).Top; - break; - case 0x05: // binary - int length = reader.ReadInt32(); - byte subtype = reader.ReadByte(); - if (subtype != 0x00) - throw new NotSupportedException("BSON subtypes other than 'generic binary data' are not supported."); - val = reader.ReadBytes(length); - break; - case 0x06: // undefined - break; - case 0x07: // ObjectId - // why does this parser support ObjectIds and not other binary data? - // shhhhh - val = Encoding.ASCII.GetString(reader.ReadBytes(12)); - break; - case 0x08: // boolean - val = reader.ReadBoolean(); - break; - case 0x09: // UTC datetime - val = reader.ReadInt64(); - break; - case 0x0A: // null - break; - case 0x0B: // regex - // why are you using regex in a Rant package? - throw new NotSupportedException("Regular expressions are not supported."); - case 0x0C: // db pointer - throw new NotSupportedException("DB pointers are not supported."); - case 0x0D: // Javascript code - case 0x0F: // JS code with scope - throw new NotSupportedException("Javascript in BSON is not supported."); - case 0x0E: // depreceated - val = reader.ReadString(Encoding.UTF8); - break; - case 0x10: // 32 bit integer - val = reader.ReadInt32(); - break; - case 0x11: // timestamp - case 0x12: // 64 bit integer - val = reader.ReadInt64(); - break; - case 0xFF: // min key - case 0x7F: // max key - // we don't care about these so let's just skip em - break; - } - if (!(val is BsonItem)) - return new BsonItem(val) { Type = code }; - var i = (BsonItem)val; - i.Type = code; - return i; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Bson/BsonItem.cs b/Rant/Core/IO/Bson/BsonItem.cs deleted file mode 100644 index 584cd7e..0000000 --- a/Rant/Core/IO/Bson/BsonItem.cs +++ /dev/null @@ -1,298 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace Rant.Core.IO.Bson -{ - /// <summary> - /// One item in a BSON document. - /// </summary> - internal class BsonItem - { - private Dictionary<string, BsonItem> _objectValues; - private byte _type = 0; - private bool _typeSet = false; - private object _value; - - /// <summary> - /// Creates a new BsonItem with the specified value. - /// </summary> - /// <param name="value">The value of this BSON item.</param> - public BsonItem(object value) - { - _value = value; - _objectValues = new Dictionary<string, BsonItem>(); - PossiblyCreateArray(); - } - - /// <summary> - /// Creates a new empty BsonItem. - /// </summary> - public BsonItem() - { - _value = null; - _objectValues = new Dictionary<string, BsonItem>(); - } - - public bool IsArray => _type == 0x04; - - /// <summary> - /// The BSON type code of this object. If not explicitly specified, it will guess. - /// </summary> - public byte Type - { - get - { - if (!_typeSet) - DetermineType(); - - return _type; - } - set - { - _typeSet = true; - _type = value; - } - } - - /// <summary> - /// The value of this item, if it is not a document or array. - /// </summary> - public object Value - { - get { return _value ?? _objectValues; } - set - { - _value = value; - DetermineType(); - PossiblyCreateArray(); - } - } - - /// <summary> - /// Whether or not this item has sub values (is a document or array). - /// </summary> - public bool HasValues - { - get { return _value == null; } - } - - /// <summary> - /// The number of items in this BsonItem, if it's a collection. - /// </summary> - public int Count => _objectValues.Keys.Count; - - /// <summary> - /// An array of the keys in this BsonItem. - /// </summary> - public string[] Keys => _objectValues.Keys.ToArray(); - - public IEnumerable<BsonItem> Values => _objectValues.Values; - - /// <summary> - /// Accesses the value of the specified key. - /// </summary> - /// <param name="key">The key whose value will be accessed.</param> - /// <returns>The value of the specified key.</returns> - public BsonItem this[string key] - { - get - { - return !HasKey(key) ? null : _objectValues[key]; - } - set { _objectValues[key] = value; } - } - - /// <summary> - /// Accesses the value of the specified key. - /// </summary> - /// <param name="key">The key whose value will be accessed.</param> - /// <returns>The value of the specified key.</returns> - public BsonItem this[int key] - { - get { return _objectValues[key.ToString(CultureInfo.InvariantCulture)]; } - set { _objectValues[key.ToString(CultureInfo.InvariantCulture)] = value; } - } - - /// <summary> - /// Converts this BsonItem to a double. - /// </summary> - /// <param name="a">The BsonItem to convert.</param> - public static implicit operator double(BsonItem a) - { - return (double)a.Value; - } - - /// <summary> - /// Converts this BsonItem to an int. - /// </summary> - /// <param name="a">The BsonItem to convert.</param> - public static implicit operator int(BsonItem a) - { - return (int)a.Value; - } - - /// <summary> - /// Convers this BsonItem to a string. - /// </summary> - /// <param name="a">The BsonItem to convert.</param> - public static implicit operator string(BsonItem a) - { - return (string)a?.Value; - } - - public static explicit operator string[](BsonItem a) - { - var values = a?.Values; - if (values == null) return new string[0]; - var arr = new string[a.Count]; - int i = 0; - foreach (var v in values) arr[i++] = v; - return arr; - } - - /// <summary> - /// Converts this double to a BsonItem. - /// </summary> - /// <param name="a">The double to convert.</param> - public static implicit operator BsonItem(double a) - { - return new BsonItem(a); - } - - /// <summary> - /// Converts this string to a BsonItem. - /// </summary> - /// <param name="a">The string to convert.</param> - public static implicit operator BsonItem(string a) - { - return new BsonItem(a); - } - - /// <summary> - /// Converts this bool to a BsonItem. - /// </summary> - /// <param name="a">The bool to convert.</param> - public static implicit operator BsonItem(bool a) - { - return new BsonItem(a); - } - - /// <summary> - /// Converts this int to a BsonItem. - /// </summary> - /// <param name="a">The int to convert.</param> - public static implicit operator BsonItem(int a) - { - return new BsonItem(a); - } - - /// <summary> - /// Converts this long to a BsonItem. - /// </summary> - /// <param name="a">The long to convert.</param> - public static implicit operator BsonItem(long a) - { - return new BsonItem(a); - } - - /// <summary> - /// Checks whether or not this item has the specified key. - /// </summary> - /// <param name="key">The key to check for.</param> - /// <returns>Whether or not this item has the specified key.</returns> - public bool HasKey(string key) - { - return _objectValues.ContainsKey(key); - } - - public object[] ToValueArray() - { - if (!IsArray) - throw new Exception("Can't convert a non-array to an array."); - var list = new List<object>(); - for (int i = 0; i < Count; i++) - list.Add(this[i].Value); - return list.ToArray(); - } - - private void PossiblyCreateArray() - { - if (_value == null) return; - var type = _value.GetType(); - object[] arr; - - if (type.IsArray) - arr = _value as object[]; - else if (_value is IList) - arr = (_value as IList).OfType<object>().ToArray(); - else - return; - - if (arr == null) return; - _type = 0x04; // array - _typeSet = true; - _objectValues = new Dictionary<string, BsonItem>(); - _value = null; - for (int i = 0; i < arr.Length; i++) - { - _objectValues[i.ToString()] = arr[i] is BsonItem - ? (BsonItem)arr[i] - : new BsonItem(arr[i]); - } - } - - private void DetermineType() - { - if (_value == null) - { - _type = 0x03; // document - return; - } - - // i apologize for this if statement - - if (_value is double || _value is float) - _type = 0x01; - else if (_value is string) - _type = 0x02; - else if (_value is byte[]) - _type = 0x05; - else if (_value is bool) - _type = 0x08; - else if (_value is long) - _type = 0x09; - else if (_value is int) - _type = 0x10; - else - _type = 0x00; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Bson/BsonStringTableMode.cs b/Rant/Core/IO/Bson/BsonStringTableMode.cs deleted file mode 100644 index c9b06aa..0000000 --- a/Rant/Core/IO/Bson/BsonStringTableMode.cs +++ /dev/null @@ -1,48 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -namespace Rant.Core.IO.Bson -{ - /// <summary> - /// Defines the available string table types for BSON documents. - /// </summary> - public enum BsonStringTableMode - { - /// <summary> - /// Don't use a string table. - /// </summary> - None = 0, - - /// <summary> - /// Store only keys. - /// </summary> - Keys = 1, - - /// <summary> - /// Store keys and values. - /// </summary> - KeysAndValues = 2 - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/CRC.cs b/Rant/Core/IO/Compression/CRC.cs deleted file mode 100644 index 469dbdc..0000000 --- a/Rant/Core/IO/Compression/CRC.cs +++ /dev/null @@ -1,85 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -namespace Rant.Core.IO.Compression -{ - internal class CRC - { - public static readonly uint[] Table; - private uint _value = 0xFFFFFFFF; - - static CRC() - { - Table = new uint[256]; - const uint kPoly = 0xEDB88320; - for (uint i = 0; i < 256; i++) - { - uint r = i; - for (int j = 0; j < 8; j++) - { - if ((r & 1) != 0) - r = (r >> 1) ^ kPoly; - else - r >>= 1; - } - Table[i] = r; - } - } - - public void Init() - { - _value = 0xFFFFFFFF; - } - - public void UpdateByte(byte b) - { - _value = Table[(byte)_value ^ b] ^ (_value >> 8); - } - - public void Update(byte[] data, uint offset, uint size) - { - for (uint i = 0; i < size; i++) - _value = Table[(byte)_value ^ data[offset + i]] ^ (_value >> 8); - } - - public uint GetDigest() - { - return _value ^ 0xFFFFFFFF; - } - - private static uint CalculateDigest(byte[] data, uint offset, uint size) - { - var crc = new CRC(); - // crc.Init(); - crc.Update(data, offset, size); - return crc.GetDigest(); - } - - private static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) - { - return CalculateDigest(data, offset, size) == digest; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/EasyCompressor.cs b/Rant/Core/IO/Compression/EasyCompressor.cs deleted file mode 100644 index aff6b1c..0000000 --- a/Rant/Core/IO/Compression/EasyCompressor.cs +++ /dev/null @@ -1,101 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.IO; - -using Rant.Core.IO.Compression.LZMA; - -namespace Rant.Core.IO.Compression -{ - internal static class EasyCompressor - { - internal static event ProgressUpdateEvent ProgressUpdate; - - public static byte[] Compress(byte[] data) - { - var inStream = new MemoryStream(data); - var stream = new MemoryStream(); - - var enc = new Encoder(); - - enc.WriteCoderProperties(stream); - EasyCompressorProgress progress = null; - if (ProgressUpdate != null) - progress = new EasyCompressorProgress(ProgressUpdate); - long dataSize = data.Length; - for (int i = 0; i < 8; i++) - stream.WriteByte((byte)(dataSize >> (8 * i))); - enc.Code(inStream, stream, data.Length, -1, progress); - inStream.Close(); - stream.Close(); - return stream.ToArray(); - } - - public static byte[] Decompress(byte[] data) - { - var inStream = new MemoryStream(data); - var outStream = new MemoryStream(); - - var dec = new Decoder(); - EasyCompressorProgress progress = null; - if (ProgressUpdate != null) - progress = new EasyCompressorProgress(ProgressUpdate); - var props = new byte[5]; - inStream.Read(props, 0, 5); - dec.SetDecoderProperties(props); - long outSize = 0; - for (int i = 0; i < 8; i++) - outSize |= (long)(byte)inStream.ReadByte() << (8 * i); - long compressedSize = inStream.Length - inStream.Position; - dec.Code(inStream, outStream, compressedSize, outSize, progress); - inStream.Close(); - outStream.Close(); - return outStream.ToArray(); - } - - internal delegate void ProgressUpdateEvent(object sender, CompressionProgressEventArgs e); - } - - internal class EasyCompressorProgress : ICodeProgress - { - private readonly EasyCompressor.ProgressUpdateEvent _handler; - - internal EasyCompressorProgress(EasyCompressor.ProgressUpdateEvent handler) - { - _handler = handler; - } - - public void SetProgress(long inSize, long outSize) - { - _handler.Invoke(null, new CompressionProgressEventArgs { Progress = inSize / outSize }); - } - } - - internal class CompressionProgressEventArgs : EventArgs - { - public double Progress; - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/ICoder.cs b/Rant/Core/IO/Compression/ICoder.cs deleted file mode 100644 index 77f7dab..0000000 --- a/Rant/Core/IO/Compression/ICoder.cs +++ /dev/null @@ -1,199 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.IO; - -namespace Rant.Core.IO.Compression -{ - /// <summary> - /// The exception that is thrown when an error in input stream occurs during decoding. - /// </summary> - internal class DataErrorException : ApplicationException - { - public DataErrorException() : base("Data Error") - { - } - } - - /// <summary> - /// The exception that is thrown when the value of an argument is outside the allowable range. - /// </summary> - internal class InvalidParamException : ApplicationException - { - public InvalidParamException() : base("Invalid Parameter") - { - } - } - - internal interface ICodeProgress - { - /// <summary> - /// Callback progress. - /// </summary> - /// <param name="inSize"> - /// input size. -1 if unknown. - /// </param> - /// <param name="outSize"> - /// output size. -1 if unknown. - /// </param> - void SetProgress(long inSize, long outSize); - } - - internal interface ICoder - { - /// <summary> - /// Codes streams. - /// </summary> - /// <param name="inStream"> - /// input Stream. - /// </param> - /// <param name="outStream"> - /// output Stream. - /// </param> - /// <param name="inSize"> - /// input Size. -1 if unknown. - /// </param> - /// <param name="outSize"> - /// output Size. -1 if unknown. - /// </param> - /// <param name="progress"> - /// callback progress reference. - /// </param> - /// <exception cref="DataErrorException"> - /// if input stream is not valid - /// </exception> - void Code(Stream inStream, Stream outStream, - long inSize, long outSize, ICodeProgress progress); - } - - /* - public interface ICoder2 - { - void Code(ISequentialInStream []inStreams, - const UInt64 []inSizes, - ISequentialOutStream []outStreams, - UInt64 []outSizes, - ICodeProgress progress); - }; - */ - - /// <summary> - /// Provides the fields that represent properties idenitifiers for compressing. - /// </summary> - internal enum CoderPropID - { - /// <summary> - /// Specifies default property. - /// </summary> - DefaultProp = 0, - - /// <summary> - /// Specifies size of dictionary. - /// </summary> - DictionarySize, - - /// <summary> - /// Specifies size of memory for PPM*. - /// </summary> - UsedMemorySize, - - /// <summary> - /// Specifies order for PPM methods. - /// </summary> - Order, - - /// <summary> - /// Specifies Block Size. - /// </summary> - BlockSize, - - /// <summary> - /// Specifies number of postion state bits for LZMA (0 <= x <= 4). - /// </summary> - PosStateBits, - - /// <summary> - /// Specifies number of literal context bits for LZMA (0 <= x <= 8). - /// </summary> - LitContextBits, - - /// <summary> - /// Specifies number of literal position bits for LZMA (0 <= x <= 4). - /// </summary> - LitPosBits, - - /// <summary> - /// Specifies number of fast bytes for LZ*. - /// </summary> - NumFastBytes, - - /// <summary> - /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B". - /// </summary> - MatchFinder, - - /// <summary> - /// Specifies the number of match finder cyckes. - /// </summary> - MatchFinderCycles, - - /// <summary> - /// Specifies number of passes. - /// </summary> - NumPasses, - - /// <summary> - /// Specifies number of algorithm. - /// </summary> - Algorithm, - - /// <summary> - /// Specifies the number of threads. - /// </summary> - NumThreads, - - /// <summary> - /// Specifies mode with end marker. - /// </summary> - EndMarker - } - - - internal interface ISetCoderProperties - { - void SetCoderProperties(CoderPropID[] propIDs, object[] properties); - } - - internal interface IWriteCoderProperties - { - void WriteCoderProperties(Stream outStream); - } - - internal interface ISetDecoderProperties - { - void SetDecoderProperties(byte[] properties); - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/IMatchFinder.cs b/Rant/Core/IO/Compression/LZ/IMatchFinder.cs deleted file mode 100644 index 21dc131..0000000 --- a/Rant/Core/IO/Compression/LZ/IMatchFinder.cs +++ /dev/null @@ -1,48 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System.IO; - -namespace Rant.Core.IO.Compression.LZ -{ - internal interface IInWindowStream - { - void SetStream(Stream inStream); - void Init(); - void ReleaseStream(); - byte GetIndexByte(int index); - uint GetMatchLen(int index, uint distance, uint limit); - uint GetNumAvailableBytes(); - } - - internal interface IMatchFinder : IInWindowStream - { - void Create(uint historySize, uint keepAddBufferBefore, - uint matchMaxLen, uint keepAddBufferAfter); - - uint GetMatches(uint[] distances); - void Skip(uint num); - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/LzBinTree.cs b/Rant/Core/IO/Compression/LZ/LzBinTree.cs deleted file mode 100644 index 6285933..0000000 --- a/Rant/Core/IO/Compression/LZ/LzBinTree.cs +++ /dev/null @@ -1,411 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.IO; - -namespace Rant.Core.IO.Compression.LZ -{ - internal class BinTree : InWindow, IMatchFinder - { - private const uint kHash2Size = 1 << 10; - private const uint kHash3Size = 1 << 16; - private const uint kBT2HashSize = 1 << 16; - private const uint kStartMaxLen = 1; - private const uint kHash3Offset = kHash2Size; - private const uint kEmptyHashValue = 0; - private const uint kMaxValForNormalize = ((uint)1 << 31) - 1; - private uint _cutValue = 0xFF; - private uint _cyclicBufferPos; - private uint _cyclicBufferSize = 0; - private uint[] _hash; - private uint _hashMask; - private uint _hashSizeSum = 0; - private uint _matchMaxLen; - private uint[] _son; - private bool HASH_ARRAY = true; - private uint kFixHashSize = kHash2Size + kHash3Size; - private uint kMinMatchCheck = 4; - private uint kNumHashDirectBytes = 0; - - public new void SetStream(Stream stream) - { - base.SetStream(stream); - } - - public new void ReleaseStream() - { - base.ReleaseStream(); - } - - public new void Init() - { - base.Init(); - for (uint i = 0; i < _hashSizeSum; i++) - _hash[i] = kEmptyHashValue; - _cyclicBufferPos = 0; - ReduceOffsets(-1); - } - - public new byte GetIndexByte(int index) - { - return base.GetIndexByte(index); - } - - public new uint GetMatchLen(int index, uint distance, uint limit) - { - return base.GetMatchLen(index, distance, limit); - } - - public new uint GetNumAvailableBytes() - { - return base.GetNumAvailableBytes(); - } - - public void Create(uint historySize, uint keepAddBufferBefore, - uint matchMaxLen, uint keepAddBufferAfter) - { - if (historySize > kMaxValForNormalize - 256) - throw new Exception(); - _cutValue = 16 + (matchMaxLen >> 1); - - uint windowReservSize = (historySize + keepAddBufferBefore + - matchMaxLen + keepAddBufferAfter) / 2 + 256; - - base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); - - _matchMaxLen = matchMaxLen; - - uint cyclicBufferSize = historySize + 1; - if (_cyclicBufferSize != cyclicBufferSize) - _son = new uint[(_cyclicBufferSize = cyclicBufferSize) * 2]; - - uint hs = kBT2HashSize; - - if (HASH_ARRAY) - { - hs = historySize - 1; - hs |= hs >> 1; - hs |= hs >> 2; - hs |= hs >> 4; - hs |= hs >> 8; - hs >>= 1; - hs |= 0xFFFF; - if (hs > 1 << 24) - hs >>= 1; - _hashMask = hs; - hs++; - hs += kFixHashSize; - } - if (hs != _hashSizeSum) - _hash = new uint[_hashSizeSum = hs]; - } - - public uint GetMatches(uint[] distances) - { - uint lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - lenLimit = _matchMaxLen; - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - return 0; - } - } - - uint offset = 0; - uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; - uint cur = _bufferOffset + _pos; - uint maxLen = kStartMaxLen; // to avoid items for len < hashSize; - uint hashValue, hash2Value = 0, hash3Value = 0; - - if (HASH_ARRAY) - { - uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - hash2Value = temp & (kHash2Size - 1); - temp ^= (uint)_bufferBase[cur + 2] << 8; - hash3Value = temp & (kHash3Size - 1); - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); - - uint curMatch = _hash[kFixHashSize + hashValue]; - if (HASH_ARRAY) - { - uint curMatch2 = _hash[hash2Value]; - uint curMatch3 = _hash[kHash3Offset + hash3Value]; - _hash[hash2Value] = _pos; - _hash[kHash3Offset + hash3Value] = _pos; - if (curMatch2 > matchMinPos) - { - if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) - { - distances[offset++] = maxLen = 2; - distances[offset++] = _pos - curMatch2 - 1; - } - } - if (curMatch3 > matchMinPos) - { - if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) - { - if (curMatch3 == curMatch2) - offset -= 2; - distances[offset++] = maxLen = 3; - distances[offset++] = _pos - curMatch3 - 1; - curMatch2 = curMatch3; - } - } - if (offset != 0 && curMatch2 == curMatch) - { - offset -= 2; - maxLen = kStartMaxLen; - } - } - - _hash[kFixHashSize + hashValue] = _pos; - - uint ptr0 = (_cyclicBufferPos << 1) + 1; - uint ptr1 = _cyclicBufferPos << 1; - - uint len0, len1; - len0 = len1 = kNumHashDirectBytes; - - if (kNumHashDirectBytes != 0) - { - if (curMatch > matchMinPos) - { - if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != - _bufferBase[cur + kNumHashDirectBytes]) - { - distances[offset++] = maxLen = kNumHashDirectBytes; - distances[offset++] = _pos - curMatch - 1; - } - } - } - - uint count = _cutValue; - - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - uint delta = _pos - curMatch; - uint cyclicPos = (delta <= _cyclicBufferPos - ? _cyclicBufferPos - delta - : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; - - uint pby1 = _bufferOffset + curMatch; - uint len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - { - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - } - if (maxLen < len) - { - distances[offset++] = maxLen = len; - distances[offset++] = delta - 1; - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - return offset; - } - - public void Skip(uint num) - { - do - { - uint lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - lenLimit = _matchMaxLen; - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - continue; - } - } - - uint matchMinPos = _pos > _cyclicBufferSize ? _pos - _cyclicBufferSize : 0; - uint cur = _bufferOffset + _pos; - - uint hashValue; - - if (HASH_ARRAY) - { - uint temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - uint hash2Value = temp & (kHash2Size - 1); - _hash[hash2Value] = _pos; - temp ^= (uint)_bufferBase[cur + 2] << 8; - uint hash3Value = temp & (kHash3Size - 1); - _hash[kHash3Offset + hash3Value] = _pos; - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - hashValue = _bufferBase[cur] ^ ((uint)_bufferBase[cur + 1] << 8); - - uint curMatch = _hash[kFixHashSize + hashValue]; - _hash[kFixHashSize + hashValue] = _pos; - - uint ptr0 = (_cyclicBufferPos << 1) + 1; - uint ptr1 = _cyclicBufferPos << 1; - - uint len0, len1; - len0 = len1 = kNumHashDirectBytes; - - uint count = _cutValue; - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - - uint delta = _pos - curMatch; - uint cyclicPos = (delta <= _cyclicBufferPos - ? _cyclicBufferPos - delta - : _cyclicBufferPos - delta + _cyclicBufferSize) << 1; - - uint pby1 = _bufferOffset + curMatch; - uint len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - { - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - } - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - } while (--num != 0); - } - - public void SetType(int numHashBytes) - { - HASH_ARRAY = numHashBytes > 2; - if (HASH_ARRAY) - { - kNumHashDirectBytes = 0; - kMinMatchCheck = 4; - kFixHashSize = kHash2Size + kHash3Size; - } - else - { - kNumHashDirectBytes = 2; - kMinMatchCheck = 2 + 1; - kFixHashSize = 0; - } - } - - public new void MovePos() - { - if (++_cyclicBufferPos >= _cyclicBufferSize) - _cyclicBufferPos = 0; - base.MovePos(); - if (_pos == kMaxValForNormalize) - Normalize(); - } - - private void NormalizeLinks(uint[] items, uint numItems, uint subValue) - { - for (uint i = 0; i < numItems; i++) - { - uint value = items[i]; - if (value <= subValue) - value = kEmptyHashValue; - else - value -= subValue; - items[i] = value; - } - } - - private void Normalize() - { - uint subValue = _pos - _cyclicBufferSize; - NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); - NormalizeLinks(_hash, _hashSizeSum, subValue); - ReduceOffsets((int)subValue); - } - - public void SetCutValue(uint cutValue) - { - _cutValue = cutValue; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/LzInWindow.cs b/Rant/Core/IO/Compression/LZ/LzInWindow.cs deleted file mode 100644 index 854b0a3..0000000 --- a/Rant/Core/IO/Compression/LZ/LzInWindow.cs +++ /dev/null @@ -1,170 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System.IO; - -namespace Rant.Core.IO.Compression.LZ -{ - internal class InWindow - { - public uint _blockSize; // Size of Allocated memory block - public byte[] _bufferBase = null; // pointer to buffer with data - public uint _bufferOffset; - private uint _keepSizeAfter; // how many BYTEs must be kept buffer after _pos - private uint _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos - private uint _pointerToLastSafePosition; - public uint _pos; // offset (from _buffer) of curent byte - private uint _posLimit; // offset (from _buffer) of first byte when new block reading must be done - private Stream _stream; - private bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream - public uint _streamPos; // offset (from _buffer) of first not read byte from Stream - - public void MoveBlock() - { - uint offset = _bufferOffset + _pos - _keepSizeBefore; - // we need one additional byte, since MovePos moves on 1 byte. - if (offset > 0) - offset--; - - uint numBytes = _bufferOffset + _streamPos - offset; - - // check negative offset ???? - for (uint i = 0; i < numBytes; i++) - _bufferBase[i] = _bufferBase[offset + i]; - _bufferOffset -= offset; - } - - public virtual void ReadBlock() - { - if (_streamEndWasReached) - return; - while (true) - { - int size = (int)(0 - _bufferOffset + _blockSize - _streamPos); - if (size == 0) - return; - int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size); - if (numReadBytes == 0) - { - _posLimit = _streamPos; - uint pointerToPostion = _bufferOffset + _posLimit; - if (pointerToPostion > _pointerToLastSafePosition) - _posLimit = _pointerToLastSafePosition - _bufferOffset; - - _streamEndWasReached = true; - return; - } - _streamPos += (uint)numReadBytes; - if (_streamPos >= _pos + _keepSizeAfter) - _posLimit = _streamPos - _keepSizeAfter; - } - } - - private void Free() - { - _bufferBase = null; - } - - public void Create(uint keepSizeBefore, uint keepSizeAfter, uint keepSizeReserv) - { - _keepSizeBefore = keepSizeBefore; - _keepSizeAfter = keepSizeAfter; - uint blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; - if (_bufferBase == null || _blockSize != blockSize) - { - Free(); - _blockSize = blockSize; - _bufferBase = new byte[_blockSize]; - } - _pointerToLastSafePosition = _blockSize - keepSizeAfter; - } - - public void SetStream(Stream stream) - { - _stream = stream; - } - - public void ReleaseStream() - { - _stream = null; - } - - public void Init() - { - _bufferOffset = 0; - _pos = 0; - _streamPos = 0; - _streamEndWasReached = false; - ReadBlock(); - } - - public void MovePos() - { - _pos++; - if (_pos > _posLimit) - { - uint pointerToPostion = _bufferOffset + _pos; - if (pointerToPostion > _pointerToLastSafePosition) - MoveBlock(); - ReadBlock(); - } - } - - public byte GetIndexByte(int index) - { - return _bufferBase[_bufferOffset + _pos + index]; - } - - // index + limit have not to exceed _keepSizeAfter; - public uint GetMatchLen(int index, uint distance, uint limit) - { - if (_streamEndWasReached) - { - if (_pos + index + limit > _streamPos) - limit = _streamPos - (uint)(_pos + index); - } - distance++; - // Byte *pby = _buffer + (size_t)_pos + index; - uint pby = _bufferOffset + _pos + (uint)index; - - uint i; - for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++) ; - return i; - } - - public uint GetNumAvailableBytes() - { - return _streamPos - _pos; - } - - public void ReduceOffsets(int subValue) - { - _bufferOffset += (uint)subValue; - _posLimit -= (uint)subValue; - _pos -= (uint)subValue; - _streamPos -= (uint)subValue; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZ/LzOutWindow.cs b/Rant/Core/IO/Compression/LZ/LzOutWindow.cs deleted file mode 100644 index b41636f..0000000 --- a/Rant/Core/IO/Compression/LZ/LzOutWindow.cs +++ /dev/null @@ -1,131 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System.IO; - -namespace Rant.Core.IO.Compression.LZ -{ - internal class OutWindow - { - private byte[] _buffer = null; - private uint _pos; - private Stream _stream; - private uint _streamPos; - private uint _windowSize = 0; - public uint TrainSize = 0; - - public void Create(uint windowSize) - { - if (_windowSize != windowSize) - _buffer = new byte[windowSize]; - _windowSize = windowSize; - _pos = 0; - _streamPos = 0; - } - - public void Init(Stream stream, bool solid) - { - ReleaseStream(); - _stream = stream; - if (!solid) - { - _streamPos = 0; - _pos = 0; - TrainSize = 0; - } - } - - public bool Train(Stream stream) - { - long len = stream.Length; - uint size = len < _windowSize ? (uint)len : _windowSize; - TrainSize = size; - stream.Position = len - size; - _streamPos = _pos = 0; - while (size > 0) - { - uint curSize = _windowSize - _pos; - if (size < curSize) - curSize = size; - int numReadBytes = stream.Read(_buffer, (int)_pos, (int)curSize); - if (numReadBytes == 0) - return false; - size -= (uint)numReadBytes; - _pos += (uint)numReadBytes; - _streamPos += (uint)numReadBytes; - if (_pos == _windowSize) - _streamPos = _pos = 0; - } - return true; - } - - public void ReleaseStream() - { - Flush(); - _stream = null; - } - - public void Flush() - { - uint size = _pos - _streamPos; - if (size == 0) - return; - _stream.Write(_buffer, (int)_streamPos, (int)size); - if (_pos >= _windowSize) - _pos = 0; - _streamPos = _pos; - } - - public void CopyBlock(uint distance, uint len) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - for (; len > 0; len--) - { - if (pos >= _windowSize) - pos = 0; - _buffer[_pos++] = _buffer[pos++]; - if (_pos >= _windowSize) - Flush(); - } - } - - public void PutByte(byte b) - { - _buffer[_pos++] = b; - if (_pos >= _windowSize) - Flush(); - } - - public byte GetByte(uint distance) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - return _buffer[pos]; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZMA/LzmaBase.cs b/Rant/Core/IO/Compression/LZMA/LzmaBase.cs deleted file mode 100644 index dff4528..0000000 --- a/Rant/Core/IO/Compression/LZMA/LzmaBase.cs +++ /dev/null @@ -1,114 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -namespace Rant.Core.IO.Compression.LZMA -{ - internal abstract class Base - { - public const uint kNumRepDistances = 4; - public const uint kNumStates = 12; - public const int kNumPosSlotBits = 6; - public const int kDicLogSizeMin = 0; - // public const int kDicLogSizeMax = 30; - // public const uint kDistTableSizeMax = kDicLogSizeMax * 2; - - public const int kNumLenToPosStatesBits = 2; // it's for speed optimization - public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits; - public const uint kMatchMinLen = 2; - public const int kNumAlignBits = 4; - public const uint kAlignTableSize = 1 << kNumAlignBits; - public const uint kAlignMask = kAlignTableSize - 1; - public const uint kStartPosModelIndex = 4; - public const uint kEndPosModelIndex = 14; - public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; - public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2); - public const uint kNumLitPosStatesBitsEncodingMax = 4; - public const uint kNumLitContextBitsMax = 8; - public const int kNumPosStatesBitsMax = 4; - public const uint kNumPosStatesMax = 1 << kNumPosStatesBitsMax; - public const int kNumPosStatesBitsEncodingMax = 4; - public const uint kNumPosStatesEncodingMax = 1 << kNumPosStatesBitsEncodingMax; - public const int kNumLowLenBits = 3; - public const int kNumMidLenBits = 3; - public const int kNumHighLenBits = 8; - public const uint kNumLowLenSymbols = 1 << kNumLowLenBits; - public const uint kNumMidLenSymbols = 1 << kNumMidLenBits; - - public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + - (1 << kNumHighLenBits); - - public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; - - public static uint GetLenToPosState(uint len) - { - len -= kMatchMinLen; - if (len < kNumLenToPosStates) - return len; - return kNumLenToPosStates - 1; - } - - // static byte []kLiteralNextStates = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; - // static byte []kMatchNextStates = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; - // static byte []kRepNextStates = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; - // static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; - - public struct State - { - public uint Index; - - public void Init() - { - Index = 0; - } - - public void UpdateChar() - { - if (Index < 4) Index = 0; - else if (Index < 10) Index -= 3; - else Index -= 6; - } - - public void UpdateMatch() - { - Index = (uint)(Index < 7 ? 7 : 10); - } - - public void UpdateRep() - { - Index = (uint)(Index < 7 ? 8 : 11); - } - - public void UpdateShortRep() - { - Index = (uint)(Index < 7 ? 9 : 11); - } - - public bool IsCharState() - { - return Index < 7; - } - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs b/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs deleted file mode 100644 index 1141380..0000000 --- a/Rant/Core/IO/Compression/LZMA/LzmaDecoder.cs +++ /dev/null @@ -1,400 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.IO; - -using Rant.Core.IO.Compression.LZ; -using Rant.Core.IO.Compression.RangeCoder; - -namespace Rant.Core.IO.Compression.LZMA -{ - internal class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream - { - private readonly BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates]; - private readonly BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates]; - private readonly LenDecoder m_LenDecoder = new LenDecoder(); - private readonly LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); - private readonly OutWindow m_OutWindow = new OutWindow(); - private readonly BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; - private readonly BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates]; - private readonly RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder(); - private readonly LenDecoder m_RepLenDecoder = new LenDecoder(); - private bool _solid = false; - private uint m_DictionarySize; - private uint m_DictionarySizeCheck; - private BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits); - private uint m_PosStateMask; - - public Decoder() - { - m_DictionarySize = 0xFFFFFFFF; - for (int i = 0; i < Base.kNumLenToPosStates; i++) - m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits); - } - - public void Code(Stream inStream, Stream outStream, - long inSize, long outSize, ICodeProgress progress) - { - Init(inStream, outStream); - - var state = new Base.State(); - state.Init(); - uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; - - ulong nowPos64 = 0; - ulong outSize64 = (ulong)outSize; - if (nowPos64 < outSize64) - { - if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0) - throw new DataErrorException(); - state.UpdateChar(); - byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0); - m_OutWindow.PutByte(b); - nowPos64++; - } - while (nowPos64 < outSize64) - { - uint posState = (uint)nowPos64 & m_PosStateMask; - if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - byte b; - byte prevByte = m_OutWindow.GetByte(0); - if (!state.IsCharState()) - { - b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, - (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); - } - else - b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); - m_OutWindow.PutByte(b); - state.UpdateChar(); - nowPos64++; - } - else - { - uint len; - if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) - { - if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - state.UpdateShortRep(); - m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); - nowPos64++; - continue; - } - } - else - { - uint distance; - if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) - distance = rep1; - else - { - if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) - distance = rep2; - else - { - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; - } - rep1 = rep0; - rep0 = distance; - } - len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; - state.UpdateRep(); - } - else - { - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); - state.UpdateMatch(); - uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); - if (posSlot >= Base.kStartPosModelIndex) - { - int numDirectBits = (int)((posSlot >> 1) - 1); - rep0 = (2 | (posSlot & 1)) << numDirectBits; - if (posSlot < Base.kEndPosModelIndex) - { - rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, - rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); - } - else - { - rep0 += m_RangeDecoder.DecodeDirectBits( - numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits; - rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); - } - } - else - rep0 = posSlot; - } - if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) - { - if (rep0 == 0xFFFFFFFF) - break; - throw new DataErrorException(); - } - m_OutWindow.CopyBlock(rep0, len); - nowPos64 += len; - } - } - m_OutWindow.Flush(); - m_OutWindow.ReleaseStream(); - m_RangeDecoder.ReleaseStream(); - } - - public void SetDecoderProperties(byte[] properties) - { - if (properties.Length < 5) - throw new InvalidParamException(); - int lc = properties[0] % 9; - int remainder = properties[0] / 9; - int lp = remainder % 5; - int pb = remainder / 5; - if (pb > Base.kNumPosStatesBitsMax) - throw new InvalidParamException(); - uint dictionarySize = 0; - for (int i = 0; i < 4; i++) - dictionarySize += (uint)properties[1 + i] << (i * 8); - SetDictionarySize(dictionarySize); - SetLiteralProperties(lp, lc); - SetPosBitsProperties(pb); - } - - private void SetDictionarySize(uint dictionarySize) - { - if (m_DictionarySize != dictionarySize) - { - m_DictionarySize = dictionarySize; - m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); - uint blockSize = Math.Max(m_DictionarySizeCheck, 1 << 12); - m_OutWindow.Create(blockSize); - } - } - - private void SetLiteralProperties(int lp, int lc) - { - if (lp > 8) - throw new InvalidParamException(); - if (lc > 8) - throw new InvalidParamException(); - m_LiteralDecoder.Create(lp, lc); - } - - private void SetPosBitsProperties(int pb) - { - if (pb > Base.kNumPosStatesBitsMax) - throw new InvalidParamException(); - uint numPosStates = (uint)1 << pb; - m_LenDecoder.Create(numPosStates); - m_RepLenDecoder.Create(numPosStates); - m_PosStateMask = numPosStates - 1; - } - - private void Init(Stream inStream, Stream outStream) - { - m_RangeDecoder.Init(inStream); - m_OutWindow.Init(outStream, _solid); - - uint i; - for (i = 0; i < Base.kNumStates; i++) - { - for (uint j = 0; j <= m_PosStateMask; j++) - { - uint index = (i << Base.kNumPosStatesBitsMax) + j; - m_IsMatchDecoders[index].Init(); - m_IsRep0LongDecoders[index].Init(); - } - m_IsRepDecoders[i].Init(); - m_IsRepG0Decoders[i].Init(); - m_IsRepG1Decoders[i].Init(); - m_IsRepG2Decoders[i].Init(); - } - - m_LiteralDecoder.Init(); - for (i = 0; i < Base.kNumLenToPosStates; i++) - m_PosSlotDecoder[i].Init(); - // m_PosSpecDecoder.Init(); - for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) - m_PosDecoders[i].Init(); - - m_LenDecoder.Init(); - m_RepLenDecoder.Init(); - m_PosAlignDecoder.Init(); - } - - public bool Train(Stream stream) - { - _solid = true; - return m_OutWindow.Train(stream); - } - - private class LenDecoder - { - private readonly BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; - private readonly BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; - private BitDecoder m_Choice = new BitDecoder(); - private BitDecoder m_Choice2 = new BitDecoder(); - private BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits); - private uint m_NumPosStates = 0; - - public void Create(uint numPosStates) - { - for (uint posState = m_NumPosStates; posState < numPosStates; posState++) - { - m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits); - m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits); - } - m_NumPosStates = numPosStates; - } - - public void Init() - { - m_Choice.Init(); - for (uint posState = 0; posState < m_NumPosStates; posState++) - { - m_LowCoder[posState].Init(); - m_MidCoder[posState].Init(); - } - m_Choice2.Init(); - m_HighCoder.Init(); - } - - public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState) - { - if (m_Choice.Decode(rangeDecoder) == 0) - return m_LowCoder[posState].Decode(rangeDecoder); - uint symbol = Base.kNumLowLenSymbols; - if (m_Choice2.Decode(rangeDecoder) == 0) - symbol += m_MidCoder[posState].Decode(rangeDecoder); - else - { - symbol += Base.kNumMidLenSymbols; - symbol += m_HighCoder.Decode(rangeDecoder); - } - return symbol; - } - } - - private class LiteralDecoder - { - private Decoder2[] m_Coders; - private int m_NumPosBits; - private int m_NumPrevBits; - private uint m_PosMask; - - public void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && - m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint)1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Decoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - public void Init() - { - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - for (uint i = 0; i < numStates; i++) - m_Coders[i].Init(); - } - - private uint GetState(uint pos, byte prevByte) - { - return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); - } - - public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte) - { - return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); - } - - public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte) - { - return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); - } - - private struct Decoder2 - { - private BitDecoder[] m_Decoders; - - public void Create() - { - m_Decoders = new BitDecoder[0x300]; - } - - public void Init() - { - for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); - } - - public byte DecodeNormal(RangeCoder.Decoder rangeDecoder) - { - uint symbol = 1; - do - { - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); - } while (symbol < 0x100); - return (byte)symbol; - } - - public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) - { - uint symbol = 1; - do - { - uint matchBit = (uint)(matchByte >> 7) & 1; - matchByte <<= 1; - uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder); - symbol = (symbol << 1) | bit; - if (matchBit != bit) - { - while (symbol < 0x100) - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); - break; - } - } while (symbol < 0x100); - return (byte)symbol; - } - } - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs b/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs deleted file mode 100644 index e3799a1..0000000 --- a/Rant/Core/IO/Compression/LZMA/LzmaEncoder.cs +++ /dev/null @@ -1,1514 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System; -using System.IO; - -using Rant.Core.IO.Compression.LZ; -using Rant.Core.IO.Compression.RangeCoder; - -namespace Rant.Core.IO.Compression.LZMA -{ - internal class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties - { - private const uint kIfinityPrice = 0xFFFFFFF; - private const int kDefaultDictionaryLogSize = 22; - private const uint kNumFastBytesDefault = 0x20; - private const uint kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; - private const uint kNumOpts = 1 << 12; - private const int kPropSize = 5; - private static readonly byte[] g_FastPos = new byte[1 << 11]; - - private static readonly string[] kMatchFinderIDs = - { - "BT2", - "BT4" - }; - - private readonly uint[] _alignPrices = new uint[Base.kAlignTableSize]; - private readonly uint[] _distancesPrices = new uint[Base.kNumFullDistances << Base.kNumLenToPosStatesBits]; - private readonly BitEncoder[] _isMatch = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitEncoder[] _isRep = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRep0Long = new BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; - private readonly BitEncoder[] _isRepG0 = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRepG1 = new BitEncoder[Base.kNumStates]; - private readonly BitEncoder[] _isRepG2 = new BitEncoder[Base.kNumStates]; - private readonly LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); - private readonly LiteralEncoder _literalEncoder = new LiteralEncoder(); - private readonly uint[] _matchDistances = new uint[Base.kMatchMaxLen * 2 + 2]; - private readonly Optimal[] _optimum = new Optimal[kNumOpts]; - private readonly BitEncoder[] _posEncoders = new BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; - private readonly BitTreeEncoder[] _posSlotEncoder = new BitTreeEncoder[Base.kNumLenToPosStates]; - private readonly uint[] _posSlotPrices = new uint[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)]; - private readonly RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder(); - private readonly uint[] _repDistances = new uint[Base.kNumRepDistances]; - private readonly LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); - private readonly byte[] properties = new byte[kPropSize]; - private readonly uint[] repLens = new uint[Base.kNumRepDistances]; - private readonly uint[] reps = new uint[Base.kNumRepDistances]; - private readonly uint[] tempPrices = new uint[Base.kNumFullDistances]; - private uint _additionalOffset; - private uint _alignPriceCount; - private uint _dictionarySize = 1 << kDefaultDictionaryLogSize; - private uint _dictionarySizePrev = 0xFFFFFFFF; - private uint _distTableSize = kDefaultDictionaryLogSize * 2; - private bool _finished; - private Stream _inStream; - private uint _longestMatchLength; - private bool _longestMatchWasFound; - private IMatchFinder _matchFinder = null; - private EMatchFinderType _matchFinderType = EMatchFinderType.BT4; - private uint _matchPriceCount; - private bool _needReleaseMFStream; - private uint _numDistancePairs; - private uint _numFastBytes = kNumFastBytesDefault; - private uint _numFastBytesPrev = 0xFFFFFFFF; - private int _numLiteralContextBits = 3; - private int _numLiteralPosStateBits = 0; - private uint _optimumCurrentIndex; - private uint _optimumEndIndex; - private BitTreeEncoder _posAlignEncoder = new BitTreeEncoder(Base.kNumAlignBits); - private int _posStateBits = 2; - private uint _posStateMask = 4 - 1; - private byte _previousByte; - private Base.State _state = new Base.State(); - private uint _trainSize = 0; - private bool _writeEndMark = false; - private long nowPos64; - - static Encoder() - { - const byte kFastSlots = 22; - int c = 2; - g_FastPos[0] = 0; - g_FastPos[1] = 1; - for (byte slotFast = 2; slotFast < kFastSlots; slotFast++) - { - uint k = (uint)1 << ((slotFast >> 1) - 1); - for (uint j = 0; j < k; j++, c++) - g_FastPos[c] = slotFast; - } - } - - public Encoder() - { - for (int i = 0; i < kNumOpts; i++) - _optimum[i] = new Optimal(); - for (int i = 0; i < Base.kNumLenToPosStates; i++) - _posSlotEncoder[i] = new BitTreeEncoder(Base.kNumPosSlotBits); - } - - public void Code(Stream inStream, Stream outStream, - long inSize, long outSize, ICodeProgress progress) - { - _needReleaseMFStream = false; - try - { - SetStreams(inStream, outStream, inSize, outSize); - while (true) - { - long processedInSize; - long processedOutSize; - bool finished; - CodeOneBlock(out processedInSize, out processedOutSize, out finished); - if (finished) - return; - if (progress != null) - progress.SetProgress(processedInSize, processedOutSize); - } - } - finally - { - ReleaseStreams(); - } - } - - public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) - { - for (uint i = 0; i < properties.Length; i++) - { - var prop = properties[i]; - switch (propIDs[i]) - { - case CoderPropID.NumFastBytes: - { - if (!(prop is int)) - throw new InvalidParamException(); - int numFastBytes = (int)prop; - if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen) - throw new InvalidParamException(); - _numFastBytes = (uint)numFastBytes; - break; - } - case CoderPropID.Algorithm: - { - /* - if (!(prop is Int32)) - throw new InvalidParamException(); - Int32 maximize = (Int32)prop; - _fastMode = (maximize == 0); - _maxMode = (maximize >= 2); - */ - break; - } - case CoderPropID.MatchFinder: - { - if (!(prop is string)) - throw new InvalidParamException(); - var matchFinderIndexPrev = _matchFinderType; - int m = FindMatchFinder(((string)prop).ToUpper()); - if (m < 0) - throw new InvalidParamException(); - _matchFinderType = (EMatchFinderType)m; - if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) - { - _dictionarySizePrev = 0xFFFFFFFF; - _matchFinder = null; - } - break; - } - case CoderPropID.DictionarySize: - { - const int kDicLogSizeMaxCompress = 30; - if (!(prop is int)) - throw new InvalidParamException(); - ; - int dictionarySize = (int)prop; - if (dictionarySize < (uint)(1 << Base.kDicLogSizeMin) || - dictionarySize > (uint)(1 << kDicLogSizeMaxCompress)) - throw new InvalidParamException(); - _dictionarySize = (uint)dictionarySize; - int dicLogSize; - for (dicLogSize = 0; dicLogSize < (uint)kDicLogSizeMaxCompress; dicLogSize++) - { - if (dictionarySize <= (uint)1 << dicLogSize) - break; - } - _distTableSize = (uint)dicLogSize * 2; - break; - } - case CoderPropID.PosStateBits: - { - if (!(prop is int)) - throw new InvalidParamException(); - int v = (int)prop; - if (v < 0 || v > (uint)Base.kNumPosStatesBitsEncodingMax) - throw new InvalidParamException(); - _posStateBits = v; - _posStateMask = ((uint)1 << _posStateBits) - 1; - break; - } - case CoderPropID.LitPosBits: - { - if (!(prop is int)) - throw new InvalidParamException(); - int v = (int)prop; - if (v < 0 || v > Base.kNumLitPosStatesBitsEncodingMax) - throw new InvalidParamException(); - _numLiteralPosStateBits = v; - break; - } - case CoderPropID.LitContextBits: - { - if (!(prop is int)) - throw new InvalidParamException(); - int v = (int)prop; - if (v < 0 || v > Base.kNumLitContextBitsMax) - throw new InvalidParamException(); - ; - _numLiteralContextBits = v; - break; - } - case CoderPropID.EndMarker: - { - if (!(prop is bool)) - throw new InvalidParamException(); - SetWriteEndMarkerMode((bool)prop); - break; - } - default: - throw new InvalidParamException(); - } - } - } - - public void WriteCoderProperties(Stream outStream) - { - properties[0] = (byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); - for (int i = 0; i < 4; i++) - properties[1 + i] = (byte)((_dictionarySize >> (8 * i)) & 0xFF); - outStream.Write(properties, 0, kPropSize); - } - - private static uint GetPosSlot(uint pos) - { - if (pos < 1 << 11) - return g_FastPos[pos]; - if (pos < 1 << 21) - return (uint)(g_FastPos[pos >> 10] + 20); - return (uint)(g_FastPos[pos >> 20] + 40); - } - - private static uint GetPosSlot2(uint pos) - { - if (pos < 1 << 17) - return (uint)(g_FastPos[pos >> 6] + 12); - if (pos < 1 << 27) - return (uint)(g_FastPos[pos >> 16] + 32); - return (uint)(g_FastPos[pos >> 26] + 52); - } - - private void BaseInit() - { - _state.Init(); - _previousByte = 0; - for (uint i = 0; i < Base.kNumRepDistances; i++) - _repDistances[i] = 0; - } - - private void Create() - { - if (_matchFinder == null) - { - var bt = new BinTree(); - int numHashBytes = 4; - if (_matchFinderType == EMatchFinderType.BT2) - numHashBytes = 2; - bt.SetType(numHashBytes); - _matchFinder = bt; - } - _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); - - if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) - return; - _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1); - _dictionarySizePrev = _dictionarySize; - _numFastBytesPrev = _numFastBytes; - } - - private void SetWriteEndMarkerMode(bool writeEndMarker) - { - _writeEndMark = writeEndMarker; - } - - private void Init() - { - BaseInit(); - _rangeEncoder.Init(); - - uint i; - for (i = 0; i < Base.kNumStates; i++) - { - for (uint j = 0; j <= _posStateMask; j++) - { - uint complexState = (i << Base.kNumPosStatesBitsMax) + j; - _isMatch[complexState].Init(); - _isRep0Long[complexState].Init(); - } - _isRep[i].Init(); - _isRepG0[i].Init(); - _isRepG1[i].Init(); - _isRepG2[i].Init(); - } - _literalEncoder.Init(); - for (i = 0; i < Base.kNumLenToPosStates; i++) - _posSlotEncoder[i].Init(); - for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) - _posEncoders[i].Init(); - - _lenEncoder.Init((uint)1 << _posStateBits); - _repMatchLenEncoder.Init((uint)1 << _posStateBits); - - _posAlignEncoder.Init(); - - _longestMatchWasFound = false; - _optimumEndIndex = 0; - _optimumCurrentIndex = 0; - _additionalOffset = 0; - } - - private void ReadMatchDistances(out uint lenRes, out uint numDistancePairs) - { - lenRes = 0; - numDistancePairs = _matchFinder.GetMatches(_matchDistances); - if (numDistancePairs > 0) - { - lenRes = _matchDistances[numDistancePairs - 2]; - if (lenRes == _numFastBytes) - { - lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1], - Base.kMatchMaxLen - lenRes); - } - } - _additionalOffset++; - } - - private void MovePos(uint num) - { - if (num > 0) - { - _matchFinder.Skip(num); - _additionalOffset += num; - } - } - - private uint GetRepLen1Price(Base.State state, uint posState) - { - return _isRepG0[state.Index].GetPrice0() + - _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0(); - } - - private uint GetPureRepPrice(uint repIndex, Base.State state, uint posState) - { - uint price; - if (repIndex == 0) - { - price = _isRepG0[state.Index].GetPrice0(); - price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - } - else - { - price = _isRepG0[state.Index].GetPrice1(); - if (repIndex == 1) - price += _isRepG1[state.Index].GetPrice0(); - else - { - price += _isRepG1[state.Index].GetPrice1(); - price += _isRepG2[state.Index].GetPrice(repIndex - 2); - } - } - return price; - } - - private uint GetRepPrice(uint repIndex, uint len, Base.State state, uint posState) - { - uint price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState); - return price + GetPureRepPrice(repIndex, state, posState); - } - - private uint GetPosLenPrice(uint pos, uint len, uint posState) - { - uint price; - uint lenToPosState = Base.GetLenToPosState(len); - if (pos < Base.kNumFullDistances) - price = _distancesPrices[lenToPosState * Base.kNumFullDistances + pos]; - else - { - price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + - _alignPrices[pos & Base.kAlignMask]; - } - return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState); - } - - private uint Backward(out uint backRes, uint cur) - { - _optimumEndIndex = cur; - uint posMem = _optimum[cur].PosPrev; - uint backMem = _optimum[cur].BackPrev; - do - { - if (_optimum[cur].Prev1IsChar) - { - _optimum[posMem].MakeAsChar(); - _optimum[posMem].PosPrev = posMem - 1; - if (_optimum[cur].Prev2) - { - _optimum[posMem - 1].Prev1IsChar = false; - _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; - _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; - } - } - uint posPrev = posMem; - uint backCur = backMem; - - backMem = _optimum[posPrev].BackPrev; - posMem = _optimum[posPrev].PosPrev; - - _optimum[posPrev].BackPrev = backCur; - _optimum[posPrev].PosPrev = cur; - cur = posPrev; - } while (cur > 0); - backRes = _optimum[0].BackPrev; - _optimumCurrentIndex = _optimum[0].PosPrev; - return _optimumCurrentIndex; - } - - private uint GetOptimum(uint position, out uint backRes) - { - if (_optimumEndIndex != _optimumCurrentIndex) - { - uint lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; - backRes = _optimum[_optimumCurrentIndex].BackPrev; - _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; - return lenRes; - } - _optimumCurrentIndex = _optimumEndIndex = 0; - - uint lenMain, numDistancePairs; - if (!_longestMatchWasFound) - ReadMatchDistances(out lenMain, out numDistancePairs); - else - { - lenMain = _longestMatchLength; - numDistancePairs = _numDistancePairs; - _longestMatchWasFound = false; - } - - uint numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; - if (numAvailableBytes < 2) - { - backRes = 0xFFFFFFFF; - return 1; - } - if (numAvailableBytes > Base.kMatchMaxLen) - numAvailableBytes = Base.kMatchMaxLen; - - uint repMaxIndex = 0; - uint i; - for (i = 0; i < Base.kNumRepDistances; i++) - { - reps[i] = _repDistances[i]; - repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen); - if (repLens[i] > repLens[repMaxIndex]) - repMaxIndex = i; - } - if (repLens[repMaxIndex] >= _numFastBytes) - { - backRes = repMaxIndex; - uint lenRes = repLens[repMaxIndex]; - MovePos(lenRes - 1); - return lenRes; - } - - if (lenMain >= _numFastBytes) - { - backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances; - MovePos(lenMain - 1); - return lenMain; - } - - byte currentByte = _matchFinder.GetIndexByte(0 - 1); - byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - 1)); - - if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) - { - backRes = 0xFFFFFFFF; - return 1; - } - - _optimum[0].State = _state; - - uint posState = position & _posStateMask; - - _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _previousByte) - .GetPrice(!_state.IsCharState(), matchByte, currentByte); - _optimum[1].MakeAsChar(); - - uint matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - uint repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); - - if (matchByte == currentByte) - { - uint shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); - if (shortRepPrice < _optimum[1].Price) - { - _optimum[1].Price = shortRepPrice; - _optimum[1].MakeAsShortRep(); - } - } - - uint lenEnd = lenMain >= repLens[repMaxIndex] ? lenMain : repLens[repMaxIndex]; - - if (lenEnd < 2) - { - backRes = _optimum[1].BackPrev; - return 1; - } - - _optimum[1].PosPrev = 0; - - _optimum[0].Backs0 = reps[0]; - _optimum[0].Backs1 = reps[1]; - _optimum[0].Backs2 = reps[2]; - _optimum[0].Backs3 = reps[3]; - - uint len = lenEnd; - do - { - _optimum[len--].Price = kIfinityPrice; - } while (len >= 2); - - for (i = 0; i < Base.kNumRepDistances; i++) - { - uint repLen = repLens[i]; - if (repLen < 2) - continue; - uint price = repMatchPrice + GetPureRepPrice(i, _state, posState); - do - { - uint curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); - var optimum = _optimum[repLen]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = i; - optimum.Prev1IsChar = false; - } - } while (--repLen >= 2); - } - - uint normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); - - len = repLens[0] >= 2 ? repLens[0] + 1 : 2; - if (len <= lenMain) - { - uint offs = 0; - while (len > _matchDistances[offs]) - offs += 2; - for (;; len++) - { - uint distance = _matchDistances[offs + 1]; - uint curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); - var optimum = _optimum[len]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = distance + Base.kNumRepDistances; - optimum.Prev1IsChar = false; - } - if (len == _matchDistances[offs]) - { - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - - uint cur = 0; - - while (true) - { - cur++; - if (cur == lenEnd) - return Backward(out backRes, cur); - uint newLen; - ReadMatchDistances(out newLen, out numDistancePairs); - if (newLen >= _numFastBytes) - { - _numDistancePairs = numDistancePairs; - _longestMatchLength = newLen; - _longestMatchWasFound = true; - return Backward(out backRes, cur); - } - position++; - uint posPrev = _optimum[cur].PosPrev; - Base.State state; - if (_optimum[cur].Prev1IsChar) - { - posPrev--; - if (_optimum[cur].Prev2) - { - state = _optimum[_optimum[cur].PosPrev2].State; - if (_optimum[cur].BackPrev2 < Base.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - else - state = _optimum[posPrev].State; - state.UpdateChar(); - } - else - state = _optimum[posPrev].State; - if (posPrev == cur - 1) - { - if (_optimum[cur].IsShortRep()) - state.UpdateShortRep(); - else - state.UpdateChar(); - } - else - { - uint pos; - if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) - { - posPrev = _optimum[cur].PosPrev2; - pos = _optimum[cur].BackPrev2; - state.UpdateRep(); - } - else - { - pos = _optimum[cur].BackPrev; - if (pos < Base.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - var opt = _optimum[posPrev]; - if (pos < Base.kNumRepDistances) - { - if (pos == 0) - { - reps[0] = opt.Backs0; - reps[1] = opt.Backs1; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 1) - { - reps[0] = opt.Backs1; - reps[1] = opt.Backs0; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 2) - { - reps[0] = opt.Backs2; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs3; - } - else - { - reps[0] = opt.Backs3; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - else - { - reps[0] = pos - Base.kNumRepDistances; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - _optimum[cur].State = state; - _optimum[cur].Backs0 = reps[0]; - _optimum[cur].Backs1 = reps[1]; - _optimum[cur].Backs2 = reps[2]; - _optimum[cur].Backs3 = reps[3]; - uint curPrice = _optimum[cur].Price; - - currentByte = _matchFinder.GetIndexByte(0 - 1); - matchByte = _matchFinder.GetIndexByte((int)(0 - reps[0] - 1 - 1)); - - posState = position & _posStateMask; - - uint curAnd1Price = curPrice + - _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). - GetPrice(!state.IsCharState(), matchByte, currentByte); - - var nextOptimum = _optimum[cur + 1]; - - bool nextIsChar = false; - if (curAnd1Price < nextOptimum.Price) - { - nextOptimum.Price = curAnd1Price; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsChar(); - nextIsChar = true; - } - - matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); - repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); - - if (matchByte == currentByte && - !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) - { - uint shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); - if (shortRepPrice <= nextOptimum.Price) - { - nextOptimum.Price = shortRepPrice; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsShortRep(); - nextIsChar = true; - } - } - - uint numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; - numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull); - numAvailableBytes = numAvailableBytesFull; - - if (numAvailableBytes < 2) - continue; - if (numAvailableBytes > _numFastBytes) - numAvailableBytes = _numFastBytes; - if (!nextIsChar && matchByte != currentByte) - { - // try Literal + rep0 - uint t = Math.Min(numAvailableBytesFull - 1, _numFastBytes); - uint lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); - if (lenTest2 >= 2) - { - var state2 = state; - state2.UpdateChar(); - uint posStateNext = (position + 1) & _posStateMask; - uint nextRepMatchPrice = curAnd1Price + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1() + - _isRep[state2.Index].GetPrice1(); - { - uint offset = cur + 1 + lenTest2; - while (lenEnd < offset) - _optimum[++lenEnd].Price = kIfinityPrice; - uint curAndLenPrice = nextRepMatchPrice + GetRepPrice( - 0, lenTest2, state2, posStateNext); - var optimum = _optimum[offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = false; - } - } - } - } - - uint startLen = 2; // speed optimization - - for (uint repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++) - { - uint lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); - if (lenTest < 2) - continue; - uint lenTestTemp = lenTest; - do - { - while (lenEnd < cur + lenTest) - _optimum[++lenEnd].Price = kIfinityPrice; - uint curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); - var optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = repIndex; - optimum.Prev1IsChar = false; - } - } while (--lenTest >= 2); - lenTest = lenTestTemp; - - if (repIndex == 0) - startLen = lenTest + 1; - - // if (_maxMode) - if (lenTest < numAvailableBytesFull) - { - uint t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - uint lenTest2 = _matchFinder.GetMatchLen((int)lenTest, reps[repIndex], t); - if (lenTest2 >= 2) - { - var state2 = state; - state2.UpdateRep(); - uint posStateNext = (position + lenTest) & _posStateMask; - uint curAndLenCharPrice = - repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((int)lenTest - 1 - 1)).GetPrice(true, - _matchFinder.GetIndexByte((int)lenTest - 1 - (int)(reps[repIndex] + 1)), - _matchFinder.GetIndexByte((int)lenTest - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - uint nextMatchPrice = curAndLenCharPrice + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); - uint nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - // for(; lenTest2 >= 2; lenTest2--) - { - uint offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - uint curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); - var optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = repIndex; - } - } - } - } - } - - if (newLen > numAvailableBytes) - { - newLen = numAvailableBytes; - for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; - _matchDistances[numDistancePairs] = newLen; - numDistancePairs += 2; - } - if (newLen >= startLen) - { - normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); - while (lenEnd < cur + newLen) - _optimum[++lenEnd].Price = kIfinityPrice; - - uint offs = 0; - while (startLen > _matchDistances[offs]) - offs += 2; - - for (uint lenTest = startLen;; lenTest++) - { - uint curBack = _matchDistances[offs + 1]; - uint curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); - var optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = curBack + Base.kNumRepDistances; - optimum.Prev1IsChar = false; - } - - if (lenTest == _matchDistances[offs]) - { - if (lenTest < numAvailableBytesFull) - { - uint t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - uint lenTest2 = _matchFinder.GetMatchLen((int)lenTest, curBack, t); - if (lenTest2 >= 2) - { - var state2 = state; - state2.UpdateMatch(); - uint posStateNext = (position + lenTest) & _posStateMask; - uint curAndLenCharPrice = curAndLenPrice + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((int)lenTest - 1 - 1)). - GetPrice(true, - _matchFinder.GetIndexByte((int)lenTest - (int)(curBack + 1) - 1), - _matchFinder.GetIndexByte((int)lenTest - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - uint nextMatchPrice = curAndLenCharPrice + - _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); - uint nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - uint offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); - optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = curBack + Base.kNumRepDistances; - } - } - } - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - } - } - - private bool ChangePair(uint smallDist, uint bigDist) - { - const int kDif = 7; - return smallDist < (uint)1 << (32 - kDif) && bigDist >= smallDist << kDif; - } - - private void WriteEndMarker(uint posState) - { - if (!_writeEndMark) - return; - - _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1); - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - uint len = Base.kMatchMinLen; - _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - uint posSlot = (1 << Base.kNumPosSlotBits) - 1; - uint lenToPosState = Base.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - int footerBits = 30; - uint posReduced = ((uint)1 << footerBits) - 1; - _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); - } - - private void Flush(uint nowPos) - { - ReleaseMFStream(); - WriteEndMarker(nowPos & _posStateMask); - _rangeEncoder.FlushData(); - _rangeEncoder.FlushStream(); - } - - public void CodeOneBlock(out long inSize, out long outSize, out bool finished) - { - inSize = 0; - outSize = 0; - finished = true; - - if (_inStream != null) - { - _matchFinder.SetStream(_inStream); - _matchFinder.Init(); - _needReleaseMFStream = true; - _inStream = null; - if (_trainSize > 0) - _matchFinder.Skip(_trainSize); - } - - if (_finished) - return; - _finished = true; - - - long progressPosValuePrev = nowPos64; - if (nowPos64 == 0) - { - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((uint)nowPos64); - return; - } - uint len, numDistancePairs; // it's not used - ReadMatchDistances(out len, out numDistancePairs); - uint posState = (uint)nowPos64 & _posStateMask; - _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); - _state.UpdateChar(); - byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); - _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte).Encode(_rangeEncoder, curByte); - _previousByte = curByte; - _additionalOffset--; - nowPos64++; - } - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((uint)nowPos64); - return; - } - while (true) - { - uint pos; - uint len = GetOptimum((uint)nowPos64, out pos); - - uint posState = (uint)nowPos64 & _posStateMask; - uint complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState; - if (len == 1 && pos == 0xFFFFFFFF) - { - _isMatch[complexState].Encode(_rangeEncoder, 0); - byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); - var subCoder = _literalEncoder.GetSubCoder((uint)nowPos64, _previousByte); - if (!_state.IsCharState()) - { - byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - _additionalOffset)); - subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); - } - else - subCoder.Encode(_rangeEncoder, curByte); - _previousByte = curByte; - _state.UpdateChar(); - } - else - { - _isMatch[complexState].Encode(_rangeEncoder, 1); - if (pos < Base.kNumRepDistances) - { - _isRep[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 0) - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 0); - if (len == 1) - _isRep0Long[complexState].Encode(_rangeEncoder, 0); - else - _isRep0Long[complexState].Encode(_rangeEncoder, 1); - } - else - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 1) - _isRepG1[_state.Index].Encode(_rangeEncoder, 0); - else - { - _isRepG1[_state.Index].Encode(_rangeEncoder, 1); - _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2); - } - } - if (len == 1) - _state.UpdateShortRep(); - else - { - _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - _state.UpdateRep(); - } - uint distance = _repDistances[pos]; - if (pos != 0) - { - for (uint i = pos; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - } - } - else - { - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); - pos -= Base.kNumRepDistances; - uint posSlot = GetPosSlot(pos); - uint lenToPosState = Base.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - - if (posSlot >= Base.kStartPosModelIndex) - { - int footerBits = (int)((posSlot >> 1) - 1); - uint baseVal = (2 | (posSlot & 1)) << footerBits; - uint posReduced = pos - baseVal; - - if (posSlot < Base.kEndPosModelIndex) - { - BitTreeEncoder.ReverseEncode(_posEncoders, - baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); - } - else - { - _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); - _alignPriceCount++; - } - } - uint distance = pos; - for (uint i = Base.kNumRepDistances - 1; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - _matchPriceCount++; - } - _previousByte = _matchFinder.GetIndexByte((int)(len - 1 - _additionalOffset)); - } - _additionalOffset -= len; - nowPos64 += len; - if (_additionalOffset == 0) - { - // if (!_fastMode) - if (_matchPriceCount >= 1 << 7) - FillDistancesPrices(); - if (_alignPriceCount >= Base.kAlignTableSize) - FillAlignPrices(); - inSize = nowPos64; - outSize = _rangeEncoder.GetProcessedSizeAdd(); - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((uint)nowPos64); - return; - } - - if (nowPos64 - progressPosValuePrev >= 1 << 12) - { - _finished = false; - finished = false; - return; - } - } - } - } - - private void ReleaseMFStream() - { - if (_matchFinder != null && _needReleaseMFStream) - { - _matchFinder.ReleaseStream(); - _needReleaseMFStream = false; - } - } - - private void SetOutStream(Stream outStream) - { - _rangeEncoder.SetStream(outStream); - } - - private void ReleaseOutStream() - { - _rangeEncoder.ReleaseStream(); - } - - private void ReleaseStreams() - { - ReleaseMFStream(); - ReleaseOutStream(); - } - - private void SetStreams(Stream inStream, Stream outStream, - long inSize, long outSize) - { - _inStream = inStream; - _finished = false; - Create(); - SetOutStream(outStream); - Init(); - - // if (!_fastMode) - { - FillDistancesPrices(); - FillAlignPrices(); - } - - _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); - _lenEncoder.UpdateTables((uint)1 << _posStateBits); - _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); - _repMatchLenEncoder.UpdateTables((uint)1 << _posStateBits); - - nowPos64 = 0; - } - - private void FillDistancesPrices() - { - for (uint i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++) - { - uint posSlot = GetPosSlot(i); - int footerBits = (int)((posSlot >> 1) - 1); - uint baseVal = (2 | (posSlot & 1)) << footerBits; - tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, - baseVal - posSlot - 1, footerBits, i - baseVal); - } - - for (uint lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++) - { - uint posSlot; - var encoder = _posSlotEncoder[lenToPosState]; - - uint st = lenToPosState << Base.kNumPosSlotBits; - for (posSlot = 0; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); - for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] += ((posSlot >> 1) - 1 - Base.kNumAlignBits) << BitEncoder.kNumBitPriceShiftBits; - - uint st2 = lenToPosState * Base.kNumFullDistances; - uint i; - for (i = 0; i < Base.kStartPosModelIndex; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + i]; - for (; i < Base.kNumFullDistances; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; - } - _matchPriceCount = 0; - } - - private void FillAlignPrices() - { - for (uint i = 0; i < Base.kAlignTableSize; i++) - _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); - _alignPriceCount = 0; - } - - private static int FindMatchFinder(string s) - { - for (int m = 0; m < kMatchFinderIDs.Length; m++) - { - if (s == kMatchFinderIDs[m]) - return m; - } - return -1; - } - - public void SetTrainSize(uint trainSize) - { - _trainSize = trainSize; - } - - private enum EMatchFinderType - { - BT2, - BT4 - } - - private class LiteralEncoder - { - private Encoder2[] m_Coders; - private int m_NumPosBits; - private int m_NumPrevBits; - private uint m_PosMask; - - public void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint)1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Encoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - public void Init() - { - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - for (uint i = 0; i < numStates; i++) - m_Coders[i].Init(); - } - - public Encoder2 GetSubCoder(uint pos, byte prevByte) - { - return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; - } - - public struct Encoder2 - { - private BitEncoder[] m_Encoders; - - public void Create() - { - m_Encoders = new BitEncoder[0x300]; - } - - public void Init() - { - for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); - } - - public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol) - { - uint context = 1; - for (int i = 7; i >= 0; i--) - { - uint bit = (uint)((symbol >> i) & 1); - m_Encoders[context].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) - { - uint context = 1; - bool same = true; - for (int i = 7; i >= 0; i--) - { - uint bit = (uint)((symbol >> i) & 1); - uint state = context; - if (same) - { - uint matchBit = (uint)((matchByte >> i) & 1); - state += (1 + matchBit) << 8; - same = matchBit == bit; - } - m_Encoders[state].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public uint GetPrice(bool matchMode, byte matchByte, byte symbol) - { - uint price = 0; - uint context = 1; - int i = 7; - if (matchMode) - { - for (; i >= 0; i--) - { - uint matchBit = (uint)(matchByte >> i) & 1; - uint bit = (uint)(symbol >> i) & 1; - price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit); - context = (context << 1) | bit; - if (matchBit != bit) - { - i--; - break; - } - } - } - for (; i >= 0; i--) - { - uint bit = (uint)(symbol >> i) & 1; - price += m_Encoders[context].GetPrice(bit); - context = (context << 1) | bit; - } - return price; - } - } - } - - private class LenEncoder - { - private readonly BitTreeEncoder[] _lowCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; - private readonly BitTreeEncoder[] _midCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; - private BitEncoder _choice = new BitEncoder(); - private BitEncoder _choice2 = new BitEncoder(); - private BitTreeEncoder _highCoder = new BitTreeEncoder(Base.kNumHighLenBits); - - public LenEncoder() - { - for (uint posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++) - { - _lowCoder[posState] = new BitTreeEncoder(Base.kNumLowLenBits); - _midCoder[posState] = new BitTreeEncoder(Base.kNumMidLenBits); - } - } - - public void Init(uint numPosStates) - { - _choice.Init(); - _choice2.Init(); - for (uint posState = 0; posState < numPosStates; posState++) - { - _lowCoder[posState].Init(); - _midCoder[posState].Init(); - } - _highCoder.Init(); - } - - public void Encode(RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) - { - if (symbol < Base.kNumLowLenSymbols) - { - _choice.Encode(rangeEncoder, 0); - _lowCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - symbol -= Base.kNumLowLenSymbols; - _choice.Encode(rangeEncoder, 1); - if (symbol < Base.kNumMidLenSymbols) - { - _choice2.Encode(rangeEncoder, 0); - _midCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - _choice2.Encode(rangeEncoder, 1); - _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols); - } - } - } - - public void SetPrices(uint posState, uint numSymbols, uint[] prices, uint st) - { - uint a0 = _choice.GetPrice0(); - uint a1 = _choice.GetPrice1(); - uint b0 = a1 + _choice2.GetPrice0(); - uint b1 = a1 + _choice2.GetPrice1(); - uint i = 0; - for (i = 0; i < Base.kNumLowLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); - } - for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols); - } - for (; i < numSymbols; i++) - prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); - } - } - - private class LenPriceTableEncoder : LenEncoder - { - private readonly uint[] _counters = new uint[Base.kNumPosStatesEncodingMax]; - private readonly uint[] _prices = new uint[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax]; - private uint _tableSize; - - public void SetTableSize(uint tableSize) - { - _tableSize = tableSize; - } - - public uint GetPrice(uint symbol, uint posState) - { - return _prices[posState * Base.kNumLenSymbols + symbol]; - } - - private void UpdateTable(uint posState) - { - SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols); - _counters[posState] = _tableSize; - } - - public void UpdateTables(uint numPosStates) - { - for (uint posState = 0; posState < numPosStates; posState++) - UpdateTable(posState); - } - - public new void Encode(RangeCoder.Encoder rangeEncoder, uint symbol, uint posState) - { - base.Encode(rangeEncoder, symbol, posState); - if (--_counters[posState] == 0) - UpdateTable(posState); - } - } - - private class Optimal - { - public uint BackPrev; - public uint BackPrev2; - public uint Backs0; - public uint Backs1; - public uint Backs2; - public uint Backs3; - public uint PosPrev; - public uint PosPrev2; - public bool Prev1IsChar; - public bool Prev2; - public uint Price; - public Base.State State; - - public void MakeAsChar() - { - BackPrev = 0xFFFFFFFF; - Prev1IsChar = false; - } - - public void MakeAsShortRep() - { - BackPrev = 0; - ; - Prev1IsChar = false; - } - - public bool IsShortRep() - { - return BackPrev == 0; - } - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs deleted file mode 100644 index 0d8d782..0000000 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoder.cs +++ /dev/null @@ -1,253 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -using System.IO; - -namespace Rant.Core.IO.Compression.RangeCoder -{ - internal class Encoder - { - public const uint kTopValue = 1 << 24; - private byte _cache; - private uint _cacheSize; - public ulong Low; - public uint Range; - private long StartPosition; - private Stream Stream; - - public void SetStream(Stream stream) - { - Stream = stream; - } - - public void ReleaseStream() - { - Stream = null; - } - - public void Init() - { - StartPosition = Stream.Position; - - Low = 0; - Range = 0xFFFFFFFF; - _cacheSize = 1; - _cache = 0; - } - - public void FlushData() - { - for (int i = 0; i < 5; i++) - ShiftLow(); - } - - public void FlushStream() - { - Stream.Flush(); - } - - public void CloseStream() - { - Stream.Close(); - } - - public void Encode(uint start, uint size, uint total) - { - Low += start * (Range /= total); - Range *= size; - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - public void ShiftLow() - { - if ((uint)Low < 0xFF000000 || (uint)(Low >> 32) == 1) - { - byte temp = _cache; - do - { - Stream.WriteByte((byte)(temp + (Low >> 32))); - temp = 0xFF; - } while (--_cacheSize != 0); - _cache = (byte)((uint)Low >> 24); - } - _cacheSize++; - Low = (uint)Low << 8; - } - - public void EncodeDirectBits(uint v, int numTotalBits) - { - for (int i = numTotalBits - 1; i >= 0; i--) - { - Range >>= 1; - if (((v >> i) & 1) == 1) - Low += Range; - if (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - } - - public void EncodeBit(uint size0, int numTotalBits, uint symbol) - { - uint newBound = (Range >> numTotalBits) * size0; - if (symbol == 0) - Range = newBound; - else - { - Low += newBound; - Range -= newBound; - } - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - public long GetProcessedSizeAdd() - { - return _cacheSize + - Stream.Position - StartPosition + 4; - // (long)Stream.GetProcessedSize(); - } - } - - internal class Decoder - { - public const uint kTopValue = 1 << 24; - public uint Code; - public uint Range; - // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16); - public Stream Stream; - - public void Init(Stream stream) - { - // Stream.Init(stream); - Stream = stream; - - Code = 0; - Range = 0xFFFFFFFF; - for (int i = 0; i < 5; i++) - Code = (Code << 8) | (byte)Stream.ReadByte(); - } - - public void ReleaseStream() - { - // Stream.ReleaseStream(); - Stream = null; - } - - public void CloseStream() - { - Stream.Close(); - } - - public void Normalize() - { - while (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - } - - public void Normalize2() - { - if (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - } - - public uint GetThreshold(uint total) - { - return Code / (Range /= total); - } - - public void Decode(uint start, uint size, uint total) - { - Code -= start * Range; - Range *= size; - Normalize(); - } - - public uint DecodeDirectBits(int numTotalBits) - { - uint range = Range; - uint code = Code; - uint result = 0; - for (int i = numTotalBits; i > 0; i--) - { - range >>= 1; - /* - result <<= 1; - if (code >= range) - { - code -= range; - result |= 1; - } - */ - uint t = (code - range) >> 31; - code -= range & (t - 1); - result = (result << 1) | (1 - t); - - if (range < kTopValue) - { - code = (code << 8) | (byte)Stream.ReadByte(); - range <<= 8; - } - } - Range = range; - Code = code; - return result; - } - - public uint DecodeBit(uint size0, int numTotalBits) - { - uint newBound = (Range >> numTotalBits) * size0; - uint symbol; - if (Code < newBound) - { - symbol = 0; - Range = newBound; - } - else - { - symbol = 1; - Code -= newBound; - Range -= newBound; - } - Normalize(); - return symbol; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs deleted file mode 100644 index 14618da..0000000 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBit.cs +++ /dev/null @@ -1,150 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -namespace Rant.Core.IO.Compression.RangeCoder -{ - internal struct BitEncoder - { - public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; - private const int kNumMoveBits = 5; - private const int kNumMoveReducingBits = 2; - public const int kNumBitPriceShiftBits = 6; - private static readonly uint[] ProbPrices = new uint[kBitModelTotal >> kNumMoveReducingBits]; - private uint Prob; - - static BitEncoder() - { - const int kNumBits = kNumBitModelTotalBits - kNumMoveReducingBits; - for (int i = kNumBits - 1; i >= 0; i--) - { - uint start = (uint)1 << (kNumBits - i - 1); - uint end = (uint)1 << (kNumBits - i); - for (uint j = start; j < end; j++) - { - ProbPrices[j] = ((uint)i << kNumBitPriceShiftBits) + - (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); - } - } - } - - public void Init() - { - Prob = kBitModelTotal >> 1; - } - - public void UpdateModel(uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - else - Prob -= Prob >> kNumMoveBits; - } - - public void Encode(Encoder encoder, uint symbol) - { - // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol); - // UpdateModel(symbol); - uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob; - if (symbol == 0) - { - encoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - } - else - { - encoder.Low += newBound; - encoder.Range -= newBound; - Prob -= Prob >> kNumMoveBits; - } - if (encoder.Range < Encoder.kTopValue) - { - encoder.Range <<= 8; - encoder.ShiftLow(); - } - } - - public uint GetPrice(uint symbol) - { - return ProbPrices[(((Prob - symbol) ^ -(int)symbol) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; - } - - public uint GetPrice0() - { - return ProbPrices[Prob >> kNumMoveReducingBits]; - } - - public uint GetPrice1() - { - return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; - } - } - - internal struct BitDecoder - { - public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = 1 << kNumBitModelTotalBits; - private const int kNumMoveBits = 5; - private uint Prob; - - public void UpdateModel(int numMoveBits, uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> numMoveBits; - else - Prob -= Prob >> numMoveBits; - } - - public void Init() - { - Prob = kBitModelTotal >> 1; - } - - public uint Decode(Decoder rangeDecoder) - { - uint newBound = (rangeDecoder.Range >> kNumBitModelTotalBits) * Prob; - if (rangeDecoder.Code < newBound) - { - rangeDecoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - if (rangeDecoder.Range < Decoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 0; - } - rangeDecoder.Range -= newBound; - rangeDecoder.Code -= newBound; - Prob -= Prob >> kNumMoveBits; - if (rangeDecoder.Range < Decoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 1; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs b/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs deleted file mode 100644 index e27ce71..0000000 --- a/Rant/Core/IO/Compression/RangeCoder/RangeCoderBitTree.cs +++ /dev/null @@ -1,180 +0,0 @@ -#region License - -// https://github.com/TheBerkin/Rant -// -// Copyright (c) 2017 Nicholas Fleck -// -// 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. - -#endregion - -namespace Rant.Core.IO.Compression.RangeCoder -{ - internal struct BitTreeEncoder - { - private readonly BitEncoder[] Models; - private readonly int NumBitLevels; - - public BitTreeEncoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new BitEncoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < 1 << NumBitLevels; i++) - Models[i].Init(); - } - - public void Encode(Encoder rangeEncoder, uint symbol) - { - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0;) - { - bitIndex--; - uint bit = (symbol >> bitIndex) & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - } - } - - public void ReverseEncode(Encoder rangeEncoder, uint symbol) - { - uint m = 1; - for (uint i = 0; i < NumBitLevels; i++) - { - uint bit = symbol & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - - public uint GetPrice(uint symbol) - { - uint price = 0; - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0;) - { - bitIndex--; - uint bit = (symbol >> bitIndex) & 1; - price += Models[m].GetPrice(bit); - m = (m << 1) + bit; - } - return price; - } - - public uint ReverseGetPrice(uint symbol) - { - uint price = 0; - uint m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - uint bit = symbol & 1; - symbol >>= 1; - price += Models[m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static uint ReverseGetPrice(BitEncoder[] Models, uint startIndex, - int NumBitLevels, uint symbol) - { - uint price = 0; - uint m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - uint bit = symbol & 1; - symbol >>= 1; - price += Models[startIndex + m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static void ReverseEncode(BitEncoder[] Models, uint startIndex, - Encoder rangeEncoder, int NumBitLevels, uint symbol) - { - uint m = 1; - for (int i = 0; i < NumBitLevels; i++) - { - uint bit = symbol & 1; - Models[startIndex + m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - } - - internal struct BitTreeDecoder - { - private readonly BitDecoder[] Models; - private readonly int NumBitLevels; - - public BitTreeDecoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new BitDecoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < 1 << NumBitLevels; i++) - Models[i].Init(); - } - - public uint Decode(Decoder rangeDecoder) - { - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--) - m = (m << 1) + Models[m].Decode(rangeDecoder); - return m - ((uint)1 << NumBitLevels); - } - - public uint ReverseDecode(Decoder rangeDecoder) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= bit << bitIndex; - } - return symbol; - } - - public static uint ReverseDecode(BitDecoder[] Models, uint startIndex, - Decoder rangeDecoder, int NumBitLevels) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[startIndex + m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= bit << bitIndex; - } - return symbol; - } - } -} \ No newline at end of file diff --git a/Rant/Core/IO/EasyReader.cs b/Rant/Core/IO/EasyReader.cs index 47e0ebd..ff3fc58 100644 --- a/Rant/Core/IO/EasyReader.cs +++ b/Rant/Core/IO/EasyReader.cs @@ -94,6 +94,11 @@ public EasyReader(byte[] data, int startIndex = 0, Endian defaultEndianness = En Endianness = defaultEndianness; } + /// <summary> + /// The character encoding for the stream. + /// </summary> + public Encoding Encoding { get; set; } = Encoding.UTF8; + /// <summary> /// Gets or sets the endianness in which data is read by the stream. /// </summary> @@ -446,7 +451,7 @@ public string ReadString() { int bytes = ReadInt32(); if (bytes < 0) return null; - return Encoding.Unicode.GetString(ReadBytes(bytes)); + return Encoding.GetString(ReadBytes(bytes)); } /// <summary> @@ -462,7 +467,7 @@ public EasyReader ReadString(out string value) value = null; return this; } - value = Encoding.Unicode.GetString(ReadBytes(bytes)); + value = Encoding.GetString(ReadBytes(bytes)); return this; } diff --git a/Rant/Core/IO/EasyWriter.cs b/Rant/Core/IO/EasyWriter.cs index 993281f..5fa915f 100644 --- a/Rant/Core/IO/EasyWriter.cs +++ b/Rant/Core/IO/EasyWriter.cs @@ -77,6 +77,11 @@ public EasyWriter(string path, FileMode mode = FileMode.Create, Endian endiannes _leaveOpen = false; } + /// <summary> + /// The character encoding for the stream. + /// </summary> + public Encoding Encoding { get; set; } = Encoding.UTF8; + /// <summary> /// The underlying stream for this instance. /// </summary> @@ -281,7 +286,7 @@ public EasyWriter Write(string value, bool nullTerminated = false) Write(-1); return this; } - var bytes = Encoding.Unicode.GetBytes(value); + var bytes = Encoding.GetBytes(value); if (!nullTerminated) Write(bytes.Length); BaseStream.Write(bytes, 0, bytes.Length); diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index c7d6d2c..95a3945 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -240,22 +240,6 @@ <Compile Include="Core\ObjectModel\RantObjectType.cs" /> <Compile Include="Formats\EnglishPluralizer.cs" /> <Compile Include="Formats\Pluralizer.cs" /> - <Compile Include="Core\IO\Bson\BsonDocument.cs" /> - <Compile Include="Core\IO\Bson\BsonItem.cs" /> - <Compile Include="Core\IO\Bson\BsonStringTableMode.cs" /> - <Compile Include="Core\IO\Compression\CRC.cs" /> - <Compile Include="Core\IO\Compression\EasyCompressor.cs" /> - <Compile Include="Core\IO\Compression\ICoder.cs" /> - <Compile Include="Core\IO\Compression\LZMA\LzmaBase.cs" /> - <Compile Include="Core\IO\Compression\LZMA\LzmaDecoder.cs" /> - <Compile Include="Core\IO\Compression\LZMA\LzmaEncoder.cs" /> - <Compile Include="Core\IO\Compression\LZ\IMatchFinder.cs" /> - <Compile Include="Core\IO\Compression\LZ\LzBinTree.cs" /> - <Compile Include="Core\IO\Compression\LZ\LzInWindow.cs" /> - <Compile Include="Core\IO\Compression\LZ\LzOutWindow.cs" /> - <Compile Include="Core\IO\Compression\RangeCoder\RangeCoder.cs" /> - <Compile Include="Core\IO\Compression\RangeCoder\RangeCoderBit.cs" /> - <Compile Include="Core\IO\Compression\RangeCoder\RangeCoderBitTree.cs" /> <Compile Include="RantArgAttribute.cs" /> <Compile Include="RantCompilerException.cs" /> <Compile Include="RantCompilerMessage.cs" /> diff --git a/Rant/RantProgram.cs b/Rant/RantProgram.cs index b7380ce..e5b4af7 100644 --- a/Rant/RantProgram.cs +++ b/Rant/RantProgram.cs @@ -32,7 +32,6 @@ using Rant.Core.Compiler; using Rant.Core.Compiler.Syntax; using Rant.Core.IO; -using Rant.Core.IO.Bson; using Rant.Core.Utilities; using Rant.Resources; @@ -199,33 +198,21 @@ public static RantProgram LoadStream(string programName, Stream stream) private static bool IsValidPatternName(string name) => !Util.IsNullOrWhiteSpace(name) && name.All(c => !_invalidNameChars.Contains(c)); - internal override void DeserializeData(BsonItem data) - { - Name = data["name"]; - using (var ms = new MemoryStream((byte[])data["code"].Value)) - using (var reader = new EasyReader(ms)) - { - SyntaxTree = RST.DeserializeRST(reader); - } - } - - internal override BsonItem SerializeData() - { - var data = new BsonItem { ["name"] = Name }; - - using (var ms = new MemoryStream()) - using (var writer = new EasyWriter(ms)) - { - RST.SerializeRST(SyntaxTree, writer); - ms.Flush(); - data["code"] = new BsonItem(ms.ToArray()); - } - return data; - } - internal override void Load(RantEngine engine) { engine.CacheProgramInternal(this); } - } + + internal override void DeserializeData(EasyReader reader) + { + Name = reader.ReadString(); + SyntaxTree = RST.DeserializeRST(reader); + } + + internal override void SerializeData(EasyWriter writer) + { + writer.Write(Name); + RST.SerializeRST(SyntaxTree, writer); + } + } } \ No newline at end of file diff --git a/Rant/Resources/RantPackage.cs b/Rant/Resources/RantPackage.cs index 8e81bc3..59dfaae 100644 --- a/Rant/Resources/RantPackage.cs +++ b/Rant/Resources/RantPackage.cs @@ -28,26 +28,23 @@ using System.IO; using System.Linq; using System.Text; -using System.Threading; using Rant.Core.IO; -using Rant.Core.IO.Bson; -using Rant.Core.IO.Compression; using Rant.Core.Utilities; using static Rant.Localization.Txtres; -using Rant.Localization; +using System.IO.Compression; namespace Rant.Resources { - /// <summary> - /// Represents a collection of patterns and tables that can be exported to an archive file. - /// </summary> - public sealed class RantPackage + /// <summary> + /// Represents a collection of patterns and tables that can be exported to an archive file. + /// </summary> + public sealed class RantPackage { - private const string MAGIC = "RPKG"; + private const string MAGIC = "NFRP"; internal const string EXTENSION = ".rantpkg"; - private const ushort PACKAGE_VERSION = 3; + private const ushort PACKAGE_FORMAT_VERSION = 3; private readonly HashSet<RantPackageDependency> _dependencies = new HashSet<RantPackageDependency>(); private readonly HashSet<RantResource> _resources = new HashSet<RantResource>(); private string _id = GetString("default-package-id"); @@ -240,52 +237,56 @@ public bool ContainsResource(RantResource resource) /// </summary> /// <param name="path">The path to the file to create.</param> /// <param name="compress">Specifies whether to compress the package contents.</param> - /// <param name="stringTableMode">Specifies string table behavior for the package.</param> public void Save( string path, - bool compress = true, - BsonStringTableMode stringTableMode = BsonStringTableMode.None) + bool compress = true) { if (string.IsNullOrEmpty(Path.GetExtension(path))) path += EXTENSION; - + using (var writer = new EasyWriter(File.Create(path))) { - var doc = new BsonDocument(stringTableMode) - { - Top = - { - ["info"] = new BsonItem - { - ["title"] = new BsonItem(_title), - ["id"] = new BsonItem(_id), - ["description"] = new BsonItem(Description), - ["tags"] = new BsonItem(Tags), - ["version"] = new BsonItem(Version.ToString()), - ["authors"] = new BsonItem(Authors), - ["dependencies"] = new BsonItem(_dependencies.Select(dep => - { - var depObj = new BsonItem - { - ["id"] = dep.ID, - ["version"] = dep.Version.ToString(), - ["allow-newer"] = dep.AllowNewer - }; - return depObj; - }).ToArray()) - }, - ["resources"] = new BsonItem(_resources.Select(RantResource.SerializeResource).ToList()) - } - }; - - var data = doc.ToByteArray(stringTableMode != BsonStringTableMode.None); - if (compress) - data = EasyCompressor.Compress(data); - writer.Write(Encoding.ASCII.GetBytes(MAGIC)); - writer.Write(PACKAGE_VERSION); - writer.Write(compress); - writer.Write(data.Length); - writer.Write(data); + writer.Write(Encoding.ASCII.GetBytes(MAGIC)); + writer.Write(PACKAGE_FORMAT_VERSION); + writer.Write(compress); + writer.Write(_title); + writer.Write(_id); + writer.Write(Description); + writer.Write(Tags); + writer.Write(Authors); + writer.Write(Version.Major); + writer.Write(Version.Minor); + writer.Write(Version.Revision); + writer.Write(_dependencies.Count); + foreach(var dep in _dependencies) + { + writer.Write(dep.ID); + writer.Write(dep.Version.Major); + writer.Write(dep.Version.Minor); + writer.Write(dep.Version.Revision); + writer.Write(dep.AllowNewer); + } + writer.Write(_resources.Count); + + if (compress) + { + using (var compressStream = new DeflateStream(writer.BaseStream, CompressionMode.Compress, true)) + { + foreach (var res in _resources) + { + RantResource.SerializeResource(res, new EasyWriter(compressStream, leaveOpen: true)); + } + compressStream.Flush(); + } + } + else + { + foreach (var res in _resources) + { + RantResource.SerializeResource(res, writer); + } + } + writer.BaseStream.Flush(); } } @@ -312,46 +313,57 @@ public static RantPackage Load(Stream source) string magic = Encoding.ASCII.GetString(reader.ReadBytes(4)); if (magic != MAGIC) throw new InvalidDataException(GetString("err-file-corrupt")); - var package = new RantPackage(); ushort version = reader.ReadUInt16(); - if (version != PACKAGE_VERSION) + if (version != PACKAGE_FORMAT_VERSION) throw new InvalidDataException(GetString("err-invalid-package-version", version)); bool compress = reader.ReadBoolean(); - int size = reader.ReadInt32(); - var data = reader.ReadBytes(size); - if (compress) data = EasyCompressor.Decompress(data); - var doc = BsonDocument.Read(data); - - var info = doc["info"]; - if (info == null) - throw new InvalidDataException(GetString("err-missing-package-meta")); - - package.Title = info["title"]; - package.ID = info["id"]; - package.Version = RantPackageVersion.Parse(info["version"]); - package.Description = info["description"]; - package.Authors = (string[])info["authors"]; - package.Tags = (string[])info["tags"]; - - var deps = info["dependencies"]; - if (deps != null && deps.IsArray) - { - for (int i = 0; i < deps.Count; i++) - { - var dep = deps[i]; - var depId = dep["id"].Value; - var depVersion = dep["version"].Value; - bool depAllowNewer = (bool)dep["allow-newer"].Value; - package.AddDependency(new RantPackageDependency(depId.ToString(), depVersion.ToString()) - { - AllowNewer = depAllowNewer - }); - } - } - - package._resources.AddRange(doc["resources"].Values.Select(RantResource.DeserializeResource).Where(res => res != null)); - - return package; + + var package = new RantPackage(); + + package.Title = reader.ReadString(); + package.ID = reader.ReadString(); + package.Description = reader.ReadString(); + package.Tags = reader.ReadStringArray(); + package.Authors = reader.ReadStringArray(); + int vmaj = reader.ReadInt32(); + int vmin = reader.ReadInt32(); + int vrev = reader.ReadInt32(); + package.Version = new RantPackageVersion(vmaj, vmin, vrev); + int depCount = reader.ReadInt32(); + for(int i = 0; i < depCount; i++) + { + var depId = reader.ReadString(); + int depVerMaj = reader.ReadInt32(); + int depVerMin = reader.ReadInt32(); + int depVerRev = reader.ReadInt32(); + bool depAllowNewer = reader.ReadBoolean(); + package.AddDependency(new RantPackageDependency(depId, new RantPackageVersion(depVerMaj, depVerMin, depVerRev)) + { + AllowNewer = depAllowNewer + }); + } + + int resCount = reader.ReadInt32(); + + if (compress) + { + using (var decompressStream = new DeflateStream(reader.BaseStream, CompressionMode.Decompress, true)) + { + for (int i = 0; i < resCount; i++) + { + package._resources.Add(RantResource.DeserializeResource(new EasyReader(decompressStream, true))); + } + } + } + else + { + for(int i = 0; i < resCount; i++) + { + package._resources.Add(RantResource.DeserializeResource(reader)); + } + } + + return package; } } diff --git a/Rant/Resources/RantResource.cs b/Rant/Resources/RantResource.cs index fff320c..9bc6ad6 100644 --- a/Rant/Resources/RantResource.cs +++ b/Rant/Resources/RantResource.cs @@ -27,8 +27,10 @@ using System.Collections.Generic; using System.Reflection; -using Rant.Core.IO.Bson; using Rant.Vocabulary; +using Rant.Core.IO; +using System.Text; +using System.IO; namespace Rant.Resources { @@ -53,34 +55,31 @@ internal static void RegisterType<T>(string id) where T : RantResource _resourceIdRegistry[typeof(T)] = id; } - internal static RantResource DeserializeResource(BsonItem dataHeader) + internal static RantResource DeserializeResource(EasyReader reader) { - Type type; - BsonItem dataItem; - if (!_resourceTypeRegistry.TryGetValue(dataHeader["type"], out type) || (dataItem = dataHeader["data"]) == null) - return null; + var typeCode = Encoding.ASCII.GetString(reader.ReadBytes(4)); + + if (!_resourceTypeRegistry.TryGetValue(typeCode, out Type type)) + throw new InvalidDataException($"Unrecognized resource type: '{typeCode}'"); var resource = Activator.CreateInstance(type, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new object[0], null) as RantResource; - resource?.DeserializeData(dataItem); + resource?.DeserializeData(reader); - return resource; + return resource; } - internal static BsonItem SerializeResource(RantResource resource) + internal static void SerializeResource(RantResource resource, EasyWriter writer) { - string rstr; - if (!_resourceIdRegistry.TryGetValue(resource.GetType(), out rstr)) return null; - var res = new BsonItem - { - ["type"] = rstr, - ["data"] = resource.SerializeData() - }; - return res; + if (!_resourceIdRegistry.TryGetValue(resource.GetType(), out string rstr)) + throw new ArgumentException($"Resource type '{resource.GetType()}' is not registered."); + + writer.WriteBytes(Encoding.ASCII.GetBytes(rstr)); + resource.SerializeData(writer); } - internal abstract void DeserializeData(BsonItem data); - internal abstract BsonItem SerializeData(); + internal abstract void DeserializeData(EasyReader reader); + internal abstract void SerializeData(EasyWriter writer); internal abstract void Load(RantEngine engine); } } \ No newline at end of file diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index b052f60..d2e4ff1 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -28,12 +28,13 @@ using System.Linq; using Rant.Core; -using Rant.Core.IO.Bson; +using Rant.Core.IO; using Rant.Core.Utilities; using Rant.Localization; using Rant.Resources; using Rant.Vocabulary.Querying; using Rant.Vocabulary.Utilities; +using System.Collections; namespace Rant.Vocabulary { @@ -327,110 +328,115 @@ IEnumerable<RantDictionaryEntry> pool : pool.ToList().PickEntry(sb.RNG, dictionary.EnableWeighting && this.EnableWeighting)?[index]; } - internal override void DeserializeData(BsonItem data) + internal override void SerializeData(EasyWriter writer) { - // General data - Name = data["name"]; - TermsPerEntry = data["termc"]; - Language = data["lang"]; - - // Subtypes - var subs = data["subs"].Values; - int si = 0; - foreach (var subList in subs) + writer.Write(Name); + writer.Write(Language); + writer.Write(TermsPerEntry); + for(int i = 0; i < TermsPerEntry; i++) { - foreach (var sub in subList.Values) AddSubtype(sub, si); - si++; + writer.Write(GetSubtypesForIndex(i).ToArray()); } + writer.Write(_hidden.ToArray()); - // Hidden classes - foreach (var hiddenClass in data["hidden-classes"].Values) _hidden.Add(hiddenClass); - - var entries = data["entries"]; - int count = entries.Count; - - // Entries - for (int i = 0; i < count; i++) + writer.Write(_entriesList.Count); + for(int i = 0; i < _entriesList.Count; i++) { - var entryData = entries[i]; - - var termsObject = entryData["terms"]; - - var termArray = new RantDictionaryTerm[termsObject.Count]; - int j = 0; - foreach (var termData in termsObject.Values) + var entry = _entriesList[i]; + for(int j = 0; j < TermsPerEntry; j++) { - var value = (string)termData["value"]; - var pron = (string)termData["pron"]; - var valueSplit = (int)(termData["value-split"] ?? -1); - var pronSplit = (int)(termData["pron-split"] ?? -1); - termArray[j++] = new RantDictionaryTerm(value, pron, valueSplit, pronSplit); + var term = entry[j]; + writer.Write(term.Value); + writer.Write(term.Pronunciation); + writer.Write(term.ValueSplitIndex); + writer.Write(term.PronunciationSplitIndex); + } + writer.Write(entry.Weight); + writer.Write(entry.GetRequiredClasses().ToArray()); + writer.Write(entry.GetOptionalClasses().ToArray()); + var metaKeys = entry.GetMetadataKeys().ToArray(); + writer.Write(metaKeys.Length); + for(int j = 0; j < metaKeys.Length; j++) + { + var metaObj = entry.GetMetadata(metaKeys[j]); + var metaArray = metaObj as IEnumerable; + writer.Write(metaArray != null); + writer.Write(metaKeys[i]); + if (metaArray != null) + { + writer.Write(metaArray.OfType<object>().Select(m => m.ToString()).ToArray()); + } + else + { + writer.Write(metaObj.ToString()); + } } - - var entryClasses = (string[])entryData["classes"]; - var entry = new RantDictionaryEntry(termArray, entryClasses, entryData["weight"] ?? 1); - // Optional classes - foreach (var optionalClass in entryData["optional-classes"].Values) - entry.AddClass(optionalClass, true); - - // Metadata - var meta = entryData["metadata"]; - foreach (string metaKey in meta.Keys) - entry.SetMetadata(metaKey, meta[metaKey].Value); - - AddEntry(entry); } } - internal override BsonItem SerializeData() + internal override void DeserializeData(EasyReader reader) { - var data = new BsonItem + this.Name = reader.ReadString(); + this.Language = reader.ReadString(); + this.TermsPerEntry = reader.ReadInt32(); + for(int i = 0; i < TermsPerEntry; i++) { - ["name"] = Name, - ["lang"] = Language, - ["termc"] = TermsPerEntry - }; - - var subs = new BsonItem[TermsPerEntry]; - for (int i = 0; i < TermsPerEntry; i++) - subs[i] = new BsonItem(GetSubtypesForIndex(i).ToArray()); - data["subs"] = new BsonItem(subs); + foreach(var subtype in reader.ReadStringArray()) + { + AddSubtype(subtype, i); + } + } + _hidden.AddRange(reader.ReadStringArray()); - data["hidden-classes"] = new BsonItem(_hidden.ToArray()); + int numEntries = reader.ReadInt32(); - var entries = new BsonItem[_entriesList.Count]; - for (int i = 0; i < _entriesList.Count; i++) + for(int i = 0; i < numEntries; i++) { - var entry = _entriesList[i]; - var entryData = new BsonItem(); - var termData = new BsonItem[TermsPerEntry]; + var terms = new RantDictionaryTerm[TermsPerEntry]; + for(int j = 0; j < TermsPerEntry; j++) + { + var value = reader.ReadString(); + var pron = reader.ReadString(); + int valueSplit = reader.ReadInt32(); + int pronSplit = reader.ReadInt32(); + terms[j] = new RantDictionaryTerm(value, pron, valueSplit, pronSplit); + } + float weight = reader.ReadSingle(); + var entry = new RantDictionaryEntry(terms) + { + Weight = weight + }; - for (int j = 0; j < TermsPerEntry; j++) + foreach(var reqClass in reader.ReadStringArray()) { - termData[j] = new BsonItem - { - ["value"] = entry[j].Value, - ["pron"] = entry[j].Pronunciation, - ["value-split"] = entry[j].ValueSplitIndex, - ["pron-split"] = entry[j].PronunciationSplitIndex - }; + entry.AddClass(reqClass, false); } - entryData["terms"] = new BsonItem(termData); - entryData["classes"] = new BsonItem(entry.GetRequiredClasses().ToArray()); - entryData["optional-classes"] = new BsonItem(entry.GetOptionalClasses().ToArray()); + foreach (var optClass in reader.ReadStringArray()) + { + entry.AddClass(optClass, true); + } - var metaData = new BsonItem(); - foreach (string metaKey in entry.GetMetadataKeys()) - metaData[metaKey] = new BsonItem(entry.GetMetadata(metaKey)); - entryData["metadata"] = metaData; - entries[i] = entryData; - } + int metaCount = reader.ReadInt32(); - data["entries"] = new BsonItem(entries); + for(int j = 0; j < metaCount; j++) + { + bool isArray = reader.ReadBoolean(); + var key = reader.ReadString(); + if (isArray) + { + entry.SetMetadata(key, reader.ReadStringArray()); + } + else + { + entry.SetMetadata(key, reader.ReadString()); + } + } - return data; + AddEntry(entry); + } } + internal override void Load(RantEngine engine) { From 6648ea47caa9151882830769b7246db1be568f7b Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Mon, 17 Apr 2017 18:31:30 -0500 Subject: [PATCH 208/213] Dictionary bugfix and small fix to person sample --- Rant/Vocabulary/RantDictionaryTable.cs | 2 +- Samples/person.rant | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Rant/Vocabulary/RantDictionaryTable.cs b/Rant/Vocabulary/RantDictionaryTable.cs index d2e4ff1..d0b210b 100644 --- a/Rant/Vocabulary/RantDictionaryTable.cs +++ b/Rant/Vocabulary/RantDictionaryTable.cs @@ -361,7 +361,7 @@ internal override void SerializeData(EasyWriter writer) var metaObj = entry.GetMetadata(metaKeys[j]); var metaArray = metaObj as IEnumerable; writer.Write(metaArray != null); - writer.Write(metaKeys[i]); + writer.Write(metaKeys[j]); if (metaArray != null) { writer.Write(metaArray.OfType<object>().Select(m => m.ToString()).ToArray()); diff --git a/Samples/person.rant b/Samples/person.rant index 201e7ad..d3c2a12 100644 --- a/Samples/person.rant +++ b/Samples/person.rant @@ -1,7 +1,7 @@ { [$[x]:[x:__gender;locked]] [chan:first-name;public;[$x]{<name-male>|<name-female>}]\s - [chan:middle-name;public;{[$x]{<name-male>|<name-female>}|(.05)[q:[case:title]<noun>-<verb.er-transitive-violent>[case:none]]}]\s + [chan:middle-name;public;{[$x]{<name-male>|<name-female>}|(.1)[quot:[case:title]<noun>-<verb.er-transitive-violent>[case:none]]}]\s [chan:last-name;public;<surname::!ln>{(30)|-<surname::!ln>}] [chan:age;private; { From 9d2cd9d9aea9e26eb20460ad9c8b60202eed4e23 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <nicholasfleck@gmail.com> Date: Mon, 17 Apr 2017 21:35:22 -0500 Subject: [PATCH 209/213] Update build paths --- Rant.Console/Rant.Console.csproj | 4 ++-- Rant.Tools/Rant.Tools.csproj | 6 ++--- Rant.sln | 41 ++++---------------------------- Rant/Rant.csproj | 9 ++++--- 4 files changed, 13 insertions(+), 47 deletions(-) diff --git a/Rant.Console/Rant.Console.csproj b/Rant.Console/Rant.Console.csproj index f2a3a0e..cd41afd 100644 --- a/Rant.Console/Rant.Console.csproj +++ b/Rant.Console/Rant.Console.csproj @@ -17,7 +17,7 @@ <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> - <OutputPath>..\bin\MainBuild\</OutputPath> + <OutputPath>..\bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> @@ -26,7 +26,7 @@ <PlatformTarget>AnyCPU</PlatformTarget> <DebugType>none</DebugType> <Optimize>true</Optimize> - <OutputPath>..\bin\MainBuild\</OutputPath> + <OutputPath>..\bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> diff --git a/Rant.Tools/Rant.Tools.csproj b/Rant.Tools/Rant.Tools.csproj index c20e3b6..4743bc6 100644 --- a/Rant.Tools/Rant.Tools.csproj +++ b/Rant.Tools/Rant.Tools.csproj @@ -17,7 +17,7 @@ <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> - <OutputPath>..\bin\MainBuild\</OutputPath> + <OutputPath>..\bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> @@ -26,12 +26,12 @@ <PlatformTarget>AnyCPU</PlatformTarget> <DebugType>none</DebugType> <Optimize>true</Optimize> - <OutputPath>..\bin\MainBuild\</OutputPath> + <OutputPath>..\bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Berkin-Release|AnyCPU'"> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Install|AnyCPU' "> <OutputPath>C:\rant\</OutputPath> <DefineConstants>TRACE</DefineConstants> <Optimize>true</Optimize> diff --git a/Rant.sln b/Rant.sln index 50a316e..dfe7473 100644 --- a/Rant.sln +++ b/Rant.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26403.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rant", "Rant\Rant.csproj", "{A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}" EndProject @@ -34,9 +34,6 @@ Global Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 - Unity|Any CPU = Unity|Any CPU - Unity|x64 = Unity|x64 - Unity|x86 = Unity|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -57,12 +54,6 @@ Global {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|x64.Build.0 = Release|x64 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|x86.ActiveCfg = Release|x86 {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Release|x86.Build.0 = Release|x86 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|Any CPU.ActiveCfg = Unity|Any CPU - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|Any CPU.Build.0 = Unity|Any CPU - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|x64.ActiveCfg = Release|x64 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|x64.Build.0 = Release|x64 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|x86.ActiveCfg = Release|x86 - {A4B6FD1A-44A6-42D2-B4AA-57BC85D2CDD7}.Unity|x86.Build.0 = Release|x86 {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -81,12 +72,6 @@ Global {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|x64.Build.0 = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|x86.ActiveCfg = Release|Any CPU {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Release|x86.Build.0 = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|Any CPU.ActiveCfg = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|Any CPU.Build.0 = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|x64.ActiveCfg = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|x64.Build.0 = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|x86.ActiveCfg = Release|Any CPU - {9D1B18BB-7879-4931-A19B-4F6CE6FD48B1}.Unity|x86.Build.0 = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|Any CPU.Build.0 = Debug|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -105,20 +90,14 @@ Global {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|x64.Build.0 = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|x86.ActiveCfg = Release|Any CPU {A756F3FA-9172-4F08-94EB-17AFBD115078}.Release|x86.Build.0 = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|Any CPU.ActiveCfg = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|Any CPU.Build.0 = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|x64.ActiveCfg = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|x64.Build.0 = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|x86.ActiveCfg = Release|Any CPU - {A756F3FA-9172-4F08-94EB-17AFBD115078}.Unity|x86.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|Any CPU.Build.0 = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x64.ActiveCfg = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x64.Build.0 = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x86.ActiveCfg = Debug|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Debug|x86.Build.0 = Debug|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|Any CPU.ActiveCfg = Berkin-Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|Any CPU.Build.0 = Berkin-Release|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|Any CPU.ActiveCfg = Install|Any CPU + {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|Any CPU.Build.0 = Install|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|x64.ActiveCfg = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|x64.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Install|x86.ActiveCfg = Release|Any CPU @@ -129,12 +108,6 @@ Global {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|x64.Build.0 = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|x86.ActiveCfg = Release|Any CPU {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Release|x86.Build.0 = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|Any CPU.ActiveCfg = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|Any CPU.Build.0 = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|x64.ActiveCfg = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|x64.Build.0 = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|x86.ActiveCfg = Release|Any CPU - {409C7DD6-8DEB-4DF9-9D1E-91861B782A35}.Unity|x86.Build.0 = Release|Any CPU {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|Any CPU.Build.0 = Debug|Any CPU {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -153,12 +126,6 @@ Global {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|x64.Build.0 = Release|Any CPU {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|x86.ActiveCfg = Release|Any CPU {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Release|x86.Build.0 = Release|Any CPU - {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|Any CPU.ActiveCfg = Release|Any CPU - {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|Any CPU.Build.0 = Release|Any CPU - {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x64.ActiveCfg = Release|Any CPU - {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x64.Build.0 = Release|Any CPU - {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x86.ActiveCfg = Release|Any CPU - {3DA28B64-BD56-4F33-9249-33C1ACB499DA}.Unity|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Rant/Rant.csproj b/Rant/Rant.csproj index 95a3945..cd4e6e8 100644 --- a/Rant/Rant.csproj +++ b/Rant/Rant.csproj @@ -30,23 +30,22 @@ <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> - <OutputPath>..\bin\MainBuild\</OutputPath> + <OutputPath>..\bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <Prefer32Bit>false</Prefer32Bit> - <DocumentationFile> - </DocumentationFile> + <DocumentationFile>..\bin\Debug\Rant.xml</DocumentationFile> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>none</DebugType> <Optimize>true</Optimize> - <OutputPath>..\bin\MainBuild\</OutputPath> + <OutputPath>..\bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> - <DocumentationFile>..\bin\MainBuild\Rant.xml</DocumentationFile> + <DocumentationFile>..\bin\Release\Rant.xml</DocumentationFile> <Prefer32Bit>false</Prefer32Bit> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> From 3645fed676f4c628c1e18f5a1457f6e283310212 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <TheBerkin@users.noreply.github.com> Date: Mon, 17 Apr 2017 21:38:13 -0500 Subject: [PATCH 210/213] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b9bfd5a..2eb179a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ to automate repetitive writing tasks with a high degree of creative freedom. * Loops, conditional statements, and subroutines * Fully-functional object model * Import/Export resources easily with the .rantpkg format -* Fully-compatible with Unity3D +* Compatible with Unity 2017 * *And much, much, much more...* ## Examples From 68c7dd4392e0723f2cbe8947487b818075d45b7a Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <TheBerkin@users.noreply.github.com> Date: Tue, 18 Apr 2017 12:37:50 -0500 Subject: [PATCH 211/213] Update appveyor.yml --- appveyor.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 829824d..467881e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,6 @@ branches: image: Visual Studio 2017 configuration: - Release - - Unity shallow_clone: true assembly_info: patch: true @@ -45,4 +44,4 @@ only_commits: - Rant.Tools/ - '*.cs' - '*.sln' - - 'appveyor.yml' \ No newline at end of file + - 'appveyor.yml' From dc0aad994344575724ea3f3d3bfcf3a46e3315b1 Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <TheBerkin@users.noreply.github.com> Date: Tue, 18 Apr 2017 12:38:32 -0500 Subject: [PATCH 212/213] Update appveyor.yml --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 467881e..607d710 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -26,8 +26,6 @@ artifacts: - path: Rant\*.nupkg name: RantNuGet type: WebDeployPackage -- path: bin\UnityBuild - name: Rant (Unity Build) deploy: - provider: NuGet api_key: From 166e7fd6e93ece301d6f652400baad13c344274e Mon Sep 17 00:00:00 2001 From: Nicholas Fleck <TheBerkin@users.noreply.github.com> Date: Tue, 18 Apr 2017 12:39:07 -0500 Subject: [PATCH 213/213] Update appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 607d710..e30d7e3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -21,7 +21,7 @@ before_build: after_build: - ps: "$pkgVersion = $env:APPVEYOR_BUILD_VERSION\n\nif ($env:APPVEYOR_REPO_BRANCH -like \"dev*\")\n \n{\n $pkgVersion += \"-dev\"\n}\n\nnuget pack Rant/Rant.csproj -Version $pkgVersion -OutputDirectory Rant" artifacts: -- path: bin\MainBuild +- path: bin\Release name: Rant - path: Rant\*.nupkg name: RantNuGet