From ac3365c217deb9747897d2955e474e3280acdebb Mon Sep 17 00:00:00 2001 From: Behnam Esfahbod Date: Mon, 2 Oct 2017 13:56:50 -0700 Subject: [PATCH 1/3] Add new unic-ucd-common component There are some core properties that are commonly used in Unicode algorithsm, as well as in applications directly, and are not specific to any single area. Examples of these properties are `Alphabetic` and `White_Space`. Also, there are some *resolved* properties that are used commonly, like *Numeric* and *Alphanumeric*, which are commonly defined as based on *General_Category* and *Alphabetic* properties. Since they are common in applications, it makes sense to provided optimized implementations. This new componet, `unic-ucd-common`, hosts these properties. --- gen/src/writer/ucd/common.rs | 69 ++ gen/src/writer/ucd/mod.rs | 4 +- unic/ucd/Cargo.toml | 1 + unic/ucd/common/Cargo.toml | 20 + unic/ucd/common/src/alphabetic.rs | 105 +++ unic/ucd/common/src/alphanumeric.rs | 115 +++ unic/ucd/common/src/lib.rs | 43 ++ unic/ucd/common/src/numeric.rs | 108 +++ unic/ucd/common/tables/alphabetic.rsv | 664 ++++++++++++++++ unic/ucd/common/tables/alphanumeric.rsv | 729 ++++++++++++++++++ unic/ucd/common/tables/numeric.rsv | 120 +++ unic/ucd/common/tables/unicode_version.rsv | 3 + .../ucd/common/tests/unicode_version_tests.rs | 22 + 13 files changed, 2002 insertions(+), 1 deletion(-) create mode 100644 gen/src/writer/ucd/common.rs create mode 100644 unic/ucd/common/Cargo.toml create mode 100644 unic/ucd/common/src/alphabetic.rs create mode 100644 unic/ucd/common/src/alphanumeric.rs create mode 100644 unic/ucd/common/src/lib.rs create mode 100644 unic/ucd/common/src/numeric.rs create mode 100644 unic/ucd/common/tables/alphabetic.rsv create mode 100644 unic/ucd/common/tables/alphanumeric.rsv create mode 100644 unic/ucd/common/tables/numeric.rsv create mode 100644 unic/ucd/common/tables/unicode_version.rsv create mode 100644 unic/ucd/common/tests/unicode_version_tests.rs diff --git a/gen/src/writer/ucd/common.rs b/gen/src/writer/ucd/common.rs new file mode 100644 index 00000000..55e238be --- /dev/null +++ b/gen/src/writer/ucd/common.rs @@ -0,0 +1,69 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +use std::path::Path; +use std::collections::BTreeSet; + +use source::ucd::derived_core_properties::DERIVED_CORE_PROPERTIES; +use source::ucd::readme::UNICODE_VERSION; +use source::ucd::unicode_data::UNICODE_DATA; + +use writer::utils::tables::ToRangeCharSet; +use writer::common::emit_unicode_version; +use writer::utils::write; + + +pub fn generate(dir: &Path) { + emit_unicode_version(dir, &UNICODE_VERSION); + emit_alphabetic(dir); + emit_numeric(dir); + emit_alphanumeric(dir); +} + + +fn emit_alphabetic(dir: &Path) { + write( + dir, + "alphabetic.rsv", + &DERIVED_CORE_PROPERTIES.alphabetic.to_range_char_set(), + ); +} + +fn emit_numeric(dir: &Path) { + write(dir, "numeric.rsv", &get_numeric().to_range_char_set()); +} + +fn emit_alphanumeric(dir: &Path) { + write( + dir, + "alphanumeric.rsv", + &get_alphanumeric().to_range_char_set(), + ); +} + + +fn get_numeric() -> BTreeSet { + UNICODE_DATA + .entries + .iter() + .filter(|x| { + ["Nd", "Nl", "No"].contains(&x.general_category.as_str()) + }) + .map(|x| x.character) + .collect() +} + +fn get_alphanumeric() -> BTreeSet { + get_numeric() + .union(&DERIVED_CORE_PROPERTIES.alphabetic) + .map(|ch| ch.clone()) + .collect() +} diff --git a/gen/src/writer/ucd/mod.rs b/gen/src/writer/ucd/mod.rs index 422a9378..30a07953 100644 --- a/gen/src/writer/ucd/mod.rs +++ b/gen/src/writer/ucd/mod.rs @@ -13,6 +13,7 @@ mod age; mod bidi; mod case; mod category; +mod common; mod core; mod ident; mod name; @@ -28,9 +29,10 @@ pub fn generate() { bidi::generate(&clean_dir("unic/ucd/bidi/tables")); case::generate(&clean_dir("unic/ucd/case/tables")); category::generate(&clean_dir("unic/ucd/category/tables")); + common::generate(&clean_dir("unic/ucd/common/tables")); core::generate(&clean_dir("unic/ucd/core/tables")); + ident::generate(&clean_dir("unic/ucd/ident/tables")); name::generate(&clean_dir("unic/ucd/name/tables")); normal::generate(&clean_dir("unic/ucd/normal/tables")); - ident::generate(&clean_dir("unic/ucd/ident/tables")); segment::generate(&clean_dir("unic/ucd/segment/tables")); } diff --git a/unic/ucd/Cargo.toml b/unic/ucd/Cargo.toml index bd38cc48..99737c42 100644 --- a/unic/ucd/Cargo.toml +++ b/unic/ucd/Cargo.toml @@ -20,6 +20,7 @@ unic-ucd-age = { path = "age/", version = "0.6.0" } unic-ucd-bidi = { path = "bidi/", version = "0.6.0" } unic-ucd-case = { path = "case/", version = "0.6.0" } unic-ucd-category = { path = "category/", version = "0.6.0" } +unic-ucd-common = { path = "common/", version = "0.6.0" } unic-ucd-core = { path = "core/", version = "0.6.0" } unic-ucd-ident = { path = "ident/", version = "0.6.0" } unic-ucd-name = { path = "name/", version = "0.6.0" } diff --git a/unic/ucd/common/Cargo.toml b/unic/ucd/common/Cargo.toml new file mode 100644 index 00000000..54f92509 --- /dev/null +++ b/unic/ucd/common/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "unic-ucd-common" +version = "0.6.0" +authors = ["The UNIC Project Developers"] +repository = "https://github.com/behnam/rust-unic/" +license = "MIT/Apache-2.0" +description = "UNIC - Unicode Character Database - Common Properties" +keywords = ["text", "unicode", "character-property", "alphabetic", "numeric"] +categories = ["internationalization", "text-processing", "parsing", "rendering"] + +# No tests/benches that depends on /data/ +exclude = [] + +[badges] +travis-ci = { repository = "behnam/rust-unic", branch = "master" } + +[dependencies] +unic-char-property = { path = "../../char/property/", version = "0.6.0" } +unic-char-range = { path = "../../char/range", version = "0.6.0" } +unic-ucd-core = { path = "../core/", version = "0.6.0" } diff --git a/unic/ucd/common/src/alphabetic.rs b/unic/ucd/common/src/alphabetic.rs new file mode 100644 index 00000000..e8d9d94d --- /dev/null +++ b/unic/ucd/common/src/alphabetic.rs @@ -0,0 +1,105 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +//! Unicode *Alphabetic* Character Property. + + +char_property! { + /// Represents values of the Unicode character property + /// [*Alphabetic*](http://www.unicode.org/reports/tr44/#Alphabetic). + /// + /// The value is `true` for characters that change when lowercased, `false` otherwise. + pub struct Alphabetic(bool) { + abbr => "Alpha"; + long => "Alphabetic"; + human => "Alphabetic"; + + data_table_path => "../tables/alphabetic.rsv"; + } + + /// Return `true` for Alphabetic characters, `false` otherwise. + pub fn is_alphabetic(char) -> bool; +} + + +#[cfg(test)] +mod tests { + #[test] + fn test_values() { + use super::is_alphabetic; + + // ASCII + assert_eq!(is_alphabetic('\u{0020}'), false); + assert_eq!(is_alphabetic('\u{0021}'), false); + assert_eq!(is_alphabetic('\u{0022}'), false); + + assert_eq!(is_alphabetic('\u{0030}'), false); + assert_eq!(is_alphabetic('\u{0031}'), false); + assert_eq!(is_alphabetic('\u{0032}'), false); + + assert_eq!(is_alphabetic('\u{0040}'), false); + assert_eq!(is_alphabetic('\u{0041}'), true); + assert_eq!(is_alphabetic('\u{0042}'), true); + + assert_eq!(is_alphabetic('\u{0060}'), false); + assert_eq!(is_alphabetic('\u{0061}'), true); + assert_eq!(is_alphabetic('\u{0062}'), true); + + assert_eq!(is_alphabetic('\u{007e}'), false); + assert_eq!(is_alphabetic('\u{007f}'), false); + + // Other BMP + assert_eq!(is_alphabetic('\u{061b}'), false); + assert_eq!(is_alphabetic('\u{061c}'), false); + assert_eq!(is_alphabetic('\u{061d}'), false); + + assert_eq!(is_alphabetic('\u{200d}'), false); + assert_eq!(is_alphabetic('\u{200e}'), false); + assert_eq!(is_alphabetic('\u{200f}'), false); + assert_eq!(is_alphabetic('\u{2010}'), false); + + assert_eq!(is_alphabetic('\u{2029}'), false); + assert_eq!(is_alphabetic('\u{202a}'), false); + assert_eq!(is_alphabetic('\u{202e}'), false); + assert_eq!(is_alphabetic('\u{202f}'), false); + + // Other Planes + assert_eq!(is_alphabetic('\u{10000}'), true); + assert_eq!(is_alphabetic('\u{10001}'), true); + + assert_eq!(is_alphabetic('\u{20000}'), true); + assert_eq!(is_alphabetic('\u{30000}'), false); + assert_eq!(is_alphabetic('\u{40000}'), false); + assert_eq!(is_alphabetic('\u{50000}'), false); + assert_eq!(is_alphabetic('\u{60000}'), false); + assert_eq!(is_alphabetic('\u{70000}'), false); + assert_eq!(is_alphabetic('\u{80000}'), false); + assert_eq!(is_alphabetic('\u{90000}'), false); + assert_eq!(is_alphabetic('\u{a0000}'), false); + assert_eq!(is_alphabetic('\u{b0000}'), false); + assert_eq!(is_alphabetic('\u{c0000}'), false); + assert_eq!(is_alphabetic('\u{d0000}'), false); + assert_eq!(is_alphabetic('\u{e0000}'), false); + + assert_eq!(is_alphabetic('\u{efffe}'), false); + assert_eq!(is_alphabetic('\u{effff}'), false); + + // Priavte-Use Area + assert_eq!(is_alphabetic('\u{f0000}'), false); + assert_eq!(is_alphabetic('\u{f0001}'), false); + assert_eq!(is_alphabetic('\u{ffffe}'), false); + assert_eq!(is_alphabetic('\u{fffff}'), false); + assert_eq!(is_alphabetic('\u{100000}'), false); + assert_eq!(is_alphabetic('\u{100001}'), false); + assert_eq!(is_alphabetic('\u{10fffe}'), false); + assert_eq!(is_alphabetic('\u{10ffff}'), false); + } +} diff --git a/unic/ucd/common/src/alphanumeric.rs b/unic/ucd/common/src/alphanumeric.rs new file mode 100644 index 00000000..bb5c760d --- /dev/null +++ b/unic/ucd/common/src/alphanumeric.rs @@ -0,0 +1,115 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +//! *Alphanumeric* Character Property, equal to `General_Category = Nd | Nl | No or Alphabetic = +//! Yes`. +//! +//! This is equivalent to `Alphabetic = true or Numeric = true`. +//! +//! NOTE: This property is not defined by UCD, but is used commonly enough in Unicode algorithms and +//! applications to provide an optimized implementation. + + +char_property! { + /// Represents Unicode characters with `General_Category = Nd | Nl | No`. + /// + /// This is equivalent to `Alphabetic = true or Numeric = true`. + /// + /// The value is `true` for characters that are alphabetic or have a numeric *General_Category*, + /// `false` otherwise. + pub struct Alphanumeric(bool) { + abbr => "Alphanumeric"; + long => "Alphanumeric"; + human => "Alphanumeric"; + + data_table_path => "../tables/alphanumeric.rsv"; + } + + /// Return `true` for alphanumeric characters, `false` otherwise. + /// + /// This is equivalent to `is_alphabetic(char) || is_numeric(char)`. + pub fn is_alphanumeric(char) -> bool; +} + + +#[cfg(test)] +mod tests { + #[test] + fn test_values() { + use super::is_alphanumeric; + + // ASCII + assert_eq!(is_alphanumeric('\u{0020}'), false); + assert_eq!(is_alphanumeric('\u{0021}'), false); + assert_eq!(is_alphanumeric('\u{0022}'), false); + + assert_eq!(is_alphanumeric('\u{0030}'), true); + assert_eq!(is_alphanumeric('\u{0031}'), true); + assert_eq!(is_alphanumeric('\u{0032}'), true); + + assert_eq!(is_alphanumeric('\u{0040}'), false); + assert_eq!(is_alphanumeric('\u{0041}'), true); + assert_eq!(is_alphanumeric('\u{0042}'), true); + + assert_eq!(is_alphanumeric('\u{0060}'), false); + assert_eq!(is_alphanumeric('\u{0061}'), true); + assert_eq!(is_alphanumeric('\u{0062}'), true); + + assert_eq!(is_alphanumeric('\u{007e}'), false); + assert_eq!(is_alphanumeric('\u{007f}'), false); + + // Other BMP + assert_eq!(is_alphanumeric('\u{061b}'), false); + assert_eq!(is_alphanumeric('\u{061c}'), false); + assert_eq!(is_alphanumeric('\u{061d}'), false); + + assert_eq!(is_alphanumeric('\u{200d}'), false); + assert_eq!(is_alphanumeric('\u{200e}'), false); + assert_eq!(is_alphanumeric('\u{200f}'), false); + assert_eq!(is_alphanumeric('\u{2010}'), false); + + assert_eq!(is_alphanumeric('\u{2029}'), false); + assert_eq!(is_alphanumeric('\u{202a}'), false); + assert_eq!(is_alphanumeric('\u{202e}'), false); + assert_eq!(is_alphanumeric('\u{202f}'), false); + + // Other Planes + assert_eq!(is_alphanumeric('\u{10000}'), true); + assert_eq!(is_alphanumeric('\u{10001}'), true); + + assert_eq!(is_alphanumeric('\u{20000}'), true); + assert_eq!(is_alphanumeric('\u{30000}'), false); + assert_eq!(is_alphanumeric('\u{40000}'), false); + assert_eq!(is_alphanumeric('\u{50000}'), false); + assert_eq!(is_alphanumeric('\u{60000}'), false); + assert_eq!(is_alphanumeric('\u{70000}'), false); + assert_eq!(is_alphanumeric('\u{80000}'), false); + assert_eq!(is_alphanumeric('\u{90000}'), false); + assert_eq!(is_alphanumeric('\u{a0000}'), false); + assert_eq!(is_alphanumeric('\u{b0000}'), false); + assert_eq!(is_alphanumeric('\u{c0000}'), false); + assert_eq!(is_alphanumeric('\u{d0000}'), false); + assert_eq!(is_alphanumeric('\u{e0000}'), false); + + assert_eq!(is_alphanumeric('\u{efffe}'), false); + assert_eq!(is_alphanumeric('\u{effff}'), false); + + // Priavte-Use Area + assert_eq!(is_alphanumeric('\u{f0000}'), false); + assert_eq!(is_alphanumeric('\u{f0001}'), false); + assert_eq!(is_alphanumeric('\u{ffffe}'), false); + assert_eq!(is_alphanumeric('\u{fffff}'), false); + assert_eq!(is_alphanumeric('\u{100000}'), false); + assert_eq!(is_alphanumeric('\u{100001}'), false); + assert_eq!(is_alphanumeric('\u{10fffe}'), false); + assert_eq!(is_alphanumeric('\u{10ffff}'), false); + } +} diff --git a/unic/ucd/common/src/lib.rs b/unic/ucd/common/src/lib.rs new file mode 100644 index 00000000..a83f9b44 --- /dev/null +++ b/unic/ucd/common/src/lib.rs @@ -0,0 +1,43 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +#![forbid(unsafe_code, unconditional_recursion, missing_docs)] + +//! # UNIC — UCD — Case Character Properties +//! +//! A component of [`unic`: Unicode and Internationalization Crates for Rust](/unic/). +//! +//! Accessor for common character properties from the Unicode Character Database (UCD). + + +#[macro_use] +extern crate unic_char_property; + +#[macro_use] +extern crate unic_char_range; + +extern crate unic_ucd_core; + + +pub mod alphabetic; +pub mod alphanumeric; +pub mod numeric; + + +pub use alphabetic::{is_alphabetic, Alphabetic}; +pub use alphanumeric::is_alphanumeric; +pub use numeric::is_numeric; + + +use unic_ucd_core::UnicodeVersion; + +/// The [Unicode version](http://www.unicode.org/versions/) of data +pub const UNICODE_VERSION: UnicodeVersion = include!("../tables/unicode_version.rsv"); diff --git a/unic/ucd/common/src/numeric.rs b/unic/ucd/common/src/numeric.rs new file mode 100644 index 00000000..2c831218 --- /dev/null +++ b/unic/ucd/common/src/numeric.rs @@ -0,0 +1,108 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +//! *Numeric* Character Property, equal to `General_Category = Nd | Nl | No`. +//! +//! NOTE: This property is not defined by UCD, but is used commonly enough in Unicode algorithms and +//! applications to provide an optimized implementation. + + +char_property! { + /// Represents Unicode characters with `General_Category = Nd | Nl | No`. + /// + /// The value is `true` for characters that have a numeric *General_Category*, `false` + /// otherwise. + pub struct Numeric(bool) { + abbr => "Numeric"; + long => "Numeric"; + human => "Numeric"; + + data_table_path => "../tables/numeric.rsv"; + } + + /// Return `true` for numeric characters, `false` otherwise. + pub fn is_numeric(char) -> bool; +} + + +#[cfg(test)] +mod tests { + #[test] + fn test_values() { + use super::is_numeric; + + // ASCII + assert_eq!(is_numeric('\u{0020}'), false); + assert_eq!(is_numeric('\u{0021}'), false); + assert_eq!(is_numeric('\u{0022}'), false); + + assert_eq!(is_numeric('\u{0030}'), true); + assert_eq!(is_numeric('\u{0031}'), true); + assert_eq!(is_numeric('\u{0032}'), true); + + assert_eq!(is_numeric('\u{0040}'), false); + assert_eq!(is_numeric('\u{0041}'), false); + assert_eq!(is_numeric('\u{0042}'), false); + + assert_eq!(is_numeric('\u{0060}'), false); + assert_eq!(is_numeric('\u{0061}'), false); + assert_eq!(is_numeric('\u{0062}'), false); + + assert_eq!(is_numeric('\u{007e}'), false); + assert_eq!(is_numeric('\u{007f}'), false); + + // Other BMP + assert_eq!(is_numeric('\u{061b}'), false); + assert_eq!(is_numeric('\u{061c}'), false); + assert_eq!(is_numeric('\u{061d}'), false); + + assert_eq!(is_numeric('\u{200d}'), false); + assert_eq!(is_numeric('\u{200e}'), false); + assert_eq!(is_numeric('\u{200f}'), false); + assert_eq!(is_numeric('\u{2010}'), false); + + assert_eq!(is_numeric('\u{2029}'), false); + assert_eq!(is_numeric('\u{202a}'), false); + assert_eq!(is_numeric('\u{202e}'), false); + assert_eq!(is_numeric('\u{202f}'), false); + + // Other Planes + assert_eq!(is_numeric('\u{10000}'), false); + assert_eq!(is_numeric('\u{10001}'), false); + + assert_eq!(is_numeric('\u{20000}'), false); + assert_eq!(is_numeric('\u{30000}'), false); + assert_eq!(is_numeric('\u{40000}'), false); + assert_eq!(is_numeric('\u{50000}'), false); + assert_eq!(is_numeric('\u{60000}'), false); + assert_eq!(is_numeric('\u{70000}'), false); + assert_eq!(is_numeric('\u{80000}'), false); + assert_eq!(is_numeric('\u{90000}'), false); + assert_eq!(is_numeric('\u{a0000}'), false); + assert_eq!(is_numeric('\u{b0000}'), false); + assert_eq!(is_numeric('\u{c0000}'), false); + assert_eq!(is_numeric('\u{d0000}'), false); + assert_eq!(is_numeric('\u{e0000}'), false); + + assert_eq!(is_numeric('\u{efffe}'), false); + assert_eq!(is_numeric('\u{effff}'), false); + + // Priavte-Use Area + assert_eq!(is_numeric('\u{f0000}'), false); + assert_eq!(is_numeric('\u{f0001}'), false); + assert_eq!(is_numeric('\u{ffffe}'), false); + assert_eq!(is_numeric('\u{fffff}'), false); + assert_eq!(is_numeric('\u{100000}'), false); + assert_eq!(is_numeric('\u{100001}'), false); + assert_eq!(is_numeric('\u{10fffe}'), false); + assert_eq!(is_numeric('\u{10ffff}'), false); + } +} diff --git a/unic/ucd/common/tables/alphabetic.rsv b/unic/ucd/common/tables/alphabetic.rsv new file mode 100644 index 00000000..5c42704e --- /dev/null +++ b/unic/ucd/common/tables/alphabetic.rsv @@ -0,0 +1,664 @@ +// WARNING: Auto-generated by the `unic-gen` crate. +// WARNING: DO NOT EDIT MANUALLY! +CharDataTable::Range(&[ + (chars!('\u{41}'..='\u{5a}'), ()), + (chars!('\u{61}'..='\u{7a}'), ()), + (chars!('\u{aa}'..='\u{aa}'), ()), + (chars!('\u{b5}'..='\u{b5}'), ()), + (chars!('\u{ba}'..='\u{ba}'), ()), + (chars!('\u{c0}'..='\u{d6}'), ()), + (chars!('\u{d8}'..='\u{f6}'), ()), + (chars!('\u{f8}'..='\u{2c1}'), ()), + (chars!('\u{2c6}'..='\u{2d1}'), ()), + (chars!('\u{2e0}'..='\u{2e4}'), ()), + (chars!('\u{2ec}'..='\u{2ec}'), ()), + (chars!('\u{2ee}'..='\u{2ee}'), ()), + (chars!('\u{345}'..='\u{345}'), ()), + (chars!('\u{370}'..='\u{374}'), ()), + (chars!('\u{376}'..='\u{377}'), ()), + (chars!('\u{37a}'..='\u{37d}'), ()), + (chars!('\u{37f}'..='\u{37f}'), ()), + (chars!('\u{386}'..='\u{386}'), ()), + (chars!('\u{388}'..='\u{38a}'), ()), + (chars!('\u{38c}'..='\u{38c}'), ()), + (chars!('\u{38e}'..='\u{3a1}'), ()), + (chars!('\u{3a3}'..='\u{3f5}'), ()), + (chars!('\u{3f7}'..='\u{481}'), ()), + (chars!('\u{48a}'..='\u{52f}'), ()), + (chars!('\u{531}'..='\u{556}'), ()), + (chars!('\u{559}'..='\u{559}'), ()), + (chars!('\u{561}'..='\u{587}'), ()), + (chars!('\u{5b0}'..='\u{5bd}'), ()), + (chars!('\u{5bf}'..='\u{5bf}'), ()), + (chars!('\u{5c1}'..='\u{5c2}'), ()), + (chars!('\u{5c4}'..='\u{5c5}'), ()), + (chars!('\u{5c7}'..='\u{5c7}'), ()), + (chars!('\u{5d0}'..='\u{5ea}'), ()), + (chars!('\u{5f0}'..='\u{5f2}'), ()), + (chars!('\u{610}'..='\u{61a}'), ()), + (chars!('\u{620}'..='\u{657}'), ()), + (chars!('\u{659}'..='\u{65f}'), ()), + (chars!('\u{66e}'..='\u{6d3}'), ()), + (chars!('\u{6d5}'..='\u{6dc}'), ()), + (chars!('\u{6e1}'..='\u{6e8}'), ()), + (chars!('\u{6ed}'..='\u{6ef}'), ()), + (chars!('\u{6fa}'..='\u{6fc}'), ()), + (chars!('\u{6ff}'..='\u{6ff}'), ()), + (chars!('\u{710}'..='\u{73f}'), ()), + (chars!('\u{74d}'..='\u{7b1}'), ()), + (chars!('\u{7ca}'..='\u{7ea}'), ()), + (chars!('\u{7f4}'..='\u{7f5}'), ()), + (chars!('\u{7fa}'..='\u{7fa}'), ()), + (chars!('\u{800}'..='\u{817}'), ()), + (chars!('\u{81a}'..='\u{82c}'), ()), + (chars!('\u{840}'..='\u{858}'), ()), + (chars!('\u{860}'..='\u{86a}'), ()), + (chars!('\u{8a0}'..='\u{8b4}'), ()), + (chars!('\u{8b6}'..='\u{8bd}'), ()), + (chars!('\u{8d4}'..='\u{8df}'), ()), + (chars!('\u{8e3}'..='\u{8e9}'), ()), + (chars!('\u{8f0}'..='\u{93b}'), ()), + (chars!('\u{93d}'..='\u{94c}'), ()), + (chars!('\u{94e}'..='\u{950}'), ()), + (chars!('\u{955}'..='\u{963}'), ()), + (chars!('\u{971}'..='\u{983}'), ()), + (chars!('\u{985}'..='\u{98c}'), ()), + (chars!('\u{98f}'..='\u{990}'), ()), + (chars!('\u{993}'..='\u{9a8}'), ()), + (chars!('\u{9aa}'..='\u{9b0}'), ()), + (chars!('\u{9b2}'..='\u{9b2}'), ()), + (chars!('\u{9b6}'..='\u{9b9}'), ()), + (chars!('\u{9bd}'..='\u{9c4}'), ()), + (chars!('\u{9c7}'..='\u{9c8}'), ()), + (chars!('\u{9cb}'..='\u{9cc}'), ()), + (chars!('\u{9ce}'..='\u{9ce}'), ()), + (chars!('\u{9d7}'..='\u{9d7}'), ()), + (chars!('\u{9dc}'..='\u{9dd}'), ()), + (chars!('\u{9df}'..='\u{9e3}'), ()), + (chars!('\u{9f0}'..='\u{9f1}'), ()), + (chars!('\u{9fc}'..='\u{9fc}'), ()), + (chars!('\u{a01}'..='\u{a03}'), ()), + (chars!('\u{a05}'..='\u{a0a}'), ()), + (chars!('\u{a0f}'..='\u{a10}'), ()), + (chars!('\u{a13}'..='\u{a28}'), ()), + (chars!('\u{a2a}'..='\u{a30}'), ()), + (chars!('\u{a32}'..='\u{a33}'), ()), + (chars!('\u{a35}'..='\u{a36}'), ()), + (chars!('\u{a38}'..='\u{a39}'), ()), + (chars!('\u{a3e}'..='\u{a42}'), ()), + (chars!('\u{a47}'..='\u{a48}'), ()), + (chars!('\u{a4b}'..='\u{a4c}'), ()), + (chars!('\u{a51}'..='\u{a51}'), ()), + (chars!('\u{a59}'..='\u{a5c}'), ()), + (chars!('\u{a5e}'..='\u{a5e}'), ()), + (chars!('\u{a70}'..='\u{a75}'), ()), + (chars!('\u{a81}'..='\u{a83}'), ()), + (chars!('\u{a85}'..='\u{a8d}'), ()), + (chars!('\u{a8f}'..='\u{a91}'), ()), + (chars!('\u{a93}'..='\u{aa8}'), ()), + (chars!('\u{aaa}'..='\u{ab0}'), ()), + (chars!('\u{ab2}'..='\u{ab3}'), ()), + (chars!('\u{ab5}'..='\u{ab9}'), ()), + (chars!('\u{abd}'..='\u{ac5}'), ()), + (chars!('\u{ac7}'..='\u{ac9}'), ()), + (chars!('\u{acb}'..='\u{acc}'), ()), + (chars!('\u{ad0}'..='\u{ad0}'), ()), + (chars!('\u{ae0}'..='\u{ae3}'), ()), + (chars!('\u{af9}'..='\u{afc}'), ()), + (chars!('\u{b01}'..='\u{b03}'), ()), + (chars!('\u{b05}'..='\u{b0c}'), ()), + (chars!('\u{b0f}'..='\u{b10}'), ()), + (chars!('\u{b13}'..='\u{b28}'), ()), + (chars!('\u{b2a}'..='\u{b30}'), ()), + (chars!('\u{b32}'..='\u{b33}'), ()), + (chars!('\u{b35}'..='\u{b39}'), ()), + (chars!('\u{b3d}'..='\u{b44}'), ()), + (chars!('\u{b47}'..='\u{b48}'), ()), + (chars!('\u{b4b}'..='\u{b4c}'), ()), + (chars!('\u{b56}'..='\u{b57}'), ()), + (chars!('\u{b5c}'..='\u{b5d}'), ()), + (chars!('\u{b5f}'..='\u{b63}'), ()), + (chars!('\u{b71}'..='\u{b71}'), ()), + (chars!('\u{b82}'..='\u{b83}'), ()), + (chars!('\u{b85}'..='\u{b8a}'), ()), + (chars!('\u{b8e}'..='\u{b90}'), ()), + (chars!('\u{b92}'..='\u{b95}'), ()), + (chars!('\u{b99}'..='\u{b9a}'), ()), + (chars!('\u{b9c}'..='\u{b9c}'), ()), + (chars!('\u{b9e}'..='\u{b9f}'), ()), + (chars!('\u{ba3}'..='\u{ba4}'), ()), + (chars!('\u{ba8}'..='\u{baa}'), ()), + (chars!('\u{bae}'..='\u{bb9}'), ()), + (chars!('\u{bbe}'..='\u{bc2}'), ()), + (chars!('\u{bc6}'..='\u{bc8}'), ()), + (chars!('\u{bca}'..='\u{bcc}'), ()), + (chars!('\u{bd0}'..='\u{bd0}'), ()), + (chars!('\u{bd7}'..='\u{bd7}'), ()), + (chars!('\u{c00}'..='\u{c03}'), ()), + (chars!('\u{c05}'..='\u{c0c}'), ()), + (chars!('\u{c0e}'..='\u{c10}'), ()), + (chars!('\u{c12}'..='\u{c28}'), ()), + (chars!('\u{c2a}'..='\u{c39}'), ()), + (chars!('\u{c3d}'..='\u{c44}'), ()), + (chars!('\u{c46}'..='\u{c48}'), ()), + (chars!('\u{c4a}'..='\u{c4c}'), ()), + (chars!('\u{c55}'..='\u{c56}'), ()), + (chars!('\u{c58}'..='\u{c5a}'), ()), + (chars!('\u{c60}'..='\u{c63}'), ()), + (chars!('\u{c80}'..='\u{c83}'), ()), + (chars!('\u{c85}'..='\u{c8c}'), ()), + (chars!('\u{c8e}'..='\u{c90}'), ()), + (chars!('\u{c92}'..='\u{ca8}'), ()), + (chars!('\u{caa}'..='\u{cb3}'), ()), + (chars!('\u{cb5}'..='\u{cb9}'), ()), + (chars!('\u{cbd}'..='\u{cc4}'), ()), + (chars!('\u{cc6}'..='\u{cc8}'), ()), + (chars!('\u{cca}'..='\u{ccc}'), ()), + (chars!('\u{cd5}'..='\u{cd6}'), ()), + (chars!('\u{cde}'..='\u{cde}'), ()), + (chars!('\u{ce0}'..='\u{ce3}'), ()), + (chars!('\u{cf1}'..='\u{cf2}'), ()), + (chars!('\u{d00}'..='\u{d03}'), ()), + (chars!('\u{d05}'..='\u{d0c}'), ()), + (chars!('\u{d0e}'..='\u{d10}'), ()), + (chars!('\u{d12}'..='\u{d3a}'), ()), + (chars!('\u{d3d}'..='\u{d44}'), ()), + (chars!('\u{d46}'..='\u{d48}'), ()), + (chars!('\u{d4a}'..='\u{d4c}'), ()), + (chars!('\u{d4e}'..='\u{d4e}'), ()), + (chars!('\u{d54}'..='\u{d57}'), ()), + (chars!('\u{d5f}'..='\u{d63}'), ()), + (chars!('\u{d7a}'..='\u{d7f}'), ()), + (chars!('\u{d82}'..='\u{d83}'), ()), + (chars!('\u{d85}'..='\u{d96}'), ()), + (chars!('\u{d9a}'..='\u{db1}'), ()), + (chars!('\u{db3}'..='\u{dbb}'), ()), + (chars!('\u{dbd}'..='\u{dbd}'), ()), + (chars!('\u{dc0}'..='\u{dc6}'), ()), + (chars!('\u{dcf}'..='\u{dd4}'), ()), + (chars!('\u{dd6}'..='\u{dd6}'), ()), + (chars!('\u{dd8}'..='\u{ddf}'), ()), + (chars!('\u{df2}'..='\u{df3}'), ()), + (chars!('\u{e01}'..='\u{e3a}'), ()), + (chars!('\u{e40}'..='\u{e46}'), ()), + (chars!('\u{e4d}'..='\u{e4d}'), ()), + (chars!('\u{e81}'..='\u{e82}'), ()), + (chars!('\u{e84}'..='\u{e84}'), ()), + (chars!('\u{e87}'..='\u{e88}'), ()), + (chars!('\u{e8a}'..='\u{e8a}'), ()), + (chars!('\u{e8d}'..='\u{e8d}'), ()), + (chars!('\u{e94}'..='\u{e97}'), ()), + (chars!('\u{e99}'..='\u{e9f}'), ()), + (chars!('\u{ea1}'..='\u{ea3}'), ()), + (chars!('\u{ea5}'..='\u{ea5}'), ()), + (chars!('\u{ea7}'..='\u{ea7}'), ()), + (chars!('\u{eaa}'..='\u{eab}'), ()), + (chars!('\u{ead}'..='\u{eb9}'), ()), + (chars!('\u{ebb}'..='\u{ebd}'), ()), + (chars!('\u{ec0}'..='\u{ec4}'), ()), + (chars!('\u{ec6}'..='\u{ec6}'), ()), + (chars!('\u{ecd}'..='\u{ecd}'), ()), + (chars!('\u{edc}'..='\u{edf}'), ()), + (chars!('\u{f00}'..='\u{f00}'), ()), + (chars!('\u{f40}'..='\u{f47}'), ()), + (chars!('\u{f49}'..='\u{f6c}'), ()), + (chars!('\u{f71}'..='\u{f81}'), ()), + (chars!('\u{f88}'..='\u{f97}'), ()), + (chars!('\u{f99}'..='\u{fbc}'), ()), + (chars!('\u{1000}'..='\u{1036}'), ()), + (chars!('\u{1038}'..='\u{1038}'), ()), + (chars!('\u{103b}'..='\u{103f}'), ()), + (chars!('\u{1050}'..='\u{1062}'), ()), + (chars!('\u{1065}'..='\u{1068}'), ()), + (chars!('\u{106e}'..='\u{1086}'), ()), + (chars!('\u{108e}'..='\u{108e}'), ()), + (chars!('\u{109c}'..='\u{109d}'), ()), + (chars!('\u{10a0}'..='\u{10c5}'), ()), + (chars!('\u{10c7}'..='\u{10c7}'), ()), + (chars!('\u{10cd}'..='\u{10cd}'), ()), + (chars!('\u{10d0}'..='\u{10fa}'), ()), + (chars!('\u{10fc}'..='\u{1248}'), ()), + (chars!('\u{124a}'..='\u{124d}'), ()), + (chars!('\u{1250}'..='\u{1256}'), ()), + (chars!('\u{1258}'..='\u{1258}'), ()), + (chars!('\u{125a}'..='\u{125d}'), ()), + (chars!('\u{1260}'..='\u{1288}'), ()), + (chars!('\u{128a}'..='\u{128d}'), ()), + (chars!('\u{1290}'..='\u{12b0}'), ()), + (chars!('\u{12b2}'..='\u{12b5}'), ()), + (chars!('\u{12b8}'..='\u{12be}'), ()), + (chars!('\u{12c0}'..='\u{12c0}'), ()), + (chars!('\u{12c2}'..='\u{12c5}'), ()), + (chars!('\u{12c8}'..='\u{12d6}'), ()), + (chars!('\u{12d8}'..='\u{1310}'), ()), + (chars!('\u{1312}'..='\u{1315}'), ()), + (chars!('\u{1318}'..='\u{135a}'), ()), + (chars!('\u{135f}'..='\u{135f}'), ()), + (chars!('\u{1380}'..='\u{138f}'), ()), + (chars!('\u{13a0}'..='\u{13f5}'), ()), + (chars!('\u{13f8}'..='\u{13fd}'), ()), + (chars!('\u{1401}'..='\u{166c}'), ()), + (chars!('\u{166f}'..='\u{167f}'), ()), + (chars!('\u{1681}'..='\u{169a}'), ()), + (chars!('\u{16a0}'..='\u{16ea}'), ()), + (chars!('\u{16ee}'..='\u{16f8}'), ()), + (chars!('\u{1700}'..='\u{170c}'), ()), + (chars!('\u{170e}'..='\u{1713}'), ()), + (chars!('\u{1720}'..='\u{1733}'), ()), + (chars!('\u{1740}'..='\u{1753}'), ()), + (chars!('\u{1760}'..='\u{176c}'), ()), + (chars!('\u{176e}'..='\u{1770}'), ()), + (chars!('\u{1772}'..='\u{1773}'), ()), + (chars!('\u{1780}'..='\u{17b3}'), ()), + (chars!('\u{17b6}'..='\u{17c8}'), ()), + (chars!('\u{17d7}'..='\u{17d7}'), ()), + (chars!('\u{17dc}'..='\u{17dc}'), ()), + (chars!('\u{1820}'..='\u{1877}'), ()), + (chars!('\u{1880}'..='\u{18aa}'), ()), + (chars!('\u{18b0}'..='\u{18f5}'), ()), + (chars!('\u{1900}'..='\u{191e}'), ()), + (chars!('\u{1920}'..='\u{192b}'), ()), + (chars!('\u{1930}'..='\u{1938}'), ()), + (chars!('\u{1950}'..='\u{196d}'), ()), + (chars!('\u{1970}'..='\u{1974}'), ()), + (chars!('\u{1980}'..='\u{19ab}'), ()), + (chars!('\u{19b0}'..='\u{19c9}'), ()), + (chars!('\u{1a00}'..='\u{1a1b}'), ()), + (chars!('\u{1a20}'..='\u{1a5e}'), ()), + (chars!('\u{1a61}'..='\u{1a74}'), ()), + (chars!('\u{1aa7}'..='\u{1aa7}'), ()), + (chars!('\u{1b00}'..='\u{1b33}'), ()), + (chars!('\u{1b35}'..='\u{1b43}'), ()), + (chars!('\u{1b45}'..='\u{1b4b}'), ()), + (chars!('\u{1b80}'..='\u{1ba9}'), ()), + (chars!('\u{1bac}'..='\u{1baf}'), ()), + (chars!('\u{1bba}'..='\u{1be5}'), ()), + (chars!('\u{1be7}'..='\u{1bf1}'), ()), + (chars!('\u{1c00}'..='\u{1c35}'), ()), + (chars!('\u{1c4d}'..='\u{1c4f}'), ()), + (chars!('\u{1c5a}'..='\u{1c7d}'), ()), + (chars!('\u{1c80}'..='\u{1c88}'), ()), + (chars!('\u{1ce9}'..='\u{1cec}'), ()), + (chars!('\u{1cee}'..='\u{1cf3}'), ()), + (chars!('\u{1cf5}'..='\u{1cf6}'), ()), + (chars!('\u{1d00}'..='\u{1dbf}'), ()), + (chars!('\u{1de7}'..='\u{1df4}'), ()), + (chars!('\u{1e00}'..='\u{1f15}'), ()), + (chars!('\u{1f18}'..='\u{1f1d}'), ()), + (chars!('\u{1f20}'..='\u{1f45}'), ()), + (chars!('\u{1f48}'..='\u{1f4d}'), ()), + (chars!('\u{1f50}'..='\u{1f57}'), ()), + (chars!('\u{1f59}'..='\u{1f59}'), ()), + (chars!('\u{1f5b}'..='\u{1f5b}'), ()), + (chars!('\u{1f5d}'..='\u{1f5d}'), ()), + (chars!('\u{1f5f}'..='\u{1f7d}'), ()), + (chars!('\u{1f80}'..='\u{1fb4}'), ()), + (chars!('\u{1fb6}'..='\u{1fbc}'), ()), + (chars!('\u{1fbe}'..='\u{1fbe}'), ()), + (chars!('\u{1fc2}'..='\u{1fc4}'), ()), + (chars!('\u{1fc6}'..='\u{1fcc}'), ()), + (chars!('\u{1fd0}'..='\u{1fd3}'), ()), + (chars!('\u{1fd6}'..='\u{1fdb}'), ()), + (chars!('\u{1fe0}'..='\u{1fec}'), ()), + (chars!('\u{1ff2}'..='\u{1ff4}'), ()), + (chars!('\u{1ff6}'..='\u{1ffc}'), ()), + (chars!('\u{2071}'..='\u{2071}'), ()), + (chars!('\u{207f}'..='\u{207f}'), ()), + (chars!('\u{2090}'..='\u{209c}'), ()), + (chars!('\u{2102}'..='\u{2102}'), ()), + (chars!('\u{2107}'..='\u{2107}'), ()), + (chars!('\u{210a}'..='\u{2113}'), ()), + (chars!('\u{2115}'..='\u{2115}'), ()), + (chars!('\u{2119}'..='\u{211d}'), ()), + (chars!('\u{2124}'..='\u{2124}'), ()), + (chars!('\u{2126}'..='\u{2126}'), ()), + (chars!('\u{2128}'..='\u{2128}'), ()), + (chars!('\u{212a}'..='\u{212d}'), ()), + (chars!('\u{212f}'..='\u{2139}'), ()), + (chars!('\u{213c}'..='\u{213f}'), ()), + (chars!('\u{2145}'..='\u{2149}'), ()), + (chars!('\u{214e}'..='\u{214e}'), ()), + (chars!('\u{2160}'..='\u{2188}'), ()), + (chars!('\u{24b6}'..='\u{24e9}'), ()), + (chars!('\u{2c00}'..='\u{2c2e}'), ()), + (chars!('\u{2c30}'..='\u{2c5e}'), ()), + (chars!('\u{2c60}'..='\u{2ce4}'), ()), + (chars!('\u{2ceb}'..='\u{2cee}'), ()), + (chars!('\u{2cf2}'..='\u{2cf3}'), ()), + (chars!('\u{2d00}'..='\u{2d25}'), ()), + (chars!('\u{2d27}'..='\u{2d27}'), ()), + (chars!('\u{2d2d}'..='\u{2d2d}'), ()), + (chars!('\u{2d30}'..='\u{2d67}'), ()), + (chars!('\u{2d6f}'..='\u{2d6f}'), ()), + (chars!('\u{2d80}'..='\u{2d96}'), ()), + (chars!('\u{2da0}'..='\u{2da6}'), ()), + (chars!('\u{2da8}'..='\u{2dae}'), ()), + (chars!('\u{2db0}'..='\u{2db6}'), ()), + (chars!('\u{2db8}'..='\u{2dbe}'), ()), + (chars!('\u{2dc0}'..='\u{2dc6}'), ()), + (chars!('\u{2dc8}'..='\u{2dce}'), ()), + (chars!('\u{2dd0}'..='\u{2dd6}'), ()), + (chars!('\u{2dd8}'..='\u{2dde}'), ()), + (chars!('\u{2de0}'..='\u{2dff}'), ()), + (chars!('\u{2e2f}'..='\u{2e2f}'), ()), + (chars!('\u{3005}'..='\u{3007}'), ()), + (chars!('\u{3021}'..='\u{3029}'), ()), + (chars!('\u{3031}'..='\u{3035}'), ()), + (chars!('\u{3038}'..='\u{303c}'), ()), + (chars!('\u{3041}'..='\u{3096}'), ()), + (chars!('\u{309d}'..='\u{309f}'), ()), + (chars!('\u{30a1}'..='\u{30fa}'), ()), + (chars!('\u{30fc}'..='\u{30ff}'), ()), + (chars!('\u{3105}'..='\u{312e}'), ()), + (chars!('\u{3131}'..='\u{318e}'), ()), + (chars!('\u{31a0}'..='\u{31ba}'), ()), + (chars!('\u{31f0}'..='\u{31ff}'), ()), + (chars!('\u{3400}'..='\u{4db5}'), ()), + (chars!('\u{4e00}'..='\u{9fea}'), ()), + (chars!('\u{a000}'..='\u{a48c}'), ()), + (chars!('\u{a4d0}'..='\u{a4fd}'), ()), + (chars!('\u{a500}'..='\u{a60c}'), ()), + (chars!('\u{a610}'..='\u{a61f}'), ()), + (chars!('\u{a62a}'..='\u{a62b}'), ()), + (chars!('\u{a640}'..='\u{a66e}'), ()), + (chars!('\u{a674}'..='\u{a67b}'), ()), + (chars!('\u{a67f}'..='\u{a6ef}'), ()), + (chars!('\u{a717}'..='\u{a71f}'), ()), + (chars!('\u{a722}'..='\u{a788}'), ()), + (chars!('\u{a78b}'..='\u{a7ae}'), ()), + (chars!('\u{a7b0}'..='\u{a7b7}'), ()), + (chars!('\u{a7f7}'..='\u{a801}'), ()), + (chars!('\u{a803}'..='\u{a805}'), ()), + (chars!('\u{a807}'..='\u{a80a}'), ()), + (chars!('\u{a80c}'..='\u{a827}'), ()), + (chars!('\u{a840}'..='\u{a873}'), ()), + (chars!('\u{a880}'..='\u{a8c3}'), ()), + (chars!('\u{a8c5}'..='\u{a8c5}'), ()), + (chars!('\u{a8f2}'..='\u{a8f7}'), ()), + (chars!('\u{a8fb}'..='\u{a8fb}'), ()), + (chars!('\u{a8fd}'..='\u{a8fd}'), ()), + (chars!('\u{a90a}'..='\u{a92a}'), ()), + (chars!('\u{a930}'..='\u{a952}'), ()), + (chars!('\u{a960}'..='\u{a97c}'), ()), + (chars!('\u{a980}'..='\u{a9b2}'), ()), + (chars!('\u{a9b4}'..='\u{a9bf}'), ()), + (chars!('\u{a9cf}'..='\u{a9cf}'), ()), + (chars!('\u{a9e0}'..='\u{a9e4}'), ()), + (chars!('\u{a9e6}'..='\u{a9ef}'), ()), + (chars!('\u{a9fa}'..='\u{a9fe}'), ()), + (chars!('\u{aa00}'..='\u{aa36}'), ()), + (chars!('\u{aa40}'..='\u{aa4d}'), ()), + (chars!('\u{aa60}'..='\u{aa76}'), ()), + (chars!('\u{aa7a}'..='\u{aa7a}'), ()), + (chars!('\u{aa7e}'..='\u{aabe}'), ()), + (chars!('\u{aac0}'..='\u{aac0}'), ()), + (chars!('\u{aac2}'..='\u{aac2}'), ()), + (chars!('\u{aadb}'..='\u{aadd}'), ()), + (chars!('\u{aae0}'..='\u{aaef}'), ()), + (chars!('\u{aaf2}'..='\u{aaf5}'), ()), + (chars!('\u{ab01}'..='\u{ab06}'), ()), + (chars!('\u{ab09}'..='\u{ab0e}'), ()), + (chars!('\u{ab11}'..='\u{ab16}'), ()), + (chars!('\u{ab20}'..='\u{ab26}'), ()), + (chars!('\u{ab28}'..='\u{ab2e}'), ()), + (chars!('\u{ab30}'..='\u{ab5a}'), ()), + (chars!('\u{ab5c}'..='\u{ab65}'), ()), + (chars!('\u{ab70}'..='\u{abea}'), ()), + (chars!('\u{ac00}'..='\u{d7a3}'), ()), + (chars!('\u{d7b0}'..='\u{d7c6}'), ()), + (chars!('\u{d7cb}'..='\u{d7fb}'), ()), + (chars!('\u{f900}'..='\u{fa6d}'), ()), + (chars!('\u{fa70}'..='\u{fad9}'), ()), + (chars!('\u{fb00}'..='\u{fb06}'), ()), + (chars!('\u{fb13}'..='\u{fb17}'), ()), + (chars!('\u{fb1d}'..='\u{fb28}'), ()), + (chars!('\u{fb2a}'..='\u{fb36}'), ()), + (chars!('\u{fb38}'..='\u{fb3c}'), ()), + (chars!('\u{fb3e}'..='\u{fb3e}'), ()), + (chars!('\u{fb40}'..='\u{fb41}'), ()), + (chars!('\u{fb43}'..='\u{fb44}'), ()), + (chars!('\u{fb46}'..='\u{fbb1}'), ()), + (chars!('\u{fbd3}'..='\u{fd3d}'), ()), + (chars!('\u{fd50}'..='\u{fd8f}'), ()), + (chars!('\u{fd92}'..='\u{fdc7}'), ()), + (chars!('\u{fdf0}'..='\u{fdfb}'), ()), + (chars!('\u{fe70}'..='\u{fe74}'), ()), + (chars!('\u{fe76}'..='\u{fefc}'), ()), + (chars!('\u{ff21}'..='\u{ff3a}'), ()), + (chars!('\u{ff41}'..='\u{ff5a}'), ()), + (chars!('\u{ff66}'..='\u{ffbe}'), ()), + (chars!('\u{ffc2}'..='\u{ffc7}'), ()), + (chars!('\u{ffca}'..='\u{ffcf}'), ()), + (chars!('\u{ffd2}'..='\u{ffd7}'), ()), + (chars!('\u{ffda}'..='\u{ffdc}'), ()), + (chars!('\u{10000}'..='\u{1000b}'), ()), + (chars!('\u{1000d}'..='\u{10026}'), ()), + (chars!('\u{10028}'..='\u{1003a}'), ()), + (chars!('\u{1003c}'..='\u{1003d}'), ()), + (chars!('\u{1003f}'..='\u{1004d}'), ()), + (chars!('\u{10050}'..='\u{1005d}'), ()), + (chars!('\u{10080}'..='\u{100fa}'), ()), + (chars!('\u{10140}'..='\u{10174}'), ()), + (chars!('\u{10280}'..='\u{1029c}'), ()), + (chars!('\u{102a0}'..='\u{102d0}'), ()), + (chars!('\u{10300}'..='\u{1031f}'), ()), + (chars!('\u{1032d}'..='\u{1034a}'), ()), + (chars!('\u{10350}'..='\u{1037a}'), ()), + (chars!('\u{10380}'..='\u{1039d}'), ()), + (chars!('\u{103a0}'..='\u{103c3}'), ()), + (chars!('\u{103c8}'..='\u{103cf}'), ()), + (chars!('\u{103d1}'..='\u{103d5}'), ()), + (chars!('\u{10400}'..='\u{1049d}'), ()), + (chars!('\u{104b0}'..='\u{104d3}'), ()), + (chars!('\u{104d8}'..='\u{104fb}'), ()), + (chars!('\u{10500}'..='\u{10527}'), ()), + (chars!('\u{10530}'..='\u{10563}'), ()), + (chars!('\u{10600}'..='\u{10736}'), ()), + (chars!('\u{10740}'..='\u{10755}'), ()), + (chars!('\u{10760}'..='\u{10767}'), ()), + (chars!('\u{10800}'..='\u{10805}'), ()), + (chars!('\u{10808}'..='\u{10808}'), ()), + (chars!('\u{1080a}'..='\u{10835}'), ()), + (chars!('\u{10837}'..='\u{10838}'), ()), + (chars!('\u{1083c}'..='\u{1083c}'), ()), + (chars!('\u{1083f}'..='\u{10855}'), ()), + (chars!('\u{10860}'..='\u{10876}'), ()), + (chars!('\u{10880}'..='\u{1089e}'), ()), + (chars!('\u{108e0}'..='\u{108f2}'), ()), + (chars!('\u{108f4}'..='\u{108f5}'), ()), + (chars!('\u{10900}'..='\u{10915}'), ()), + (chars!('\u{10920}'..='\u{10939}'), ()), + (chars!('\u{10980}'..='\u{109b7}'), ()), + (chars!('\u{109be}'..='\u{109bf}'), ()), + (chars!('\u{10a00}'..='\u{10a03}'), ()), + (chars!('\u{10a05}'..='\u{10a06}'), ()), + (chars!('\u{10a0c}'..='\u{10a13}'), ()), + (chars!('\u{10a15}'..='\u{10a17}'), ()), + (chars!('\u{10a19}'..='\u{10a33}'), ()), + (chars!('\u{10a60}'..='\u{10a7c}'), ()), + (chars!('\u{10a80}'..='\u{10a9c}'), ()), + (chars!('\u{10ac0}'..='\u{10ac7}'), ()), + (chars!('\u{10ac9}'..='\u{10ae4}'), ()), + (chars!('\u{10b00}'..='\u{10b35}'), ()), + (chars!('\u{10b40}'..='\u{10b55}'), ()), + (chars!('\u{10b60}'..='\u{10b72}'), ()), + (chars!('\u{10b80}'..='\u{10b91}'), ()), + (chars!('\u{10c00}'..='\u{10c48}'), ()), + (chars!('\u{10c80}'..='\u{10cb2}'), ()), + (chars!('\u{10cc0}'..='\u{10cf2}'), ()), + (chars!('\u{11000}'..='\u{11045}'), ()), + (chars!('\u{11082}'..='\u{110b8}'), ()), + (chars!('\u{110d0}'..='\u{110e8}'), ()), + (chars!('\u{11100}'..='\u{11132}'), ()), + (chars!('\u{11150}'..='\u{11172}'), ()), + (chars!('\u{11176}'..='\u{11176}'), ()), + (chars!('\u{11180}'..='\u{111bf}'), ()), + (chars!('\u{111c1}'..='\u{111c4}'), ()), + (chars!('\u{111da}'..='\u{111da}'), ()), + (chars!('\u{111dc}'..='\u{111dc}'), ()), + (chars!('\u{11200}'..='\u{11211}'), ()), + (chars!('\u{11213}'..='\u{11234}'), ()), + (chars!('\u{11237}'..='\u{11237}'), ()), + (chars!('\u{1123e}'..='\u{1123e}'), ()), + (chars!('\u{11280}'..='\u{11286}'), ()), + (chars!('\u{11288}'..='\u{11288}'), ()), + (chars!('\u{1128a}'..='\u{1128d}'), ()), + (chars!('\u{1128f}'..='\u{1129d}'), ()), + (chars!('\u{1129f}'..='\u{112a8}'), ()), + (chars!('\u{112b0}'..='\u{112e8}'), ()), + (chars!('\u{11300}'..='\u{11303}'), ()), + (chars!('\u{11305}'..='\u{1130c}'), ()), + (chars!('\u{1130f}'..='\u{11310}'), ()), + (chars!('\u{11313}'..='\u{11328}'), ()), + (chars!('\u{1132a}'..='\u{11330}'), ()), + (chars!('\u{11332}'..='\u{11333}'), ()), + (chars!('\u{11335}'..='\u{11339}'), ()), + (chars!('\u{1133d}'..='\u{11344}'), ()), + (chars!('\u{11347}'..='\u{11348}'), ()), + (chars!('\u{1134b}'..='\u{1134c}'), ()), + (chars!('\u{11350}'..='\u{11350}'), ()), + (chars!('\u{11357}'..='\u{11357}'), ()), + (chars!('\u{1135d}'..='\u{11363}'), ()), + (chars!('\u{11400}'..='\u{11441}'), ()), + (chars!('\u{11443}'..='\u{11445}'), ()), + (chars!('\u{11447}'..='\u{1144a}'), ()), + (chars!('\u{11480}'..='\u{114c1}'), ()), + (chars!('\u{114c4}'..='\u{114c5}'), ()), + (chars!('\u{114c7}'..='\u{114c7}'), ()), + (chars!('\u{11580}'..='\u{115b5}'), ()), + (chars!('\u{115b8}'..='\u{115be}'), ()), + (chars!('\u{115d8}'..='\u{115dd}'), ()), + (chars!('\u{11600}'..='\u{1163e}'), ()), + (chars!('\u{11640}'..='\u{11640}'), ()), + (chars!('\u{11644}'..='\u{11644}'), ()), + (chars!('\u{11680}'..='\u{116b5}'), ()), + (chars!('\u{11700}'..='\u{11719}'), ()), + (chars!('\u{1171d}'..='\u{1172a}'), ()), + (chars!('\u{118a0}'..='\u{118df}'), ()), + (chars!('\u{118ff}'..='\u{118ff}'), ()), + (chars!('\u{11a00}'..='\u{11a32}'), ()), + (chars!('\u{11a35}'..='\u{11a3e}'), ()), + (chars!('\u{11a50}'..='\u{11a83}'), ()), + (chars!('\u{11a86}'..='\u{11a97}'), ()), + (chars!('\u{11ac0}'..='\u{11af8}'), ()), + (chars!('\u{11c00}'..='\u{11c08}'), ()), + (chars!('\u{11c0a}'..='\u{11c36}'), ()), + (chars!('\u{11c38}'..='\u{11c3e}'), ()), + (chars!('\u{11c40}'..='\u{11c40}'), ()), + (chars!('\u{11c72}'..='\u{11c8f}'), ()), + (chars!('\u{11c92}'..='\u{11ca7}'), ()), + (chars!('\u{11ca9}'..='\u{11cb6}'), ()), + (chars!('\u{11d00}'..='\u{11d06}'), ()), + (chars!('\u{11d08}'..='\u{11d09}'), ()), + (chars!('\u{11d0b}'..='\u{11d36}'), ()), + (chars!('\u{11d3a}'..='\u{11d3a}'), ()), + (chars!('\u{11d3c}'..='\u{11d3d}'), ()), + (chars!('\u{11d3f}'..='\u{11d41}'), ()), + (chars!('\u{11d43}'..='\u{11d43}'), ()), + (chars!('\u{11d46}'..='\u{11d47}'), ()), + (chars!('\u{12000}'..='\u{12399}'), ()), + (chars!('\u{12400}'..='\u{1246e}'), ()), + (chars!('\u{12480}'..='\u{12543}'), ()), + (chars!('\u{13000}'..='\u{1342e}'), ()), + (chars!('\u{14400}'..='\u{14646}'), ()), + (chars!('\u{16800}'..='\u{16a38}'), ()), + (chars!('\u{16a40}'..='\u{16a5e}'), ()), + (chars!('\u{16ad0}'..='\u{16aed}'), ()), + (chars!('\u{16b00}'..='\u{16b36}'), ()), + (chars!('\u{16b40}'..='\u{16b43}'), ()), + (chars!('\u{16b63}'..='\u{16b77}'), ()), + (chars!('\u{16b7d}'..='\u{16b8f}'), ()), + (chars!('\u{16f00}'..='\u{16f44}'), ()), + (chars!('\u{16f50}'..='\u{16f7e}'), ()), + (chars!('\u{16f93}'..='\u{16f9f}'), ()), + (chars!('\u{16fe0}'..='\u{16fe1}'), ()), + (chars!('\u{17000}'..='\u{187ec}'), ()), + (chars!('\u{18800}'..='\u{18af2}'), ()), + (chars!('\u{1b000}'..='\u{1b11e}'), ()), + (chars!('\u{1b170}'..='\u{1b2fb}'), ()), + (chars!('\u{1bc00}'..='\u{1bc6a}'), ()), + (chars!('\u{1bc70}'..='\u{1bc7c}'), ()), + (chars!('\u{1bc80}'..='\u{1bc88}'), ()), + (chars!('\u{1bc90}'..='\u{1bc99}'), ()), + (chars!('\u{1bc9e}'..='\u{1bc9e}'), ()), + (chars!('\u{1d400}'..='\u{1d454}'), ()), + (chars!('\u{1d456}'..='\u{1d49c}'), ()), + (chars!('\u{1d49e}'..='\u{1d49f}'), ()), + (chars!('\u{1d4a2}'..='\u{1d4a2}'), ()), + (chars!('\u{1d4a5}'..='\u{1d4a6}'), ()), + (chars!('\u{1d4a9}'..='\u{1d4ac}'), ()), + (chars!('\u{1d4ae}'..='\u{1d4b9}'), ()), + (chars!('\u{1d4bb}'..='\u{1d4bb}'), ()), + (chars!('\u{1d4bd}'..='\u{1d4c3}'), ()), + (chars!('\u{1d4c5}'..='\u{1d505}'), ()), + (chars!('\u{1d507}'..='\u{1d50a}'), ()), + (chars!('\u{1d50d}'..='\u{1d514}'), ()), + (chars!('\u{1d516}'..='\u{1d51c}'), ()), + (chars!('\u{1d51e}'..='\u{1d539}'), ()), + (chars!('\u{1d53b}'..='\u{1d53e}'), ()), + (chars!('\u{1d540}'..='\u{1d544}'), ()), + (chars!('\u{1d546}'..='\u{1d546}'), ()), + (chars!('\u{1d54a}'..='\u{1d550}'), ()), + (chars!('\u{1d552}'..='\u{1d6a5}'), ()), + (chars!('\u{1d6a8}'..='\u{1d6c0}'), ()), + (chars!('\u{1d6c2}'..='\u{1d6da}'), ()), + (chars!('\u{1d6dc}'..='\u{1d6fa}'), ()), + (chars!('\u{1d6fc}'..='\u{1d714}'), ()), + (chars!('\u{1d716}'..='\u{1d734}'), ()), + (chars!('\u{1d736}'..='\u{1d74e}'), ()), + (chars!('\u{1d750}'..='\u{1d76e}'), ()), + (chars!('\u{1d770}'..='\u{1d788}'), ()), + (chars!('\u{1d78a}'..='\u{1d7a8}'), ()), + (chars!('\u{1d7aa}'..='\u{1d7c2}'), ()), + (chars!('\u{1d7c4}'..='\u{1d7cb}'), ()), + (chars!('\u{1e000}'..='\u{1e006}'), ()), + (chars!('\u{1e008}'..='\u{1e018}'), ()), + (chars!('\u{1e01b}'..='\u{1e021}'), ()), + (chars!('\u{1e023}'..='\u{1e024}'), ()), + (chars!('\u{1e026}'..='\u{1e02a}'), ()), + (chars!('\u{1e800}'..='\u{1e8c4}'), ()), + (chars!('\u{1e900}'..='\u{1e943}'), ()), + (chars!('\u{1e947}'..='\u{1e947}'), ()), + (chars!('\u{1ee00}'..='\u{1ee03}'), ()), + (chars!('\u{1ee05}'..='\u{1ee1f}'), ()), + (chars!('\u{1ee21}'..='\u{1ee22}'), ()), + (chars!('\u{1ee24}'..='\u{1ee24}'), ()), + (chars!('\u{1ee27}'..='\u{1ee27}'), ()), + (chars!('\u{1ee29}'..='\u{1ee32}'), ()), + (chars!('\u{1ee34}'..='\u{1ee37}'), ()), + (chars!('\u{1ee39}'..='\u{1ee39}'), ()), + (chars!('\u{1ee3b}'..='\u{1ee3b}'), ()), + (chars!('\u{1ee42}'..='\u{1ee42}'), ()), + (chars!('\u{1ee47}'..='\u{1ee47}'), ()), + (chars!('\u{1ee49}'..='\u{1ee49}'), ()), + (chars!('\u{1ee4b}'..='\u{1ee4b}'), ()), + (chars!('\u{1ee4d}'..='\u{1ee4f}'), ()), + (chars!('\u{1ee51}'..='\u{1ee52}'), ()), + (chars!('\u{1ee54}'..='\u{1ee54}'), ()), + (chars!('\u{1ee57}'..='\u{1ee57}'), ()), + (chars!('\u{1ee59}'..='\u{1ee59}'), ()), + (chars!('\u{1ee5b}'..='\u{1ee5b}'), ()), + (chars!('\u{1ee5d}'..='\u{1ee5d}'), ()), + (chars!('\u{1ee5f}'..='\u{1ee5f}'), ()), + (chars!('\u{1ee61}'..='\u{1ee62}'), ()), + (chars!('\u{1ee64}'..='\u{1ee64}'), ()), + (chars!('\u{1ee67}'..='\u{1ee6a}'), ()), + (chars!('\u{1ee6c}'..='\u{1ee72}'), ()), + (chars!('\u{1ee74}'..='\u{1ee77}'), ()), + (chars!('\u{1ee79}'..='\u{1ee7c}'), ()), + (chars!('\u{1ee7e}'..='\u{1ee7e}'), ()), + (chars!('\u{1ee80}'..='\u{1ee89}'), ()), + (chars!('\u{1ee8b}'..='\u{1ee9b}'), ()), + (chars!('\u{1eea1}'..='\u{1eea3}'), ()), + (chars!('\u{1eea5}'..='\u{1eea9}'), ()), + (chars!('\u{1eeab}'..='\u{1eebb}'), ()), + (chars!('\u{1f130}'..='\u{1f149}'), ()), + (chars!('\u{1f150}'..='\u{1f169}'), ()), + (chars!('\u{1f170}'..='\u{1f189}'), ()), + (chars!('\u{20000}'..='\u{2a6d6}'), ()), + (chars!('\u{2a700}'..='\u{2b734}'), ()), + (chars!('\u{2b740}'..='\u{2b81d}'), ()), + (chars!('\u{2b820}'..='\u{2cea1}'), ()), + (chars!('\u{2ceb0}'..='\u{2ebe0}'), ()), + (chars!('\u{2f800}'..='\u{2fa1d}'), ()), +]) diff --git a/unic/ucd/common/tables/alphanumeric.rsv b/unic/ucd/common/tables/alphanumeric.rsv new file mode 100644 index 00000000..7157f05c --- /dev/null +++ b/unic/ucd/common/tables/alphanumeric.rsv @@ -0,0 +1,729 @@ +// WARNING: Auto-generated by the `unic-gen` crate. +// WARNING: DO NOT EDIT MANUALLY! +CharDataTable::Range(&[ + (chars!('\u{30}'..='\u{39}'), ()), + (chars!('\u{41}'..='\u{5a}'), ()), + (chars!('\u{61}'..='\u{7a}'), ()), + (chars!('\u{aa}'..='\u{aa}'), ()), + (chars!('\u{b2}'..='\u{b3}'), ()), + (chars!('\u{b5}'..='\u{b5}'), ()), + (chars!('\u{b9}'..='\u{ba}'), ()), + (chars!('\u{bc}'..='\u{be}'), ()), + (chars!('\u{c0}'..='\u{d6}'), ()), + (chars!('\u{d8}'..='\u{f6}'), ()), + (chars!('\u{f8}'..='\u{2c1}'), ()), + (chars!('\u{2c6}'..='\u{2d1}'), ()), + (chars!('\u{2e0}'..='\u{2e4}'), ()), + (chars!('\u{2ec}'..='\u{2ec}'), ()), + (chars!('\u{2ee}'..='\u{2ee}'), ()), + (chars!('\u{345}'..='\u{345}'), ()), + (chars!('\u{370}'..='\u{374}'), ()), + (chars!('\u{376}'..='\u{377}'), ()), + (chars!('\u{37a}'..='\u{37d}'), ()), + (chars!('\u{37f}'..='\u{37f}'), ()), + (chars!('\u{386}'..='\u{386}'), ()), + (chars!('\u{388}'..='\u{38a}'), ()), + (chars!('\u{38c}'..='\u{38c}'), ()), + (chars!('\u{38e}'..='\u{3a1}'), ()), + (chars!('\u{3a3}'..='\u{3f5}'), ()), + (chars!('\u{3f7}'..='\u{481}'), ()), + (chars!('\u{48a}'..='\u{52f}'), ()), + (chars!('\u{531}'..='\u{556}'), ()), + (chars!('\u{559}'..='\u{559}'), ()), + (chars!('\u{561}'..='\u{587}'), ()), + (chars!('\u{5b0}'..='\u{5bd}'), ()), + (chars!('\u{5bf}'..='\u{5bf}'), ()), + (chars!('\u{5c1}'..='\u{5c2}'), ()), + (chars!('\u{5c4}'..='\u{5c5}'), ()), + (chars!('\u{5c7}'..='\u{5c7}'), ()), + (chars!('\u{5d0}'..='\u{5ea}'), ()), + (chars!('\u{5f0}'..='\u{5f2}'), ()), + (chars!('\u{610}'..='\u{61a}'), ()), + (chars!('\u{620}'..='\u{657}'), ()), + (chars!('\u{659}'..='\u{669}'), ()), + (chars!('\u{66e}'..='\u{6d3}'), ()), + (chars!('\u{6d5}'..='\u{6dc}'), ()), + (chars!('\u{6e1}'..='\u{6e8}'), ()), + (chars!('\u{6ed}'..='\u{6fc}'), ()), + (chars!('\u{6ff}'..='\u{6ff}'), ()), + (chars!('\u{710}'..='\u{73f}'), ()), + (chars!('\u{74d}'..='\u{7b1}'), ()), + (chars!('\u{7c0}'..='\u{7ea}'), ()), + (chars!('\u{7f4}'..='\u{7f5}'), ()), + (chars!('\u{7fa}'..='\u{7fa}'), ()), + (chars!('\u{800}'..='\u{817}'), ()), + (chars!('\u{81a}'..='\u{82c}'), ()), + (chars!('\u{840}'..='\u{858}'), ()), + (chars!('\u{860}'..='\u{86a}'), ()), + (chars!('\u{8a0}'..='\u{8b4}'), ()), + (chars!('\u{8b6}'..='\u{8bd}'), ()), + (chars!('\u{8d4}'..='\u{8df}'), ()), + (chars!('\u{8e3}'..='\u{8e9}'), ()), + (chars!('\u{8f0}'..='\u{93b}'), ()), + (chars!('\u{93d}'..='\u{94c}'), ()), + (chars!('\u{94e}'..='\u{950}'), ()), + (chars!('\u{955}'..='\u{963}'), ()), + (chars!('\u{966}'..='\u{96f}'), ()), + (chars!('\u{971}'..='\u{983}'), ()), + (chars!('\u{985}'..='\u{98c}'), ()), + (chars!('\u{98f}'..='\u{990}'), ()), + (chars!('\u{993}'..='\u{9a8}'), ()), + (chars!('\u{9aa}'..='\u{9b0}'), ()), + (chars!('\u{9b2}'..='\u{9b2}'), ()), + (chars!('\u{9b6}'..='\u{9b9}'), ()), + (chars!('\u{9bd}'..='\u{9c4}'), ()), + (chars!('\u{9c7}'..='\u{9c8}'), ()), + (chars!('\u{9cb}'..='\u{9cc}'), ()), + (chars!('\u{9ce}'..='\u{9ce}'), ()), + (chars!('\u{9d7}'..='\u{9d7}'), ()), + (chars!('\u{9dc}'..='\u{9dd}'), ()), + (chars!('\u{9df}'..='\u{9e3}'), ()), + (chars!('\u{9e6}'..='\u{9f1}'), ()), + (chars!('\u{9f4}'..='\u{9f9}'), ()), + (chars!('\u{9fc}'..='\u{9fc}'), ()), + (chars!('\u{a01}'..='\u{a03}'), ()), + (chars!('\u{a05}'..='\u{a0a}'), ()), + (chars!('\u{a0f}'..='\u{a10}'), ()), + (chars!('\u{a13}'..='\u{a28}'), ()), + (chars!('\u{a2a}'..='\u{a30}'), ()), + (chars!('\u{a32}'..='\u{a33}'), ()), + (chars!('\u{a35}'..='\u{a36}'), ()), + (chars!('\u{a38}'..='\u{a39}'), ()), + (chars!('\u{a3e}'..='\u{a42}'), ()), + (chars!('\u{a47}'..='\u{a48}'), ()), + (chars!('\u{a4b}'..='\u{a4c}'), ()), + (chars!('\u{a51}'..='\u{a51}'), ()), + (chars!('\u{a59}'..='\u{a5c}'), ()), + (chars!('\u{a5e}'..='\u{a5e}'), ()), + (chars!('\u{a66}'..='\u{a75}'), ()), + (chars!('\u{a81}'..='\u{a83}'), ()), + (chars!('\u{a85}'..='\u{a8d}'), ()), + (chars!('\u{a8f}'..='\u{a91}'), ()), + (chars!('\u{a93}'..='\u{aa8}'), ()), + (chars!('\u{aaa}'..='\u{ab0}'), ()), + (chars!('\u{ab2}'..='\u{ab3}'), ()), + (chars!('\u{ab5}'..='\u{ab9}'), ()), + (chars!('\u{abd}'..='\u{ac5}'), ()), + (chars!('\u{ac7}'..='\u{ac9}'), ()), + (chars!('\u{acb}'..='\u{acc}'), ()), + (chars!('\u{ad0}'..='\u{ad0}'), ()), + (chars!('\u{ae0}'..='\u{ae3}'), ()), + (chars!('\u{ae6}'..='\u{aef}'), ()), + (chars!('\u{af9}'..='\u{afc}'), ()), + (chars!('\u{b01}'..='\u{b03}'), ()), + (chars!('\u{b05}'..='\u{b0c}'), ()), + (chars!('\u{b0f}'..='\u{b10}'), ()), + (chars!('\u{b13}'..='\u{b28}'), ()), + (chars!('\u{b2a}'..='\u{b30}'), ()), + (chars!('\u{b32}'..='\u{b33}'), ()), + (chars!('\u{b35}'..='\u{b39}'), ()), + (chars!('\u{b3d}'..='\u{b44}'), ()), + (chars!('\u{b47}'..='\u{b48}'), ()), + (chars!('\u{b4b}'..='\u{b4c}'), ()), + (chars!('\u{b56}'..='\u{b57}'), ()), + (chars!('\u{b5c}'..='\u{b5d}'), ()), + (chars!('\u{b5f}'..='\u{b63}'), ()), + (chars!('\u{b66}'..='\u{b6f}'), ()), + (chars!('\u{b71}'..='\u{b77}'), ()), + (chars!('\u{b82}'..='\u{b83}'), ()), + (chars!('\u{b85}'..='\u{b8a}'), ()), + (chars!('\u{b8e}'..='\u{b90}'), ()), + (chars!('\u{b92}'..='\u{b95}'), ()), + (chars!('\u{b99}'..='\u{b9a}'), ()), + (chars!('\u{b9c}'..='\u{b9c}'), ()), + (chars!('\u{b9e}'..='\u{b9f}'), ()), + (chars!('\u{ba3}'..='\u{ba4}'), ()), + (chars!('\u{ba8}'..='\u{baa}'), ()), + (chars!('\u{bae}'..='\u{bb9}'), ()), + (chars!('\u{bbe}'..='\u{bc2}'), ()), + (chars!('\u{bc6}'..='\u{bc8}'), ()), + (chars!('\u{bca}'..='\u{bcc}'), ()), + (chars!('\u{bd0}'..='\u{bd0}'), ()), + (chars!('\u{bd7}'..='\u{bd7}'), ()), + (chars!('\u{be6}'..='\u{bf2}'), ()), + (chars!('\u{c00}'..='\u{c03}'), ()), + (chars!('\u{c05}'..='\u{c0c}'), ()), + (chars!('\u{c0e}'..='\u{c10}'), ()), + (chars!('\u{c12}'..='\u{c28}'), ()), + (chars!('\u{c2a}'..='\u{c39}'), ()), + (chars!('\u{c3d}'..='\u{c44}'), ()), + (chars!('\u{c46}'..='\u{c48}'), ()), + (chars!('\u{c4a}'..='\u{c4c}'), ()), + (chars!('\u{c55}'..='\u{c56}'), ()), + (chars!('\u{c58}'..='\u{c5a}'), ()), + (chars!('\u{c60}'..='\u{c63}'), ()), + (chars!('\u{c66}'..='\u{c6f}'), ()), + (chars!('\u{c78}'..='\u{c7e}'), ()), + (chars!('\u{c80}'..='\u{c83}'), ()), + (chars!('\u{c85}'..='\u{c8c}'), ()), + (chars!('\u{c8e}'..='\u{c90}'), ()), + (chars!('\u{c92}'..='\u{ca8}'), ()), + (chars!('\u{caa}'..='\u{cb3}'), ()), + (chars!('\u{cb5}'..='\u{cb9}'), ()), + (chars!('\u{cbd}'..='\u{cc4}'), ()), + (chars!('\u{cc6}'..='\u{cc8}'), ()), + (chars!('\u{cca}'..='\u{ccc}'), ()), + (chars!('\u{cd5}'..='\u{cd6}'), ()), + (chars!('\u{cde}'..='\u{cde}'), ()), + (chars!('\u{ce0}'..='\u{ce3}'), ()), + (chars!('\u{ce6}'..='\u{cef}'), ()), + (chars!('\u{cf1}'..='\u{cf2}'), ()), + (chars!('\u{d00}'..='\u{d03}'), ()), + (chars!('\u{d05}'..='\u{d0c}'), ()), + (chars!('\u{d0e}'..='\u{d10}'), ()), + (chars!('\u{d12}'..='\u{d3a}'), ()), + (chars!('\u{d3d}'..='\u{d44}'), ()), + (chars!('\u{d46}'..='\u{d48}'), ()), + (chars!('\u{d4a}'..='\u{d4c}'), ()), + (chars!('\u{d4e}'..='\u{d4e}'), ()), + (chars!('\u{d54}'..='\u{d63}'), ()), + (chars!('\u{d66}'..='\u{d78}'), ()), + (chars!('\u{d7a}'..='\u{d7f}'), ()), + (chars!('\u{d82}'..='\u{d83}'), ()), + (chars!('\u{d85}'..='\u{d96}'), ()), + (chars!('\u{d9a}'..='\u{db1}'), ()), + (chars!('\u{db3}'..='\u{dbb}'), ()), + (chars!('\u{dbd}'..='\u{dbd}'), ()), + (chars!('\u{dc0}'..='\u{dc6}'), ()), + (chars!('\u{dcf}'..='\u{dd4}'), ()), + (chars!('\u{dd6}'..='\u{dd6}'), ()), + (chars!('\u{dd8}'..='\u{ddf}'), ()), + (chars!('\u{de6}'..='\u{def}'), ()), + (chars!('\u{df2}'..='\u{df3}'), ()), + (chars!('\u{e01}'..='\u{e3a}'), ()), + (chars!('\u{e40}'..='\u{e46}'), ()), + (chars!('\u{e4d}'..='\u{e4d}'), ()), + (chars!('\u{e50}'..='\u{e59}'), ()), + (chars!('\u{e81}'..='\u{e82}'), ()), + (chars!('\u{e84}'..='\u{e84}'), ()), + (chars!('\u{e87}'..='\u{e88}'), ()), + (chars!('\u{e8a}'..='\u{e8a}'), ()), + (chars!('\u{e8d}'..='\u{e8d}'), ()), + (chars!('\u{e94}'..='\u{e97}'), ()), + (chars!('\u{e99}'..='\u{e9f}'), ()), + (chars!('\u{ea1}'..='\u{ea3}'), ()), + (chars!('\u{ea5}'..='\u{ea5}'), ()), + (chars!('\u{ea7}'..='\u{ea7}'), ()), + (chars!('\u{eaa}'..='\u{eab}'), ()), + (chars!('\u{ead}'..='\u{eb9}'), ()), + (chars!('\u{ebb}'..='\u{ebd}'), ()), + (chars!('\u{ec0}'..='\u{ec4}'), ()), + (chars!('\u{ec6}'..='\u{ec6}'), ()), + (chars!('\u{ecd}'..='\u{ecd}'), ()), + (chars!('\u{ed0}'..='\u{ed9}'), ()), + (chars!('\u{edc}'..='\u{edf}'), ()), + (chars!('\u{f00}'..='\u{f00}'), ()), + (chars!('\u{f20}'..='\u{f33}'), ()), + (chars!('\u{f40}'..='\u{f47}'), ()), + (chars!('\u{f49}'..='\u{f6c}'), ()), + (chars!('\u{f71}'..='\u{f81}'), ()), + (chars!('\u{f88}'..='\u{f97}'), ()), + (chars!('\u{f99}'..='\u{fbc}'), ()), + (chars!('\u{1000}'..='\u{1036}'), ()), + (chars!('\u{1038}'..='\u{1038}'), ()), + (chars!('\u{103b}'..='\u{1049}'), ()), + (chars!('\u{1050}'..='\u{1062}'), ()), + (chars!('\u{1065}'..='\u{1068}'), ()), + (chars!('\u{106e}'..='\u{1086}'), ()), + (chars!('\u{108e}'..='\u{108e}'), ()), + (chars!('\u{1090}'..='\u{1099}'), ()), + (chars!('\u{109c}'..='\u{109d}'), ()), + (chars!('\u{10a0}'..='\u{10c5}'), ()), + (chars!('\u{10c7}'..='\u{10c7}'), ()), + (chars!('\u{10cd}'..='\u{10cd}'), ()), + (chars!('\u{10d0}'..='\u{10fa}'), ()), + (chars!('\u{10fc}'..='\u{1248}'), ()), + (chars!('\u{124a}'..='\u{124d}'), ()), + (chars!('\u{1250}'..='\u{1256}'), ()), + (chars!('\u{1258}'..='\u{1258}'), ()), + (chars!('\u{125a}'..='\u{125d}'), ()), + (chars!('\u{1260}'..='\u{1288}'), ()), + (chars!('\u{128a}'..='\u{128d}'), ()), + (chars!('\u{1290}'..='\u{12b0}'), ()), + (chars!('\u{12b2}'..='\u{12b5}'), ()), + (chars!('\u{12b8}'..='\u{12be}'), ()), + (chars!('\u{12c0}'..='\u{12c0}'), ()), + (chars!('\u{12c2}'..='\u{12c5}'), ()), + (chars!('\u{12c8}'..='\u{12d6}'), ()), + (chars!('\u{12d8}'..='\u{1310}'), ()), + (chars!('\u{1312}'..='\u{1315}'), ()), + (chars!('\u{1318}'..='\u{135a}'), ()), + (chars!('\u{135f}'..='\u{135f}'), ()), + (chars!('\u{1369}'..='\u{137c}'), ()), + (chars!('\u{1380}'..='\u{138f}'), ()), + (chars!('\u{13a0}'..='\u{13f5}'), ()), + (chars!('\u{13f8}'..='\u{13fd}'), ()), + (chars!('\u{1401}'..='\u{166c}'), ()), + (chars!('\u{166f}'..='\u{167f}'), ()), + (chars!('\u{1681}'..='\u{169a}'), ()), + (chars!('\u{16a0}'..='\u{16ea}'), ()), + (chars!('\u{16ee}'..='\u{16f8}'), ()), + (chars!('\u{1700}'..='\u{170c}'), ()), + (chars!('\u{170e}'..='\u{1713}'), ()), + (chars!('\u{1720}'..='\u{1733}'), ()), + (chars!('\u{1740}'..='\u{1753}'), ()), + (chars!('\u{1760}'..='\u{176c}'), ()), + (chars!('\u{176e}'..='\u{1770}'), ()), + (chars!('\u{1772}'..='\u{1773}'), ()), + (chars!('\u{1780}'..='\u{17b3}'), ()), + (chars!('\u{17b6}'..='\u{17c8}'), ()), + (chars!('\u{17d7}'..='\u{17d7}'), ()), + (chars!('\u{17dc}'..='\u{17dc}'), ()), + (chars!('\u{17e0}'..='\u{17e9}'), ()), + (chars!('\u{17f0}'..='\u{17f9}'), ()), + (chars!('\u{1810}'..='\u{1819}'), ()), + (chars!('\u{1820}'..='\u{1877}'), ()), + (chars!('\u{1880}'..='\u{18aa}'), ()), + (chars!('\u{18b0}'..='\u{18f5}'), ()), + (chars!('\u{1900}'..='\u{191e}'), ()), + (chars!('\u{1920}'..='\u{192b}'), ()), + (chars!('\u{1930}'..='\u{1938}'), ()), + (chars!('\u{1946}'..='\u{196d}'), ()), + (chars!('\u{1970}'..='\u{1974}'), ()), + (chars!('\u{1980}'..='\u{19ab}'), ()), + (chars!('\u{19b0}'..='\u{19c9}'), ()), + (chars!('\u{19d0}'..='\u{19da}'), ()), + (chars!('\u{1a00}'..='\u{1a1b}'), ()), + (chars!('\u{1a20}'..='\u{1a5e}'), ()), + (chars!('\u{1a61}'..='\u{1a74}'), ()), + (chars!('\u{1a80}'..='\u{1a89}'), ()), + (chars!('\u{1a90}'..='\u{1a99}'), ()), + (chars!('\u{1aa7}'..='\u{1aa7}'), ()), + (chars!('\u{1b00}'..='\u{1b33}'), ()), + (chars!('\u{1b35}'..='\u{1b43}'), ()), + (chars!('\u{1b45}'..='\u{1b4b}'), ()), + (chars!('\u{1b50}'..='\u{1b59}'), ()), + (chars!('\u{1b80}'..='\u{1ba9}'), ()), + (chars!('\u{1bac}'..='\u{1be5}'), ()), + (chars!('\u{1be7}'..='\u{1bf1}'), ()), + (chars!('\u{1c00}'..='\u{1c35}'), ()), + (chars!('\u{1c40}'..='\u{1c49}'), ()), + (chars!('\u{1c4d}'..='\u{1c7d}'), ()), + (chars!('\u{1c80}'..='\u{1c88}'), ()), + (chars!('\u{1ce9}'..='\u{1cec}'), ()), + (chars!('\u{1cee}'..='\u{1cf3}'), ()), + (chars!('\u{1cf5}'..='\u{1cf6}'), ()), + (chars!('\u{1d00}'..='\u{1dbf}'), ()), + (chars!('\u{1de7}'..='\u{1df4}'), ()), + (chars!('\u{1e00}'..='\u{1f15}'), ()), + (chars!('\u{1f18}'..='\u{1f1d}'), ()), + (chars!('\u{1f20}'..='\u{1f45}'), ()), + (chars!('\u{1f48}'..='\u{1f4d}'), ()), + (chars!('\u{1f50}'..='\u{1f57}'), ()), + (chars!('\u{1f59}'..='\u{1f59}'), ()), + (chars!('\u{1f5b}'..='\u{1f5b}'), ()), + (chars!('\u{1f5d}'..='\u{1f5d}'), ()), + (chars!('\u{1f5f}'..='\u{1f7d}'), ()), + (chars!('\u{1f80}'..='\u{1fb4}'), ()), + (chars!('\u{1fb6}'..='\u{1fbc}'), ()), + (chars!('\u{1fbe}'..='\u{1fbe}'), ()), + (chars!('\u{1fc2}'..='\u{1fc4}'), ()), + (chars!('\u{1fc6}'..='\u{1fcc}'), ()), + (chars!('\u{1fd0}'..='\u{1fd3}'), ()), + (chars!('\u{1fd6}'..='\u{1fdb}'), ()), + (chars!('\u{1fe0}'..='\u{1fec}'), ()), + (chars!('\u{1ff2}'..='\u{1ff4}'), ()), + (chars!('\u{1ff6}'..='\u{1ffc}'), ()), + (chars!('\u{2070}'..='\u{2071}'), ()), + (chars!('\u{2074}'..='\u{2079}'), ()), + (chars!('\u{207f}'..='\u{2089}'), ()), + (chars!('\u{2090}'..='\u{209c}'), ()), + (chars!('\u{2102}'..='\u{2102}'), ()), + (chars!('\u{2107}'..='\u{2107}'), ()), + (chars!('\u{210a}'..='\u{2113}'), ()), + (chars!('\u{2115}'..='\u{2115}'), ()), + (chars!('\u{2119}'..='\u{211d}'), ()), + (chars!('\u{2124}'..='\u{2124}'), ()), + (chars!('\u{2126}'..='\u{2126}'), ()), + (chars!('\u{2128}'..='\u{2128}'), ()), + (chars!('\u{212a}'..='\u{212d}'), ()), + (chars!('\u{212f}'..='\u{2139}'), ()), + (chars!('\u{213c}'..='\u{213f}'), ()), + (chars!('\u{2145}'..='\u{2149}'), ()), + (chars!('\u{214e}'..='\u{214e}'), ()), + (chars!('\u{2150}'..='\u{2189}'), ()), + (chars!('\u{2460}'..='\u{249b}'), ()), + (chars!('\u{24b6}'..='\u{24ff}'), ()), + (chars!('\u{2776}'..='\u{2793}'), ()), + (chars!('\u{2c00}'..='\u{2c2e}'), ()), + (chars!('\u{2c30}'..='\u{2c5e}'), ()), + (chars!('\u{2c60}'..='\u{2ce4}'), ()), + (chars!('\u{2ceb}'..='\u{2cee}'), ()), + (chars!('\u{2cf2}'..='\u{2cf3}'), ()), + (chars!('\u{2cfd}'..='\u{2cfd}'), ()), + (chars!('\u{2d00}'..='\u{2d25}'), ()), + (chars!('\u{2d27}'..='\u{2d27}'), ()), + (chars!('\u{2d2d}'..='\u{2d2d}'), ()), + (chars!('\u{2d30}'..='\u{2d67}'), ()), + (chars!('\u{2d6f}'..='\u{2d6f}'), ()), + (chars!('\u{2d80}'..='\u{2d96}'), ()), + (chars!('\u{2da0}'..='\u{2da6}'), ()), + (chars!('\u{2da8}'..='\u{2dae}'), ()), + (chars!('\u{2db0}'..='\u{2db6}'), ()), + (chars!('\u{2db8}'..='\u{2dbe}'), ()), + (chars!('\u{2dc0}'..='\u{2dc6}'), ()), + (chars!('\u{2dc8}'..='\u{2dce}'), ()), + (chars!('\u{2dd0}'..='\u{2dd6}'), ()), + (chars!('\u{2dd8}'..='\u{2dde}'), ()), + (chars!('\u{2de0}'..='\u{2dff}'), ()), + (chars!('\u{2e2f}'..='\u{2e2f}'), ()), + (chars!('\u{3005}'..='\u{3007}'), ()), + (chars!('\u{3021}'..='\u{3029}'), ()), + (chars!('\u{3031}'..='\u{3035}'), ()), + (chars!('\u{3038}'..='\u{303c}'), ()), + (chars!('\u{3041}'..='\u{3096}'), ()), + (chars!('\u{309d}'..='\u{309f}'), ()), + (chars!('\u{30a1}'..='\u{30fa}'), ()), + (chars!('\u{30fc}'..='\u{30ff}'), ()), + (chars!('\u{3105}'..='\u{312e}'), ()), + (chars!('\u{3131}'..='\u{318e}'), ()), + (chars!('\u{3192}'..='\u{3195}'), ()), + (chars!('\u{31a0}'..='\u{31ba}'), ()), + (chars!('\u{31f0}'..='\u{31ff}'), ()), + (chars!('\u{3220}'..='\u{3229}'), ()), + (chars!('\u{3248}'..='\u{324f}'), ()), + (chars!('\u{3251}'..='\u{325f}'), ()), + (chars!('\u{3280}'..='\u{3289}'), ()), + (chars!('\u{32b1}'..='\u{32bf}'), ()), + (chars!('\u{3400}'..='\u{4db5}'), ()), + (chars!('\u{4e00}'..='\u{9fea}'), ()), + (chars!('\u{a000}'..='\u{a48c}'), ()), + (chars!('\u{a4d0}'..='\u{a4fd}'), ()), + (chars!('\u{a500}'..='\u{a60c}'), ()), + (chars!('\u{a610}'..='\u{a62b}'), ()), + (chars!('\u{a640}'..='\u{a66e}'), ()), + (chars!('\u{a674}'..='\u{a67b}'), ()), + (chars!('\u{a67f}'..='\u{a6ef}'), ()), + (chars!('\u{a717}'..='\u{a71f}'), ()), + (chars!('\u{a722}'..='\u{a788}'), ()), + (chars!('\u{a78b}'..='\u{a7ae}'), ()), + (chars!('\u{a7b0}'..='\u{a7b7}'), ()), + (chars!('\u{a7f7}'..='\u{a801}'), ()), + (chars!('\u{a803}'..='\u{a805}'), ()), + (chars!('\u{a807}'..='\u{a80a}'), ()), + (chars!('\u{a80c}'..='\u{a827}'), ()), + (chars!('\u{a830}'..='\u{a835}'), ()), + (chars!('\u{a840}'..='\u{a873}'), ()), + (chars!('\u{a880}'..='\u{a8c3}'), ()), + (chars!('\u{a8c5}'..='\u{a8c5}'), ()), + (chars!('\u{a8d0}'..='\u{a8d9}'), ()), + (chars!('\u{a8f2}'..='\u{a8f7}'), ()), + (chars!('\u{a8fb}'..='\u{a8fb}'), ()), + (chars!('\u{a8fd}'..='\u{a8fd}'), ()), + (chars!('\u{a900}'..='\u{a92a}'), ()), + (chars!('\u{a930}'..='\u{a952}'), ()), + (chars!('\u{a960}'..='\u{a97c}'), ()), + (chars!('\u{a980}'..='\u{a9b2}'), ()), + (chars!('\u{a9b4}'..='\u{a9bf}'), ()), + (chars!('\u{a9cf}'..='\u{a9d9}'), ()), + (chars!('\u{a9e0}'..='\u{a9e4}'), ()), + (chars!('\u{a9e6}'..='\u{a9fe}'), ()), + (chars!('\u{aa00}'..='\u{aa36}'), ()), + (chars!('\u{aa40}'..='\u{aa4d}'), ()), + (chars!('\u{aa50}'..='\u{aa59}'), ()), + (chars!('\u{aa60}'..='\u{aa76}'), ()), + (chars!('\u{aa7a}'..='\u{aa7a}'), ()), + (chars!('\u{aa7e}'..='\u{aabe}'), ()), + (chars!('\u{aac0}'..='\u{aac0}'), ()), + (chars!('\u{aac2}'..='\u{aac2}'), ()), + (chars!('\u{aadb}'..='\u{aadd}'), ()), + (chars!('\u{aae0}'..='\u{aaef}'), ()), + (chars!('\u{aaf2}'..='\u{aaf5}'), ()), + (chars!('\u{ab01}'..='\u{ab06}'), ()), + (chars!('\u{ab09}'..='\u{ab0e}'), ()), + (chars!('\u{ab11}'..='\u{ab16}'), ()), + (chars!('\u{ab20}'..='\u{ab26}'), ()), + (chars!('\u{ab28}'..='\u{ab2e}'), ()), + (chars!('\u{ab30}'..='\u{ab5a}'), ()), + (chars!('\u{ab5c}'..='\u{ab65}'), ()), + (chars!('\u{ab70}'..='\u{abea}'), ()), + (chars!('\u{abf0}'..='\u{abf9}'), ()), + (chars!('\u{ac00}'..='\u{d7a3}'), ()), + (chars!('\u{d7b0}'..='\u{d7c6}'), ()), + (chars!('\u{d7cb}'..='\u{d7fb}'), ()), + (chars!('\u{f900}'..='\u{fa6d}'), ()), + (chars!('\u{fa70}'..='\u{fad9}'), ()), + (chars!('\u{fb00}'..='\u{fb06}'), ()), + (chars!('\u{fb13}'..='\u{fb17}'), ()), + (chars!('\u{fb1d}'..='\u{fb28}'), ()), + (chars!('\u{fb2a}'..='\u{fb36}'), ()), + (chars!('\u{fb38}'..='\u{fb3c}'), ()), + (chars!('\u{fb3e}'..='\u{fb3e}'), ()), + (chars!('\u{fb40}'..='\u{fb41}'), ()), + (chars!('\u{fb43}'..='\u{fb44}'), ()), + (chars!('\u{fb46}'..='\u{fbb1}'), ()), + (chars!('\u{fbd3}'..='\u{fd3d}'), ()), + (chars!('\u{fd50}'..='\u{fd8f}'), ()), + (chars!('\u{fd92}'..='\u{fdc7}'), ()), + (chars!('\u{fdf0}'..='\u{fdfb}'), ()), + (chars!('\u{fe70}'..='\u{fe74}'), ()), + (chars!('\u{fe76}'..='\u{fefc}'), ()), + (chars!('\u{ff10}'..='\u{ff19}'), ()), + (chars!('\u{ff21}'..='\u{ff3a}'), ()), + (chars!('\u{ff41}'..='\u{ff5a}'), ()), + (chars!('\u{ff66}'..='\u{ffbe}'), ()), + (chars!('\u{ffc2}'..='\u{ffc7}'), ()), + (chars!('\u{ffca}'..='\u{ffcf}'), ()), + (chars!('\u{ffd2}'..='\u{ffd7}'), ()), + (chars!('\u{ffda}'..='\u{ffdc}'), ()), + (chars!('\u{10000}'..='\u{1000b}'), ()), + (chars!('\u{1000d}'..='\u{10026}'), ()), + (chars!('\u{10028}'..='\u{1003a}'), ()), + (chars!('\u{1003c}'..='\u{1003d}'), ()), + (chars!('\u{1003f}'..='\u{1004d}'), ()), + (chars!('\u{10050}'..='\u{1005d}'), ()), + (chars!('\u{10080}'..='\u{100fa}'), ()), + (chars!('\u{10107}'..='\u{10133}'), ()), + (chars!('\u{10140}'..='\u{10178}'), ()), + (chars!('\u{1018a}'..='\u{1018b}'), ()), + (chars!('\u{10280}'..='\u{1029c}'), ()), + (chars!('\u{102a0}'..='\u{102d0}'), ()), + (chars!('\u{102e1}'..='\u{102fb}'), ()), + (chars!('\u{10300}'..='\u{10323}'), ()), + (chars!('\u{1032d}'..='\u{1034a}'), ()), + (chars!('\u{10350}'..='\u{1037a}'), ()), + (chars!('\u{10380}'..='\u{1039d}'), ()), + (chars!('\u{103a0}'..='\u{103c3}'), ()), + (chars!('\u{103c8}'..='\u{103cf}'), ()), + (chars!('\u{103d1}'..='\u{103d5}'), ()), + (chars!('\u{10400}'..='\u{1049d}'), ()), + (chars!('\u{104a0}'..='\u{104a9}'), ()), + (chars!('\u{104b0}'..='\u{104d3}'), ()), + (chars!('\u{104d8}'..='\u{104fb}'), ()), + (chars!('\u{10500}'..='\u{10527}'), ()), + (chars!('\u{10530}'..='\u{10563}'), ()), + (chars!('\u{10600}'..='\u{10736}'), ()), + (chars!('\u{10740}'..='\u{10755}'), ()), + (chars!('\u{10760}'..='\u{10767}'), ()), + (chars!('\u{10800}'..='\u{10805}'), ()), + (chars!('\u{10808}'..='\u{10808}'), ()), + (chars!('\u{1080a}'..='\u{10835}'), ()), + (chars!('\u{10837}'..='\u{10838}'), ()), + (chars!('\u{1083c}'..='\u{1083c}'), ()), + (chars!('\u{1083f}'..='\u{10855}'), ()), + (chars!('\u{10858}'..='\u{10876}'), ()), + (chars!('\u{10879}'..='\u{1089e}'), ()), + (chars!('\u{108a7}'..='\u{108af}'), ()), + (chars!('\u{108e0}'..='\u{108f2}'), ()), + (chars!('\u{108f4}'..='\u{108f5}'), ()), + (chars!('\u{108fb}'..='\u{1091b}'), ()), + (chars!('\u{10920}'..='\u{10939}'), ()), + (chars!('\u{10980}'..='\u{109b7}'), ()), + (chars!('\u{109bc}'..='\u{109cf}'), ()), + (chars!('\u{109d2}'..='\u{10a03}'), ()), + (chars!('\u{10a05}'..='\u{10a06}'), ()), + (chars!('\u{10a0c}'..='\u{10a13}'), ()), + (chars!('\u{10a15}'..='\u{10a17}'), ()), + (chars!('\u{10a19}'..='\u{10a33}'), ()), + (chars!('\u{10a40}'..='\u{10a47}'), ()), + (chars!('\u{10a60}'..='\u{10a7e}'), ()), + (chars!('\u{10a80}'..='\u{10a9f}'), ()), + (chars!('\u{10ac0}'..='\u{10ac7}'), ()), + (chars!('\u{10ac9}'..='\u{10ae4}'), ()), + (chars!('\u{10aeb}'..='\u{10aef}'), ()), + (chars!('\u{10b00}'..='\u{10b35}'), ()), + (chars!('\u{10b40}'..='\u{10b55}'), ()), + (chars!('\u{10b58}'..='\u{10b72}'), ()), + (chars!('\u{10b78}'..='\u{10b91}'), ()), + (chars!('\u{10ba9}'..='\u{10baf}'), ()), + (chars!('\u{10c00}'..='\u{10c48}'), ()), + (chars!('\u{10c80}'..='\u{10cb2}'), ()), + (chars!('\u{10cc0}'..='\u{10cf2}'), ()), + (chars!('\u{10cfa}'..='\u{10cff}'), ()), + (chars!('\u{10e60}'..='\u{10e7e}'), ()), + (chars!('\u{11000}'..='\u{11045}'), ()), + (chars!('\u{11052}'..='\u{1106f}'), ()), + (chars!('\u{11082}'..='\u{110b8}'), ()), + (chars!('\u{110d0}'..='\u{110e8}'), ()), + (chars!('\u{110f0}'..='\u{110f9}'), ()), + (chars!('\u{11100}'..='\u{11132}'), ()), + (chars!('\u{11136}'..='\u{1113f}'), ()), + (chars!('\u{11150}'..='\u{11172}'), ()), + (chars!('\u{11176}'..='\u{11176}'), ()), + (chars!('\u{11180}'..='\u{111bf}'), ()), + (chars!('\u{111c1}'..='\u{111c4}'), ()), + (chars!('\u{111d0}'..='\u{111da}'), ()), + (chars!('\u{111dc}'..='\u{111dc}'), ()), + (chars!('\u{111e1}'..='\u{111f4}'), ()), + (chars!('\u{11200}'..='\u{11211}'), ()), + (chars!('\u{11213}'..='\u{11234}'), ()), + (chars!('\u{11237}'..='\u{11237}'), ()), + (chars!('\u{1123e}'..='\u{1123e}'), ()), + (chars!('\u{11280}'..='\u{11286}'), ()), + (chars!('\u{11288}'..='\u{11288}'), ()), + (chars!('\u{1128a}'..='\u{1128d}'), ()), + (chars!('\u{1128f}'..='\u{1129d}'), ()), + (chars!('\u{1129f}'..='\u{112a8}'), ()), + (chars!('\u{112b0}'..='\u{112e8}'), ()), + (chars!('\u{112f0}'..='\u{112f9}'), ()), + (chars!('\u{11300}'..='\u{11303}'), ()), + (chars!('\u{11305}'..='\u{1130c}'), ()), + (chars!('\u{1130f}'..='\u{11310}'), ()), + (chars!('\u{11313}'..='\u{11328}'), ()), + (chars!('\u{1132a}'..='\u{11330}'), ()), + (chars!('\u{11332}'..='\u{11333}'), ()), + (chars!('\u{11335}'..='\u{11339}'), ()), + (chars!('\u{1133d}'..='\u{11344}'), ()), + (chars!('\u{11347}'..='\u{11348}'), ()), + (chars!('\u{1134b}'..='\u{1134c}'), ()), + (chars!('\u{11350}'..='\u{11350}'), ()), + (chars!('\u{11357}'..='\u{11357}'), ()), + (chars!('\u{1135d}'..='\u{11363}'), ()), + (chars!('\u{11400}'..='\u{11441}'), ()), + (chars!('\u{11443}'..='\u{11445}'), ()), + (chars!('\u{11447}'..='\u{1144a}'), ()), + (chars!('\u{11450}'..='\u{11459}'), ()), + (chars!('\u{11480}'..='\u{114c1}'), ()), + (chars!('\u{114c4}'..='\u{114c5}'), ()), + (chars!('\u{114c7}'..='\u{114c7}'), ()), + (chars!('\u{114d0}'..='\u{114d9}'), ()), + (chars!('\u{11580}'..='\u{115b5}'), ()), + (chars!('\u{115b8}'..='\u{115be}'), ()), + (chars!('\u{115d8}'..='\u{115dd}'), ()), + (chars!('\u{11600}'..='\u{1163e}'), ()), + (chars!('\u{11640}'..='\u{11640}'), ()), + (chars!('\u{11644}'..='\u{11644}'), ()), + (chars!('\u{11650}'..='\u{11659}'), ()), + (chars!('\u{11680}'..='\u{116b5}'), ()), + (chars!('\u{116c0}'..='\u{116c9}'), ()), + (chars!('\u{11700}'..='\u{11719}'), ()), + (chars!('\u{1171d}'..='\u{1172a}'), ()), + (chars!('\u{11730}'..='\u{1173b}'), ()), + (chars!('\u{118a0}'..='\u{118f2}'), ()), + (chars!('\u{118ff}'..='\u{118ff}'), ()), + (chars!('\u{11a00}'..='\u{11a32}'), ()), + (chars!('\u{11a35}'..='\u{11a3e}'), ()), + (chars!('\u{11a50}'..='\u{11a83}'), ()), + (chars!('\u{11a86}'..='\u{11a97}'), ()), + (chars!('\u{11ac0}'..='\u{11af8}'), ()), + (chars!('\u{11c00}'..='\u{11c08}'), ()), + (chars!('\u{11c0a}'..='\u{11c36}'), ()), + (chars!('\u{11c38}'..='\u{11c3e}'), ()), + (chars!('\u{11c40}'..='\u{11c40}'), ()), + (chars!('\u{11c50}'..='\u{11c6c}'), ()), + (chars!('\u{11c72}'..='\u{11c8f}'), ()), + (chars!('\u{11c92}'..='\u{11ca7}'), ()), + (chars!('\u{11ca9}'..='\u{11cb6}'), ()), + (chars!('\u{11d00}'..='\u{11d06}'), ()), + (chars!('\u{11d08}'..='\u{11d09}'), ()), + (chars!('\u{11d0b}'..='\u{11d36}'), ()), + (chars!('\u{11d3a}'..='\u{11d3a}'), ()), + (chars!('\u{11d3c}'..='\u{11d3d}'), ()), + (chars!('\u{11d3f}'..='\u{11d41}'), ()), + (chars!('\u{11d43}'..='\u{11d43}'), ()), + (chars!('\u{11d46}'..='\u{11d47}'), ()), + (chars!('\u{11d50}'..='\u{11d59}'), ()), + (chars!('\u{12000}'..='\u{12399}'), ()), + (chars!('\u{12400}'..='\u{1246e}'), ()), + (chars!('\u{12480}'..='\u{12543}'), ()), + (chars!('\u{13000}'..='\u{1342e}'), ()), + (chars!('\u{14400}'..='\u{14646}'), ()), + (chars!('\u{16800}'..='\u{16a38}'), ()), + (chars!('\u{16a40}'..='\u{16a5e}'), ()), + (chars!('\u{16a60}'..='\u{16a69}'), ()), + (chars!('\u{16ad0}'..='\u{16aed}'), ()), + (chars!('\u{16b00}'..='\u{16b36}'), ()), + (chars!('\u{16b40}'..='\u{16b43}'), ()), + (chars!('\u{16b50}'..='\u{16b59}'), ()), + (chars!('\u{16b5b}'..='\u{16b61}'), ()), + (chars!('\u{16b63}'..='\u{16b77}'), ()), + (chars!('\u{16b7d}'..='\u{16b8f}'), ()), + (chars!('\u{16f00}'..='\u{16f44}'), ()), + (chars!('\u{16f50}'..='\u{16f7e}'), ()), + (chars!('\u{16f93}'..='\u{16f9f}'), ()), + (chars!('\u{16fe0}'..='\u{16fe1}'), ()), + (chars!('\u{17000}'..='\u{187ec}'), ()), + (chars!('\u{18800}'..='\u{18af2}'), ()), + (chars!('\u{1b000}'..='\u{1b11e}'), ()), + (chars!('\u{1b170}'..='\u{1b2fb}'), ()), + (chars!('\u{1bc00}'..='\u{1bc6a}'), ()), + (chars!('\u{1bc70}'..='\u{1bc7c}'), ()), + (chars!('\u{1bc80}'..='\u{1bc88}'), ()), + (chars!('\u{1bc90}'..='\u{1bc99}'), ()), + (chars!('\u{1bc9e}'..='\u{1bc9e}'), ()), + (chars!('\u{1d360}'..='\u{1d371}'), ()), + (chars!('\u{1d400}'..='\u{1d454}'), ()), + (chars!('\u{1d456}'..='\u{1d49c}'), ()), + (chars!('\u{1d49e}'..='\u{1d49f}'), ()), + (chars!('\u{1d4a2}'..='\u{1d4a2}'), ()), + (chars!('\u{1d4a5}'..='\u{1d4a6}'), ()), + (chars!('\u{1d4a9}'..='\u{1d4ac}'), ()), + (chars!('\u{1d4ae}'..='\u{1d4b9}'), ()), + (chars!('\u{1d4bb}'..='\u{1d4bb}'), ()), + (chars!('\u{1d4bd}'..='\u{1d4c3}'), ()), + (chars!('\u{1d4c5}'..='\u{1d505}'), ()), + (chars!('\u{1d507}'..='\u{1d50a}'), ()), + (chars!('\u{1d50d}'..='\u{1d514}'), ()), + (chars!('\u{1d516}'..='\u{1d51c}'), ()), + (chars!('\u{1d51e}'..='\u{1d539}'), ()), + (chars!('\u{1d53b}'..='\u{1d53e}'), ()), + (chars!('\u{1d540}'..='\u{1d544}'), ()), + (chars!('\u{1d546}'..='\u{1d546}'), ()), + (chars!('\u{1d54a}'..='\u{1d550}'), ()), + (chars!('\u{1d552}'..='\u{1d6a5}'), ()), + (chars!('\u{1d6a8}'..='\u{1d6c0}'), ()), + (chars!('\u{1d6c2}'..='\u{1d6da}'), ()), + (chars!('\u{1d6dc}'..='\u{1d6fa}'), ()), + (chars!('\u{1d6fc}'..='\u{1d714}'), ()), + (chars!('\u{1d716}'..='\u{1d734}'), ()), + (chars!('\u{1d736}'..='\u{1d74e}'), ()), + (chars!('\u{1d750}'..='\u{1d76e}'), ()), + (chars!('\u{1d770}'..='\u{1d788}'), ()), + (chars!('\u{1d78a}'..='\u{1d7a8}'), ()), + (chars!('\u{1d7aa}'..='\u{1d7c2}'), ()), + (chars!('\u{1d7c4}'..='\u{1d7cb}'), ()), + (chars!('\u{1d7ce}'..='\u{1d7ff}'), ()), + (chars!('\u{1e000}'..='\u{1e006}'), ()), + (chars!('\u{1e008}'..='\u{1e018}'), ()), + (chars!('\u{1e01b}'..='\u{1e021}'), ()), + (chars!('\u{1e023}'..='\u{1e024}'), ()), + (chars!('\u{1e026}'..='\u{1e02a}'), ()), + (chars!('\u{1e800}'..='\u{1e8c4}'), ()), + (chars!('\u{1e8c7}'..='\u{1e8cf}'), ()), + (chars!('\u{1e900}'..='\u{1e943}'), ()), + (chars!('\u{1e947}'..='\u{1e947}'), ()), + (chars!('\u{1e950}'..='\u{1e959}'), ()), + (chars!('\u{1ee00}'..='\u{1ee03}'), ()), + (chars!('\u{1ee05}'..='\u{1ee1f}'), ()), + (chars!('\u{1ee21}'..='\u{1ee22}'), ()), + (chars!('\u{1ee24}'..='\u{1ee24}'), ()), + (chars!('\u{1ee27}'..='\u{1ee27}'), ()), + (chars!('\u{1ee29}'..='\u{1ee32}'), ()), + (chars!('\u{1ee34}'..='\u{1ee37}'), ()), + (chars!('\u{1ee39}'..='\u{1ee39}'), ()), + (chars!('\u{1ee3b}'..='\u{1ee3b}'), ()), + (chars!('\u{1ee42}'..='\u{1ee42}'), ()), + (chars!('\u{1ee47}'..='\u{1ee47}'), ()), + (chars!('\u{1ee49}'..='\u{1ee49}'), ()), + (chars!('\u{1ee4b}'..='\u{1ee4b}'), ()), + (chars!('\u{1ee4d}'..='\u{1ee4f}'), ()), + (chars!('\u{1ee51}'..='\u{1ee52}'), ()), + (chars!('\u{1ee54}'..='\u{1ee54}'), ()), + (chars!('\u{1ee57}'..='\u{1ee57}'), ()), + (chars!('\u{1ee59}'..='\u{1ee59}'), ()), + (chars!('\u{1ee5b}'..='\u{1ee5b}'), ()), + (chars!('\u{1ee5d}'..='\u{1ee5d}'), ()), + (chars!('\u{1ee5f}'..='\u{1ee5f}'), ()), + (chars!('\u{1ee61}'..='\u{1ee62}'), ()), + (chars!('\u{1ee64}'..='\u{1ee64}'), ()), + (chars!('\u{1ee67}'..='\u{1ee6a}'), ()), + (chars!('\u{1ee6c}'..='\u{1ee72}'), ()), + (chars!('\u{1ee74}'..='\u{1ee77}'), ()), + (chars!('\u{1ee79}'..='\u{1ee7c}'), ()), + (chars!('\u{1ee7e}'..='\u{1ee7e}'), ()), + (chars!('\u{1ee80}'..='\u{1ee89}'), ()), + (chars!('\u{1ee8b}'..='\u{1ee9b}'), ()), + (chars!('\u{1eea1}'..='\u{1eea3}'), ()), + (chars!('\u{1eea5}'..='\u{1eea9}'), ()), + (chars!('\u{1eeab}'..='\u{1eebb}'), ()), + (chars!('\u{1f100}'..='\u{1f10c}'), ()), + (chars!('\u{1f130}'..='\u{1f149}'), ()), + (chars!('\u{1f150}'..='\u{1f169}'), ()), + (chars!('\u{1f170}'..='\u{1f189}'), ()), + (chars!('\u{20000}'..='\u{2a6d6}'), ()), + (chars!('\u{2a700}'..='\u{2b734}'), ()), + (chars!('\u{2b740}'..='\u{2b81d}'), ()), + (chars!('\u{2b820}'..='\u{2cea1}'), ()), + (chars!('\u{2ceb0}'..='\u{2ebe0}'), ()), + (chars!('\u{2f800}'..='\u{2fa1d}'), ()), +]) diff --git a/unic/ucd/common/tables/numeric.rsv b/unic/ucd/common/tables/numeric.rsv new file mode 100644 index 00000000..52ea0056 --- /dev/null +++ b/unic/ucd/common/tables/numeric.rsv @@ -0,0 +1,120 @@ +// WARNING: Auto-generated by the `unic-gen` crate. +// WARNING: DO NOT EDIT MANUALLY! +CharDataTable::Range(&[ + (chars!('\u{30}'..='\u{39}'), ()), + (chars!('\u{b2}'..='\u{b3}'), ()), + (chars!('\u{b9}'..='\u{b9}'), ()), + (chars!('\u{bc}'..='\u{be}'), ()), + (chars!('\u{660}'..='\u{669}'), ()), + (chars!('\u{6f0}'..='\u{6f9}'), ()), + (chars!('\u{7c0}'..='\u{7c9}'), ()), + (chars!('\u{966}'..='\u{96f}'), ()), + (chars!('\u{9e6}'..='\u{9ef}'), ()), + (chars!('\u{9f4}'..='\u{9f9}'), ()), + (chars!('\u{a66}'..='\u{a6f}'), ()), + (chars!('\u{ae6}'..='\u{aef}'), ()), + (chars!('\u{b66}'..='\u{b6f}'), ()), + (chars!('\u{b72}'..='\u{b77}'), ()), + (chars!('\u{be6}'..='\u{bf2}'), ()), + (chars!('\u{c66}'..='\u{c6f}'), ()), + (chars!('\u{c78}'..='\u{c7e}'), ()), + (chars!('\u{ce6}'..='\u{cef}'), ()), + (chars!('\u{d58}'..='\u{d5e}'), ()), + (chars!('\u{d66}'..='\u{d78}'), ()), + (chars!('\u{de6}'..='\u{def}'), ()), + (chars!('\u{e50}'..='\u{e59}'), ()), + (chars!('\u{ed0}'..='\u{ed9}'), ()), + (chars!('\u{f20}'..='\u{f33}'), ()), + (chars!('\u{1040}'..='\u{1049}'), ()), + (chars!('\u{1090}'..='\u{1099}'), ()), + (chars!('\u{1369}'..='\u{137c}'), ()), + (chars!('\u{16ee}'..='\u{16f0}'), ()), + (chars!('\u{17e0}'..='\u{17e9}'), ()), + (chars!('\u{17f0}'..='\u{17f9}'), ()), + (chars!('\u{1810}'..='\u{1819}'), ()), + (chars!('\u{1946}'..='\u{194f}'), ()), + (chars!('\u{19d0}'..='\u{19da}'), ()), + (chars!('\u{1a80}'..='\u{1a89}'), ()), + (chars!('\u{1a90}'..='\u{1a99}'), ()), + (chars!('\u{1b50}'..='\u{1b59}'), ()), + (chars!('\u{1bb0}'..='\u{1bb9}'), ()), + (chars!('\u{1c40}'..='\u{1c49}'), ()), + (chars!('\u{1c50}'..='\u{1c59}'), ()), + (chars!('\u{2070}'..='\u{2070}'), ()), + (chars!('\u{2074}'..='\u{2079}'), ()), + (chars!('\u{2080}'..='\u{2089}'), ()), + (chars!('\u{2150}'..='\u{2182}'), ()), + (chars!('\u{2185}'..='\u{2189}'), ()), + (chars!('\u{2460}'..='\u{249b}'), ()), + (chars!('\u{24ea}'..='\u{24ff}'), ()), + (chars!('\u{2776}'..='\u{2793}'), ()), + (chars!('\u{2cfd}'..='\u{2cfd}'), ()), + (chars!('\u{3007}'..='\u{3007}'), ()), + (chars!('\u{3021}'..='\u{3029}'), ()), + (chars!('\u{3038}'..='\u{303a}'), ()), + (chars!('\u{3192}'..='\u{3195}'), ()), + (chars!('\u{3220}'..='\u{3229}'), ()), + (chars!('\u{3248}'..='\u{324f}'), ()), + (chars!('\u{3251}'..='\u{325f}'), ()), + (chars!('\u{3280}'..='\u{3289}'), ()), + (chars!('\u{32b1}'..='\u{32bf}'), ()), + (chars!('\u{a620}'..='\u{a629}'), ()), + (chars!('\u{a6e6}'..='\u{a6ef}'), ()), + (chars!('\u{a830}'..='\u{a835}'), ()), + (chars!('\u{a8d0}'..='\u{a8d9}'), ()), + (chars!('\u{a900}'..='\u{a909}'), ()), + (chars!('\u{a9d0}'..='\u{a9d9}'), ()), + (chars!('\u{a9f0}'..='\u{a9f9}'), ()), + (chars!('\u{aa50}'..='\u{aa59}'), ()), + (chars!('\u{abf0}'..='\u{abf9}'), ()), + (chars!('\u{ff10}'..='\u{ff19}'), ()), + (chars!('\u{10107}'..='\u{10133}'), ()), + (chars!('\u{10140}'..='\u{10178}'), ()), + (chars!('\u{1018a}'..='\u{1018b}'), ()), + (chars!('\u{102e1}'..='\u{102fb}'), ()), + (chars!('\u{10320}'..='\u{10323}'), ()), + (chars!('\u{10341}'..='\u{10341}'), ()), + (chars!('\u{1034a}'..='\u{1034a}'), ()), + (chars!('\u{103d1}'..='\u{103d5}'), ()), + (chars!('\u{104a0}'..='\u{104a9}'), ()), + (chars!('\u{10858}'..='\u{1085f}'), ()), + (chars!('\u{10879}'..='\u{1087f}'), ()), + (chars!('\u{108a7}'..='\u{108af}'), ()), + (chars!('\u{108fb}'..='\u{108ff}'), ()), + (chars!('\u{10916}'..='\u{1091b}'), ()), + (chars!('\u{109bc}'..='\u{109bd}'), ()), + (chars!('\u{109c0}'..='\u{109cf}'), ()), + (chars!('\u{109d2}'..='\u{109ff}'), ()), + (chars!('\u{10a40}'..='\u{10a47}'), ()), + (chars!('\u{10a7d}'..='\u{10a7e}'), ()), + (chars!('\u{10a9d}'..='\u{10a9f}'), ()), + (chars!('\u{10aeb}'..='\u{10aef}'), ()), + (chars!('\u{10b58}'..='\u{10b5f}'), ()), + (chars!('\u{10b78}'..='\u{10b7f}'), ()), + (chars!('\u{10ba9}'..='\u{10baf}'), ()), + (chars!('\u{10cfa}'..='\u{10cff}'), ()), + (chars!('\u{10e60}'..='\u{10e7e}'), ()), + (chars!('\u{11052}'..='\u{1106f}'), ()), + (chars!('\u{110f0}'..='\u{110f9}'), ()), + (chars!('\u{11136}'..='\u{1113f}'), ()), + (chars!('\u{111d0}'..='\u{111d9}'), ()), + (chars!('\u{111e1}'..='\u{111f4}'), ()), + (chars!('\u{112f0}'..='\u{112f9}'), ()), + (chars!('\u{11450}'..='\u{11459}'), ()), + (chars!('\u{114d0}'..='\u{114d9}'), ()), + (chars!('\u{11650}'..='\u{11659}'), ()), + (chars!('\u{116c0}'..='\u{116c9}'), ()), + (chars!('\u{11730}'..='\u{1173b}'), ()), + (chars!('\u{118e0}'..='\u{118f2}'), ()), + (chars!('\u{11c50}'..='\u{11c6c}'), ()), + (chars!('\u{11d50}'..='\u{11d59}'), ()), + (chars!('\u{12400}'..='\u{1246e}'), ()), + (chars!('\u{16a60}'..='\u{16a69}'), ()), + (chars!('\u{16b50}'..='\u{16b59}'), ()), + (chars!('\u{16b5b}'..='\u{16b61}'), ()), + (chars!('\u{1d360}'..='\u{1d371}'), ()), + (chars!('\u{1d7ce}'..='\u{1d7ff}'), ()), + (chars!('\u{1e8c7}'..='\u{1e8cf}'), ()), + (chars!('\u{1e950}'..='\u{1e959}'), ()), + (chars!('\u{1f100}'..='\u{1f10c}'), ()), +]) diff --git a/unic/ucd/common/tables/unicode_version.rsv b/unic/ucd/common/tables/unicode_version.rsv new file mode 100644 index 00000000..63d0ef15 --- /dev/null +++ b/unic/ucd/common/tables/unicode_version.rsv @@ -0,0 +1,3 @@ +// WARNING: Auto-generated by the `unic-gen` crate. +// WARNING: DO NOT EDIT MANUALLY! +UnicodeVersion { major: 10, minor: 0, micro: 0 } diff --git a/unic/ucd/common/tests/unicode_version_tests.rs b/unic/ucd/common/tests/unicode_version_tests.rs new file mode 100644 index 00000000..3011b845 --- /dev/null +++ b/unic/ucd/common/tests/unicode_version_tests.rs @@ -0,0 +1,22 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +extern crate unic_ucd_common; +extern crate unic_ucd_core; + + +#[test] +fn test_version_against_ucd_core() { + assert_eq!( + unic_ucd_common::UNICODE_VERSION, + unic_ucd_core::UNICODE_VERSION + ); +} From cb968977ec3767059a723548e5e92aa2e2be1153 Mon Sep 17 00:00:00 2001 From: Behnam Esfahbod Date: Mon, 2 Oct 2017 22:22:27 -0700 Subject: [PATCH 2/3] [ucd/common] Add White_Space and is_control Add UCD `White_Space` property. Add `is_control()` method following the Rust std lib practice for defining it based on `General_Category = Cc`. --- gen/src/writer/ucd/common.rs | 27 +++++- unic/ucd/common/src/control.rs | 116 +++++++++++++++++++++++++ unic/ucd/common/src/lib.rs | 7 ++ unic/ucd/common/src/white_space.rs | 105 ++++++++++++++++++++++ unic/ucd/common/tables/control.rsv | 6 ++ unic/ucd/common/tables/white_space.rsv | 14 +++ 6 files changed, 272 insertions(+), 3 deletions(-) create mode 100644 unic/ucd/common/src/control.rs create mode 100644 unic/ucd/common/src/white_space.rs create mode 100644 unic/ucd/common/tables/control.rsv create mode 100644 unic/ucd/common/tables/white_space.rsv diff --git a/gen/src/writer/ucd/common.rs b/gen/src/writer/ucd/common.rs index 55e238be..cf775a94 100644 --- a/gen/src/writer/ucd/common.rs +++ b/gen/src/writer/ucd/common.rs @@ -13,6 +13,7 @@ use std::path::Path; use std::collections::BTreeSet; use source::ucd::derived_core_properties::DERIVED_CORE_PROPERTIES; +use source::ucd::prop_list::PROP_LIST; use source::ucd::readme::UNICODE_VERSION; use source::ucd::unicode_data::UNICODE_DATA; @@ -24,8 +25,10 @@ use writer::utils::write; pub fn generate(dir: &Path) { emit_unicode_version(dir, &UNICODE_VERSION); emit_alphabetic(dir); - emit_numeric(dir); + emit_white_space(dir); emit_alphanumeric(dir); + emit_control(dir); + emit_numeric(dir); } @@ -37,8 +40,12 @@ fn emit_alphabetic(dir: &Path) { ); } -fn emit_numeric(dir: &Path) { - write(dir, "numeric.rsv", &get_numeric().to_range_char_set()); +fn emit_white_space(dir: &Path) { + write( + dir, + "white_space.rsv", + &PROP_LIST.white_space.to_range_char_set(), + ); } fn emit_alphanumeric(dir: &Path) { @@ -49,6 +56,20 @@ fn emit_alphanumeric(dir: &Path) { ); } +fn emit_control(dir: &Path) { + let set: BTreeSet = UNICODE_DATA + .entries + .iter() + .filter(|x| x.general_category == "Cc") + .map(|x| x.character) + .collect(); + write(dir, "control.rsv", &set.to_range_char_set()); +} + +fn emit_numeric(dir: &Path) { + write(dir, "numeric.rsv", &get_numeric().to_range_char_set()); +} + fn get_numeric() -> BTreeSet { UNICODE_DATA diff --git a/unic/ucd/common/src/control.rs b/unic/ucd/common/src/control.rs new file mode 100644 index 00000000..59a0ff16 --- /dev/null +++ b/unic/ucd/common/src/control.rs @@ -0,0 +1,116 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +//! *Control* Character Property, equal to `General_Category = Cc`. +//! +//! NOTE: This property is not defined by UCD, but is used commonly enough in Unicode algorithms and +//! applications to provide an optimized implementation. + + +char_property! { + /// Represents Unicode characters with `General_Category = Cc`. + /// + /// The value is `true` for characters that have a control (`Cc`) *General_Category*, `false` + /// otherwise. + pub struct Control(bool) { + abbr => "Control"; + long => "Control"; + human => "Control"; + + data_table_path => "../tables/control.rsv"; + } + + /// Return `true` for control characters, `false` otherwise. + pub fn is_control(char) -> bool; +} + + +#[cfg(test)] +mod tests { + #[test] + fn test_values() { + use super::is_control; + + // ASCII + assert_eq!(is_control('\u{0000}'), true); + assert_eq!(is_control('\u{0001}'), true); + assert_eq!(is_control('\u{0002}'), true); + + assert_eq!(is_control('\u{0010}'), true); + assert_eq!(is_control('\u{0011}'), true); + assert_eq!(is_control('\u{0012}'), true); + + assert_eq!(is_control('\u{0020}'), false); + assert_eq!(is_control('\u{0021}'), false); + assert_eq!(is_control('\u{0022}'), false); + + assert_eq!(is_control('\u{0030}'), false); + assert_eq!(is_control('\u{0031}'), false); + assert_eq!(is_control('\u{0032}'), false); + + assert_eq!(is_control('\u{0040}'), false); + assert_eq!(is_control('\u{0041}'), false); + assert_eq!(is_control('\u{0042}'), false); + + assert_eq!(is_control('\u{0060}'), false); + assert_eq!(is_control('\u{0061}'), false); + assert_eq!(is_control('\u{0062}'), false); + + assert_eq!(is_control('\u{007e}'), false); + assert_eq!(is_control('\u{007f}'), true); + + // Other BMP + assert_eq!(is_control('\u{061b}'), false); + assert_eq!(is_control('\u{061c}'), false); + assert_eq!(is_control('\u{061d}'), false); + + assert_eq!(is_control('\u{200d}'), false); + assert_eq!(is_control('\u{200e}'), false); + assert_eq!(is_control('\u{200f}'), false); + assert_eq!(is_control('\u{2010}'), false); + + assert_eq!(is_control('\u{2029}'), false); + assert_eq!(is_control('\u{202a}'), false); + assert_eq!(is_control('\u{202e}'), false); + assert_eq!(is_control('\u{202f}'), false); + + // Other Planes + assert_eq!(is_control('\u{10000}'), false); + assert_eq!(is_control('\u{10001}'), false); + + assert_eq!(is_control('\u{20000}'), false); + assert_eq!(is_control('\u{30000}'), false); + assert_eq!(is_control('\u{40000}'), false); + assert_eq!(is_control('\u{50000}'), false); + assert_eq!(is_control('\u{60000}'), false); + assert_eq!(is_control('\u{70000}'), false); + assert_eq!(is_control('\u{80000}'), false); + assert_eq!(is_control('\u{90000}'), false); + assert_eq!(is_control('\u{a0000}'), false); + assert_eq!(is_control('\u{b0000}'), false); + assert_eq!(is_control('\u{c0000}'), false); + assert_eq!(is_control('\u{d0000}'), false); + assert_eq!(is_control('\u{e0000}'), false); + + assert_eq!(is_control('\u{efffe}'), false); + assert_eq!(is_control('\u{effff}'), false); + + // Priavte-Use Area + assert_eq!(is_control('\u{f0000}'), false); + assert_eq!(is_control('\u{f0001}'), false); + assert_eq!(is_control('\u{ffffe}'), false); + assert_eq!(is_control('\u{fffff}'), false); + assert_eq!(is_control('\u{100000}'), false); + assert_eq!(is_control('\u{100001}'), false); + assert_eq!(is_control('\u{10fffe}'), false); + assert_eq!(is_control('\u{10ffff}'), false); + } +} diff --git a/unic/ucd/common/src/lib.rs b/unic/ucd/common/src/lib.rs index a83f9b44..d3fa6dd5 100644 --- a/unic/ucd/common/src/lib.rs +++ b/unic/ucd/common/src/lib.rs @@ -29,11 +29,18 @@ extern crate unic_ucd_core; pub mod alphabetic; pub mod alphanumeric; +pub mod control; pub mod numeric; +pub mod white_space; +// UCD-defined: types and methods pub use alphabetic::{is_alphabetic, Alphabetic}; +pub use white_space::{is_white_space, WhiteSpace}; + +// Non-UCD-defined: methods only pub use alphanumeric::is_alphanumeric; +pub use control::is_control; pub use numeric::is_numeric; diff --git a/unic/ucd/common/src/white_space.rs b/unic/ucd/common/src/white_space.rs new file mode 100644 index 00000000..2e164a6e --- /dev/null +++ b/unic/ucd/common/src/white_space.rs @@ -0,0 +1,105 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +//! Unicode *White_Space* Character Property. + + +char_property! { + /// Represents values of the Unicode character property + /// [*White_Space*](http://www.unicode.org/reports/tr44/#White_Space). + /// + /// The value is `true` for characters that change when lowercased, `false` otherwise. + pub struct WhiteSpace(bool) { + abbr => "WSpace"; + long => "White_Space"; + human => "White Space"; + + data_table_path => "../tables/white_space.rsv"; + } + + /// Return `true` for white-space characters, `false` otherwise. + pub fn is_white_space(char) -> bool; +} + + +#[cfg(test)] +mod tests { + #[test] + fn test_values() { + use super::is_white_space; + + // ASCII + assert_eq!(is_white_space('\u{0020}'), true); + assert_eq!(is_white_space('\u{0021}'), false); + assert_eq!(is_white_space('\u{0022}'), false); + + assert_eq!(is_white_space('\u{0030}'), false); + assert_eq!(is_white_space('\u{0031}'), false); + assert_eq!(is_white_space('\u{0032}'), false); + + assert_eq!(is_white_space('\u{0040}'), false); + assert_eq!(is_white_space('\u{0041}'), false); + assert_eq!(is_white_space('\u{0042}'), false); + + assert_eq!(is_white_space('\u{0060}'), false); + assert_eq!(is_white_space('\u{0061}'), false); + assert_eq!(is_white_space('\u{0062}'), false); + + assert_eq!(is_white_space('\u{007e}'), false); + assert_eq!(is_white_space('\u{007f}'), false); + + // Other BMP + assert_eq!(is_white_space('\u{061b}'), false); + assert_eq!(is_white_space('\u{061c}'), false); + assert_eq!(is_white_space('\u{061d}'), false); + + assert_eq!(is_white_space('\u{200d}'), false); + assert_eq!(is_white_space('\u{200e}'), false); + assert_eq!(is_white_space('\u{200f}'), false); + assert_eq!(is_white_space('\u{2010}'), false); + + assert_eq!(is_white_space('\u{2029}'), true); + assert_eq!(is_white_space('\u{202a}'), false); + assert_eq!(is_white_space('\u{202e}'), false); + assert_eq!(is_white_space('\u{202f}'), true); + + // Other Planes + assert_eq!(is_white_space('\u{10000}'), false); + assert_eq!(is_white_space('\u{10001}'), false); + + assert_eq!(is_white_space('\u{20000}'), false); + assert_eq!(is_white_space('\u{30000}'), false); + assert_eq!(is_white_space('\u{40000}'), false); + assert_eq!(is_white_space('\u{50000}'), false); + assert_eq!(is_white_space('\u{60000}'), false); + assert_eq!(is_white_space('\u{70000}'), false); + assert_eq!(is_white_space('\u{80000}'), false); + assert_eq!(is_white_space('\u{90000}'), false); + assert_eq!(is_white_space('\u{a0000}'), false); + assert_eq!(is_white_space('\u{b0000}'), false); + assert_eq!(is_white_space('\u{c0000}'), false); + assert_eq!(is_white_space('\u{d0000}'), false); + assert_eq!(is_white_space('\u{e0000}'), false); + + assert_eq!(is_white_space('\u{efffe}'), false); + assert_eq!(is_white_space('\u{effff}'), false); + + // Priavte-Use Area + assert_eq!(is_white_space('\u{f0000}'), false); + assert_eq!(is_white_space('\u{f0001}'), false); + assert_eq!(is_white_space('\u{ffffe}'), false); + assert_eq!(is_white_space('\u{fffff}'), false); + assert_eq!(is_white_space('\u{100000}'), false); + assert_eq!(is_white_space('\u{100001}'), false); + assert_eq!(is_white_space('\u{10fffe}'), false); + assert_eq!(is_white_space('\u{10ffff}'), false); + } +} diff --git a/unic/ucd/common/tables/control.rsv b/unic/ucd/common/tables/control.rsv new file mode 100644 index 00000000..365d065e --- /dev/null +++ b/unic/ucd/common/tables/control.rsv @@ -0,0 +1,6 @@ +// WARNING: Auto-generated by the `unic-gen` crate. +// WARNING: DO NOT EDIT MANUALLY! +CharDataTable::Range(&[ + (chars!('\u{0}'..='\u{1f}'), ()), + (chars!('\u{7f}'..='\u{9f}'), ()), +]) diff --git a/unic/ucd/common/tables/white_space.rsv b/unic/ucd/common/tables/white_space.rsv new file mode 100644 index 00000000..c76f94d0 --- /dev/null +++ b/unic/ucd/common/tables/white_space.rsv @@ -0,0 +1,14 @@ +// WARNING: Auto-generated by the `unic-gen` crate. +// WARNING: DO NOT EDIT MANUALLY! +CharDataTable::Range(&[ + (chars!('\u{9}'..='\u{d}'), ()), + (chars!('\u{20}'..='\u{20}'), ()), + (chars!('\u{85}'..='\u{85}'), ()), + (chars!('\u{a0}'..='\u{a0}'), ()), + (chars!('\u{1680}'..='\u{1680}'), ()), + (chars!('\u{2000}'..='\u{200a}'), ()), + (chars!('\u{2028}'..='\u{2029}'), ()), + (chars!('\u{202f}'..='\u{202f}'), ()), + (chars!('\u{205f}'..='\u{205f}'), ()), + (chars!('\u{3000}'..='\u{3000}'), ()), +]) From 652f4c024e13d352903f0cac960cb8165629159a Mon Sep 17 00:00:00 2001 From: Behnam Esfahbod Date: Tue, 3 Oct 2017 15:46:42 -0700 Subject: [PATCH 3/3] [ucd/common] Add consistency test Add new integration test to check, for all code-points, consistency between common properties themselves, and versus General_Category. --- unic/ucd/common/Cargo.toml | 3 + unic/ucd/common/tests/consistency_tests.rs | 103 +++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 unic/ucd/common/tests/consistency_tests.rs diff --git a/unic/ucd/common/Cargo.toml b/unic/ucd/common/Cargo.toml index 54f92509..40a59b4a 100644 --- a/unic/ucd/common/Cargo.toml +++ b/unic/ucd/common/Cargo.toml @@ -18,3 +18,6 @@ travis-ci = { repository = "behnam/rust-unic", branch = "master" } unic-char-property = { path = "../../char/property/", version = "0.6.0" } unic-char-range = { path = "../../char/range", version = "0.6.0" } unic-ucd-core = { path = "../core/", version = "0.6.0" } + +[dev-dependencies] +unic-ucd-category = { path = "../category/", version = "0.6.0" } diff --git a/unic/ucd/common/tests/consistency_tests.rs b/unic/ucd/common/tests/consistency_tests.rs new file mode 100644 index 00000000..9130ba78 --- /dev/null +++ b/unic/ucd/common/tests/consistency_tests.rs @@ -0,0 +1,103 @@ +// Copyright 2017 The UNIC Project Developers. +// +// See the COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +#[macro_use] +extern crate unic_char_range; + +extern crate unic_ucd_category; +extern crate unic_ucd_common; + + +use unic_ucd_category::GeneralCategory; +use unic_ucd_common::{is_alphabetic, is_alphanumeric, is_control, is_numeric, is_white_space}; + + +macro_rules! assert_char { + ( + $ch:expr, + if $precondition:expr => [ + $( $condition:expr $(,)* ),+ + ] + ) => ( + if $precondition { + $( + assert!( + $condition, + "Code-point U+{:04x} meets precondition `{}` but not condition `{}`.", + $ch as u32, + stringify!($precondition), + stringify!($condition) + ); + )+ + } + ); +} + + +#[test] +fn test_values_internally_and_against_general_category() { + for ch in chars!(..) { + let ch_is_alphabetic = is_alphabetic(ch); + let ch_is_alphanumeric = is_alphanumeric(ch); + let ch_is_control = is_control(ch); + let ch_is_numeric = is_numeric(ch); + let ch_is_white_space = is_white_space(ch); + + let gc = GeneralCategory::of(ch); + let gc_is_letter_number = gc == GeneralCategory::LetterNumber; + let gc_is_control = gc == GeneralCategory::Control; + + // Alphabetic + assert_char!(ch, if ch_is_alphabetic => [ + !ch_is_control, + !ch_is_numeric || gc_is_letter_number, + !ch_is_white_space, + ch_is_alphanumeric, + ]); + + // Control + assert_char!(ch, if ch_is_control => [ + !ch_is_alphabetic, + // Has overlap with ch_is_white_space, like U+0009..U+000D, U+0085 + !ch_is_numeric, + !ch_is_alphanumeric, + ]); + + // Numeric + assert_char!(ch, if ch_is_numeric => [ + !ch_is_alphabetic || gc_is_letter_number, + !ch_is_control, + !ch_is_white_space, + ch_is_alphanumeric, + ]); + + // White Space + assert_char!(ch, if ch_is_white_space => [ + !ch_is_alphabetic, + // has overlap with ch_is_control, like U+0009..U+000D, U+0085 + !ch_is_numeric, + !ch_is_alphanumeric, + ]); + + // Alphanumeric + assert_char!(ch, if ch_is_alphanumeric => [ + ch_is_alphabetic || ch_is_numeric, + !ch_is_control, + !ch_is_white_space, + ]); + + // General Category vs common + assert_char!(ch, if ch_is_control => [ gc_is_control ]); + assert_char!(ch, if gc_is_control => [ ch_is_control ]); + assert_char!(ch, if gc.is_letter() => [ ch_is_alphabetic ]); + assert_char!(ch, if gc.is_number() => [ ch_is_numeric ]); + } +}