7 private static $prefixUcs4 =
null;
8 private static $hyphenUcs4 =
null;
9 private static $punycodePrefix =
null;
10 private static $punycodePrefixUcs4 =
null;
11 private static $punycodePrefixLength =
null;
14 private $arErrors = [];
17 private static $instance;
27 if (!isset(self::$instance))
30 self::$instance =
new $c;
33 return self::$instance;
44 public static function ToASCII($domainName, &$arErrors)
49 $result = $converter->Encode($domainName);
52 $arErrors = $converter->GetErrors();
65 public static function ToUnicode($domainName, &$arErrors)
70 $result = $converter->Decode($domainName);
73 $arErrors = $converter->GetErrors();
88 return $converter->IsEncoded($domainName);
93 if (self::$punycodePrefix ===
null)
95 self::$punycodePrefix =
"xn--";
96 self::$punycodePrefixLength = strlen(self::$punycodePrefix);
97 self::$punycodePrefixUcs4 = $this->Utf8ToUcs4(self::$punycodePrefix);
100 if (self::$prefixUcs4 ===
null)
101 self::$prefixUcs4 = $this->Utf8ToUcs4(self::PREFIX);
103 if (self::$hyphenUcs4 ===
null)
104 self::$hyphenUcs4 = $this->Utf8ToUcs4(
"-");
106 if (!is_null($encoding))
107 $this->encoding = $encoding;
109 $this->encoding =
"utf-8";
120 $this->ClearErrors();
122 $domainName = mb_strtolower(trim($domainName));
124 $schemePosition = mb_strpos($domainName,
"://");
125 if ($schemePosition !==
false)
126 $domainName = mb_substr($domainName, $schemePosition + 3);
128 if ($this->encoding !=
"utf-8")
131 $domainNameUcs4 = $this->Utf8ToUcs4($domainName);
132 if (empty($domainNameUcs4))
135 $arDomainNameUcs4 = $this->ExplodeDomainName($domainNameUcs4);
137 foreach ($arDomainNameUcs4 as $value)
139 $checked = array_slice($value, 0, self::$punycodePrefixLength);
140 if (self::$punycodePrefixUcs4 == $checked)
155 $this->ClearErrors();
157 $domainName = mb_strtolower(trim($domainName));
160 $schemePosition = mb_strpos($domainName,
"://");
161 if ($schemePosition !==
false)
163 $scheme = mb_substr($domainName, 0, $schemePosition);
164 $domainName = mb_substr($domainName, $schemePosition + 3);
168 if (preg_match(
"/^(.+):([0-9]+)\$/", $domainName, $portMatch))
170 $port = $portMatch[2];
171 $domainName = $portMatch[1];
174 if ($this->encoding !=
"utf-8")
177 $domainNameUcs4 = $this->Utf8ToUcs4($domainName);
178 if (empty($domainNameUcs4))
181 $arDomainNameUcs4 = $this->ExplodeDomainName($domainNameUcs4);
183 foreach ($arDomainNameUcs4 as
$key => $value)
185 $checked = array_slice($value, 0, self::$punycodePrefixLength);
186 if (self::$punycodePrefixUcs4 != $checked)
189 $arDomainNameUcs4[
$key] = $this->DoDecodeUcs4($value);
192 $domainNameUcs4 = $this->ImplodeDomainName($arDomainNameUcs4);
193 $domainName = $this->Ucs4ToUtf8($domainNameUcs4);
195 if ($this->encoding !=
"utf-8")
199 $domainName = $scheme.
"://".$domainName;
202 $domainName = $domainName.
":".$port;
215 $this->ClearErrors();
217 $domainName = mb_strtolower(trim($domainName));
220 $schemePosition = mb_strpos($domainName,
"://");
221 if ($schemePosition !==
false)
223 $scheme = mb_substr($domainName, 0, $schemePosition);
224 $domainName = mb_substr($domainName, $schemePosition + 3);
227 if ($this->encoding !=
"utf-8")
230 $domainNameUcs4 = $this->Utf8ToUcs4($domainName);
231 if (empty($domainNameUcs4))
234 $arDomainNameUcs4 = $this->ExplodeDomainName($domainNameUcs4);
236 foreach ($arDomainNameUcs4 as
$key => $value)
238 $checked = array_slice($value, 0, self::$punycodePrefixLength);
239 if (self::$punycodePrefixUcs4 == $checked)
242 $arDomainNameUcs4[
$key] = $this->NamePrepUcs4($value);
243 if (!$arDomainNameUcs4[
$key] || !is_array($arDomainNameUcs4[
$key]))
246 $arDomainNameUcs4[
$key] = $this->DoEncodeUcs4($arDomainNameUcs4[
$key]);
249 $domainNameUcs4 = $this->ImplodeDomainName($arDomainNameUcs4);
250 $domainName = $this->Ucs4ToUtf8($domainNameUcs4);
252 if ($this->encoding !=
"utf-8")
256 $domainName = $scheme.
"://".$domainName;
261 private function DoDecodeUcs4($input)
265 $input = array_slice($input, self::$punycodePrefixLength);
266 $delimiterPosition =
false;
269 if (
array($input[
$i]) == self::$hyphenUcs4)
271 $delimiterPosition =
$i;
276 if ($delimiterPosition !==
false)
278 for (
$i = 0;
$i < $delimiterPosition;
$i++)
283 $inputLength =
count($input);
290 for ($inputIdx = ($delimiterPosition !==
false) ? ($delimiterPosition + 1) : 0;
291 $inputIdx < $inputLength;
294 for ($oldIdx = $idx, $w = 1,
$k = 36; 1;
$k += 36)
296 $c = $input[$inputIdx++];
297 $digit = ($c - 48 < 10) ? $c - 22 : (($c - 65 < 26) ? $c - 65 : (($c - 97 < 26) ? $c - 97 : 36));
299 $t = (
$k <= $bias) ? 1 : ((
$k >= $bias + 26) ? 26 : (
$k - $bias));
302 $w = (int) ($w * (36 - $t));
304 $bias = $this->Adapt($idx - $oldIdx, $resultLength + 1, $isFirst);
306 $char += (int) ($idx / ($resultLength + 1));
307 $idx %= ($resultLength + 1);
308 if ($resultLength > 0)
310 for (
$i = $resultLength;
$i > $idx;
$i--)
318 private function DoEncodeUcs4($input)
320 $inputLength =
count($input);
327 for (
$i = 0;
$i < $inputLength;
$i++)
330 if (($char > 0x2F && $char < 0x40)
331 || ($char > 0x40 && $char < 0x5B)
332 || ($char > 0x60 && $char <= 0x7B)
339 if ($codeCount == $inputLength)
351 while ($codeCount < $inputLength)
353 for (
$i = 0, $nextCode = 0x10FFFF;
$i < $inputLength;
$i++)
355 if ($input[
$i] >= $currentCode && $input[
$i] <= $nextCode)
356 $nextCode = $input[
$i];
358 $delta += ($nextCode - $currentCode) * ($codeCount + 1);
359 $currentCode = $nextCode;
361 for (
$i = 0;
$i < $inputLength;
$i++)
363 if ($input[
$i] < $currentCode)
371 $t = (
$k <= $bias) ? 1 : ((
$k >= $bias + 26) ? 26 :
$k - $bias);
374 $d = $t + (($q - $t) % (36 - $t));
375 $result[] = $d + 22 + 75 * ($d < 26);
376 $q = (int) (($q - $t) / (36 - $t));
378 $result[] = $q + 22 + 75 * ($q < 26);
379 $bias = $this->Adapt(
$delta, $codeCount + 1, $isFirst);
391 private function Adapt(
$delta, $numPoints, $isFirst)
400 private function NamePrepUcs4($input)
404 foreach ($input as $v)
406 if (in_array($v, self::$rfc3454Table[
'Skip']))
409 if (in_array($v, self::$rfc3454Table[
'Reject'])
410 || in_array($v, self::$rfc3454Table[
'RejectGeneral']))
412 $this->AddError(
'Rejected code U+'.sprintf(
'%08X', $v));
415 foreach (self::$rfc3454Table[
'RejectRanges'] as $range)
417 if ($range[0] <= $v && $v <= $range[1])
419 $this->AddError(
'Rejected code U+'.sprintf(
'%08X', $v));
424 if ($v >= 0xAC00 && $v <= 0xD7AF)
426 foreach ($this->DecomposeKorean($v) as $out)
440 for (
$i = 0;
$i < $outputLength;
$i++)
442 $class = self::$rfc3454Table[
'CombiningClass'][
$output[
$i]] ?? 0;
443 if ((!$lastClass || $lastClass > $class) && $class)
445 $sequenceLength =
$i - $lastStarter;
446 $out = $this->Combine(array_slice(
$output, $lastStarter, $sequenceLength));
452 for ($j =
$i + 1; $j < $outputLength; $j++)
458 if (
$i == $lastStarter)
464 $lastClass = self::$rfc3454Table[
'CombiningClass'][
$output[
$i - 1]] ?? 0;
477 private function Combine($input)
479 $inputLength =
count($input);
480 foreach (self::$rfc3454Table[
'ReplaceMap'] as $src => $target)
482 if ($target[0] != $input[0])
484 if (
count($target) != $inputLength)
487 foreach ($input as
$k => $v)
489 if ($v == $target[
$k])
505 private function DecomposeKorean($char)
507 $ix = (int) $char - 0xAC00;
508 if ($ix < 0 || $ix >= 11172)
511 $result[] = (int) (0x1100 + $ix / 588);
512 $result[] = (int) (0x1161 + ($ix % 588) / 28);
513 $t = 0x11A7 + $ix % 28;
519 private function ComposeKorean($input)
521 $inputLength =
count($input);
526 $last = (int) $input[0];
529 for (
$i = 1;
$i < $inputLength;
$i++)
531 $char = (int) $input[
$i];
532 $six = $last - 0xAC00;
533 $lix = $last - 0x1100;
534 $vix = $char - 0x1161;
535 $tix = $char - 0x11A7;
537 if ($six >= 0 && $six < 11172 && ($six % 28 == 0) && $tix >= 0 && $tix <= 28)
544 if ($lix >= 0 && $lix < 19 && $vix >= 0 && $vix < 21)
546 $last = 0xAC00 + ($lix * 21 + $vix) * 28;
557 private function Utf8ToUcs4($input)
561 $inputLength = strlen($input);
567 for (
$i = 0;
$i < $inputLength;
$i++)
569 $v = ord($input[
$i]);
576 $this->AddError(
"UTF-8 / UCS-4 conversion failed: byte ".
$i);
589 $v = ($v - 192) << 6;
594 $v = ($v - 224) << 12;
599 $v = ($v - 240) << 18;
604 $v = ($v - 248) << 24;
609 $v = ($v - 252) << 30;
613 $this->AddError(
"UTF-8 / UCS-4 conversion failed: byte ".
$i);
623 if ($test ==
'range')
626 if (($v < 0xA0 && $startByte == 0xE0)
627 || ($v < 0x90 && $startByte == 0xF0)
628 || ($v > 0x8F && $startByte == 0xF4))
630 $this->AddError(
"UTF-8 / UCS-4 conversion failed: byte ".
$i);
636 $v = ($v - 128) << ($nextByte * 6);
637 $output[($outputLength - 1)] += $v;
642 $this->AddError(
"UTF-8 / UCS-4 conversion failed: byte ".
$i);
652 private function Ucs4ToUtf8($input)
655 foreach ($input as
$k => $v)
663 $output .= chr(192 + ($v >> 6)).chr(128 + ($v & 63));
667 $output .= chr(224 + ($v >> 12)).chr(128 + (($v >> 6) & 63)).chr(128 + ($v & 63));
671 $output .= chr(240 + ($v >> 18)).chr(128 + (($v >> 12) & 63)).chr(128 + (($v >> 6) & 63)).chr(128 + ($v & 63));
675 $this->AddError(
'UCS-4 / UTF-8 conversion failed: byte '.
$k);
682 private function ExplodeDomainName($domainNameUcs4)
687 foreach ($domainNameUcs4 as $value)
704 private function ImplodeDomainName($arDomainNameUcs4)
708 foreach ($arDomainNameUcs4 as $value)
718 private function ClearErrors()
720 $this->arErrors = [];
723 private function AddError(
$error)
725 $this->arErrors[] =
$error;
730 return $this->arErrors;
733 private static $rfc3454Table =
array(
735 0xAD, 0x34F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B, 0x200C, 0x200D,
736 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07,
737 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF
739 'RejectGeneral' =>
array(
740 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
741 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 ,33, 34, 35, 36, 37,
742 38, 39, 40, 41, 42, 43, 44, 47, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94,
743 95, 96, 123, 124, 125, 126, 127, 0x3002
746 0xA0, 0x340, 0x341, 0x6DD, 0x70F, 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003,
747 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, 0x200E,
748 0x200F, 0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, 0x202F, 0x205F, 0x206A,
749 0x206B, 0x206C, 0x206D, 0x206E, 0x206F, 0x3000, 0xFEFF, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC,
750 0xFFFD, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE,
751 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF,
752 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
753 0xDFFFF, 0xE0001, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF
755 'RejectRanges' =>
array(
757 array(0xF0000, 0xFFFFD),
array(0x100000, 0x10FFFD),
array(0xFDD0, 0xFDEF),
760 'ReplaceMap' =>
array(
783 0x12C =>
array(0x12D), 0x12E =>
array(0x12F), 0x130 =>
array(0x69, 0x307),
787 0x145 =>
array(0x146), 0x147 =>
array(0x148), 0x149 =>
array(0x2BC, 0x6E),
817 0x1F0 =>
array(0x6A, 0x30C), 0x1F1 =>
array(0x1F3), 0x1F2 =>
array(0x1F3),
829 0x345 =>
array(0x3B9), 0x37A =>
array(0x20, 0x3B9), 0x386 =>
array(0x3AC),
832 0x390 =>
array(0x3B9, 0x308, 0x301), 0x391 =>
array(0x3B1), 0x392 =>
array(0x3B2),
841 0x3B0 =>
array(0x3C5, 0x308, 0x301), 0x3C2 =>
array(0x3C3), 0x3D0 =>
array(0x3B2),
904 0x555 =>
array(0x585), 0x556 =>
array(0x586), 0x587 =>
array(0x565, 0x582),
905 0xE33 =>
array(0xE4D, 0xE32), 0x1E00 =>
array(0x1E01), 0x1E02 =>
array(0x1E03),
906 0x1E04 =>
array(0x1E05), 0x1E06 =>
array(0x1E07), 0x1E08 =>
array(0x1E09),
907 0x1E0A =>
array(0x1E0B), 0x1E0C =>
array(0x1E0D), 0x1E0E =>
array(0x1E0F),
908 0x1E10 =>
array(0x1E11), 0x1E12 =>
array(0x1E13), 0x1E14 =>
array(0x1E15),
909 0x1E16 =>
array(0x1E17), 0x1E18 =>
array(0x1E19), 0x1E1A =>
array(0x1E1B),
910 0x1E1C =>
array(0x1E1D), 0x1E1E =>
array(0x1E1F), 0x1E20 =>
array(0x1E21),
911 0x1E22 =>
array(0x1E23), 0x1E24 =>
array(0x1E25), 0x1E26 =>
array(0x1E27),
912 0x1E28 =>
array(0x1E29), 0x1E2A =>
array(0x1E2B), 0x1E2C =>
array(0x1E2D),
913 0x1E2E =>
array(0x1E2F), 0x1E30 =>
array(0x1E31), 0x1E32 =>
array(0x1E33),
914 0x1E34 =>
array(0x1E35), 0x1E36 =>
array(0x1E37), 0x1E38 =>
array(0x1E39),
915 0x1E3A =>
array(0x1E3B), 0x1E3C =>
array(0x1E3D), 0x1E3E =>
array(0x1E3F),
916 0x1E40 =>
array(0x1E41), 0x1E42 =>
array(0x1E43), 0x1E44 =>
array(0x1E45),
917 0x1E46 =>
array(0x1E47), 0x1E48 =>
array(0x1E49), 0x1E4A =>
array(0x1E4B),
918 0x1E4C =>
array(0x1E4D), 0x1E4E =>
array(0x1E4F), 0x1E50 =>
array(0x1E51),
919 0x1E52 =>
array(0x1E53), 0x1E54 =>
array(0x1E55), 0x1E56 =>
array(0x1E57),
920 0x1E58 =>
array(0x1E59), 0x1E5A =>
array(0x1E5B), 0x1E5C =>
array(0x1E5D),
921 0x1E5E =>
array(0x1E5F), 0x1E60 =>
array(0x1E61), 0x1E62 =>
array(0x1E63),
922 0x1E64 =>
array(0x1E65), 0x1E66 =>
array(0x1E67), 0x1E68 =>
array(0x1E69),
923 0x1E6A =>
array(0x1E6B), 0x1E6C =>
array(0x1E6D), 0x1E6E =>
array(0x1E6F),
924 0x1E70 =>
array(0x1E71), 0x1E72 =>
array(0x1E73), 0x1E74 =>
array(0x1E75),
925 0x1E76 =>
array(0x1E77), 0x1E78 =>
array(0x1E79), 0x1E7A =>
array(0x1E7B),
926 0x1E7C =>
array(0x1E7D), 0x1E7E =>
array(0x1E7F), 0x1E80 =>
array(0x1E81),
927 0x1E82 =>
array(0x1E83), 0x1E84 =>
array(0x1E85), 0x1E86 =>
array(0x1E87),
928 0x1E88 =>
array(0x1E89), 0x1E8A =>
array(0x1E8B), 0x1E8C =>
array(0x1E8D),
929 0x1E8E =>
array(0x1E8F), 0x1E90 =>
array(0x1E91), 0x1E92 =>
array(0x1E93),
930 0x1E94 =>
array(0x1E95), 0x1E96 =>
array(0x68, 0x331), 0x1E97 =>
array(0x74, 0x308),
931 0x1E98 =>
array(0x77, 0x30A), 0x1E99 =>
array(0x79, 0x30A),
932 0x1E9A =>
array(0x61, 0x2BE), 0x1E9B =>
array(0x1E61), 0x1EA0 =>
array(0x1EA1),
933 0x1EA2 =>
array(0x1EA3), 0x1EA4 =>
array(0x1EA5), 0x1EA6 =>
array(0x1EA7),
934 0x1EA8 =>
array(0x1EA9), 0x1EAA =>
array(0x1EAB), 0x1EAC =>
array(0x1EAD),
935 0x1EAE =>
array(0x1EAF), 0x1EB0 =>
array(0x1EB1), 0x1EB2 =>
array(0x1EB3),
936 0x1EB4 =>
array(0x1EB5), 0x1EB6 =>
array(0x1EB7), 0x1EB8 =>
array(0x1EB9),
937 0x1EBA =>
array(0x1EBB), 0x1EBC =>
array(0x1EBD), 0x1EBE =>
array(0x1EBF),
938 0x1EC0 =>
array(0x1EC1), 0x1EC2 =>
array(0x1EC3), 0x1EC4 =>
array(0x1EC5),
939 0x1EC6 =>
array(0x1EC7), 0x1EC8 =>
array(0x1EC9), 0x1ECA =>
array(0x1ECB),
940 0x1ECC =>
array(0x1ECD), 0x1ECE =>
array(0x1ECF), 0x1ED0 =>
array(0x1ED1),
941 0x1ED2 =>
array(0x1ED3), 0x1ED4 =>
array(0x1ED5), 0x1ED6 =>
array(0x1ED7),
942 0x1ED8 =>
array(0x1ED9), 0x1EDA =>
array(0x1EDB), 0x1EDC =>
array(0x1EDD),
943 0x1EDE =>
array(0x1EDF), 0x1EE0 =>
array(0x1EE1), 0x1EE2 =>
array(0x1EE3),
944 0x1EE4 =>
array(0x1EE5), 0x1EE6 =>
array(0x1EE7), 0x1EE8 =>
array(0x1EE9),
945 0x1EEA =>
array(0x1EEB), 0x1EEC =>
array(0x1EED), 0x1EEE =>
array(0x1EEF),
946 0x1EF0 =>
array(0x1EF1), 0x1EF2 =>
array(0x1EF3), 0x1EF4 =>
array(0x1EF5),
947 0x1EF6 =>
array(0x1EF7), 0x1EF8 =>
array(0x1EF9), 0x1F08 =>
array(0x1F00),
948 0x1F09 =>
array(0x1F01), 0x1F0A =>
array(0x1F02), 0x1F0B =>
array(0x1F03),
949 0x1F0C =>
array(0x1F04), 0x1F0D =>
array(0x1F05), 0x1F0E =>
array(0x1F06),
950 0x1F0F =>
array(0x1F07), 0x1F18 =>
array(0x1F10), 0x1F19 =>
array(0x1F11),
951 0x1F1A =>
array(0x1F12), 0x1F1B =>
array(0x1F13), 0x1F1C =>
array(0x1F14),
952 0x1F1D =>
array(0x1F15), 0x1F28 =>
array(0x1F20), 0x1F29 =>
array(0x1F21),
953 0x1F2A =>
array(0x1F22), 0x1F2B =>
array(0x1F23), 0x1F2C =>
array(0x1F24),
954 0x1F2D =>
array(0x1F25), 0x1F2E =>
array(0x1F26), 0x1F2F =>
array(0x1F27),
955 0x1F38 =>
array(0x1F30), 0x1F39 =>
array(0x1F31), 0x1F3A =>
array(0x1F32),
956 0x1F3B =>
array(0x1F33), 0x1F3C =>
array(0x1F34), 0x1F3D =>
array(0x1F35),
957 0x1F3E =>
array(0x1F36), 0x1F3F =>
array(0x1F37), 0x1F48 =>
array(0x1F40),
958 0x1F49 =>
array(0x1F41), 0x1F4A =>
array(0x1F42), 0x1F4B =>
array(0x1F43),
959 0x1F4C =>
array(0x1F44), 0x1F4D =>
array(0x1F45), 0x1F50 =>
array(0x3C5, 0x313),
960 0x1F52 =>
array(0x3C5, 0x313, 0x300), 0x1F54 =>
array(0x3C5, 0x313, 0x301),
961 0x1F56 =>
array(0x3C5, 0x313, 0x342), 0x1F59 =>
array(0x1F51), 0x1F5B =>
array(0x1F53),
962 0x1F5D =>
array(0x1F55), 0x1F5F =>
array(0x1F57), 0x1F68 =>
array(0x1F60),
963 0x1F69 =>
array(0x1F61), 0x1F6A =>
array(0x1F62), 0x1F6B =>
array(0x1F63),
964 0x1F6C =>
array(0x1F64), 0x1F6D =>
array(0x1F65), 0x1F6E =>
array(0x1F66),
965 0x1F6F =>
array(0x1F67), 0x1F80 =>
array(0x1F00, 0x3B9), 0x1F81 =>
array(0x1F01, 0x3B9),
966 0x1F82 =>
array(0x1F02, 0x3B9), 0x1F83 =>
array(0x1F03, 0x3B9),
967 0x1F84 =>
array(0x1F04, 0x3B9), 0x1F85 =>
array(0x1F05, 0x3B9),
968 0x1F86 =>
array(0x1F06, 0x3B9), 0x1F87 =>
array(0x1F07, 0x3B9),
969 0x1F88 =>
array(0x1F00, 0x3B9), 0x1F89 =>
array(0x1F01, 0x3B9),
970 0x1F8A =>
array(0x1F02, 0x3B9), 0x1F8B =>
array(0x1F03, 0x3B9),
971 0x1F8C =>
array(0x1F04, 0x3B9), 0x1F8D =>
array(0x1F05, 0x3B9),
972 0x1F8E =>
array(0x1F06, 0x3B9), 0x1F8F =>
array(0x1F07, 0x3B9),
973 0x1F90 =>
array(0x1F20, 0x3B9), 0x1F91 =>
array(0x1F21, 0x3B9),
974 0x1F92 =>
array(0x1F22, 0x3B9), 0x1F93 =>
array(0x1F23, 0x3B9),
975 0x1F94 =>
array(0x1F24, 0x3B9), 0x1F95 =>
array(0x1F25, 0x3B9),
976 0x1F96 =>
array(0x1F26, 0x3B9), 0x1F97 =>
array(0x1F27, 0x3B9),
977 0x1F98 =>
array(0x1F20, 0x3B9), 0x1F99 =>
array(0x1F21, 0x3B9),
978 0x1F9A =>
array(0x1F22, 0x3B9), 0x1F9B =>
array(0x1F23, 0x3B9),
979 0x1F9C =>
array(0x1F24, 0x3B9), 0x1F9D =>
array(0x1F25, 0x3B9),
980 0x1F9E =>
array(0x1F26, 0x3B9), 0x1F9F =>
array(0x1F27, 0x3B9),
981 0x1FA0 =>
array(0x1F60, 0x3B9), 0x1FA1 =>
array(0x1F61, 0x3B9),
982 0x1FA2 =>
array(0x1F62, 0x3B9), 0x1FA3 =>
array(0x1F63, 0x3B9),
983 0x1FA4 =>
array(0x1F64, 0x3B9), 0x1FA5 =>
array(0x1F65, 0x3B9),
984 0x1FA6 =>
array(0x1F66, 0x3B9), 0x1FA7 =>
array(0x1F67, 0x3B9),
985 0x1FA8 =>
array(0x1F60, 0x3B9), 0x1FA9 =>
array(0x1F61, 0x3B9),
986 0x1FAA =>
array(0x1F62, 0x3B9), 0x1FAB =>
array(0x1F63, 0x3B9),
987 0x1FAC =>
array(0x1F64, 0x3B9), 0x1FAD =>
array(0x1F65, 0x3B9),
988 0x1FAE =>
array(0x1F66, 0x3B9), 0x1FAF =>
array(0x1F67, 0x3B9),
989 0x1FB2 =>
array(0x1F70, 0x3B9), 0x1FB3 =>
array(0x3B1, 0x3B9),
990 0x1FB4 =>
array(0x3AC, 0x3B9), 0x1FB6 =>
array(0x3B1, 0x342),
991 0x1FB7 =>
array(0x3B1, 0x342, 0x3B9), 0x1FB8 =>
array(0x1FB0),
992 0x1FB9 =>
array(0x1FB1), 0x1FBA =>
array(0x1F70), 0x1FBB =>
array(0x1F71),
993 0x1FBC =>
array(0x3B1, 0x3B9), 0x1FBE =>
array(0x3B9), 0x1FC2 =>
array(0x1F74, 0x3B9),
994 0x1FC3 =>
array(0x3B7, 0x3B9), 0x1FC4 =>
array(0x3AE, 0x3B9),
995 0x1FC6 =>
array(0x3B7, 0x342), 0x1FC7 =>
array(0x3B7, 0x342, 0x3B9),
996 0x1FC8 =>
array(0x1F72), 0x1FC9 =>
array(0x1F73), 0x1FCA =>
array(0x1F74),
997 0x1FCB =>
array(0x1F75), 0x1FCC =>
array(0x3B7, 0x3B9),
998 0x1FD2 =>
array(0x3B9, 0x308, 0x300), 0x1FD3 =>
array(0x3B9, 0x308, 0x301),
999 0x1FD6 =>
array(0x3B9, 0x342), 0x1FD7 =>
array(0x3B9, 0x308, 0x342),
1000 0x1FD8 =>
array(0x1FD0), 0x1FD9 =>
array(0x1FD1), 0x1FDA =>
array(0x1F76),
1001 0x1FDB =>
array(0x1F77), 0x1FE2 =>
array(0x3C5, 0x308, 0x300),
1002 0x1FE3 =>
array(0x3C5, 0x308, 0x301), 0x1FE4 =>
array(0x3C1, 0x313),
1003 0x1FE6 =>
array(0x3C5, 0x342), 0x1FE7 =>
array(0x3C5, 0x308, 0x342),
1004 0x1FE8 =>
array(0x1FE0), 0x1FE9 =>
array(0x1FE1), 0x1FEA =>
array(0x1F7A),
1005 0x1FEB =>
array(0x1F7B), 0x1FEC =>
array(0x1FE5), 0x1FF2 =>
array(0x1F7C, 0x3B9),
1006 0x1FF3 =>
array(0x3C9, 0x3B9), 0x1FF4 =>
array(0x3CE, 0x3B9),
1007 0x1FF6 =>
array(0x3C9, 0x342), 0x1FF7 =>
array(0x3C9, 0x342, 0x3B9),
1008 0x1FF8 =>
array(0x1F78), 0x1FF9 =>
array(0x1F79), 0x1FFA =>
array(0x1F7C),
1009 0x1FFB =>
array(0x1F7D), 0x1FFC =>
array(0x3C9, 0x3B9), 0x20A8 =>
array(0x72, 0x73),
1010 0x2102 =>
array(0x63), 0x2103 =>
array(0xB0, 0x63), 0x2107 =>
array(0x25B),
1011 0x2109 =>
array(0xB0, 0x66), 0x210B =>
array(0x68), 0x210C =>
array(0x68),
1013 0x2112 =>
array(0x6C), 0x2115 =>
array(0x6E), 0x2116 =>
array(0x6E, 0x6F),
1015 0x211C =>
array(0x72), 0x211D =>
array(0x72), 0x2120 =>
array(0x73, 0x6D),
1016 0x2121 =>
array(0x74, 0x65, 0x6C), 0x2122 =>
array(0x74, 0x6D), 0x2124 =>
array(0x7A),
1020 0x213E =>
array(0x3B3), 0x213F =>
array(0x3C0), 0x2145 =>
array(0x64),
1021 0x2160 =>
array(0x2170), 0x2161 =>
array(0x2171), 0x2162 =>
array(0x2172),
1022 0x2163 =>
array(0x2173), 0x2164 =>
array(0x2174), 0x2165 =>
array(0x2175),
1023 0x2166 =>
array(0x2176), 0x2167 =>
array(0x2177), 0x2168 =>
array(0x2178),
1024 0x2169 =>
array(0x2179), 0x216A =>
array(0x217A), 0x216B =>
array(0x217B),
1025 0x216C =>
array(0x217C), 0x216D =>
array(0x217D), 0x216E =>
array(0x217E),
1026 0x216F =>
array(0x217F), 0x24B6 =>
array(0x24D0), 0x24B7 =>
array(0x24D1),
1027 0x24B8 =>
array(0x24D2), 0x24B9 =>
array(0x24D3), 0x24BA =>
array(0x24D4),
1028 0x24BB =>
array(0x24D5), 0x24BC =>
array(0x24D6), 0x24BD =>
array(0x24D7),
1029 0x24BE =>
array(0x24D8), 0x24BF =>
array(0x24D9), 0x24C0 =>
array(0x24DA),
1030 0x24C1 =>
array(0x24DB), 0x24C2 =>
array(0x24DC), 0x24C3 =>
array(0x24DD),
1031 0x24C4 =>
array(0x24DE), 0x24C5 =>
array(0x24DF), 0x24C6 =>
array(0x24E0),
1032 0x24C7 =>
array(0x24E1), 0x24C8 =>
array(0x24E2), 0x24C9 =>
array(0x24E3),
1033 0x24CA =>
array(0x24E4), 0x24CB =>
array(0x24E5), 0x24CC =>
array(0x24E6),
1034 0x24CD =>
array(0x24E7), 0x24CE =>
array(0x24E8), 0x24CF =>
array(0x24E9),
1035 0x3371 =>
array(0x68, 0x70, 0x61), 0x3373 =>
array(0x61, 0x75),
1036 0x3375 =>
array(0x6F, 0x76), 0x3380 =>
array(0x70, 0x61), 0x3381 =>
array(0x6E, 0x61),
1037 0x3382 =>
array(0x3BC, 0x61), 0x3383 =>
array(0x6D, 0x61), 0x3384 =>
array(0x6B, 0x61),
1038 0x3385 =>
array(0x6B, 0x62), 0x3386 =>
array(0x6D, 0x62), 0x3387 =>
array(0x67, 0x62),
1039 0x338A =>
array(0x70, 0x66), 0x338B =>
array(0x6E, 0x66), 0x338C =>
array(0x3BC, 0x66),
1040 0x3390 =>
array(0x68, 0x7A), 0x3391 =>
array(0x6B, 0x68, 0x7A),
1041 0x3392 =>
array(0x6D, 0x68, 0x7A), 0x3393 =>
array(0x67, 0x68, 0x7A),
1042 0x3394 =>
array(0x74, 0x68, 0x7A), 0x33A9 =>
array(0x70, 0x61),
1043 0x33AA =>
array(0x6B, 0x70, 0x61), 0x33AB =>
array(0x6D, 0x70, 0x61),
1044 0x33AC =>
array(0x67, 0x70, 0x61), 0x33B4 =>
array(0x70, 0x76),
1045 0x33B5 =>
array(0x6E, 0x76), 0x33B6 =>
array(0x3BC, 0x76), 0x33B7 =>
array(0x6D, 0x76),
1046 0x33B8 =>
array(0x6B, 0x76), 0x33B9 =>
array(0x6D, 0x76), 0x33BA =>
array(0x70, 0x77),
1047 0x33BB =>
array(0x6E, 0x77), 0x33BC =>
array(0x3BC, 0x77), 0x33BD =>
array(0x6D, 0x77),
1048 0x33BE =>
array(0x6B, 0x77), 0x33BF =>
array(0x6D, 0x77), 0x33C0 =>
array(0x6B, 0x3C9),
1049 0x33C1 =>
array(0x6D, 0x3C9), 0x33C3 =>
array(0x62, 0x71),
1050 0x33C6 =>
array(0x63, 0x2215, 0x6B, 0x67), 0x33C7 =>
array(0x63, 0x6F, 0x2E),
1051 0x33C8 =>
array(0x64, 0x62), 0x33C9 =>
array(0x67, 0x79), 0x33CB =>
array(0x68, 0x70),
1052 0x33CD =>
array(0x6B, 0x6B), 0x33CE =>
array(0x6B, 0x6D), 0x33D7 =>
array(0x70, 0x68),
1053 0x33D9 =>
array(0x70, 0x70, 0x6D), 0x33DA =>
array(0x70, 0x72),
1054 0x33DC =>
array(0x73, 0x76), 0x33DD =>
array(0x77, 0x62), 0xFB00 =>
array(0x66, 0x66),
1055 0xFB01 =>
array(0x66, 0x69), 0xFB02 =>
array(0x66, 0x6C),
1056 0xFB03 =>
array(0x66, 0x66, 0x69), 0xFB04 =>
array(0x66, 0x66, 0x6C),
1057 0xFB05 =>
array(0x73, 0x74), 0xFB06 =>
array(0x73, 0x74), 0xFB13 =>
array(0x574, 0x576),
1058 0xFB14 =>
array(0x574, 0x565), 0xFB15 =>
array(0x574, 0x56B),
1059 0xFB16 =>
array(0x57E, 0x576), 0xFB17 =>
array(0x574, 0x56D), 0xFF21 =>
array(0xFF41),
1060 0xFF22 =>
array(0xFF42), 0xFF23 =>
array(0xFF43), 0xFF24 =>
array(0xFF44),
1061 0xFF25 =>
array(0xFF45), 0xFF26 =>
array(0xFF46), 0xFF27 =>
array(0xFF47),
1062 0xFF28 =>
array(0xFF48), 0xFF29 =>
array(0xFF49), 0xFF2A =>
array(0xFF4A),
1063 0xFF2B =>
array(0xFF4B), 0xFF2C =>
array(0xFF4C), 0xFF2D =>
array(0xFF4D),
1064 0xFF2E =>
array(0xFF4E), 0xFF2F =>
array(0xFF4F), 0xFF30 =>
array(0xFF50),
1065 0xFF31 =>
array(0xFF51), 0xFF32 =>
array(0xFF52), 0xFF33 =>
array(0xFF53),
1066 0xFF34 =>
array(0xFF54), 0xFF35 =>
array(0xFF55), 0xFF36 =>
array(0xFF56),
1067 0xFF37 =>
array(0xFF57), 0xFF38 =>
array(0xFF58), 0xFF39 =>
array(0xFF59),
1068 0xFF3A =>
array(0xFF5A), 0x10400 =>
array(0x10428), 0x10401 =>
array(0x10429),
1069 0x10402 =>
array(0x1042A), 0x10403 =>
array(0x1042B), 0x10404 =>
array(0x1042C),
1070 0x10405 =>
array(0x1042D), 0x10406 =>
array(0x1042E), 0x10407 =>
array(0x1042F),
1071 0x10408 =>
array(0x10430), 0x10409 =>
array(0x10431), 0x1040A =>
array(0x10432),
1072 0x1040B =>
array(0x10433), 0x1040C =>
array(0x10434), 0x1040D =>
array(0x10435),
1073 0x1040E =>
array(0x10436), 0x1040F =>
array(0x10437), 0x10410 =>
array(0x10438),
1074 0x10411 =>
array(0x10439), 0x10412 =>
array(0x1043A), 0x10413 =>
array(0x1043B),
1075 0x10414 =>
array(0x1043C), 0x10415 =>
array(0x1043D), 0x10416 =>
array(0x1043E),
1076 0x10417 =>
array(0x1043F), 0x10418 =>
array(0x10440), 0x10419 =>
array(0x10441),
1077 0x1041A =>
array(0x10442), 0x1041B =>
array(0x10443), 0x1041C =>
array(0x10444),
1078 0x1041D =>
array(0x10445), 0x1041E =>
array(0x10446), 0x1041F =>
array(0x10447),
1079 0x10420 =>
array(0x10448), 0x10421 =>
array(0x10449), 0x10422 =>
array(0x1044A),
1080 0x10423 =>
array(0x1044B), 0x10424 =>
array(0x1044C), 0x10425 =>
array(0x1044D),
1081 0x1D400 =>
array(0x61), 0x1D401 =>
array(0x62), 0x1D402 =>
array(0x63),
1082 0x1D403 =>
array(0x64), 0x1D404 =>
array(0x65), 0x1D405 =>
array(0x66),
1083 0x1D406 =>
array(0x67), 0x1D407 =>
array(0x68), 0x1D408 =>
array(0x69),
1084 0x1D409 =>
array(0x6A), 0x1D40A =>
array(0x6B), 0x1D40B =>
array(0x6C),
1085 0x1D40C =>
array(0x6D), 0x1D40D =>
array(0x6E), 0x1D40E =>
array(0x6F),
1086 0x1D40F =>
array(0x70), 0x1D410 =>
array(0x71), 0x1D411 =>
array(0x72),
1087 0x1D412 =>
array(0x73), 0x1D413 =>
array(0x74), 0x1D414 =>
array(0x75),
1088 0x1D415 =>
array(0x76), 0x1D416 =>
array(0x77), 0x1D417 =>
array(0x78),
1089 0x1D418 =>
array(0x79), 0x1D419 =>
array(0x7A), 0x1D434 =>
array(0x61),
1090 0x1D435 =>
array(0x62), 0x1D436 =>
array(0x63), 0x1D437 =>
array(0x64),
1091 0x1D438 =>
array(0x65), 0x1D439 =>
array(0x66), 0x1D43A =>
array(0x67),
1092 0x1D43B =>
array(0x68), 0x1D43C =>
array(0x69), 0x1D43D =>
array(0x6A),
1093 0x1D43E =>
array(0x6B), 0x1D43F =>
array(0x6C), 0x1D440 =>
array(0x6D),
1094 0x1D441 =>
array(0x6E), 0x1D442 =>
array(0x6F), 0x1D443 =>
array(0x70),
1095 0x1D444 =>
array(0x71), 0x1D445 =>
array(0x72), 0x1D446 =>
array(0x73),
1096 0x1D447 =>
array(0x74), 0x1D448 =>
array(0x75), 0x1D449 =>
array(0x76),
1097 0x1D44A =>
array(0x77), 0x1D44B =>
array(0x78), 0x1D44C =>
array(0x79),
1098 0x1D44D =>
array(0x7A), 0x1D468 =>
array(0x61), 0x1D469 =>
array(0x62),
1099 0x1D46A =>
array(0x63), 0x1D46B =>
array(0x64), 0x1D46C =>
array(0x65),
1100 0x1D46D =>
array(0x66), 0x1D46E =>
array(0x67), 0x1D46F =>
array(0x68),
1101 0x1D470 =>
array(0x69), 0x1D471 =>
array(0x6A), 0x1D472 =>
array(0x6B),
1102 0x1D473 =>
array(0x6C), 0x1D474 =>
array(0x6D), 0x1D475 =>
array(0x6E),
1103 0x1D476 =>
array(0x6F), 0x1D477 =>
array(0x70), 0x1D478 =>
array(0x71),
1104 0x1D479 =>
array(0x72), 0x1D47A =>
array(0x73), 0x1D47B =>
array(0x74),
1105 0x1D47C =>
array(0x75), 0x1D47D =>
array(0x76), 0x1D47E =>
array(0x77),
1106 0x1D47F =>
array(0x78), 0x1D480 =>
array(0x79), 0x1D481 =>
array(0x7A),
1107 0x1D49C =>
array(0x61), 0x1D49E =>
array(0x63), 0x1D49F =>
array(0x64),
1108 0x1D4A2 =>
array(0x67), 0x1D4A5 =>
array(0x6A), 0x1D4A6 =>
array(0x6B),
1109 0x1D4A9 =>
array(0x6E), 0x1D4AA =>
array(0x6F), 0x1D4AB =>
array(0x70),
1110 0x1D4AC =>
array(0x71), 0x1D4AE =>
array(0x73), 0x1D4AF =>
array(0x74),
1111 0x1D4B0 =>
array(0x75), 0x1D4B1 =>
array(0x76), 0x1D4B2 =>
array(0x77),
1112 0x1D4B3 =>
array(0x78), 0x1D4B4 =>
array(0x79), 0x1D4B5 =>
array(0x7A),
1113 0x1D4D0 =>
array(0x61), 0x1D4D1 =>
array(0x62), 0x1D4D2 =>
array(0x63),
1114 0x1D4D3 =>
array(0x64), 0x1D4D4 =>
array(0x65), 0x1D4D5 =>
array(0x66),
1115 0x1D4D6 =>
array(0x67), 0x1D4D7 =>
array(0x68), 0x1D4D8 =>
array(0x69),
1116 0x1D4D9 =>
array(0x6A), 0x1D4DA =>
array(0x6B), 0x1D4DB =>
array(0x6C),
1117 0x1D4DC =>
array(0x6D), 0x1D4DD =>
array(0x6E), 0x1D4DE =>
array(0x6F),
1118 0x1D4DF =>
array(0x70), 0x1D4E0 =>
array(0x71), 0x1D4E1 =>
array(0x72),
1119 0x1D4E2 =>
array(0x73), 0x1D4E3 =>
array(0x74), 0x1D4E4 =>
array(0x75),
1120 0x1D4E5 =>
array(0x76), 0x1D4E6 =>
array(0x77), 0x1D4E7 =>
array(0x78),
1121 0x1D4E8 =>
array(0x79), 0x1D4E9 =>
array(0x7A), 0x1D504 =>
array(0x61),
1122 0x1D505 =>
array(0x62), 0x1D507 =>
array(0x64), 0x1D508 =>
array(0x65),
1123 0x1D509 =>
array(0x66), 0x1D50A =>
array(0x67), 0x1D50D =>
array(0x6A),
1124 0x1D50E =>
array(0x6B), 0x1D50F =>
array(0x6C), 0x1D510 =>
array(0x6D),
1125 0x1D511 =>
array(0x6E), 0x1D512 =>
array(0x6F), 0x1D513 =>
array(0x70),
1126 0x1D514 =>
array(0x71), 0x1D516 =>
array(0x73), 0x1D517 =>
array(0x74),
1127 0x1D518 =>
array(0x75), 0x1D519 =>
array(0x76), 0x1D51A =>
array(0x77),
1128 0x1D51B =>
array(0x78), 0x1D51C =>
array(0x79), 0x1D538 =>
array(0x61),
1129 0x1D539 =>
array(0x62), 0x1D53B =>
array(0x64), 0x1D53C =>
array(0x65),
1130 0x1D53D =>
array(0x66), 0x1D53E =>
array(0x67), 0x1D540 =>
array(0x69),
1131 0x1D541 =>
array(0x6A), 0x1D542 =>
array(0x6B), 0x1D543 =>
array(0x6C),
1132 0x1D544 =>
array(0x6D), 0x1D546 =>
array(0x6F), 0x1D54A =>
array(0x73),
1133 0x1D54B =>
array(0x74), 0x1D54C =>
array(0x75), 0x1D54D =>
array(0x76),
1134 0x1D54E =>
array(0x77), 0x1D54F =>
array(0x78), 0x1D550 =>
array(0x79),
1135 0x1D56C =>
array(0x61), 0x1D56D =>
array(0x62), 0x1D56E =>
array(0x63),
1136 0x1D56F =>
array(0x64), 0x1D570 =>
array(0x65), 0x1D571 =>
array(0x66),
1137 0x1D572 =>
array(0x67), 0x1D573 =>
array(0x68), 0x1D574 =>
array(0x69),
1138 0x1D575 =>
array(0x6A), 0x1D576 =>
array(0x6B), 0x1D577 =>
array(0x6C),
1139 0x1D578 =>
array(0x6D), 0x1D579 =>
array(0x6E), 0x1D57A =>
array(0x6F),
1140 0x1D57B =>
array(0x70), 0x1D57C =>
array(0x71), 0x1D57D =>
array(0x72),
1141 0x1D57E =>
array(0x73), 0x1D57F =>
array(0x74), 0x1D580 =>
array(0x75),
1142 0x1D581 =>
array(0x76), 0x1D582 =>
array(0x77), 0x1D583 =>
array(0x78),
1143 0x1D584 =>
array(0x79), 0x1D585 =>
array(0x7A), 0x1D5A0 =>
array(0x61),
1144 0x1D5A1 =>
array(0x62), 0x1D5A2 =>
array(0x63), 0x1D5A3 =>
array(0x64),
1145 0x1D5A4 =>
array(0x65), 0x1D5A5 =>
array(0x66), 0x1D5A6 =>
array(0x67),
1146 0x1D5A7 =>
array(0x68), 0x1D5A8 =>
array(0x69), 0x1D5A9 =>
array(0x6A),
1147 0x1D5AA =>
array(0x6B), 0x1D5AB =>
array(0x6C), 0x1D5AC =>
array(0x6D),
1148 0x1D5AD =>
array(0x6E), 0x1D5AE =>
array(0x6F), 0x1D5AF =>
array(0x70),
1149 0x1D5B0 =>
array(0x71), 0x1D5B1 =>
array(0x72), 0x1D5B2 =>
array(0x73),
1150 0x1D5B3 =>
array(0x74), 0x1D5B4 =>
array(0x75), 0x1D5B5 =>
array(0x76),
1151 0x1D5B6 =>
array(0x77), 0x1D5B7 =>
array(0x78), 0x1D5B8 =>
array(0x79),
1152 0x1D5B9 =>
array(0x7A), 0x1D5D4 =>
array(0x61), 0x1D5D5 =>
array(0x62),
1153 0x1D5D6 =>
array(0x63), 0x1D5D7 =>
array(0x64), 0x1D5D8 =>
array(0x65),
1154 0x1D5D9 =>
array(0x66), 0x1D5DA =>
array(0x67), 0x1D5DB =>
array(0x68),
1155 0x1D5DC =>
array(0x69), 0x1D5DD =>
array(0x6A), 0x1D5DE =>
array(0x6B),
1156 0x1D5DF =>
array(0x6C), 0x1D5E0 =>
array(0x6D), 0x1D5E1 =>
array(0x6E),
1157 0x1D5E2 =>
array(0x6F), 0x1D5E3 =>
array(0x70), 0x1D5E4 =>
array(0x71),
1158 0x1D5E5 =>
array(0x72), 0x1D5E6 =>
array(0x73), 0x1D5E7 =>
array(0x74),
1159 0x1D5E8 =>
array(0x75), 0x1D5E9 =>
array(0x76), 0x1D5EA =>
array(0x77),
1160 0x1D5EB =>
array(0x78), 0x1D5EC =>
array(0x79), 0x1D5ED =>
array(0x7A),
1161 0x1D608 =>
array(0x61), 0x1D609 =>
array(0x62) ,0x1D60A =>
array(0x63),
1162 0x1D60B =>
array(0x64), 0x1D60C =>
array(0x65), 0x1D60D =>
array(0x66),
1163 0x1D60E =>
array(0x67), 0x1D60F =>
array(0x68), 0x1D610 =>
array(0x69),
1164 0x1D611 =>
array(0x6A), 0x1D612 =>
array(0x6B), 0x1D613 =>
array(0x6C),
1165 0x1D614 =>
array(0x6D), 0x1D615 =>
array(0x6E), 0x1D616 =>
array(0x6F),
1166 0x1D617 =>
array(0x70), 0x1D618 =>
array(0x71), 0x1D619 =>
array(0x72),
1167 0x1D61A =>
array(0x73), 0x1D61B =>
array(0x74), 0x1D61C =>
array(0x75),
1168 0x1D61D =>
array(0x76), 0x1D61E =>
array(0x77), 0x1D61F =>
array(0x78),
1169 0x1D620 =>
array(0x79), 0x1D621 =>
array(0x7A), 0x1D63C =>
array(0x61),
1170 0x1D63D =>
array(0x62), 0x1D63E =>
array(0x63), 0x1D63F =>
array(0x64),
1171 0x1D640 =>
array(0x65), 0x1D641 =>
array(0x66), 0x1D642 =>
array(0x67),
1172 0x1D643 =>
array(0x68), 0x1D644 =>
array(0x69), 0x1D645 =>
array(0x6A),
1173 0x1D646 =>
array(0x6B), 0x1D647 =>
array(0x6C), 0x1D648 =>
array(0x6D),
1174 0x1D649 =>
array(0x6E), 0x1D64A =>
array(0x6F), 0x1D64B =>
array(0x70),
1175 0x1D64C =>
array(0x71), 0x1D64D =>
array(0x72), 0x1D64E =>
array(0x73),
1176 0x1D64F =>
array(0x74), 0x1D650 =>
array(0x75), 0x1D651 =>
array(0x76),
1177 0x1D652 =>
array(0x77), 0x1D653 =>
array(0x78), 0x1D654 =>
array(0x79),
1178 0x1D655 =>
array(0x7A), 0x1D670 =>
array(0x61), 0x1D671 =>
array(0x62),
1179 0x1D672 =>
array(0x63), 0x1D673 =>
array(0x64), 0x1D674 =>
array(0x65),
1180 0x1D675 =>
array(0x66), 0x1D676 =>
array(0x67), 0x1D677 =>
array(0x68),
1181 0x1D678 =>
array(0x69), 0x1D679 =>
array(0x6A), 0x1D67A =>
array(0x6B),
1182 0x1D67B =>
array(0x6C), 0x1D67C =>
array(0x6D), 0x1D67D =>
array(0x6E),
1183 0x1D67E =>
array(0x6F), 0x1D67F =>
array(0x70), 0x1D680 =>
array(0x71),
1184 0x1D681 =>
array(0x72), 0x1D682 =>
array(0x73), 0x1D683 =>
array(0x74),
1185 0x1D684 =>
array(0x75), 0x1D685 =>
array(0x76), 0x1D686 =>
array(0x77),
1186 0x1D687 =>
array(0x78), 0x1D688 =>
array(0x79), 0x1D689 =>
array(0x7A),
1187 0x1D6A8 =>
array(0x3B1), 0x1D6A9 =>
array(0x3B2), 0x1D6AA =>
array(0x3B3),
1188 0x1D6AB =>
array(0x3B4), 0x1D6AC =>
array(0x3B5), 0x1D6AD =>
array(0x3B6),
1189 0x1D6AE =>
array(0x3B7), 0x1D6AF =>
array(0x3B8), 0x1D6B0 =>
array(0x3B9),
1190 0x1D6B1 =>
array(0x3BA), 0x1D6B2 =>
array(0x3BB), 0x1D6B3 =>
array(0x3BC),
1191 0x1D6B4 =>
array(0x3BD), 0x1D6B5 =>
array(0x3BE), 0x1D6B6 =>
array(0x3BF),
1192 0x1D6B7 =>
array(0x3C0), 0x1D6B8 =>
array(0x3C1), 0x1D6B9 =>
array(0x3B8),
1193 0x1D6BA =>
array(0x3C3), 0x1D6BB =>
array(0x3C4), 0x1D6BC =>
array(0x3C5),
1194 0x1D6BD =>
array(0x3C6), 0x1D6BE =>
array(0x3C7), 0x1D6BF =>
array(0x3C8),
1195 0x1D6C0 =>
array(0x3C9), 0x1D6D3 =>
array(0x3C3), 0x1D6E2 =>
array(0x3B1),
1196 0x1D6E3 =>
array(0x3B2), 0x1D6E4 =>
array(0x3B3), 0x1D6E5 =>
array(0x3B4),
1197 0x1D6E6 =>
array(0x3B5), 0x1D6E7 =>
array(0x3B6), 0x1D6E8 =>
array(0x3B7),
1198 0x1D6E9 =>
array(0x3B8), 0x1D6EA =>
array(0x3B9), 0x1D6EB =>
array(0x3BA),
1199 0x1D6EC =>
array(0x3BB), 0x1D6ED =>
array(0x3BC), 0x1D6EE =>
array(0x3BD),
1200 0x1D6EF =>
array(0x3BE), 0x1D6F0 =>
array(0x3BF), 0x1D6F1 =>
array(0x3C0),
1201 0x1D6F2 =>
array(0x3C1), 0x1D6F3 =>
array(0x3B8) ,0x1D6F4 =>
array(0x3C3),
1202 0x1D6F5 =>
array(0x3C4), 0x1D6F6 =>
array(0x3C5), 0x1D6F7 =>
array(0x3C6),
1203 0x1D6F8 =>
array(0x3C7), 0x1D6F9 =>
array(0x3C8) ,0x1D6FA =>
array(0x3C9),
1204 0x1D70D =>
array(0x3C3), 0x1D71C =>
array(0x3B1), 0x1D71D =>
array(0x3B2),
1205 0x1D71E =>
array(0x3B3), 0x1D71F =>
array(0x3B4), 0x1D720 =>
array(0x3B5),
1206 0x1D721 =>
array(0x3B6), 0x1D722 =>
array(0x3B7), 0x1D723 =>
array(0x3B8),
1207 0x1D724 =>
array(0x3B9), 0x1D725 =>
array(0x3BA), 0x1D726 =>
array(0x3BB),
1208 0x1D727 =>
array(0x3BC), 0x1D728 =>
array(0x3BD), 0x1D729 =>
array(0x3BE),
1209 0x1D72A =>
array(0x3BF), 0x1D72B =>
array(0x3C0), 0x1D72C =>
array(0x3C1),
1210 0x1D72D =>
array(0x3B8), 0x1D72E =>
array(0x3C3), 0x1D72F =>
array(0x3C4),
1211 0x1D730 =>
array(0x3C5), 0x1D731 =>
array(0x3C6), 0x1D732 =>
array(0x3C7),
1212 0x1D733 =>
array(0x3C8), 0x1D734 =>
array(0x3C9), 0x1D747 =>
array(0x3C3),
1213 0x1D756 =>
array(0x3B1), 0x1D757 =>
array(0x3B2), 0x1D758 =>
array(0x3B3),
1214 0x1D759 =>
array(0x3B4), 0x1D75A =>
array(0x3B5), 0x1D75B =>
array(0x3B6),
1215 0x1D75C =>
array(0x3B7), 0x1D75D =>
array(0x3B8), 0x1D75E =>
array(0x3B9),
1216 0x1D75F =>
array(0x3BA), 0x1D760 =>
array(0x3BB), 0x1D761 =>
array(0x3BC),
1217 0x1D762 =>
array(0x3BD), 0x1D763 =>
array(0x3BE), 0x1D764 =>
array(0x3BF),
1218 0x1D765 =>
array(0x3C0), 0x1D766 =>
array(0x3C1), 0x1D767 =>
array(0x3B8),
1219 0x1D768 =>
array(0x3C3), 0x1D769 =>
array(0x3C4), 0x1D76A =>
array(0x3C5),
1220 0x1D76B =>
array(0x3C6), 0x1D76C =>
array(0x3C7), 0x1D76D =>
array(0x3C8),
1221 0x1D76E =>
array(0x3C9), 0x1D781 =>
array(0x3C3), 0x1D790 =>
array(0x3B1),
1222 0x1D791 =>
array(0x3B2), 0x1D792 =>
array(0x3B3), 0x1D793 =>
array(0x3B4),
1223 0x1D794 =>
array(0x3B5), 0x1D795 =>
array(0x3B6), 0x1D796 =>
array(0x3B7),
1224 0x1D797 =>
array(0x3B8), 0x1D798 =>
array(0x3B9), 0x1D799 =>
array(0x3BA),
1225 0x1D79A =>
array(0x3BB), 0x1D79B =>
array(0x3BC), 0x1D79C =>
array(0x3BD),
1226 0x1D79D =>
array(0x3BE), 0x1D79E =>
array(0x3BF), 0x1D79F =>
array(0x3C0),
1227 0x1D7A0 =>
array(0x3C1), 0x1D7A1 =>
array(0x3B8), 0x1D7A2 =>
array(0x3C3),
1228 0x1D7A3 =>
array(0x3C4), 0x1D7A4 =>
array(0x3C5), 0x1D7A5 =>
array(0x3C6),
1229 0x1D7A6 =>
array(0x3C7), 0x1D7A7 =>
array(0x3C8), 0x1D7A8 =>
array(0x3C9),
1230 0x1D7BB =>
array(0x3C3), 0x3F9 =>
array(0x3C3), 0x1D2C =>
array(0x61),
1237 0x1D41 =>
array(0x75), 0x1D42 =>
array(0x77), 0x213B =>
array(0x66, 0x61, 0x78),
1238 0x3250 =>
array(0x70, 0x74, 0x65), 0x32CC =>
array(0x68, 0x67),
1239 0x32CE =>
array(0x65, 0x76), 0x32CF =>
array(0x6C, 0x74, 0x64),
1240 0x337A =>
array(0x69, 0x75), 0x33DE =>
array(0x76, 0x2215, 0x6D),
1241 0x33DF =>
array(0x61, 0x2215, 0x6D)
1243 'CombiningClass' =>
array(
1244 0x334 => 1, 0x335 => 1, 0x336 => 1, 0x337 => 1, 0x338 => 1, 0x93C => 7, 0x9BC => 7,
1245 0xA3C => 7, 0xABC => 7, 0xB3C => 7, 0xCBC => 7, 0x1037 => 7, 0x3099 => 8,
1246 0x309A => 8, 0x94D => 9, 0x9CD => 9, 0xA4D => 9, 0xACD => 9, 0xB4D => 9, 0xBCD => 9,
1247 0xC4D => 9, 0xCCD => 9, 0xD4D => 9, 0xDCA => 9, 0xE3A => 9, 0xF84 => 9, 0x1039 => 9,
1248 0x1714 => 9, 0x1734 => 9, 0x17D2 => 9, 0x5B0 => 10, 0x5B1 => 11, 0x5B2 => 12,
1249 0x5B3 => 13, 0x5B4 => 14, 0x5B5 => 15, 0x5B6 => 16, 0x5B7 => 17, 0x5B8 => 18,
1250 0x5B9 => 19, 0x5BB => 20, 0x5Bc => 21, 0x5BD => 22, 0x5BF => 23, 0x5C1 => 24,
1251 0x5C2 => 25, 0xFB1E => 26, 0x64B => 27, 0x64C => 28, 0x64D => 29, 0x64E => 30,
1252 0x64F => 31, 0x650 => 32, 0x651 => 33, 0x652 => 34, 0x670 => 35, 0x711 => 36,
1253 0xC55 => 84, 0xC56 => 91, 0xE38 => 103, 0xE39 => 103, 0xE48 => 107, 0xE49 => 107,
1254 0xE4A => 107, 0xE4B => 107, 0xEB8 => 118, 0xEB9 => 118, 0xEC8 => 122, 0xEC9 => 122,
1255 0xECA => 122, 0xECB => 122, 0xF71 => 129, 0xF72 => 130, 0xF7A => 130, 0xF7B => 130,
1256 0xF7C => 130, 0xF7D => 130, 0xF80 => 130, 0xF74 => 132, 0x321 => 202, 0x322 => 202,
1257 0x327 => 202, 0x328 => 202, 0x31B => 216, 0xF39 => 216, 0x1D165 => 216, 0x1D166 => 216,
1258 0x1D16E => 216, 0x1D16F => 216, 0x1D170 => 216, 0x1D171 => 216, 0x1D172 => 216,
1259 0x302A => 218, 0x316 => 220, 0x317 => 220, 0x318 => 220, 0x319 => 220, 0x31C => 220,
1260 0x31D => 220, 0x31E => 220, 0x31F => 220, 0x320 => 220, 0x323 => 220, 0x324 => 220,
1261 0x325 => 220, 0x326 => 220, 0x329 => 220, 0x32A => 220, 0x32B => 220, 0x32C => 220,
1262 0x32D => 220, 0x32E => 220, 0x32F => 220, 0x330 => 220, 0x331 => 220, 0x332 => 220,
1263 0x333 => 220, 0x339 => 220, 0x33A => 220, 0x33B => 220, 0x33C => 220, 0x347 => 220,
1264 0x348 => 220, 0x349 => 220, 0x34D => 220, 0x34E => 220, 0x353 => 220, 0x354 => 220,
1265 0x355 => 220, 0x356 => 220, 0x591 => 220, 0x596 => 220, 0x59B => 220, 0x5A3 => 220,
1266 0x5A4 => 220, 0x5A5 => 220, 0x5A6 => 220, 0x5A7 => 220, 0x5AA => 220, 0x655 => 220,
1267 0x656 => 220, 0x6E3 => 220, 0x6EA => 220, 0x6ED => 220, 0x731 => 220, 0x734 => 220,
1268 0x737 => 220, 0x738 => 220, 0x739 => 220, 0x73B => 220, 0x73C => 220, 0x73E => 220,
1269 0x742 => 220, 0x744 => 220, 0x746 => 220, 0x748 => 220, 0x952 => 220, 0xF18 => 220,
1270 0xF19 => 220, 0xF35 => 220, 0xF37 => 220, 0xFC6 => 220, 0x193B => 220, 0x20E8 => 220,
1271 0x1D17B => 220, 0x1D17C => 220, 0x1D17D => 220, 0x1D17E => 220, 0x1D17F => 220,
1272 0x1D180 => 220, 0x1D181 => 220, 0x1D182 => 220, 0x1D18A => 220, 0x1D18B => 220,
1273 0x59A => 222, 0x5AD => 222, 0x1929 => 222, 0x302D => 222, 0x302E => 224, 0x302F => 224,
1274 0x1D16D => 226, 0x5AE => 228, 0x18A9 => 228, 0x302B => 228, 0x300 => 230, 0x301 => 230,
1275 0x302 => 230, 0x303 => 230, 0x304 => 230, 0x305 => 230, 0x306 => 230, 0x307 => 230,
1276 0x308 => 230, 0x309 => 230, 0x30A => 230, 0x30B => 230, 0x30C => 230, 0x30D => 230,
1277 0x30E => 230, 0x30F => 230, 0x310 => 230, 0x311 => 230, 0x312 => 230, 0x313 => 230,
1278 0x314 => 230, 0x33D => 230, 0x33E => 230, 0x33F => 230, 0x340 => 230, 0x341 => 230,
1279 0x342 => 230, 0x343 => 230, 0x344 => 230, 0x346 => 230, 0x34A => 230, 0x34B => 230,
1280 0x34C => 230, 0x350 => 230, 0x351 => 230, 0x352 => 230, 0x357 => 230, 0x363 => 230,
1281 0x364 => 230, 0x365 => 230, 0x366 => 230, 0x367 => 230, 0x368 => 230, 0x369 => 230,
1282 0x36A => 230, 0x36B => 230, 0x36C => 230, 0x36D => 230, 0x36E => 230, 0x36F => 230,
1283 0x483 => 230, 0x484 => 230, 0x485 => 230, 0x486 => 230, 0x592 => 230, 0x593 => 230,
1284 0x594 => 230, 0x595 => 230, 0x597 => 230, 0x598 => 230, 0x599 => 230, 0x59C => 230,
1285 0x59D => 230, 0x59E => 230, 0x59F => 230, 0x5A0 => 230, 0x5A1 => 230, 0x5A8 => 230,
1286 0x5A9 => 230, 0x5AB => 230, 0x5AC => 230, 0x5AF => 230, 0x5C4 => 230, 0x610 => 230,
1287 0x611 => 230, 0x612 => 230, 0x613 => 230, 0x614 => 230, 0x615 => 230, 0x653 => 230,
1288 0x654 => 230, 0x657 => 230, 0x658 => 230, 0x6D6 => 230, 0x6D7 => 230, 0x6D8 => 230,
1289 0x6D9 => 230, 0x6DA => 230, 0x6DB => 230, 0x6DC => 230, 0x6DF => 230, 0x6E0 => 230,
1290 0x6E1 => 230, 0x6E2 => 230, 0x6E4 => 230, 0x6E7 => 230, 0x6E8 => 230, 0x6EB => 230,
1291 0x6EC => 230, 0x730 => 230, 0x732 => 230, 0x733 => 230, 0x735 => 230, 0x736 => 230,
1292 0x73A => 230, 0x73D => 230, 0x73F => 230, 0x740 => 230, 0x741 => 230, 0x743 => 230,
1293 0x745 => 230, 0x747 => 230, 0x749 => 230, 0x74A => 230, 0x951 => 230, 0x953 => 230,
1294 0x954 => 230, 0xF82 => 230, 0xF83 => 230, 0xF86 => 230, 0xF87 => 230, 0x170D => 230,
1295 0x193A => 230, 0x20D0 => 230, 0x20D1 => 230, 0x20D4 => 230, 0x20D5 => 230,
1296 0x20D6 => 230, 0x20D7 => 230, 0x20DB => 230, 0x20DC => 230, 0x20E1 => 230,
1297 0x20E7 => 230, 0x20E9 => 230, 0xFE20 => 230, 0xFE21 => 230, 0xFE22 => 230,
1298 0xFE23 => 230, 0x1D185 => 230, 0x1D186 => 230, 0x1D187 => 230, 0x1D189 => 230,
1299 0x1D188 => 230, 0x1D1AA => 230, 0x1D1AB => 230, 0x1D1AC => 230, 0x1D1AD => 230,
1300 0x315 => 232, 0x31A => 232, 0x302C => 232, 0x35F => 233, 0x362 => 233, 0x35D => 234,
1301 0x35E => 234, 0x360 => 234, 0x361 => 234, 0x345 => 240