├── MAINTENANCE.md ├── rust-toolchain.toml ├── .gitignore ├── .github ├── renovate.json └── workflows │ └── ci.yml ├── SECURITY.md ├── COPYRIGHT ├── tests └── exhaustive_tests.rs ├── Cargo.toml ├── LICENSE-MIT ├── README.md ├── benches └── id.rs ├── src ├── tests.rs ├── lib.rs └── tables.rs ├── scripts └── unicode.py └── LICENSE-APACHE /MAINTENANCE.md: -------------------------------------------------------------------------------- 1 | ``` 2 | python3 scripts/unicode.py 3 | mv tables.rs src 4 | ``` 5 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "stable" 3 | profile = "minimal" 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | Cargo.lock 3 | scripts/tmp 4 | DerivedCoreProperties.txt 5 | ReadMe.txt 6 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["github>Boshen/renovate"] 4 | } 5 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | ## Security contact information 2 | 3 | To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). 4 | Tidelift will coordinate the fix and disclosure. 5 | -------------------------------------------------------------------------------- /COPYRIGHT: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 2 | or the MIT 4 | license , 5 | at your option. All files in the project carrying such 6 | notice may not be copied, modified, or distributed except 7 | according to those terms. 8 | -------------------------------------------------------------------------------- /tests/exhaustive_tests.rs: -------------------------------------------------------------------------------- 1 | extern crate unicode_id; 2 | use unicode_id::UnicodeID; 3 | /// A `char` in Rust is a Unicode Scalar Value 4 | /// 5 | /// See: http://www.unicode.org/glossary/#unicode_scalar_value 6 | fn all_valid_chars() -> impl Iterator { 7 | (0u32..=0xD7FF).chain(0xE000u32..=0x10FFFF).map(|u| { 8 | core::convert::TryFrom::try_from(u) 9 | .expect("The selected range should be infallible if the docs match impl") 10 | }) 11 | } 12 | 13 | #[test] 14 | fn all_valid_chars_do_not_panic_for_is_id_start() { 15 | for c in all_valid_chars() { 16 | let _ = UnicodeID::is_id_start(c); 17 | } 18 | } 19 | 20 | #[test] 21 | fn all_valid_chars_do_not_panic_for_is_id_continue() { 22 | for c in all_valid_chars() { 23 | let _ = UnicodeID::is_id_continue(c); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "unicode-id" 3 | version = "0.3.6" 4 | authors = [ 5 | "Boshen ", 6 | "erick.tryzelaar ", 7 | "kwantam ", 8 | "Manish Goregaokar " 9 | ] 10 | 11 | homepage = "https://github.com/Boshen/unicode-id" 12 | repository = "https://github.com/Boshen/unicode-id" 13 | documentation = "https://docs.rs/unicode-id" 14 | license = "MIT OR Apache-2.0" 15 | keywords = ["text", "unicode", "unicode-id", "tr31"] 16 | readme = "README.md" 17 | description = """ 18 | Determine whether characters have the ID_Start 19 | or ID_Continue properties according to 20 | Unicode Standard Annex #31. 21 | """ 22 | exclude = ["/.github/**", "/scripts/*"] 23 | rust-version = "1.17" 24 | 25 | [features] 26 | default = [] 27 | no_std = [] 28 | bench = [] 29 | 30 | # [dev-dependencies] 31 | # criterion = "0.3.5" 32 | 33 | # [[bench]] 34 | # name = "id" 35 | # harness = false 36 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | schedule: [cron: "40 1 * * *"] 7 | 8 | permissions: {} 9 | 10 | jobs: 11 | test: 12 | name: Rust ${{matrix.rust}} 13 | runs-on: ubuntu-latest 14 | strategy: 15 | fail-fast: false 16 | matrix: 17 | rust: [nightly, beta, stable, 1.58.1, 1.17.0] 18 | steps: 19 | - uses: taiki-e/checkout-action@b13d20b7cda4e2f325ef19895128f7ff735c0b3d # v1.3.1 20 | - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 21 | with: 22 | toolchain: ${{matrix.rust}} 23 | profile: minimal 24 | override: true 25 | - run: cargo build --features bench 26 | if: matrix.rust == 'nightly' 27 | - run: cargo test --features bench 28 | if: matrix.rust == 'nightly' 29 | # - run: cargo bench --features bench 30 | # if: matrix.rust == 'nightly' 31 | - run: cargo build 32 | - run: cargo test 33 | if: matrix.rust != '1.17.0' 34 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 The Rust Project Developers 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!IMPORTANT] 2 | > Try the optimized version [unicode-id-start](https://github.com/Boshen/unicode-id-start). 3 | 4 | # unicode-id 5 | 6 | Determine if a `char` is a valid identifier for a parser and/or lexer according to 7 | [Unicode Standard Annex #31](http://www.unicode.org/reports/tr31/) rules. 8 | 9 | This is a clone of [unicode-xid](https://github.com/unicode-rs/unicode-xid). 10 | 11 | ```rust 12 | use unicode_id::UnicodeID; 13 | 14 | fn main() { 15 | let ch = 'a'; 16 | println!("Is {} a valid start of an identifier? {}", ch, UnicodeID::is_id_start(ch)); 17 | } 18 | ``` 19 | 20 | ## features 21 | 22 | unicode-id supports a `no_std` feature. This eliminates dependence 23 | on std, and instead uses equivalent functions from core. 24 | 25 | ## changelog 26 | 27 | ### 0.3.6 28 | 29 | - Update to Unicode 17.0.0 30 | 31 | ### 0.3.5 32 | 33 | - Update to Unicode 16.0.0 34 | 35 | ### 0.3.4 36 | 37 | - Update to Unicode 15.1.0 38 | 39 | ### 0.3.3 40 | 41 | - Update to Unicode 15.0.0 42 | 43 | ### 0.3.2 44 | 45 | - Fix clippy warnings 46 | 47 | ### 0.3.0 48 | 49 | - Fork repo for unicode-id 50 | - Update to Unicode 14.0.0 51 | 52 | ### 0.2.2 53 | 54 | - Add an ASCII fast-path 55 | 56 | ### 0.2.1 57 | 58 | - Update to Unicode 13.0.0 59 | - Speed up lookup 60 | 61 | ### 0.2.0 62 | 63 | - Update to Unicode 12.1.0. 64 | 65 | ### 0.1.0 66 | 67 | - Initial release. 68 | -------------------------------------------------------------------------------- /benches/id.rs: -------------------------------------------------------------------------------- 1 | extern crate criterion; 2 | extern crate unicode_id; 3 | 4 | use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; 5 | use unicode_id::UnicodeID; 6 | 7 | fn bench_unicode_id(c: &mut Criterion) { 8 | let unicode_chars = chars(1..0x3000); 9 | let ascii_chars = chars(1..0x80); 10 | 11 | let mut group = c.benchmark_group("UnicodeID"); 12 | group.throughput(Throughput::Bytes(unicode_chars.len() as u64)); 13 | group.bench_with_input( 14 | BenchmarkId::new("is_id_start", "unicode"), 15 | &unicode_chars, 16 | |b, chars| b.iter(|| chars.iter().copied().map(UnicodeID::is_id_start).last()), 17 | ); 18 | group.throughput(Throughput::Bytes(ascii_chars.len() as u64)); 19 | group.bench_with_input( 20 | BenchmarkId::new("is_id_start", "ascii"), 21 | &ascii_chars, 22 | |b, chars| b.iter(|| chars.iter().copied().map(UnicodeID::is_id_start).last()), 23 | ); 24 | group.throughput(Throughput::Bytes(unicode_chars.len() as u64)); 25 | group.bench_with_input( 26 | BenchmarkId::new("is_id_continue", "unicode"), 27 | &unicode_chars, 28 | |b, chars| b.iter(|| chars.iter().copied().map(UnicodeID::is_id_continue).last()), 29 | ); 30 | group.throughput(Throughput::Bytes(ascii_chars.len() as u64)); 31 | group.bench_with_input( 32 | BenchmarkId::new("is_id_continue", "ascii"), 33 | &ascii_chars, 34 | |b, chars| b.iter(|| chars.iter().copied().map(UnicodeID::is_id_continue).last()), 35 | ); 36 | group.finish(); 37 | } 38 | 39 | fn chars(range: std::ops::Range) -> Vec { 40 | range.filter_map(|i| std::char::from_u32(i)).collect() 41 | } 42 | 43 | criterion_group!(benches, bench_unicode_id); 44 | criterion_main!(benches); 45 | -------------------------------------------------------------------------------- /src/tests.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT 2 | // file at the top-level directory of this distribution and at 3 | // http://rust-lang.org/COPYRIGHT. 4 | // 5 | // Licensed under the Apache License, Version 2.0 or the MIT license 7 | // , at your 8 | // option. This file may not be copied, modified, or distributed 9 | // except according to those terms. 10 | 11 | #[cfg(feature = "bench")] 12 | use std::iter; 13 | #[cfg(feature = "bench")] 14 | use std::prelude::v1::*; 15 | #[cfg(feature = "bench")] 16 | use test::Bencher; 17 | 18 | #[cfg(feature = "bench")] 19 | use UnicodeID; 20 | 21 | #[cfg(feature = "bench")] 22 | #[bench] 23 | fn cargo_is_id_start(b: &mut Bencher) { 24 | let string = iter::repeat('a').take(4096).collect::(); 25 | 26 | b.bytes = string.len() as u64; 27 | b.iter(|| string.chars().all(super::UnicodeID::is_id_start)); 28 | } 29 | 30 | #[cfg(feature = "bench")] 31 | #[bench] 32 | fn stdlib_is_id_start(b: &mut Bencher) { 33 | let string = iter::repeat('a').take(4096).collect::(); 34 | 35 | b.bytes = string.len() as u64; 36 | b.iter(|| string.chars().all(char::is_id_start)); 37 | } 38 | 39 | #[cfg(feature = "bench")] 40 | #[bench] 41 | fn cargo_id_continue(b: &mut Bencher) { 42 | let string = iter::repeat('a').take(4096).collect::(); 43 | 44 | b.bytes = string.len() as u64; 45 | b.iter(|| string.chars().all(super::UnicodeID::is_id_continue)); 46 | } 47 | 48 | #[cfg(feature = "bench")] 49 | #[bench] 50 | fn stdlib_id_continue(b: &mut Bencher) { 51 | let string = iter::repeat('a').take(4096).collect::(); 52 | 53 | b.bytes = string.len() as u64; 54 | b.iter(|| string.chars().all(char::is_id_continue)); 55 | } 56 | 57 | #[test] 58 | fn test_is_id_start() { 59 | let chars = ['A', 'Z', 'a', 'z', '\u{1000d}', '\u{10026}']; 60 | 61 | for ch in &chars { 62 | assert!(super::UnicodeID::is_id_start(*ch), "{}", ch); 63 | } 64 | } 65 | 66 | #[test] 67 | fn test_is_not_id_start() { 68 | let chars = [ 69 | '\x00', '\x01', '0', '9', ' ', '[', '<', '{', '(', '\u{02c2}', '\u{ffff}', 70 | ]; 71 | 72 | for ch in &chars { 73 | assert!(!super::UnicodeID::is_id_start(*ch), "{}", ch); 74 | } 75 | } 76 | 77 | #[test] 78 | fn test_is_id_continue() { 79 | let chars = ['0', '9', 'A', 'Z', 'a', 'z', '_', '\u{1000d}', '\u{10026}']; 80 | 81 | for ch in &chars { 82 | assert!(super::UnicodeID::is_id_continue(*ch), "{}", ch); 83 | } 84 | } 85 | 86 | #[test] 87 | fn test_is_not_id_continue() { 88 | let chars = [ 89 | '\x00', '\x01', ' ', '[', '<', '{', '(', '\u{02c2}', '\u{ffff}', 90 | ]; 91 | 92 | for &ch in &chars { 93 | assert!(!super::UnicodeID::is_id_continue(ch), "{}", ch); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT 2 | // file at the top-level directory of this distribution and at 3 | // http://rust-lang.org/COPYRIGHT. 4 | // 5 | // Licensed under the Apache License, Version 2.0 or the MIT license 7 | // , at your 8 | // option. This file may not be copied, modified, or distributed 9 | // except according to those terms. 10 | 11 | //! Determine if a `char` is a valid identifier for a parser and/or lexer according to 12 | //! [Unicode Standard Annex #31](http://www.unicode.org/reports/tr31/) rules. 13 | //! 14 | //! ```rust 15 | //! use unicode_id::UnicodeID; 16 | //! 17 | //! fn main() { 18 | //! let ch = 'a'; 19 | //! println!("Is {} a valid start of an identifier? {}", ch, UnicodeID::is_id_start(ch)); 20 | //! } 21 | //! ``` 22 | //! 23 | //! # features 24 | //! 25 | //! unicode-id supports a `no_std` feature. This eliminates dependence 26 | //! on std, and instead uses equivalent functions from core. 27 | //! 28 | 29 | #![forbid(unsafe_code)] 30 | #![deny(missing_docs)] 31 | #![doc( 32 | html_logo_url = "https://unicode-rs.github.io/unicode-rs_sm.png", 33 | html_favicon_url = "https://unicode-rs.github.io/unicode-rs_sm.png" 34 | )] 35 | #![no_std] 36 | #![cfg_attr(feature = "bench", feature(test, unicode_internals))] 37 | 38 | #[cfg(test)] 39 | #[macro_use] 40 | extern crate std; 41 | 42 | #[cfg(feature = "bench")] 43 | extern crate test; 44 | 45 | use tables::derived_property; 46 | pub use tables::UNICODE_VERSION; 47 | 48 | mod tables; 49 | 50 | #[cfg(test)] 51 | mod tests; 52 | 53 | /// Methods for determining if a character is a valid identifier character. 54 | pub trait UnicodeID { 55 | /// Returns whether the specified character satisfies the 'ID_Start' 56 | /// Unicode property. 57 | /// 58 | /// 'ID_Start' is a Unicode Derived Property specified in 59 | /// [UAX #31](http://unicode.org/reports/tr31/#NFKC_Modifications), 60 | /// mostly similar to ID_Start but modified for closure under NFKx. 61 | fn is_id_start(self) -> bool; 62 | 63 | /// Returns whether the specified `char` satisfies the 'ID_Continue' 64 | /// Unicode property. 65 | /// 66 | /// 'ID_Continue' is a Unicode Derived Property specified in 67 | /// [UAX #31](http://unicode.org/reports/tr31/#NFKC_Modifications), 68 | /// mostly similar to 'ID_Continue' but modified for closure under NFKx. 69 | fn is_id_continue(self) -> bool; 70 | } 71 | 72 | impl UnicodeID for char { 73 | #[inline] 74 | fn is_id_start(self) -> bool { 75 | // Fast-path for ascii idents 76 | ('a' <= self && self <= 'z') 77 | || ('A' <= self && self <= 'Z') 78 | || (self > '\x7f' && derived_property::ID_Start(self)) 79 | } 80 | 81 | #[inline] 82 | fn is_id_continue(self) -> bool { 83 | // Fast-path for ascii idents 84 | ('a' <= self && self <= 'z') 85 | || ('A' <= self && self <= 'Z') 86 | || ('0' <= self && self <= '9') 87 | || self == '_' 88 | || (self > '\x7f' && derived_property::ID_Continue(self)) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /scripts/unicode.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # Copyright 2011-2015 The Rust Project Developers. See the COPYRIGHT 4 | # file at the top-level directory of this distribution and at 5 | # http://rust-lang.org/COPYRIGHT. 6 | # 7 | # Licensed under the Apache License, Version 2.0 or the MIT license 9 | # , at your 10 | # option. This file may not be copied, modified, or distributed 11 | # except according to those terms. 12 | 13 | # This script uses the following Unicode tables: 14 | # - DerivedCoreProperties.txt 15 | # - ReadMe.txt 16 | # 17 | # Since this should not require frequent updates, we just store this 18 | # out-of-line and check the unicode.rs file into git. 19 | 20 | import fileinput, re, os, sys 21 | 22 | preamble = '''// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT 23 | // file at the top-level directory of this distribution and at 24 | // http://rust-lang.org/COPYRIGHT. 25 | // 26 | // Licensed under the Apache License, Version 2.0 or the MIT license 28 | // , at your 29 | // option. This file may not be copied, modified, or distributed 30 | // except according to those terms. 31 | 32 | // NOTE: The following code was generated by "scripts/unicode.py", do not edit directly 33 | 34 | #![allow(missing_docs, non_upper_case_globals, non_snake_case)] 35 | ''' 36 | 37 | def fetch(f): 38 | if not os.path.exists(os.path.basename(f)): 39 | os.system("curl -O http://www.unicode.org/Public/UNIDATA/%s" 40 | % f) 41 | 42 | if not os.path.exists(os.path.basename(f)): 43 | sys.stderr.write("cannot load %s" % f) 44 | exit(1) 45 | 46 | def group_cat(cat): 47 | cat_out = [] 48 | letters = sorted(set(cat)) 49 | cur_start = letters.pop(0) 50 | cur_end = cur_start 51 | for letter in letters: 52 | assert letter > cur_end, \ 53 | "cur_end: %s, letter: %s" % (hex(cur_end), hex(letter)) 54 | if letter == cur_end + 1: 55 | cur_end = letter 56 | else: 57 | cat_out.append((cur_start, cur_end)) 58 | cur_start = cur_end = letter 59 | cat_out.append((cur_start, cur_end)) 60 | return cat_out 61 | 62 | def ungroup_cat(cat): 63 | cat_out = [] 64 | for (lo, hi) in cat: 65 | while lo <= hi: 66 | cat_out.append(lo) 67 | lo += 1 68 | return cat_out 69 | 70 | def format_table_content(f, content, indent): 71 | line = " "*indent 72 | first = True 73 | for chunk in content.split(","): 74 | if len(line) + len(chunk) < 98: 75 | if first: 76 | line += chunk 77 | else: 78 | line += ", " + chunk 79 | first = False 80 | else: 81 | f.write(line + ",\n") 82 | line = " "*indent + chunk 83 | f.write(line) 84 | 85 | def load_properties(f, interestingprops): 86 | fetch(f) 87 | props = {} 88 | re1 = re.compile("^ *([0-9A-F]+) *; *(\w+)") 89 | re2 = re.compile("^ *([0-9A-F]+)\.\.([0-9A-F]+) *; *(\w+)") 90 | 91 | for line in fileinput.input(os.path.basename(f)): 92 | prop = None 93 | d_lo = 0 94 | d_hi = 0 95 | m = re1.match(line) 96 | if m: 97 | d_lo = m.group(1) 98 | d_hi = m.group(1) 99 | prop = m.group(2) 100 | else: 101 | m = re2.match(line) 102 | if m: 103 | d_lo = m.group(1) 104 | d_hi = m.group(2) 105 | prop = m.group(3) 106 | else: 107 | continue 108 | if interestingprops and prop not in interestingprops: 109 | continue 110 | d_lo = int(d_lo, 16) 111 | d_hi = int(d_hi, 16) 112 | if prop not in props: 113 | props[prop] = [] 114 | props[prop].append((d_lo, d_hi)) 115 | 116 | # optimize if possible 117 | for prop in props: 118 | props[prop] = group_cat(ungroup_cat(props[prop])) 119 | 120 | return props 121 | 122 | def escape_char(c): 123 | return "'\\u{%x}'" % c 124 | 125 | def emit_bsearch_range_table(f): 126 | f.write(""" 127 | fn bsearch_range_table(c: char, r: &[(char,char)]) -> bool { 128 | use core::cmp::Ordering::{Equal, Less, Greater}; 129 | 130 | r.binary_search_by(|&(lo,hi)| { 131 | // Because ASCII ranges are at the start of the tables, a search for an 132 | // ASCII char will involve more `Greater` results (i.e. the `(lo,hi)` 133 | // table entry is greater than `c`) than `Less` results. And given that 134 | // ASCII chars are so common, it makes sense to favor them. Therefore, 135 | // the `Greater` case is tested for before the `Less` case. 136 | if lo > c { Greater } 137 | else if hi < c { Less } 138 | else { Equal } 139 | }).is_ok() 140 | }\n 141 | """) 142 | 143 | def emit_table(f, name, t_data, t_type = "&[(char, char)]", is_static=True, 144 | pfun=lambda x: "(%s,%s)" % (escape_char(x[0]), escape_char(x[1])), is_const=True): 145 | pub_string = "const" 146 | if not is_const: 147 | pub_string = "let" 148 | if is_static: 149 | pub_string = "static" 150 | f.write(" %s %s: %s = &[\n" % (pub_string, name, t_type)) 151 | data = "" 152 | first = True 153 | for dat in t_data: 154 | if not first: 155 | data += "," 156 | first = False 157 | data += pfun(dat) 158 | format_table_content(f, data, 8) 159 | f.write("\n ];\n\n") 160 | 161 | def emit_property_module(f, mod, tbl, emit): 162 | f.write("pub mod %s {\n" % mod) 163 | for cat in sorted(emit): 164 | emit_table(f, "%s_table" % cat, tbl[cat]) 165 | f.write(" pub fn %s(c: char) -> bool {\n" % cat) 166 | f.write(" super::bsearch_range_table(c, %s_table)\n" % cat) 167 | f.write(" }\n\n") 168 | f.write("}\n\n") 169 | 170 | if __name__ == "__main__": 171 | r = "tables.rs" 172 | if os.path.exists(r): 173 | os.remove(r) 174 | with open(r, "w") as rf: 175 | # write the file's preamble 176 | rf.write(preamble) 177 | 178 | # download and parse all the data 179 | fetch("ReadMe.txt") 180 | with open("ReadMe.txt") as readme: 181 | pattern = "for Version (\d+)\.(\d+)\.(\d+) of the Unicode" 182 | unicode_version = re.search(pattern, readme.read()).groups() 183 | rf.write(""" 184 | /// The version of [Unicode](http://www.unicode.org/) 185 | /// that this version of unicode-id is based on. 186 | pub const UNICODE_VERSION: (u64, u64, u64) = (%s, %s, %s); 187 | """ % unicode_version) 188 | emit_bsearch_range_table(rf) 189 | 190 | want_derived = ["ID_Start", "ID_Continue"] 191 | derived = load_properties("DerivedCoreProperties.txt", want_derived) 192 | emit_property_module(rf, "derived_property", derived, want_derived) 193 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/tables.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT 2 | // file at the top-level directory of this distribution and at 3 | // http://rust-lang.org/COPYRIGHT. 4 | // 5 | // Licensed under the Apache License, Version 2.0 or the MIT license 7 | // , at your 8 | // option. This file may not be copied, modified, or distributed 9 | // except according to those terms. 10 | 11 | // NOTE: The following code was generated by "scripts/unicode.py", do not edit directly 12 | 13 | #![allow(missing_docs, non_upper_case_globals, non_snake_case)] 14 | 15 | /// The version of [Unicode](http://www.unicode.org/) 16 | /// that this version of unicode-id is based on. 17 | pub const UNICODE_VERSION: (u64, u64, u64) = (17, 0, 0); 18 | 19 | fn bsearch_range_table(c: char, r: &[(char,char)]) -> bool { 20 | use core::cmp::Ordering::{Equal, Less, Greater}; 21 | 22 | r.binary_search_by(|&(lo,hi)| { 23 | // Because ASCII ranges are at the start of the tables, a search for an 24 | // ASCII char will involve more `Greater` results (i.e. the `(lo,hi)` 25 | // table entry is greater than `c`) than `Less` results. And given that 26 | // ASCII chars are so common, it makes sense to favor them. Therefore, 27 | // the `Greater` case is tested for before the `Less` case. 28 | if lo > c { Greater } 29 | else if hi < c { Less } 30 | else { Equal } 31 | }).is_ok() 32 | } 33 | 34 | pub mod derived_property { 35 | static ID_Continue_table: &[(char, char)] = &[ 36 | ('\u{30}', '\u{39}'), ('\u{41}', '\u{5a}'), ('\u{5f}', '\u{5f}'), ('\u{61}', '\u{7a}'), 37 | ('\u{aa}', '\u{aa}'), ('\u{b5}', '\u{b5}'), ('\u{b7}', '\u{b7}'), ('\u{ba}', '\u{ba}'), 38 | ('\u{c0}', '\u{d6}'), ('\u{d8}', '\u{f6}'), ('\u{f8}', '\u{2c1}'), ('\u{2c6}', '\u{2d1}'), 39 | ('\u{2e0}', '\u{2e4}'), ('\u{2ec}', '\u{2ec}'), ('\u{2ee}', '\u{2ee}'), ('\u{300}', 40 | '\u{374}'), ('\u{376}', '\u{377}'), ('\u{37a}', '\u{37d}'), ('\u{37f}', '\u{37f}'), 41 | ('\u{386}', '\u{38a}'), ('\u{38c}', '\u{38c}'), ('\u{38e}', '\u{3a1}'), ('\u{3a3}', 42 | '\u{3f5}'), ('\u{3f7}', '\u{481}'), ('\u{483}', '\u{487}'), ('\u{48a}', '\u{52f}'), 43 | ('\u{531}', '\u{556}'), ('\u{559}', '\u{559}'), ('\u{560}', '\u{588}'), ('\u{591}', 44 | '\u{5bd}'), ('\u{5bf}', '\u{5bf}'), ('\u{5c1}', '\u{5c2}'), ('\u{5c4}', '\u{5c5}'), 45 | ('\u{5c7}', '\u{5c7}'), ('\u{5d0}', '\u{5ea}'), ('\u{5ef}', '\u{5f2}'), ('\u{610}', 46 | '\u{61a}'), ('\u{620}', '\u{669}'), ('\u{66e}', '\u{6d3}'), ('\u{6d5}', '\u{6dc}'), 47 | ('\u{6df}', '\u{6e8}'), ('\u{6ea}', '\u{6fc}'), ('\u{6ff}', '\u{6ff}'), ('\u{710}', 48 | '\u{74a}'), ('\u{74d}', '\u{7b1}'), ('\u{7c0}', '\u{7f5}'), ('\u{7fa}', '\u{7fa}'), 49 | ('\u{7fd}', '\u{7fd}'), ('\u{800}', '\u{82d}'), ('\u{840}', '\u{85b}'), ('\u{860}', 50 | '\u{86a}'), ('\u{870}', '\u{887}'), ('\u{889}', '\u{88f}'), ('\u{897}', '\u{8e1}'), 51 | ('\u{8e3}', '\u{963}'), ('\u{966}', '\u{96f}'), ('\u{971}', '\u{983}'), ('\u{985}', 52 | '\u{98c}'), ('\u{98f}', '\u{990}'), ('\u{993}', '\u{9a8}'), ('\u{9aa}', '\u{9b0}'), 53 | ('\u{9b2}', '\u{9b2}'), ('\u{9b6}', '\u{9b9}'), ('\u{9bc}', '\u{9c4}'), ('\u{9c7}', 54 | '\u{9c8}'), ('\u{9cb}', '\u{9ce}'), ('\u{9d7}', '\u{9d7}'), ('\u{9dc}', '\u{9dd}'), 55 | ('\u{9df}', '\u{9e3}'), ('\u{9e6}', '\u{9f1}'), ('\u{9fc}', '\u{9fc}'), ('\u{9fe}', 56 | '\u{9fe}'), ('\u{a01}', '\u{a03}'), ('\u{a05}', '\u{a0a}'), ('\u{a0f}', '\u{a10}'), 57 | ('\u{a13}', '\u{a28}'), ('\u{a2a}', '\u{a30}'), ('\u{a32}', '\u{a33}'), ('\u{a35}', 58 | '\u{a36}'), ('\u{a38}', '\u{a39}'), ('\u{a3c}', '\u{a3c}'), ('\u{a3e}', '\u{a42}'), 59 | ('\u{a47}', '\u{a48}'), ('\u{a4b}', '\u{a4d}'), ('\u{a51}', '\u{a51}'), ('\u{a59}', 60 | '\u{a5c}'), ('\u{a5e}', '\u{a5e}'), ('\u{a66}', '\u{a75}'), ('\u{a81}', '\u{a83}'), 61 | ('\u{a85}', '\u{a8d}'), ('\u{a8f}', '\u{a91}'), ('\u{a93}', '\u{aa8}'), ('\u{aaa}', 62 | '\u{ab0}'), ('\u{ab2}', '\u{ab3}'), ('\u{ab5}', '\u{ab9}'), ('\u{abc}', '\u{ac5}'), 63 | ('\u{ac7}', '\u{ac9}'), ('\u{acb}', '\u{acd}'), ('\u{ad0}', '\u{ad0}'), ('\u{ae0}', 64 | '\u{ae3}'), ('\u{ae6}', '\u{aef}'), ('\u{af9}', '\u{aff}'), ('\u{b01}', '\u{b03}'), 65 | ('\u{b05}', '\u{b0c}'), ('\u{b0f}', '\u{b10}'), ('\u{b13}', '\u{b28}'), ('\u{b2a}', 66 | '\u{b30}'), ('\u{b32}', '\u{b33}'), ('\u{b35}', '\u{b39}'), ('\u{b3c}', '\u{b44}'), 67 | ('\u{b47}', '\u{b48}'), ('\u{b4b}', '\u{b4d}'), ('\u{b55}', '\u{b57}'), ('\u{b5c}', 68 | '\u{b5d}'), ('\u{b5f}', '\u{b63}'), ('\u{b66}', '\u{b6f}'), ('\u{b71}', '\u{b71}'), 69 | ('\u{b82}', '\u{b83}'), ('\u{b85}', '\u{b8a}'), ('\u{b8e}', '\u{b90}'), ('\u{b92}', 70 | '\u{b95}'), ('\u{b99}', '\u{b9a}'), ('\u{b9c}', '\u{b9c}'), ('\u{b9e}', '\u{b9f}'), 71 | ('\u{ba3}', '\u{ba4}'), ('\u{ba8}', '\u{baa}'), ('\u{bae}', '\u{bb9}'), ('\u{bbe}', 72 | '\u{bc2}'), ('\u{bc6}', '\u{bc8}'), ('\u{bca}', '\u{bcd}'), ('\u{bd0}', '\u{bd0}'), 73 | ('\u{bd7}', '\u{bd7}'), ('\u{be6}', '\u{bef}'), ('\u{c00}', '\u{c0c}'), ('\u{c0e}', 74 | '\u{c10}'), ('\u{c12}', '\u{c28}'), ('\u{c2a}', '\u{c39}'), ('\u{c3c}', '\u{c44}'), 75 | ('\u{c46}', '\u{c48}'), ('\u{c4a}', '\u{c4d}'), ('\u{c55}', '\u{c56}'), ('\u{c58}', 76 | '\u{c5a}'), ('\u{c5c}', '\u{c5d}'), ('\u{c60}', '\u{c63}'), ('\u{c66}', '\u{c6f}'), 77 | ('\u{c80}', '\u{c83}'), ('\u{c85}', '\u{c8c}'), ('\u{c8e}', '\u{c90}'), ('\u{c92}', 78 | '\u{ca8}'), ('\u{caa}', '\u{cb3}'), ('\u{cb5}', '\u{cb9}'), ('\u{cbc}', '\u{cc4}'), 79 | ('\u{cc6}', '\u{cc8}'), ('\u{cca}', '\u{ccd}'), ('\u{cd5}', '\u{cd6}'), ('\u{cdc}', 80 | '\u{cde}'), ('\u{ce0}', '\u{ce3}'), ('\u{ce6}', '\u{cef}'), ('\u{cf1}', '\u{cf3}'), 81 | ('\u{d00}', '\u{d0c}'), ('\u{d0e}', '\u{d10}'), ('\u{d12}', '\u{d44}'), ('\u{d46}', 82 | '\u{d48}'), ('\u{d4a}', '\u{d4e}'), ('\u{d54}', '\u{d57}'), ('\u{d5f}', '\u{d63}'), 83 | ('\u{d66}', '\u{d6f}'), ('\u{d7a}', '\u{d7f}'), ('\u{d81}', '\u{d83}'), ('\u{d85}', 84 | '\u{d96}'), ('\u{d9a}', '\u{db1}'), ('\u{db3}', '\u{dbb}'), ('\u{dbd}', '\u{dbd}'), 85 | ('\u{dc0}', '\u{dc6}'), ('\u{dca}', '\u{dca}'), ('\u{dcf}', '\u{dd4}'), ('\u{dd6}', 86 | '\u{dd6}'), ('\u{dd8}', '\u{ddf}'), ('\u{de6}', '\u{def}'), ('\u{df2}', '\u{df3}'), 87 | ('\u{e01}', '\u{e3a}'), ('\u{e40}', '\u{e4e}'), ('\u{e50}', '\u{e59}'), ('\u{e81}', 88 | '\u{e82}'), ('\u{e84}', '\u{e84}'), ('\u{e86}', '\u{e8a}'), ('\u{e8c}', '\u{ea3}'), 89 | ('\u{ea5}', '\u{ea5}'), ('\u{ea7}', '\u{ebd}'), ('\u{ec0}', '\u{ec4}'), ('\u{ec6}', 90 | '\u{ec6}'), ('\u{ec8}', '\u{ece}'), ('\u{ed0}', '\u{ed9}'), ('\u{edc}', '\u{edf}'), 91 | ('\u{f00}', '\u{f00}'), ('\u{f18}', '\u{f19}'), ('\u{f20}', '\u{f29}'), ('\u{f35}', 92 | '\u{f35}'), ('\u{f37}', '\u{f37}'), ('\u{f39}', '\u{f39}'), ('\u{f3e}', '\u{f47}'), 93 | ('\u{f49}', '\u{f6c}'), ('\u{f71}', '\u{f84}'), ('\u{f86}', '\u{f97}'), ('\u{f99}', 94 | '\u{fbc}'), ('\u{fc6}', '\u{fc6}'), ('\u{1000}', '\u{1049}'), ('\u{1050}', '\u{109d}'), 95 | ('\u{10a0}', '\u{10c5}'), ('\u{10c7}', '\u{10c7}'), ('\u{10cd}', '\u{10cd}'), ('\u{10d0}', 96 | '\u{10fa}'), ('\u{10fc}', '\u{1248}'), ('\u{124a}', '\u{124d}'), ('\u{1250}', '\u{1256}'), 97 | ('\u{1258}', '\u{1258}'), ('\u{125a}', '\u{125d}'), ('\u{1260}', '\u{1288}'), ('\u{128a}', 98 | '\u{128d}'), ('\u{1290}', '\u{12b0}'), ('\u{12b2}', '\u{12b5}'), ('\u{12b8}', '\u{12be}'), 99 | ('\u{12c0}', '\u{12c0}'), ('\u{12c2}', '\u{12c5}'), ('\u{12c8}', '\u{12d6}'), ('\u{12d8}', 100 | '\u{1310}'), ('\u{1312}', '\u{1315}'), ('\u{1318}', '\u{135a}'), ('\u{135d}', '\u{135f}'), 101 | ('\u{1369}', '\u{1371}'), ('\u{1380}', '\u{138f}'), ('\u{13a0}', '\u{13f5}'), ('\u{13f8}', 102 | '\u{13fd}'), ('\u{1401}', '\u{166c}'), ('\u{166f}', '\u{167f}'), ('\u{1681}', '\u{169a}'), 103 | ('\u{16a0}', '\u{16ea}'), ('\u{16ee}', '\u{16f8}'), ('\u{1700}', '\u{1715}'), ('\u{171f}', 104 | '\u{1734}'), ('\u{1740}', '\u{1753}'), ('\u{1760}', '\u{176c}'), ('\u{176e}', '\u{1770}'), 105 | ('\u{1772}', '\u{1773}'), ('\u{1780}', '\u{17d3}'), ('\u{17d7}', '\u{17d7}'), ('\u{17dc}', 106 | '\u{17dd}'), ('\u{17e0}', '\u{17e9}'), ('\u{180b}', '\u{180d}'), ('\u{180f}', '\u{1819}'), 107 | ('\u{1820}', '\u{1878}'), ('\u{1880}', '\u{18aa}'), ('\u{18b0}', '\u{18f5}'), ('\u{1900}', 108 | '\u{191e}'), ('\u{1920}', '\u{192b}'), ('\u{1930}', '\u{193b}'), ('\u{1946}', '\u{196d}'), 109 | ('\u{1970}', '\u{1974}'), ('\u{1980}', '\u{19ab}'), ('\u{19b0}', '\u{19c9}'), ('\u{19d0}', 110 | '\u{19da}'), ('\u{1a00}', '\u{1a1b}'), ('\u{1a20}', '\u{1a5e}'), ('\u{1a60}', '\u{1a7c}'), 111 | ('\u{1a7f}', '\u{1a89}'), ('\u{1a90}', '\u{1a99}'), ('\u{1aa7}', '\u{1aa7}'), ('\u{1ab0}', 112 | '\u{1abd}'), ('\u{1abf}', '\u{1add}'), ('\u{1ae0}', '\u{1aeb}'), ('\u{1b00}', '\u{1b4c}'), 113 | ('\u{1b50}', '\u{1b59}'), ('\u{1b6b}', '\u{1b73}'), ('\u{1b80}', '\u{1bf3}'), ('\u{1c00}', 114 | '\u{1c37}'), ('\u{1c40}', '\u{1c49}'), ('\u{1c4d}', '\u{1c7d}'), ('\u{1c80}', '\u{1c8a}'), 115 | ('\u{1c90}', '\u{1cba}'), ('\u{1cbd}', '\u{1cbf}'), ('\u{1cd0}', '\u{1cd2}'), ('\u{1cd4}', 116 | '\u{1cfa}'), ('\u{1d00}', '\u{1f15}'), ('\u{1f18}', '\u{1f1d}'), ('\u{1f20}', '\u{1f45}'), 117 | ('\u{1f48}', '\u{1f4d}'), ('\u{1f50}', '\u{1f57}'), ('\u{1f59}', '\u{1f59}'), ('\u{1f5b}', 118 | '\u{1f5b}'), ('\u{1f5d}', '\u{1f5d}'), ('\u{1f5f}', '\u{1f7d}'), ('\u{1f80}', '\u{1fb4}'), 119 | ('\u{1fb6}', '\u{1fbc}'), ('\u{1fbe}', '\u{1fbe}'), ('\u{1fc2}', '\u{1fc4}'), ('\u{1fc6}', 120 | '\u{1fcc}'), ('\u{1fd0}', '\u{1fd3}'), ('\u{1fd6}', '\u{1fdb}'), ('\u{1fe0}', '\u{1fec}'), 121 | ('\u{1ff2}', '\u{1ff4}'), ('\u{1ff6}', '\u{1ffc}'), ('\u{200c}', '\u{200d}'), ('\u{203f}', 122 | '\u{2040}'), ('\u{2054}', '\u{2054}'), ('\u{2071}', '\u{2071}'), ('\u{207f}', '\u{207f}'), 123 | ('\u{2090}', '\u{209c}'), ('\u{20d0}', '\u{20dc}'), ('\u{20e1}', '\u{20e1}'), ('\u{20e5}', 124 | '\u{20f0}'), ('\u{2102}', '\u{2102}'), ('\u{2107}', '\u{2107}'), ('\u{210a}', '\u{2113}'), 125 | ('\u{2115}', '\u{2115}'), ('\u{2118}', '\u{211d}'), ('\u{2124}', '\u{2124}'), ('\u{2126}', 126 | '\u{2126}'), ('\u{2128}', '\u{2128}'), ('\u{212a}', '\u{2139}'), ('\u{213c}', '\u{213f}'), 127 | ('\u{2145}', '\u{2149}'), ('\u{214e}', '\u{214e}'), ('\u{2160}', '\u{2188}'), ('\u{2c00}', 128 | '\u{2ce4}'), ('\u{2ceb}', '\u{2cf3}'), ('\u{2d00}', '\u{2d25}'), ('\u{2d27}', '\u{2d27}'), 129 | ('\u{2d2d}', '\u{2d2d}'), ('\u{2d30}', '\u{2d67}'), ('\u{2d6f}', '\u{2d6f}'), ('\u{2d7f}', 130 | '\u{2d96}'), ('\u{2da0}', '\u{2da6}'), ('\u{2da8}', '\u{2dae}'), ('\u{2db0}', '\u{2db6}'), 131 | ('\u{2db8}', '\u{2dbe}'), ('\u{2dc0}', '\u{2dc6}'), ('\u{2dc8}', '\u{2dce}'), ('\u{2dd0}', 132 | '\u{2dd6}'), ('\u{2dd8}', '\u{2dde}'), ('\u{2de0}', '\u{2dff}'), ('\u{3005}', '\u{3007}'), 133 | ('\u{3021}', '\u{302f}'), ('\u{3031}', '\u{3035}'), ('\u{3038}', '\u{303c}'), ('\u{3041}', 134 | '\u{3096}'), ('\u{3099}', '\u{309f}'), ('\u{30a1}', '\u{30ff}'), ('\u{3105}', '\u{312f}'), 135 | ('\u{3131}', '\u{318e}'), ('\u{31a0}', '\u{31bf}'), ('\u{31f0}', '\u{31ff}'), ('\u{3400}', 136 | '\u{4dbf}'), ('\u{4e00}', '\u{a48c}'), ('\u{a4d0}', '\u{a4fd}'), ('\u{a500}', '\u{a60c}'), 137 | ('\u{a610}', '\u{a62b}'), ('\u{a640}', '\u{a66f}'), ('\u{a674}', '\u{a67d}'), ('\u{a67f}', 138 | '\u{a6f1}'), ('\u{a717}', '\u{a71f}'), ('\u{a722}', '\u{a788}'), ('\u{a78b}', '\u{a7dc}'), 139 | ('\u{a7f1}', '\u{a827}'), ('\u{a82c}', '\u{a82c}'), ('\u{a840}', '\u{a873}'), ('\u{a880}', 140 | '\u{a8c5}'), ('\u{a8d0}', '\u{a8d9}'), ('\u{a8e0}', '\u{a8f7}'), ('\u{a8fb}', '\u{a8fb}'), 141 | ('\u{a8fd}', '\u{a92d}'), ('\u{a930}', '\u{a953}'), ('\u{a960}', '\u{a97c}'), ('\u{a980}', 142 | '\u{a9c0}'), ('\u{a9cf}', '\u{a9d9}'), ('\u{a9e0}', '\u{a9fe}'), ('\u{aa00}', '\u{aa36}'), 143 | ('\u{aa40}', '\u{aa4d}'), ('\u{aa50}', '\u{aa59}'), ('\u{aa60}', '\u{aa76}'), ('\u{aa7a}', 144 | '\u{aac2}'), ('\u{aadb}', '\u{aadd}'), ('\u{aae0}', '\u{aaef}'), ('\u{aaf2}', '\u{aaf6}'), 145 | ('\u{ab01}', '\u{ab06}'), ('\u{ab09}', '\u{ab0e}'), ('\u{ab11}', '\u{ab16}'), ('\u{ab20}', 146 | '\u{ab26}'), ('\u{ab28}', '\u{ab2e}'), ('\u{ab30}', '\u{ab5a}'), ('\u{ab5c}', '\u{ab69}'), 147 | ('\u{ab70}', '\u{abea}'), ('\u{abec}', '\u{abed}'), ('\u{abf0}', '\u{abf9}'), ('\u{ac00}', 148 | '\u{d7a3}'), ('\u{d7b0}', '\u{d7c6}'), ('\u{d7cb}', '\u{d7fb}'), ('\u{f900}', '\u{fa6d}'), 149 | ('\u{fa70}', '\u{fad9}'), ('\u{fb00}', '\u{fb06}'), ('\u{fb13}', '\u{fb17}'), ('\u{fb1d}', 150 | '\u{fb28}'), ('\u{fb2a}', '\u{fb36}'), ('\u{fb38}', '\u{fb3c}'), ('\u{fb3e}', '\u{fb3e}'), 151 | ('\u{fb40}', '\u{fb41}'), ('\u{fb43}', '\u{fb44}'), ('\u{fb46}', '\u{fbb1}'), ('\u{fbd3}', 152 | '\u{fd3d}'), ('\u{fd50}', '\u{fd8f}'), ('\u{fd92}', '\u{fdc7}'), ('\u{fdf0}', '\u{fdfb}'), 153 | ('\u{fe00}', '\u{fe0f}'), ('\u{fe20}', '\u{fe2f}'), ('\u{fe33}', '\u{fe34}'), ('\u{fe4d}', 154 | '\u{fe4f}'), ('\u{fe70}', '\u{fe74}'), ('\u{fe76}', '\u{fefc}'), ('\u{ff10}', '\u{ff19}'), 155 | ('\u{ff21}', '\u{ff3a}'), ('\u{ff3f}', '\u{ff3f}'), ('\u{ff41}', '\u{ff5a}'), ('\u{ff65}', 156 | '\u{ffbe}'), ('\u{ffc2}', '\u{ffc7}'), ('\u{ffca}', '\u{ffcf}'), ('\u{ffd2}', '\u{ffd7}'), 157 | ('\u{ffda}', '\u{ffdc}'), ('\u{10000}', '\u{1000b}'), ('\u{1000d}', '\u{10026}'), 158 | ('\u{10028}', '\u{1003a}'), ('\u{1003c}', '\u{1003d}'), ('\u{1003f}', '\u{1004d}'), 159 | ('\u{10050}', '\u{1005d}'), ('\u{10080}', '\u{100fa}'), ('\u{10140}', '\u{10174}'), 160 | ('\u{101fd}', '\u{101fd}'), ('\u{10280}', '\u{1029c}'), ('\u{102a0}', '\u{102d0}'), 161 | ('\u{102e0}', '\u{102e0}'), ('\u{10300}', '\u{1031f}'), ('\u{1032d}', '\u{1034a}'), 162 | ('\u{10350}', '\u{1037a}'), ('\u{10380}', '\u{1039d}'), ('\u{103a0}', '\u{103c3}'), 163 | ('\u{103c8}', '\u{103cf}'), ('\u{103d1}', '\u{103d5}'), ('\u{10400}', '\u{1049d}'), 164 | ('\u{104a0}', '\u{104a9}'), ('\u{104b0}', '\u{104d3}'), ('\u{104d8}', '\u{104fb}'), 165 | ('\u{10500}', '\u{10527}'), ('\u{10530}', '\u{10563}'), ('\u{10570}', '\u{1057a}'), 166 | ('\u{1057c}', '\u{1058a}'), ('\u{1058c}', '\u{10592}'), ('\u{10594}', '\u{10595}'), 167 | ('\u{10597}', '\u{105a1}'), ('\u{105a3}', '\u{105b1}'), ('\u{105b3}', '\u{105b9}'), 168 | ('\u{105bb}', '\u{105bc}'), ('\u{105c0}', '\u{105f3}'), ('\u{10600}', '\u{10736}'), 169 | ('\u{10740}', '\u{10755}'), ('\u{10760}', '\u{10767}'), ('\u{10780}', '\u{10785}'), 170 | ('\u{10787}', '\u{107b0}'), ('\u{107b2}', '\u{107ba}'), ('\u{10800}', '\u{10805}'), 171 | ('\u{10808}', '\u{10808}'), ('\u{1080a}', '\u{10835}'), ('\u{10837}', '\u{10838}'), 172 | ('\u{1083c}', '\u{1083c}'), ('\u{1083f}', '\u{10855}'), ('\u{10860}', '\u{10876}'), 173 | ('\u{10880}', '\u{1089e}'), ('\u{108e0}', '\u{108f2}'), ('\u{108f4}', '\u{108f5}'), 174 | ('\u{10900}', '\u{10915}'), ('\u{10920}', '\u{10939}'), ('\u{10940}', '\u{10959}'), 175 | ('\u{10980}', '\u{109b7}'), ('\u{109be}', '\u{109bf}'), ('\u{10a00}', '\u{10a03}'), 176 | ('\u{10a05}', '\u{10a06}'), ('\u{10a0c}', '\u{10a13}'), ('\u{10a15}', '\u{10a17}'), 177 | ('\u{10a19}', '\u{10a35}'), ('\u{10a38}', '\u{10a3a}'), ('\u{10a3f}', '\u{10a3f}'), 178 | ('\u{10a60}', '\u{10a7c}'), ('\u{10a80}', '\u{10a9c}'), ('\u{10ac0}', '\u{10ac7}'), 179 | ('\u{10ac9}', '\u{10ae6}'), ('\u{10b00}', '\u{10b35}'), ('\u{10b40}', '\u{10b55}'), 180 | ('\u{10b60}', '\u{10b72}'), ('\u{10b80}', '\u{10b91}'), ('\u{10c00}', '\u{10c48}'), 181 | ('\u{10c80}', '\u{10cb2}'), ('\u{10cc0}', '\u{10cf2}'), ('\u{10d00}', '\u{10d27}'), 182 | ('\u{10d30}', '\u{10d39}'), ('\u{10d40}', '\u{10d65}'), ('\u{10d69}', '\u{10d6d}'), 183 | ('\u{10d6f}', '\u{10d85}'), ('\u{10e80}', '\u{10ea9}'), ('\u{10eab}', '\u{10eac}'), 184 | ('\u{10eb0}', '\u{10eb1}'), ('\u{10ec2}', '\u{10ec7}'), ('\u{10efa}', '\u{10f1c}'), 185 | ('\u{10f27}', '\u{10f27}'), ('\u{10f30}', '\u{10f50}'), ('\u{10f70}', '\u{10f85}'), 186 | ('\u{10fb0}', '\u{10fc4}'), ('\u{10fe0}', '\u{10ff6}'), ('\u{11000}', '\u{11046}'), 187 | ('\u{11066}', '\u{11075}'), ('\u{1107f}', '\u{110ba}'), ('\u{110c2}', '\u{110c2}'), 188 | ('\u{110d0}', '\u{110e8}'), ('\u{110f0}', '\u{110f9}'), ('\u{11100}', '\u{11134}'), 189 | ('\u{11136}', '\u{1113f}'), ('\u{11144}', '\u{11147}'), ('\u{11150}', '\u{11173}'), 190 | ('\u{11176}', '\u{11176}'), ('\u{11180}', '\u{111c4}'), ('\u{111c9}', '\u{111cc}'), 191 | ('\u{111ce}', '\u{111da}'), ('\u{111dc}', '\u{111dc}'), ('\u{11200}', '\u{11211}'), 192 | ('\u{11213}', '\u{11237}'), ('\u{1123e}', '\u{11241}'), ('\u{11280}', '\u{11286}'), 193 | ('\u{11288}', '\u{11288}'), ('\u{1128a}', '\u{1128d}'), ('\u{1128f}', '\u{1129d}'), 194 | ('\u{1129f}', '\u{112a8}'), ('\u{112b0}', '\u{112ea}'), ('\u{112f0}', '\u{112f9}'), 195 | ('\u{11300}', '\u{11303}'), ('\u{11305}', '\u{1130c}'), ('\u{1130f}', '\u{11310}'), 196 | ('\u{11313}', '\u{11328}'), ('\u{1132a}', '\u{11330}'), ('\u{11332}', '\u{11333}'), 197 | ('\u{11335}', '\u{11339}'), ('\u{1133b}', '\u{11344}'), ('\u{11347}', '\u{11348}'), 198 | ('\u{1134b}', '\u{1134d}'), ('\u{11350}', '\u{11350}'), ('\u{11357}', '\u{11357}'), 199 | ('\u{1135d}', '\u{11363}'), ('\u{11366}', '\u{1136c}'), ('\u{11370}', '\u{11374}'), 200 | ('\u{11380}', '\u{11389}'), ('\u{1138b}', '\u{1138b}'), ('\u{1138e}', '\u{1138e}'), 201 | ('\u{11390}', '\u{113b5}'), ('\u{113b7}', '\u{113c0}'), ('\u{113c2}', '\u{113c2}'), 202 | ('\u{113c5}', '\u{113c5}'), ('\u{113c7}', '\u{113ca}'), ('\u{113cc}', '\u{113d3}'), 203 | ('\u{113e1}', '\u{113e2}'), ('\u{11400}', '\u{1144a}'), ('\u{11450}', '\u{11459}'), 204 | ('\u{1145e}', '\u{11461}'), ('\u{11480}', '\u{114c5}'), ('\u{114c7}', '\u{114c7}'), 205 | ('\u{114d0}', '\u{114d9}'), ('\u{11580}', '\u{115b5}'), ('\u{115b8}', '\u{115c0}'), 206 | ('\u{115d8}', '\u{115dd}'), ('\u{11600}', '\u{11640}'), ('\u{11644}', '\u{11644}'), 207 | ('\u{11650}', '\u{11659}'), ('\u{11680}', '\u{116b8}'), ('\u{116c0}', '\u{116c9}'), 208 | ('\u{116d0}', '\u{116e3}'), ('\u{11700}', '\u{1171a}'), ('\u{1171d}', '\u{1172b}'), 209 | ('\u{11730}', '\u{11739}'), ('\u{11740}', '\u{11746}'), ('\u{11800}', '\u{1183a}'), 210 | ('\u{118a0}', '\u{118e9}'), ('\u{118ff}', '\u{11906}'), ('\u{11909}', '\u{11909}'), 211 | ('\u{1190c}', '\u{11913}'), ('\u{11915}', '\u{11916}'), ('\u{11918}', '\u{11935}'), 212 | ('\u{11937}', '\u{11938}'), ('\u{1193b}', '\u{11943}'), ('\u{11950}', '\u{11959}'), 213 | ('\u{119a0}', '\u{119a7}'), ('\u{119aa}', '\u{119d7}'), ('\u{119da}', '\u{119e1}'), 214 | ('\u{119e3}', '\u{119e4}'), ('\u{11a00}', '\u{11a3e}'), ('\u{11a47}', '\u{11a47}'), 215 | ('\u{11a50}', '\u{11a99}'), ('\u{11a9d}', '\u{11a9d}'), ('\u{11ab0}', '\u{11af8}'), 216 | ('\u{11b60}', '\u{11b67}'), ('\u{11bc0}', '\u{11be0}'), ('\u{11bf0}', '\u{11bf9}'), 217 | ('\u{11c00}', '\u{11c08}'), ('\u{11c0a}', '\u{11c36}'), ('\u{11c38}', '\u{11c40}'), 218 | ('\u{11c50}', '\u{11c59}'), ('\u{11c72}', '\u{11c8f}'), ('\u{11c92}', '\u{11ca7}'), 219 | ('\u{11ca9}', '\u{11cb6}'), ('\u{11d00}', '\u{11d06}'), ('\u{11d08}', '\u{11d09}'), 220 | ('\u{11d0b}', '\u{11d36}'), ('\u{11d3a}', '\u{11d3a}'), ('\u{11d3c}', '\u{11d3d}'), 221 | ('\u{11d3f}', '\u{11d47}'), ('\u{11d50}', '\u{11d59}'), ('\u{11d60}', '\u{11d65}'), 222 | ('\u{11d67}', '\u{11d68}'), ('\u{11d6a}', '\u{11d8e}'), ('\u{11d90}', '\u{11d91}'), 223 | ('\u{11d93}', '\u{11d98}'), ('\u{11da0}', '\u{11da9}'), ('\u{11db0}', '\u{11ddb}'), 224 | ('\u{11de0}', '\u{11de9}'), ('\u{11ee0}', '\u{11ef6}'), ('\u{11f00}', '\u{11f10}'), 225 | ('\u{11f12}', '\u{11f3a}'), ('\u{11f3e}', '\u{11f42}'), ('\u{11f50}', '\u{11f5a}'), 226 | ('\u{11fb0}', '\u{11fb0}'), ('\u{12000}', '\u{12399}'), ('\u{12400}', '\u{1246e}'), 227 | ('\u{12480}', '\u{12543}'), ('\u{12f90}', '\u{12ff0}'), ('\u{13000}', '\u{1342f}'), 228 | ('\u{13440}', '\u{13455}'), ('\u{13460}', '\u{143fa}'), ('\u{14400}', '\u{14646}'), 229 | ('\u{16100}', '\u{16139}'), ('\u{16800}', '\u{16a38}'), ('\u{16a40}', '\u{16a5e}'), 230 | ('\u{16a60}', '\u{16a69}'), ('\u{16a70}', '\u{16abe}'), ('\u{16ac0}', '\u{16ac9}'), 231 | ('\u{16ad0}', '\u{16aed}'), ('\u{16af0}', '\u{16af4}'), ('\u{16b00}', '\u{16b36}'), 232 | ('\u{16b40}', '\u{16b43}'), ('\u{16b50}', '\u{16b59}'), ('\u{16b63}', '\u{16b77}'), 233 | ('\u{16b7d}', '\u{16b8f}'), ('\u{16d40}', '\u{16d6c}'), ('\u{16d70}', '\u{16d79}'), 234 | ('\u{16e40}', '\u{16e7f}'), ('\u{16ea0}', '\u{16eb8}'), ('\u{16ebb}', '\u{16ed3}'), 235 | ('\u{16f00}', '\u{16f4a}'), ('\u{16f4f}', '\u{16f87}'), ('\u{16f8f}', '\u{16f9f}'), 236 | ('\u{16fe0}', '\u{16fe1}'), ('\u{16fe3}', '\u{16fe4}'), ('\u{16ff0}', '\u{16ff6}'), 237 | ('\u{17000}', '\u{18cd5}'), ('\u{18cff}', '\u{18d1e}'), ('\u{18d80}', '\u{18df2}'), 238 | ('\u{1aff0}', '\u{1aff3}'), ('\u{1aff5}', '\u{1affb}'), ('\u{1affd}', '\u{1affe}'), 239 | ('\u{1b000}', '\u{1b122}'), ('\u{1b132}', '\u{1b132}'), ('\u{1b150}', '\u{1b152}'), 240 | ('\u{1b155}', '\u{1b155}'), ('\u{1b164}', '\u{1b167}'), ('\u{1b170}', '\u{1b2fb}'), 241 | ('\u{1bc00}', '\u{1bc6a}'), ('\u{1bc70}', '\u{1bc7c}'), ('\u{1bc80}', '\u{1bc88}'), 242 | ('\u{1bc90}', '\u{1bc99}'), ('\u{1bc9d}', '\u{1bc9e}'), ('\u{1ccf0}', '\u{1ccf9}'), 243 | ('\u{1cf00}', '\u{1cf2d}'), ('\u{1cf30}', '\u{1cf46}'), ('\u{1d165}', '\u{1d169}'), 244 | ('\u{1d16d}', '\u{1d172}'), ('\u{1d17b}', '\u{1d182}'), ('\u{1d185}', '\u{1d18b}'), 245 | ('\u{1d1aa}', '\u{1d1ad}'), ('\u{1d242}', '\u{1d244}'), ('\u{1d400}', '\u{1d454}'), 246 | ('\u{1d456}', '\u{1d49c}'), ('\u{1d49e}', '\u{1d49f}'), ('\u{1d4a2}', '\u{1d4a2}'), 247 | ('\u{1d4a5}', '\u{1d4a6}'), ('\u{1d4a9}', '\u{1d4ac}'), ('\u{1d4ae}', '\u{1d4b9}'), 248 | ('\u{1d4bb}', '\u{1d4bb}'), ('\u{1d4bd}', '\u{1d4c3}'), ('\u{1d4c5}', '\u{1d505}'), 249 | ('\u{1d507}', '\u{1d50a}'), ('\u{1d50d}', '\u{1d514}'), ('\u{1d516}', '\u{1d51c}'), 250 | ('\u{1d51e}', '\u{1d539}'), ('\u{1d53b}', '\u{1d53e}'), ('\u{1d540}', '\u{1d544}'), 251 | ('\u{1d546}', '\u{1d546}'), ('\u{1d54a}', '\u{1d550}'), ('\u{1d552}', '\u{1d6a5}'), 252 | ('\u{1d6a8}', '\u{1d6c0}'), ('\u{1d6c2}', '\u{1d6da}'), ('\u{1d6dc}', '\u{1d6fa}'), 253 | ('\u{1d6fc}', '\u{1d714}'), ('\u{1d716}', '\u{1d734}'), ('\u{1d736}', '\u{1d74e}'), 254 | ('\u{1d750}', '\u{1d76e}'), ('\u{1d770}', '\u{1d788}'), ('\u{1d78a}', '\u{1d7a8}'), 255 | ('\u{1d7aa}', '\u{1d7c2}'), ('\u{1d7c4}', '\u{1d7cb}'), ('\u{1d7ce}', '\u{1d7ff}'), 256 | ('\u{1da00}', '\u{1da36}'), ('\u{1da3b}', '\u{1da6c}'), ('\u{1da75}', '\u{1da75}'), 257 | ('\u{1da84}', '\u{1da84}'), ('\u{1da9b}', '\u{1da9f}'), ('\u{1daa1}', '\u{1daaf}'), 258 | ('\u{1df00}', '\u{1df1e}'), ('\u{1df25}', '\u{1df2a}'), ('\u{1e000}', '\u{1e006}'), 259 | ('\u{1e008}', '\u{1e018}'), ('\u{1e01b}', '\u{1e021}'), ('\u{1e023}', '\u{1e024}'), 260 | ('\u{1e026}', '\u{1e02a}'), ('\u{1e030}', '\u{1e06d}'), ('\u{1e08f}', '\u{1e08f}'), 261 | ('\u{1e100}', '\u{1e12c}'), ('\u{1e130}', '\u{1e13d}'), ('\u{1e140}', '\u{1e149}'), 262 | ('\u{1e14e}', '\u{1e14e}'), ('\u{1e290}', '\u{1e2ae}'), ('\u{1e2c0}', '\u{1e2f9}'), 263 | ('\u{1e4d0}', '\u{1e4f9}'), ('\u{1e5d0}', '\u{1e5fa}'), ('\u{1e6c0}', '\u{1e6de}'), 264 | ('\u{1e6e0}', '\u{1e6f5}'), ('\u{1e6fe}', '\u{1e6ff}'), ('\u{1e7e0}', '\u{1e7e6}'), 265 | ('\u{1e7e8}', '\u{1e7eb}'), ('\u{1e7ed}', '\u{1e7ee}'), ('\u{1e7f0}', '\u{1e7fe}'), 266 | ('\u{1e800}', '\u{1e8c4}'), ('\u{1e8d0}', '\u{1e8d6}'), ('\u{1e900}', '\u{1e94b}'), 267 | ('\u{1e950}', '\u{1e959}'), ('\u{1ee00}', '\u{1ee03}'), ('\u{1ee05}', '\u{1ee1f}'), 268 | ('\u{1ee21}', '\u{1ee22}'), ('\u{1ee24}', '\u{1ee24}'), ('\u{1ee27}', '\u{1ee27}'), 269 | ('\u{1ee29}', '\u{1ee32}'), ('\u{1ee34}', '\u{1ee37}'), ('\u{1ee39}', '\u{1ee39}'), 270 | ('\u{1ee3b}', '\u{1ee3b}'), ('\u{1ee42}', '\u{1ee42}'), ('\u{1ee47}', '\u{1ee47}'), 271 | ('\u{1ee49}', '\u{1ee49}'), ('\u{1ee4b}', '\u{1ee4b}'), ('\u{1ee4d}', '\u{1ee4f}'), 272 | ('\u{1ee51}', '\u{1ee52}'), ('\u{1ee54}', '\u{1ee54}'), ('\u{1ee57}', '\u{1ee57}'), 273 | ('\u{1ee59}', '\u{1ee59}'), ('\u{1ee5b}', '\u{1ee5b}'), ('\u{1ee5d}', '\u{1ee5d}'), 274 | ('\u{1ee5f}', '\u{1ee5f}'), ('\u{1ee61}', '\u{1ee62}'), ('\u{1ee64}', '\u{1ee64}'), 275 | ('\u{1ee67}', '\u{1ee6a}'), ('\u{1ee6c}', '\u{1ee72}'), ('\u{1ee74}', '\u{1ee77}'), 276 | ('\u{1ee79}', '\u{1ee7c}'), ('\u{1ee7e}', '\u{1ee7e}'), ('\u{1ee80}', '\u{1ee89}'), 277 | ('\u{1ee8b}', '\u{1ee9b}'), ('\u{1eea1}', '\u{1eea3}'), ('\u{1eea5}', '\u{1eea9}'), 278 | ('\u{1eeab}', '\u{1eebb}'), ('\u{1fbf0}', '\u{1fbf9}'), ('\u{20000}', '\u{2a6df}'), 279 | ('\u{2a700}', '\u{2b81d}'), ('\u{2b820}', '\u{2cead}'), ('\u{2ceb0}', '\u{2ebe0}'), 280 | ('\u{2ebf0}', '\u{2ee5d}'), ('\u{2f800}', '\u{2fa1d}'), ('\u{30000}', '\u{3134a}'), 281 | ('\u{31350}', '\u{33479}'), ('\u{e0100}', '\u{e01ef}') 282 | ]; 283 | 284 | pub fn ID_Continue(c: char) -> bool { 285 | super::bsearch_range_table(c, ID_Continue_table) 286 | } 287 | 288 | static ID_Start_table: &[(char, char)] = &[ 289 | ('\u{41}', '\u{5a}'), ('\u{61}', '\u{7a}'), ('\u{aa}', '\u{aa}'), ('\u{b5}', '\u{b5}'), 290 | ('\u{ba}', '\u{ba}'), ('\u{c0}', '\u{d6}'), ('\u{d8}', '\u{f6}'), ('\u{f8}', '\u{2c1}'), 291 | ('\u{2c6}', '\u{2d1}'), ('\u{2e0}', '\u{2e4}'), ('\u{2ec}', '\u{2ec}'), ('\u{2ee}', 292 | '\u{2ee}'), ('\u{370}', '\u{374}'), ('\u{376}', '\u{377}'), ('\u{37a}', '\u{37d}'), 293 | ('\u{37f}', '\u{37f}'), ('\u{386}', '\u{386}'), ('\u{388}', '\u{38a}'), ('\u{38c}', 294 | '\u{38c}'), ('\u{38e}', '\u{3a1}'), ('\u{3a3}', '\u{3f5}'), ('\u{3f7}', '\u{481}'), 295 | ('\u{48a}', '\u{52f}'), ('\u{531}', '\u{556}'), ('\u{559}', '\u{559}'), ('\u{560}', 296 | '\u{588}'), ('\u{5d0}', '\u{5ea}'), ('\u{5ef}', '\u{5f2}'), ('\u{620}', '\u{64a}'), 297 | ('\u{66e}', '\u{66f}'), ('\u{671}', '\u{6d3}'), ('\u{6d5}', '\u{6d5}'), ('\u{6e5}', 298 | '\u{6e6}'), ('\u{6ee}', '\u{6ef}'), ('\u{6fa}', '\u{6fc}'), ('\u{6ff}', '\u{6ff}'), 299 | ('\u{710}', '\u{710}'), ('\u{712}', '\u{72f}'), ('\u{74d}', '\u{7a5}'), ('\u{7b1}', 300 | '\u{7b1}'), ('\u{7ca}', '\u{7ea}'), ('\u{7f4}', '\u{7f5}'), ('\u{7fa}', '\u{7fa}'), 301 | ('\u{800}', '\u{815}'), ('\u{81a}', '\u{81a}'), ('\u{824}', '\u{824}'), ('\u{828}', 302 | '\u{828}'), ('\u{840}', '\u{858}'), ('\u{860}', '\u{86a}'), ('\u{870}', '\u{887}'), 303 | ('\u{889}', '\u{88f}'), ('\u{8a0}', '\u{8c9}'), ('\u{904}', '\u{939}'), ('\u{93d}', 304 | '\u{93d}'), ('\u{950}', '\u{950}'), ('\u{958}', '\u{961}'), ('\u{971}', '\u{980}'), 305 | ('\u{985}', '\u{98c}'), ('\u{98f}', '\u{990}'), ('\u{993}', '\u{9a8}'), ('\u{9aa}', 306 | '\u{9b0}'), ('\u{9b2}', '\u{9b2}'), ('\u{9b6}', '\u{9b9}'), ('\u{9bd}', '\u{9bd}'), 307 | ('\u{9ce}', '\u{9ce}'), ('\u{9dc}', '\u{9dd}'), ('\u{9df}', '\u{9e1}'), ('\u{9f0}', 308 | '\u{9f1}'), ('\u{9fc}', '\u{9fc}'), ('\u{a05}', '\u{a0a}'), ('\u{a0f}', '\u{a10}'), 309 | ('\u{a13}', '\u{a28}'), ('\u{a2a}', '\u{a30}'), ('\u{a32}', '\u{a33}'), ('\u{a35}', 310 | '\u{a36}'), ('\u{a38}', '\u{a39}'), ('\u{a59}', '\u{a5c}'), ('\u{a5e}', '\u{a5e}'), 311 | ('\u{a72}', '\u{a74}'), ('\u{a85}', '\u{a8d}'), ('\u{a8f}', '\u{a91}'), ('\u{a93}', 312 | '\u{aa8}'), ('\u{aaa}', '\u{ab0}'), ('\u{ab2}', '\u{ab3}'), ('\u{ab5}', '\u{ab9}'), 313 | ('\u{abd}', '\u{abd}'), ('\u{ad0}', '\u{ad0}'), ('\u{ae0}', '\u{ae1}'), ('\u{af9}', 314 | '\u{af9}'), ('\u{b05}', '\u{b0c}'), ('\u{b0f}', '\u{b10}'), ('\u{b13}', '\u{b28}'), 315 | ('\u{b2a}', '\u{b30}'), ('\u{b32}', '\u{b33}'), ('\u{b35}', '\u{b39}'), ('\u{b3d}', 316 | '\u{b3d}'), ('\u{b5c}', '\u{b5d}'), ('\u{b5f}', '\u{b61}'), ('\u{b71}', '\u{b71}'), 317 | ('\u{b83}', '\u{b83}'), ('\u{b85}', '\u{b8a}'), ('\u{b8e}', '\u{b90}'), ('\u{b92}', 318 | '\u{b95}'), ('\u{b99}', '\u{b9a}'), ('\u{b9c}', '\u{b9c}'), ('\u{b9e}', '\u{b9f}'), 319 | ('\u{ba3}', '\u{ba4}'), ('\u{ba8}', '\u{baa}'), ('\u{bae}', '\u{bb9}'), ('\u{bd0}', 320 | '\u{bd0}'), ('\u{c05}', '\u{c0c}'), ('\u{c0e}', '\u{c10}'), ('\u{c12}', '\u{c28}'), 321 | ('\u{c2a}', '\u{c39}'), ('\u{c3d}', '\u{c3d}'), ('\u{c58}', '\u{c5a}'), ('\u{c5c}', 322 | '\u{c5d}'), ('\u{c60}', '\u{c61}'), ('\u{c80}', '\u{c80}'), ('\u{c85}', '\u{c8c}'), 323 | ('\u{c8e}', '\u{c90}'), ('\u{c92}', '\u{ca8}'), ('\u{caa}', '\u{cb3}'), ('\u{cb5}', 324 | '\u{cb9}'), ('\u{cbd}', '\u{cbd}'), ('\u{cdc}', '\u{cde}'), ('\u{ce0}', '\u{ce1}'), 325 | ('\u{cf1}', '\u{cf2}'), ('\u{d04}', '\u{d0c}'), ('\u{d0e}', '\u{d10}'), ('\u{d12}', 326 | '\u{d3a}'), ('\u{d3d}', '\u{d3d}'), ('\u{d4e}', '\u{d4e}'), ('\u{d54}', '\u{d56}'), 327 | ('\u{d5f}', '\u{d61}'), ('\u{d7a}', '\u{d7f}'), ('\u{d85}', '\u{d96}'), ('\u{d9a}', 328 | '\u{db1}'), ('\u{db3}', '\u{dbb}'), ('\u{dbd}', '\u{dbd}'), ('\u{dc0}', '\u{dc6}'), 329 | ('\u{e01}', '\u{e30}'), ('\u{e32}', '\u{e33}'), ('\u{e40}', '\u{e46}'), ('\u{e81}', 330 | '\u{e82}'), ('\u{e84}', '\u{e84}'), ('\u{e86}', '\u{e8a}'), ('\u{e8c}', '\u{ea3}'), 331 | ('\u{ea5}', '\u{ea5}'), ('\u{ea7}', '\u{eb0}'), ('\u{eb2}', '\u{eb3}'), ('\u{ebd}', 332 | '\u{ebd}'), ('\u{ec0}', '\u{ec4}'), ('\u{ec6}', '\u{ec6}'), ('\u{edc}', '\u{edf}'), 333 | ('\u{f00}', '\u{f00}'), ('\u{f40}', '\u{f47}'), ('\u{f49}', '\u{f6c}'), ('\u{f88}', 334 | '\u{f8c}'), ('\u{1000}', '\u{102a}'), ('\u{103f}', '\u{103f}'), ('\u{1050}', '\u{1055}'), 335 | ('\u{105a}', '\u{105d}'), ('\u{1061}', '\u{1061}'), ('\u{1065}', '\u{1066}'), ('\u{106e}', 336 | '\u{1070}'), ('\u{1075}', '\u{1081}'), ('\u{108e}', '\u{108e}'), ('\u{10a0}', '\u{10c5}'), 337 | ('\u{10c7}', '\u{10c7}'), ('\u{10cd}', '\u{10cd}'), ('\u{10d0}', '\u{10fa}'), ('\u{10fc}', 338 | '\u{1248}'), ('\u{124a}', '\u{124d}'), ('\u{1250}', '\u{1256}'), ('\u{1258}', '\u{1258}'), 339 | ('\u{125a}', '\u{125d}'), ('\u{1260}', '\u{1288}'), ('\u{128a}', '\u{128d}'), ('\u{1290}', 340 | '\u{12b0}'), ('\u{12b2}', '\u{12b5}'), ('\u{12b8}', '\u{12be}'), ('\u{12c0}', '\u{12c0}'), 341 | ('\u{12c2}', '\u{12c5}'), ('\u{12c8}', '\u{12d6}'), ('\u{12d8}', '\u{1310}'), ('\u{1312}', 342 | '\u{1315}'), ('\u{1318}', '\u{135a}'), ('\u{1380}', '\u{138f}'), ('\u{13a0}', '\u{13f5}'), 343 | ('\u{13f8}', '\u{13fd}'), ('\u{1401}', '\u{166c}'), ('\u{166f}', '\u{167f}'), ('\u{1681}', 344 | '\u{169a}'), ('\u{16a0}', '\u{16ea}'), ('\u{16ee}', '\u{16f8}'), ('\u{1700}', '\u{1711}'), 345 | ('\u{171f}', '\u{1731}'), ('\u{1740}', '\u{1751}'), ('\u{1760}', '\u{176c}'), ('\u{176e}', 346 | '\u{1770}'), ('\u{1780}', '\u{17b3}'), ('\u{17d7}', '\u{17d7}'), ('\u{17dc}', '\u{17dc}'), 347 | ('\u{1820}', '\u{1878}'), ('\u{1880}', '\u{18a8}'), ('\u{18aa}', '\u{18aa}'), ('\u{18b0}', 348 | '\u{18f5}'), ('\u{1900}', '\u{191e}'), ('\u{1950}', '\u{196d}'), ('\u{1970}', '\u{1974}'), 349 | ('\u{1980}', '\u{19ab}'), ('\u{19b0}', '\u{19c9}'), ('\u{1a00}', '\u{1a16}'), ('\u{1a20}', 350 | '\u{1a54}'), ('\u{1aa7}', '\u{1aa7}'), ('\u{1b05}', '\u{1b33}'), ('\u{1b45}', '\u{1b4c}'), 351 | ('\u{1b83}', '\u{1ba0}'), ('\u{1bae}', '\u{1baf}'), ('\u{1bba}', '\u{1be5}'), ('\u{1c00}', 352 | '\u{1c23}'), ('\u{1c4d}', '\u{1c4f}'), ('\u{1c5a}', '\u{1c7d}'), ('\u{1c80}', '\u{1c8a}'), 353 | ('\u{1c90}', '\u{1cba}'), ('\u{1cbd}', '\u{1cbf}'), ('\u{1ce9}', '\u{1cec}'), ('\u{1cee}', 354 | '\u{1cf3}'), ('\u{1cf5}', '\u{1cf6}'), ('\u{1cfa}', '\u{1cfa}'), ('\u{1d00}', '\u{1dbf}'), 355 | ('\u{1e00}', '\u{1f15}'), ('\u{1f18}', '\u{1f1d}'), ('\u{1f20}', '\u{1f45}'), ('\u{1f48}', 356 | '\u{1f4d}'), ('\u{1f50}', '\u{1f57}'), ('\u{1f59}', '\u{1f59}'), ('\u{1f5b}', '\u{1f5b}'), 357 | ('\u{1f5d}', '\u{1f5d}'), ('\u{1f5f}', '\u{1f7d}'), ('\u{1f80}', '\u{1fb4}'), ('\u{1fb6}', 358 | '\u{1fbc}'), ('\u{1fbe}', '\u{1fbe}'), ('\u{1fc2}', '\u{1fc4}'), ('\u{1fc6}', '\u{1fcc}'), 359 | ('\u{1fd0}', '\u{1fd3}'), ('\u{1fd6}', '\u{1fdb}'), ('\u{1fe0}', '\u{1fec}'), ('\u{1ff2}', 360 | '\u{1ff4}'), ('\u{1ff6}', '\u{1ffc}'), ('\u{2071}', '\u{2071}'), ('\u{207f}', '\u{207f}'), 361 | ('\u{2090}', '\u{209c}'), ('\u{2102}', '\u{2102}'), ('\u{2107}', '\u{2107}'), ('\u{210a}', 362 | '\u{2113}'), ('\u{2115}', '\u{2115}'), ('\u{2118}', '\u{211d}'), ('\u{2124}', '\u{2124}'), 363 | ('\u{2126}', '\u{2126}'), ('\u{2128}', '\u{2128}'), ('\u{212a}', '\u{2139}'), ('\u{213c}', 364 | '\u{213f}'), ('\u{2145}', '\u{2149}'), ('\u{214e}', '\u{214e}'), ('\u{2160}', '\u{2188}'), 365 | ('\u{2c00}', '\u{2ce4}'), ('\u{2ceb}', '\u{2cee}'), ('\u{2cf2}', '\u{2cf3}'), ('\u{2d00}', 366 | '\u{2d25}'), ('\u{2d27}', '\u{2d27}'), ('\u{2d2d}', '\u{2d2d}'), ('\u{2d30}', '\u{2d67}'), 367 | ('\u{2d6f}', '\u{2d6f}'), ('\u{2d80}', '\u{2d96}'), ('\u{2da0}', '\u{2da6}'), ('\u{2da8}', 368 | '\u{2dae}'), ('\u{2db0}', '\u{2db6}'), ('\u{2db8}', '\u{2dbe}'), ('\u{2dc0}', '\u{2dc6}'), 369 | ('\u{2dc8}', '\u{2dce}'), ('\u{2dd0}', '\u{2dd6}'), ('\u{2dd8}', '\u{2dde}'), ('\u{3005}', 370 | '\u{3007}'), ('\u{3021}', '\u{3029}'), ('\u{3031}', '\u{3035}'), ('\u{3038}', '\u{303c}'), 371 | ('\u{3041}', '\u{3096}'), ('\u{309b}', '\u{309f}'), ('\u{30a1}', '\u{30fa}'), ('\u{30fc}', 372 | '\u{30ff}'), ('\u{3105}', '\u{312f}'), ('\u{3131}', '\u{318e}'), ('\u{31a0}', '\u{31bf}'), 373 | ('\u{31f0}', '\u{31ff}'), ('\u{3400}', '\u{4dbf}'), ('\u{4e00}', '\u{a48c}'), ('\u{a4d0}', 374 | '\u{a4fd}'), ('\u{a500}', '\u{a60c}'), ('\u{a610}', '\u{a61f}'), ('\u{a62a}', '\u{a62b}'), 375 | ('\u{a640}', '\u{a66e}'), ('\u{a67f}', '\u{a69d}'), ('\u{a6a0}', '\u{a6ef}'), ('\u{a717}', 376 | '\u{a71f}'), ('\u{a722}', '\u{a788}'), ('\u{a78b}', '\u{a7dc}'), ('\u{a7f1}', '\u{a801}'), 377 | ('\u{a803}', '\u{a805}'), ('\u{a807}', '\u{a80a}'), ('\u{a80c}', '\u{a822}'), ('\u{a840}', 378 | '\u{a873}'), ('\u{a882}', '\u{a8b3}'), ('\u{a8f2}', '\u{a8f7}'), ('\u{a8fb}', '\u{a8fb}'), 379 | ('\u{a8fd}', '\u{a8fe}'), ('\u{a90a}', '\u{a925}'), ('\u{a930}', '\u{a946}'), ('\u{a960}', 380 | '\u{a97c}'), ('\u{a984}', '\u{a9b2}'), ('\u{a9cf}', '\u{a9cf}'), ('\u{a9e0}', '\u{a9e4}'), 381 | ('\u{a9e6}', '\u{a9ef}'), ('\u{a9fa}', '\u{a9fe}'), ('\u{aa00}', '\u{aa28}'), ('\u{aa40}', 382 | '\u{aa42}'), ('\u{aa44}', '\u{aa4b}'), ('\u{aa60}', '\u{aa76}'), ('\u{aa7a}', '\u{aa7a}'), 383 | ('\u{aa7e}', '\u{aaaf}'), ('\u{aab1}', '\u{aab1}'), ('\u{aab5}', '\u{aab6}'), ('\u{aab9}', 384 | '\u{aabd}'), ('\u{aac0}', '\u{aac0}'), ('\u{aac2}', '\u{aac2}'), ('\u{aadb}', '\u{aadd}'), 385 | ('\u{aae0}', '\u{aaea}'), ('\u{aaf2}', '\u{aaf4}'), ('\u{ab01}', '\u{ab06}'), ('\u{ab09}', 386 | '\u{ab0e}'), ('\u{ab11}', '\u{ab16}'), ('\u{ab20}', '\u{ab26}'), ('\u{ab28}', '\u{ab2e}'), 387 | ('\u{ab30}', '\u{ab5a}'), ('\u{ab5c}', '\u{ab69}'), ('\u{ab70}', '\u{abe2}'), ('\u{ac00}', 388 | '\u{d7a3}'), ('\u{d7b0}', '\u{d7c6}'), ('\u{d7cb}', '\u{d7fb}'), ('\u{f900}', '\u{fa6d}'), 389 | ('\u{fa70}', '\u{fad9}'), ('\u{fb00}', '\u{fb06}'), ('\u{fb13}', '\u{fb17}'), ('\u{fb1d}', 390 | '\u{fb1d}'), ('\u{fb1f}', '\u{fb28}'), ('\u{fb2a}', '\u{fb36}'), ('\u{fb38}', '\u{fb3c}'), 391 | ('\u{fb3e}', '\u{fb3e}'), ('\u{fb40}', '\u{fb41}'), ('\u{fb43}', '\u{fb44}'), ('\u{fb46}', 392 | '\u{fbb1}'), ('\u{fbd3}', '\u{fd3d}'), ('\u{fd50}', '\u{fd8f}'), ('\u{fd92}', '\u{fdc7}'), 393 | ('\u{fdf0}', '\u{fdfb}'), ('\u{fe70}', '\u{fe74}'), ('\u{fe76}', '\u{fefc}'), ('\u{ff21}', 394 | '\u{ff3a}'), ('\u{ff41}', '\u{ff5a}'), ('\u{ff66}', '\u{ffbe}'), ('\u{ffc2}', '\u{ffc7}'), 395 | ('\u{ffca}', '\u{ffcf}'), ('\u{ffd2}', '\u{ffd7}'), ('\u{ffda}', '\u{ffdc}'), ('\u{10000}', 396 | '\u{1000b}'), ('\u{1000d}', '\u{10026}'), ('\u{10028}', '\u{1003a}'), ('\u{1003c}', 397 | '\u{1003d}'), ('\u{1003f}', '\u{1004d}'), ('\u{10050}', '\u{1005d}'), ('\u{10080}', 398 | '\u{100fa}'), ('\u{10140}', '\u{10174}'), ('\u{10280}', '\u{1029c}'), ('\u{102a0}', 399 | '\u{102d0}'), ('\u{10300}', '\u{1031f}'), ('\u{1032d}', '\u{1034a}'), ('\u{10350}', 400 | '\u{10375}'), ('\u{10380}', '\u{1039d}'), ('\u{103a0}', '\u{103c3}'), ('\u{103c8}', 401 | '\u{103cf}'), ('\u{103d1}', '\u{103d5}'), ('\u{10400}', '\u{1049d}'), ('\u{104b0}', 402 | '\u{104d3}'), ('\u{104d8}', '\u{104fb}'), ('\u{10500}', '\u{10527}'), ('\u{10530}', 403 | '\u{10563}'), ('\u{10570}', '\u{1057a}'), ('\u{1057c}', '\u{1058a}'), ('\u{1058c}', 404 | '\u{10592}'), ('\u{10594}', '\u{10595}'), ('\u{10597}', '\u{105a1}'), ('\u{105a3}', 405 | '\u{105b1}'), ('\u{105b3}', '\u{105b9}'), ('\u{105bb}', '\u{105bc}'), ('\u{105c0}', 406 | '\u{105f3}'), ('\u{10600}', '\u{10736}'), ('\u{10740}', '\u{10755}'), ('\u{10760}', 407 | '\u{10767}'), ('\u{10780}', '\u{10785}'), ('\u{10787}', '\u{107b0}'), ('\u{107b2}', 408 | '\u{107ba}'), ('\u{10800}', '\u{10805}'), ('\u{10808}', '\u{10808}'), ('\u{1080a}', 409 | '\u{10835}'), ('\u{10837}', '\u{10838}'), ('\u{1083c}', '\u{1083c}'), ('\u{1083f}', 410 | '\u{10855}'), ('\u{10860}', '\u{10876}'), ('\u{10880}', '\u{1089e}'), ('\u{108e0}', 411 | '\u{108f2}'), ('\u{108f4}', '\u{108f5}'), ('\u{10900}', '\u{10915}'), ('\u{10920}', 412 | '\u{10939}'), ('\u{10940}', '\u{10959}'), ('\u{10980}', '\u{109b7}'), ('\u{109be}', 413 | '\u{109bf}'), ('\u{10a00}', '\u{10a00}'), ('\u{10a10}', '\u{10a13}'), ('\u{10a15}', 414 | '\u{10a17}'), ('\u{10a19}', '\u{10a35}'), ('\u{10a60}', '\u{10a7c}'), ('\u{10a80}', 415 | '\u{10a9c}'), ('\u{10ac0}', '\u{10ac7}'), ('\u{10ac9}', '\u{10ae4}'), ('\u{10b00}', 416 | '\u{10b35}'), ('\u{10b40}', '\u{10b55}'), ('\u{10b60}', '\u{10b72}'), ('\u{10b80}', 417 | '\u{10b91}'), ('\u{10c00}', '\u{10c48}'), ('\u{10c80}', '\u{10cb2}'), ('\u{10cc0}', 418 | '\u{10cf2}'), ('\u{10d00}', '\u{10d23}'), ('\u{10d4a}', '\u{10d65}'), ('\u{10d6f}', 419 | '\u{10d85}'), ('\u{10e80}', '\u{10ea9}'), ('\u{10eb0}', '\u{10eb1}'), ('\u{10ec2}', 420 | '\u{10ec7}'), ('\u{10f00}', '\u{10f1c}'), ('\u{10f27}', '\u{10f27}'), ('\u{10f30}', 421 | '\u{10f45}'), ('\u{10f70}', '\u{10f81}'), ('\u{10fb0}', '\u{10fc4}'), ('\u{10fe0}', 422 | '\u{10ff6}'), ('\u{11003}', '\u{11037}'), ('\u{11071}', '\u{11072}'), ('\u{11075}', 423 | '\u{11075}'), ('\u{11083}', '\u{110af}'), ('\u{110d0}', '\u{110e8}'), ('\u{11103}', 424 | '\u{11126}'), ('\u{11144}', '\u{11144}'), ('\u{11147}', '\u{11147}'), ('\u{11150}', 425 | '\u{11172}'), ('\u{11176}', '\u{11176}'), ('\u{11183}', '\u{111b2}'), ('\u{111c1}', 426 | '\u{111c4}'), ('\u{111da}', '\u{111da}'), ('\u{111dc}', '\u{111dc}'), ('\u{11200}', 427 | '\u{11211}'), ('\u{11213}', '\u{1122b}'), ('\u{1123f}', '\u{11240}'), ('\u{11280}', 428 | '\u{11286}'), ('\u{11288}', '\u{11288}'), ('\u{1128a}', '\u{1128d}'), ('\u{1128f}', 429 | '\u{1129d}'), ('\u{1129f}', '\u{112a8}'), ('\u{112b0}', '\u{112de}'), ('\u{11305}', 430 | '\u{1130c}'), ('\u{1130f}', '\u{11310}'), ('\u{11313}', '\u{11328}'), ('\u{1132a}', 431 | '\u{11330}'), ('\u{11332}', '\u{11333}'), ('\u{11335}', '\u{11339}'), ('\u{1133d}', 432 | '\u{1133d}'), ('\u{11350}', '\u{11350}'), ('\u{1135d}', '\u{11361}'), ('\u{11380}', 433 | '\u{11389}'), ('\u{1138b}', '\u{1138b}'), ('\u{1138e}', '\u{1138e}'), ('\u{11390}', 434 | '\u{113b5}'), ('\u{113b7}', '\u{113b7}'), ('\u{113d1}', '\u{113d1}'), ('\u{113d3}', 435 | '\u{113d3}'), ('\u{11400}', '\u{11434}'), ('\u{11447}', '\u{1144a}'), ('\u{1145f}', 436 | '\u{11461}'), ('\u{11480}', '\u{114af}'), ('\u{114c4}', '\u{114c5}'), ('\u{114c7}', 437 | '\u{114c7}'), ('\u{11580}', '\u{115ae}'), ('\u{115d8}', '\u{115db}'), ('\u{11600}', 438 | '\u{1162f}'), ('\u{11644}', '\u{11644}'), ('\u{11680}', '\u{116aa}'), ('\u{116b8}', 439 | '\u{116b8}'), ('\u{11700}', '\u{1171a}'), ('\u{11740}', '\u{11746}'), ('\u{11800}', 440 | '\u{1182b}'), ('\u{118a0}', '\u{118df}'), ('\u{118ff}', '\u{11906}'), ('\u{11909}', 441 | '\u{11909}'), ('\u{1190c}', '\u{11913}'), ('\u{11915}', '\u{11916}'), ('\u{11918}', 442 | '\u{1192f}'), ('\u{1193f}', '\u{1193f}'), ('\u{11941}', '\u{11941}'), ('\u{119a0}', 443 | '\u{119a7}'), ('\u{119aa}', '\u{119d0}'), ('\u{119e1}', '\u{119e1}'), ('\u{119e3}', 444 | '\u{119e3}'), ('\u{11a00}', '\u{11a00}'), ('\u{11a0b}', '\u{11a32}'), ('\u{11a3a}', 445 | '\u{11a3a}'), ('\u{11a50}', '\u{11a50}'), ('\u{11a5c}', '\u{11a89}'), ('\u{11a9d}', 446 | '\u{11a9d}'), ('\u{11ab0}', '\u{11af8}'), ('\u{11bc0}', '\u{11be0}'), ('\u{11c00}', 447 | '\u{11c08}'), ('\u{11c0a}', '\u{11c2e}'), ('\u{11c40}', '\u{11c40}'), ('\u{11c72}', 448 | '\u{11c8f}'), ('\u{11d00}', '\u{11d06}'), ('\u{11d08}', '\u{11d09}'), ('\u{11d0b}', 449 | '\u{11d30}'), ('\u{11d46}', '\u{11d46}'), ('\u{11d60}', '\u{11d65}'), ('\u{11d67}', 450 | '\u{11d68}'), ('\u{11d6a}', '\u{11d89}'), ('\u{11d98}', '\u{11d98}'), ('\u{11db0}', 451 | '\u{11ddb}'), ('\u{11ee0}', '\u{11ef2}'), ('\u{11f02}', '\u{11f02}'), ('\u{11f04}', 452 | '\u{11f10}'), ('\u{11f12}', '\u{11f33}'), ('\u{11fb0}', '\u{11fb0}'), ('\u{12000}', 453 | '\u{12399}'), ('\u{12400}', '\u{1246e}'), ('\u{12480}', '\u{12543}'), ('\u{12f90}', 454 | '\u{12ff0}'), ('\u{13000}', '\u{1342f}'), ('\u{13441}', '\u{13446}'), ('\u{13460}', 455 | '\u{143fa}'), ('\u{14400}', '\u{14646}'), ('\u{16100}', '\u{1611d}'), ('\u{16800}', 456 | '\u{16a38}'), ('\u{16a40}', '\u{16a5e}'), ('\u{16a70}', '\u{16abe}'), ('\u{16ad0}', 457 | '\u{16aed}'), ('\u{16b00}', '\u{16b2f}'), ('\u{16b40}', '\u{16b43}'), ('\u{16b63}', 458 | '\u{16b77}'), ('\u{16b7d}', '\u{16b8f}'), ('\u{16d40}', '\u{16d6c}'), ('\u{16e40}', 459 | '\u{16e7f}'), ('\u{16ea0}', '\u{16eb8}'), ('\u{16ebb}', '\u{16ed3}'), ('\u{16f00}', 460 | '\u{16f4a}'), ('\u{16f50}', '\u{16f50}'), ('\u{16f93}', '\u{16f9f}'), ('\u{16fe0}', 461 | '\u{16fe1}'), ('\u{16fe3}', '\u{16fe3}'), ('\u{16ff2}', '\u{16ff6}'), ('\u{17000}', 462 | '\u{18cd5}'), ('\u{18cff}', '\u{18d1e}'), ('\u{18d80}', '\u{18df2}'), ('\u{1aff0}', 463 | '\u{1aff3}'), ('\u{1aff5}', '\u{1affb}'), ('\u{1affd}', '\u{1affe}'), ('\u{1b000}', 464 | '\u{1b122}'), ('\u{1b132}', '\u{1b132}'), ('\u{1b150}', '\u{1b152}'), ('\u{1b155}', 465 | '\u{1b155}'), ('\u{1b164}', '\u{1b167}'), ('\u{1b170}', '\u{1b2fb}'), ('\u{1bc00}', 466 | '\u{1bc6a}'), ('\u{1bc70}', '\u{1bc7c}'), ('\u{1bc80}', '\u{1bc88}'), ('\u{1bc90}', 467 | '\u{1bc99}'), ('\u{1d400}', '\u{1d454}'), ('\u{1d456}', '\u{1d49c}'), ('\u{1d49e}', 468 | '\u{1d49f}'), ('\u{1d4a2}', '\u{1d4a2}'), ('\u{1d4a5}', '\u{1d4a6}'), ('\u{1d4a9}', 469 | '\u{1d4ac}'), ('\u{1d4ae}', '\u{1d4b9}'), ('\u{1d4bb}', '\u{1d4bb}'), ('\u{1d4bd}', 470 | '\u{1d4c3}'), ('\u{1d4c5}', '\u{1d505}'), ('\u{1d507}', '\u{1d50a}'), ('\u{1d50d}', 471 | '\u{1d514}'), ('\u{1d516}', '\u{1d51c}'), ('\u{1d51e}', '\u{1d539}'), ('\u{1d53b}', 472 | '\u{1d53e}'), ('\u{1d540}', '\u{1d544}'), ('\u{1d546}', '\u{1d546}'), ('\u{1d54a}', 473 | '\u{1d550}'), ('\u{1d552}', '\u{1d6a5}'), ('\u{1d6a8}', '\u{1d6c0}'), ('\u{1d6c2}', 474 | '\u{1d6da}'), ('\u{1d6dc}', '\u{1d6fa}'), ('\u{1d6fc}', '\u{1d714}'), ('\u{1d716}', 475 | '\u{1d734}'), ('\u{1d736}', '\u{1d74e}'), ('\u{1d750}', '\u{1d76e}'), ('\u{1d770}', 476 | '\u{1d788}'), ('\u{1d78a}', '\u{1d7a8}'), ('\u{1d7aa}', '\u{1d7c2}'), ('\u{1d7c4}', 477 | '\u{1d7cb}'), ('\u{1df00}', '\u{1df1e}'), ('\u{1df25}', '\u{1df2a}'), ('\u{1e030}', 478 | '\u{1e06d}'), ('\u{1e100}', '\u{1e12c}'), ('\u{1e137}', '\u{1e13d}'), ('\u{1e14e}', 479 | '\u{1e14e}'), ('\u{1e290}', '\u{1e2ad}'), ('\u{1e2c0}', '\u{1e2eb}'), ('\u{1e4d0}', 480 | '\u{1e4eb}'), ('\u{1e5d0}', '\u{1e5ed}'), ('\u{1e5f0}', '\u{1e5f0}'), ('\u{1e6c0}', 481 | '\u{1e6de}'), ('\u{1e6e0}', '\u{1e6e2}'), ('\u{1e6e4}', '\u{1e6e5}'), ('\u{1e6e7}', 482 | '\u{1e6ed}'), ('\u{1e6f0}', '\u{1e6f4}'), ('\u{1e6fe}', '\u{1e6ff}'), ('\u{1e7e0}', 483 | '\u{1e7e6}'), ('\u{1e7e8}', '\u{1e7eb}'), ('\u{1e7ed}', '\u{1e7ee}'), ('\u{1e7f0}', 484 | '\u{1e7fe}'), ('\u{1e800}', '\u{1e8c4}'), ('\u{1e900}', '\u{1e943}'), ('\u{1e94b}', 485 | '\u{1e94b}'), ('\u{1ee00}', '\u{1ee03}'), ('\u{1ee05}', '\u{1ee1f}'), ('\u{1ee21}', 486 | '\u{1ee22}'), ('\u{1ee24}', '\u{1ee24}'), ('\u{1ee27}', '\u{1ee27}'), ('\u{1ee29}', 487 | '\u{1ee32}'), ('\u{1ee34}', '\u{1ee37}'), ('\u{1ee39}', '\u{1ee39}'), ('\u{1ee3b}', 488 | '\u{1ee3b}'), ('\u{1ee42}', '\u{1ee42}'), ('\u{1ee47}', '\u{1ee47}'), ('\u{1ee49}', 489 | '\u{1ee49}'), ('\u{1ee4b}', '\u{1ee4b}'), ('\u{1ee4d}', '\u{1ee4f}'), ('\u{1ee51}', 490 | '\u{1ee52}'), ('\u{1ee54}', '\u{1ee54}'), ('\u{1ee57}', '\u{1ee57}'), ('\u{1ee59}', 491 | '\u{1ee59}'), ('\u{1ee5b}', '\u{1ee5b}'), ('\u{1ee5d}', '\u{1ee5d}'), ('\u{1ee5f}', 492 | '\u{1ee5f}'), ('\u{1ee61}', '\u{1ee62}'), ('\u{1ee64}', '\u{1ee64}'), ('\u{1ee67}', 493 | '\u{1ee6a}'), ('\u{1ee6c}', '\u{1ee72}'), ('\u{1ee74}', '\u{1ee77}'), ('\u{1ee79}', 494 | '\u{1ee7c}'), ('\u{1ee7e}', '\u{1ee7e}'), ('\u{1ee80}', '\u{1ee89}'), ('\u{1ee8b}', 495 | '\u{1ee9b}'), ('\u{1eea1}', '\u{1eea3}'), ('\u{1eea5}', '\u{1eea9}'), ('\u{1eeab}', 496 | '\u{1eebb}'), ('\u{20000}', '\u{2a6df}'), ('\u{2a700}', '\u{2b81d}'), ('\u{2b820}', 497 | '\u{2cead}'), ('\u{2ceb0}', '\u{2ebe0}'), ('\u{2ebf0}', '\u{2ee5d}'), ('\u{2f800}', 498 | '\u{2fa1d}'), ('\u{30000}', '\u{3134a}'), ('\u{31350}', '\u{33479}') 499 | ]; 500 | 501 | pub fn ID_Start(c: char) -> bool { 502 | super::bsearch_range_table(c, ID_Start_table) 503 | } 504 | 505 | } 506 | 507 | --------------------------------------------------------------------------------