// This header is from java.lang.Character.java in Apache Harmony // // Licensed to the ASF // Apache License // #ifndef _IV_CHARACTER_H_ #define _IV_CHARACTER_H_ #include #include #include #include namespace iv { namespace core { namespace character { static const uint16_t kMinValue = 0; static const uint16_t kMaxValue = 0xFFFF; static const int kMinRadix = 2; static const int kMaxRadix = 36; enum Category { UNASSIGNED = 0, // Cn UPPERCASE_LETTER = 1, // Lu LOWERCASE_LETTER = 2, // Ll TITLECASE_LETTER = 3, // Lt MODIFIER_LETTER = 4, // Lm OTHER_LETTER = 5, // Lo NON_SPACING_MARK = 6, // Mn ENCLOSING_MARK = 7, // Me COMBINING_SPACING_MARK = 8, // Mc DECIMAL_DIGIT_NUMBER = 9, // Nd LETTER_NUMBER = 10, // Nl OTHER_NUMBER = 11, // No SPACE_SEPARATOR = 12, // Zs LINE_SEPARATOR = 13, // Zl PARAGRAPH_SEPARATOR = 14, // Zp CONTROL = 15, // Cc FORMAT = 16, // Cf PRIVATE_USE = 18, // Co SURROGATE = 19, // Cs DASH_PUNCTUATION = 20, // Pd START_PUNCTUATION = 21, // Ps END_PUNCTUATION = 22, // Pe CONNECTOR_PUNCTUATION = 23, // Pc OTHER_PUNCTUATION = 24, // Po MATH_SYMBOL = 25, // Sm CURRENCY_SYMBOL = 26, // Sc MODIFIER_SYMBOL = 27, // Sk OTHER_SYMBOL = 28, // So INITIAL_QUOTE_PUNCTUATION = 29, // Pi FINAL_QUOTE_PUNCTUATION = 30 // Pf }; enum CategoryFlag { Cn = 1 << UNASSIGNED, Lu = 1 << UPPERCASE_LETTER, Ll = 1 << LOWERCASE_LETTER, Lt = 1 << TITLECASE_LETTER, Lm = 1 << MODIFIER_LETTER, Lo = 1 << OTHER_LETTER, Mn = 1 << NON_SPACING_MARK, Me = 1 << ENCLOSING_MARK, Mc = 1 << COMBINING_SPACING_MARK, Nd = 1 << DECIMAL_DIGIT_NUMBER, Nl = 1 << LETTER_NUMBER, No = 1 << OTHER_NUMBER, Zs = 1 << SPACE_SEPARATOR, Zl = 1 << LINE_SEPARATOR, Zp = 1 << PARAGRAPH_SEPARATOR, Cc = 1 << CONTROL, Cf = 1 << FORMAT, Co = 1 << PRIVATE_USE, Cs = 1 << SURROGATE, Pd = 1 << DASH_PUNCTUATION, Ps = 1 << START_PUNCTUATION, Pe = 1 << END_PUNCTUATION, Pc = 1 << CONNECTOR_PUNCTUATION, Po = 1 << OTHER_PUNCTUATION, Sm = 1 << MATH_SYMBOL, Sc = 1 << CURRENCY_SYMBOL, Sk = 1 << MODIFIER_SYMBOL, So = 1 << OTHER_SYMBOL, Pi = 1 << INITIAL_QUOTE_PUNCTUATION, Pf = 1 << FINAL_QUOTE_PUNCTUATION }; // unicode bidirectional constant static const int kDirectionalityUndefined = -1; static const int kDirectionalityLeftToRight = 0; // L static const int kDirectionalityRightToLeft = 1; // R static const int kDirectionalityRightToLeftArabic = 2; // AL static const int kDirectionalityEnuropeanNumber = 3; // EN static const int kDirectionalityEnuropeanNumberSeparator = 4; // ES static const int kDirectionalityEnuropeanNumberTerminator = 5; // ET static const int kDirectionalityEnuropeanArabicNumber = 6; // AN static const int kDirectionalityCommonNumberSeparator = 7; // CS static const int kDirectionalityNonspacingMark = 8; // NSM static const int kDirectionalityBoundaryNeutral = 9; // BN static const int kDirectionalityParagraphSeparator = 10; // B static const int kDirectionalitySegmentSeparator = 11; // S static const int kDirectionalityWhiteSpace = 12; // WS static const int kDirectionalityOtherNeutrals = 13; // ON static const int kDirectionalityLeftToRightEmbedding = 14; // LRE static const int kDirectionalityLeftToRightOverride = 15; // LRO static const int kDirectionalityRightToLeftEmbedding = 16; // RLE static const int kDirectionalityRightToLeftOverride = 17; // RLO static const int kDirectionalityPopDirectionalFormat = 18; // PDF static const uint16_t kMinHighSurrogate = 0xD800; static const uint16_t kMaxHighSurrogate = 0xDBFF; static const uint16_t kMaxLowSurrogate = 0xDFFF; static const uint16_t kMinLowSurrogate = 0xD800; static const uint16_t kMinSurrogate = 0xD800; static const uint16_t kMaxSurrogate = 0xDFFF; static const int kMinSupplementaryCodePoint = 0x10000; static const int kMinCodePoint = 0x0000000; static const int kMaxCodePoint = 0x10FFFF; static const int kSize = 16; static const std::tr1::array kCategoryCache = { { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 24, 24, 24, 26, 24, 24, 24, 21, 22, 24, 25, 24, 20, 24, 24, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 24, 24, 25, 25, 25, 24, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 24, 22, 27, 23, 27, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, 25, 22, 25, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 24, 26, 26, 26, 26, 28, 28, 27, 28, 2, 29, 25, 16, 28, 27, 28, 25, 11, 11, 27, 2, 28, 24, 27, 11, 2, 30, 11, 11, 11, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 5, 1, 2, 2, 2, 5, 5, 5, 5, 1, 3, 2, 1, 3, 2, 1, 3, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 3, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 27, 27, 27, 27, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 4, 4, 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 4, 27, 4, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 2, 1, 2, 4, 27, 1, 2, 0, 0, 4, 2, 2, 2, 24, 0, 0, 0, 0, 0, 27, 27, 1, 24, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 } }; static const std::tr1::array kCategoryKeys = { { 0x3E8, 0x3EF, 0x3F4, 0x3F5, 0x3F6, 0x3F7, 0x3F8, 0x3F9, 0x3FB, 0x3FD, 0x430, 0x460, 0x461, 0x462, 0x463, 0x464, 0x465, 0x466, 0x467, 0x468, 0x469, 0x46A, 0x46B, 0x46C, 0x46D, 0x46E, 0x46F, 0x470, 0x471, 0x472, 0x473, 0x474, 0x475, 0x476, 0x477, 0x478, 0x479, 0x47A, 0x47B, 0x47C, 0x47D, 0x47E, 0x47F, 0x480, 0x481, 0x482, 0x483, 0x488, 0x48A, 0x4C0, 0x4C2, 0x4CE, 0x4D0, 0x531, 0x559, 0x55A, 0x561, 0x589, 0x591, 0x5BE, 0x5BF, 0x5C0, 0x5C1, 0x5C3, 0x5C4, 0x5C6, 0x5D0, 0x5F0, 0x5F3, 0x600, 0x606, 0x609, 0x60B, 0x60C, 0x60E, 0x610, 0x61B, 0x61E, 0x620, 0x640, 0x641, 0x64B, 0x660, 0x66A, 0x66E, 0x670, 0x671, 0x6D4, 0x6D6, 0x6DD, 0x6DF, 0x6E5, 0x6E7, 0x6E9, 0x6EA, 0x6EE, 0x6F0, 0x6FA, 0x6FD, 0x6FF, 0x700, 0x70F, 0x710, 0x711, 0x712, 0x730, 0x74D, 0x7A6, 0x7B1, 0x7C0, 0x7CA, 0x7EB, 0x7F4, 0x7F6, 0x7F7, 0x7FA, 0x800, 0x816, 0x81A, 0x81B, 0x824, 0x825, 0x828, 0x829, 0x830, 0x840, 0x859, 0x85E, 0x900, 0x903, 0x904, 0x93A, 0x93B, 0x93C, 0x93D, 0x93E, 0x941, 0x949, 0x94D, 0x94E, 0x950, 0x951, 0x958, 0x962, 0x964, 0x966, 0x970, 0x972, 0x979, 0x981, 0x982, 0x985, 0x98F, 0x993, 0x9AA, 0x9B2, 0x9B6, 0x9BC, 0x9BE, 0x9C1, 0x9C7, 0x9CB, 0x9CD, 0x9D7, 0x9DC, 0x9DF, 0x9E2, 0x9E6, 0x9F0, 0x9F2, 0x9F4, 0x9FA, 0xA01, 0xA03, 0xA05, 0xA0F, 0xA13, 0xA2A, 0xA32, 0xA35, 0xA38, 0xA3C, 0xA3E, 0xA41, 0xA47, 0xA4B, 0xA51, 0xA59, 0xA5E, 0xA66, 0xA70, 0xA72, 0xA75, 0xA81, 0xA83, 0xA85, 0xA8F, 0xA93, 0xAAA, 0xAB2, 0xAB5, 0xABC, 0xABE, 0xAC1, 0xAC7, 0xAC9, 0xACB, 0xACD, 0xAD0, 0xAE0, 0xAE2, 0xAE6, 0xAF1, 0xB01, 0xB02, 0xB05, 0xB0F, 0xB13, 0xB2A, 0xB32, 0xB35, 0xB3C, 0xB3D, 0xB3E, 0xB3F, 0xB40, 0xB41, 0xB47, 0xB4B, 0xB4D, 0xB56, 0xB5C, 0xB5F, 0xB62, 0xB66, 0xB70, 0xB72, 0xB82, 0xB85, 0xB8E, 0xB92, 0xB99, 0xB9C, 0xB9E, 0xBA3, 0xBA8, 0xBAE, 0xBBE, 0xBC0, 0xBC1, 0xBC6, 0xBCA, 0xBCD, 0xBD0, 0xBD7, 0xBE6, 0xBF0, 0xBF3, 0xBF9, 0xC01, 0xC05, 0xC0E, 0xC12, 0xC2A, 0xC35, 0xC3D, 0xC3E, 0xC41, 0xC46, 0xC4A, 0xC55, 0xC58, 0xC60, 0xC62, 0xC66, 0xC78, 0xC7F, 0xC82, 0xC85, 0xC8E, 0xC92, 0xCAA, 0xCB5, 0xCBC, 0xCBD, 0xCBE, 0xCBF, 0xCC0, 0xCC6, 0xCC7, 0xCCA, 0xCCC, 0xCD5, 0xCDE, 0xCE0, 0xCE2, 0xCE6, 0xCF1, 0xD02, 0xD05, 0xD0E, 0xD12, 0xD3D, 0xD3E, 0xD41, 0xD46, 0xD4A, 0xD4D, 0xD57, 0xD60, 0xD62, 0xD66, 0xD70, 0xD79, 0xD7A, 0xD82, 0xD85, 0xD9A, 0xDB3, 0xDBD, 0xDC0, 0xDCA, 0xDCF, 0xDD2, 0xDD6, 0xDD8, 0xDF2, 0xDF4, 0xE01, 0xE31, 0xE32, 0xE34, 0xE3F, 0xE40, 0xE46, 0xE47, 0xE4F, 0xE50, 0xE5A, 0xE81, 0xE84, 0xE87, 0xE8A, 0xE8D, 0xE94, 0xE99, 0xEA1, 0xEA5, 0xEA7, 0xEAA, 0xEAD, 0xEB1, 0xEB2, 0xEB4, 0xEBB, 0xEBD, 0xEC0, 0xEC6, 0xEC8, 0xED0, 0xEDC, 0xF00, 0xF01, 0xF04, 0xF13, 0xF18, 0xF1A, 0xF20, 0xF2A, 0xF34, 0xF35, 0xF36, 0xF37, 0xF38, 0xF39, 0xF3A, 0xF3B, 0xF3C, 0xF3D, 0xF3E, 0xF40, 0xF49, 0xF71, 0xF7F, 0xF80, 0xF85, 0xF86, 0xF88, 0xF8D, 0xF99, 0xFBE, 0xFC6, 0xFC7, 0xFCE, 0xFD0, 0xFD5, 0xFD9, 0x1000, 0x102B, 0x102D, 0x1031, 0x1032, 0x1038, 0x1039, 0x103B, 0x103D, 0x103F, 0x1040, 0x104A, 0x1050, 0x1056, 0x1058, 0x105A, 0x105E, 0x1061, 0x1062, 0x1065, 0x1067, 0x106E, 0x1071, 0x1075, 0x1082, 0x1083, 0x1085, 0x1087, 0x108D, 0x108E, 0x108F, 0x1090, 0x109A, 0x109D, 0x109E, 0x10A0, 0x10D0, 0x10FB, 0x1100, 0x124A, 0x1250, 0x1258, 0x125A, 0x1260, 0x128A, 0x1290, 0x12B2, 0x12B8, 0x12C0, 0x12C2, 0x12C8, 0x12D8, 0x1312, 0x1318, 0x135D, 0x1360, 0x1361, 0x1369, 0x1380, 0x1390, 0x13A0, 0x1400, 0x1401, 0x166D, 0x166F, 0x1680, 0x1681, 0x169B, 0x16A0, 0x16EB, 0x16EE, 0x1700, 0x170E, 0x1712, 0x1720, 0x1732, 0x1735, 0x1740, 0x1752, 0x1760, 0x176E, 0x1772, 0x1780, 0x17B4, 0x17B6, 0x17B7, 0x17BE, 0x17C6, 0x17C7, 0x17C9, 0x17D4, 0x17D7, 0x17D8, 0x17DB, 0x17DC, 0x17DD, 0x17E0, 0x17F0, 0x1800, 0x1806, 0x1807, 0x180B, 0x180E, 0x1810, 0x1820, 0x1843, 0x1844, 0x1880, 0x18A9, 0x18B0, 0x1900, 0x1920, 0x1923, 0x1927, 0x1929, 0x1930, 0x1932, 0x1933, 0x1939, 0x1940, 0x1944, 0x1946, 0x1950, 0x1970, 0x1980, 0x19B0, 0x19C1, 0x19C8, 0x19D0, 0x19DA, 0x19DE, 0x1A00, 0x1A17, 0x1A19, 0x1A1E, 0x1A20, 0x1A55, 0x1A58, 0x1A60, 0x1A63, 0x1A65, 0x1A6D, 0x1A73, 0x1A7F, 0x1A80, 0x1A90, 0x1AA0, 0x1AA7, 0x1AA8, 0x1B00, 0x1B04, 0x1B05, 0x1B34, 0x1B36, 0x1B3B, 0x1B3D, 0x1B42, 0x1B43, 0x1B45, 0x1B50, 0x1B5A, 0x1B61, 0x1B6B, 0x1B74, 0x1B80, 0x1B82, 0x1B83, 0x1BA1, 0x1BA2, 0x1BA6, 0x1BA8, 0x1BAA, 0x1BAE, 0x1BB0, 0x1BC0, 0x1BE6, 0x1BE8, 0x1BEA, 0x1BED, 0x1BEF, 0x1BF2, 0x1BFC, 0x1C00, 0x1C24, 0x1C2C, 0x1C34, 0x1C36, 0x1C3B, 0x1C40, 0x1C4D, 0x1C50, 0x1C5A, 0x1C78, 0x1C7E, 0x1CD0, 0x1CD3, 0x1CD4, 0x1CE1, 0x1CE2, 0x1CE9, 0x1CED, 0x1CEE, 0x1CF2, 0x1D00, 0x1D2C, 0x1D62, 0x1D78, 0x1D79, 0x1D9B, 0x1DC0, 0x1DFC, 0x1E00, 0x1E95, 0x1E9E, 0x1EFF, 0x1F08, 0x1F10, 0x1F18, 0x1F20, 0x1F28, 0x1F30, 0x1F38, 0x1F40, 0x1F48, 0x1F50, 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x1F60, 0x1F68, 0x1F70, 0x1F80, 0x1F88, 0x1F90, 0x1F98, 0x1FA0, 0x1FA8, 0x1FB0, 0x1FB6, 0x1FB8, 0x1FBC, 0x1FBD, 0x1FBE, 0x1FBF, 0x1FC2, 0x1FC6, 0x1FC8, 0x1FCC, 0x1FCD, 0x1FD0, 0x1FD6, 0x1FD8, 0x1FDD, 0x1FE0, 0x1FE8, 0x1FED, 0x1FF2, 0x1FF6, 0x1FF8, 0x1FFC, 0x1FFD, 0x2000, 0x200B, 0x2010, 0x2016, 0x2018, 0x2019, 0x201A, 0x201B, 0x201D, 0x201E, 0x201F, 0x2020, 0x2028, 0x202A, 0x202F, 0x2030, 0x2039, 0x203B, 0x203F, 0x2041, 0x2044, 0x2045, 0x2046, 0x2047, 0x2052, 0x2053, 0x2054, 0x2055, 0x205F, 0x2060, 0x206A, 0x2070, 0x2074, 0x207A, 0x207D, 0x207E, 0x207F, 0x2080, 0x208A, 0x208D, 0x2090, 0x20A0, 0x20D0, 0x20DD, 0x20E1, 0x20E2, 0x20E5, 0x2100, 0x2102, 0x2103, 0x2107, 0x2108, 0x210A, 0x210B, 0x210E, 0x2110, 0x2113, 0x2114, 0x2115, 0x2116, 0x2118, 0x2119, 0x211E, 0x2124, 0x212A, 0x212E, 0x2130, 0x2134, 0x2135, 0x2139, 0x213A, 0x213C, 0x213E, 0x2140, 0x2145, 0x2146, 0x214A, 0x214C, 0x214E, 0x2150, 0x2160, 0x2183, 0x2185, 0x2189, 0x2190, 0x2195, 0x219A, 0x219C, 0x21A0, 0x21A1, 0x21A3, 0x21A4, 0x21A6, 0x21A7, 0x21AE, 0x21AF, 0x21CE, 0x21D0, 0x21D2, 0x21D5, 0x21F4, 0x2300, 0x2308, 0x230C, 0x2320, 0x2322, 0x2329, 0x232B, 0x237C, 0x237D, 0x239B, 0x23B4, 0x23DC, 0x23E2, 0x2400, 0x2440, 0x2460, 0x249C, 0x24EA, 0x2500, 0x25B7, 0x25B8, 0x25C1, 0x25C2, 0x25F8, 0x2600, 0x266F, 0x2670, 0x2701, 0x2768, 0x2776, 0x2794, 0x27C0, 0x27C5, 0x27C7, 0x27CC, 0x27CE, 0x27E6, 0x27F0, 0x2800, 0x2900, 0x2983, 0x2999, 0x29D8, 0x29DC, 0x29FC, 0x29FE, 0x2B00, 0x2B30, 0x2B45, 0x2B47, 0x2B50, 0x2C00, 0x2C30, 0x2C60, 0x2C62, 0x2C65, 0x2C67, 0x2C6D, 0x2C71, 0x2C73, 0x2C75, 0x2C76, 0x2C7D, 0x2C7E, 0x2C81, 0x2CE3, 0x2CE5, 0x2CEB, 0x2CEF, 0x2CF9, 0x2CFD, 0x2CFE, 0x2D00, 0x2D30, 0x2D6F, 0x2D7F, 0x2D80, 0x2DA0, 0x2DA8, 0x2DB0, 0x2DB8, 0x2DC0, 0x2DC8, 0x2DD0, 0x2DD8, 0x2DE0, 0x2E00, 0x2E02, 0x2E06, 0x2E09, 0x2E0A, 0x2E0B, 0x2E0C, 0x2E0D, 0x2E0E, 0x2E17, 0x2E18, 0x2E1A, 0x2E1B, 0x2E1C, 0x2E1D, 0x2E1E, 0x2E20, 0x2E21, 0x2E22, 0x2E23, 0x2E24, 0x2E25, 0x2E26, 0x2E27, 0x2E28, 0x2E29, 0x2E2A, 0x2E2F, 0x2E30, 0x2E80, 0x2E9B, 0x2F00, 0x2FF0, 0x3000, 0x3001, 0x3004, 0x3005, 0x3006, 0x3007, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0x3012, 0x3014, 0x3015, 0x3016, 0x3017, 0x3018, 0x3019, 0x301A, 0x301B, 0x301C, 0x301D, 0x301E, 0x3020, 0x3021, 0x302A, 0x3030, 0x3031, 0x3036, 0x3038, 0x303B, 0x303C, 0x303D, 0x303E, 0x3041, 0x3099, 0x309B, 0x309D, 0x309F, 0x30A1, 0x30FB, 0x30FC, 0x30FF, 0x3105, 0x3131, 0x3190, 0x3192, 0x3196, 0x31A0, 0x31C0, 0x31F0, 0x3200, 0x3220, 0x322A, 0x3251, 0x3260, 0x3280, 0x328A, 0x32B1, 0x32C0, 0x3300, 0x3400, 0x4DC0, 0x4E00, 0xA000, 0xA015, 0xA016, 0xA490, 0xA4D0, 0xA4F8, 0xA4FE, 0xA500, 0xA60C, 0xA60D, 0xA610, 0xA620, 0xA62A, 0xA640, 0xA641, 0xA642, 0xA643, 0xA644, 0xA645, 0xA646, 0xA647, 0xA648, 0xA649, 0xA64A, 0xA64B, 0xA64C, 0xA64D, 0xA64E, 0xA64F, 0xA650, 0xA651, 0xA652, 0xA653, 0xA654, 0xA655, 0xA656, 0xA657, 0xA658, 0xA659, 0xA65A, 0xA65B, 0xA65C, 0xA65D, 0xA65E, 0xA65F, 0xA660, 0xA661, 0xA662, 0xA663, 0xA664, 0xA665, 0xA666, 0xA667, 0xA668, 0xA669, 0xA66A, 0xA66B, 0xA66C, 0xA66D, 0xA66E, 0xA66F, 0xA670, 0xA673, 0xA67C, 0xA67E, 0xA67F, 0xA680, 0xA681, 0xA682, 0xA683, 0xA684, 0xA685, 0xA686, 0xA687, 0xA688, 0xA689, 0xA68A, 0xA68B, 0xA68C, 0xA68D, 0xA68E, 0xA68F, 0xA690, 0xA691, 0xA692, 0xA693, 0xA694, 0xA695, 0xA696, 0xA697, 0xA6A0, 0xA6E6, 0xA6F0, 0xA6F2, 0xA700, 0xA717, 0xA720, 0xA722, 0xA72F, 0xA732, 0xA733, 0xA734, 0xA735, 0xA736, 0xA737, 0xA738, 0xA739, 0xA73A, 0xA73B, 0xA73C, 0xA73D, 0xA73E, 0xA73F, 0xA740, 0xA741, 0xA742, 0xA743, 0xA744, 0xA745, 0xA746, 0xA747, 0xA748, 0xA749, 0xA74A, 0xA74B, 0xA74C, 0xA74D, 0xA74E, 0xA74F, 0xA750, 0xA751, 0xA752, 0xA753, 0xA754, 0xA755, 0xA756, 0xA757, 0xA758, 0xA759, 0xA75A, 0xA75B, 0xA75C, 0xA75D, 0xA75E, 0xA75F, 0xA760, 0xA761, 0xA762, 0xA763, 0xA764, 0xA765, 0xA766, 0xA767, 0xA768, 0xA769, 0xA76A, 0xA76B, 0xA76C, 0xA76D, 0xA76E, 0xA76F, 0xA770, 0xA771, 0xA779, 0xA77D, 0xA77F, 0xA780, 0xA781, 0xA782, 0xA783, 0xA784, 0xA785, 0xA786, 0xA787, 0xA788, 0xA789, 0xA78B, 0xA790, 0xA7A0, 0xA7FA, 0xA7FB, 0xA802, 0xA803, 0xA806, 0xA807, 0xA80B, 0xA80C, 0xA823, 0xA825, 0xA827, 0xA828, 0xA830, 0xA836, 0xA838, 0xA840, 0xA874, 0xA880, 0xA882, 0xA8B4, 0xA8C4, 0xA8CE, 0xA8D0, 0xA8E0, 0xA8F2, 0xA8F8, 0xA8FB, 0xA900, 0xA90A, 0xA926, 0xA92E, 0xA930, 0xA947, 0xA952, 0xA95F, 0xA960, 0xA980, 0xA983, 0xA984, 0xA9B3, 0xA9B4, 0xA9B6, 0xA9BA, 0xA9BC, 0xA9BD, 0xA9C1, 0xA9CF, 0xA9D0, 0xA9DE, 0xAA00, 0xAA29, 0xAA2F, 0xAA31, 0xAA33, 0xAA35, 0xAA40, 0xAA43, 0xAA44, 0xAA4C, 0xAA50, 0xAA5C, 0xAA60, 0xAA70, 0xAA71, 0xAA77, 0xAA7A, 0xAA80, 0xAAB0, 0xAAB2, 0xAAB5, 0xAAB7, 0xAAB9, 0xAABE, 0xAAC0, 0xAADB, 0xAADD, 0xAADE, 0xAB01, 0xAB09, 0xAB11, 0xAB20, 0xAB28, 0xABC0, 0xABE3, 0xABE5, 0xABE6, 0xABE8, 0xABE9, 0xABEB, 0xABEC, 0xABED, 0xABF0, 0xAC00, 0xD7B0, 0xD7CB, 0xD800, 0xE000, 0xF900, 0xFA30, 0xFA70, 0xFB00, 0xFB13, 0xFB1D, 0xFB1F, 0xFB29, 0xFB2A, 0xFB38, 0xFB3E, 0xFB40, 0xFB43, 0xFB46, 0xFBB2, 0xFBD3, 0xFD3E, 0xFD50, 0xFD92, 0xFDF0, 0xFDFC, 0xFE00, 0xFE10, 0xFE17, 0xFE18, 0xFE19, 0xFE20, 0xFE30, 0xFE31, 0xFE33, 0xFE35, 0xFE45, 0xFE47, 0xFE49, 0xFE4D, 0xFE50, 0xFE54, 0xFE58, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE62, 0xFE64, 0xFE68, 0xFE6A, 0xFE70, 0xFE76, 0xFEFF, 0xFF01, 0xFF04, 0xFF05, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF10, 0xFF1A, 0xFF1C, 0xFF1F, 0xFF21, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0xFF5F, 0xFF60, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF66, 0xFF70, 0xFF71, 0xFF9E, 0xFFA0, 0xFFC2, 0xFFCA, 0xFFD2, 0xFFDA, 0xFFE0, 0xFFE2, 0xFFE3, 0xFFE4, 0xFFE5, 0xFFE8, 0xFFE9, 0xFFED, 0xFFF9, 0xFFFC } }; static const std::tr1::array kCategoryValues = { { 0x3EE, 0x201, 0x3F3, 0x2, 0x3F4, 0x1, 0x3F5, 0x2, 0x3F6, 0x19, 0x3F7, 0x1, 0x3F8, 0x2, 0x3FA, 0x1, 0x3FC, 0x2, 0x42F, 0x1, 0x45F, 0x2, 0x460, 0x1, 0x461, 0x2, 0x462, 0x1, 0x463, 0x2, 0x464, 0x1, 0x465, 0x2, 0x466, 0x1, 0x467, 0x2, 0x468, 0x1, 0x469, 0x2, 0x46A, 0x1, 0x46B, 0x2, 0x46C, 0x1, 0x46D, 0x2, 0x46E, 0x1, 0x46F, 0x2, 0x470, 0x1, 0x471, 0x2, 0x472, 0x1, 0x473, 0x2, 0x474, 0x1, 0x475, 0x2, 0x476, 0x1, 0x477, 0x2, 0x478, 0x1, 0x479, 0x2, 0x47A, 0x1, 0x47B, 0x2, 0x47C, 0x1, 0x47D, 0x2, 0x47E, 0x1, 0x47F, 0x2, 0x480, 0x1, 0x481, 0x2, 0x482, 0x1C, 0x487, 0x6, 0x489, 0x7, 0x4BF, 0x201, 0x4C1, 0x1, 0x4CD, 0x102, 0x4CF, 0x2, 0x527, 0x201, 0x556, 0x1, 0x559, 0x4, 0x55F, 0x18, 0x587, 0x2, 0x58A, 0x1814, 0x5BD, 0x6, 0x5BE, 0x14, 0x5BF, 0x6, 0x5C0, 0x18, 0x5C2, 0x6, 0x5C3, 0x18, 0x5C5, 0x6, 0x5C7, 0x618, 0x5EA, 0x5, 0x5F2, 0x5, 0x5F4, 0x18, 0x603, 0x10, 0x608, 0x19, 0x60A, 0x18, 0x60B, 0x1A, 0x60D, 0x18, 0x60F, 0x1C, 0x61A, 0x6, 0x61B, 0x18, 0x61F, 0x18, 0x63F, 0x5, 0x640, 0x4, 0x64A, 0x5, 0x65F, 0x6, 0x669, 0x9, 0x66D, 0x18, 0x66F, 0x5, 0x670, 0x6, 0x6D3, 0x5, 0x6D5, 0x518, 0x6DC, 0x6, 0x6DE, 0x101C, 0x6E4, 0x6, 0x6E6, 0x4, 0x6E8, 0x6, 0x6E9, 0x1C, 0x6ED, 0x6, 0x6EF, 0x5, 0x6F9, 0x9, 0x6FC, 0x5, 0x6FE, 0x1C, 0x6FF, 0x5, 0x70D, 0x18, 0x70F, 0x10, 0x710, 0x5, 0x711, 0x6, 0x72F, 0x5, 0x74A, 0x6, 0x7A5, 0x5, 0x7B0, 0x6, 0x7B1, 0x5, 0x7C9, 0x9, 0x7EA, 0x5, 0x7F3, 0x6, 0x7F5, 0x4, 0x7F6, 0x1C, 0x7F9, 0x18, 0x7FA, 0x4, 0x815, 0x5, 0x819, 0x6, 0x81A, 0x4, 0x823, 0x6, 0x824, 0x4, 0x827, 0x6, 0x828, 0x4, 0x82D, 0x6, 0x83E, 0x18, 0x858, 0x5, 0x85B, 0x6, 0x85E, 0x18, 0x902, 0x6, 0x903, 0x8, 0x939, 0x5, 0x93A, 0x6, 0x93B, 0x8, 0x93C, 0x6, 0x93D, 0x5, 0x940, 0x8, 0x948, 0x6, 0x94C, 0x8, 0x94D, 0x6, 0x94F, 0x8, 0x950, 0x5, 0x957, 0x6, 0x961, 0x5, 0x963, 0x6, 0x965, 0x18, 0x96F, 0x9, 0x971, 0x418, 0x977, 0x5, 0x97F, 0x5, 0x981, 0x6, 0x983, 0x8, 0x98C, 0x5, 0x990, 0x5, 0x9A8, 0x5, 0x9B0, 0x5, 0x9B2, 0x5, 0x9B9, 0x5, 0x9BD, 0x506, 0x9C0, 0x8, 0x9C4, 0x6, 0x9C8, 0x8, 0x9CC, 0x8, 0x9CE, 0x605, 0x9D7, 0x8, 0x9DD, 0x5, 0x9E1, 0x5, 0x9E3, 0x6, 0x9EF, 0x9, 0x9F1, 0x5, 0x9F3, 0x1A, 0x9F9, 0xB, 0x9FB, 0x1A1C, 0xA02, 0x6, 0xA03, 0x8, 0xA0A, 0x5, 0xA10, 0x5, 0xA28, 0x5, 0xA30, 0x5, 0xA33, 0x5, 0xA36, 0x5, 0xA39, 0x5, 0xA3C, 0x6, 0xA40, 0x8, 0xA42, 0x6, 0xA48, 0x6, 0xA4D, 0x6, 0xA51, 0x6, 0xA5C, 0x5, 0xA5E, 0x5, 0xA6F, 0x9, 0xA71, 0x6, 0xA74, 0x5, 0xA75, 0x6, 0xA82, 0x6, 0xA83, 0x8, 0xA8D, 0x5, 0xA91, 0x5, 0xAA8, 0x5, 0xAB0, 0x5, 0xAB3, 0x5, 0xAB9, 0x5, 0xABD, 0x506, 0xAC0, 0x8, 0xAC5, 0x6, 0xAC8, 0x6, 0xAC9, 0x8, 0xACC, 0x8, 0xACD, 0x6, 0xAD0, 0x5, 0xAE1, 0x5, 0xAE3, 0x6, 0xAEF, 0x9, 0xAF1, 0x1A, 0xB01, 0x6, 0xB03, 0x8, 0xB0C, 0x5, 0xB10, 0x5, 0xB28, 0x5, 0xB30, 0x5, 0xB33, 0x5, 0xB39, 0x5, 0xB3C, 0x6, 0xB3D, 0x5, 0xB3E, 0x8, 0xB3F, 0x6, 0xB40, 0x8, 0xB44, 0x6, 0xB48, 0x8, 0xB4C, 0x8, 0xB4D, 0x6, 0xB57, 0x806, 0xB5D, 0x5, 0xB61, 0x5, 0xB63, 0x6, 0xB6F, 0x9, 0xB71, 0x51C, 0xB77, 0xB, 0xB83, 0x506, 0xB8A, 0x5, 0xB90, 0x5, 0xB95, 0x5, 0xB9A, 0x5, 0xB9C, 0x5, 0xB9F, 0x5, 0xBA4, 0x5, 0xBAA, 0x5, 0xBB9, 0x5, 0xBBF, 0x8, 0xBC0, 0x6, 0xBC2, 0x8, 0xBC8, 0x8, 0xBCC, 0x8, 0xBCD, 0x6, 0xBD0, 0x5, 0xBD7, 0x8, 0xBEF, 0x9, 0xBF2, 0xB, 0xBF8, 0x1C, 0xBFA, 0x1A1C, 0xC03, 0x8, 0xC0C, 0x5, 0xC10, 0x5, 0xC28, 0x5, 0xC33, 0x5, 0xC39, 0x5, 0xC3D, 0x5, 0xC40, 0x6, 0xC44, 0x8, 0xC48, 0x6, 0xC4D, 0x6, 0xC56, 0x6, 0xC59, 0x5, 0xC61, 0x5, 0xC63, 0x6, 0xC6F, 0x9, 0xC7E, 0xB, 0xC7F, 0x1C, 0xC83, 0x8, 0xC8C, 0x5, 0xC90, 0x5, 0xCA8, 0x5, 0xCB3, 0x5, 0xCB9, 0x5, 0xCBC, 0x6, 0xCBD, 0x5, 0xCBE, 0x8, 0xCBF, 0x6, 0xCC4, 0x8, 0xCC6, 0x6, 0xCC8, 0x8, 0xCCB, 0x8, 0xCCD, 0x6, 0xCD6, 0x8, 0xCDE, 0x5, 0xCE1, 0x5, 0xCE3, 0x6, 0xCEF, 0x9, 0xCF2, 0x5, 0xD03, 0x8, 0xD0C, 0x5, 0xD10, 0x5, 0xD3A, 0x5, 0xD3D, 0x5, 0xD40, 0x8, 0xD44, 0x6, 0xD48, 0x8, 0xD4C, 0x8, 0xD4E, 0x605, 0xD57, 0x8, 0xD61, 0x5, 0xD63, 0x6, 0xD6F, 0x9, 0xD75, 0xB, 0xD79, 0x1C, 0xD7F, 0x5, 0xD83, 0x8, 0xD96, 0x5, 0xDB1, 0x5, 0xDBB, 0x5, 0xDBD, 0x5, 0xDC6, 0x5, 0xDCA, 0x6, 0xDD1, 0x8, 0xDD4, 0x6, 0xDD6, 0x6, 0xDDF, 0x8, 0xDF3, 0x8, 0xDF4, 0x18, 0xE30, 0x5, 0xE31, 0x6, 0xE33, 0x5, 0xE3A, 0x6, 0xE3F, 0x1A, 0xE45, 0x5, 0xE46, 0x4, 0xE4E, 0x6, 0xE4F, 0x18, 0xE59, 0x9, 0xE5B, 0x18, 0xE82, 0x5, 0xE84, 0x5, 0xE88, 0x5, 0xE8A, 0x5, 0xE8D, 0x5, 0xE97, 0x5, 0xE9F, 0x5, 0xEA3, 0x5, 0xEA5, 0x5, 0xEA7, 0x5, 0xEAB, 0x5, 0xEB0, 0x5, 0xEB1, 0x6, 0xEB3, 0x5, 0xEB9, 0x6, 0xEBC, 0x6, 0xEBD, 0x5, 0xEC4, 0x5, 0xEC6, 0x4, 0xECD, 0x6, 0xED9, 0x9, 0xEDD, 0x5, 0xF00, 0x5, 0xF03, 0x1C, 0xF12, 0x18, 0xF17, 0x1C, 0xF19, 0x6, 0xF1F, 0x1C, 0xF29, 0x9, 0xF33, 0xB, 0xF34, 0x1C, 0xF35, 0x6, 0xF36, 0x1C, 0xF37, 0x6, 0xF38, 0x1C, 0xF39, 0x6, 0xF3A, 0x15, 0xF3B, 0x16, 0xF3C, 0x15, 0xF3D, 0x16, 0xF3F, 0x8, 0xF47, 0x5, 0xF6C, 0x5, 0xF7E, 0x6, 0xF7F, 0x8, 0xF84, 0x6, 0xF85, 0x18, 0xF87, 0x6, 0xF8C, 0x5, 0xF97, 0x6, 0xFBC, 0x6, 0xFC5, 0x1C, 0xFC6, 0x6, 0xFCC, 0x1C, 0xFCF, 0x1C, 0xFD4, 0x18, 0xFD8, 0x1C, 0xFDA, 0x18, 0x102A, 0x5, 0x102C, 0x8, 0x1030, 0x6, 0x1031, 0x8, 0x1037, 0x6, 0x1038, 0x8, 0x103A, 0x6, 0x103C, 0x8, 0x103E, 0x6, 0x103F, 0x5, 0x1049, 0x9, 0x104F, 0x18, 0x1055, 0x5, 0x1057, 0x8, 0x1059, 0x6, 0x105D, 0x5, 0x1060, 0x6, 0x1061, 0x5, 0x1064, 0x8, 0x1066, 0x5, 0x106D, 0x8, 0x1070, 0x5, 0x1074, 0x6, 0x1081, 0x5, 0x1082, 0x6, 0x1084, 0x8, 0x1086, 0x6, 0x108C, 0x8, 0x108D, 0x6, 0x108E, 0x5, 0x108F, 0x8, 0x1099, 0x9, 0x109C, 0x8, 0x109D, 0x6, 0x109F, 0x1C, 0x10C5, 0x1, 0x10FA, 0x5, 0x10FC, 0x1804, 0x1248, 0x5, 0x124D, 0x5, 0x1256, 0x5, 0x1258, 0x5, 0x125D, 0x5, 0x1288, 0x5, 0x128D, 0x5, 0x12B0, 0x5, 0x12B5, 0x5, 0x12BE, 0x5, 0x12C0, 0x5, 0x12C5, 0x5, 0x12D6, 0x5, 0x1310, 0x5, 0x1315, 0x5, 0x135A, 0x5, 0x135F, 0x6, 0x1360, 0x1C, 0x1368, 0x18, 0x137C, 0xB, 0x138F, 0x5, 0x1399, 0x1C, 0x13F4, 0x5, 0x1400, 0x14, 0x166C, 0x5, 0x166E, 0x18, 0x167F, 0x5, 0x1680, 0xC, 0x169A, 0x5, 0x169C, 0x1516, 0x16EA, 0x5, 0x16ED, 0x18, 0x16F0, 0xA, 0x170C, 0x5, 0x1711, 0x5, 0x1714, 0x6, 0x1731, 0x5, 0x1734, 0x6, 0x1736, 0x18, 0x1751, 0x5, 0x1753, 0x6, 0x176C, 0x5, 0x1770, 0x5, 0x1773, 0x6, 0x17B3, 0x5, 0x17B5, 0x10, 0x17B6, 0x8, 0x17BD, 0x6, 0x17C5, 0x8, 0x17C6, 0x6, 0x17C8, 0x8, 0x17D3, 0x6, 0x17D6, 0x18, 0x17D7, 0x4, 0x17DA, 0x18, 0x17DB, 0x1A, 0x17DC, 0x5, 0x17DD, 0x6, 0x17E9, 0x9, 0x17F9, 0xB, 0x1805, 0x18, 0x1806, 0x14, 0x180A, 0x18, 0x180D, 0x6, 0x180E, 0xC, 0x1819, 0x9, 0x1842, 0x5, 0x1843, 0x4, 0x1877, 0x5, 0x18A8, 0x5, 0x18AA, 0x605, 0x18F5, 0x5, 0x191C, 0x5, 0x1922, 0x6, 0x1926, 0x8, 0x1928, 0x6, 0x192B, 0x8, 0x1931, 0x8, 0x1932, 0x6, 0x1938, 0x8, 0x193B, 0x6, 0x1940, 0x1C, 0x1945, 0x18, 0x194F, 0x9, 0x196D, 0x5, 0x1974, 0x5, 0x19AB, 0x5, 0x19C0, 0x8, 0x19C7, 0x5, 0x19C9, 0x8, 0x19D9, 0x9, 0x19DA, 0xB, 0x19FF, 0x1C, 0x1A16, 0x5, 0x1A18, 0x6, 0x1A1B, 0x8, 0x1A1F, 0x18, 0x1A54, 0x5, 0x1A57, 0x806, 0x1A5E, 0x6, 0x1A62, 0x806, 0x1A64, 0x8, 0x1A6C, 0x6, 0x1A72, 0x8, 0x1A7C, 0x6, 0x1A7F, 0x6, 0x1A89, 0x9, 0x1A99, 0x9, 0x1AA6, 0x18, 0x1AA7, 0x4, 0x1AAD, 0x18, 0x1B03, 0x6, 0x1B04, 0x8, 0x1B33, 0x5, 0x1B35, 0x806, 0x1B3A, 0x6, 0x1B3C, 0x806, 0x1B41, 0x8, 0x1B42, 0x6, 0x1B44, 0x8, 0x1B4B, 0x5, 0x1B59, 0x9, 0x1B60, 0x18, 0x1B6A, 0x1C, 0x1B73, 0x6, 0x1B7C, 0x1C, 0x1B81, 0x6, 0x1B82, 0x8, 0x1BA0, 0x5, 0x1BA1, 0x8, 0x1BA5, 0x6, 0x1BA7, 0x8, 0x1BA9, 0x6, 0x1BAA, 0x8, 0x1BAF, 0x5, 0x1BB9, 0x9, 0x1BE5, 0x5, 0x1BE7, 0x806, 0x1BE9, 0x6, 0x1BEC, 0x8, 0x1BEE, 0x608, 0x1BF1, 0x6, 0x1BF3, 0x8, 0x1BFF, 0x18, 0x1C23, 0x5, 0x1C2B, 0x8, 0x1C33, 0x6, 0x1C35, 0x8, 0x1C37, 0x6, 0x1C3F, 0x18, 0x1C49, 0x9, 0x1C4F, 0x5, 0x1C59, 0x9, 0x1C77, 0x5, 0x1C7D, 0x4, 0x1C7F, 0x18, 0x1CD2, 0x6, 0x1CD3, 0x18, 0x1CE0, 0x6, 0x1CE1, 0x8, 0x1CE8, 0x6, 0x1CEC, 0x5, 0x1CED, 0x6, 0x1CF1, 0x5, 0x1CF2, 0x8, 0x1D2B, 0x2, 0x1D61, 0x4, 0x1D77, 0x2, 0x1D78, 0x4, 0x1D9A, 0x2, 0x1DBF, 0x4, 0x1DE6, 0x6, 0x1DFF, 0x6, 0x1E94, 0x201, 0x1E9D, 0x2, 0x1EFE, 0x201, 0x1F07, 0x2, 0x1F0F, 0x1, 0x1F15, 0x2, 0x1F1D, 0x1, 0x1F27, 0x2, 0x1F2F, 0x1, 0x1F37, 0x2, 0x1F3F, 0x1, 0x1F45, 0x2, 0x1F4D, 0x1, 0x1F57, 0x2, 0x1F59, 0x1, 0x1F5B, 0x1, 0x1F5D, 0x1, 0x1F5F, 0x1, 0x1F67, 0x2, 0x1F6F, 0x1, 0x1F7D, 0x2, 0x1F87, 0x2, 0x1F8F, 0x3, 0x1F97, 0x2, 0x1F9F, 0x3, 0x1FA7, 0x2, 0x1FAF, 0x3, 0x1FB4, 0x2, 0x1FB7, 0x2, 0x1FBB, 0x1, 0x1FBC, 0x3, 0x1FBD, 0x1B, 0x1FBE, 0x2, 0x1FC1, 0x1B, 0x1FC4, 0x2, 0x1FC7, 0x2, 0x1FCB, 0x1, 0x1FCC, 0x3, 0x1FCF, 0x1B, 0x1FD3, 0x2, 0x1FD7, 0x2, 0x1FDB, 0x1, 0x1FDF, 0x1B, 0x1FE7, 0x2, 0x1FEC, 0x1, 0x1FEF, 0x1B, 0x1FF4, 0x2, 0x1FF7, 0x2, 0x1FFB, 0x1, 0x1FFC, 0x3, 0x1FFE, 0x1B, 0x200A, 0xC, 0x200F, 0x10, 0x2015, 0x14, 0x2017, 0x18, 0x2018, 0x1D, 0x2019, 0x1E, 0x201A, 0x15, 0x201C, 0x1D, 0x201D, 0x1E, 0x201E, 0x15, 0x201F, 0x1D, 0x2027, 0x18, 0x2029, 0xE0D, 0x202E, 0x10, 0x202F, 0xC, 0x2038, 0x18, 0x203A, 0x1D1E, 0x203E, 0x18, 0x2040, 0x17, 0x2043, 0x18, 0x2044, 0x19, 0x2045, 0x15, 0x2046, 0x16, 0x2051, 0x18, 0x2052, 0x19, 0x2053, 0x18, 0x2054, 0x17, 0x205E, 0x18, 0x205F, 0xC, 0x2064, 0x10, 0x206F, 0x10, 0x2071, 0x40B, 0x2079, 0xB, 0x207C, 0x19, 0x207D, 0x15, 0x207E, 0x16, 0x207F, 0x4, 0x2089, 0xB, 0x208C, 0x19, 0x208E, 0x1516, 0x209C, 0x4, 0x20B9, 0x1A, 0x20DC, 0x6, 0x20E0, 0x7, 0x20E1, 0x6, 0x20E4, 0x7, 0x20F0, 0x6, 0x2101, 0x1C, 0x2102, 0x1, 0x2106, 0x1C, 0x2107, 0x1, 0x2109, 0x1C, 0x210A, 0x2, 0x210D, 0x1, 0x210F, 0x2, 0x2112, 0x1, 0x2113, 0x2, 0x2114, 0x1C, 0x2115, 0x1, 0x2117, 0x1C, 0x2118, 0x19, 0x211D, 0x1, 0x2123, 0x1C, 0x2129, 0x1C01, 0x212D, 0x1, 0x212F, 0x21C, 0x2133, 0x1, 0x2134, 0x2, 0x2138, 0x5, 0x2139, 0x2, 0x213B, 0x1C, 0x213D, 0x2, 0x213F, 0x1, 0x2144, 0x19, 0x2145, 0x1, 0x2149, 0x2, 0x214B, 0x191C, 0x214D, 0x1C, 0x214F, 0x1C02, 0x215F, 0xB, 0x2182, 0xA, 0x2184, 0x102, 0x2188, 0xA, 0x2189, 0xB, 0x2194, 0x19, 0x2199, 0x1C, 0x219B, 0x19, 0x219F, 0x1C, 0x21A0, 0x19, 0x21A2, 0x1C, 0x21A3, 0x19, 0x21A5, 0x1C, 0x21A6, 0x19, 0x21AD, 0x1C, 0x21AE, 0x19, 0x21CD, 0x1C, 0x21CF, 0x19, 0x21D1, 0x1C, 0x21D4, 0x1C19, 0x21F3, 0x1C, 0x22FF, 0x19, 0x2307, 0x1C, 0x230B, 0x19, 0x231F, 0x1C, 0x2321, 0x19, 0x2328, 0x1C, 0x232A, 0x1516, 0x237B, 0x1C, 0x237C, 0x19, 0x239A, 0x1C, 0x23B3, 0x19, 0x23DB, 0x1C, 0x23E1, 0x19, 0x23F3, 0x1C, 0x2426, 0x1C, 0x244A, 0x1C, 0x249B, 0xB, 0x24E9, 0x1C, 0x24FF, 0xB, 0x25B6, 0x1C, 0x25B7, 0x19, 0x25C0, 0x1C, 0x25C1, 0x19, 0x25F7, 0x1C, 0x25FF, 0x19, 0x266E, 0x1C, 0x266F, 0x19, 0x26FF, 0x1C, 0x2767, 0x1C, 0x2775, 0x1615, 0x2793, 0xB, 0x27BF, 0x1C, 0x27C4, 0x19, 0x27C6, 0x1516, 0x27CA, 0x19, 0x27CC, 0x19, 0x27E5, 0x19, 0x27EF, 0x1615, 0x27FF, 0x19, 0x28FF, 0x1C, 0x2982, 0x19, 0x2998, 0x1516, 0x29D7, 0x19, 0x29DB, 0x1615, 0x29FB, 0x19, 0x29FD, 0x1615, 0x2AFF, 0x19, 0x2B2F, 0x1C, 0x2B44, 0x19, 0x2B46, 0x1C, 0x2B4C, 0x19, 0x2B59, 0x1C, 0x2C2E, 0x1, 0x2C5E, 0x2, 0x2C61, 0x201, 0x2C64, 0x1, 0x2C66, 0x2, 0x2C6C, 0x102, 0x2C70, 0x1, 0x2C72, 0x201, 0x2C74, 0x2, 0x2C75, 0x1, 0x2C7C, 0x2, 0x2C7D, 0x4, 0x2C80, 0x1, 0x2CE2, 0x201, 0x2CE4, 0x2, 0x2CEA, 0x1C, 0x2CEE, 0x102, 0x2CF1, 0x6, 0x2CFC, 0x18, 0x2CFD, 0xB, 0x2CFF, 0x18, 0x2D25, 0x2, 0x2D65, 0x5, 0x2D70, 0x418, 0x2D7F, 0x6, 0x2D96, 0x5, 0x2DA6, 0x5, 0x2DAE, 0x5, 0x2DB6, 0x5, 0x2DBE, 0x5, 0x2DC6, 0x5, 0x2DCE, 0x5, 0x2DD6, 0x5, 0x2DDE, 0x5, 0x2DFF, 0x6, 0x2E01, 0x18, 0x2E05, 0x1E1D, 0x2E08, 0x18, 0x2E09, 0x1D, 0x2E0A, 0x1E, 0x2E0B, 0x18, 0x2E0C, 0x1D, 0x2E0D, 0x1E, 0x2E16, 0x18, 0x2E17, 0x14, 0x2E19, 0x18, 0x2E1A, 0x14, 0x2E1B, 0x18, 0x2E1C, 0x1D, 0x2E1D, 0x1E, 0x2E1F, 0x18, 0x2E20, 0x1D, 0x2E21, 0x1E, 0x2E22, 0x15, 0x2E23, 0x16, 0x2E24, 0x15, 0x2E25, 0x16, 0x2E26, 0x15, 0x2E27, 0x16, 0x2E28, 0x15, 0x2E29, 0x16, 0x2E2E, 0x18, 0x2E2F, 0x4, 0x2E31, 0x18, 0x2E99, 0x1C, 0x2EF3, 0x1C, 0x2FD5, 0x1C, 0x2FFB, 0x1C, 0x3000, 0xC, 0x3003, 0x18, 0x3004, 0x1C, 0x3005, 0x4, 0x3006, 0x5, 0x3007, 0xA, 0x3008, 0x15, 0x3009, 0x16, 0x300A, 0x15, 0x300B, 0x16, 0x300C, 0x15, 0x300D, 0x16, 0x300E, 0x15, 0x300F, 0x16, 0x3010, 0x15, 0x3011, 0x16, 0x3013, 0x1C, 0x3014, 0x15, 0x3015, 0x16, 0x3016, 0x15, 0x3017, 0x16, 0x3018, 0x15, 0x3019, 0x16, 0x301A, 0x15, 0x301B, 0x16, 0x301C, 0x14, 0x301D, 0x15, 0x301F, 0x16, 0x3020, 0x1C, 0x3029, 0xA, 0x302F, 0x6, 0x3030, 0x14, 0x3035, 0x4, 0x3037, 0x1C, 0x303A, 0xA, 0x303B, 0x4, 0x303C, 0x5, 0x303D, 0x18, 0x303F, 0x1C, 0x3096, 0x5, 0x309A, 0x6, 0x309C, 0x1B, 0x309E, 0x4, 0x30A0, 0x514, 0x30FA, 0x5, 0x30FB, 0x18, 0x30FE, 0x4, 0x30FF, 0x5, 0x312D, 0x5, 0x318E, 0x5, 0x3191, 0x1C, 0x3195, 0xB, 0x319F, 0x1C, 0x31BA, 0x5, 0x31E3, 0x1C, 0x31FF, 0x5, 0x321E, 0x1C, 0x3229, 0xB, 0x3250, 0x1C, 0x325F, 0xB, 0x327F, 0x1C, 0x3289, 0xB, 0x32B0, 0x1C, 0x32BF, 0xB, 0x32FE, 0x1C, 0x33FF, 0x1C, 0x4DB5, 0x5, 0x4DFF, 0x1C, 0x9FCB, 0x5, 0xA014, 0x5, 0xA015, 0x4, 0xA48C, 0x5, 0xA4C6, 0x1C, 0xA4F7, 0x5, 0xA4FD, 0x4, 0xA4FF, 0x18, 0xA60B, 0x5, 0xA60C, 0x4, 0xA60F, 0x18, 0xA61F, 0x5, 0xA629, 0x9, 0xA62B, 0x5, 0xA640, 0x1, 0xA641, 0x2, 0xA642, 0x1, 0xA643, 0x2, 0xA644, 0x1, 0xA645, 0x2, 0xA646, 0x1, 0xA647, 0x2, 0xA648, 0x1, 0xA649, 0x2, 0xA64A, 0x1, 0xA64B, 0x2, 0xA64C, 0x1, 0xA64D, 0x2, 0xA64E, 0x1, 0xA64F, 0x2, 0xA650, 0x1, 0xA651, 0x2, 0xA652, 0x1, 0xA653, 0x2, 0xA654, 0x1, 0xA655, 0x2, 0xA656, 0x1, 0xA657, 0x2, 0xA658, 0x1, 0xA659, 0x2, 0xA65A, 0x1, 0xA65B, 0x2, 0xA65C, 0x1, 0xA65D, 0x2, 0xA65E, 0x1, 0xA65F, 0x2, 0xA660, 0x1, 0xA661, 0x2, 0xA662, 0x1, 0xA663, 0x2, 0xA664, 0x1, 0xA665, 0x2, 0xA666, 0x1, 0xA667, 0x2, 0xA668, 0x1, 0xA669, 0x2, 0xA66A, 0x1, 0xA66B, 0x2, 0xA66C, 0x1, 0xA66D, 0x2, 0xA66E, 0x5, 0xA66F, 0x6, 0xA672, 0x7, 0xA673, 0x18, 0xA67D, 0x6, 0xA67E, 0x18, 0xA67F, 0x4, 0xA680, 0x1, 0xA681, 0x2, 0xA682, 0x1, 0xA683, 0x2, 0xA684, 0x1, 0xA685, 0x2, 0xA686, 0x1, 0xA687, 0x2, 0xA688, 0x1, 0xA689, 0x2, 0xA68A, 0x1, 0xA68B, 0x2, 0xA68C, 0x1, 0xA68D, 0x2, 0xA68E, 0x1, 0xA68F, 0x2, 0xA690, 0x1, 0xA691, 0x2, 0xA692, 0x1, 0xA693, 0x2, 0xA694, 0x1, 0xA695, 0x2, 0xA696, 0x1, 0xA697, 0x2, 0xA6E5, 0x5, 0xA6EF, 0xA, 0xA6F1, 0x6, 0xA6F7, 0x18, 0xA716, 0x1B, 0xA71F, 0x4, 0xA721, 0x1B, 0xA72E, 0x201, 0xA731, 0x2, 0xA732, 0x1, 0xA733, 0x2, 0xA734, 0x1, 0xA735, 0x2, 0xA736, 0x1, 0xA737, 0x2, 0xA738, 0x1, 0xA739, 0x2, 0xA73A, 0x1, 0xA73B, 0x2, 0xA73C, 0x1, 0xA73D, 0x2, 0xA73E, 0x1, 0xA73F, 0x2, 0xA740, 0x1, 0xA741, 0x2, 0xA742, 0x1, 0xA743, 0x2, 0xA744, 0x1, 0xA745, 0x2, 0xA746, 0x1, 0xA747, 0x2, 0xA748, 0x1, 0xA749, 0x2, 0xA74A, 0x1, 0xA74B, 0x2, 0xA74C, 0x1, 0xA74D, 0x2, 0xA74E, 0x1, 0xA74F, 0x2, 0xA750, 0x1, 0xA751, 0x2, 0xA752, 0x1, 0xA753, 0x2, 0xA754, 0x1, 0xA755, 0x2, 0xA756, 0x1, 0xA757, 0x2, 0xA758, 0x1, 0xA759, 0x2, 0xA75A, 0x1, 0xA75B, 0x2, 0xA75C, 0x1, 0xA75D, 0x2, 0xA75E, 0x1, 0xA75F, 0x2, 0xA760, 0x1, 0xA761, 0x2, 0xA762, 0x1, 0xA763, 0x2, 0xA764, 0x1, 0xA765, 0x2, 0xA766, 0x1, 0xA767, 0x2, 0xA768, 0x1, 0xA769, 0x2, 0xA76A, 0x1, 0xA76B, 0x2, 0xA76C, 0x1, 0xA76D, 0x2, 0xA76E, 0x1, 0xA76F, 0x2, 0xA770, 0x4, 0xA778, 0x2, 0xA77C, 0x102, 0xA77E, 0x1, 0xA77F, 0x2, 0xA780, 0x1, 0xA781, 0x2, 0xA782, 0x1, 0xA783, 0x2, 0xA784, 0x1, 0xA785, 0x2, 0xA786, 0x1, 0xA787, 0x2, 0xA788, 0x4, 0xA78A, 0x1B, 0xA78E, 0x102, 0xA791, 0x201, 0xA7A9, 0x201, 0xA7FA, 0x2, 0xA801, 0x5, 0xA802, 0x6, 0xA805, 0x5, 0xA806, 0x6, 0xA80A, 0x5, 0xA80B, 0x6, 0xA822, 0x5, 0xA824, 0x8, 0xA826, 0x6, 0xA827, 0x8, 0xA82B, 0x1C, 0xA835, 0xB, 0xA837, 0x1C, 0xA839, 0x1C1A, 0xA873, 0x5, 0xA877, 0x18, 0xA881, 0x8, 0xA8B3, 0x5, 0xA8C3, 0x8, 0xA8C4, 0x6, 0xA8CF, 0x18, 0xA8D9, 0x9, 0xA8F1, 0x6, 0xA8F7, 0x5, 0xA8FA, 0x18, 0xA8FB, 0x5, 0xA909, 0x9, 0xA925, 0x5, 0xA92D, 0x6, 0xA92F, 0x18, 0xA946, 0x5, 0xA951, 0x6, 0xA953, 0x8, 0xA95F, 0x18, 0xA97C, 0x5, 0xA982, 0x6, 0xA983, 0x8, 0xA9B2, 0x5, 0xA9B3, 0x6, 0xA9B5, 0x8, 0xA9B9, 0x6, 0xA9BB, 0x8, 0xA9BC, 0x6, 0xA9C0, 0x8, 0xA9CD, 0x18, 0xA9CF, 0x4, 0xA9D9, 0x9, 0xA9DF, 0x18, 0xAA28, 0x5, 0xAA2E, 0x6, 0xAA30, 0x8, 0xAA32, 0x6, 0xAA34, 0x8, 0xAA36, 0x6, 0xAA42, 0x5, 0xAA43, 0x6, 0xAA4B, 0x5, 0xAA4D, 0x806, 0xAA59, 0x9, 0xAA5F, 0x18, 0xAA6F, 0x5, 0xAA70, 0x4, 0xAA76, 0x5, 0xAA79, 0x1C, 0xAA7B, 0x805, 0xAAAF, 0x5, 0xAAB1, 0x506, 0xAAB4, 0x6, 0xAAB6, 0x5, 0xAAB8, 0x6, 0xAABD, 0x5, 0xAABF, 0x6, 0xAAC2, 0x605, 0xAADC, 0x5, 0xAADD, 0x4, 0xAADF, 0x18, 0xAB06, 0x5, 0xAB0E, 0x5, 0xAB16, 0x5, 0xAB26, 0x5, 0xAB2E, 0x5, 0xABE2, 0x5, 0xABE4, 0x8, 0xABE5, 0x6, 0xABE7, 0x8, 0xABE8, 0x6, 0xABEA, 0x8, 0xABEB, 0x18, 0xABEC, 0x8, 0xABED, 0x6, 0xABF9, 0x9, 0xD7A3, 0x5, 0xD7C6, 0x5, 0xD7FB, 0x5, 0xDFFF, 0x13, 0xF8FF, 0x12, 0xFA2D, 0x5, 0xFA6D, 0x5, 0xFAD9, 0x5, 0xFB06, 0x2, 0xFB17, 0x2, 0xFB1E, 0x506, 0xFB28, 0x5, 0xFB29, 0x19, 0xFB36, 0x5, 0xFB3C, 0x5, 0xFB3E, 0x5, 0xFB41, 0x5, 0xFB44, 0x5, 0xFBB1, 0x5, 0xFBC1, 0x1B, 0xFD3D, 0x5, 0xFD3F, 0x1615, 0xFD8F, 0x5, 0xFDC7, 0x5, 0xFDFB, 0x5, 0xFDFD, 0x1C1A, 0xFE0F, 0x6, 0xFE16, 0x18, 0xFE17, 0x15, 0xFE18, 0x16, 0xFE19, 0x18, 0xFE26, 0x6, 0xFE30, 0x18, 0xFE32, 0x14, 0xFE34, 0x17, 0xFE44, 0x1516, 0xFE46, 0x18, 0xFE48, 0x1516, 0xFE4C, 0x18, 0xFE4F, 0x17, 0xFE52, 0x18, 0xFE57, 0x18, 0xFE58, 0x14, 0xFE59, 0x15, 0xFE5A, 0x16, 0xFE5B, 0x15, 0xFE5C, 0x16, 0xFE5D, 0x15, 0xFE5E, 0x16, 0xFE61, 0x18, 0xFE63, 0x1419, 0xFE66, 0x19, 0xFE69, 0x1A18, 0xFE6B, 0x18, 0xFE74, 0x5, 0xFEFC, 0x5, 0xFEFF, 0x10, 0xFF03, 0x18, 0xFF04, 0x1A, 0xFF07, 0x18, 0xFF08, 0x15, 0xFF09, 0x16, 0xFF0A, 0x18, 0xFF0B, 0x19, 0xFF0C, 0x18, 0xFF0D, 0x14, 0xFF0F, 0x18, 0xFF19, 0x9, 0xFF1B, 0x18, 0xFF1E, 0x19, 0xFF20, 0x18, 0xFF3A, 0x1, 0xFF3B, 0x15, 0xFF3C, 0x18, 0xFF3D, 0x16, 0xFF3E, 0x1B, 0xFF3F, 0x17, 0xFF40, 0x1B, 0xFF5A, 0x2, 0xFF5B, 0x15, 0xFF5C, 0x19, 0xFF5D, 0x16, 0xFF5E, 0x19, 0xFF5F, 0x15, 0xFF60, 0x16, 0xFF61, 0x18, 0xFF62, 0x15, 0xFF63, 0x16, 0xFF65, 0x18, 0xFF6F, 0x5, 0xFF70, 0x4, 0xFF9D, 0x5, 0xFF9F, 0x4, 0xFFBE, 0x5, 0xFFC7, 0x5, 0xFFCF, 0x5, 0xFFD7, 0x5, 0xFFDC, 0x5, 0xFFE1, 0x1A, 0xFFE2, 0x19, 0xFFE3, 0x1B, 0xFFE4, 0x1C, 0xFFE6, 0x1A, 0xFFE8, 0x1C, 0xFFEC, 0x19, 0xFFEE, 0x1C, 0xFFFB, 0x10, 0xFFFD, 0x1C } }; static const std::tr1::array kLowerCaseCache = { { 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 215, 248, 249, 250, 251, 252, 253, 254, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 257, 257, 259, 259, 261, 261, 263, 263, 265, 265, 267, 267, 269, 269, 271, 271, 273, 273, 275, 275, 277, 277, 279, 279, 281, 281, 283, 283, 285, 285, 287, 287, 289, 289, 291, 291, 293, 293, 295, 295, 297, 297, 299, 299, 301, 301, 303, 303, 105, 305, 307, 307, 309, 309, 311, 311, 312, 314, 314, 316, 316, 318, 318, 320, 320, 322, 322, 324, 324, 326, 326, 328, 328, 329, 331, 331, 333, 333, 335, 335, 337, 337, 339, 339, 341, 341, 343, 343, 345, 345, 347, 347, 349, 349, 351, 351, 353, 353, 355, 355, 357, 357, 359, 359, 361, 361, 363, 363, 365, 365, 367, 367, 369, 369, 371, 371, 373, 373, 375, 375, 255, 378, 378, 380, 380, 382, 382, 383, 384, 595, 387, 387, 389, 389, 596, 392, 392, 598, 599, 396, 396, 397, 477, 601, 603, 402, 402, 608, 611, 405, 617, 616, 409, 409, 410, 411, 623, 626, 414, 629, 417, 417, 419, 419, 421, 421, 640, 424, 424, 643, 426, 427, 429, 429, 648, 432, 432, 650, 651, 436, 436, 438, 438, 658, 441, 441, 442, 443, 445, 445, 446, 447, 448, 449, 450, 451, 454, 454, 454, 457, 457, 457, 460, 460, 460, 462, 462, 464, 464, 466, 466, 468, 468, 470, 470, 472, 472, 474, 474, 476, 476, 477, 479, 479, 481, 481, 483, 483, 485, 485, 487, 487, 489, 489, 491, 491, 493, 493, 495, 495, 496, 499, 499, 499, 501, 501, 405, 447, 505, 505, 507, 507, 509, 509, 511, 511, 513, 513, 515, 515, 517, 517, 519, 519, 521, 521, 523, 523, 525, 525, 527, 527, 529, 529, 531, 531, 533, 533, 535, 535, 537, 537, 539, 539, 541, 541, 543, 543, 414, 545, 547, 547, 549, 549, 551, 551, 553, 553, 555, 555, 557, 557, 559, 559, 561, 561, 563, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 940, 903, 941, 942, 943, 907, 972, 909, 973, 974, 912, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 930, 963, 964, 965, 966, 967, 968, 969, 970, 971, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 985, 985, 987, 987, 989, 989, 991, 991, 993, 993, 995, 995, 997, 997, 999, 999 } }; static const std::tr1::array kLowerCaseKeys = { { 0x41, 0xC0, 0xD8, 0x100, 0x130, 0x132, 0x139, 0x14A, 0x178, 0x179, 0x181, 0x182, 0x186, 0x187, 0x189, 0x18B, 0x18E, 0x18F, 0x190, 0x191, 0x193, 0x194, 0x196, 0x197, 0x198, 0x19C, 0x19D, 0x19F, 0x1A0, 0x1A6, 0x1A7, 0x1A9, 0x1AC, 0x1AE, 0x1AF, 0x1B1, 0x1B3, 0x1B7, 0x1B8, 0x1BC, 0x1C4, 0x1C5, 0x1C7, 0x1C8, 0x1CA, 0x1CB, 0x1DE, 0x1F1, 0x1F2, 0x1F6, 0x1F7, 0x1F8, 0x222, 0x386, 0x388, 0x38C, 0x38E, 0x391, 0x3A3, 0x3DA, 0x400, 0x410, 0x460, 0x48C, 0x4C1, 0x4C7, 0x4CB, 0x4D0, 0x4F8, 0x531, 0x1E00, 0x1EA0, 0x1F08, 0x1F18, 0x1F28, 0x1F38, 0x1F48, 0x1F59, 0x1F68, 0x1F88, 0x1F98, 0x1FA8, 0x1FB8, 0x1FBA, 0x1FBC, 0x1FC8, 0x1FCC, 0x1FD8, 0x1FDA, 0x1FE8, 0x1FEA, 0x1FEC, 0x1FF8, 0x1FFA, 0x1FFC, 0x2126, 0x212A, 0x212B, 0x2160, 0x24B6, 0xFF21 // NOLINT } }; static const std::tr1::array kLowerCaseValues = { { 0x5A, 0x20, 0xD6, 0x20, 0xDE, 0x20, 0x812E, 0x1, 0x130, 0xFF39, 0x8136, 0x1, 0x8147, 0x1, 0x8176, 0x1, 0x178, 0xFF87, 0x817D, 0x1, 0x181, 0xD2, 0x8184, 0x1, 0x186, 0xCE, 0x187, 0x1, 0x18A, 0xCD, 0x18B, 0x1, 0x18E, 0x4F, 0x18F, 0xCA, 0x190, 0xCB, 0x191, 0x1, 0x193, 0xCD, 0x194, 0xCF, 0x196, 0xD3, 0x197, 0xD1, 0x198, 0x1, 0x19C, 0xD3, 0x19D, 0xD5, 0x19F, 0xD6, 0x81A4, 0x1, 0x1A6, 0xDA, 0x1A7, 0x1, 0x1A9, 0xDA, 0x1AC, 0x1, 0x1AE, 0xDA, 0x1AF, 0x1, 0x1B2, 0xD9, 0x81B5, 0x1, 0x1B7, 0xDB, 0x1B8, 0x1, 0x1BC, 0x1, 0x1C4, 0x2, 0x1C5, 0x1, 0x1C7, 0x2, 0x1C8, 0x1, 0x1CA, 0x2, 0x81DB, 0x1, 0x81EE, 0x1, 0x1F1, 0x2, 0x81F4, 0x1, 0x1F6, 0xFF9F, 0x1F7, 0xFFC8, 0x821E, 0x1, 0x8232, 0x1, 0x386, 0x26, 0x38A, 0x25, 0x38C, 0x40, 0x38F, 0x3F, 0x3A1, 0x20, 0x3AB, 0x20, 0x83EE, 0x1, 0x40F, 0x50, 0x42F, 0x20, 0x8480, 0x1, 0x84BE, 0x1, 0x84C3, 0x1, 0x4C7, 0x1, 0x4CB, 0x1, 0x84F4, 0x1, 0x4F8, 0x1, 0x556, 0x30, 0x9E94, 0x1, 0x9EF8, 0x1, 0x1F0F, 0xFFF8, 0x1F1D, 0xFFF8, 0x1F2F, 0xFFF8, 0x1F3F, 0xFFF8, 0x1F4D, 0xFFF8, 0x9F5F, 0xFFF8, 0x1F6F, 0xFFF8, 0x1F8F, 0xFFF8, 0x1F9F, 0xFFF8, 0x1FAF, 0xFFF8, 0x1FB9, 0xFFF8, 0x1FBB, 0xFFB6, 0x1FBC, 0xFFF7, 0x1FCB, 0xFFAA, 0x1FCC, 0xFFF7, 0x1FD9, 0xFFF8, 0x1FDB, 0xFF9C, 0x1FE9, 0xFFF8, 0x1FEB, 0xFF90, 0x1FEC, 0xFFF9, 0x1FF9, 0xFF80, 0x1FFB, 0xFF82, 0x1FFC, 0xFFF7, 0x2126, 0xE2A3, 0x212A, 0xDF41, 0x212B, 0xDFBA, 0x216F, 0x10, 0x24CF, 0x1A, 0xFF3A, 0x20 // NOLINT } }; static const std::tr1::array kUpperCaseCache = { { 924, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 247, 216, 217, 218, 219, 220, 221, 222, 376, 256, 256, 258, 258, 260, 260, 262, 262, 264, 264, 266, 266, 268, 268, 270, 270, 272, 272, 274, 274, 276, 276, 278, 278, 280, 280, 282, 282, 284, 284, 286, 286, 288, 288, 290, 290, 292, 292, 294, 294, 296, 296, 298, 298, 300, 300, 302, 302, 304, 73, 306, 306, 308, 308, 310, 310, 312, 313, 313, 315, 315, 317, 317, 319, 319, 321, 321, 323, 323, 325, 325, 327, 327, 329, 330, 330, 332, 332, 334, 334, 336, 336, 338, 338, 340, 340, 342, 342, 344, 344, 346, 346, 348, 348, 350, 350, 352, 352, 354, 354, 356, 356, 358, 358, 360, 360, 362, 362, 364, 364, 366, 366, 368, 368, 370, 370, 372, 372, 374, 374, 376, 377, 377, 379, 379, 381, 381, 83, 384, 385, 386, 386, 388, 388, 390, 391, 391, 393, 394, 395, 395, 397, 398, 399, 400, 401, 401, 403, 404, 502, 406, 407, 408, 408, 410, 411, 412, 413, 544, 415, 416, 416, 418, 418, 420, 420, 422, 423, 423, 425, 426, 427, 428, 428, 430, 431, 431, 433, 434, 435, 435, 437, 437, 439, 440, 440, 442, 443, 444, 444, 446, 503, 448, 449, 450, 451, 452, 452, 452, 455, 455, 455, 458, 458, 458, 461, 461, 463, 463, 465, 465, 467, 467, 469, 469, 471, 471, 473, 473, 475, 475, 398, 478, 478, 480, 480, 482, 482, 484, 484, 486, 486, 488, 488, 490, 490, 492, 492, 494, 494, 496, 497, 497, 497, 500, 500, 502, 503, 504, 504, 506, 506, 508, 508, 510, 510, 512, 512, 514, 514, 516, 516, 518, 518, 520, 520, 522, 522, 524, 524, 526, 526, 528, 528, 530, 530, 532, 532, 534, 534, 536, 536, 538, 538, 540, 540, 542, 542, 544, 545, 546, 546, 548, 548, 550, 550, 552, 552, 554, 554, 556, 556, 558, 558, 560, 560, 562, 562, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 385, 390, 597, 393, 394, 600, 399, 602, 400, 604, 605, 606, 607, 403, 609, 610, 404, 612, 613, 614, 615, 407, 406, 618, 619, 620, 621, 622, 412, 624, 625, 413, 627, 628, 415, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 422, 641, 642, 425, 644, 645, 646, 647, 430, 649, 433, 434, 652, 653, 654, 655, 656, 657, 439, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 921, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 902, 904, 905, 906, 944, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 931, 932, 933, 934, 935, 936, 937, 938, 939, 908, 910, 911, 975, 914, 920, 978, 979, 980, 934, 928, 983, 984, 984, 986, 986, 988, 988, 990, 990, 992, 992, 994, 994, 996, 996, 998, 998 } }; static const std::tr1::array kUpperCaseKeys = { { 0x61, 0xB5, 0xE0, 0xF8, 0xFF, 0x101, 0x131, 0x133, 0x13A, 0x14B, 0x17A, 0x17F, 0x183, 0x188, 0x18C, 0x192, 0x195, 0x199, 0x1A1, 0x1A8, 0x1AD, 0x1B0, 0x1B4, 0x1B9, 0x1BD, 0x1BF, 0x1C5, 0x1C6, 0x1C8, 0x1C9, 0x1CB, 0x1CC, 0x1CE, 0x1DD, 0x1DF, 0x1F2, 0x1F3, 0x1F5, 0x1F9, 0x223, 0x253, 0x254, 0x256, 0x259, 0x25B, 0x260, 0x263, 0x268, 0x269, 0x26F, 0x272, 0x275, 0x280, 0x283, 0x288, 0x28A, 0x292, 0x345, 0x3AC, 0x3AD, 0x3B1, 0x3C2, 0x3C3, 0x3CC, 0x3CD, 0x3D0, 0x3D1, 0x3D5, 0x3D6, 0x3DB, 0x3F0, 0x3F1, 0x3F2, 0x430, 0x450, 0x461, 0x48D, 0x4C2, 0x4C8, 0x4CC, 0x4D1, 0x4F9, 0x561, 0x1E01, 0x1E9B, 0x1EA1, 0x1F00, 0x1F10, 0x1F20, 0x1F30, 0x1F40, 0x1F51, 0x1F60, 0x1F70, 0x1F72, 0x1F76, 0x1F78, 0x1F7A, 0x1F7C, 0x1F80, 0x1F90, 0x1FA0, 0x1FB0, 0x1FB3, 0x1FBE, 0x1FC3, 0x1FD0, 0x1FE0, 0x1FE5, 0x1FF3, 0x2170, 0x24D0, 0xFF41 // NOLINT } }; static const std::tr1::array kUpperCaseValues = { { 0x7A, 0xFFE0, 0xB5, 0x2E7, 0xF6, 0xFFE0, 0xFE, 0xFFE0, 0xFF, 0x79, 0x812F, 0xFFFF, 0x131, 0xFF18, 0x8137, 0xFFFF, 0x8148, 0xFFFF, 0x8177, 0xFFFF, 0x817E, 0xFFFF, 0x17F, 0xFED4, 0x8185, 0xFFFF, 0x188, 0xFFFF, 0x18C, 0xFFFF, 0x192, 0xFFFF, 0x195, 0x61, 0x199, 0xFFFF, 0x81A5, 0xFFFF, 0x1A8, 0xFFFF, 0x1AD, 0xFFFF, 0x1B0, 0xFFFF, 0x81B6, 0xFFFF, 0x1B9, 0xFFFF, 0x1BD, 0xFFFF, 0x1BF, 0x38, 0x1C5, 0xFFFF, 0x1C6, 0xFFFE, 0x1C8, 0xFFFF, 0x1C9, 0xFFFE, 0x1CB, 0xFFFF, 0x1CC, 0xFFFE, 0x81DC, 0xFFFF, 0x1DD, 0xFFB1, 0x81EF, 0xFFFF, 0x1F2, 0xFFFF, 0x1F3, 0xFFFE, 0x1F5, 0xFFFF, 0x821F, 0xFFFF, 0x8233, 0xFFFF, 0x253, 0xFF2E, 0x254, 0xFF32, 0x257, 0xFF33, 0x259, 0xFF36, 0x25B, 0xFF35, 0x260, 0xFF33, 0x263, 0xFF31, 0x268, 0xFF2F, 0x269, 0xFF2D, 0x26F, 0xFF2D, 0x272, 0xFF2B, 0x275, 0xFF2A, 0x280, 0xFF26, 0x283, 0xFF26, 0x288, 0xFF26, 0x28B, 0xFF27, 0x292, 0xFF25, 0x345, 0x54, 0x3AC, 0xFFDA, 0x3AF, 0xFFDB, 0x3C1, 0xFFE0, 0x3C2, 0xFFE1, 0x3CB, 0xFFE0, 0x3CC, 0xFFC0, 0x3CE, 0xFFC1, 0x3D0, 0xFFC2, 0x3D1, 0xFFC7, 0x3D5, 0xFFD1, 0x3D6, 0xFFCA, 0x83EF, 0xFFFF, 0x3F0, 0xFFAA, 0x3F1, 0xFFB0, 0x3F2, 0xFFB1, 0x44F, 0xFFE0, 0x45F, 0xFFB0, 0x8481, 0xFFFF, 0x84BF, 0xFFFF, 0x84C4, 0xFFFF, 0x4C8, 0xFFFF, 0x4CC, 0xFFFF, 0x84F5, 0xFFFF, 0x4F9, 0xFFFF, 0x586, 0xFFD0, 0x9E95, 0xFFFF, 0x1E9B, 0xFFC5, 0x9EF9, 0xFFFF, 0x1F07, 0x8, 0x1F15, 0x8, 0x1F27, 0x8, 0x1F37, 0x8, 0x1F45, 0x8, 0x9F57, 0x8, 0x1F67, 0x8, 0x1F71, 0x4A, 0x1F75, 0x56, 0x1F77, 0x64, 0x1F79, 0x80, 0x1F7B, 0x70, 0x1F7D, 0x7E, 0x1F87, 0x8, 0x1F97, 0x8, 0x1FA7, 0x8, 0x1FB1, 0x8, 0x1FB3, 0x9, 0x1FBE, 0xE3DB, 0x1FC3, 0x9, 0x1FD1, 0x8, 0x1FE1, 0x8, 0x1FE5, 0x7, 0x1FF3, 0x9, 0x217F, 0xFFF0, 0x24E9, 0xFFE6, 0xFF5A, 0xFFE0 // NOLINT } }; inline Category GetCategory(uint16_t c) { using std::upper_bound; if (c < 1000) { return static_cast(kCategoryCache[c]); } const int result = upper_bound(kCategoryKeys.begin(), kCategoryKeys.end(), c) - kCategoryKeys.begin() - 1; assert(result < static_cast(kCategoryKeys.size())); const int high = kCategoryValues[result * 2]; if (c <= high) { const int code = kCategoryValues[result * 2 + 1]; if (code < 0x100) { return static_cast(code); } return static_cast((c & 1) == 1 ? code >> 8 : code & 0xff); } return UNASSIGNED; } inline bool IsASCII(uint16_t c) { return !(c & ~0x7F); } inline bool IsASCIIAlpha(uint16_t c) { return (c | 0x20) >= 'a' && (c | 0x20) <= 'z'; } inline bool IsDecimalDigit(uint16_t c) { return c >= '0' && c <= '9'; } inline bool IsOctalDigit(uint16_t c) { return c >= '0' && c <= '7'; } inline bool IsHexDigit(uint16_t c) { return IsDecimalDigit(c) || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f'); } inline bool IsDigit(uint16_t c) { return IsDecimalDigit(c) || (c > 1631 && GetCategory(c) == DECIMAL_DIGIT_NUMBER); } inline bool IsASCIIAlphanumeric(uint16_t c) { return IsDecimalDigit(c) || IsASCIIAlpha(c); } inline bool IsNonASCIIIdentifierStart(uint16_t c) { return (1 << GetCategory(c)) & (Lu | Ll | Lt | Lm | Lo); } inline bool IsNonASCIIIdentifierPart(uint16_t c) { return (1 << GetCategory(c)) & (Lu | Ll | Lt | Lm | Lo | Mn | Mc | Nd | Pc); } inline bool IsSeparatorSpace(uint16_t c) { return GetCategory(c) == SPACE_SEPARATOR; } inline bool IsWhiteSpace(uint16_t c) { return IsASCII(c) ? (c == ' ' || c == '\t' || c == 0xB || c == 0xC) : c == 0x00A0 || c == 0xFEFF || IsSeparatorSpace(c); } inline bool IsLineTerminator(uint16_t c) { return c == '\r' || c == '\n' || (c & ~1) == 0x2028; // 0x2028 or 0x2029 } inline bool IsIdentifierStart(uint16_t c) { return IsASCII(c) ? c == '$' || c == '_' || c == '\\' || IsASCIIAlpha(c) : IsNonASCIIIdentifierStart(c); } inline bool IsIdentifierPart(uint16_t c) { return IsASCII(c) ? c == '$' || c == '_' || c == '\\' || IsASCIIAlphanumeric(c) : IsNonASCIIIdentifierPart(c); } inline uint16_t ToLowerCase(uint16_t c) { using std::upper_bound; if ('A' <= c && c <= 'Z') { return c + ('a' - 'A'); } // lowercase not found until 192 if (c < 192) { return c; } if (c < 1000) { return kLowerCaseCache[c - 192]; } std::tr1::array::const_iterator it = upper_bound(kLowerCaseKeys.begin(), kLowerCaseKeys.end(), c) - 1; const int result = it - kLowerCaseKeys.begin(); assert(result < 101); if (result >= 0) { bool by2 = false; const uint16_t start = kLowerCaseKeys[result]; uint16_t end = kLowerCaseValues[result * 2]; if ((start & 0x8000) != (end & 0x8000)) { end ^= 0x8000; by2 = true; } if (c <= end) { if (by2 && (c & 1) != (start & 1)) { return c; } const uint16_t mapping = kLowerCaseValues[result * 2 + 1]; return c + mapping; } } return c; } inline uint16_t ToUpperCase(uint16_t c) { using std::upper_bound; if ('a' <= c && c <= 'z') { return c - ('a' - 'A'); } // uppercase not found until 181 if (c < 181) { return c; } if (c < 1000) { return kUpperCaseCache[c - 181]; } std::tr1::array::const_iterator it = upper_bound(kUpperCaseKeys.begin(), kUpperCaseKeys.end(), c) - 1; const int result = it - kUpperCaseKeys.begin(); assert(result < 113); if (result >= 0) { bool by2 = false; const uint16_t start = *it; uint16_t end = kUpperCaseValues[result * 2]; if ((start & 0x8000) != (end & 0x8000)) { end ^= 0x8000; by2 = true; } if (c <= end) { if (by2 && (c & 1) != (start & 1)) { return c; } const uint16_t mapping = kUpperCaseValues[result * 2 + 1]; return c + mapping; } } return c; } } // namespace iv::core::character } } // namespace iv::core #endif // _IV_CHARACTER_H_