PluginProbe ʕ •ᴥ•ʔ
Broken Link Checker / 1.7.1
Broken Link Checker v1.7.1
1.5.4 1.5.5 1.6 1.6.1 1.6.2 1.7 1.7.1 1.8 1.8.1 1.8.2 1.8.3 1.9 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.4.2 1.9.5 2.0.0 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.3.1 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 0.9.4 0.9.4.1 0.9.4.2 0.9.4.3 0.9.4.4 0.9.4.4-last-non-modular 0.9.5 0.9.6 0.9.7 0.9.7.1 0.9.7.2 1.10 1.10.1 1.10.10 1.10.11 1.10.2 1.10.3 1.10.4 1.10.5 1.10.6 1.10.7 1.10.8 1.10.9 1.11.1 1.11.10 1.11.11 1.11.12 1.11.13 1.11.14 1.11.15 1.11.17 1.11.18 1.11.19 1.11.2 1.11.20 1.11.21 1.11.3 1.11.4 1.11.5 1.11.8 1.11.9 1.2.2 1.2.3 1.2.4 1.2.5 1.3 1.3.1 1.4 1.5 1.5.1 1.5.2 1.5.3 trunk 0.1 0.2 0.2.2 0.2.2.1 0.2.3 0.2.4 0.2.5 0.3 0.3.1 0.3.2 0.3.3 0.3.4 0.3.5 0.3.6 0.3.7 0.3.8 0.3.9 0.4 0.4-i8n 0.4.1 0.4.10 0.4.11 0.4.12 0.4.13 0.4.14 0.4.2 0.4.3 0.4.4 0.4.5 0.4.6 0.4.7 0.4.8 0.4.9 0.5 0.5.1 0.5.10 0.5.10.1 0.5.11 0.5.12 0.5.13 0.5.14 0.5.15 0.5.16 0.5.16.1 0.5.17 0.5.18 0.5.2 0.5.3 0.5.4 0.5.5 0.5.6 0.5.7 0.5.8 0.5.8.1 0.5.9 0.6 0.6.1 0.6.2 0.6.3 0.6.4 0.6.5 0.7 0.7.1 0.7.2 0.7.3 0.7.4 0.8 0.8.1 0.9 0.9.1 0.9.2 0.9.3
broken-link-checker / idn / idna_convert.class.php
broken-link-checker / idn Last commit date
LICENCE 15 years ago ReadMe.txt 15 years ago idna_convert.class.php 15 years ago transcode_wrapper.php 15 years ago uctc.php 15 years ago
idna_convert.class.php
2707 lines
1 <?php
2 // {{{ license
3
4 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
5 //
6 // +----------------------------------------------------------------------+
7 // | This library is free software; you can redistribute it and/or modify |
8 // | it under the terms of the GNU Lesser General Public License as |
9 // | published by the Free Software Foundation; either version 2.1 of the |
10 // | License, or (at your option) any later version. |
11 // | |
12 // | This library is distributed in the hope that it will be useful, but |
13 // | WITHOUT ANY WARRANTY; without even the implied warranty of |
14 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 // | Lesser General Public License for more details. |
16 // | |
17 // | You should have received a copy of the GNU Lesser General Public |
18 // | License along with this library; if not, write to the Free Software |
19 // | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
20 // | USA. |
21 // +----------------------------------------------------------------------+
22 //
23
24 // }}}
25
26 /**
27 * Encode/decode Internationalized Domain Names.
28 *
29 * The class allows to convert internationalized domain names
30 * (see RFC 3490 for details) as they can be used with various registries worldwide
31 * to be translated between their original (localized) form and their encoded form
32 * as it will be used in the DNS (Domain Name System).
33 *
34 * The class provides two public methods, encode() and decode(), which do exactly
35 * what you would expect them to do. You are allowed to use complete domain names,
36 * simple strings and complete email addresses as well. That means, that you might
37 * use any of the following notations:
38 *
39 * - www.nörgler.com
40 * - xn--nrgler-wxa
41 * - xn--brse-5qa.xn--knrz-1ra.info
42 *
43 * Unicode input might be given as either UTF-8 string, UCS-4 string or UCS-4
44 * array. Unicode output is available in the same formats.
45 * You can select your preferred format via {@link set_paramter()}.
46 *
47 * ACE input and output is always expected to be ASCII.
48 *
49 * @author Matthias Sommerfeld <mso@phlylabs.de>
50 * @author Leonid Kogan <lko@neuse.de>
51 * @copyright 2004-2009 phlyLabs Berlin, http://phlylabs.de
52 * @version 0.6.3
53 * @changelog since 0.5.1 class updated to PHP5/6 style should be compatible to PHP 4.3+
54 * - added a missing replace mapping for THAI CHARACTER SARA AM
55 */
56 class idna_convert
57 {
58 // NP See below
59
60 // Internal settings, do not mess with them
61 private $_punycode_prefix = 'xn--';
62 private $_invalid_ucs = 0x80000000;
63 private $_max_ucs = 0x10FFFF;
64 private $_base = 36;
65 private $_tmin = 1;
66 private $_tmax = 26;
67 private $_skew = 38;
68 private $_damp = 700;
69 private $_initial_bias = 72;
70 private $_initial_n = 0x80;
71 private $_sbase = 0xAC00;
72 private $_lbase = 0x1100;
73 private $_vbase = 0x1161;
74 private $_tbase = 0x11A7;
75 private $_lcount = 19;
76 private $_vcount = 21;
77 private $_tcount = 28;
78 private $_ncount = 588; // _vcount * _tcount
79 private $_scount = 11172; // _lcount * _tcount * _vcount
80 private $_error = false;
81
82 // See {@link set_paramter()} for details of how to change the following
83 // settings from within your script / application
84 private $_api_encoding = 'utf8'; // Default input charset is UTF-8
85 private $_allow_overlong = false; // Overlong UTF-8 encodings are forbidden
86 private $_strict_mode = false; // Behave strict or not
87
88
89 /**
90 * the constructor
91 *
92 * @param array $options
93 * @return boolean
94 * @since 0.5.2
95 */
96 public function __construct($options = false)
97 {
98 $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
99 // If parameters are given, pass these to the respective method
100 if (is_array($options)) return $this->set_parameter($options);
101 return true;
102 }
103
104 /**
105 * Sets a new option value. Available options and values:
106 * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
107 * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
108 * [overlong - Unicode does not allow unnecessarily long encodings of chars,
109 * to allow this, set this parameter to true, else to false;
110 * default is false.]
111 * [strict - true: strict mode, good for registration purposes - Causes errors
112 * on failures; false: loose mode, ideal for "wildlife" applications
113 * by silently ignoring errors and returning the original input instead
114 *
115 * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs)
116 * @param string Value to use (if parameter 1 is a string)
117 * @return boolean true on success, false otherwise
118 */
119 public function set_parameter($option, $value = false)
120 {
121 if (!is_array($option)) {
122 $option = array($option => $value);
123 }
124 foreach ($option as $k => $v) {
125 switch ($k) {
126 case 'encoding':
127 switch ($v) {
128 case 'utf8':
129 case 'ucs4_string':
130 case 'ucs4_array':
131 $this->_api_encoding = $v;
132 break;
133 default:
134 $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
135 return false;
136 }
137 break;
138 case 'overlong':
139 $this->_allow_overlong = ($v) ? true : false;
140 break;
141 case 'strict':
142 $this->_strict_mode = ($v) ? true : false;
143 break;
144 default:
145 $this->_error('Set Parameter: Unknown option '.$k);
146 return false;
147 }
148 }
149 return true;
150 }
151
152 /**
153 * Decode a given ACE domain name
154 * @param string Domain name (ACE string)
155 * [@param string Desired output encoding, see {@link set_parameter}]
156 * @return string Decoded Domain name (UTF-8 or UCS-4)
157 */
158 public function decode($input, $one_time_encoding = false)
159 {
160 // Optionally set
161 if ($one_time_encoding) {
162 switch ($one_time_encoding) {
163 case 'utf8':
164 case 'ucs4_string':
165 case 'ucs4_array':
166 break;
167 default:
168 $this->_error('Unknown encoding '.$one_time_encoding);
169 return false;
170 }
171 }
172 // Make sure to drop any newline characters around
173 $input = trim($input);
174
175 // Negotiate input and try to determine, whether it is a plain string,
176 // an email address or something like a complete URL
177 if (strpos($input, '@')) { // Maybe it is an email address
178 // No no in strict mode
179 if ($this->_strict_mode) {
180 $this->_error('Only simple domain name parts can be handled in strict mode');
181 return false;
182 }
183 list ($email_pref, $input) = explode('@', $input, 2);
184 $arr = explode('.', $input);
185 foreach ($arr as $k => $v) {
186 if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
187 $conv = $this->_decode($v);
188 if ($conv) $arr[$k] = $conv;
189 }
190 }
191 $input = join('.', $arr);
192 $arr = explode('.', $email_pref);
193 foreach ($arr as $k => $v) {
194 if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
195 $conv = $this->_decode($v);
196 if ($conv) $arr[$k] = $conv;
197 }
198 }
199 $email_pref = join('.', $arr);
200 $return = $email_pref . '@' . $input;
201 } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
202 // No no in strict mode
203 if ($this->_strict_mode) {
204 $this->_error('Only simple domain name parts can be handled in strict mode');
205 return false;
206 }
207 $parsed = parse_url($input);
208 if (isset($parsed['host'])) {
209 $arr = explode('.', $parsed['host']);
210 foreach ($arr as $k => $v) {
211 $conv = $this->_decode($v);
212 if ($conv) $arr[$k] = $conv;
213 }
214 $parsed['host'] = join('.', $arr);
215 $return =
216 (empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
217 .(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
218 .$parsed['host']
219 .(empty($parsed['port']) ? '' : ':'.$parsed['port'])
220 .(empty($parsed['path']) ? '' : $parsed['path'])
221 .(empty($parsed['query']) ? '' : '?'.$parsed['query'])
222 .(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
223 } else { // parse_url seems to have failed, try without it
224 $arr = explode('.', $input);
225 foreach ($arr as $k => $v) {
226 $conv = $this->_decode($v);
227 $arr[$k] = ($conv) ? $conv : $v;
228 }
229 $return = join('.', $arr);
230 }
231 } else { // Otherwise we consider it being a pure domain name string
232 $return = $this->_decode($input);
233 if (!$return) $return = $input;
234 }
235 // The output is UTF-8 by default, other output formats need conversion here
236 // If one time encoding is given, use this, else the objects property
237 switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
238 case 'utf8':
239 return $return;
240 break;
241 case 'ucs4_string':
242 return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
243 break;
244 case 'ucs4_array':
245 return $this->_utf8_to_ucs4($return);
246 break;
247 default:
248 $this->_error('Unsupported output format');
249 return false;
250 }
251 }
252
253 /**
254 * Encode a given UTF-8 domain name
255 * @param string Domain name (UTF-8 or UCS-4)
256 * [@param string Desired input encoding, see {@link set_parameter}]
257 * @return string Encoded Domain name (ACE string)
258 */
259 public function encode($decoded, $one_time_encoding = false)
260 {
261 // Forcing conversion of input to UCS4 array
262 // If one time encoding is given, use this, else the objects property
263 switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
264 case 'utf8':
265 $decoded = $this->_utf8_to_ucs4($decoded);
266 break;
267 case 'ucs4_string':
268 $decoded = $this->_ucs4_string_to_ucs4($decoded);
269 case 'ucs4_array':
270 break;
271 default:
272 $this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
273 return false;
274 }
275
276 // No input, no output, what else did you expect?
277 if (empty($decoded)) return '';
278
279 // Anchors for iteration
280 $last_begin = 0;
281 // Output string
282 $output = '';
283 foreach ($decoded as $k => $v) {
284 // Make sure to use just the plain dot
285 switch($v) {
286 case 0x3002:
287 case 0xFF0E:
288 case 0xFF61:
289 $decoded[$k] = 0x2E;
290 // Right, no break here, the above are converted to dots anyway
291 // Stumbling across an anchoring character
292 case 0x2E:
293 case 0x2F:
294 case 0x3A:
295 case 0x3F:
296 case 0x40:
297 // Neither email addresses nor URLs allowed in strict mode
298 if ($this->_strict_mode) {
299 $this->_error('Neither email addresses nor URLs are allowed in strict mode.');
300 return false;
301 } else {
302 // Skip first char
303 if ($k) {
304 $encoded = '';
305 $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
306 if ($encoded) {
307 $output .= $encoded;
308 } else {
309 $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
310 }
311 $output .= chr($decoded[$k]);
312 }
313 $last_begin = $k + 1;
314 }
315 }
316 }
317 // Catch the rest of the string
318 if ($last_begin) {
319 $inp_len = sizeof($decoded);
320 $encoded = '';
321 $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
322 if ($encoded) {
323 $output .= $encoded;
324 } else {
325 $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
326 }
327 return $output;
328 } else {
329 if ($output = $this->_encode($decoded)) {
330 return $output;
331 } else {
332 return $this->_ucs4_to_utf8($decoded);
333 }
334 }
335 }
336
337 /**
338 * Use this method to get the last error ocurred
339 * @param void
340 * @return string The last error, that occured
341 */
342 public function get_last_error()
343 {
344 return $this->_error;
345 }
346
347 /**
348 * The actual decoding algorithm
349 * @param string
350 * @return mixed
351 */
352 private function _decode($encoded)
353 {
354 $decoded = array();
355 // find the Punycode prefix
356 if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) {
357 $this->_error('This is not a punycode string');
358 return false;
359 }
360 $encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded);
361 // If nothing left after removing the prefix, it is hopeless
362 if (!$encode_test) {
363 $this->_error('The given encoded string was empty');
364 return false;
365 }
366 // Find last occurence of the delimiter
367 $delim_pos = strrpos($encoded, '-');
368 if ($delim_pos > strlen($this->_punycode_prefix)) {
369 for ($k = strlen($this->_punycode_prefix); $k < $delim_pos; ++$k) {
370 $decoded[] = ord($encoded{$k});
371 }
372 }
373 $deco_len = count($decoded);
374 $enco_len = strlen($encoded);
375
376 // Wandering through the strings; init
377 $is_first = true;
378 $bias = $this->_initial_bias;
379 $idx = 0;
380 $char = $this->_initial_n;
381
382 for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
383 for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
384 $digit = $this->_decode_digit($encoded{$enco_idx++});
385 $idx += $digit * $w;
386 $t = ($k <= $bias) ? $this->_tmin :
387 (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
388 if ($digit < $t) break;
389 $w = (int) ($w * ($this->_base - $t));
390 }
391 $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
392 $is_first = false;
393 $char += (int) ($idx / ($deco_len + 1));
394 $idx %= ($deco_len + 1);
395 if ($deco_len > 0) {
396 // Make room for the decoded char
397 for ($i = $deco_len; $i > $idx; $i--) $decoded[$i] = $decoded[($i - 1)];
398 }
399 $decoded[$idx++] = $char;
400 }
401 return $this->_ucs4_to_utf8($decoded);
402 }
403
404 /**
405 * The actual encoding algorithm
406 * @param string
407 * @return mixed
408 */
409 private function _encode($decoded)
410 {
411 // We cannot encode a domain name containing the Punycode prefix
412 $extract = strlen($this->_punycode_prefix);
413 $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
414 $check_deco = array_slice($decoded, 0, $extract);
415
416 if ($check_pref == $check_deco) {
417 $this->_error('This is already a punycode string');
418 return false;
419 }
420 // We will not try to encode strings consisting of basic code points only
421 $encodable = false;
422 foreach ($decoded as $k => $v) {
423 if ($v > 0x7a) {
424 $encodable = true;
425 break;
426 }
427 }
428 if (!$encodable) {
429 $this->_error('The given string does not contain encodable chars');
430 return false;
431 }
432 // Do NAMEPREP
433 $decoded = $this->_nameprep($decoded);
434 if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed
435 $deco_len = count($decoded);
436 if (!$deco_len) return false; // Empty array
437 $codecount = 0; // How many chars have been consumed
438 $encoded = '';
439 // Copy all basic code points to output
440 for ($i = 0; $i < $deco_len; ++$i) {
441 $test = $decoded[$i];
442 // Will match [-0-9a-zA-Z]
443 if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B)
444 || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
445 $encoded .= chr($decoded[$i]);
446 $codecount++;
447 }
448 }
449 if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones
450
451 // Start with the prefix; copy it to output
452 $encoded = $this->_punycode_prefix.$encoded;
453 // If we have basic code points in output, add an hyphen to the end
454 if ($codecount) $encoded .= '-';
455 // Now find and encode all non-basic code points
456 $is_first = true;
457 $cur_code = $this->_initial_n;
458 $bias = $this->_initial_bias;
459 $delta = 0;
460 while ($codecount < $deco_len) {
461 // Find the smallest code point >= the current code point and
462 // remember the last ouccrence of it in the input
463 for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
464 if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
465 $next_code = $decoded[$i];
466 }
467 }
468 $delta += ($next_code - $cur_code) * ($codecount + 1);
469 $cur_code = $next_code;
470
471 // Scan input again and encode all characters whose code point is $cur_code
472 for ($i = 0; $i < $deco_len; $i++) {
473 if ($decoded[$i] < $cur_code) {
474 $delta++;
475 } elseif ($decoded[$i] == $cur_code) {
476 for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
477 $t = ($k <= $bias) ? $this->_tmin :
478 (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
479 if ($q < $t) break;
480 $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
481 $q = (int) (($q - $t) / ($this->_base - $t));
482 }
483 $encoded .= $this->_encode_digit($q);
484 $bias = $this->_adapt($delta, $codecount+1, $is_first);
485 $codecount++;
486 $delta = 0;
487 $is_first = false;
488 }
489 }
490 $delta++;
491 $cur_code++;
492 }
493 return $encoded;
494 }
495
496 /**
497 * Adapt the bias according to the current code point and position
498 * @param int $delta
499 * @param int $npoints
500 * @param int $is_first
501 * @return int
502 */
503 private function _adapt($delta, $npoints, $is_first)
504 {
505 $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
506 $delta += intval($delta / $npoints);
507 for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
508 $delta = intval($delta / ($this->_base - $this->_tmin));
509 }
510 return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
511 }
512
513 /**
514 * Encoding a certain digit
515 * @param int $d
516 * @return string
517 */
518 private function _encode_digit($d)
519 {
520 return chr($d + 22 + 75 * ($d < 26));
521 }
522
523 /**
524 * Decode a certain digit
525 * @param int $cp
526 * @return int
527 */
528 private function _decode_digit($cp)
529 {
530 $cp = ord($cp);
531 return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
532 }
533
534 /**
535 * Internal error handling method
536 * @param string $error
537 */
538 private function _error($error = '')
539 {
540 $this->_error = $error;
541 }
542
543 /**
544 * Do Nameprep according to RFC3491 and RFC3454
545 * @param array Unicode Characters
546 * @return string Unicode Characters, Nameprep'd
547 */
548 private function _nameprep($input)
549 {
550 $output = array();
551 $error = false;
552 //
553 // Mapping
554 // Walking through the input array, performing the required steps on each of
555 // the input chars and putting the result into the output array
556 // While mapping required chars we apply the cannonical ordering
557 foreach ($input as $v) {
558 // Map to nothing == skip that code point
559 if (in_array($v, $this->NP['map_nothing'])) continue;
560 // Try to find prohibited input
561 if (in_array($v, $this->NP['prohibit']) || in_array($v, $this->NP['general_prohibited'])) {
562 $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
563 return false;
564 }
565 foreach ($this->NP['prohibit_ranges'] as $range) {
566 if ($range[0] <= $v && $v <= $range[1]) {
567 $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
568 return false;
569 }
570 }
571 // Hangul syllable decomposition
572 if (0xAC00 <= $v && $v <= 0xD7AF) {
573 foreach ($this->_hangul_decompose($v) as $out) $output[] = (int) $out;
574 // There's a decomposition mapping for that code point
575 } elseif (isset($this->NP['replacemaps'][$v])) {
576 foreach ($this->_apply_cannonical_ordering($this->NP['replacemaps'][$v]) as $out) {
577 $output[] = (int) $out;
578 }
579 } else {
580 $output[] = (int) $v;
581 }
582 }
583 // Before applying any Combining, try to rearrange any Hangul syllables
584 $output = $this->_hangul_compose($output);
585 //
586 // Combine code points
587 //
588 $last_class = 0;
589 $last_starter = 0;
590 $out_len = count($output);
591 for ($i = 0; $i < $out_len; ++$i) {
592 $class = $this->_get_combining_class($output[$i]);
593 if ((!$last_class || $last_class > $class) && $class) {
594 // Try to match
595 $seq_len = $i - $last_starter;
596 $out = $this->_combine(array_slice($output, $last_starter, $seq_len));
597 // On match: Replace the last starter with the composed character and remove
598 // the now redundant non-starter(s)
599 if ($out) {
600 $output[$last_starter] = $out;
601 if (count($out) != $seq_len) {
602 for ($j = $i+1; $j < $out_len; ++$j) $output[$j-1] = $output[$j];
603 unset($output[$out_len]);
604 }
605 // Rewind the for loop by one, since there can be more possible compositions
606 $i--;
607 $out_len--;
608 $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i-1]);
609 continue;
610 }
611 }
612 // The current class is 0
613 if (!$class) $last_starter = $i;
614 $last_class = $class;
615 }
616 return $output;
617 }
618
619 /**
620 * Decomposes a Hangul syllable
621 * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
622 * @param integer 32bit UCS4 code point
623 * @return array Either Hangul Syllable decomposed or original 32bit value as one value array
624 */
625 private function _hangul_decompose($char)
626 {
627 $sindex = (int) $char - $this->_sbase;
628 if ($sindex < 0 || $sindex >= $this->_scount) return array($char);
629 $result = array();
630 $result[] = (int) $this->_lbase + $sindex / $this->_ncount;
631 $result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
632 $T = intval($this->_tbase + $sindex % $this->_tcount);
633 if ($T != $this->_tbase) $result[] = $T;
634 return $result;
635 }
636 /**
637 * Ccomposes a Hangul syllable
638 * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
639 * @param array Decomposed UCS4 sequence
640 * @return array UCS4 sequence with syllables composed
641 */
642 private function _hangul_compose($input)
643 {
644 $inp_len = count($input);
645 if (!$inp_len) return array();
646 $result = array();
647 $last = (int) $input[0];
648 $result[] = $last; // copy first char from input to output
649
650 for ($i = 1; $i < $inp_len; ++$i) {
651 $char = (int) $input[$i];
652 $sindex = $last - $this->_sbase;
653 $lindex = $last - $this->_lbase;
654 $vindex = $char - $this->_vbase;
655 $tindex = $char - $this->_tbase;
656 // Find out, whether two current characters are LV and T
657 if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0)
658 && 0 <= $tindex && $tindex <= $this->_tcount) {
659 // create syllable of form LVT
660 $last += $tindex;
661 $result[(count($result) - 1)] = $last; // reset last
662 continue; // discard char
663 }
664 // Find out, whether two current characters form L and V
665 if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
666 // create syllable of form LV
667 $last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
668 $result[(count($result) - 1)] = $last; // reset last
669 continue; // discard char
670 }
671 // if neither case was true, just add the character
672 $last = $char;
673 $result[] = $char;
674 }
675 return $result;
676 }
677
678 /**
679 * Returns the combining class of a certain wide char
680 * @param integer Wide char to check (32bit integer)
681 * @return integer Combining class if found, else 0
682 */
683 private function _get_combining_class($char)
684 {
685 return isset($this->NP['norm_combcls'][$char]) ? $this->NP['norm_combcls'][$char] : 0;
686 }
687
688 /**
689 * Apllies the cannonical ordering of a decomposed UCS4 sequence
690 * @param array Decomposed UCS4 sequence
691 * @return array Ordered USC4 sequence
692 */
693 private function _apply_cannonical_ordering($input)
694 {
695 $swap = true;
696 $size = count($input);
697 while ($swap) {
698 $swap = false;
699 $last = $this->_get_combining_class(intval($input[0]));
700 for ($i = 0; $i < $size-1; ++$i) {
701 $next = $this->_get_combining_class(intval($input[$i+1]));
702 if ($next != 0 && $last > $next) {
703 // Move item leftward until it fits
704 for ($j = $i + 1; $j > 0; --$j) {
705 if ($this->_get_combining_class(intval($input[$j-1])) <= $next) break;
706 $t = intval($input[$j]);
707 $input[$j] = intval($input[$j-1]);
708 $input[$j-1] = $t;
709 $swap = true;
710 }
711 // Reentering the loop looking at the old character again
712 $next = $last;
713 }
714 $last = $next;
715 }
716 }
717 return $input;
718 }
719
720 /**
721 * Do composition of a sequence of starter and non-starter
722 * @param array UCS4 Decomposed sequence
723 * @return array Ordered USC4 sequence
724 */
725 private function _combine($input)
726 {
727 $inp_len = count($input);
728 foreach ($this->NP['replacemaps'] as $np_src => $np_target) {
729 if ($np_target[0] != $input[0]) continue;
730 if (count($np_target) != $inp_len) continue;
731 $hit = false;
732 foreach ($input as $k2 => $v2) {
733 if ($v2 == $np_target[$k2]) {
734 $hit = true;
735 } else {
736 $hit = false;
737 break;
738 }
739 }
740 if ($hit) return $np_src;
741 }
742 return false;
743 }
744
745 /**
746 * This converts an UTF-8 encoded string to its UCS-4 representation
747 * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
748 * each of the "chars". This is due to PHP not being able to handle strings with
749 * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
750 * The following UTF-8 encodings are supported:
751 * bytes bits representation
752 * 1 7 0xxxxxxx
753 * 2 11 110xxxxx 10xxxxxx
754 * 3 16 1110xxxx 10xxxxxx 10xxxxxx
755 * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
756 * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
757 * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
758 * Each x represents a bit that can be used to store character data.
759 * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
760 * @param string $input
761 * @return string
762 */
763 private function _utf8_to_ucs4($input)
764 {
765 $output = array();
766 $out_len = 0;
767 // Patch by Daniel Hahler; work around prolbem with mbstring.func_overload
768 if (function_exists('mb_strlen')) {
769 $inp_len = mb_strlen($input, '8bit');
770 } else {
771 $inp_len = strlen($input);
772 }
773 $mode = 'next';
774 $test = 'none';
775 for ($k = 0; $k < $inp_len; ++$k) {
776 $v = ord($input{$k}); // Extract byte from input string
777 if ($v < 128) { // We found an ASCII char - put into stirng as is
778 $output[$out_len] = $v;
779 ++$out_len;
780 if ('add' == $mode) {
781 $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
782 return false;
783 }
784 continue;
785 }
786 if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
787 $start_byte = $v;
788 $mode = 'add';
789 $test = 'range';
790 if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
791 $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
792 $v = ($v - 192) << 6;
793 } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
794 $next_byte = 1;
795 $v = ($v - 224) << 12;
796 } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
797 $next_byte = 2;
798 $v = ($v - 240) << 18;
799 } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
800 $next_byte = 3;
801 $v = ($v - 248) << 24;
802 } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
803 $next_byte = 4;
804 $v = ($v - 252) << 30;
805 } else {
806 $this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k);
807 return false;
808 }
809 if ('add' == $mode) {
810 $output[$out_len] = (int) $v;
811 ++$out_len;
812 continue;
813 }
814 }
815 if ('add' == $mode) {
816 if (!$this->_allow_overlong && $test == 'range') {
817 $test = 'none';
818 if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
819 $this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
820 return false;
821 }
822 }
823 if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
824 $v = ($v - 128) << ($next_byte * 6);
825 $output[($out_len - 1)] += $v;
826 --$next_byte;
827 } else {
828 $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
829 return false;
830 }
831 if ($next_byte < 0) {
832 $mode = 'next';
833 }
834 }
835 } // for
836 return $output;
837 }
838
839 /**
840 * Convert UCS-4 string into UTF-8 string
841 * See _utf8_to_ucs4() for details
842 * @param string $input
843 * @return string
844 */
845 private function _ucs4_to_utf8($input)
846 {
847 $output = '';
848 foreach ($input as $k => $v) {
849 if ($v < 128) { // 7bit are transferred literally
850 $output .= chr($v);
851 } elseif ($v < (1 << 11)) { // 2 bytes
852 $output .= chr(192+($v >> 6)).chr(128+($v & 63));
853 } elseif ($v < (1 << 16)) { // 3 bytes
854 $output .= chr(224+($v >> 12)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
855 } elseif ($v < (1 << 21)) { // 4 bytes
856 $output .= chr(240+($v >> 18)).chr(128+(($v >> 12) & 63)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
857 } elseif (self::$safe_mode) {
858 $output .= self::$safe_char;
859 } else {
860 $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
861 return false;
862 }
863 }
864 return $output;
865 }
866
867 /**
868 * Convert UCS-4 array into UCS-4 string
869 *
870 * @param array $input
871 * @return string
872 */
873 private function _ucs4_to_ucs4_string($input)
874 {
875 $output = '';
876 // Take array values and split output to 4 bytes per value
877 // The bit mask is 255, which reads &11111111
878 foreach ($input as $v) {
879 $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
880 }
881 return $output;
882 }
883
884 /**
885 * Convert UCS-4 strin into UCS-4 garray
886 *
887 * @param string $input
888 * @return array
889 */
890 private function _ucs4_string_to_ucs4($input)
891 {
892 $output = array();
893 $inp_len = strlen($input);
894 // Input length must be dividable by 4
895 if ($inp_len % 4) {
896 $this->_error('Input UCS4 string is broken');
897 return false;
898 }
899 // Empty input - return empty output
900 if (!$inp_len) return $output;
901 for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
902 // Increment output position every 4 input bytes
903 if (!($i % 4)) {
904 $out_len++;
905 $output[$out_len] = 0;
906 }
907 $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
908 }
909 return $output;
910 }
911
912 /**
913 * Holds all relevant mapping tables, loaded from a seperate file on construct
914 * See RFC3454 for details
915 *
916 * @private array
917 * @since 0.5.2
918 *
919 */
920 private $NP = array
921 ('map_nothing' => array
922 (0xAD, 0x34F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B
923 ,0x200C, 0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03
924 ,0xFE04, 0xFE05, 0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A
925 ,0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF
926 )
927 ,'general_prohibited' => array
928 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE
929 ,0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
930 ,0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20
931 ,0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29
932 ,0x2A, 0x2B, 0x2C, 0x2F, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F
933 ,0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x7B, 0x7C
934 ,0x7D, 0x7E, 0x7F, 0x3002
935 )
936 ,'prohibit' => array
937 (0xA0, 0x340, 0x341, 0x6DD, 0x70F, 0x1680, 0x180E, 0x2000
938 ,0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007
939 ,0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, 0x200E
940 ,0x200F, 0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D
941 ,0x202E, 0x202F, 0x205F, 0x206A, 0x206B, 0x206C, 0x206D
942 ,0x206E, 0x206F, 0x3000, 0xFEFF, 0xFFF9, 0xFFFA, 0xFFFB
943 ,0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF, 0x2FFFE
944 ,0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE
945 ,0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE
946 ,0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE
947 ,0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xE0001
948 ,0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF
949 )
950 ,'prohibit_ranges' => array
951 (array(0x80, 0x9F), array(0x2060, 0x206F)
952 ,array(0x1D173, 0x1D17A), array(0xE000, 0xF8FF)
953 ,array(0xF0000, 0xFFFFD), array(0x100000, 0x10FFFD)
954 ,array(0xFDD0, 0xFDEF), array(0xD800, 0xDFFF)
955 ,array(0x2FF0, 0x2FFB), array(0xE0020, 0xE007F)
956 )
957 ,'replacemaps' => array
958 (0x41 => array(0x61)
959 ,0x42 => array(0x62)
960 ,0x43 => array(0x63)
961 ,0x44 => array(0x64)
962 ,0x45 => array(0x65)
963 ,0x46 => array(0x66)
964 ,0x47 => array(0x67)
965 ,0x48 => array(0x68)
966 ,0x49 => array(0x69)
967 ,0x4A => array(0x6A)
968 ,0x4B => array(0x6B)
969 ,0x4C => array(0x6C)
970 ,0x4D => array(0x6D)
971 ,0x4E => array(0x6E)
972 ,0x4F => array(0x6F)
973 ,0x50 => array(0x70)
974 ,0x51 => array(0x71)
975 ,0x52 => array(0x72)
976 ,0x53 => array(0x73)
977 ,0x54 => array(0x74)
978 ,0x55 => array(0x75)
979 ,0x56 => array(0x76)
980 ,0x57 => array(0x77)
981 ,0x58 => array(0x78)
982 ,0x59 => array(0x79)
983 ,0x5A => array(0x7A)
984 ,0xB5 => array(0x3BC)
985 ,0xC0 => array(0xE0)
986 ,0xC1 => array(0xE1)
987 ,0xC2 => array(0xE2)
988 ,0xC3 => array(0xE3)
989 ,0xC4 => array(0xE4)
990 ,0xC5 => array(0xE5)
991 ,0xC6 => array(0xE6)
992 ,0xC7 => array(0xE7)
993 ,0xC8 => array(0xE8)
994 ,0xC9 => array(0xE9)
995 ,0xCA => array(0xEA)
996 ,0xCB => array(0xEB)
997 ,0xCC => array(0xEC)
998 ,0xCD => array(0xED)
999 ,0xCE => array(0xEE)
1000 ,0xCF => array(0xEF)
1001 ,0xD0 => array(0xF0)
1002 ,0xD1 => array(0xF1)
1003 ,0xD2 => array(0xF2)
1004 ,0xD3 => array(0xF3)
1005 ,0xD4 => array(0xF4)
1006 ,0xD5 => array(0xF5)
1007 ,0xD6 => array(0xF6)
1008 ,0xD8 => array(0xF8)
1009 ,0xD9 => array(0xF9)
1010 ,0xDA => array(0xFA)
1011 ,0xDB => array(0xFB)
1012 ,0xDC => array(0xFC)
1013 ,0xDD => array(0xFD)
1014 ,0xDE => array(0xFE)
1015 ,0xDF => array(0x73, 0x73)
1016 ,0x100 => array(0x101)
1017 ,0x102 => array(0x103)
1018 ,0x104 => array(0x105)
1019 ,0x106 => array(0x107)
1020 ,0x108 => array(0x109)
1021 ,0x10A => array(0x10B)
1022 ,0x10C => array(0x10D)
1023 ,0x10E => array(0x10F)
1024 ,0x110 => array(0x111)
1025 ,0x112 => array(0x113)
1026 ,0x114 => array(0x115)
1027 ,0x116 => array(0x117)
1028 ,0x118 => array(0x119)
1029 ,0x11A => array(0x11B)
1030 ,0x11C => array(0x11D)
1031 ,0x11E => array(0x11F)
1032 ,0x120 => array(0x121)
1033 ,0x122 => array(0x123)
1034 ,0x124 => array(0x125)
1035 ,0x126 => array(0x127)
1036 ,0x128 => array(0x129)
1037 ,0x12A => array(0x12B)
1038 ,0x12C => array(0x12D)
1039 ,0x12E => array(0x12F)
1040 ,0x130 => array(0x69, 0x307)
1041 ,0x132 => array(0x133)
1042 ,0x134 => array(0x135)
1043 ,0x136 => array(0x137)
1044 ,0x139 => array(0x13A)
1045 ,0x13B => array(0x13C)
1046 ,0x13D => array(0x13E)
1047 ,0x13F => array(0x140)
1048 ,0x141 => array(0x142)
1049 ,0x143 => array(0x144)
1050 ,0x145 => array(0x146)
1051 ,0x147 => array(0x148)
1052 ,0x149 => array(0x2BC, 0x6E)
1053 ,0x14A => array(0x14B)
1054 ,0x14C => array(0x14D)
1055 ,0x14E => array(0x14F)
1056 ,0x150 => array(0x151)
1057 ,0x152 => array(0x153)
1058 ,0x154 => array(0x155)
1059 ,0x156 => array(0x157)
1060 ,0x158 => array(0x159)
1061 ,0x15A => array(0x15B)
1062 ,0x15C => array(0x15D)
1063 ,0x15E => array(0x15F)
1064 ,0x160 => array(0x161)
1065 ,0x162 => array(0x163)
1066 ,0x164 => array(0x165)
1067 ,0x166 => array(0x167)
1068 ,0x168 => array(0x169)
1069 ,0x16A => array(0x16B)
1070 ,0x16C => array(0x16D)
1071 ,0x16E => array(0x16F)
1072 ,0x170 => array(0x171)
1073 ,0x172 => array(0x173)
1074 ,0x174 => array(0x175)
1075 ,0x176 => array(0x177)
1076 ,0x178 => array(0xFF)
1077 ,0x179 => array(0x17A)
1078 ,0x17B => array(0x17C)
1079 ,0x17D => array(0x17E)
1080 ,0x17F => array(0x73)
1081 ,0x181 => array(0x253)
1082 ,0x182 => array(0x183)
1083 ,0x184 => array(0x185)
1084 ,0x186 => array(0x254)
1085 ,0x187 => array(0x188)
1086 ,0x189 => array(0x256)
1087 ,0x18A => array(0x257)
1088 ,0x18B => array(0x18C)
1089 ,0x18E => array(0x1DD)
1090 ,0x18F => array(0x259)
1091 ,0x190 => array(0x25B)
1092 ,0x191 => array(0x192)
1093 ,0x193 => array(0x260)
1094 ,0x194 => array(0x263)
1095 ,0x196 => array(0x269)
1096 ,0x197 => array(0x268)
1097 ,0x198 => array(0x199)
1098 ,0x19C => array(0x26F)
1099 ,0x19D => array(0x272)
1100 ,0x19F => array(0x275)
1101 ,0x1A0 => array(0x1A1)
1102 ,0x1A2 => array(0x1A3)
1103 ,0x1A4 => array(0x1A5)
1104 ,0x1A6 => array(0x280)
1105 ,0x1A7 => array(0x1A8)
1106 ,0x1A9 => array(0x283)
1107 ,0x1AC => array(0x1AD)
1108 ,0x1AE => array(0x288)
1109 ,0x1AF => array(0x1B0)
1110 ,0x1B1 => array(0x28A)
1111 ,0x1B2 => array(0x28B)
1112 ,0x1B3 => array(0x1B4)
1113 ,0x1B5 => array(0x1B6)
1114 ,0x1B7 => array(0x292)
1115 ,0x1B8 => array(0x1B9)
1116 ,0x1BC => array(0x1BD)
1117 ,0x1C4 => array(0x1C6)
1118 ,0x1C5 => array(0x1C6)
1119 ,0x1C7 => array(0x1C9)
1120 ,0x1C8 => array(0x1C9)
1121 ,0x1CA => array(0x1CC)
1122 ,0x1CB => array(0x1CC)
1123 ,0x1CD => array(0x1CE)
1124 ,0x1CF => array(0x1D0)
1125 ,0x1D1 => array(0x1D2)
1126 ,0x1D3 => array(0x1D4)
1127 ,0x1D5 => array(0x1D6)
1128 ,0x1D7 => array(0x1D8)
1129 ,0x1D9 => array(0x1DA)
1130 ,0x1DB => array(0x1DC)
1131 ,0x1DE => array(0x1DF)
1132 ,0x1E0 => array(0x1E1)
1133 ,0x1E2 => array(0x1E3)
1134 ,0x1E4 => array(0x1E5)
1135 ,0x1E6 => array(0x1E7)
1136 ,0x1E8 => array(0x1E9)
1137 ,0x1EA => array(0x1EB)
1138 ,0x1EC => array(0x1ED)
1139 ,0x1EE => array(0x1EF)
1140 ,0x1F0 => array(0x6A, 0x30C)
1141 ,0x1F1 => array(0x1F3)
1142 ,0x1F2 => array(0x1F3)
1143 ,0x1F4 => array(0x1F5)
1144 ,0x1F6 => array(0x195)
1145 ,0x1F7 => array(0x1BF)
1146 ,0x1F8 => array(0x1F9)
1147 ,0x1FA => array(0x1FB)
1148 ,0x1FC => array(0x1FD)
1149 ,0x1FE => array(0x1FF)
1150 ,0x200 => array(0x201)
1151 ,0x202 => array(0x203)
1152 ,0x204 => array(0x205)
1153 ,0x206 => array(0x207)
1154 ,0x208 => array(0x209)
1155 ,0x20A => array(0x20B)
1156 ,0x20C => array(0x20D)
1157 ,0x20E => array(0x20F)
1158 ,0x210 => array(0x211)
1159 ,0x212 => array(0x213)
1160 ,0x214 => array(0x215)
1161 ,0x216 => array(0x217)
1162 ,0x218 => array(0x219)
1163 ,0x21A => array(0x21B)
1164 ,0x21C => array(0x21D)
1165 ,0x21E => array(0x21F)
1166 ,0x220 => array(0x19E)
1167 ,0x222 => array(0x223)
1168 ,0x224 => array(0x225)
1169 ,0x226 => array(0x227)
1170 ,0x228 => array(0x229)
1171 ,0x22A => array(0x22B)
1172 ,0x22C => array(0x22D)
1173 ,0x22E => array(0x22F)
1174 ,0x230 => array(0x231)
1175 ,0x232 => array(0x233)
1176 ,0x345 => array(0x3B9)
1177 ,0x37A => array(0x20, 0x3B9)
1178 ,0x386 => array(0x3AC)
1179 ,0x388 => array(0x3AD)
1180 ,0x389 => array(0x3AE)
1181 ,0x38A => array(0x3AF)
1182 ,0x38C => array(0x3CC)
1183 ,0x38E => array(0x3CD)
1184 ,0x38F => array(0x3CE)
1185 ,0x390 => array(0x3B9, 0x308, 0x301)
1186 ,0x391 => array(0x3B1)
1187 ,0x392 => array(0x3B2)
1188 ,0x393 => array(0x3B3)
1189 ,0x394 => array(0x3B4)
1190 ,0x395 => array(0x3B5)
1191 ,0x396 => array(0x3B6)
1192 ,0x397 => array(0x3B7)
1193 ,0x398 => array(0x3B8)
1194 ,0x399 => array(0x3B9)
1195 ,0x39A => array(0x3BA)
1196 ,0x39B => array(0x3BB)
1197 ,0x39C => array(0x3BC)
1198 ,0x39D => array(0x3BD)
1199 ,0x39E => array(0x3BE)
1200 ,0x39F => array(0x3BF)
1201 ,0x3A0 => array(0x3C0)
1202 ,0x3A1 => array(0x3C1)
1203 ,0x3A3 => array(0x3C3)
1204 ,0x3A4 => array(0x3C4)
1205 ,0x3A5 => array(0x3C5)
1206 ,0x3A6 => array(0x3C6)
1207 ,0x3A7 => array(0x3C7)
1208 ,0x3A8 => array(0x3C8)
1209 ,0x3A9 => array(0x3C9)
1210 ,0x3AA => array(0x3CA)
1211 ,0x3AB => array(0x3CB)
1212 ,0x3B0 => array(0x3C5, 0x308, 0x301)
1213 ,0x3C2 => array(0x3C3)
1214 ,0x3D0 => array(0x3B2)
1215 ,0x3D1 => array(0x3B8)
1216 ,0x3D2 => array(0x3C5)
1217 ,0x3D3 => array(0x3CD)
1218 ,0x3D4 => array(0x3CB)
1219 ,0x3D5 => array(0x3C6)
1220 ,0x3D6 => array(0x3C0)
1221 ,0x3D8 => array(0x3D9)
1222 ,0x3DA => array(0x3DB)
1223 ,0x3DC => array(0x3DD)
1224 ,0x3DE => array(0x3DF)
1225 ,0x3E0 => array(0x3E1)
1226 ,0x3E2 => array(0x3E3)
1227 ,0x3E4 => array(0x3E5)
1228 ,0x3E6 => array(0x3E7)
1229 ,0x3E8 => array(0x3E9)
1230 ,0x3EA => array(0x3EB)
1231 ,0x3EC => array(0x3ED)
1232 ,0x3EE => array(0x3EF)
1233 ,0x3F0 => array(0x3BA)
1234 ,0x3F1 => array(0x3C1)
1235 ,0x3F2 => array(0x3C3)
1236 ,0x3F4 => array(0x3B8)
1237 ,0x3F5 => array(0x3B5)
1238 ,0x400 => array(0x450)
1239 ,0x401 => array(0x451)
1240 ,0x402 => array(0x452)
1241 ,0x403 => array(0x453)
1242 ,0x404 => array(0x454)
1243 ,0x405 => array(0x455)
1244 ,0x406 => array(0x456)
1245 ,0x407 => array(0x457)
1246 ,0x408 => array(0x458)
1247 ,0x409 => array(0x459)
1248 ,0x40A => array(0x45A)
1249 ,0x40B => array(0x45B)
1250 ,0x40C => array(0x45C)
1251 ,0x40D => array(0x45D)
1252 ,0x40E => array(0x45E)
1253 ,0x40F => array(0x45F)
1254 ,0x410 => array(0x430)
1255 ,0x411 => array(0x431)
1256 ,0x412 => array(0x432)
1257 ,0x413 => array(0x433)
1258 ,0x414 => array(0x434)
1259 ,0x415 => array(0x435)
1260 ,0x416 => array(0x436)
1261 ,0x417 => array(0x437)
1262 ,0x418 => array(0x438)
1263 ,0x419 => array(0x439)
1264 ,0x41A => array(0x43A)
1265 ,0x41B => array(0x43B)
1266 ,0x41C => array(0x43C)
1267 ,0x41D => array(0x43D)
1268 ,0x41E => array(0x43E)
1269 ,0x41F => array(0x43F)
1270 ,0x420 => array(0x440)
1271 ,0x421 => array(0x441)
1272 ,0x422 => array(0x442)
1273 ,0x423 => array(0x443)
1274 ,0x424 => array(0x444)
1275 ,0x425 => array(0x445)
1276 ,0x426 => array(0x446)
1277 ,0x427 => array(0x447)
1278 ,0x428 => array(0x448)
1279 ,0x429 => array(0x449)
1280 ,0x42A => array(0x44A)
1281 ,0x42B => array(0x44B)
1282 ,0x42C => array(0x44C)
1283 ,0x42D => array(0x44D)
1284 ,0x42E => array(0x44E)
1285 ,0x42F => array(0x44F)
1286 ,0x460 => array(0x461)
1287 ,0x462 => array(0x463)
1288 ,0x464 => array(0x465)
1289 ,0x466 => array(0x467)
1290 ,0x468 => array(0x469)
1291 ,0x46A => array(0x46B)
1292 ,0x46C => array(0x46D)
1293 ,0x46E => array(0x46F)
1294 ,0x470 => array(0x471)
1295 ,0x472 => array(0x473)
1296 ,0x474 => array(0x475)
1297 ,0x476 => array(0x477)
1298 ,0x478 => array(0x479)
1299 ,0x47A => array(0x47B)
1300 ,0x47C => array(0x47D)
1301 ,0x47E => array(0x47F)
1302 ,0x480 => array(0x481)
1303 ,0x48A => array(0x48B)
1304 ,0x48C => array(0x48D)
1305 ,0x48E => array(0x48F)
1306 ,0x490 => array(0x491)
1307 ,0x492 => array(0x493)
1308 ,0x494 => array(0x495)
1309 ,0x496 => array(0x497)
1310 ,0x498 => array(0x499)
1311 ,0x49A => array(0x49B)
1312 ,0x49C => array(0x49D)
1313 ,0x49E => array(0x49F)
1314 ,0x4A0 => array(0x4A1)
1315 ,0x4A2 => array(0x4A3)
1316 ,0x4A4 => array(0x4A5)
1317 ,0x4A6 => array(0x4A7)
1318 ,0x4A8 => array(0x4A9)
1319 ,0x4AA => array(0x4AB)
1320 ,0x4AC => array(0x4AD)
1321 ,0x4AE => array(0x4AF)
1322 ,0x4B0 => array(0x4B1)
1323 ,0x4B2 => array(0x4B3)
1324 ,0x4B4 => array(0x4B5)
1325 ,0x4B6 => array(0x4B7)
1326 ,0x4B8 => array(0x4B9)
1327 ,0x4BA => array(0x4BB)
1328 ,0x4BC => array(0x4BD)
1329 ,0x4BE => array(0x4BF)
1330 ,0x4C1 => array(0x4C2)
1331 ,0x4C3 => array(0x4C4)
1332 ,0x4C5 => array(0x4C6)
1333 ,0x4C7 => array(0x4C8)
1334 ,0x4C9 => array(0x4CA)
1335 ,0x4CB => array(0x4CC)
1336 ,0x4CD => array(0x4CE)
1337 ,0x4D0 => array(0x4D1)
1338 ,0x4D2 => array(0x4D3)
1339 ,0x4D4 => array(0x4D5)
1340 ,0x4D6 => array(0x4D7)
1341 ,0x4D8 => array(0x4D9)
1342 ,0x4DA => array(0x4DB)
1343 ,0x4DC => array(0x4DD)
1344 ,0x4DE => array(0x4DF)
1345 ,0x4E0 => array(0x4E1)
1346 ,0x4E2 => array(0x4E3)
1347 ,0x4E4 => array(0x4E5)
1348 ,0x4E6 => array(0x4E7)
1349 ,0x4E8 => array(0x4E9)
1350 ,0x4EA => array(0x4EB)
1351 ,0x4EC => array(0x4ED)
1352 ,0x4EE => array(0x4EF)
1353 ,0x4F0 => array(0x4F1)
1354 ,0x4F2 => array(0x4F3)
1355 ,0x4F4 => array(0x4F5)
1356 ,0x4F8 => array(0x4F9)
1357 ,0x500 => array(0x501)
1358 ,0x502 => array(0x503)
1359 ,0x504 => array(0x505)
1360 ,0x506 => array(0x507)
1361 ,0x508 => array(0x509)
1362 ,0x50A => array(0x50B)
1363 ,0x50C => array(0x50D)
1364 ,0x50E => array(0x50F)
1365 ,0x531 => array(0x561)
1366 ,0x532 => array(0x562)
1367 ,0x533 => array(0x563)
1368 ,0x534 => array(0x564)
1369 ,0x535 => array(0x565)
1370 ,0x536 => array(0x566)
1371 ,0x537 => array(0x567)
1372 ,0x538 => array(0x568)
1373 ,0x539 => array(0x569)
1374 ,0x53A => array(0x56A)
1375 ,0x53B => array(0x56B)
1376 ,0x53C => array(0x56C)
1377 ,0x53D => array(0x56D)
1378 ,0x53E => array(0x56E)
1379 ,0x53F => array(0x56F)
1380 ,0x540 => array(0x570)
1381 ,0x541 => array(0x571)
1382 ,0x542 => array(0x572)
1383 ,0x543 => array(0x573)
1384 ,0x544 => array(0x574)
1385 ,0x545 => array(0x575)
1386 ,0x546 => array(0x576)
1387 ,0x547 => array(0x577)
1388 ,0x548 => array(0x578)
1389 ,0x549 => array(0x579)
1390 ,0x54A => array(0x57A)
1391 ,0x54B => array(0x57B)
1392 ,0x54C => array(0x57C)
1393 ,0x54D => array(0x57D)
1394 ,0x54E => array(0x57E)
1395 ,0x54F => array(0x57F)
1396 ,0x550 => array(0x580)
1397 ,0x551 => array(0x581)
1398 ,0x552 => array(0x582)
1399 ,0x553 => array(0x583)
1400 ,0x554 => array(0x584)
1401 ,0x555 => array(0x585)
1402 ,0x556 => array(0x586)
1403 ,0x587 => array(0x565, 0x582)
1404 ,0xE33 => array(0xE4D, 0xE32)
1405 ,0x1E00 => array(0x1E01)
1406 ,0x1E02 => array(0x1E03)
1407 ,0x1E04 => array(0x1E05)
1408 ,0x1E06 => array(0x1E07)
1409 ,0x1E08 => array(0x1E09)
1410 ,0x1E0A => array(0x1E0B)
1411 ,0x1E0C => array(0x1E0D)
1412 ,0x1E0E => array(0x1E0F)
1413 ,0x1E10 => array(0x1E11)
1414 ,0x1E12 => array(0x1E13)
1415 ,0x1E14 => array(0x1E15)
1416 ,0x1E16 => array(0x1E17)
1417 ,0x1E18 => array(0x1E19)
1418 ,0x1E1A => array(0x1E1B)
1419 ,0x1E1C => array(0x1E1D)
1420 ,0x1E1E => array(0x1E1F)
1421 ,0x1E20 => array(0x1E21)
1422 ,0x1E22 => array(0x1E23)
1423 ,0x1E24 => array(0x1E25)
1424 ,0x1E26 => array(0x1E27)
1425 ,0x1E28 => array(0x1E29)
1426 ,0x1E2A => array(0x1E2B)
1427 ,0x1E2C => array(0x1E2D)
1428 ,0x1E2E => array(0x1E2F)
1429 ,0x1E30 => array(0x1E31)
1430 ,0x1E32 => array(0x1E33)
1431 ,0x1E34 => array(0x1E35)
1432 ,0x1E36 => array(0x1E37)
1433 ,0x1E38 => array(0x1E39)
1434 ,0x1E3A => array(0x1E3B)
1435 ,0x1E3C => array(0x1E3D)
1436 ,0x1E3E => array(0x1E3F)
1437 ,0x1E40 => array(0x1E41)
1438 ,0x1E42 => array(0x1E43)
1439 ,0x1E44 => array(0x1E45)
1440 ,0x1E46 => array(0x1E47)
1441 ,0x1E48 => array(0x1E49)
1442 ,0x1E4A => array(0x1E4B)
1443 ,0x1E4C => array(0x1E4D)
1444 ,0x1E4E => array(0x1E4F)
1445 ,0x1E50 => array(0x1E51)
1446 ,0x1E52 => array(0x1E53)
1447 ,0x1E54 => array(0x1E55)
1448 ,0x1E56 => array(0x1E57)
1449 ,0x1E58 => array(0x1E59)
1450 ,0x1E5A => array(0x1E5B)
1451 ,0x1E5C => array(0x1E5D)
1452 ,0x1E5E => array(0x1E5F)
1453 ,0x1E60 => array(0x1E61)
1454 ,0x1E62 => array(0x1E63)
1455 ,0x1E64 => array(0x1E65)
1456 ,0x1E66 => array(0x1E67)
1457 ,0x1E68 => array(0x1E69)
1458 ,0x1E6A => array(0x1E6B)
1459 ,0x1E6C => array(0x1E6D)
1460 ,0x1E6E => array(0x1E6F)
1461 ,0x1E70 => array(0x1E71)
1462 ,0x1E72 => array(0x1E73)
1463 ,0x1E74 => array(0x1E75)
1464 ,0x1E76 => array(0x1E77)
1465 ,0x1E78 => array(0x1E79)
1466 ,0x1E7A => array(0x1E7B)
1467 ,0x1E7C => array(0x1E7D)
1468 ,0x1E7E => array(0x1E7F)
1469 ,0x1E80 => array(0x1E81)
1470 ,0x1E82 => array(0x1E83)
1471 ,0x1E84 => array(0x1E85)
1472 ,0x1E86 => array(0x1E87)
1473 ,0x1E88 => array(0x1E89)
1474 ,0x1E8A => array(0x1E8B)
1475 ,0x1E8C => array(0x1E8D)
1476 ,0x1E8E => array(0x1E8F)
1477 ,0x1E90 => array(0x1E91)
1478 ,0x1E92 => array(0x1E93)
1479 ,0x1E94 => array(0x1E95)
1480 ,0x1E96 => array(0x68, 0x331)
1481 ,0x1E97 => array(0x74, 0x308)
1482 ,0x1E98 => array(0x77, 0x30A)
1483 ,0x1E99 => array(0x79, 0x30A)
1484 ,0x1E9A => array(0x61, 0x2BE)
1485 ,0x1E9B => array(0x1E61)
1486 ,0x1EA0 => array(0x1EA1)
1487 ,0x1EA2 => array(0x1EA3)
1488 ,0x1EA4 => array(0x1EA5)
1489 ,0x1EA6 => array(0x1EA7)
1490 ,0x1EA8 => array(0x1EA9)
1491 ,0x1EAA => array(0x1EAB)
1492 ,0x1EAC => array(0x1EAD)
1493 ,0x1EAE => array(0x1EAF)
1494 ,0x1EB0 => array(0x1EB1)
1495 ,0x1EB2 => array(0x1EB3)
1496 ,0x1EB4 => array(0x1EB5)
1497 ,0x1EB6 => array(0x1EB7)
1498 ,0x1EB8 => array(0x1EB9)
1499 ,0x1EBA => array(0x1EBB)
1500 ,0x1EBC => array(0x1EBD)
1501 ,0x1EBE => array(0x1EBF)
1502 ,0x1EC0 => array(0x1EC1)
1503 ,0x1EC2 => array(0x1EC3)
1504 ,0x1EC4 => array(0x1EC5)
1505 ,0x1EC6 => array(0x1EC7)
1506 ,0x1EC8 => array(0x1EC9)
1507 ,0x1ECA => array(0x1ECB)
1508 ,0x1ECC => array(0x1ECD)
1509 ,0x1ECE => array(0x1ECF)
1510 ,0x1ED0 => array(0x1ED1)
1511 ,0x1ED2 => array(0x1ED3)
1512 ,0x1ED4 => array(0x1ED5)
1513 ,0x1ED6 => array(0x1ED7)
1514 ,0x1ED8 => array(0x1ED9)
1515 ,0x1EDA => array(0x1EDB)
1516 ,0x1EDC => array(0x1EDD)
1517 ,0x1EDE => array(0x1EDF)
1518 ,0x1EE0 => array(0x1EE1)
1519 ,0x1EE2 => array(0x1EE3)
1520 ,0x1EE4 => array(0x1EE5)
1521 ,0x1EE6 => array(0x1EE7)
1522 ,0x1EE8 => array(0x1EE9)
1523 ,0x1EEA => array(0x1EEB)
1524 ,0x1EEC => array(0x1EED)
1525 ,0x1EEE => array(0x1EEF)
1526 ,0x1EF0 => array(0x1EF1)
1527 ,0x1EF2 => array(0x1EF3)
1528 ,0x1EF4 => array(0x1EF5)
1529 ,0x1EF6 => array(0x1EF7)
1530 ,0x1EF8 => array(0x1EF9)
1531 ,0x1F08 => array(0x1F00)
1532 ,0x1F09 => array(0x1F01)
1533 ,0x1F0A => array(0x1F02)
1534 ,0x1F0B => array(0x1F03)
1535 ,0x1F0C => array(0x1F04)
1536 ,0x1F0D => array(0x1F05)
1537 ,0x1F0E => array(0x1F06)
1538 ,0x1F0F => array(0x1F07)
1539 ,0x1F18 => array(0x1F10)
1540 ,0x1F19 => array(0x1F11)
1541 ,0x1F1A => array(0x1F12)
1542 ,0x1F1B => array(0x1F13)
1543 ,0x1F1C => array(0x1F14)
1544 ,0x1F1D => array(0x1F15)
1545 ,0x1F28 => array(0x1F20)
1546 ,0x1F29 => array(0x1F21)
1547 ,0x1F2A => array(0x1F22)
1548 ,0x1F2B => array(0x1F23)
1549 ,0x1F2C => array(0x1F24)
1550 ,0x1F2D => array(0x1F25)
1551 ,0x1F2E => array(0x1F26)
1552 ,0x1F2F => array(0x1F27)
1553 ,0x1F38 => array(0x1F30)
1554 ,0x1F39 => array(0x1F31)
1555 ,0x1F3A => array(0x1F32)
1556 ,0x1F3B => array(0x1F33)
1557 ,0x1F3C => array(0x1F34)
1558 ,0x1F3D => array(0x1F35)
1559 ,0x1F3E => array(0x1F36)
1560 ,0x1F3F => array(0x1F37)
1561 ,0x1F48 => array(0x1F40)
1562 ,0x1F49 => array(0x1F41)
1563 ,0x1F4A => array(0x1F42)
1564 ,0x1F4B => array(0x1F43)
1565 ,0x1F4C => array(0x1F44)
1566 ,0x1F4D => array(0x1F45)
1567 ,0x1F50 => array(0x3C5, 0x313)
1568 ,0x1F52 => array(0x3C5, 0x313, 0x300)
1569 ,0x1F54 => array(0x3C5, 0x313, 0x301)
1570 ,0x1F56 => array(0x3C5, 0x313, 0x342)
1571 ,0x1F59 => array(0x1F51)
1572 ,0x1F5B => array(0x1F53)
1573 ,0x1F5D => array(0x1F55)
1574 ,0x1F5F => array(0x1F57)
1575 ,0x1F68 => array(0x1F60)
1576 ,0x1F69 => array(0x1F61)
1577 ,0x1F6A => array(0x1F62)
1578 ,0x1F6B => array(0x1F63)
1579 ,0x1F6C => array(0x1F64)
1580 ,0x1F6D => array(0x1F65)
1581 ,0x1F6E => array(0x1F66)
1582 ,0x1F6F => array(0x1F67)
1583 ,0x1F80 => array(0x1F00, 0x3B9)
1584 ,0x1F81 => array(0x1F01, 0x3B9)
1585 ,0x1F82 => array(0x1F02, 0x3B9)
1586 ,0x1F83 => array(0x1F03, 0x3B9)
1587 ,0x1F84 => array(0x1F04, 0x3B9)
1588 ,0x1F85 => array(0x1F05, 0x3B9)
1589 ,0x1F86 => array(0x1F06, 0x3B9)
1590 ,0x1F87 => array(0x1F07, 0x3B9)
1591 ,0x1F88 => array(0x1F00, 0x3B9)
1592 ,0x1F89 => array(0x1F01, 0x3B9)
1593 ,0x1F8A => array(0x1F02, 0x3B9)
1594 ,0x1F8B => array(0x1F03, 0x3B9)
1595 ,0x1F8C => array(0x1F04, 0x3B9)
1596 ,0x1F8D => array(0x1F05, 0x3B9)
1597 ,0x1F8E => array(0x1F06, 0x3B9)
1598 ,0x1F8F => array(0x1F07, 0x3B9)
1599 ,0x1F90 => array(0x1F20, 0x3B9)
1600 ,0x1F91 => array(0x1F21, 0x3B9)
1601 ,0x1F92 => array(0x1F22, 0x3B9)
1602 ,0x1F93 => array(0x1F23, 0x3B9)
1603 ,0x1F94 => array(0x1F24, 0x3B9)
1604 ,0x1F95 => array(0x1F25, 0x3B9)
1605 ,0x1F96 => array(0x1F26, 0x3B9)
1606 ,0x1F97 => array(0x1F27, 0x3B9)
1607 ,0x1F98 => array(0x1F20, 0x3B9)
1608 ,0x1F99 => array(0x1F21, 0x3B9)
1609 ,0x1F9A => array(0x1F22, 0x3B9)
1610 ,0x1F9B => array(0x1F23, 0x3B9)
1611 ,0x1F9C => array(0x1F24, 0x3B9)
1612 ,0x1F9D => array(0x1F25, 0x3B9)
1613 ,0x1F9E => array(0x1F26, 0x3B9)
1614 ,0x1F9F => array(0x1F27, 0x3B9)
1615 ,0x1FA0 => array(0x1F60, 0x3B9)
1616 ,0x1FA1 => array(0x1F61, 0x3B9)
1617 ,0x1FA2 => array(0x1F62, 0x3B9)
1618 ,0x1FA3 => array(0x1F63, 0x3B9)
1619 ,0x1FA4 => array(0x1F64, 0x3B9)
1620 ,0x1FA5 => array(0x1F65, 0x3B9)
1621 ,0x1FA6 => array(0x1F66, 0x3B9)
1622 ,0x1FA7 => array(0x1F67, 0x3B9)
1623 ,0x1FA8 => array(0x1F60, 0x3B9)
1624 ,0x1FA9 => array(0x1F61, 0x3B9)
1625 ,0x1FAA => array(0x1F62, 0x3B9)
1626 ,0x1FAB => array(0x1F63, 0x3B9)
1627 ,0x1FAC => array(0x1F64, 0x3B9)
1628 ,0x1FAD => array(0x1F65, 0x3B9)
1629 ,0x1FAE => array(0x1F66, 0x3B9)
1630 ,0x1FAF => array(0x1F67, 0x3B9)
1631 ,0x1FB2 => array(0x1F70, 0x3B9)
1632 ,0x1FB3 => array(0x3B1, 0x3B9)
1633 ,0x1FB4 => array(0x3AC, 0x3B9)
1634 ,0x1FB6 => array(0x3B1, 0x342)
1635 ,0x1FB7 => array(0x3B1, 0x342, 0x3B9)
1636 ,0x1FB8 => array(0x1FB0)
1637 ,0x1FB9 => array(0x1FB1)
1638 ,0x1FBA => array(0x1F70)
1639 ,0x1FBB => array(0x1F71)
1640 ,0x1FBC => array(0x3B1, 0x3B9)
1641 ,0x1FBE => array(0x3B9)
1642 ,0x1FC2 => array(0x1F74, 0x3B9)
1643 ,0x1FC3 => array(0x3B7, 0x3B9)
1644 ,0x1FC4 => array(0x3AE, 0x3B9)
1645 ,0x1FC6 => array(0x3B7, 0x342)
1646 ,0x1FC7 => array(0x3B7, 0x342, 0x3B9)
1647 ,0x1FC8 => array(0x1F72)
1648 ,0x1FC9 => array(0x1F73)
1649 ,0x1FCA => array(0x1F74)
1650 ,0x1FCB => array(0x1F75)
1651 ,0x1FCC => array(0x3B7, 0x3B9)
1652 ,0x1FD2 => array(0x3B9, 0x308, 0x300)
1653 ,0x1FD3 => array(0x3B9, 0x308, 0x301)
1654 ,0x1FD6 => array(0x3B9, 0x342)
1655 ,0x1FD7 => array(0x3B9, 0x308, 0x342)
1656 ,0x1FD8 => array(0x1FD0)
1657 ,0x1FD9 => array(0x1FD1)
1658 ,0x1FDA => array(0x1F76)
1659 ,0x1FDB => array(0x1F77)
1660 ,0x1FE2 => array(0x3C5, 0x308, 0x300)
1661 ,0x1FE3 => array(0x3C5, 0x308, 0x301)
1662 ,0x1FE4 => array(0x3C1, 0x313)
1663 ,0x1FE6 => array(0x3C5, 0x342)
1664 ,0x1FE7 => array(0x3C5, 0x308, 0x342)
1665 ,0x1FE8 => array(0x1FE0)
1666 ,0x1FE9 => array(0x1FE1)
1667 ,0x1FEA => array(0x1F7A)
1668 ,0x1FEB => array(0x1F7B)
1669 ,0x1FEC => array(0x1FE5)
1670 ,0x1FF2 => array(0x1F7C, 0x3B9)
1671 ,0x1FF3 => array(0x3C9, 0x3B9)
1672 ,0x1FF4 => array(0x3CE, 0x3B9)
1673 ,0x1FF6 => array(0x3C9, 0x342)
1674 ,0x1FF7 => array(0x3C9, 0x342, 0x3B9)
1675 ,0x1FF8 => array(0x1F78)
1676 ,0x1FF9 => array(0x1F79)
1677 ,0x1FFA => array(0x1F7C)
1678 ,0x1FFB => array(0x1F7D)
1679 ,0x1FFC => array(0x3C9, 0x3B9)
1680 ,0x20A8 => array(0x72, 0x73)
1681 ,0x2102 => array(0x63)
1682 ,0x2103 => array(0xB0, 0x63)
1683 ,0x2107 => array(0x25B)
1684 ,0x2109 => array(0xB0, 0x66)
1685 ,0x210B => array(0x68)
1686 ,0x210C => array(0x68)
1687 ,0x210D => array(0x68)
1688 ,0x2110 => array(0x69)
1689 ,0x2111 => array(0x69)
1690 ,0x2112 => array(0x6C)
1691 ,0x2115 => array(0x6E)
1692 ,0x2116 => array(0x6E, 0x6F)
1693 ,0x2119 => array(0x70)
1694 ,0x211A => array(0x71)
1695 ,0x211B => array(0x72)
1696 ,0x211C => array(0x72)
1697 ,0x211D => array(0x72)
1698 ,0x2120 => array(0x73, 0x6D)
1699 ,0x2121 => array(0x74, 0x65, 0x6C)
1700 ,0x2122 => array(0x74, 0x6D)
1701 ,0x2124 => array(0x7A)
1702 ,0x2126 => array(0x3C9)
1703 ,0x2128 => array(0x7A)
1704 ,0x212A => array(0x6B)
1705 ,0x212B => array(0xE5)
1706 ,0x212C => array(0x62)
1707 ,0x212D => array(0x63)
1708 ,0x2130 => array(0x65)
1709 ,0x2131 => array(0x66)
1710 ,0x2133 => array(0x6D)
1711 ,0x213E => array(0x3B3)
1712 ,0x213F => array(0x3C0)
1713 ,0x2145 => array(0x64)
1714 ,0x2160 => array(0x2170)
1715 ,0x2161 => array(0x2171)
1716 ,0x2162 => array(0x2172)
1717 ,0x2163 => array(0x2173)
1718 ,0x2164 => array(0x2174)
1719 ,0x2165 => array(0x2175)
1720 ,0x2166 => array(0x2176)
1721 ,0x2167 => array(0x2177)
1722 ,0x2168 => array(0x2178)
1723 ,0x2169 => array(0x2179)
1724 ,0x216A => array(0x217A)
1725 ,0x216B => array(0x217B)
1726 ,0x216C => array(0x217C)
1727 ,0x216D => array(0x217D)
1728 ,0x216E => array(0x217E)
1729 ,0x216F => array(0x217F)
1730 ,0x24B6 => array(0x24D0)
1731 ,0x24B7 => array(0x24D1)
1732 ,0x24B8 => array(0x24D2)
1733 ,0x24B9 => array(0x24D3)
1734 ,0x24BA => array(0x24D4)
1735 ,0x24BB => array(0x24D5)
1736 ,0x24BC => array(0x24D6)
1737 ,0x24BD => array(0x24D7)
1738 ,0x24BE => array(0x24D8)
1739 ,0x24BF => array(0x24D9)
1740 ,0x24C0 => array(0x24DA)
1741 ,0x24C1 => array(0x24DB)
1742 ,0x24C2 => array(0x24DC)
1743 ,0x24C3 => array(0x24DD)
1744 ,0x24C4 => array(0x24DE)
1745 ,0x24C5 => array(0x24DF)
1746 ,0x24C6 => array(0x24E0)
1747 ,0x24C7 => array(0x24E1)
1748 ,0x24C8 => array(0x24E2)
1749 ,0x24C9 => array(0x24E3)
1750 ,0x24CA => array(0x24E4)
1751 ,0x24CB => array(0x24E5)
1752 ,0x24CC => array(0x24E6)
1753 ,0x24CD => array(0x24E7)
1754 ,0x24CE => array(0x24E8)
1755 ,0x24CF => array(0x24E9)
1756 ,0x3371 => array(0x68, 0x70, 0x61)
1757 ,0x3373 => array(0x61, 0x75)
1758 ,0x3375 => array(0x6F, 0x76)
1759 ,0x3380 => array(0x70, 0x61)
1760 ,0x3381 => array(0x6E, 0x61)
1761 ,0x3382 => array(0x3BC, 0x61)
1762 ,0x3383 => array(0x6D, 0x61)
1763 ,0x3384 => array(0x6B, 0x61)
1764 ,0x3385 => array(0x6B, 0x62)
1765 ,0x3386 => array(0x6D, 0x62)
1766 ,0x3387 => array(0x67, 0x62)
1767 ,0x338A => array(0x70, 0x66)
1768 ,0x338B => array(0x6E, 0x66)
1769 ,0x338C => array(0x3BC, 0x66)
1770 ,0x3390 => array(0x68, 0x7A)
1771 ,0x3391 => array(0x6B, 0x68, 0x7A)
1772 ,0x3392 => array(0x6D, 0x68, 0x7A)
1773 ,0x3393 => array(0x67, 0x68, 0x7A)
1774 ,0x3394 => array(0x74, 0x68, 0x7A)
1775 ,0x33A9 => array(0x70, 0x61)
1776 ,0x33AA => array(0x6B, 0x70, 0x61)
1777 ,0x33AB => array(0x6D, 0x70, 0x61)
1778 ,0x33AC => array(0x67, 0x70, 0x61)
1779 ,0x33B4 => array(0x70, 0x76)
1780 ,0x33B5 => array(0x6E, 0x76)
1781 ,0x33B6 => array(0x3BC, 0x76)
1782 ,0x33B7 => array(0x6D, 0x76)
1783 ,0x33B8 => array(0x6B, 0x76)
1784 ,0x33B9 => array(0x6D, 0x76)
1785 ,0x33BA => array(0x70, 0x77)
1786 ,0x33BB => array(0x6E, 0x77)
1787 ,0x33BC => array(0x3BC, 0x77)
1788 ,0x33BD => array(0x6D, 0x77)
1789 ,0x33BE => array(0x6B, 0x77)
1790 ,0x33BF => array(0x6D, 0x77)
1791 ,0x33C0 => array(0x6B, 0x3C9)
1792 ,0x33C1 => array(0x6D, 0x3C9) /*
1793 ,0x33C2 => array(0x61, 0x2E, 0x6D, 0x2E) */
1794 ,0x33C3 => array(0x62, 0x71)
1795 ,0x33C6 => array(0x63, 0x2215, 0x6B, 0x67)
1796 ,0x33C7 => array(0x63, 0x6F, 0x2E)
1797 ,0x33C8 => array(0x64, 0x62)
1798 ,0x33C9 => array(0x67, 0x79)
1799 ,0x33CB => array(0x68, 0x70)
1800 ,0x33CD => array(0x6B, 0x6B)
1801 ,0x33CE => array(0x6B, 0x6D)
1802 ,0x33D7 => array(0x70, 0x68)
1803 ,0x33D9 => array(0x70, 0x70, 0x6D)
1804 ,0x33DA => array(0x70, 0x72)
1805 ,0x33DC => array(0x73, 0x76)
1806 ,0x33DD => array(0x77, 0x62)
1807 ,0xFB00 => array(0x66, 0x66)
1808 ,0xFB01 => array(0x66, 0x69)
1809 ,0xFB02 => array(0x66, 0x6C)
1810 ,0xFB03 => array(0x66, 0x66, 0x69)
1811 ,0xFB04 => array(0x66, 0x66, 0x6C)
1812 ,0xFB05 => array(0x73, 0x74)
1813 ,0xFB06 => array(0x73, 0x74)
1814 ,0xFB13 => array(0x574, 0x576)
1815 ,0xFB14 => array(0x574, 0x565)
1816 ,0xFB15 => array(0x574, 0x56B)
1817 ,0xFB16 => array(0x57E, 0x576)
1818 ,0xFB17 => array(0x574, 0x56D)
1819 ,0xFF21 => array(0xFF41)
1820 ,0xFF22 => array(0xFF42)
1821 ,0xFF23 => array(0xFF43)
1822 ,0xFF24 => array(0xFF44)
1823 ,0xFF25 => array(0xFF45)
1824 ,0xFF26 => array(0xFF46)
1825 ,0xFF27 => array(0xFF47)
1826 ,0xFF28 => array(0xFF48)
1827 ,0xFF29 => array(0xFF49)
1828 ,0xFF2A => array(0xFF4A)
1829 ,0xFF2B => array(0xFF4B)
1830 ,0xFF2C => array(0xFF4C)
1831 ,0xFF2D => array(0xFF4D)
1832 ,0xFF2E => array(0xFF4E)
1833 ,0xFF2F => array(0xFF4F)
1834 ,0xFF30 => array(0xFF50)
1835 ,0xFF31 => array(0xFF51)
1836 ,0xFF32 => array(0xFF52)
1837 ,0xFF33 => array(0xFF53)
1838 ,0xFF34 => array(0xFF54)
1839 ,0xFF35 => array(0xFF55)
1840 ,0xFF36 => array(0xFF56)
1841 ,0xFF37 => array(0xFF57)
1842 ,0xFF38 => array(0xFF58)
1843 ,0xFF39 => array(0xFF59)
1844 ,0xFF3A => array(0xFF5A)
1845 ,0x10400 => array(0x10428)
1846 ,0x10401 => array(0x10429)
1847 ,0x10402 => array(0x1042A)
1848 ,0x10403 => array(0x1042B)
1849 ,0x10404 => array(0x1042C)
1850 ,0x10405 => array(0x1042D)
1851 ,0x10406 => array(0x1042E)
1852 ,0x10407 => array(0x1042F)
1853 ,0x10408 => array(0x10430)
1854 ,0x10409 => array(0x10431)
1855 ,0x1040A => array(0x10432)
1856 ,0x1040B => array(0x10433)
1857 ,0x1040C => array(0x10434)
1858 ,0x1040D => array(0x10435)
1859 ,0x1040E => array(0x10436)
1860 ,0x1040F => array(0x10437)
1861 ,0x10410 => array(0x10438)
1862 ,0x10411 => array(0x10439)
1863 ,0x10412 => array(0x1043A)
1864 ,0x10413 => array(0x1043B)
1865 ,0x10414 => array(0x1043C)
1866 ,0x10415 => array(0x1043D)
1867 ,0x10416 => array(0x1043E)
1868 ,0x10417 => array(0x1043F)
1869 ,0x10418 => array(0x10440)
1870 ,0x10419 => array(0x10441)
1871 ,0x1041A => array(0x10442)
1872 ,0x1041B => array(0x10443)
1873 ,0x1041C => array(0x10444)
1874 ,0x1041D => array(0x10445)
1875 ,0x1041E => array(0x10446)
1876 ,0x1041F => array(0x10447)
1877 ,0x10420 => array(0x10448)
1878 ,0x10421 => array(0x10449)
1879 ,0x10422 => array(0x1044A)
1880 ,0x10423 => array(0x1044B)
1881 ,0x10424 => array(0x1044C)
1882 ,0x10425 => array(0x1044D)
1883 ,0x1D400 => array(0x61)
1884 ,0x1D401 => array(0x62)
1885 ,0x1D402 => array(0x63)
1886 ,0x1D403 => array(0x64)
1887 ,0x1D404 => array(0x65)
1888 ,0x1D405 => array(0x66)
1889 ,0x1D406 => array(0x67)
1890 ,0x1D407 => array(0x68)
1891 ,0x1D408 => array(0x69)
1892 ,0x1D409 => array(0x6A)
1893 ,0x1D40A => array(0x6B)
1894 ,0x1D40B => array(0x6C)
1895 ,0x1D40C => array(0x6D)
1896 ,0x1D40D => array(0x6E)
1897 ,0x1D40E => array(0x6F)
1898 ,0x1D40F => array(0x70)
1899 ,0x1D410 => array(0x71)
1900 ,0x1D411 => array(0x72)
1901 ,0x1D412 => array(0x73)
1902 ,0x1D413 => array(0x74)
1903 ,0x1D414 => array(0x75)
1904 ,0x1D415 => array(0x76)
1905 ,0x1D416 => array(0x77)
1906 ,0x1D417 => array(0x78)
1907 ,0x1D418 => array(0x79)
1908 ,0x1D419 => array(0x7A)
1909 ,0x1D434 => array(0x61)
1910 ,0x1D435 => array(0x62)
1911 ,0x1D436 => array(0x63)
1912 ,0x1D437 => array(0x64)
1913 ,0x1D438 => array(0x65)
1914 ,0x1D439 => array(0x66)
1915 ,0x1D43A => array(0x67)
1916 ,0x1D43B => array(0x68)
1917 ,0x1D43C => array(0x69)
1918 ,0x1D43D => array(0x6A)
1919 ,0x1D43E => array(0x6B)
1920 ,0x1D43F => array(0x6C)
1921 ,0x1D440 => array(0x6D)
1922 ,0x1D441 => array(0x6E)
1923 ,0x1D442 => array(0x6F)
1924 ,0x1D443 => array(0x70)
1925 ,0x1D444 => array(0x71)
1926 ,0x1D445 => array(0x72)
1927 ,0x1D446 => array(0x73)
1928 ,0x1D447 => array(0x74)
1929 ,0x1D448 => array(0x75)
1930 ,0x1D449 => array(0x76)
1931 ,0x1D44A => array(0x77)
1932 ,0x1D44B => array(0x78)
1933 ,0x1D44C => array(0x79)
1934 ,0x1D44D => array(0x7A)
1935 ,0x1D468 => array(0x61)
1936 ,0x1D469 => array(0x62)
1937 ,0x1D46A => array(0x63)
1938 ,0x1D46B => array(0x64)
1939 ,0x1D46C => array(0x65)
1940 ,0x1D46D => array(0x66)
1941 ,0x1D46E => array(0x67)
1942 ,0x1D46F => array(0x68)
1943 ,0x1D470 => array(0x69)
1944 ,0x1D471 => array(0x6A)
1945 ,0x1D472 => array(0x6B)
1946 ,0x1D473 => array(0x6C)
1947 ,0x1D474 => array(0x6D)
1948 ,0x1D475 => array(0x6E)
1949 ,0x1D476 => array(0x6F)
1950 ,0x1D477 => array(0x70)
1951 ,0x1D478 => array(0x71)
1952 ,0x1D479 => array(0x72)
1953 ,0x1D47A => array(0x73)
1954 ,0x1D47B => array(0x74)
1955 ,0x1D47C => array(0x75)
1956 ,0x1D47D => array(0x76)
1957 ,0x1D47E => array(0x77)
1958 ,0x1D47F => array(0x78)
1959 ,0x1D480 => array(0x79)
1960 ,0x1D481 => array(0x7A)
1961 ,0x1D49C => array(0x61)
1962 ,0x1D49E => array(0x63)
1963 ,0x1D49F => array(0x64)
1964 ,0x1D4A2 => array(0x67)
1965 ,0x1D4A5 => array(0x6A)
1966 ,0x1D4A6 => array(0x6B)
1967 ,0x1D4A9 => array(0x6E)
1968 ,0x1D4AA => array(0x6F)
1969 ,0x1D4AB => array(0x70)
1970 ,0x1D4AC => array(0x71)
1971 ,0x1D4AE => array(0x73)
1972 ,0x1D4AF => array(0x74)
1973 ,0x1D4B0 => array(0x75)
1974 ,0x1D4B1 => array(0x76)
1975 ,0x1D4B2 => array(0x77)
1976 ,0x1D4B3 => array(0x78)
1977 ,0x1D4B4 => array(0x79)
1978 ,0x1D4B5 => array(0x7A)
1979 ,0x1D4D0 => array(0x61)
1980 ,0x1D4D1 => array(0x62)
1981 ,0x1D4D2 => array(0x63)
1982 ,0x1D4D3 => array(0x64)
1983 ,0x1D4D4 => array(0x65)
1984 ,0x1D4D5 => array(0x66)
1985 ,0x1D4D6 => array(0x67)
1986 ,0x1D4D7 => array(0x68)
1987 ,0x1D4D8 => array(0x69)
1988 ,0x1D4D9 => array(0x6A)
1989 ,0x1D4DA => array(0x6B)
1990 ,0x1D4DB => array(0x6C)
1991 ,0x1D4DC => array(0x6D)
1992 ,0x1D4DD => array(0x6E)
1993 ,0x1D4DE => array(0x6F)
1994 ,0x1D4DF => array(0x70)
1995 ,0x1D4E0 => array(0x71)
1996 ,0x1D4E1 => array(0x72)
1997 ,0x1D4E2 => array(0x73)
1998 ,0x1D4E3 => array(0x74)
1999 ,0x1D4E4 => array(0x75)
2000 ,0x1D4E5 => array(0x76)
2001 ,0x1D4E6 => array(0x77)
2002 ,0x1D4E7 => array(0x78)
2003 ,0x1D4E8 => array(0x79)
2004 ,0x1D4E9 => array(0x7A)
2005 ,0x1D504 => array(0x61)
2006 ,0x1D505 => array(0x62)
2007 ,0x1D507 => array(0x64)
2008 ,0x1D508 => array(0x65)
2009 ,0x1D509 => array(0x66)
2010 ,0x1D50A => array(0x67)
2011 ,0x1D50D => array(0x6A)
2012 ,0x1D50E => array(0x6B)
2013 ,0x1D50F => array(0x6C)
2014 ,0x1D510 => array(0x6D)
2015 ,0x1D511 => array(0x6E)
2016 ,0x1D512 => array(0x6F)
2017 ,0x1D513 => array(0x70)
2018 ,0x1D514 => array(0x71)
2019 ,0x1D516 => array(0x73)
2020 ,0x1D517 => array(0x74)
2021 ,0x1D518 => array(0x75)
2022 ,0x1D519 => array(0x76)
2023 ,0x1D51A => array(0x77)
2024 ,0x1D51B => array(0x78)
2025 ,0x1D51C => array(0x79)
2026 ,0x1D538 => array(0x61)
2027 ,0x1D539 => array(0x62)
2028 ,0x1D53B => array(0x64)
2029 ,0x1D53C => array(0x65)
2030 ,0x1D53D => array(0x66)
2031 ,0x1D53E => array(0x67)
2032 ,0x1D540 => array(0x69)
2033 ,0x1D541 => array(0x6A)
2034 ,0x1D542 => array(0x6B)
2035 ,0x1D543 => array(0x6C)
2036 ,0x1D544 => array(0x6D)
2037 ,0x1D546 => array(0x6F)
2038 ,0x1D54A => array(0x73)
2039 ,0x1D54B => array(0x74)
2040 ,0x1D54C => array(0x75)
2041 ,0x1D54D => array(0x76)
2042 ,0x1D54E => array(0x77)
2043 ,0x1D54F => array(0x78)
2044 ,0x1D550 => array(0x79)
2045 ,0x1D56C => array(0x61)
2046 ,0x1D56D => array(0x62)
2047 ,0x1D56E => array(0x63)
2048 ,0x1D56F => array(0x64)
2049 ,0x1D570 => array(0x65)
2050 ,0x1D571 => array(0x66)
2051 ,0x1D572 => array(0x67)
2052 ,0x1D573 => array(0x68)
2053 ,0x1D574 => array(0x69)
2054 ,0x1D575 => array(0x6A)
2055 ,0x1D576 => array(0x6B)
2056 ,0x1D577 => array(0x6C)
2057 ,0x1D578 => array(0x6D)
2058 ,0x1D579 => array(0x6E)
2059 ,0x1D57A => array(0x6F)
2060 ,0x1D57B => array(0x70)
2061 ,0x1D57C => array(0x71)
2062 ,0x1D57D => array(0x72)
2063 ,0x1D57E => array(0x73)
2064 ,0x1D57F => array(0x74)
2065 ,0x1D580 => array(0x75)
2066 ,0x1D581 => array(0x76)
2067 ,0x1D582 => array(0x77)
2068 ,0x1D583 => array(0x78)
2069 ,0x1D584 => array(0x79)
2070 ,0x1D585 => array(0x7A)
2071 ,0x1D5A0 => array(0x61)
2072 ,0x1D5A1 => array(0x62)
2073 ,0x1D5A2 => array(0x63)
2074 ,0x1D5A3 => array(0x64)
2075 ,0x1D5A4 => array(0x65)
2076 ,0x1D5A5 => array(0x66)
2077 ,0x1D5A6 => array(0x67)
2078 ,0x1D5A7 => array(0x68)
2079 ,0x1D5A8 => array(0x69)
2080 ,0x1D5A9 => array(0x6A)
2081 ,0x1D5AA => array(0x6B)
2082 ,0x1D5AB => array(0x6C)
2083 ,0x1D5AC => array(0x6D)
2084 ,0x1D5AD => array(0x6E)
2085 ,0x1D5AE => array(0x6F)
2086 ,0x1D5AF => array(0x70)
2087 ,0x1D5B0 => array(0x71)
2088 ,0x1D5B1 => array(0x72)
2089 ,0x1D5B2 => array(0x73)
2090 ,0x1D5B3 => array(0x74)
2091 ,0x1D5B4 => array(0x75)
2092 ,0x1D5B5 => array(0x76)
2093 ,0x1D5B6 => array(0x77)
2094 ,0x1D5B7 => array(0x78)
2095 ,0x1D5B8 => array(0x79)
2096 ,0x1D5B9 => array(0x7A)
2097 ,0x1D5D4 => array(0x61)
2098 ,0x1D5D5 => array(0x62)
2099 ,0x1D5D6 => array(0x63)
2100 ,0x1D5D7 => array(0x64)
2101 ,0x1D5D8 => array(0x65)
2102 ,0x1D5D9 => array(0x66)
2103 ,0x1D5DA => array(0x67)
2104 ,0x1D5DB => array(0x68)
2105 ,0x1D5DC => array(0x69)
2106 ,0x1D5DD => array(0x6A)
2107 ,0x1D5DE => array(0x6B)
2108 ,0x1D5DF => array(0x6C)
2109 ,0x1D5E0 => array(0x6D)
2110 ,0x1D5E1 => array(0x6E)
2111 ,0x1D5E2 => array(0x6F)
2112 ,0x1D5E3 => array(0x70)
2113 ,0x1D5E4 => array(0x71)
2114 ,0x1D5E5 => array(0x72)
2115 ,0x1D5E6 => array(0x73)
2116 ,0x1D5E7 => array(0x74)
2117 ,0x1D5E8 => array(0x75)
2118 ,0x1D5E9 => array(0x76)
2119 ,0x1D5EA => array(0x77)
2120 ,0x1D5EB => array(0x78)
2121 ,0x1D5EC => array(0x79)
2122 ,0x1D5ED => array(0x7A)
2123 ,0x1D608 => array(0x61)
2124 ,0x1D609 => array(0x62)
2125 ,0x1D60A => array(0x63)
2126 ,0x1D60B => array(0x64)
2127 ,0x1D60C => array(0x65)
2128 ,0x1D60D => array(0x66)
2129 ,0x1D60E => array(0x67)
2130 ,0x1D60F => array(0x68)
2131 ,0x1D610 => array(0x69)
2132 ,0x1D611 => array(0x6A)
2133 ,0x1D612 => array(0x6B)
2134 ,0x1D613 => array(0x6C)
2135 ,0x1D614 => array(0x6D)
2136 ,0x1D615 => array(0x6E)
2137 ,0x1D616 => array(0x6F)
2138 ,0x1D617 => array(0x70)
2139 ,0x1D618 => array(0x71)
2140 ,0x1D619 => array(0x72)
2141 ,0x1D61A => array(0x73)
2142 ,0x1D61B => array(0x74)
2143 ,0x1D61C => array(0x75)
2144 ,0x1D61D => array(0x76)
2145 ,0x1D61E => array(0x77)
2146 ,0x1D61F => array(0x78)
2147 ,0x1D620 => array(0x79)
2148 ,0x1D621 => array(0x7A)
2149 ,0x1D63C => array(0x61)
2150 ,0x1D63D => array(0x62)
2151 ,0x1D63E => array(0x63)
2152 ,0x1D63F => array(0x64)
2153 ,0x1D640 => array(0x65)
2154 ,0x1D641 => array(0x66)
2155 ,0x1D642 => array(0x67)
2156 ,0x1D643 => array(0x68)
2157 ,0x1D644 => array(0x69)
2158 ,0x1D645 => array(0x6A)
2159 ,0x1D646 => array(0x6B)
2160 ,0x1D647 => array(0x6C)
2161 ,0x1D648 => array(0x6D)
2162 ,0x1D649 => array(0x6E)
2163 ,0x1D64A => array(0x6F)
2164 ,0x1D64B => array(0x70)
2165 ,0x1D64C => array(0x71)
2166 ,0x1D64D => array(0x72)
2167 ,0x1D64E => array(0x73)
2168 ,0x1D64F => array(0x74)
2169 ,0x1D650 => array(0x75)
2170 ,0x1D651 => array(0x76)
2171 ,0x1D652 => array(0x77)
2172 ,0x1D653 => array(0x78)
2173 ,0x1D654 => array(0x79)
2174 ,0x1D655 => array(0x7A)
2175 ,0x1D670 => array(0x61)
2176 ,0x1D671 => array(0x62)
2177 ,0x1D672 => array(0x63)
2178 ,0x1D673 => array(0x64)
2179 ,0x1D674 => array(0x65)
2180 ,0x1D675 => array(0x66)
2181 ,0x1D676 => array(0x67)
2182 ,0x1D677 => array(0x68)
2183 ,0x1D678 => array(0x69)
2184 ,0x1D679 => array(0x6A)
2185 ,0x1D67A => array(0x6B)
2186 ,0x1D67B => array(0x6C)
2187 ,0x1D67C => array(0x6D)
2188 ,0x1D67D => array(0x6E)
2189 ,0x1D67E => array(0x6F)
2190 ,0x1D67F => array(0x70)
2191 ,0x1D680 => array(0x71)
2192 ,0x1D681 => array(0x72)
2193 ,0x1D682 => array(0x73)
2194 ,0x1D683 => array(0x74)
2195 ,0x1D684 => array(0x75)
2196 ,0x1D685 => array(0x76)
2197 ,0x1D686 => array(0x77)
2198 ,0x1D687 => array(0x78)
2199 ,0x1D688 => array(0x79)
2200 ,0x1D689 => array(0x7A)
2201 ,0x1D6A8 => array(0x3B1)
2202 ,0x1D6A9 => array(0x3B2)
2203 ,0x1D6AA => array(0x3B3)
2204 ,0x1D6AB => array(0x3B4)
2205 ,0x1D6AC => array(0x3B5)
2206 ,0x1D6AD => array(0x3B6)
2207 ,0x1D6AE => array(0x3B7)
2208 ,0x1D6AF => array(0x3B8)
2209 ,0x1D6B0 => array(0x3B9)
2210 ,0x1D6B1 => array(0x3BA)
2211 ,0x1D6B2 => array(0x3BB)
2212 ,0x1D6B3 => array(0x3BC)
2213 ,0x1D6B4 => array(0x3BD)
2214 ,0x1D6B5 => array(0x3BE)
2215 ,0x1D6B6 => array(0x3BF)
2216 ,0x1D6B7 => array(0x3C0)
2217 ,0x1D6B8 => array(0x3C1)
2218 ,0x1D6B9 => array(0x3B8)
2219 ,0x1D6BA => array(0x3C3)
2220 ,0x1D6BB => array(0x3C4)
2221 ,0x1D6BC => array(0x3C5)
2222 ,0x1D6BD => array(0x3C6)
2223 ,0x1D6BE => array(0x3C7)
2224 ,0x1D6BF => array(0x3C8)
2225 ,0x1D6C0 => array(0x3C9)
2226 ,0x1D6D3 => array(0x3C3)
2227 ,0x1D6E2 => array(0x3B1)
2228 ,0x1D6E3 => array(0x3B2)
2229 ,0x1D6E4 => array(0x3B3)
2230 ,0x1D6E5 => array(0x3B4)
2231 ,0x1D6E6 => array(0x3B5)
2232 ,0x1D6E7 => array(0x3B6)
2233 ,0x1D6E8 => array(0x3B7)
2234 ,0x1D6E9 => array(0x3B8)
2235 ,0x1D6EA => array(0x3B9)
2236 ,0x1D6EB => array(0x3BA)
2237 ,0x1D6EC => array(0x3BB)
2238 ,0x1D6ED => array(0x3BC)
2239 ,0x1D6EE => array(0x3BD)
2240 ,0x1D6EF => array(0x3BE)
2241 ,0x1D6F0 => array(0x3BF)
2242 ,0x1D6F1 => array(0x3C0)
2243 ,0x1D6F2 => array(0x3C1)
2244 ,0x1D6F3 => array(0x3B8)
2245 ,0x1D6F4 => array(0x3C3)
2246 ,0x1D6F5 => array(0x3C4)
2247 ,0x1D6F6 => array(0x3C5)
2248 ,0x1D6F7 => array(0x3C6)
2249 ,0x1D6F8 => array(0x3C7)
2250 ,0x1D6F9 => array(0x3C8)
2251 ,0x1D6FA => array(0x3C9)
2252 ,0x1D70D => array(0x3C3)
2253 ,0x1D71C => array(0x3B1)
2254 ,0x1D71D => array(0x3B2)
2255 ,0x1D71E => array(0x3B3)
2256 ,0x1D71F => array(0x3B4)
2257 ,0x1D720 => array(0x3B5)
2258 ,0x1D721 => array(0x3B6)
2259 ,0x1D722 => array(0x3B7)
2260 ,0x1D723 => array(0x3B8)
2261 ,0x1D724 => array(0x3B9)
2262 ,0x1D725 => array(0x3BA)
2263 ,0x1D726 => array(0x3BB)
2264 ,0x1D727 => array(0x3BC)
2265 ,0x1D728 => array(0x3BD)
2266 ,0x1D729 => array(0x3BE)
2267 ,0x1D72A => array(0x3BF)
2268 ,0x1D72B => array(0x3C0)
2269 ,0x1D72C => array(0x3C1)
2270 ,0x1D72D => array(0x3B8)
2271 ,0x1D72E => array(0x3C3)
2272 ,0x1D72F => array(0x3C4)
2273 ,0x1D730 => array(0x3C5)
2274 ,0x1D731 => array(0x3C6)
2275 ,0x1D732 => array(0x3C7)
2276 ,0x1D733 => array(0x3C8)
2277 ,0x1D734 => array(0x3C9)
2278 ,0x1D747 => array(0x3C3)
2279 ,0x1D756 => array(0x3B1)
2280 ,0x1D757 => array(0x3B2)
2281 ,0x1D758 => array(0x3B3)
2282 ,0x1D759 => array(0x3B4)
2283 ,0x1D75A => array(0x3B5)
2284 ,0x1D75B => array(0x3B6)
2285 ,0x1D75C => array(0x3B7)
2286 ,0x1D75D => array(0x3B8)
2287 ,0x1D75E => array(0x3B9)
2288 ,0x1D75F => array(0x3BA)
2289 ,0x1D760 => array(0x3BB)
2290 ,0x1D761 => array(0x3BC)
2291 ,0x1D762 => array(0x3BD)
2292 ,0x1D763 => array(0x3BE)
2293 ,0x1D764 => array(0x3BF)
2294 ,0x1D765 => array(0x3C0)
2295 ,0x1D766 => array(0x3C1)
2296 ,0x1D767 => array(0x3B8)
2297 ,0x1D768 => array(0x3C3)
2298 ,0x1D769 => array(0x3C4)
2299 ,0x1D76A => array(0x3C5)
2300 ,0x1D76B => array(0x3C6)
2301 ,0x1D76C => array(0x3C7)
2302 ,0x1D76D => array(0x3C8)
2303 ,0x1D76E => array(0x3C9)
2304 ,0x1D781 => array(0x3C3)
2305 ,0x1D790 => array(0x3B1)
2306 ,0x1D791 => array(0x3B2)
2307 ,0x1D792 => array(0x3B3)
2308 ,0x1D793 => array(0x3B4)
2309 ,0x1D794 => array(0x3B5)
2310 ,0x1D795 => array(0x3B6)
2311 ,0x1D796 => array(0x3B7)
2312 ,0x1D797 => array(0x3B8)
2313 ,0x1D798 => array(0x3B9)
2314 ,0x1D799 => array(0x3BA)
2315 ,0x1D79A => array(0x3BB)
2316 ,0x1D79B => array(0x3BC)
2317 ,0x1D79C => array(0x3BD)
2318 ,0x1D79D => array(0x3BE)
2319 ,0x1D79E => array(0x3BF)
2320 ,0x1D79F => array(0x3C0)
2321 ,0x1D7A0 => array(0x3C1)
2322 ,0x1D7A1 => array(0x3B8)
2323 ,0x1D7A2 => array(0x3C3)
2324 ,0x1D7A3 => array(0x3C4)
2325 ,0x1D7A4 => array(0x3C5)
2326 ,0x1D7A5 => array(0x3C6)
2327 ,0x1D7A6 => array(0x3C7)
2328 ,0x1D7A7 => array(0x3C8)
2329 ,0x1D7A8 => array(0x3C9)
2330 ,0x1D7BB => array(0x3C3)
2331 ,0x3F9 => array(0x3C3)
2332 ,0x1D2C => array(0x61)
2333 ,0x1D2D => array(0xE6)
2334 ,0x1D2E => array(0x62)
2335 ,0x1D30 => array(0x64)
2336 ,0x1D31 => array(0x65)
2337 ,0x1D32 => array(0x1DD)
2338 ,0x1D33 => array(0x67)
2339 ,0x1D34 => array(0x68)
2340 ,0x1D35 => array(0x69)
2341 ,0x1D36 => array(0x6A)
2342 ,0x1D37 => array(0x6B)
2343 ,0x1D38 => array(0x6C)
2344 ,0x1D39 => array(0x6D)
2345 ,0x1D3A => array(0x6E)
2346 ,0x1D3C => array(0x6F)
2347 ,0x1D3D => array(0x223)
2348 ,0x1D3E => array(0x70)
2349 ,0x1D3F => array(0x72)
2350 ,0x1D40 => array(0x74)
2351 ,0x1D41 => array(0x75)
2352 ,0x1D42 => array(0x77)
2353 ,0x213B => array(0x66, 0x61, 0x78)
2354 ,0x3250 => array(0x70, 0x74, 0x65)
2355 ,0x32CC => array(0x68, 0x67)
2356 ,0x32CE => array(0x65, 0x76)
2357 ,0x32CF => array(0x6C, 0x74, 0x64)
2358 ,0x337A => array(0x69, 0x75)
2359 ,0x33DE => array(0x76, 0x2215, 0x6D)
2360 ,0x33DF => array(0x61, 0x2215, 0x6D)
2361 )
2362 ,'norm_combcls' => array
2363 (0x334 => 1
2364 ,0x335 => 1
2365 ,0x336 => 1
2366 ,0x337 => 1
2367 ,0x338 => 1
2368 ,0x93C => 7
2369 ,0x9BC => 7
2370 ,0xA3C => 7
2371 ,0xABC => 7
2372 ,0xB3C => 7
2373 ,0xCBC => 7
2374 ,0x1037 => 7
2375 ,0x3099 => 8
2376 ,0x309A => 8
2377 ,0x94D => 9
2378 ,0x9CD => 9
2379 ,0xA4D => 9
2380 ,0xACD => 9
2381 ,0xB4D => 9
2382 ,0xBCD => 9
2383 ,0xC4D => 9
2384 ,0xCCD => 9
2385 ,0xD4D => 9
2386 ,0xDCA => 9
2387 ,0xE3A => 9
2388 ,0xF84 => 9
2389 ,0x1039 => 9
2390 ,0x1714 => 9
2391 ,0x1734 => 9
2392 ,0x17D2 => 9
2393 ,0x5B0 => 10
2394 ,0x5B1 => 11
2395 ,0x5B2 => 12
2396 ,0x5B3 => 13
2397 ,0x5B4 => 14
2398 ,0x5B5 => 15
2399 ,0x5B6 => 16
2400 ,0x5B7 => 17
2401 ,0x5B8 => 18
2402 ,0x5B9 => 19
2403 ,0x5BB => 20
2404 ,0x5Bc => 21
2405 ,0x5BD => 22
2406 ,0x5BF => 23
2407 ,0x5C1 => 24
2408 ,0x5C2 => 25
2409 ,0xFB1E => 26
2410 ,0x64B => 27
2411 ,0x64C => 28
2412 ,0x64D => 29
2413 ,0x64E => 30
2414 ,0x64F => 31
2415 ,0x650 => 32
2416 ,0x651 => 33
2417 ,0x652 => 34
2418 ,0x670 => 35
2419 ,0x711 => 36
2420 ,0xC55 => 84
2421 ,0xC56 => 91
2422 ,0xE38 => 103
2423 ,0xE39 => 103
2424 ,0xE48 => 107
2425 ,0xE49 => 107
2426 ,0xE4A => 107
2427 ,0xE4B => 107
2428 ,0xEB8 => 118
2429 ,0xEB9 => 118
2430 ,0xEC8 => 122
2431 ,0xEC9 => 122
2432 ,0xECA => 122
2433 ,0xECB => 122
2434 ,0xF71 => 129
2435 ,0xF72 => 130
2436 ,0xF7A => 130
2437 ,0xF7B => 130
2438 ,0xF7C => 130
2439 ,0xF7D => 130
2440 ,0xF80 => 130
2441 ,0xF74 => 132
2442 ,0x321 => 202
2443 ,0x322 => 202
2444 ,0x327 => 202
2445 ,0x328 => 202
2446 ,0x31B => 216
2447 ,0xF39 => 216
2448 ,0x1D165 => 216
2449 ,0x1D166 => 216
2450 ,0x1D16E => 216
2451 ,0x1D16F => 216
2452 ,0x1D170 => 216
2453 ,0x1D171 => 216
2454 ,0x1D172 => 216
2455 ,0x302A => 218
2456 ,0x316 => 220
2457 ,0x317 => 220
2458 ,0x318 => 220
2459 ,0x319 => 220
2460 ,0x31C => 220
2461 ,0x31D => 220
2462 ,0x31E => 220
2463 ,0x31F => 220
2464 ,0x320 => 220
2465 ,0x323 => 220
2466 ,0x324 => 220
2467 ,0x325 => 220
2468 ,0x326 => 220
2469 ,0x329 => 220
2470 ,0x32A => 220
2471 ,0x32B => 220
2472 ,0x32C => 220
2473 ,0x32D => 220
2474 ,0x32E => 220
2475 ,0x32F => 220
2476 ,0x330 => 220
2477 ,0x331 => 220
2478 ,0x332 => 220
2479 ,0x333 => 220
2480 ,0x339 => 220
2481 ,0x33A => 220
2482 ,0x33B => 220
2483 ,0x33C => 220
2484 ,0x347 => 220
2485 ,0x348 => 220
2486 ,0x349 => 220
2487 ,0x34D => 220
2488 ,0x34E => 220
2489 ,0x353 => 220
2490 ,0x354 => 220
2491 ,0x355 => 220
2492 ,0x356 => 220
2493 ,0x591 => 220
2494 ,0x596 => 220
2495 ,0x59B => 220
2496 ,0x5A3 => 220
2497 ,0x5A4 => 220
2498 ,0x5A5 => 220
2499 ,0x5A6 => 220
2500 ,0x5A7 => 220
2501 ,0x5AA => 220
2502 ,0x655 => 220
2503 ,0x656 => 220
2504 ,0x6E3 => 220
2505 ,0x6EA => 220
2506 ,0x6ED => 220
2507 ,0x731 => 220
2508 ,0x734 => 220
2509 ,0x737 => 220
2510 ,0x738 => 220
2511 ,0x739 => 220
2512 ,0x73B => 220
2513 ,0x73C => 220
2514 ,0x73E => 220
2515 ,0x742 => 220
2516 ,0x744 => 220
2517 ,0x746 => 220
2518 ,0x748 => 220
2519 ,0x952 => 220
2520 ,0xF18 => 220
2521 ,0xF19 => 220
2522 ,0xF35 => 220
2523 ,0xF37 => 220
2524 ,0xFC6 => 220
2525 ,0x193B => 220
2526 ,0x20E8 => 220
2527 ,0x1D17B => 220
2528 ,0x1D17C => 220
2529 ,0x1D17D => 220
2530 ,0x1D17E => 220
2531 ,0x1D17F => 220
2532 ,0x1D180 => 220
2533 ,0x1D181 => 220
2534 ,0x1D182 => 220
2535 ,0x1D18A => 220
2536 ,0x1D18B => 220
2537 ,0x59A => 222
2538 ,0x5AD => 222
2539 ,0x1929 => 222
2540 ,0x302D => 222
2541 ,0x302E => 224
2542 ,0x302F => 224
2543 ,0x1D16D => 226
2544 ,0x5AE => 228
2545 ,0x18A9 => 228
2546 ,0x302B => 228
2547 ,0x300 => 230
2548 ,0x301 => 230
2549 ,0x302 => 230
2550 ,0x303 => 230
2551 ,0x304 => 230
2552 ,0x305 => 230
2553 ,0x306 => 230
2554 ,0x307 => 230
2555 ,0x308 => 230
2556 ,0x309 => 230
2557 ,0x30A => 230
2558 ,0x30B => 230
2559 ,0x30C => 230
2560 ,0x30D => 230
2561 ,0x30E => 230
2562 ,0x30F => 230
2563 ,0x310 => 230
2564 ,0x311 => 230
2565 ,0x312 => 230
2566 ,0x313 => 230
2567 ,0x314 => 230
2568 ,0x33D => 230
2569 ,0x33E => 230
2570 ,0x33F => 230
2571 ,0x340 => 230
2572 ,0x341 => 230
2573 ,0x342 => 230
2574 ,0x343 => 230
2575 ,0x344 => 230
2576 ,0x346 => 230
2577 ,0x34A => 230
2578 ,0x34B => 230
2579 ,0x34C => 230
2580 ,0x350 => 230
2581 ,0x351 => 230
2582 ,0x352 => 230
2583 ,0x357 => 230
2584 ,0x363 => 230
2585 ,0x364 => 230
2586 ,0x365 => 230
2587 ,0x366 => 230
2588 ,0x367 => 230
2589 ,0x368 => 230
2590 ,0x369 => 230
2591 ,0x36A => 230
2592 ,0x36B => 230
2593 ,0x36C => 230
2594 ,0x36D => 230
2595 ,0x36E => 230
2596 ,0x36F => 230
2597 ,0x483 => 230
2598 ,0x484 => 230
2599 ,0x485 => 230
2600 ,0x486 => 230
2601 ,0x592 => 230
2602 ,0x593 => 230
2603 ,0x594 => 230
2604 ,0x595 => 230
2605 ,0x597 => 230
2606 ,0x598 => 230
2607 ,0x599 => 230
2608 ,0x59C => 230
2609 ,0x59D => 230
2610 ,0x59E => 230
2611 ,0x59F => 230
2612 ,0x5A0 => 230
2613 ,0x5A1 => 230
2614 ,0x5A8 => 230
2615 ,0x5A9 => 230
2616 ,0x5AB => 230
2617 ,0x5AC => 230
2618 ,0x5AF => 230
2619 ,0x5C4 => 230
2620 ,0x610 => 230
2621 ,0x611 => 230
2622 ,0x612 => 230
2623 ,0x613 => 230
2624 ,0x614 => 230
2625 ,0x615 => 230
2626 ,0x653 => 230
2627 ,0x654 => 230
2628 ,0x657 => 230
2629 ,0x658 => 230
2630 ,0x6D6 => 230
2631 ,0x6D7 => 230
2632 ,0x6D8 => 230
2633 ,0x6D9 => 230
2634 ,0x6DA => 230
2635 ,0x6DB => 230
2636 ,0x6DC => 230
2637 ,0x6DF => 230
2638 ,0x6E0 => 230
2639 ,0x6E1 => 230
2640 ,0x6E2 => 230
2641 ,0x6E4 => 230
2642 ,0x6E7 => 230
2643 ,0x6E8 => 230
2644 ,0x6EB => 230
2645 ,0x6EC => 230
2646 ,0x730 => 230
2647 ,0x732 => 230
2648 ,0x733 => 230
2649 ,0x735 => 230
2650 ,0x736 => 230
2651 ,0x73A => 230
2652 ,0x73D => 230
2653 ,0x73F => 230
2654 ,0x740 => 230
2655 ,0x741 => 230
2656 ,0x743 => 230
2657 ,0x745 => 230
2658 ,0x747 => 230
2659 ,0x749 => 230
2660 ,0x74A => 230
2661 ,0x951 => 230
2662 ,0x953 => 230
2663 ,0x954 => 230
2664 ,0xF82 => 230
2665 ,0xF83 => 230
2666 ,0xF86 => 230
2667 ,0xF87 => 230
2668 ,0x170D => 230
2669 ,0x193A => 230
2670 ,0x20D0 => 230
2671 ,0x20D1 => 230
2672 ,0x20D4 => 230
2673 ,0x20D5 => 230
2674 ,0x20D6 => 230
2675 ,0x20D7 => 230
2676 ,0x20DB => 230
2677 ,0x20DC => 230
2678 ,0x20E1 => 230
2679 ,0x20E7 => 230
2680 ,0x20E9 => 230
2681 ,0xFE20 => 230
2682 ,0xFE21 => 230
2683 ,0xFE22 => 230
2684 ,0xFE23 => 230
2685 ,0x1D185 => 230
2686 ,0x1D186 => 230
2687 ,0x1D187 => 230
2688 ,0x1D189 => 230
2689 ,0x1D188 => 230
2690 ,0x1D1AA => 230
2691 ,0x1D1AB => 230
2692 ,0x1D1AC => 230
2693 ,0x1D1AD => 230
2694 ,0x315 => 232
2695 ,0x31A => 232
2696 ,0x302C => 232
2697 ,0x35F => 233
2698 ,0x362 => 233
2699 ,0x35D => 234
2700 ,0x35E => 234
2701 ,0x360 => 234
2702 ,0x361 => 234
2703 ,0x345 => 240
2704 )
2705 );
2706 }
2707 ?>